39 lines
1.7 KiB
Python
Executable File
39 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import sys
|
|
import os
|
|
import subprocess
|
|
|
|
JS_TEMPLATE_PATH = '/home/sho/Documents/themes/quickshell/services/js/kwin_focus.js'
|
|
|
|
def focus_window(app_name, ix=0, iy=0):
|
|
try:
|
|
with open(JS_TEMPLATE_PATH, 'r', encoding='utf-8') as f:
|
|
template = f.read()
|
|
|
|
script = template.replace('%APP_NAME%', app_name).replace('%ICON_X%', str(ix)).replace('%ICON_Y%', str(iy))
|
|
|
|
target_js = '/tmp/kwin_focus.js'
|
|
with open(target_js, 'w', encoding='utf-8') as f:
|
|
f.write(script)
|
|
|
|
# Always unload previous script instance to prevent KWin memory leaks
|
|
subprocess.run(['busctl', '--user', 'call', 'org.kde.KWin', '/Scripting', 'org.kde.kwin.Scripting', 'unloadScript', 's', target_js], capture_output=True)
|
|
|
|
res = subprocess.check_output(
|
|
['busctl', '--user', 'call', 'org.kde.KWin', '/Scripting', 'org.kde.kwin.Scripting', 'loadScript', 's', target_js],
|
|
text=True
|
|
)
|
|
sid = res.strip().split()[-1]
|
|
subprocess.run(['busctl', '--user', 'call', 'org.kde.KWin', f'/Scripting/Script{sid}', 'org.kde.kwin.Script', 'run'], capture_output=True)
|
|
subprocess.run(['busctl', '--user', 'call', 'org.kde.KWin', f'/Scripting/Script{sid}', 'org.kde.kwin.Script', 'stop'], capture_output=True)
|
|
subprocess.run(['busctl', '--user', 'call', 'org.kde.KWin', '/Scripting', 'org.kde.kwin.Scripting', 'unloadScript', 's', target_js], capture_output=True)
|
|
except Exception:
|
|
pass
|
|
|
|
if __name__ == '__main__':
|
|
if len(sys.argv) >= 2:
|
|
app_name = sys.argv[1]
|
|
ix = sys.argv[2] if len(sys.argv) >= 3 else 0
|
|
iy = sys.argv[3] if len(sys.argv) >= 4 else 0
|
|
focus_window(app_name, ix, iy)
|