forked from enlightenment/efl
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:
parent
e3361fc062
commit
cce78817f2
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue