Dear All, Hello~
There are some issues as following
1) Key combination like Ctrl + a, Alt +a does not work properly.
2) event->keyname: should be lower case
3) event->modifiers: should be handled -> This is used on the Entry of
elementary_test. EX: Ctrl+A should work for selecting all
4) ecore_win32_event_char_get(); is not called when key is released,
So, the event ECORE_EVENT_KEY_UP with character does not occur.
5) "Tab" key does not work properly on the Entry of elementary_test.
6) Improper Null check in _ecore_win32_event_char_get(); It returns 1
always.. Maybe there is a better solution than my patch.
7) VK_PROCESSKY was not handled. When you click button the VK_PROCESSKY comes.
I think attached patch would be resolved these issues.
Please check the patch and give any feedbacks. Thanks
Sincerely,
Shinwoo Kim.
Index: src/lib/ecore_win32/ecore_win32_private.h
===================================================================
--- src/lib/ecore_win32/ecore_win32_private.h (revision 65535)
+++ src/lib/ecore_win32/ecore_win32_private.h (working copy)
@@ -135,7 +135,7 @@ extern Ecore_Win32_Window *_ecore_win32_event_last
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_release(Ecore_Win32_Callback_Data *msg, int button);
void _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg);
Index: src/lib/ecore_win32/ecore_win32.c
===================================================================
--- src/lib/ecore_win32/ecore_win32.c (revision 65535)
+++ src/lib/ecore_win32/ecore_win32.c (working copy)
@@ -88,13 +88,14 @@ _ecore_win32_window_procedure(HWND window,
_ecore_win32_event_handle_key_press(data, 1);
return 0;
case WM_CHAR:
+ case WM_SYSCHAR:
INF("char message");
_ecore_win32_event_handle_key_press(data, 0);
return 0;
case WM_KEYUP:
case WM_SYSKEYUP:
INF("keyup message");
- _ecore_win32_event_handle_key_release(data, 1);
+ _ecore_win32_event_handle_key_release(data);
return 0;
case WM_SETFOCUS:
INF("setfocus message");
Index: src/lib/ecore_win32/ecore_win32_event.c
===================================================================
--- src/lib/ecore_win32/ecore_win32_event.c (revision 65535)
+++ src/lib/ecore_win32/ecore_win32_event.c (working copy)
@@ -4,6 +4,7 @@
#include <stdlib.h>
#include <stdio.h> /* for printf */
+#include <ctype.h> /* for tolower */
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
@@ -107,12 +108,19 @@ _ecore_win32_event_handle_key_press(Ecore_Win32_Ca
_ecore_win32_event_last_time = e->timestamp;
+ SHORT res;
+ res = GetKeyState(VK_SHIFT);
+ if (res & 0x8000) e->modifiers = 1;
+ res = GetKeyState(VK_CONTROL);
+ if (res & 0x8000) e->modifiers = 2;
+ res = GetKeyState(VK_MENU);
+ if (res & 0x8000) e->modifiers = 4;
+
ecore_event_add(ECORE_EVENT_KEY_DOWN, e, _ecore_win32_event_free_key_down, NULL);
}
void
-_ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg,
- int is_keystroke)
+_ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg)
{
Ecore_Event_Key *e;
@@ -121,22 +129,14 @@ void
e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
if (!e) return;
- if (is_keystroke)
+ if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
+ msg->data_param & 0x01000000,
+ EINA_FALSE,
+ (char **)&e->keyname,
+ (char **)&e->key,
+ (char **)&e->string))
{
- if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
- msg->data_param & 0x01000000,
- EINA_FALSE,
- (char **)&e->keyname,
- (char **)&e->key,
- (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->key,
(char **)&e->string))
@@ -157,7 +157,16 @@ void
_ecore_win32_event_last_time = e->timestamp;
+ SHORT res;
+ res = GetKeyState(VK_SHIFT);
+ if (res & 0x8000) e->modifiers = 1;
+ res = GetKeyState(VK_CONTROL);
+ if (res & 0x8000) e->modifiers = 2;
+ res = GetKeyState(VK_MENU);
+ if (res & 0x8000) e->modifiers = 4;
+
ecore_event_add(ECORE_EVENT_KEY_UP, e, _ecore_win32_event_free_key_up, NULL);
+
}
void
@@ -658,9 +667,9 @@ _ecore_win32_event_keystroke_get(int key,
char **keysymbol,
char **keycompose)
{
- char *kn;
- char *ks;
- char *kc;
+ char *kn = NULL;
+ char *ks = NULL;
+ char *kc = NULL;
*keyname = NULL;
*keysymbol = NULL;
@@ -1115,6 +1124,8 @@ _ecore_win32_event_char_get(int key,
switch (key)
{
+ case VK_PROCESSKEY:
+ break;
case VK_BACK:
strncpy(kn, "BackSpace", 32);
strncpy(ks, "BackSpace", 32);
@@ -1122,7 +1133,7 @@ _ecore_win32_event_char_get(int key,
break;
case VK_TAB:
strncpy(kn, "Tab", 32);
- strncpy(ks, "ISO_Left_Tab", 32);
+ strncpy(ks, "Tab", 32);
strncpy(kc, "Tab", 32);
break;
case 0x0a:
@@ -1148,8 +1159,10 @@ _ecore_win32_event_char_get(int key,
break;
default:
/* displayable characters */
+ // check control character
+ if ((key > 0) && (key < 27) && (GetKeyState(VK_CONTROL) & 0x8000)) key += 96;
printf (" * key : %d\n", key);
- kn[0] = (TCHAR)key;
+ kn[0] = (TCHAR)tolower(key);
kn[1] = '\0';
ks[0] = (TCHAR)key;
ks[1] = '\0';
@@ -1158,16 +1171,16 @@ _ecore_win32_event_char_get(int key,
break;
}
*keyname = strdup(kn);
- if (!*keyname) return 0;
+ if (!strcmp(*keyname, "")) return 0;
*keysymbol = strdup(ks);
- if (!*keysymbol)
+ if (!strcmp(*keysymbol, ""))
{
free(*keyname);
*keyname = NULL;
return 0;
}
*keycompose = strdup(kc);
- if (!*keycompose)
+ if (!strcmp(*keycompose, ""))
{
free(*keyname);
free(*keysymbol);
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure
contains a definitive record of customers, application performance,
security threats, fraudulent activity, and more. Splunk takes this
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel