xvfb und darauf per Xlib tastendrücke abfeuern



  • Hallo liebe Community,

    und zwar habe ich folgendes Problem:
    Ich möchte ein kleines C++ Programm schreiben, dass Tastendrücke (in/auf) ein xvfb-Display abfeuern kann. Ge-google.de und was gefunden. Nur scheitere ich gerade dadran wenn ich den xvfb-Display ansteuern möchte.
    Lange rede, wenig Sinn hier der Code:

    // Send a fake keystroke event to an X window.
    // by Adam Pierce - http://www.doctort.org/adam/
    // This is public domain software. It is free to use by anyone for any purpose.
    
    #include <X11/Xlib.h>
    #include <X11/keysym.h>
    
    // The key code to be sent.
    // A full list of available codes can be found in /usr/include/X11/keysymdef.h
    #define KEYCODE XK_A
    
    // Function to create a keyboard event
    XKeyEvent createKeyEvent(Display *display, Window &win,
                               Window &winRoot, bool press,
                               int keycode, int modifiers)
    {
       XKeyEvent event;
    
       event.display     = display;
       event.window      = win;
       event.root        = winRoot;
       event.subwindow   = None;
       event.time        = CurrentTime;
       event.x           = 1;
       event.y           = 1;
       event.x_root      = 1;
       event.y_root      = 1;
       event.same_screen = True;
       event.keycode     = XKeysymToKeycode(display, keycode);
       event.state       = modifiers;
    
       if(press)
          event.type = KeyPress;
       else
          event.type = KeyRelease;
    
       return event;
    }
    
    main()
    {
    // Obtain the X11 display.
       Display *display = XOpenDisplay(":20.0");//Hier steuer ich das Display an!
       if(display == NULL)
          return -1;
       XEnableAccessControl(display);
    
    // Get the root window for the current display.
       Window winRoot = XDefaultRootWindow(display);
    
    // Find the window which has the current keyboard focus.
       Window winFocus;
       int    revert;
       XGetInputFocus(display, &winFocus, &revert);
    
    // Send a fake key press event to the window.
       XKeyEvent event = createKeyEvent(display, winFocus, winRoot, true, XK_A, 0);
       XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
    
    // Send a fake key press event to the window.
       //event = createKeyEvent(display, winFocus, winRoot, true, XK_W, 0);
       //XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
    
    // Send a fake key release event to the window.
       //event = createKeyEvent(display, winFocus, winRoot, false, XK_W, 0);
       //XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
    
    // Send a fake key release event to the window.
       event = createKeyEvent(display, winFocus, winRoot, false, XK_A, 0);
       XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
    
    // Done.
       XCloseDisplay(display);
       return 0;
    }
    

    Wenn ich mein default Display nehme oder direkt per ":0.0" ansteuere funktioniert das.
    Sobald ich versuche das xfvb-Display zu nehmen gehts nicht.
    Ich teste das ganze mit einem Firefox-Fenster und mach dann Screenshots um zu gucken obs geht.
    Wenn ich xdotool und dann das Display nehme geht das, aber ich würde lieber eine programmierte Lösung zur leichteren weiterverwendung bevorzugen.

    Gruß Dominik



  • Falls es jemanden interessiert, ich habe ein Weg gefunden das irgendwie zu lösen.
    Und zwar schreibt man mit einer Programmiersprache ein Programm was einen ein Shell-Skript schreibt mit den benötigten Tastendrücke usw. Hierbei muss man immer vor jedem Aufruf mit zum Beispiel xdotool immer das Display in dieser Form angeben: "DISPLAY=:X" so kann man nun alles was man drücken will hintereinander ausführen.
    Ist zwar ein wenig hässlich aber es funktioniert.

    Gruß Dominik


Log in to reply