ecore: Fix support for intl keyboards

Map XK_Mode_switch to new modifier and use it to match AltGr key. In
ecore_imf xim module this key should be reported as Mod5Mask, and
windows key as Mod4Mask.

Does none of the e developers use international keyboards?

SVN revision: 72937
This commit is contained in:
Sebastian Dransfeld 2012-06-27 10:47:57 +00:00
parent 18c327cfff
commit 84e54d532d
13 changed files with 37 additions and 8 deletions

View File

@ -116,7 +116,8 @@ typedef enum
ECORE_IMF_KEYBOARD_MODIFIER_CTRL = 1 << 0, /**< "Control" is pressed */
ECORE_IMF_KEYBOARD_MODIFIER_ALT = 1 << 1, /**< "Alt" is pressed */
ECORE_IMF_KEYBOARD_MODIFIER_SHIFT = 1 << 2, /**< "Shift" is pressed */
ECORE_IMF_KEYBOARD_MODIFIER_WIN = 1 << 3 /**< "Win" (between "Ctrl" and "Alt") is pressed */
ECORE_IMF_KEYBOARD_MODIFIER_WIN = 1 << 3, /**< "Win" (between "Ctrl" and "Alt") is pressed */
ECORE_IMF_KEYBOARD_MODIFIER_MODE = 1 << 4 /**< "AltGr" is pressed @since 1.3 */
} Ecore_IMF_Keyboard_Modifiers;
/**

View File

@ -33,6 +33,8 @@ _ecore_imf_evas_event_modifiers_wrap(Evas_Modifier *evas_modifiers,
*imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_SHIFT;
if (evas_key_modifier_is_set(evas_modifiers, "Super") || evas_key_modifier_is_set(evas_modifiers, "Hyper"))
*imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_WIN;
if (evas_key_modifier_is_set(evas_modifiers, "Mode"))
*imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_MODE;
}
/* Converts the Evas locks to Ecore_IMF keyboard locks */

View File

@ -57,6 +57,7 @@ extern "C" {
#define ECORE_EVENT_LOCK_NUM 0x0100
#define ECORE_EVENT_LOCK_CAPS 0x0200
#define ECORE_EVENT_LOCK_SHIFT 0x0300
#define ECORE_EVENT_MODIFIER_MODE 0x0400 /**< @since 1.3 */
typedef uintptr_t Ecore_Window;
typedef struct _Ecore_Event_Key Ecore_Event_Key;
@ -75,6 +76,7 @@ extern "C" {
ECORE_WIN,
ECORE_SCROLL,
ECORE_CAPS,
ECORE_MODE, /**< @since 1.3 */
ECORE_LAST
} Ecore_Event_Modifier;

View File

@ -88,6 +88,7 @@ static const Ecore_Event_Modifier_Match matchs[] = {
{ "Caps_Lock", ECORE_CAPS, ECORE_EVENT_MODIFIER_CAPS },
{ "Super_L", ECORE_WIN, ECORE_EVENT_MODIFIER_WIN },
{ "Super_R", ECORE_WIN, ECORE_EVENT_MODIFIER_WIN },
{ "ISO_Level3_Shift", ECORE_MODE, ECORE_EVENT_MODIFIER_MODE },
{ "Scroll_Lock", ECORE_SCROLL, ECORE_EVENT_MODIFIER_SCROLL }
};

View File

@ -55,6 +55,10 @@ ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers)
evas_key_modifier_off(e, "Hyper");
}
if (modifiers & ECORE_EVENT_MODIFIER_MODE)
evas_key_modifier_on(e, "Mode");
else evas_key_modifier_off(e, "Mode");
if (modifiers & ECORE_EVENT_LOCK_SCROLL)
evas_key_lock_on(e, "Scroll_Lock");
else evas_key_lock_off(e, "Scroll_Lock");
@ -100,6 +104,7 @@ ecore_event_window_register(Ecore_Window id, void *window, Evas *evas,
evas_key_modifier_add(evas, "Meta");
evas_key_modifier_add(evas, "Hyper");
evas_key_modifier_add(evas, "Super");
evas_key_modifier_add(evas, "Mode");
evas_key_lock_add(evas, "Caps_Lock");
evas_key_lock_add(evas, "Num_Lock");
evas_key_lock_add(evas, "Scroll_Lock");

View File

@ -550,6 +550,8 @@ _ecore_xcb_events_modifiers_get(unsigned int state)
modifiers |= ECORE_EVENT_MODIFIER_ALT;
if (state & ECORE_X_MODIFIER_WIN)
modifiers |= ECORE_EVENT_MODIFIER_WIN;
if (state & ECORE_X_MODIFIER_MODE)
modifiers |= ECORE_EVENT_MODIFIER_MODE;
if (state & ECORE_X_LOCK_SCROLL)
modifiers |= ECORE_EVENT_LOCK_SCROLL;
if (state & ECORE_X_LOCK_CAPS)

View File

@ -27,6 +27,7 @@ EAPI int ECORE_X_MODIFIER_SHIFT = 0;
EAPI int ECORE_X_MODIFIER_CTRL = 0;
EAPI int ECORE_X_MODIFIER_ALT = 0;
EAPI int ECORE_X_MODIFIER_WIN = 0;
EAPI int ECORE_X_MODIFIER_MODE = 0;
EAPI int ECORE_X_LOCK_SCROLL = 0;
EAPI int ECORE_X_LOCK_NUM = 0;
EAPI int ECORE_X_LOCK_CAPS = 0;
@ -69,11 +70,11 @@ _ecore_xcb_keymap_finalize(void)
ECORE_X_MODIFIER_ALT = _ecore_xcb_keymap_mask_get(reply, XK_Super_L);
ECORE_X_MODIFIER_WIN = _ecore_xcb_keymap_mask_get(reply, XK_Super_L);
if (!ECORE_X_MODIFIER_WIN)
ECORE_X_MODIFIER_WIN = _ecore_xcb_keymap_mask_get(reply, XK_Mode_switch);
if (!ECORE_X_MODIFIER_WIN)
ECORE_X_MODIFIER_WIN = _ecore_xcb_keymap_mask_get(reply, XK_Meta_L);
ECORE_X_MODIFIER_MODE = _ecore_xcb_keymap_mask_get(reply, XK_Mode_switch);
if (ECORE_X_MODIFIER_WIN == ECORE_X_MODIFIER_ALT)
ECORE_X_MODIFIER_WIN = 0;
if (ECORE_X_MODIFIER_ALT == ECORE_X_MODIFIER_CTRL)

View File

@ -213,6 +213,7 @@ extern int ECORE_X_MODIFIER_SHIFT;
extern int ECORE_X_MODIFIER_CTRL;
extern int ECORE_X_MODIFIER_ALT;
extern int ECORE_X_MODIFIER_WIN;
extern int ECORE_X_MODIFIER_MODE;
extern int ECORE_X_LOCK_SCROLL;
extern int ECORE_X_LOCK_NUM;
extern int ECORE_X_LOCK_CAPS;

View File

@ -2186,6 +2186,8 @@ _ecore_xcb_window_modifiers_get(unsigned int state)
xmodifiers |= ECORE_X_MODIFIER_ALT;
if (state & ECORE_EVENT_MODIFIER_WIN)
xmodifiers |= ECORE_X_MODIFIER_WIN;
if (state & ECORE_EVENT_MODIFIER_MODE)
xmodifiers |= ECORE_X_MODIFIER_MODE;
if (state & ECORE_EVENT_LOCK_SCROLL)
xmodifiers |= ECORE_X_LOCK_SCROLL;
if (state & ECORE_EVENT_LOCK_NUM)

View File

@ -130,6 +130,7 @@ int ECORE_X_MODIFIER_SHIFT = 0;
int ECORE_X_MODIFIER_CTRL = 0;
int ECORE_X_MODIFIER_ALT = 0;
int ECORE_X_MODIFIER_WIN = 0;
int ECORE_X_MODIFIER_MODE = 0;
EAPI int ECORE_X_LOCK_SCROLL = 0;
EAPI int ECORE_X_LOCK_NUM = 0;
@ -217,8 +218,9 @@ _ecore_x_XKeycodeToKeysym(Display *display, KeyCode keycode, int idx)
{
#ifdef ECORE_XKB
return XkbKeycodeToKeysym(display, keycode, 0, idx);
#endif
#else
return XKeycodeToKeysym(display, keycode, idx);
#endif
}
void
@ -238,12 +240,11 @@ _ecore_x_modifiers_get(void)
/* the windows key... a valid modifier :) */
ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Super_L);
if (!ECORE_X_MODIFIER_WIN)
ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Mode_switch);
if (!ECORE_X_MODIFIER_WIN)
ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Meta_L);
ECORE_X_MODIFIER_MODE = _ecore_x_key_mask_get(XK_Mode_switch);
if (ECORE_X_MODIFIER_WIN == ECORE_X_MODIFIER_ALT)
ECORE_X_MODIFIER_WIN = 0;
@ -2155,6 +2156,9 @@ _ecore_x_event_modifier(unsigned int state)
if (state & ECORE_EVENT_MODIFIER_WIN)
xmodifiers |= ECORE_X_MODIFIER_WIN;
if (state & ECORE_EVENT_MODIFIER_MODE)
xmodifiers |= ECORE_X_MODIFIER_MODE;
if (state & ECORE_EVENT_LOCK_SCROLL)
xmodifiers |= ECORE_X_LOCK_SCROLL;

View File

@ -183,6 +183,9 @@ _ecore_x_event_modifiers(unsigned int state)
if (state & ECORE_X_MODIFIER_WIN)
modifiers |= ECORE_EVENT_MODIFIER_WIN;
if (state & ECORE_X_MODIFIER_MODE)
modifiers |= ECORE_EVENT_MODIFIER_MODE;
if (state & ECORE_X_LOCK_SCROLL)
modifiers |= ECORE_EVENT_LOCK_SCROLL;

View File

@ -186,6 +186,7 @@ extern int ECORE_X_MODIFIER_SHIFT;
extern int ECORE_X_MODIFIER_CTRL;
extern int ECORE_X_MODIFIER_ALT;
extern int ECORE_X_MODIFIER_WIN;
extern int ECORE_X_MODIFIER_MODE;
extern int ECORE_X_LOCK_SCROLL;
extern int ECORE_X_LOCK_NUM;

View File

@ -575,8 +575,12 @@ _ecore_x_event_reverse_modifiers(unsigned int state)
if (state & ECORE_IMF_KEYBOARD_MODIFIER_SHIFT)
modifiers |= ShiftMask;
/**< "Win" (between "Ctrl" and "A */
/**< "Win" (between "Ctrl" and "Alt") is pressed */
if (state & ECORE_IMF_KEYBOARD_MODIFIER_WIN)
modifiers |= Mod4Mask;
/**< "AltGr" is pressed */
if (state & ECORE_IMF_KEYBOARD_MODIFIER_MODE)
modifiers |= Mod5Mask;
return modifiers;