Xlib control keyboard events











up vote
2
down vote

favorite
1












How does one simulate keyboard key presses in python (Xlib)
I have been using Xlib-python for simulating mouse pointer events such as movements and clicks. But I haven't been able to find enough help for doing a similar thing for keyboard presses.



Preferred platform : python on linux










share|improve this question


























    up vote
    2
    down vote

    favorite
    1












    How does one simulate keyboard key presses in python (Xlib)
    I have been using Xlib-python for simulating mouse pointer events such as movements and clicks. But I haven't been able to find enough help for doing a similar thing for keyboard presses.



    Preferred platform : python on linux










    share|improve this question
























      up vote
      2
      down vote

      favorite
      1









      up vote
      2
      down vote

      favorite
      1






      1





      How does one simulate keyboard key presses in python (Xlib)
      I have been using Xlib-python for simulating mouse pointer events such as movements and clicks. But I haven't been able to find enough help for doing a similar thing for keyboard presses.



      Preferred platform : python on linux










      share|improve this question













      How does one simulate keyboard key presses in python (Xlib)
      I have been using Xlib-python for simulating mouse pointer events such as movements and clicks. But I haven't been able to find enough help for doing a similar thing for keyboard presses.



      Preferred platform : python on linux







      python linux xlib






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Dec 12 '12 at 13:17









      Madhavan Malolan

      470319




      470319
























          3 Answers
          3






          active

          oldest

          votes

















          up vote
          2
          down vote



          accepted










          One uses xtest for this. As an added bonus, it also handles pointer event injection.






          share|improve this answer




























            up vote
            0
            down vote













            Just in case any Windows users stumble across this question:



            https://gist.github.com/Audionautics/2906125



            Link may be broken, here is a similar Python code block that I have used to build off of:



            import time
            import win32api, win32con

            VK_CODE = {'left_arrow':0x25,
            'spacebar':0x20,
            'right_arrow':0x27}

            def press(x):
            win32api.keybd_event(VK_CODE[x], 0,0,0)
            win32api.keybd_event(VK_CODE[x],0 ,win32con.KEYEVENTF_KEYUP ,0)

            def play():
            time.sleep(1)
            s = time.time()
            while time.time() - s < 15:
            press("left_arrow")
            press("right_arrow")
            press("left_arrow")
            press("right_arrow")
            press('spacebar')

            play()


            Credit goes to:



            chriskieh on GitHub






            share|improve this answer






























              up vote
              0
              down vote













              I'm no expert on Xlib, but managed to piece together this code for the PyAutoGUI module. Here's the minimum viable example that can simulate a keyDown() and keyUp() for a keyboard key:



              # You must run `pip3 install python3-xlib` to get the Xlib modules.

              import os

              from Xlib.display import Display
              from Xlib import X
              from Xlib.ext.xtest import fake_input
              import Xlib.XK

              _display = Display(os.environ['DISPLAY'])

              # Create the keyboard mapping.
              KEY_NAMES = ['t', 'n', 'r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
              ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
              '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\', ']', '^', '_', '`',
              'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
              'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
              'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
              'browserback', 'browserfavorites', 'browserforward', 'browserhome',
              'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
              'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
              'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
              'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
              'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
              'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
              'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
              'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
              'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
              'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
              'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
              'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
              'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
              'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
              'command', 'option', 'optionleft', 'optionright']

              keyboardMapping = dict([(key, None) for key in KEY_NAMES])
              keyboardMapping.update({
              'backspace': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
              'b': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
              'tab': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
              'enter': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
              'return': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
              'shift': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
              'ctrl': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
              'alt': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
              'pause': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Pause')),
              'capslock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Caps_Lock')),
              'esc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
              'escape': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
              'pgup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
              'pgdn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
              'pageup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
              'pagedown': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
              'end': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('End')),
              'home': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Home')),
              'left': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Left')),
              'up': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Up')),
              'right': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Right')),
              'down': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Down')),
              'select': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Select')),
              'print': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
              'execute': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Execute')),
              'prtsc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
              'prtscr': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
              'prntscrn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
              'printscreen': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
              'insert': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Insert')),
              'del': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
              'delete': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
              'help': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Help')),
              'winleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
              'winright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_R')),
              'apps': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
              'num0': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_0')),
              'num1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_1')),
              'num2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_2')),
              'num3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_3')),
              'num4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_4')),
              'num5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_5')),
              'num6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_6')),
              'num7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_7')),
              'num8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_8')),
              'num9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_9')),
              'multiply': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Multiply')),
              'add': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Add')),
              'separator': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Separator')),
              'subtract': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Subtract')),
              'decimal': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Decimal')),
              'divide': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Divide')),
              'f1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F1')),
              'f2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F2')),
              'f3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F3')),
              'f4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F4')),
              'f5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F5')),
              'f6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F6')),
              'f7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F7')),
              'f8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F8')),
              'f9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F9')),
              'f10': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F10')),
              'f11': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F11')),
              'f12': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F12')),
              'f13': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F13')),
              'f14': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F14')),
              'f15': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F15')),
              'f16': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F16')),
              'f17': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F17')),
              'f18': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F18')),
              'f19': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F19')),
              'f20': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F20')),
              'f21': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F21')),
              'f22': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F22')),
              'f23': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F23')),
              'f24': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F24')),
              'numlock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Num_Lock')),
              'scrolllock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Scroll_Lock')),
              'shiftleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
              'shiftright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_R')),
              'ctrlleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
              'ctrlright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_R')),
              'altleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
              'altright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_R')),
              # These are added because unlike a-zA-Z0-9, the single characters do not have a
              ' ': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
              'space': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
              't': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
              'n': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')), # for some reason this needs to be cr, not lf
              'r': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
              'e': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
              '!': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('exclam')),
              '#': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('numbersign')),
              '%': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('percent')),
              '$': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('dollar')),
              '&': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('ampersand')),
              '"': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('quotedbl')),
              "'": _display.keysym_to_keycode(Xlib.XK.string_to_keysym('apostrophe')),
              '(': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenleft')),
              ')': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenright')),
              '*': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asterisk')),
              '=': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('equal')),
              '+': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('plus')),
              ',': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('comma')),
              '-': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('minus')),
              '.': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('period')),
              '/': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('slash')),
              ':': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('colon')),
              ';': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('semicolon')),
              '<': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('less')),
              '>': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('greater')),
              '?': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('question')),
              '@': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('at')),
              '[': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketleft')),
              ']': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketright')),
              '\': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('backslash')),
              '^': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciicircum')),
              '_': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('underscore')),
              '`': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('grave')),
              '{': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceleft')),
              '|': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bar')),
              '}': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceright')),
              '~': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciitilde')),
              })

              for c in """abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890""":
              keyboardMapping[c] = _display.keysym_to_keycode(Xlib.XK.string_to_keysym(c))



              def isShiftCharacter(character):
              """Returns True if the key character is uppercase or shifted."""
              return character.isupper() or character in '~!@#$%^&*()_+{}|:"<>?'


              def keyDown(key):
              """Performs a keyboard key press without the release. This will put that
              key in a held down state.

              NOTE: For some reason, this does not seem to cause key repeats like would
              happen if a keyboard key was held down on a text field.

              Args:
              key (str): The key to be pressed down. The valid names are listed in
              pyautogui.KEY_NAMES.

              Returns:
              None
              """
              if key not in keyboardMapping or keyboardMapping[key] is None:
              return

              if type(key) == int:
              fake_input(_display, X.KeyPress, key)
              _display.sync()
              return

              needsShift = isShiftCharacter(key)
              if needsShift:
              fake_input(_display, X.KeyPress, keyboardMapping['shift'])

              fake_input(_display, X.KeyPress, keyboardMapping[key])

              if needsShift:
              fake_input(_display, X.KeyRelease, keyboardMapping['shift'])
              _display.sync()


              def keyUp(key):
              """Performs a keyboard key release (without the press down beforehand).

              Args:
              key (str): The key to be released up. The valid names are listed in
              KEY_NAMES.

              Returns:
              None
              """

              """
              Release a given character key. Also works with character keycodes as
              integers, but not keysyms.
              """
              if key not in keyboardMapping or keyboardMapping[key] is None:
              return

              if type(key) == int:
              keycode = key
              else:
              keycode = keyboardMapping[key]

              fake_input(_display, X.KeyRelease, keycode)
              _display.sync()





              share|improve this answer





















                Your Answer






                StackExchange.ifUsing("editor", function () {
                StackExchange.using("externalEditor", function () {
                StackExchange.using("snippets", function () {
                StackExchange.snippets.init();
                });
                });
                }, "code-snippets");

                StackExchange.ready(function() {
                var channelOptions = {
                tags: "".split(" "),
                id: "1"
                };
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function() {
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled) {
                StackExchange.using("snippets", function() {
                createEditor();
                });
                }
                else {
                createEditor();
                }
                });

                function createEditor() {
                StackExchange.prepareEditor({
                heartbeatType: 'answer',
                convertImagesToLinks: true,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: 10,
                bindNavPrevention: true,
                postfix: "",
                imageUploader: {
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                },
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                });


                }
                });














                draft saved

                draft discarded


















                StackExchange.ready(
                function () {
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f13840697%2fxlib-control-keyboard-events%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                3 Answers
                3






                active

                oldest

                votes








                3 Answers
                3






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes








                up vote
                2
                down vote



                accepted










                One uses xtest for this. As an added bonus, it also handles pointer event injection.






                share|improve this answer

























                  up vote
                  2
                  down vote



                  accepted










                  One uses xtest for this. As an added bonus, it also handles pointer event injection.






                  share|improve this answer























                    up vote
                    2
                    down vote



                    accepted







                    up vote
                    2
                    down vote



                    accepted






                    One uses xtest for this. As an added bonus, it also handles pointer event injection.






                    share|improve this answer












                    One uses xtest for this. As an added bonus, it also handles pointer event injection.







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Dec 12 '12 at 13:50









                    Ignacio Vazquez-Abrams

                    572k9910461151




                    572k9910461151
























                        up vote
                        0
                        down vote













                        Just in case any Windows users stumble across this question:



                        https://gist.github.com/Audionautics/2906125



                        Link may be broken, here is a similar Python code block that I have used to build off of:



                        import time
                        import win32api, win32con

                        VK_CODE = {'left_arrow':0x25,
                        'spacebar':0x20,
                        'right_arrow':0x27}

                        def press(x):
                        win32api.keybd_event(VK_CODE[x], 0,0,0)
                        win32api.keybd_event(VK_CODE[x],0 ,win32con.KEYEVENTF_KEYUP ,0)

                        def play():
                        time.sleep(1)
                        s = time.time()
                        while time.time() - s < 15:
                        press("left_arrow")
                        press("right_arrow")
                        press("left_arrow")
                        press("right_arrow")
                        press('spacebar')

                        play()


                        Credit goes to:



                        chriskieh on GitHub






                        share|improve this answer



























                          up vote
                          0
                          down vote













                          Just in case any Windows users stumble across this question:



                          https://gist.github.com/Audionautics/2906125



                          Link may be broken, here is a similar Python code block that I have used to build off of:



                          import time
                          import win32api, win32con

                          VK_CODE = {'left_arrow':0x25,
                          'spacebar':0x20,
                          'right_arrow':0x27}

                          def press(x):
                          win32api.keybd_event(VK_CODE[x], 0,0,0)
                          win32api.keybd_event(VK_CODE[x],0 ,win32con.KEYEVENTF_KEYUP ,0)

                          def play():
                          time.sleep(1)
                          s = time.time()
                          while time.time() - s < 15:
                          press("left_arrow")
                          press("right_arrow")
                          press("left_arrow")
                          press("right_arrow")
                          press('spacebar')

                          play()


                          Credit goes to:



                          chriskieh on GitHub






                          share|improve this answer

























                            up vote
                            0
                            down vote










                            up vote
                            0
                            down vote









                            Just in case any Windows users stumble across this question:



                            https://gist.github.com/Audionautics/2906125



                            Link may be broken, here is a similar Python code block that I have used to build off of:



                            import time
                            import win32api, win32con

                            VK_CODE = {'left_arrow':0x25,
                            'spacebar':0x20,
                            'right_arrow':0x27}

                            def press(x):
                            win32api.keybd_event(VK_CODE[x], 0,0,0)
                            win32api.keybd_event(VK_CODE[x],0 ,win32con.KEYEVENTF_KEYUP ,0)

                            def play():
                            time.sleep(1)
                            s = time.time()
                            while time.time() - s < 15:
                            press("left_arrow")
                            press("right_arrow")
                            press("left_arrow")
                            press("right_arrow")
                            press('spacebar')

                            play()


                            Credit goes to:



                            chriskieh on GitHub






                            share|improve this answer














                            Just in case any Windows users stumble across this question:



                            https://gist.github.com/Audionautics/2906125



                            Link may be broken, here is a similar Python code block that I have used to build off of:



                            import time
                            import win32api, win32con

                            VK_CODE = {'left_arrow':0x25,
                            'spacebar':0x20,
                            'right_arrow':0x27}

                            def press(x):
                            win32api.keybd_event(VK_CODE[x], 0,0,0)
                            win32api.keybd_event(VK_CODE[x],0 ,win32con.KEYEVENTF_KEYUP ,0)

                            def play():
                            time.sleep(1)
                            s = time.time()
                            while time.time() - s < 15:
                            press("left_arrow")
                            press("right_arrow")
                            press("left_arrow")
                            press("right_arrow")
                            press('spacebar')

                            play()


                            Credit goes to:



                            chriskieh on GitHub







                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited Nov 16 '13 at 17:42

























                            answered Jun 6 '13 at 14:57









                            Nick Williams

                            18811




                            18811






















                                up vote
                                0
                                down vote













                                I'm no expert on Xlib, but managed to piece together this code for the PyAutoGUI module. Here's the minimum viable example that can simulate a keyDown() and keyUp() for a keyboard key:



                                # You must run `pip3 install python3-xlib` to get the Xlib modules.

                                import os

                                from Xlib.display import Display
                                from Xlib import X
                                from Xlib.ext.xtest import fake_input
                                import Xlib.XK

                                _display = Display(os.environ['DISPLAY'])

                                # Create the keyboard mapping.
                                KEY_NAMES = ['t', 'n', 'r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
                                ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
                                '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\', ']', '^', '_', '`',
                                'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
                                'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
                                'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
                                'browserback', 'browserfavorites', 'browserforward', 'browserhome',
                                'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
                                'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
                                'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
                                'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
                                'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
                                'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
                                'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
                                'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
                                'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
                                'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
                                'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
                                'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
                                'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
                                'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
                                'command', 'option', 'optionleft', 'optionright']

                                keyboardMapping = dict([(key, None) for key in KEY_NAMES])
                                keyboardMapping.update({
                                'backspace': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
                                'b': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
                                'tab': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
                                'enter': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                'return': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                'shift': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
                                'ctrl': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
                                'alt': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
                                'pause': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Pause')),
                                'capslock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Caps_Lock')),
                                'esc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                'escape': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                'pgup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
                                'pgdn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
                                'pageup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
                                'pagedown': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
                                'end': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('End')),
                                'home': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Home')),
                                'left': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Left')),
                                'up': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Up')),
                                'right': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Right')),
                                'down': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Down')),
                                'select': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Select')),
                                'print': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                'execute': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Execute')),
                                'prtsc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                'prtscr': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                'prntscrn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                'printscreen': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                'insert': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Insert')),
                                'del': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
                                'delete': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
                                'help': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Help')),
                                'winleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
                                'winright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_R')),
                                'apps': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
                                'num0': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_0')),
                                'num1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_1')),
                                'num2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_2')),
                                'num3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_3')),
                                'num4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_4')),
                                'num5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_5')),
                                'num6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_6')),
                                'num7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_7')),
                                'num8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_8')),
                                'num9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_9')),
                                'multiply': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Multiply')),
                                'add': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Add')),
                                'separator': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Separator')),
                                'subtract': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Subtract')),
                                'decimal': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Decimal')),
                                'divide': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Divide')),
                                'f1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F1')),
                                'f2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F2')),
                                'f3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F3')),
                                'f4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F4')),
                                'f5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F5')),
                                'f6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F6')),
                                'f7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F7')),
                                'f8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F8')),
                                'f9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F9')),
                                'f10': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F10')),
                                'f11': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F11')),
                                'f12': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F12')),
                                'f13': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F13')),
                                'f14': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F14')),
                                'f15': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F15')),
                                'f16': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F16')),
                                'f17': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F17')),
                                'f18': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F18')),
                                'f19': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F19')),
                                'f20': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F20')),
                                'f21': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F21')),
                                'f22': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F22')),
                                'f23': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F23')),
                                'f24': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F24')),
                                'numlock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Num_Lock')),
                                'scrolllock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Scroll_Lock')),
                                'shiftleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
                                'shiftright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_R')),
                                'ctrlleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
                                'ctrlright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_R')),
                                'altleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
                                'altright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_R')),
                                # These are added because unlike a-zA-Z0-9, the single characters do not have a
                                ' ': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
                                'space': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
                                't': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
                                'n': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')), # for some reason this needs to be cr, not lf
                                'r': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                'e': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                '!': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('exclam')),
                                '#': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('numbersign')),
                                '%': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('percent')),
                                '$': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('dollar')),
                                '&': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('ampersand')),
                                '"': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('quotedbl')),
                                "'": _display.keysym_to_keycode(Xlib.XK.string_to_keysym('apostrophe')),
                                '(': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenleft')),
                                ')': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenright')),
                                '*': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asterisk')),
                                '=': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('equal')),
                                '+': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('plus')),
                                ',': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('comma')),
                                '-': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('minus')),
                                '.': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('period')),
                                '/': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('slash')),
                                ':': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('colon')),
                                ';': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('semicolon')),
                                '<': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('less')),
                                '>': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('greater')),
                                '?': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('question')),
                                '@': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('at')),
                                '[': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketleft')),
                                ']': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketright')),
                                '\': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('backslash')),
                                '^': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciicircum')),
                                '_': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('underscore')),
                                '`': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('grave')),
                                '{': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceleft')),
                                '|': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bar')),
                                '}': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceright')),
                                '~': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciitilde')),
                                })

                                for c in """abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890""":
                                keyboardMapping[c] = _display.keysym_to_keycode(Xlib.XK.string_to_keysym(c))



                                def isShiftCharacter(character):
                                """Returns True if the key character is uppercase or shifted."""
                                return character.isupper() or character in '~!@#$%^&*()_+{}|:"<>?'


                                def keyDown(key):
                                """Performs a keyboard key press without the release. This will put that
                                key in a held down state.

                                NOTE: For some reason, this does not seem to cause key repeats like would
                                happen if a keyboard key was held down on a text field.

                                Args:
                                key (str): The key to be pressed down. The valid names are listed in
                                pyautogui.KEY_NAMES.

                                Returns:
                                None
                                """
                                if key not in keyboardMapping or keyboardMapping[key] is None:
                                return

                                if type(key) == int:
                                fake_input(_display, X.KeyPress, key)
                                _display.sync()
                                return

                                needsShift = isShiftCharacter(key)
                                if needsShift:
                                fake_input(_display, X.KeyPress, keyboardMapping['shift'])

                                fake_input(_display, X.KeyPress, keyboardMapping[key])

                                if needsShift:
                                fake_input(_display, X.KeyRelease, keyboardMapping['shift'])
                                _display.sync()


                                def keyUp(key):
                                """Performs a keyboard key release (without the press down beforehand).

                                Args:
                                key (str): The key to be released up. The valid names are listed in
                                KEY_NAMES.

                                Returns:
                                None
                                """

                                """
                                Release a given character key. Also works with character keycodes as
                                integers, but not keysyms.
                                """
                                if key not in keyboardMapping or keyboardMapping[key] is None:
                                return

                                if type(key) == int:
                                keycode = key
                                else:
                                keycode = keyboardMapping[key]

                                fake_input(_display, X.KeyRelease, keycode)
                                _display.sync()





                                share|improve this answer

























                                  up vote
                                  0
                                  down vote













                                  I'm no expert on Xlib, but managed to piece together this code for the PyAutoGUI module. Here's the minimum viable example that can simulate a keyDown() and keyUp() for a keyboard key:



                                  # You must run `pip3 install python3-xlib` to get the Xlib modules.

                                  import os

                                  from Xlib.display import Display
                                  from Xlib import X
                                  from Xlib.ext.xtest import fake_input
                                  import Xlib.XK

                                  _display = Display(os.environ['DISPLAY'])

                                  # Create the keyboard mapping.
                                  KEY_NAMES = ['t', 'n', 'r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
                                  ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
                                  '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\', ']', '^', '_', '`',
                                  'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
                                  'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
                                  'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
                                  'browserback', 'browserfavorites', 'browserforward', 'browserhome',
                                  'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
                                  'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
                                  'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
                                  'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
                                  'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
                                  'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
                                  'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
                                  'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
                                  'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
                                  'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
                                  'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
                                  'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
                                  'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
                                  'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
                                  'command', 'option', 'optionleft', 'optionright']

                                  keyboardMapping = dict([(key, None) for key in KEY_NAMES])
                                  keyboardMapping.update({
                                  'backspace': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
                                  'b': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
                                  'tab': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
                                  'enter': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                  'return': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                  'shift': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
                                  'ctrl': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
                                  'alt': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
                                  'pause': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Pause')),
                                  'capslock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Caps_Lock')),
                                  'esc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                  'escape': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                  'pgup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
                                  'pgdn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
                                  'pageup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
                                  'pagedown': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
                                  'end': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('End')),
                                  'home': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Home')),
                                  'left': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Left')),
                                  'up': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Up')),
                                  'right': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Right')),
                                  'down': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Down')),
                                  'select': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Select')),
                                  'print': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                  'execute': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Execute')),
                                  'prtsc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                  'prtscr': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                  'prntscrn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                  'printscreen': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                  'insert': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Insert')),
                                  'del': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
                                  'delete': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
                                  'help': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Help')),
                                  'winleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
                                  'winright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_R')),
                                  'apps': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
                                  'num0': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_0')),
                                  'num1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_1')),
                                  'num2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_2')),
                                  'num3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_3')),
                                  'num4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_4')),
                                  'num5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_5')),
                                  'num6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_6')),
                                  'num7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_7')),
                                  'num8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_8')),
                                  'num9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_9')),
                                  'multiply': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Multiply')),
                                  'add': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Add')),
                                  'separator': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Separator')),
                                  'subtract': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Subtract')),
                                  'decimal': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Decimal')),
                                  'divide': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Divide')),
                                  'f1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F1')),
                                  'f2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F2')),
                                  'f3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F3')),
                                  'f4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F4')),
                                  'f5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F5')),
                                  'f6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F6')),
                                  'f7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F7')),
                                  'f8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F8')),
                                  'f9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F9')),
                                  'f10': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F10')),
                                  'f11': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F11')),
                                  'f12': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F12')),
                                  'f13': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F13')),
                                  'f14': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F14')),
                                  'f15': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F15')),
                                  'f16': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F16')),
                                  'f17': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F17')),
                                  'f18': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F18')),
                                  'f19': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F19')),
                                  'f20': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F20')),
                                  'f21': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F21')),
                                  'f22': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F22')),
                                  'f23': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F23')),
                                  'f24': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F24')),
                                  'numlock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Num_Lock')),
                                  'scrolllock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Scroll_Lock')),
                                  'shiftleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
                                  'shiftright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_R')),
                                  'ctrlleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
                                  'ctrlright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_R')),
                                  'altleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
                                  'altright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_R')),
                                  # These are added because unlike a-zA-Z0-9, the single characters do not have a
                                  ' ': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
                                  'space': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
                                  't': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
                                  'n': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')), # for some reason this needs to be cr, not lf
                                  'r': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                  'e': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                  '!': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('exclam')),
                                  '#': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('numbersign')),
                                  '%': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('percent')),
                                  '$': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('dollar')),
                                  '&': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('ampersand')),
                                  '"': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('quotedbl')),
                                  "'": _display.keysym_to_keycode(Xlib.XK.string_to_keysym('apostrophe')),
                                  '(': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenleft')),
                                  ')': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenright')),
                                  '*': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asterisk')),
                                  '=': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('equal')),
                                  '+': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('plus')),
                                  ',': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('comma')),
                                  '-': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('minus')),
                                  '.': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('period')),
                                  '/': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('slash')),
                                  ':': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('colon')),
                                  ';': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('semicolon')),
                                  '<': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('less')),
                                  '>': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('greater')),
                                  '?': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('question')),
                                  '@': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('at')),
                                  '[': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketleft')),
                                  ']': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketright')),
                                  '\': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('backslash')),
                                  '^': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciicircum')),
                                  '_': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('underscore')),
                                  '`': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('grave')),
                                  '{': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceleft')),
                                  '|': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bar')),
                                  '}': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceright')),
                                  '~': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciitilde')),
                                  })

                                  for c in """abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890""":
                                  keyboardMapping[c] = _display.keysym_to_keycode(Xlib.XK.string_to_keysym(c))



                                  def isShiftCharacter(character):
                                  """Returns True if the key character is uppercase or shifted."""
                                  return character.isupper() or character in '~!@#$%^&*()_+{}|:"<>?'


                                  def keyDown(key):
                                  """Performs a keyboard key press without the release. This will put that
                                  key in a held down state.

                                  NOTE: For some reason, this does not seem to cause key repeats like would
                                  happen if a keyboard key was held down on a text field.

                                  Args:
                                  key (str): The key to be pressed down. The valid names are listed in
                                  pyautogui.KEY_NAMES.

                                  Returns:
                                  None
                                  """
                                  if key not in keyboardMapping or keyboardMapping[key] is None:
                                  return

                                  if type(key) == int:
                                  fake_input(_display, X.KeyPress, key)
                                  _display.sync()
                                  return

                                  needsShift = isShiftCharacter(key)
                                  if needsShift:
                                  fake_input(_display, X.KeyPress, keyboardMapping['shift'])

                                  fake_input(_display, X.KeyPress, keyboardMapping[key])

                                  if needsShift:
                                  fake_input(_display, X.KeyRelease, keyboardMapping['shift'])
                                  _display.sync()


                                  def keyUp(key):
                                  """Performs a keyboard key release (without the press down beforehand).

                                  Args:
                                  key (str): The key to be released up. The valid names are listed in
                                  KEY_NAMES.

                                  Returns:
                                  None
                                  """

                                  """
                                  Release a given character key. Also works with character keycodes as
                                  integers, but not keysyms.
                                  """
                                  if key not in keyboardMapping or keyboardMapping[key] is None:
                                  return

                                  if type(key) == int:
                                  keycode = key
                                  else:
                                  keycode = keyboardMapping[key]

                                  fake_input(_display, X.KeyRelease, keycode)
                                  _display.sync()





                                  share|improve this answer























                                    up vote
                                    0
                                    down vote










                                    up vote
                                    0
                                    down vote









                                    I'm no expert on Xlib, but managed to piece together this code for the PyAutoGUI module. Here's the minimum viable example that can simulate a keyDown() and keyUp() for a keyboard key:



                                    # You must run `pip3 install python3-xlib` to get the Xlib modules.

                                    import os

                                    from Xlib.display import Display
                                    from Xlib import X
                                    from Xlib.ext.xtest import fake_input
                                    import Xlib.XK

                                    _display = Display(os.environ['DISPLAY'])

                                    # Create the keyboard mapping.
                                    KEY_NAMES = ['t', 'n', 'r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
                                    ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
                                    '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\', ']', '^', '_', '`',
                                    'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
                                    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
                                    'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
                                    'browserback', 'browserfavorites', 'browserforward', 'browserhome',
                                    'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
                                    'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
                                    'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
                                    'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
                                    'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
                                    'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
                                    'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
                                    'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
                                    'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
                                    'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
                                    'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
                                    'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
                                    'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
                                    'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
                                    'command', 'option', 'optionleft', 'optionright']

                                    keyboardMapping = dict([(key, None) for key in KEY_NAMES])
                                    keyboardMapping.update({
                                    'backspace': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
                                    'b': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
                                    'tab': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
                                    'enter': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                    'return': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                    'shift': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
                                    'ctrl': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
                                    'alt': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
                                    'pause': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Pause')),
                                    'capslock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Caps_Lock')),
                                    'esc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                    'escape': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                    'pgup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
                                    'pgdn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
                                    'pageup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
                                    'pagedown': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
                                    'end': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('End')),
                                    'home': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Home')),
                                    'left': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Left')),
                                    'up': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Up')),
                                    'right': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Right')),
                                    'down': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Down')),
                                    'select': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Select')),
                                    'print': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                    'execute': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Execute')),
                                    'prtsc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                    'prtscr': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                    'prntscrn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                    'printscreen': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                    'insert': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Insert')),
                                    'del': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
                                    'delete': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
                                    'help': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Help')),
                                    'winleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
                                    'winright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_R')),
                                    'apps': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
                                    'num0': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_0')),
                                    'num1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_1')),
                                    'num2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_2')),
                                    'num3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_3')),
                                    'num4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_4')),
                                    'num5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_5')),
                                    'num6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_6')),
                                    'num7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_7')),
                                    'num8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_8')),
                                    'num9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_9')),
                                    'multiply': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Multiply')),
                                    'add': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Add')),
                                    'separator': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Separator')),
                                    'subtract': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Subtract')),
                                    'decimal': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Decimal')),
                                    'divide': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Divide')),
                                    'f1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F1')),
                                    'f2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F2')),
                                    'f3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F3')),
                                    'f4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F4')),
                                    'f5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F5')),
                                    'f6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F6')),
                                    'f7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F7')),
                                    'f8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F8')),
                                    'f9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F9')),
                                    'f10': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F10')),
                                    'f11': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F11')),
                                    'f12': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F12')),
                                    'f13': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F13')),
                                    'f14': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F14')),
                                    'f15': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F15')),
                                    'f16': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F16')),
                                    'f17': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F17')),
                                    'f18': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F18')),
                                    'f19': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F19')),
                                    'f20': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F20')),
                                    'f21': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F21')),
                                    'f22': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F22')),
                                    'f23': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F23')),
                                    'f24': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F24')),
                                    'numlock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Num_Lock')),
                                    'scrolllock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Scroll_Lock')),
                                    'shiftleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
                                    'shiftright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_R')),
                                    'ctrlleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
                                    'ctrlright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_R')),
                                    'altleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
                                    'altright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_R')),
                                    # These are added because unlike a-zA-Z0-9, the single characters do not have a
                                    ' ': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
                                    'space': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
                                    't': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
                                    'n': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')), # for some reason this needs to be cr, not lf
                                    'r': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                    'e': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                    '!': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('exclam')),
                                    '#': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('numbersign')),
                                    '%': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('percent')),
                                    '$': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('dollar')),
                                    '&': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('ampersand')),
                                    '"': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('quotedbl')),
                                    "'": _display.keysym_to_keycode(Xlib.XK.string_to_keysym('apostrophe')),
                                    '(': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenleft')),
                                    ')': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenright')),
                                    '*': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asterisk')),
                                    '=': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('equal')),
                                    '+': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('plus')),
                                    ',': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('comma')),
                                    '-': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('minus')),
                                    '.': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('period')),
                                    '/': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('slash')),
                                    ':': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('colon')),
                                    ';': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('semicolon')),
                                    '<': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('less')),
                                    '>': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('greater')),
                                    '?': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('question')),
                                    '@': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('at')),
                                    '[': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketleft')),
                                    ']': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketright')),
                                    '\': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('backslash')),
                                    '^': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciicircum')),
                                    '_': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('underscore')),
                                    '`': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('grave')),
                                    '{': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceleft')),
                                    '|': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bar')),
                                    '}': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceright')),
                                    '~': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciitilde')),
                                    })

                                    for c in """abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890""":
                                    keyboardMapping[c] = _display.keysym_to_keycode(Xlib.XK.string_to_keysym(c))



                                    def isShiftCharacter(character):
                                    """Returns True if the key character is uppercase or shifted."""
                                    return character.isupper() or character in '~!@#$%^&*()_+{}|:"<>?'


                                    def keyDown(key):
                                    """Performs a keyboard key press without the release. This will put that
                                    key in a held down state.

                                    NOTE: For some reason, this does not seem to cause key repeats like would
                                    happen if a keyboard key was held down on a text field.

                                    Args:
                                    key (str): The key to be pressed down. The valid names are listed in
                                    pyautogui.KEY_NAMES.

                                    Returns:
                                    None
                                    """
                                    if key not in keyboardMapping or keyboardMapping[key] is None:
                                    return

                                    if type(key) == int:
                                    fake_input(_display, X.KeyPress, key)
                                    _display.sync()
                                    return

                                    needsShift = isShiftCharacter(key)
                                    if needsShift:
                                    fake_input(_display, X.KeyPress, keyboardMapping['shift'])

                                    fake_input(_display, X.KeyPress, keyboardMapping[key])

                                    if needsShift:
                                    fake_input(_display, X.KeyRelease, keyboardMapping['shift'])
                                    _display.sync()


                                    def keyUp(key):
                                    """Performs a keyboard key release (without the press down beforehand).

                                    Args:
                                    key (str): The key to be released up. The valid names are listed in
                                    KEY_NAMES.

                                    Returns:
                                    None
                                    """

                                    """
                                    Release a given character key. Also works with character keycodes as
                                    integers, but not keysyms.
                                    """
                                    if key not in keyboardMapping or keyboardMapping[key] is None:
                                    return

                                    if type(key) == int:
                                    keycode = key
                                    else:
                                    keycode = keyboardMapping[key]

                                    fake_input(_display, X.KeyRelease, keycode)
                                    _display.sync()





                                    share|improve this answer












                                    I'm no expert on Xlib, but managed to piece together this code for the PyAutoGUI module. Here's the minimum viable example that can simulate a keyDown() and keyUp() for a keyboard key:



                                    # You must run `pip3 install python3-xlib` to get the Xlib modules.

                                    import os

                                    from Xlib.display import Display
                                    from Xlib import X
                                    from Xlib.ext.xtest import fake_input
                                    import Xlib.XK

                                    _display = Display(os.environ['DISPLAY'])

                                    # Create the keyboard mapping.
                                    KEY_NAMES = ['t', 'n', 'r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
                                    ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
                                    '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\', ']', '^', '_', '`',
                                    'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
                                    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
                                    'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
                                    'browserback', 'browserfavorites', 'browserforward', 'browserhome',
                                    'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
                                    'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
                                    'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
                                    'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
                                    'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
                                    'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
                                    'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
                                    'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
                                    'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
                                    'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
                                    'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
                                    'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
                                    'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
                                    'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
                                    'command', 'option', 'optionleft', 'optionright']

                                    keyboardMapping = dict([(key, None) for key in KEY_NAMES])
                                    keyboardMapping.update({
                                    'backspace': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
                                    'b': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
                                    'tab': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
                                    'enter': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                    'return': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                    'shift': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
                                    'ctrl': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
                                    'alt': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
                                    'pause': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Pause')),
                                    'capslock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Caps_Lock')),
                                    'esc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                    'escape': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                    'pgup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
                                    'pgdn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
                                    'pageup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
                                    'pagedown': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
                                    'end': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('End')),
                                    'home': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Home')),
                                    'left': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Left')),
                                    'up': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Up')),
                                    'right': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Right')),
                                    'down': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Down')),
                                    'select': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Select')),
                                    'print': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                    'execute': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Execute')),
                                    'prtsc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                    'prtscr': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                    'prntscrn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                    'printscreen': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
                                    'insert': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Insert')),
                                    'del': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
                                    'delete': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
                                    'help': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Help')),
                                    'winleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
                                    'winright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_R')),
                                    'apps': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
                                    'num0': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_0')),
                                    'num1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_1')),
                                    'num2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_2')),
                                    'num3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_3')),
                                    'num4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_4')),
                                    'num5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_5')),
                                    'num6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_6')),
                                    'num7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_7')),
                                    'num8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_8')),
                                    'num9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_9')),
                                    'multiply': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Multiply')),
                                    'add': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Add')),
                                    'separator': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Separator')),
                                    'subtract': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Subtract')),
                                    'decimal': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Decimal')),
                                    'divide': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Divide')),
                                    'f1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F1')),
                                    'f2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F2')),
                                    'f3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F3')),
                                    'f4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F4')),
                                    'f5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F5')),
                                    'f6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F6')),
                                    'f7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F7')),
                                    'f8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F8')),
                                    'f9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F9')),
                                    'f10': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F10')),
                                    'f11': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F11')),
                                    'f12': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F12')),
                                    'f13': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F13')),
                                    'f14': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F14')),
                                    'f15': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F15')),
                                    'f16': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F16')),
                                    'f17': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F17')),
                                    'f18': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F18')),
                                    'f19': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F19')),
                                    'f20': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F20')),
                                    'f21': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F21')),
                                    'f22': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F22')),
                                    'f23': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F23')),
                                    'f24': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F24')),
                                    'numlock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Num_Lock')),
                                    'scrolllock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Scroll_Lock')),
                                    'shiftleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
                                    'shiftright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_R')),
                                    'ctrlleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
                                    'ctrlright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_R')),
                                    'altleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
                                    'altright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_R')),
                                    # These are added because unlike a-zA-Z0-9, the single characters do not have a
                                    ' ': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
                                    'space': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
                                    't': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
                                    'n': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')), # for some reason this needs to be cr, not lf
                                    'r': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
                                    'e': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
                                    '!': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('exclam')),
                                    '#': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('numbersign')),
                                    '%': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('percent')),
                                    '$': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('dollar')),
                                    '&': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('ampersand')),
                                    '"': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('quotedbl')),
                                    "'": _display.keysym_to_keycode(Xlib.XK.string_to_keysym('apostrophe')),
                                    '(': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenleft')),
                                    ')': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenright')),
                                    '*': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asterisk')),
                                    '=': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('equal')),
                                    '+': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('plus')),
                                    ',': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('comma')),
                                    '-': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('minus')),
                                    '.': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('period')),
                                    '/': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('slash')),
                                    ':': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('colon')),
                                    ';': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('semicolon')),
                                    '<': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('less')),
                                    '>': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('greater')),
                                    '?': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('question')),
                                    '@': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('at')),
                                    '[': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketleft')),
                                    ']': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketright')),
                                    '\': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('backslash')),
                                    '^': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciicircum')),
                                    '_': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('underscore')),
                                    '`': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('grave')),
                                    '{': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceleft')),
                                    '|': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bar')),
                                    '}': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceright')),
                                    '~': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciitilde')),
                                    })

                                    for c in """abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890""":
                                    keyboardMapping[c] = _display.keysym_to_keycode(Xlib.XK.string_to_keysym(c))



                                    def isShiftCharacter(character):
                                    """Returns True if the key character is uppercase or shifted."""
                                    return character.isupper() or character in '~!@#$%^&*()_+{}|:"<>?'


                                    def keyDown(key):
                                    """Performs a keyboard key press without the release. This will put that
                                    key in a held down state.

                                    NOTE: For some reason, this does not seem to cause key repeats like would
                                    happen if a keyboard key was held down on a text field.

                                    Args:
                                    key (str): The key to be pressed down. The valid names are listed in
                                    pyautogui.KEY_NAMES.

                                    Returns:
                                    None
                                    """
                                    if key not in keyboardMapping or keyboardMapping[key] is None:
                                    return

                                    if type(key) == int:
                                    fake_input(_display, X.KeyPress, key)
                                    _display.sync()
                                    return

                                    needsShift = isShiftCharacter(key)
                                    if needsShift:
                                    fake_input(_display, X.KeyPress, keyboardMapping['shift'])

                                    fake_input(_display, X.KeyPress, keyboardMapping[key])

                                    if needsShift:
                                    fake_input(_display, X.KeyRelease, keyboardMapping['shift'])
                                    _display.sync()


                                    def keyUp(key):
                                    """Performs a keyboard key release (without the press down beforehand).

                                    Args:
                                    key (str): The key to be released up. The valid names are listed in
                                    KEY_NAMES.

                                    Returns:
                                    None
                                    """

                                    """
                                    Release a given character key. Also works with character keycodes as
                                    integers, but not keysyms.
                                    """
                                    if key not in keyboardMapping or keyboardMapping[key] is None:
                                    return

                                    if type(key) == int:
                                    keycode = key
                                    else:
                                    keycode = keyboardMapping[key]

                                    fake_input(_display, X.KeyRelease, keycode)
                                    _display.sync()






                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered Nov 9 at 23:31









                                    Al Sweigart

                                    4,31722945




                                    4,31722945






























                                        draft saved

                                        draft discarded




















































                                        Thanks for contributing an answer to Stack Overflow!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.





                                        Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                                        Please pay close attention to the following guidance:


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function () {
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f13840697%2fxlib-control-keyboard-events%23new-answer', 'question_page');
                                        }
                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        Landwehr

                                        Reims

                                        Javascript gets undefined on array