57
57
from cairo import Region # type:ignore
58
58
59
59
60
- def makeOneProgressBar (display : Gdk .Display , monitor : Gdk .Monitor , ewmh : EWMH ) -> None :
60
+ def makeOneProgressBar (
61
+ display : Gdk .Display , monitor : Gdk .Monitor , ewmh : EWMH
62
+ ) -> Gtk .ApplicationWindow :
61
63
win = Gtk .ApplicationWindow (application = app , title = "Should Never Focus" )
62
64
win .set_opacity (0.25 )
63
65
win .set_decorated (False )
@@ -75,6 +77,7 @@ def refraction() -> bool:
75
77
frac %= 1.0
76
78
prog .set_fraction (frac )
77
79
return True
80
+
78
81
to = GLib .timeout_add ((1000 // 10 ), refraction )
79
82
prog .set_fraction (0.7 )
80
83
win .set_child (prog )
@@ -96,8 +99,14 @@ def refraction() -> bool:
96
99
xlibwin = display .create_resource_object ("window" , xid )
97
100
98
101
# Always on top
99
- print (f'moving to { monitor_geom .x } { monitor_geom .y } { monitor_geom .width } ' )
100
- ewmh .setMoveResizeWindow (xlibwin , x = monitor_geom .x , y = monitor_geom .y + (monitor_geom .height - 150 ), w = monitor_geom .width , h = 150 )
102
+ print (f"moving to { monitor_geom .x } { monitor_geom .y } { monitor_geom .width } " )
103
+ ewmh .setMoveResizeWindow (
104
+ xlibwin ,
105
+ x = monitor_geom .x ,
106
+ y = monitor_geom .y + (monitor_geom .height - 150 ),
107
+ w = monitor_geom .width ,
108
+ h = 150 ,
109
+ )
101
110
ewmh .setWmState (xlibwin , 1 , "_NET_WM_STATE_ABOVE" )
102
111
103
112
# Draw even over the task bar (this breaks stuff)
@@ -107,6 +116,8 @@ def refraction() -> bool:
107
116
ewmh .setWmState (xlibwin , 1 , "_NET_WM_STATE_SKIP_TASKBAR" )
108
117
ewmh .setWmState (xlibwin , 1 , "_NET_WM_STATE_SKIP_PAGER" )
109
118
display .flush ()
119
+ return win
120
+
110
121
111
122
# When the application is launched…
112
123
def on_activate (app : Gtk .Application ) -> None :
@@ -119,8 +130,36 @@ def on_activate(app: Gtk.Application) -> None:
119
130
display = XOpenDisplay ()
120
131
screen = display .screen ()
121
132
ewmh = EWMH (display , screen .root )
122
- for monitor in gdisplay .get_monitors ():
123
- makeOneProgressBar (display , monitor , ewmh )
133
+ bars : list [Gtk .ApplicationWindow ] = []
134
+
135
+ def remonitor () -> bool :
136
+ print ("remonitoring" )
137
+ prevbars = bars [:]
138
+ for monitor in gdisplay .get_monitors ():
139
+ bars .append (makeOneProgressBar (display , monitor , ewmh ))
140
+ for prevbar in prevbars :
141
+ prevbar .close ()
142
+ return False
143
+
144
+ def remonitor_later (
145
+ display : str ,
146
+ path : str ,
147
+ iface : str ,
148
+ signal : str ,
149
+ args : tuple [object , ...],
150
+ ) -> None :
151
+ print ("remonitoring..." , display )
152
+ GLib .timeout_add (1000 , remonitor )
153
+
154
+ from pydbus import SessionBus
155
+
156
+ bus = SessionBus ()
157
+ bus .subscribe (
158
+ iface = "org.gnome.Mutter.DisplayConfig" ,
159
+ signal = "MonitorsChanged" ,
160
+ signal_fired = remonitor_later ,
161
+ )
162
+ remonitor ()
124
163
125
164
126
165
if __name__ == "__main__" :
0 commit comments