Skip to content

Allow to emulate input events using libei

Description

This series allow using libei when available at compile time and at run time to emulate input events.

If libei is not present at compile time or if it present but it is not possible to initialize it because the compositor doesn't support it, the D-Bus backend is used as fallback.

Requirements

  • libei >= 1.0.0
  • Mutter >= 45.beta

Testing:

The code was written with backward compatibility in mind and I performed some simple testing on GNOME Calculator (version 44.0) to make sure that the behavior of gnome-ponytail-daemon is identical when using the libei backend or the D-Bus backend.

To test it, open the calculator, switch it to "Basic" mode and resize the screen until it is as small as possible.

Now, in a terminal, connect to its window as described in the README.md file and run these commands:

# Move the pointer to the top-left corner of the 7 and click it
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateMotionEvent double:75 double:350  && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateButtonEvent int32:1 boolean:true  && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateButtonEvent int32:1 boolean:false && \

# Move the pointer to the top-left corner of the 5 and click it
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateMotionEvent double:142 double:397 && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateButtonEvent int32:1 boolean:true  && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateButtonEvent int32:1 boolean:false && \

# Move the pointer to the top-left corner of the 3 and click it
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateMotionEvent double:208 double:445 && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateButtonEvent int32:1 boolean:true  && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateButtonEvent int32:1 boolean:false && \

# Send the "+" keysym
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateKeysymEvent uint32:43 boolean:true  && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateKeysymEvent uint32:43 boolean:false && \

# Send the "4", "8" and "1" keycodes
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateKeycodeEvent uint32:13 boolean:true  && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateKeycodeEvent uint32:13 boolean:false && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateKeycodeEvent uint32:17 boolean:true  && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateKeycodeEvent uint32:17 boolean:false && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateKeycodeEvent uint32:10 boolean:true  && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateKeycodeEvent uint32:10 boolean:false && \

# Send the "=" keysym
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateKeysymEvent uint32:61 boolean:true  && \
dbus-send --session --print-reply --dest=org.gnome.Ponytail /org/gnome/Ponytail/EventController org.gnome.Ponytail.EventController.GenerateKeysymEvent uint32:61 boolean:false

# The calculator should display 753 + 481 = 1234

Note that the pointer is moved to the first clickable X,Y pixel of the buttons to make sure the behavior is identical with both backends.

cc @ofourdan @modehnal

Merge request reports