/* the code to retrieve the keymap direction and cache it * is taken from GDK: * gdk/x11/gdkkeys-x11.c */ static PangoDirection get_direction (XkbDescPtr xkb, int group) { int rtl_minus_ltr = 0; /* total number of RTL keysyms minus LTR ones */ int code; for (code = xkb->min_key_code; code <= xkb->max_key_code; code += 1) { int level = 0; KeySym sym = XkbKeySymEntry (xkb, code, level, group); PangoDirection dir = pango_unichar_direction (clutter_keysym_to_unicode (sym)); switch (dir) { case PANGO_DIRECTION_RTL: rtl_minus_ltr++; break; case PANGO_DIRECTION_LTR: rtl_minus_ltr--; break; default: break; } } if (rtl_minus_ltr > 0) return PANGO_DIRECTION_RTL; return PANGO_DIRECTION_LTR; }
/** * clutter_key_event_unicode: * @keyev: A #ClutterKeyEvent * * Retrieves the unicode value for the key that caused @keyev. * * Return value: The unicode value representing the key */ guint32 clutter_key_event_unicode (ClutterKeyEvent *keyev) { g_return_val_if_fail (keyev != NULL, 0); if (keyev->unicode_value) return keyev->unicode_value; else return clutter_keysym_to_unicode (keyev->keyval); }
/** * clutter_event_get_key_unicode: * @event: a #ClutterEvent of type %CLUTTER_KEY_PRESS * or %CLUTTER_KEY_RELEASE * * Retrieves the unicode value for the key that caused @keyev. * * Return value: The unicode value representing the key */ guint32 clutter_event_get_key_unicode (const ClutterEvent *event) { g_return_val_if_fail (event != NULL, 0); g_return_val_if_fail (event->type == CLUTTER_KEY_PRESS || event->type == CLUTTER_KEY_RELEASE, 0); if (event->key.unicode_value) return event->key.unicode_value; else return clutter_keysym_to_unicode (event->key.keyval); }
static void mex_lirc_create_key_event (ClutterKeyEvent *event, guint keyval) { ClutterDeviceManager *manager = clutter_device_manager_get_default (); /* Event synthesis inspired/copied from Clutter X11 backend */ event->flags = CLUTTER_EVENT_FLAG_SYNTHETIC; event->time = CurrentTime; event->keyval = keyval; event->unicode_value = clutter_keysym_to_unicode (event->keyval); event->device = clutter_device_manager_get_core_device (manager, CLUTTER_KEYBOARD_DEVICE); }
static void fill_keybuf (char *keybuf, ClutterKeyEvent *event) { char utf8[6]; int len; /* printable character, if any (ß, ∑) */ len = g_unichar_to_utf8 (event->unicode_value, utf8); utf8[len] = '\0'; sprintf (keybuf, "'%s' ", utf8); /* key combination (<Mod1>s, <Shift><Mod1>S, <Ctrl><Mod1>Delete) */ len = g_unichar_to_utf8 (clutter_keysym_to_unicode (event->keyval), utf8); utf8[len] = '\0'; if (event->modifier_state & CLUTTER_SHIFT_MASK) strcat (keybuf, "<Shift>"); if (event->modifier_state & CLUTTER_LOCK_MASK) strcat (keybuf, "<Lock>"); if (event->modifier_state & CLUTTER_CONTROL_MASK) strcat (keybuf, "<Control>"); if (event->modifier_state & CLUTTER_MOD1_MASK) strcat (keybuf, "<Mod1>"); if (event->modifier_state & CLUTTER_MOD2_MASK) strcat (keybuf, "<Mod2>"); if (event->modifier_state & CLUTTER_MOD3_MASK) strcat (keybuf, "<Mod3>"); if (event->modifier_state & CLUTTER_MOD4_MASK) strcat (keybuf, "<Mod4>"); if (event->modifier_state & CLUTTER_MOD5_MASK) strcat (keybuf, "<Mod5>"); strcat (keybuf, utf8); }
IO_METHOD(IoClutter, keySymbolToUnicode) { return IONUMBER(clutter_keysym_to_unicode(IoMessage_locals_doubleArgAt_(m, locals, 0))); }
static gboolean debug_event_cb (ClutterActor *actor, ClutterEvent *event, gpointer data) { gchar keybuf[9], *source = (gchar*)data; int len = 0; switch (event->type) { case CLUTTER_KEY_PRESS: len = g_unichar_to_utf8 (clutter_keysym_to_unicode (event->key.keyval), keybuf); keybuf[len] = '\0'; printf ("[%s] KEY PRESS '%s'", source, keybuf); break; case CLUTTER_KEY_RELEASE: len = g_unichar_to_utf8 (clutter_keysym_to_unicode (event->key.keyval), keybuf); keybuf[len] = '\0'; printf ("[%s] KEY RELEASE '%s'", source, keybuf); break; case CLUTTER_MOTION: printf("[%s] MOTION", source); break; case CLUTTER_ENTER: printf("[%s] ENTER", source); break; case CLUTTER_LEAVE: printf("[%s] LEAVE", source); break; case CLUTTER_BUTTON_PRESS: printf("[%s] BUTTON PRESS (click count:%i)", source, event->button.click_count); break; case CLUTTER_BUTTON_RELEASE: printf("[%s] BUTTON RELEASE", source); break; case CLUTTER_SCROLL: printf("[%s] BUTTON SCROLL", source); break; case CLUTTER_STAGE_STATE: printf("[%s] STAGE STATE", source); break; case CLUTTER_DESTROY_NOTIFY: printf("[%s] DESTROY NOTIFY", source); break; case CLUTTER_CLIENT_MESSAGE: printf("[%s] CLIENT MESSAGE\n", source); break; case CLUTTER_DELETE: printf("[%s] DELETE", source); break; case CLUTTER_NOTHING: return FALSE; } if (clutter_event_get_source (event) == actor) printf(" *source*"); printf("\n"); return FALSE; }