64 lines
2.7 KiB
Diff
64 lines
2.7 KiB
Diff
diff --git a/scripts/keyd-application-mapper b/scripts/keyd-application-mapper
|
|
index 55dd63b..ed74f4e 100755
|
|
--- a/scripts/keyd-application-mapper
|
|
+++ b/scripts/keyd-application-mapper
|
|
@@ -176,18 +176,49 @@ class Wlroots():
|
|
|
|
def run(self):
|
|
windows = {}
|
|
+ active_window = None
|
|
+
|
|
while True:
|
|
(obj, event, payload) = self.wl.recv_msg()
|
|
if obj == 4 and event == 0:
|
|
- windows[struct.unpack('I', payload)[0]] = {}
|
|
-
|
|
- if obj in windows:
|
|
- if event == 0:
|
|
- windows[obj]['title'] = self.wl.read_string(payload)
|
|
- if event == 1:
|
|
- windows[obj]['appid'] = self.wl.read_string(payload)
|
|
- if event == 4 and payload[0] > 0 and payload[4] == 2:
|
|
- self.on_window_change(windows[obj].get('appid', ''), windows[obj].get('title', ''))
|
|
+ # zwlr_foreign_toplevel_manager_v1::toplevel event
|
|
+ windows[struct.unpack('I', payload)[0]] = {'title': '', 'appid': ''}
|
|
+ continue
|
|
+
|
|
+ if obj not in windows:
|
|
+ continue
|
|
+
|
|
+ if event == 0:
|
|
+ # zwlr_foreign_toplevel_handle_v1::title event
|
|
+ windows[obj]['title'] = self.wl.read_string(payload)
|
|
+ elif event == 1:
|
|
+ # zwlr_foreign_toplevel_handle_v1::app_id event
|
|
+ windows[obj]['appid'] = self.wl.read_string(payload)
|
|
+ elif event == 4:
|
|
+ # zwlr_foreign_toplevel_handle_v1::state event
|
|
+ if active_window == windows[obj]:
|
|
+ active_window = None
|
|
+ window_is_active = False
|
|
+
|
|
+ array_size = struct.unpack('I', payload[0:4])[0]
|
|
+ for i in range(0, array_size, 4):
|
|
+ start_offset = i + 4
|
|
+ end_offset = start_offset + 4
|
|
+ state = struct.unpack('I', payload[start_offset:end_offset])[0]
|
|
+ # zwlr_foreign_toplevel_handle_v1::state enum -> activated
|
|
+ if state == 2:
|
|
+ window_is_active = True
|
|
+
|
|
+ if window_is_active:
|
|
+ active_window = windows[obj]
|
|
+ elif event == 5 and active_window == windows[obj]:
|
|
+ # zwlr_foreign_toplevel_handle_v1::done event
|
|
+ self.on_window_change(active_window['appid'], active_window['title'])
|
|
+ elif event == 6:
|
|
+ # zwlr_foreign_toplevel_handle_v1::closed event
|
|
+ closed_window = windows.pop(obj)
|
|
+ if closed_window == active_window:
|
|
+ active_window = None
|
|
|
|
class XMonitor():
|
|
def __init__(self, on_window_change):
|