Translate KeyPress/KeyRelease in gtkplug-x11
This makes XEmbed work properly again. Only event->key.group and is_modifier are left blank at the moment. Exposing the necessary XKB bits should be considered, but it's not urgent for the current usecases.
This commit is contained in:
parent
4ed781778d
commit
29b4baea97
@ -353,64 +353,52 @@ _gtk_plug_windowing_filter_func (GdkXEvent *gdk_xevent,
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* FIXME: this needs some X11 backend api to do things
|
|
||||||
* in a saner way
|
|
||||||
*/
|
|
||||||
case KeyPress:
|
case KeyPress:
|
||||||
case KeyRelease:
|
case KeyRelease:
|
||||||
{
|
{
|
||||||
static GdkDeviceManager *core_device_manager = NULL;
|
GdkModifierType state, consumed;
|
||||||
GdkDeviceManager *device_manager;
|
GdkDeviceManager *device_manager;
|
||||||
GdkEvent *translated_event;
|
GdkDevice *pointer, *keyboard;
|
||||||
GList *devices, *d;
|
GdkKeymap *keymap;
|
||||||
GdkDevice *keyboard = NULL;
|
|
||||||
|
if (xevent->type == KeyPress)
|
||||||
|
event->key.type = GDK_KEY_PRESS;
|
||||||
|
else
|
||||||
|
event->key.type = GDK_KEY_RELEASE;
|
||||||
|
|
||||||
|
event->key.window = gdk_x11_window_lookup_for_display (display, xevent->xany.window);
|
||||||
|
event->key.send_event = TRUE;
|
||||||
|
event->key.time = xevent->xkey.time;
|
||||||
|
event->key.state = (GdkModifierType) xevent->xkey.state;
|
||||||
|
event->key.hardware_keycode = xevent->xkey.keycode;
|
||||||
|
event->key.keyval = GDK_KEY_VoidSymbol;
|
||||||
|
|
||||||
device_manager = gdk_display_get_device_manager (display);
|
device_manager = gdk_display_get_device_manager (display);
|
||||||
|
pointer = gdk_device_manager_get_client_pointer (device_manager);
|
||||||
|
keyboard = gdk_device_get_associated_device (pointer);
|
||||||
|
gdk_event_set_device (event, keyboard);
|
||||||
|
|
||||||
/* bail out if the device manager already
|
keymap = gdk_keymap_get_for_display (display);
|
||||||
* interprets core keyboard events.
|
gdk_keymap_translate_keyboard_state (keymap,
|
||||||
*/
|
event->key.hardware_keycode,
|
||||||
if (!GDK_IS_DEVICE_MANAGER_XI2 (device_manager))
|
event->key.state,
|
||||||
return GDK_FILTER_CONTINUE;
|
event->key.group,
|
||||||
|
&event->key.keyval,
|
||||||
|
NULL, NULL, &consumed);
|
||||||
|
|
||||||
/* Find out the first keyboard device, the
|
state = event->key.state & ~consumed;
|
||||||
* generated event will be assigned to it.
|
gdk_keymap_add_virtual_modifiers (keymap, &state);
|
||||||
*/
|
event->key.state |= state;
|
||||||
devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER);
|
|
||||||
|
|
||||||
for (d = devices; d; d = d->next)
|
event->key.length = 0;
|
||||||
{
|
event->key.string = g_strdup ("");
|
||||||
GdkDevice *device = d->data;
|
|
||||||
|
|
||||||
if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
|
/* FIXME: These should be filled in properly */
|
||||||
keyboard = device;
|
event->key.group = 0;
|
||||||
}
|
event->key.is_modifier = FALSE;
|
||||||
|
|
||||||
g_list_free (devices);
|
return_val = GDK_FILTER_TRANSLATE;
|
||||||
|
|
||||||
if (!keyboard)
|
|
||||||
return GDK_FILTER_CONTINUE;
|
|
||||||
|
|
||||||
/* This is a crude hack so key events
|
|
||||||
* are interpreted as if there was a
|
|
||||||
* GdkDeviceManagerCore available.
|
|
||||||
*/
|
|
||||||
if (G_UNLIKELY (!core_device_manager))
|
|
||||||
core_device_manager = g_object_new (GDK_TYPE_DEVICE_MANAGER_CORE,
|
|
||||||
"display", display,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
translated_event = gdk_event_translator_translate (GDK_EVENT_TRANSLATOR (core_device_manager), display, xevent);
|
|
||||||
gdk_event_set_device (translated_event, keyboard);
|
|
||||||
|
|
||||||
gtk_main_do_event (translated_event);
|
|
||||||
gdk_event_free (translated_event);
|
|
||||||
|
|
||||||
return_val = GDK_FILTER_REMOVE;
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return return_val;
|
return return_val;
|
||||||
|
Loading…
Reference in New Issue
Block a user