Skip to content

Instantly share code, notes, and snippets.

@Mikle-Bond
Created March 19, 2019 18:41
Show Gist options
  • Save Mikle-Bond/a885a9bd01e8ed6b9afe1eb22786e280 to your computer and use it in GitHub Desktop.
Save Mikle-Bond/a885a9bd01e8ed6b9afe1eb22786e280 to your computer and use it in GitHub Desktop.
qutebrowser-xkbswitch dirty hack
diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py
index 3fdad13d1..5ca369a9a 100644
--- a/qutebrowser/mainwindow/mainwindow.py
+++ b/qutebrowser/mainwindow/mainwindow.py
@@ -38,6 +38,7 @@ from qutebrowser.keyinput import modeman
from qutebrowser.browser import commands, downloadview, hints, downloads
from qutebrowser.misc import crashsignal, keyhintwidget
+from qutebrowser.plugins import xkbswitch
win_id_gen = itertools.count(0)
@@ -225,6 +226,8 @@ class MainWindow(QWidget):
self._messageview = messageview.MessageView(parent=self)
self._add_overlay(self._messageview, self._messageview.update_geometry)
+ self._xkb_switch = xkbswitch.XkbSwitchPlugin(win_id=self.win_id, parent=self)
+
self._init_geometry(geometry)
self._connect_signals()
@@ -445,6 +448,10 @@ class MainWindow(QWidget):
mode_manager.left.connect(cmd.on_mode_left)
mode_manager.left.connect(message.global_bridge.mode_left)
+ # xkbswitch
+ mode_manager.entered.connect(self._xkb_switch.on_mode_entered)
+ mode_manager.left.connect(self._xkb_switch.on_mode_left)
+
# commands
keyparsers[usertypes.KeyMode.normal].keystring_updated.connect(
status.keystring.setText)
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
from ctypes import CDLL, c_char_p
from PyQt5.QtCore import pyqtSlot, QObject
from qutebrowser.utils.usertypes import KeyMode
class XkbSwitchPlugin(QObject):
def __init__(self, *, win_id, parent=None):
super().__init__(parent)
self._xkb_lib = CDLL('/usr/local/lib/libxkbswitch.so')
self._xget = self._xkb_lib.Xkb_Switch_getXkbLayout
self._xget.restype = c_char_p
self._xget.argtypes = c_char_p,
self._xset = self._xkb_lib.Xkb_Switch_setXkbLayout
self._xset.restype = c_char_p
self._xset.argtypes = c_char_p,
self._nlayout = b'us'
self._ilayout = b'us'
def _swap_layouts(self):
temp = self._xget(None)
self._xset(self._layout)
self._layout = temp
def _push_layout(self, layout):
temp = self._xget(None)
self._xset(layout)
return temp
@pyqtSlot(KeyMode)
def on_mode_entered(self, mode):
"""Trigger switch on entering input mode."""
if mode == KeyMode.insert:
self._push_layout(self._ilayout)
@pyqtSlot(KeyMode, KeyMode)
def on_mode_left(self, old_mode, new_mode):
"""Trigger restore on leaving input mode."""
if old_mode == KeyMode.insert:
self._ilayout = self._push_layout(self._nlayout)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment