From 0881a608237a35e344dba225dd76a90094dfd8bf Mon Sep 17 00:00:00 2001 From: Raheman Vaiya Date: Fri, 12 Apr 2024 04:13:22 -0400 Subject: [PATCH] keyd-application-mapper: Add support for KDE (#694) Based on initial work done by Jon Wilts. --- scripts/keyd-application-mapper | 52 +++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/scripts/keyd-application-mapper b/scripts/keyd-application-mapper index c9ffba8..a9e82f4 100755 --- a/scripts/keyd-application-mapper +++ b/scripts/keyd-application-mapper @@ -108,6 +108,57 @@ def new_interruptible_generator(fd, event_fn, flushed_fn = None): else: yield event_fn() +class KDE(): + def __init__(self, on_window_change): + import os + import dbus + import dbus.mainloop.glib + + assert_env("KDE_SESSION_VERSION") + + self.on_window_change = on_window_change + dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) + + # Inject the kwin script + def init(self): + import dbus + + kwin_script = ''' + workspace.windowActivated.connect(client => { + if (!client) return; + callDBus("org.rvaiya.keyd", "/listener", "", "updateWindow", client.caption, client.resourceClass, client.resourceName); + }); + ''' + + f = open(f'/tmp/keyd-kwin-{os.getuid()}.js', 'w') + f.write(kwin_script) + f.close() + + bus = dbus.SessionBus() + + kwin = bus.get_object('org.kde.KWin', '/Scripting') + + kwin.unloadScript(f.name) + num = kwin.loadScript(f.name) + + script = bus.get_object('org.kde.KWin', '/Scripting/Script%d' % num).run() + + def run(self): + import dbus.service + import gi.repository.GLib + + on_window_change = self.on_window_change + class Listener(dbus.service.Object): + def __init__(self): + super().__init__(dbus.service.BusName('org.rvaiya.keyd', dbus.SessionBus()), '/listener') + + @dbus.service.method('org.rvaiya.keyd') + def updateWindow(self, title, foo, appid): + on_window_change(appid, title) + + Listener() + + gi.repository.GLib.MainLoop().run() # Just enough wayland wire protocol to listen for interesting events. # @@ -350,6 +401,7 @@ NOTE: def get_monitor(on_window_change): monitors = [ + ('kde', KDE), ('wlroots', Wlroots), ('Gnome', GnomeMonitor), ('X', XMonitor),