I’m trying to find an alternative to gdk_x11_keymap_key_is_modifier that may work on other platform than just on X11.
My application generates GDK_KEY_PRESS and GDK_KEY_RELEASE based on a sequence that have been previously saved by the user.
Based on each keycode I determine if that specific keycode is a modifier with gdk_x11_keymap_key_is_modifier to set event.is_modifier
As this cannot work on pure Wayland or other platform like Windows or on Quartz, I was wondering if it exists an alternative instead of reinventting the wheel, also because I don’t know from where to start .
This ismy function that as of today works only on X11
/* Check if the requested keycode is a key modifier */
gboolean
get_modifier_for_keycode(GdkKeymap *keymap, guint16 keycode)
{
g_return_val_if_fail(keycode > 0, FALSE);
#ifdef GDK_WINDOWING_X11
return gdk_x11_keymap_key_is_modifier(keymap, keycode);
#else
return FALSE;
#endif
}
This is the piece of code that emit the key press/release and that call the previous function
void
send_keys_signals(GtkWidget *widget,
const guint *keyvals,
int keyvals_length,
GdkEventType action)
{
int i;
GdkEventKey event;
gboolean result;
GdkKeymap *keymap = gdk_keymap_get_for_display(gdk_display_get_default());
event.window = gtk_widget_get_window(widget);
event.send_event = TRUE;
event.time = GDK_CURRENT_TIME;
event.state = 0;
event.length = 0;
event.string = "";
event.group = 0;
if (action & GDK_KEY_PRESS) {
/* Press the requested buttons */
event.type = GDK_KEY_PRESS;
for (i = 0; i < keyvals_length; i++) {
event.keyval = keyvals[i];
event.hardware_keycode = get_keycode_for_keyval(keymap, event.keyval);
event.is_modifier = (int)get_modifier_for_keycode(keymap, event.hardware_keycode);
g_signal_emit_by_name(G_OBJECT(widget), "key-press-event", &event, &result);
}
}
if (action & GDK_KEY_RELEASE) {
/* Release the requested buttons in reverse order */
event.type = GDK_KEY_RELEASE;
for (i = (keyvals_length - 1); i >= 0; i--) {
event.keyval = keyvals[i];
event.hardware_keycode = get_keycode_for_keyval(keymap, event.keyval);
event.is_modifier = (int)get_modifier_for_keycode(keymap, event.hardware_keycode);
g_signal_emit_by_name(G_OBJECT(widget), "key-release-event", &event, &result);
}
}
}