Skip to content

Instantly share code, notes, and snippets.

@paulo-raca
Last active February 18, 2023 22:56
Show Gist options
  • Save paulo-raca/0e772864013b88de205a to your computer and use it in GitHub Desktop.
Save paulo-raca/0e772864013b88de205a to your computer and use it in GitHub Desktop.
Using UInput to enter unicode text
from evdev import UInput, ecodes as e
import time
# This class sends CTRL+SHIFT+U+<HEXCODE> sequences to produces arbitrary unicode characters.
# It works fine on Gnome applications, but not on KDE
# in https://en.wikipedia.org/wiki/Unicode_input#In_X11_.28Linux_and_other_Unix_variants.29
class UnicodeInput:
def __init__(self):
keys = [
e.KEY_LEFTCTRL,
e.KEY_LEFTSHIFT,
e.KEY_U,
e.KEY_0,
e.KEY_1,
e.KEY_2,
e.KEY_3,
e.KEY_4,
e.KEY_5,
e.KEY_6,
e.KEY_7,
e.KEY_8,
e.KEY_9,
e.KEY_A,
e.KEY_B,
e.KEY_C,
e.KEY_D,
e.KEY_E,
e.KEY_F
]
self.uinput = UInput(events={e.EV_KEY: keys}, name="Unicode Virtual Input Device")
def close(self):
self.uinput.close()
def __enter__(self):
return self
def __exit__(self, type, value, tb):
self.close()
def write(self, string, delay=0.02):
for c in string:
self.write_char(c)
time.sleep(delay)
def write_char(self, char):
ui.write(e.EV_KEY, e.KEY_LEFTCTRL, 1)
ui.syn()
ui.write(e.EV_KEY, e.KEY_LEFTSHIFT, 1)
ui.syn()
ui.write(e.EV_KEY, e.KEY_U, 1)
ui.syn()
ui.write(e.EV_KEY, e.KEY_U, 0)
ui.syn()
for hex_digit in '%X' % ord(char):
keycode = getattr(e, 'KEY_%s' % hex_digit)
ui.write(e.EV_KEY, keycode, 1)
ui.syn()
ui.write(e.EV_KEY, keycode, 0)
ui.syn()
ui.write(e.EV_KEY, e.KEY_LEFTSHIFT, 0)
ui.syn()
ui.write(e.EV_KEY, e.KEY_LEFTCTRL, 0)
ui.syn()
if __name__ == "__main__":
string = """
Mary had a little lamb
Зарегистрируйтесь сейчас на Десятую Международную Конференцию по
გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო
แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่
ሰማይ አይታረስ ንጉሥ አይከሰስ።
ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ
ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B),
"""
with UnicodeInput() as keyboard:
keyboard.write(string)
@hacksterous
Copy link

No, it doesn't require ibus. I am on Kubuntu and don't have ibus installed; this method works on GTK apps like GVim, but not Qt apps like Kate or KWrite.

@RedBearAK
Copy link

No, it doesn't require ibus. I am on Kubuntu and don't have ibus installed; this method works on GTK apps like GVim, but not Qt apps like Kate or KWrite.

I have since come to read something that says Ctrl-Shift-U might also work with fcitx, although a documentation page for fcitx says the default is Ctrl-Shift-Alt-U.

That's interesting that it would work in GTK apps without ibus installed at all. Have you verified that ibus is not present on your system?

What I can tell you is that when I set up ibus and chose it as the input manager with im-chooser, this Unicode entry method started working in KDE applications like Kate. So maybe the GTK apps are making themselves compatible with this method independent of ibus, or they install and use ibus on their own, but if you choose to use ibus in place of whatever KDE uses by default it will also make it work in the KDE apps. I've tested this in Kubuntu.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment