Halten Sie ein Zenity-Dialogfeld immer im Vordergrund


8

Gibt es eine Möglichkeit zu erkennen, dass ein ZenityDialog den Fokus verloren hat?

Ich möchte das Dialogfeld im Vordergrund halten, es sei denn, der Benutzer drückt ESC.

Ich versuche, es diesem Skript hinzuzufügen :

#!/bin/bash

# requires these packages from ubuntu repository:
# wmctrl, zenity, x11-utils 
# and the script mouse-speed

# This procect on git:        https://github.com/rubo77/mouse-speed


######## configuration ##########
# seconds between micro breaks
microbreak_time=$(( 10 * 60 ))
# micro break duration in seconds
microbreak_duration=15
# seconds between long breaks
longbreak_time=$(( 120 * 60 ))

# message to display 
message="Try focussing a far object outside the window with the eye to relax!"
longbreak_message="Change your seating or continue work in a standing/sitting position"
#postpone label
postpone="Postpone"

window_title="typebreak"

# global zoom of your window manager:
ZOOM=2
# height in px of the top system-bar:
TOPMARGIN=57
# sum in px of all horizontal borders:
HORIZONTALMARGIN=40
# get width of screen and height of screen
SCREEN_WIDTH=$(xwininfo -root | awk '$1=="Width:" {print $2}')
SCREEN_HEIGHT=$(xwininfo -root | awk '$1=="Height:" {print $2}')
# width and height
W=$(( $SCREEN_WIDTH / $ZOOM - 2 * $HORIZONTALMARGIN ))
H=$(( $SCREEN_HEIGHT / $ZOOM - 2 * $TOPMARGIN ))

function slow_down(){
    #zenity --warning --text "slow down mouse";
    mouse-speed -d 30
}

while true; do
    # short loop every few minutes to look around
    sleep $microbreak_time
    (
    echo "99"
    sleep $(( $microbreak_duration - 2 ))
    echo "# Mouse speed reset to 100%"
    sleep 2
    echo "100"
    ) | if ( sleep 1 && wmctrl -F -a "$window_title" -b add,maximized_vert,maximized_horz && sleep 3 &&  wmctrl -F -a "$window_title" -b add,above ) & ( zenity --progress --text "$message" --percentage=0 --auto-close  --height=$H --width=$W --pulsate --title="$window_title" --cancel-label="$postpone" ); then
        #zenity --info --text "Maus normal speed!"
        mouse-speed -r
    else 
        slow_down
    fi
done &
while true; do
    # second long loop to change seat position
    sleep $longbreak_time
    zenity --warning --text "$longbreak_message" --title="$window_title - long break"
done

Antworten:


12
#!/bin/bash
# This will wait one second and then steal focus and make the Zenity dialog box always-on-top (aka. 'above').

(sleep 1 && wmctrl -F -a "I am on top" -b add,above) &
(zenity --info --title="I am on top" --text="How to help Zenity to get focus and be always on top")

Quelle:


Ich frage mich, ob add,fullscreenes auch funktionieren wird
rubo77

Ich habe auch `-b add, maximized_vert, maximized_horz` in einem zweiten wmctrl-Aufruf hinzugefügt. Jetzt muss ich das Skript auch aufrufen, wenn das Zenity-Fenster minimiert, in der Größe
geändert

Beim Start kann es sehr langsam werden, daher schlage ich Folgendes vor: (while ! wmctrl -F -a "$$ the title" -b add,above;do sleep 1;done) &und setze die Skript-PID auf den Titel, um sie einzigartiger zu machen.
Wassermann Power

0

Sie können auf Probleme stoßen, wenn Sie dies als Cron-Job ausführen. Die Umgebung von Cron kennt Ihr X-Display, Ihren dbus oder Ihren Desktop nicht und zeigt die Zenity-Box nicht an oder behält sie oben. Hinzufügen DISPLAY =: 0 vor sowohl wmctrl und zenity behebt das Problem:

(sleep 1 && DISPLAY=:0 wmctrl -F -a "I am on top" -b add,above) & (DISPLAY=:0 zenity --info --title="I am on top" --text="How to help Zenity to get focus and be always on top")


0

Diese Lösung ist größtenteils die gleiche wie die von @Jan, verwendet jedoch die PID anstelle des Fenstertitels, um das Fenster zu identifizieren, und ist außerdem Bourne Shell-kompatibel (-> erfordert keine Bash).

#!/bin/sh
# This will wait 200ms, steal focus and set the Zenity dialog box
# to "always-on-top".

modify_win_by_pid() {
    pid=$1

    sleep 0.2
    win_id=`wmctrl -l -p | grep ${pid} | awk '{print $1}'`
    wmctrl -i - ${win_id} -b add,above
}

zenity --info --title="I am on top" --text="I received focus and will stay on top" &
modify_win_by_pid $!
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.