ecore_win32: fix key events on Windows.

@fix

Signed-off-by: Cedric BAIL <c.bail@partner.samsung.com>
This commit is contained in:
Vincent Torri 2014-06-21 18:02:19 +02:00 committed by Cedric BAIL
parent 836c0535f0
commit 113d794973
6 changed files with 6164 additions and 932 deletions

View File

@ -22,7 +22,8 @@ lib/ecore_win32/ecore_win32_private.h \
lib/ecore_win32/ecore_win32_dnd_enumformatetc.h \
lib/ecore_win32/ecore_win32_dnd_data_object.h \
lib/ecore_win32/ecore_win32_dnd_drop_source.h \
lib/ecore_win32/ecore_win32_dnd_drop_target.h
lib/ecore_win32/ecore_win32_dnd_drop_target.h \
ecore_win32_keysym_table.h
lib_ecore_win32_libecore_win32_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl @ECORE_WIN32_CFLAGS@
lib_ecore_win32_libecore_win32_la_LIBADD = @ECORE_WIN32_LIBS@

View File

@ -223,6 +223,7 @@ struct _Ecore_Win32_Event_Mouse_In
int x; /**< The x coordinate where the mouse leaved */
int y; /**< The y coordinate where the mouse entered */
unsigned long timestamp; /**< The time the event occurred */
unsigned int modifiers; /**< The keyboard modifiers */
};
/**
@ -235,6 +236,7 @@ struct _Ecore_Win32_Event_Mouse_Out
int x; /**< The x coordinate where the mouse leaved */
int y; /**< The y coordinate where the mouse leaved */
unsigned long timestamp; /**< The time the event occurred */
unsigned int modifiers; /**< The keyboard modifiers */
};
/**

View File

@ -76,76 +76,20 @@ _ecore_win32_window_procedure(HWND window,
coord = GetMessagePos();
data->x = GET_X_LPARAM(coord);
data->y = GET_Y_LPARAM(coord);
data->discard_ctrl = EINA_FALSE;
switch (data->message)
{
/* Keyboard input notifications */
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
if ((data->message == WM_KEYDOWN) &&
(data->window_param == VK_CONTROL) &&
((HIWORD(data->data_param) & KF_EXTENDED) == 0))
{
/* Ctrl left key is pressed */
BOOL res;
MSG next_msg;
/*
* we check if the next message
* - is a WM_KEYDOWN
* - has the same timestamp than the Ctrl one
* - is the key press of the right Alt key
*/
res = PeekMessage(&next_msg, data->window,
WM_KEYDOWN, WM_KEYDOWN,
PM_NOREMOVE);
if (res &&
(next_msg.wParam == VK_MENU) &&
(next_msg.time == data->timestamp) &&
(HIWORD(next_msg.lParam) & KF_EXTENDED))
{
INF("discard left Ctrl key press (sent by AltGr key press)");
data->discard_ctrl = EINA_TRUE;
}
}
_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);
INF("key down message");
_ecore_win32_event_handle_key_press(data);
return 0;
/* case WM_CHAR: */
/* case WM_SYSCHAR: */
case WM_KEYUP:
case WM_SYSKEYUP:
INF("keyup message");
if ((data->window_param == VK_CONTROL) &&
((HIWORD(data->data_param) & KF_EXTENDED) == 0))
{
/* Ctrl left key is pressed */
BOOL res;
MSG next_msg;
/*
* we check if the next message
* - is a WM_KEYUP or WM_SYSKEYUP
* - has the same timestamp than the Ctrl one
* - is the key release of the right Alt key
*/
res = PeekMessage(&next_msg, data->window,
WM_KEYUP, WM_SYSKEYUP,
PM_NOREMOVE);
if (res &&
((next_msg.message == WM_KEYUP) ||
(next_msg.message == WM_SYSKEYUP)) &&
(next_msg.wParam == VK_MENU) &&
(next_msg.time == data->timestamp) &&
(HIWORD(next_msg.lParam) & KF_EXTENDED))
{
INF("discard left Ctrl key release (sent by AltGr key release)");
data->discard_ctrl = EINA_TRUE;
}
}
INF("key up message");
_ecore_win32_event_handle_key_release(data);
return 0;
case WM_SETFOCUS:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -57,7 +57,6 @@ struct _Ecore_Win32_Callback_Data
unsigned long timestamp;
int x;
int y;
Eina_Bool discard_ctrl;
};
struct _Ecore_Win32_Window
@ -135,7 +134,7 @@ extern unsigned long _ecore_win32_event_last_time;
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);
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);