Gardez une boîte de dialogue Zenity toujours au-dessus au premier plan


8

Existe-t-il un moyen de détecter qu'une Zenityboîte de dialogue a perdu le focus?

Je voudrais garder la boîte de dialogue au premier plan, sauf si l'utilisateur appuie sur ESC.

J'essaie de l'ajouter à ce script :

#!/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

Réponses:


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")

La source:


Je me demande si add,fullscreencela fonctionnera aussi
rubo77

J'ai également ajouté `-b add, maximized_vert, maximized_horz` dans un deuxième appel à wmctrl. Maintenant, je dois également appeler le script si la fenêtre de zénité est minimisée, redimensionnée ou déplacée
rubo77

Au démarrage, les choses peuvent devenir très lentes, donc je suggère ceci: (while ! wmctrl -F -a "$$ the title" -b add,above;do sleep 1;done) &et mettez également le script pid sur le titre pour le rendre plus unique.
Aquarius Power

0

Vous pouvez rencontrer des problèmes si vous l'exécutez en tant que tâche cron. L'environnement de Cron n'est pas au courant de votre écran X, dbus ou bureau et n'affichera pas la boîte zenity ni ne la gardera en haut. Ajout DISPLAY =: 0 avant les deux wmctrl et zenity résout le problème:

(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

Cette solution est essentiellement la même que celle de @Jan, mais utilise le PID au lieu du titre de la fenêtre pour identifier la fenêtre, et est en outre compatible avec Bourne Shell (-> ne nécessite pas 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 $!
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.