Giữ hộp thoại Zenity luôn ở trên cùng trong nền trước


8

Có cách nào để phát hiện ra rằng một Zenityhộp thoại đã mất tập trung?

Tôi muốn giữ hộp thoại ở phía trước trừ khi người dùng nhấn ESC.

Tôi đang cố gắng thêm nó vào kịch bản này :

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

Câu trả lời:


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

Nguồn:


Tôi tự hỏi nếu add,fullscreennó cũng sẽ làm việc
rubo77

Tôi cũng đã thêm `-b add, maximized_vert, maximized_horz` trong cuộc gọi wmctrl thứ hai. Bây giờ tôi cũng cần gọi kịch bản nếu cửa sổ tiện ích được thu nhỏ, thay đổi kích thước hoặc di chuyển
rubo77

Khi khởi động, mọi thứ có thể trở nên rất chậm, vì vậy tôi đề nghị điều này: (while ! wmctrl -F -a "$$ the title" -b add,above;do sleep 1;done) &và cũng đặt kịch bản vào tiêu đề để làm cho nó độc đáo hơn.
Sức mạnh Bảo Bình

0

Bạn có thể gặp vấn đề nếu bạn chạy nó như một công việc định kỳ. Môi trường của Cron không biết về màn hình X, dbus hoặc máy tính để bàn của bạn và sẽ không hiển thị hộp tiện nghi hoặc giữ nó ở trên cùng. Thêm HIỂN THỊ =: 0 trước cả wmctrl và zenity giải quyết vấn đề:

(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

Giải pháp này hầu hết giống với giải pháp của @Jan, nhưng sử dụng PID thay vì tiêu đề cửa sổ để xác định cửa sổ và ngoài ra, tương thích với Bourne Shell (-> không yêu cầu 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 $!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.