Web lists-archives.com

XTestFakeKeyEvent GDK-equivalent




Hi,

I'm working into implementing a virtual remote keyboard/touch pad daemon for Linux, currently I'm dumping events into an uinput device, but that is giving me some trouble with my keyboard layout (which is brazillian, br-abnt2). I was looking for a way to this in X, found XTestFakeKeyEvent and was wondering if I could make it simpler and cross-platform using
GDK3. I tried this attached code, but it doesn't do anything. I was wondering if someone has done this before and know what I'm doing wrong or if I should just give up doing with GDK.

Also, this is an extra, if I can't just fake key events, what should I use to map unicode chars into linux/input.h event key codes based on my keyboard layout on X? What about Wayland?

Thank you!


Sent with ProtonMail Secure Email.

#include <stdio.h>
#include <string.h>
#include <gdk/gdk.h>
#include <gio/gio.h>
#include <gtk/gtk.h>
#include <unistd.h>

static void
activate (GApplication *app)
{
  GdkEventKey event;
  GdkDisplay *dpy;
  GdkKeymap *kmap;
  GdkKeymapKey *keys;
  gint n_keys;
  guint keyval = GDK_KEY_o;

  dpy = gdk_display_get_default ();
  kmap = gdk_keymap_get_for_display (dpy);

  gdk_keymap_get_entries_for_keyval (kmap, keyval, &keys, &n_keys);

  memset (&event, 0, sizeof (event));
  event.type = GDK_KEY_PRESS;
  event.window = NULL;
  event.send_event = 0;

  event.time = GDK_CURRENT_TIME;
  event.state = 0;
  event.keyval = keyval;
  event.length = 1;
  event.string = strdup ("o");
  event.hardware_keycode = keys->keycode;
  event.group = keys->group;
  event.is_modifier = 0;

  gdk_display_put_event (dpy, (GdkEvent *) (&event));
  event.type = GDK_KEY_RELEASE;

  gdk_display_put_event (dpy, (GdkEvent *) (&event));

  while (gtk_events_pending ()) {
    gtk_main_iteration ();
  }
}

int
main (int argc, char **argv)
{
  GtkApplication *app;
  app = gtk_application_new ("com.anarchean.linuxrc", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  
  return g_application_run (G_APPLICATION (app), argc, argv);
}
_______________________________________________
gtk-list mailing list
gtk-list@xxxxxxxxx
https://mail.gnome.org/mailman/listinfo/gtk-list