Exemplo n.º 1
0
static void
translate_key_event (GdkDisplay              *display,
                     GdkX11DeviceManagerCore *device_manager,
                     GdkEvent                *event,
                     XEvent                  *xevent)
{
  GdkKeymap *keymap = gdk_keymap_get_for_display (display);
  GdkModifierType consumed, state;

  event->key.type = xevent->xany.type == KeyPress ? GDK_KEY_PRESS : GDK_KEY_RELEASE;
  event->key.time = xevent->xkey.time;
  gdk_event_set_device (event, device_manager->core_keyboard);

  event->key.state = (GdkModifierType) xevent->xkey.state;
  event->key.group = gdk_x11_keymap_get_group_for_state (keymap, xevent->xkey.state);
  event->key.hardware_keycode = xevent->xkey.keycode;

  event->key.keyval = GDK_KEY_VoidSymbol;

  gdk_keymap_translate_keyboard_state (keymap,
                                       event->key.hardware_keycode,
                                       event->key.state,
                                       event->key.group,
                                       &event->key.keyval,
                                       NULL, NULL, &consumed);

  state = event->key.state & ~consumed;
  _gdk_x11_keymap_add_virt_mods (keymap, &state);
  event->key.state |= state;

  event->key.is_modifier = gdk_x11_keymap_key_is_modifier (keymap, event->key.hardware_keycode);

  _gdk_x11_event_translate_keyboard_string (&event->key);

#ifdef G_ENABLE_DEBUG
  if (GDK_DEBUG_CHECK (EVENTS))
    {
      g_message ("%s:\t\twindow: %ld     key: %12s  %d",
                 event->type == GDK_KEY_PRESS ? "key press  " : "key release",
                 xevent->xkey.window,
                 event->key.keyval ? gdk_keyval_name (event->key.keyval) : "(none)",
                 event->key.keyval);

      if (event->key.length > 0)
        g_message ("\t\tlength: %4d string: \"%s\"",
                   event->key.length, event->key.string);
    }
#endif /* G_ENABLE_DEBUG */
  return;
}
Exemplo n.º 2
0
static NimfEvent *
translate_xkey_event (XEvent *xevent)
{
  g_debug (G_STRLOC ": %s", G_STRFUNC);

  GdkKeymap *keymap = gdk_keymap_get_default ();
  GdkModifierType consumed, state;

  NimfEvent *nimf_event = nimf_event_new (NIMF_EVENT_NOTHING);

  if (xevent->type == KeyPress)
    nimf_event->key.type = NIMF_EVENT_KEY_PRESS;
  else
    nimf_event->key.type = NIMF_EVENT_KEY_RELEASE;

  nimf_event->key.state = (NimfModifierType) xevent->xkey.state;

#if GTK_CHECK_VERSION (3, 6, 0)
  gint group = gdk_x11_keymap_get_group_for_state (keymap, xevent->xkey.state);
#else
  gint group = XkbGroupForCoreState (xevent->xkey.state);
#endif

  nimf_event->key.hardware_keycode = xevent->xkey.keycode;
  nimf_event->key.keyval = NIMF_KEY_VoidSymbol;

  gdk_keymap_translate_keyboard_state (keymap,
                                       nimf_event->key.hardware_keycode,
                                       nimf_event->key.state,
                                       group,
                                       &nimf_event->key.keyval,
                                       NULL, NULL, &consumed);

  state = nimf_event->key.state & ~consumed;
  gdk_keymap_add_virtual_modifiers (keymap, &state);
  nimf_event->key.state |= (NimfModifierType) state;

  return nimf_event;
}