Ecore_Win32: fix and improve keyboard management on Windows XP

* fix some event values
* Add the "Windows" key support
* manage modifiers for shift, ctrl, alt and windows keys

that support is not finished, there still several bugs.

SVN revision: 65613
This commit is contained in:
Vincent Torri 2011-11-27 12:03:56 +00:00
parent e3361fc062
commit cce78817f2
5 changed files with 136 additions and 79 deletions

View File

@ -346,3 +346,7 @@
2011-11-24 Rafael Antognolli 2011-11-24 Rafael Antognolli
* Add ecore_fb_input_device_window_set(). * Add ecore_fb_input_device_window_set().
2011-11-27 Vincent Torri
* Fix and improve key management on Windows XP

View File

@ -98,6 +98,7 @@ Improvements:
* ecore timer monotonic clock now supported on OSX * ecore timer monotonic clock now supported on OSX
* make ecore_con work on Windows * make ecore_con work on Windows
* improve resize/move on Windows * improve resize/move on Windows
* improve keyboard management on Windows XP
* refactored _ecore_main_loop_iterate_internal * refactored _ecore_main_loop_iterate_internal
* better safety with ecore_evas_ecore_evas_get * better safety with ecore_evas_ecore_evas_get
* ecore-evas produces more errors on stderr when errors happen now * ecore-evas produces more errors on stderr when errors happen now

View File

@ -88,13 +88,14 @@ _ecore_win32_window_procedure(HWND window,
_ecore_win32_event_handle_key_press(data, 1); _ecore_win32_event_handle_key_press(data, 1);
return 0; return 0;
case WM_CHAR: case WM_CHAR:
case WM_SYSCHAR:
INF("char message"); INF("char message");
_ecore_win32_event_handle_key_press(data, 0); _ecore_win32_event_handle_key_press(data, 0);
return 0; return 0;
case WM_KEYUP: case WM_KEYUP:
case WM_SYSKEYUP: case WM_SYSKEYUP:
INF("keyup message"); INF("keyup message");
_ecore_win32_event_handle_key_release(data, 1); _ecore_win32_event_handle_key_release(data);
return 0; return 0;
case WM_SETFOCUS: case WM_SETFOCUS:
INF("setfocus message"); INF("setfocus message");

View File

@ -45,12 +45,13 @@ static void _ecore_win32_event_free_key_down(void *data,
static void _ecore_win32_event_free_key_up(void *data, static void _ecore_win32_event_free_key_up(void *data,
void *ev); void *ev);
static int _ecore_win32_event_keystroke_get(int key, static int _ecore_win32_event_keystroke_get(int key,
int is_extended, int is_extended,
Eina_Bool is_down, Eina_Bool is_down,
char **keyname, char **keyname,
char **keysymbol, char **keysymbol,
char **keycompose); char **keycompose,
unsigned int *modifiers);
static int _ecore_win32_event_char_get(int key, static int _ecore_win32_event_char_get(int key,
char **keyname, char **keyname,
@ -73,12 +74,13 @@ _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg,
if (is_keystroke) if (is_keystroke)
{ {
if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param), if (!_ecore_win32_event_keystroke_get(msg->window_param,
msg->data_param & 0x01000000, msg->data_param & 0x01000000,
EINA_TRUE, EINA_TRUE,
(char **)&e->keyname, (char **)&e->keyname,
(char **)&e->key, (char **)&e->key,
(char **)&e->string)) (char **)&e->string,
&e->modifiers))
{ {
free(e); free(e);
return; return;
@ -111,8 +113,7 @@ _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg,
} }
void void
_ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg, _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg)
int is_keystroke)
{ {
Ecore_Event_Key *e; Ecore_Event_Key *e;
@ -121,20 +122,13 @@ _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg,
e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key)); e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
if (!e) return; if (!e) return;
if (is_keystroke) if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
{ msg->data_param & 0x01000000,
if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param), EINA_FALSE,
msg->data_param & 0x01000000, (char **)&e->keyname,
EINA_FALSE, (char **)&e->key,
(char **)&e->keyname, (char **)&e->string,
(char **)&e->key, &e->modifiers))
(char **)&e->string))
{
free(e);
return;
}
}
else
{ {
if (!_ecore_win32_event_char_get(LOWORD(msg->window_param), if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
(char **)&e->keyname, (char **)&e->keyname,
@ -651,23 +645,24 @@ _ecore_win32_event_free_key_up(void *data __UNUSED__,
} }
static int static int
_ecore_win32_event_keystroke_get(int key, _ecore_win32_event_keystroke_get(int key,
int is_extended, int is_extended,
Eina_Bool is_down, Eina_Bool is_down,
char **keyname, char **keyname,
char **keysymbol, char **keysymbol,
char **keycompose) char **keycompose,
unsigned int *modifiers)
{ {
char *kn; char *kn = NULL;
char *ks; char *ks = NULL;
char *kc; char *kc = NULL;
*keyname = NULL; *keyname = NULL;
*keysymbol = NULL; *keysymbol = NULL;
*keycompose = NULL; *keycompose = NULL;
printf("vk key %x\n", key); printf("vk key 0x%x\n", key);
switch (key) switch (key)
{ {
/* Keystroke */ /* Keystroke */
@ -676,7 +671,7 @@ _ecore_win32_event_keystroke_get(int key,
{ {
kn = "Prior"; kn = "Prior";
ks = "Prior"; ks = "Prior";
kc = "Prior"; kc = NULL;
} }
else else
{ {
@ -690,7 +685,7 @@ _ecore_win32_event_keystroke_get(int key,
{ {
kn = "Next"; kn = "Next";
ks = "Next"; ks = "Next";
kc = "Next"; kc = NULL;
} }
else else
{ {
@ -704,7 +699,7 @@ _ecore_win32_event_keystroke_get(int key,
{ {
kn = "End"; kn = "End";
ks = "End"; ks = "End";
kc = "End"; kc = NULL;
} }
else else
{ {
@ -718,7 +713,7 @@ _ecore_win32_event_keystroke_get(int key,
{ {
kn = "Home"; kn = "Home";
ks = "Home"; ks = "Home";
kc = "Home"; kc = NULL;
} }
else else
{ {
@ -732,7 +727,7 @@ _ecore_win32_event_keystroke_get(int key,
{ {
kn = "Left"; kn = "Left";
ks = "Left"; ks = "Left";
kc = "Left"; kc = NULL;
} }
else else
{ {
@ -746,7 +741,7 @@ _ecore_win32_event_keystroke_get(int key,
{ {
kn = "Up"; kn = "Up";
ks = "Up"; ks = "Up";
kc = "Up"; kc = NULL;
} }
else else
{ {
@ -756,11 +751,12 @@ _ecore_win32_event_keystroke_get(int key,
} }
break; break;
case VK_RIGHT: case VK_RIGHT:
printf("vk val 0x%x (right)\n", VK_RIGHT);
if (is_extended) if (is_extended)
{ {
kn = "Right"; kn = "Right";
ks = "Right"; ks = "Right";
kc = "Right"; kc = NULL;
} }
else else
{ {
@ -774,7 +770,7 @@ _ecore_win32_event_keystroke_get(int key,
{ {
kn = "Down"; kn = "Down";
ks = "Down"; ks = "Down";
kc = "Down"; kc = NULL;
} }
else else
{ {
@ -788,7 +784,7 @@ _ecore_win32_event_keystroke_get(int key,
{ {
kn = "Insert"; kn = "Insert";
ks = "Insert"; ks = "Insert";
kc = "Insert"; kc = NULL;
} }
else else
{ {
@ -802,6 +798,7 @@ _ecore_win32_event_keystroke_get(int key,
{ {
kn = "Delete"; kn = "Delete";
ks = "Delete"; ks = "Delete";
/* FIXME: kc is wrong, here */
kc = "Delete"; kc = "Delete";
} }
else else
@ -833,6 +830,7 @@ _ecore_win32_event_keystroke_get(int key,
ks = "Shift_R"; ks = "Shift_R";
kc = ""; kc = "";
} }
*modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
} }
else /* is_up */ else /* is_up */
{ {
@ -854,6 +852,7 @@ _ecore_win32_event_keystroke_get(int key,
kc = ""; kc = "";
_ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RSHIFT; _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RSHIFT;
} }
*modifiers &= ~ECORE_EVENT_MODIFIER_SHIFT;
} }
break; break;
} }
@ -881,6 +880,7 @@ _ecore_win32_event_keystroke_get(int key,
kc = ""; kc = "";
break; break;
} }
*modifiers |= ECORE_EVENT_MODIFIER_CTRL;
} }
else /* is_up */ else /* is_up */
{ {
@ -904,6 +904,7 @@ _ecore_win32_event_keystroke_get(int key,
_ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RCONTROL; _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RCONTROL;
break; break;
} }
*modifiers &= ~ECORE_EVENT_MODIFIER_CTRL;
} }
break; break;
} }
@ -929,6 +930,7 @@ _ecore_win32_event_keystroke_get(int key,
ks = "Alt_R"; ks = "Alt_R";
kc = ""; kc = "";
} }
*modifiers |= ECORE_EVENT_MODIFIER_ALT;
} }
else /* is_up */ else /* is_up */
{ {
@ -950,6 +952,43 @@ _ecore_win32_event_keystroke_get(int key,
kc = ""; kc = "";
_ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RMENU; _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RMENU;
} }
*modifiers &= ~ECORE_EVENT_MODIFIER_ALT;
}
break;
}
case VK_LWIN:
{
if (is_down)
{
kn = "Super_L";
ks = "Super_L";
kc = "";
*modifiers |= ECORE_EVENT_MODIFIER_WIN;
}
else /* is_up */
{
kn = "Super_L";
ks = "Super_L";
kc = "";
*modifiers &= ~ECORE_EVENT_MODIFIER_WIN;
}
break;
}
case VK_RWIN:
{
if (is_down)
{
kn = "Super_R";
ks = "Super_R";
kc = "";
*modifiers |= ECORE_EVENT_MODIFIER_WIN;
}
else /* is_up */
{
kn = "Super_R";
ks = "Super_R";
kc = "";
*modifiers &= ~ECORE_EVENT_MODIFIER_WIN;
} }
break; break;
} }
@ -1077,6 +1116,8 @@ _ecore_win32_event_keystroke_get(int key,
/* other non keystroke characters */ /* other non keystroke characters */
return 0; return 0;
} }
printf("sortie...\n");
*keyname = strdup(kn); *keyname = strdup(kn);
if (!*keyname) return 0; if (!*keyname) return 0;
*keysymbol = strdup(ks); *keysymbol = strdup(ks);
@ -1086,15 +1127,21 @@ _ecore_win32_event_keystroke_get(int key,
*keyname = NULL; *keyname = NULL;
return 0; return 0;
} }
*keycompose = strdup(kc); if (!kc)
if (!*keycompose) *keycompose = NULL;
else
{ {
free(*keyname); *keycompose = strdup(kc);
free(*keysymbol); if (!*keycompose)
*keyname = NULL; {
*keysymbol = NULL; free(*keyname);
return 0; free(*keysymbol);
*keyname = NULL;
*keysymbol = NULL;
return 0;
}
} }
printf("sortie 2 ...\n");
return 1; return 1;
} }
@ -1105,56 +1152,60 @@ _ecore_win32_event_char_get(int key,
char **keysymbol, char **keysymbol,
char **keycompose) char **keycompose)
{ {
char kn[32]; char *kn = NULL;
char ks[32]; char *ks = NULL;
char kc[32]; char *kc = NULL;
char buf[2];
*keyname = NULL; *keyname = NULL;
*keysymbol = NULL; *keysymbol = NULL;
*keycompose = NULL; *keycompose = NULL;
printf("char key 0x%x\n", key);
switch (key) switch (key)
{ {
case VK_PROCESSKEY:
break;
case VK_BACK: case VK_BACK:
strncpy(kn, "BackSpace", 32); kn = "BackSpace";
strncpy(ks, "BackSpace", 32); ks = "BackSpace";
strncpy(kc, "BackSpace", 32); kc = "\b";
break; break;
case VK_TAB: case VK_TAB:
strncpy(kn, "Tab", 32); kn = "Tab";
strncpy(ks, "ISO_Left_Tab", 32); ks = "Tab";
strncpy(kc, "Tab", 32); kc = "\t";
break; break;
case 0x0a: case 0x0a:
/* Line feed (Shift + Enter) */ /* Line feed (Shift + Enter) */
strncpy(kn, "LineFeed", 32); kn = "LineFeed";
strncpy(ks, "LineFeed", 32); ks = "LineFeed";
strncpy(kc, "LineFeed", 32); kc = "LineFeed";
break; break;
case VK_RETURN: case VK_RETURN:
strncpy(kn, "Return", 32); kn = "Return";
strncpy(ks, "Return", 32); ks = "Return";
strncpy(kc, "Return", 32); kc = "\n";
break; break;
case VK_ESCAPE: case VK_ESCAPE:
strncpy(kn, "Escape", 32); kn = "Escape";
strncpy(ks, "Escape", 32); ks = "Escape";
strncpy(kc, "Escape", 32); kc = "\e";
break; break;
case VK_SPACE: case VK_SPACE:
strncpy(kn, "space", 32); kn = "space";
strncpy(ks, "space", 32); ks = "space";
strncpy(kc, " ", 32); kc = " ";
break; break;
default: default:
/* displayable characters */ /* displayable characters */
printf (" * key : %d\n", key); printf (" * key : %d\n", key);
kn[0] = (TCHAR)key; buf[0] = key;
kn[1] = '\0'; buf[1] = '\0';
ks[0] = (TCHAR)key; kn = buf;
ks[1] = '\0'; ks = buf;
kc[0] = (TCHAR)key; kc = buf;
kc[1] = '\0';
break; break;
} }
*keyname = strdup(kn); *keyname = strdup(kn);

View File

@ -135,7 +135,7 @@ extern Ecore_Win32_Window *_ecore_win32_event_last_window;
void _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg, int is_keystroke); void _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg, int is_keystroke);
void _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg, int is_keystroke); void _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg);
void _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg, int button); void _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg, int button);
void _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg, int button); void _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg, int button);
void _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg); void _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg);