gdkevents-win32.c: Split out keyboard and IME events
...from gdk_event_translate(), as that function is getting too big and makes it harder to track things.
This commit is contained in:
@@ -1718,103 +1718,23 @@ _gdk_win32_surface_fill_min_max_info (GdkSurface *surface,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GDK_ANY_BUTTON_MASK (GDK_BUTTON1_MASK | \
|
|
||||||
GDK_BUTTON2_MASK | \
|
|
||||||
GDK_BUTTON3_MASK | \
|
|
||||||
GDK_BUTTON4_MASK | \
|
|
||||||
GDK_BUTTON5_MASK)
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gdk_event_translate (MSG *msg,
|
handle_keyboard_event (GdkDisplay *display,
|
||||||
int *ret_valp)
|
GdkSurface *surface,
|
||||||
|
MSG *msg,
|
||||||
|
int *ret_valp,
|
||||||
|
gboolean *goto_done)
|
||||||
{
|
{
|
||||||
RECT rect;
|
|
||||||
POINT point;
|
|
||||||
MINMAXINFO *mmi;
|
|
||||||
HWND hwnd;
|
|
||||||
HIMC himc;
|
|
||||||
WINDOWPOS *hwndpos;
|
|
||||||
gboolean ignore_leave;
|
|
||||||
|
|
||||||
GdkEvent *event;
|
GdkEvent *event;
|
||||||
|
GdkWin32Display *win32_display = GDK_WIN32_DISPLAY (display);
|
||||||
GdkDisplay *display;
|
GdkWin32Keymap *win32_keymap;
|
||||||
GdkSurface *surface = NULL;
|
GdkTranslatedKey translated;
|
||||||
GdkWin32Surface *impl;
|
|
||||||
GdkWin32Display *win32_display;
|
|
||||||
|
|
||||||
GdkSurface *new_surface;
|
|
||||||
|
|
||||||
GdkDeviceGrabInfo *keyboard_grab = NULL;
|
|
||||||
GdkDeviceGrabInfo *pointer_grab = NULL;
|
|
||||||
GdkSurface *grab_surface = NULL;
|
|
||||||
|
|
||||||
crossing_cb_t crossing_cb = NULL;
|
|
||||||
|
|
||||||
int button;
|
|
||||||
|
|
||||||
gboolean return_val = FALSE;
|
gboolean return_val = FALSE;
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
display = gdk_display_get_default ();
|
|
||||||
win32_display = GDK_WIN32_DISPLAY (display);
|
|
||||||
|
|
||||||
if (win32_display->filters)
|
|
||||||
{
|
|
||||||
/* Apply display filters */
|
|
||||||
GdkWin32MessageFilterReturn result = apply_message_filters (display, msg, ret_valp, &win32_display->filters);
|
|
||||||
|
|
||||||
if (result == GDK_WIN32_MESSAGE_FILTER_REMOVE)
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
surface = gdk_win32_display_handle_table_lookup_ (display, msg->hwnd);
|
|
||||||
|
|
||||||
if (surface == NULL)
|
|
||||||
{
|
|
||||||
/* XXX Handle WM_QUIT here ? */
|
|
||||||
if (msg->message == WM_QUIT)
|
|
||||||
{
|
|
||||||
GDK_NOTE (EVENTS, g_print (" %d", (int) msg->wParam));
|
|
||||||
exit (msg->wParam);
|
|
||||||
}
|
|
||||||
else if (msg->message == WM_CREATE)
|
|
||||||
{
|
|
||||||
surface = (GdkSurface*) (((LPCREATESTRUCTW) msg->lParam)->lpCreateParams);
|
|
||||||
GDK_SURFACE_HWND (surface) = msg->hwnd;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GDK_NOTE (EVENTS, g_print (" (no GdkSurface)"));
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
keyboard_grab = _gdk_display_get_last_device_grab (display,
|
|
||||||
win32_display->device_manager->core_keyboard);
|
|
||||||
pointer_grab = _gdk_display_get_last_device_grab (display,
|
|
||||||
win32_display->device_manager->core_pointer);
|
|
||||||
|
|
||||||
g_object_ref (surface);
|
|
||||||
|
|
||||||
/* surface's refcount has now been increased, so code below should
|
|
||||||
* not just return from this function, but instead goto done (or
|
|
||||||
* break out of the big switch). To protect against forgetting this,
|
|
||||||
* #define return to a syntax error...
|
|
||||||
*/
|
|
||||||
#define return GOTO_DONE_INSTEAD
|
|
||||||
|
|
||||||
if (msg->message == win32_display->event_record->aerosnap_message)
|
|
||||||
_gdk_win32_surface_handle_aerosnap (surface,
|
|
||||||
(GdkWin32AeroSnapCombo) msg->wParam);
|
|
||||||
|
|
||||||
switch (msg->message)
|
switch (msg->message)
|
||||||
{
|
{
|
||||||
case WM_INPUTLANGCHANGE:
|
case WM_INPUTLANGCHANGE:
|
||||||
{
|
{
|
||||||
GdkWin32Keymap *win32_keymap;
|
|
||||||
GdkTranslatedKey translated;
|
|
||||||
HKL input_locale;
|
HKL input_locale;
|
||||||
|
|
||||||
win32_keymap = GDK_WIN32_KEYMAP (gdk_display_get_keymap (display));
|
win32_keymap = GDK_WIN32_KEYMAP (gdk_display_get_keymap (display));
|
||||||
@@ -1848,7 +1768,6 @@ gdk_event_translate (MSG *msg,
|
|||||||
_gdk_win32_append_event (event);
|
_gdk_win32_append_event (event);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_SYSKEYUP:
|
case WM_SYSKEYUP:
|
||||||
case WM_SYSKEYDOWN:
|
case WM_SYSKEYDOWN:
|
||||||
GDK_NOTE (EVENTS,
|
GDK_NOTE (EVENTS,
|
||||||
@@ -1865,32 +1784,23 @@ gdk_event_translate (MSG *msg,
|
|||||||
/* Let the system handle Alt-Tab, Alt-Space and Alt-F4 unless
|
/* Let the system handle Alt-Tab, Alt-Space and Alt-F4 unless
|
||||||
* the keyboard is grabbed.
|
* the keyboard is grabbed.
|
||||||
*/
|
*/
|
||||||
if (!keyboard_grab &&
|
if (!_gdk_display_get_last_device_grab (display, win32_display->device_manager->core_keyboard) &&
|
||||||
(msg->wParam == VK_TAB ||
|
(msg->wParam == VK_TAB ||
|
||||||
msg->wParam == VK_SPACE ||
|
msg->wParam == VK_SPACE ||
|
||||||
msg->wParam == VK_F4))
|
msg->wParam == VK_F4))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Jump to code in common with WM_KEYUP and WM_KEYDOWN */
|
/* Jump to code in common with WM_KEYUP and WM_KEYDOWN */
|
||||||
goto keyup_or_down;
|
G_GNUC_FALLTHROUGH;
|
||||||
|
|
||||||
case WM_KEYUP:
|
case WM_KEYUP:
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
GDK_NOTE (EVENTS,
|
|
||||||
g_print (" %s ch:%.02x %s",
|
|
||||||
_gdk_win32_key_to_string (msg->lParam),
|
|
||||||
(int) msg->wParam,
|
|
||||||
decode_key_lparam (msg->lParam)));
|
|
||||||
|
|
||||||
keyup_or_down:
|
|
||||||
{
|
{
|
||||||
GdkWin32Keymap *win32_keymap;
|
|
||||||
GdkModifierType state;
|
GdkModifierType state;
|
||||||
guint keyval;
|
guint keyval;
|
||||||
guint16 keycode;
|
guint16 keycode;
|
||||||
guint8 group;
|
guint8 group;
|
||||||
gboolean is_modifier;
|
gboolean is_modifier;
|
||||||
GdkTranslatedKey translated;
|
|
||||||
GdkTranslatedKey no_lock;
|
GdkTranslatedKey no_lock;
|
||||||
BYTE key_state[256];
|
BYTE key_state[256];
|
||||||
GArray *translation;
|
GArray *translation;
|
||||||
@@ -1899,6 +1809,16 @@ gdk_event_translate (MSG *msg,
|
|||||||
int effective_group = 0;
|
int effective_group = 0;
|
||||||
GdkModifierType consumed = 0;
|
GdkModifierType consumed = 0;
|
||||||
char *composed = NULL;
|
char *composed = NULL;
|
||||||
|
GdkWin32Surface *impl;
|
||||||
|
|
||||||
|
if (msg->message == WM_KEYUP || msg->message == WM_KEYDOWN)
|
||||||
|
{
|
||||||
|
GDK_NOTE (EVENTS,
|
||||||
|
g_print (" %s ch:%.02x %s",
|
||||||
|
_gdk_win32_key_to_string (msg->lParam),
|
||||||
|
(int) msg->wParam,
|
||||||
|
decode_key_lparam (msg->lParam)));
|
||||||
|
}
|
||||||
|
|
||||||
/* Ignore key messages intended for the IME */
|
/* Ignore key messages intended for the IME */
|
||||||
if (msg->wParam == VK_PROCESSKEY || win32_display->event_record->in_ime_composition)
|
if (msg->wParam == VK_PROCESSKEY || win32_display->event_record->in_ime_composition)
|
||||||
@@ -1906,9 +1826,7 @@ gdk_event_translate (MSG *msg,
|
|||||||
|
|
||||||
/* Ignore autorepeats on modifiers */
|
/* Ignore autorepeats on modifiers */
|
||||||
if (msg->message == WM_KEYDOWN &&
|
if (msg->message == WM_KEYDOWN &&
|
||||||
(msg->wParam == VK_MENU ||
|
(msg->wParam == VK_MENU || msg->wParam == VK_CONTROL || msg->wParam == VK_SHIFT) &&
|
||||||
msg->wParam == VK_CONTROL ||
|
|
||||||
msg->wParam == VK_SHIFT) &&
|
|
||||||
((HIWORD(msg->lParam) & KF_REPEAT) >= 1))
|
((HIWORD(msg->lParam) & KF_REPEAT) >= 1))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2005,6 +1923,7 @@ gdk_event_translate (MSG *msg,
|
|||||||
if (msg->message == WM_KEYDOWN && msg->wParam == VK_SHIFT)
|
if (msg->message == WM_KEYDOWN && msg->wParam == VK_SHIFT)
|
||||||
{
|
{
|
||||||
int pressed_shift = msg->lParam & 0xffffff; /* mask shift modifier */
|
int pressed_shift = msg->lParam & 0xffffff; /* mask shift modifier */
|
||||||
|
|
||||||
if (win32_display->event_record->both_shift_pressed[0] == 0)
|
if (win32_display->event_record->both_shift_pressed[0] == 0)
|
||||||
win32_display->event_record->both_shift_pressed[0] = pressed_shift;
|
win32_display->event_record->both_shift_pressed[0] = pressed_shift;
|
||||||
else if (win32_display->event_record->both_shift_pressed[0] != pressed_shift)
|
else if (win32_display->event_record->both_shift_pressed[0] != pressed_shift)
|
||||||
@@ -2035,9 +1954,7 @@ gdk_event_translate (MSG *msg,
|
|||||||
if (msg->wParam == VK_MENU)
|
if (msg->wParam == VK_MENU)
|
||||||
state &= ~GDK_ALT_MASK;
|
state &= ~GDK_ALT_MASK;
|
||||||
|
|
||||||
event = gdk_key_event_new ((msg->message == WM_KEYDOWN || msg->message == WM_SYSKEYDOWN)
|
event = gdk_key_event_new ((msg->message == WM_KEYDOWN || msg->message == WM_SYSKEYDOWN) ? GDK_KEY_PRESS : GDK_KEY_RELEASE,
|
||||||
? GDK_KEY_PRESS
|
|
||||||
: GDK_KEY_RELEASE,
|
|
||||||
surface,
|
surface,
|
||||||
win32_display->device_manager->core_keyboard,
|
win32_display->device_manager->core_keyboard,
|
||||||
_gdk_win32_get_next_tick (msg->time),
|
_gdk_win32_get_next_tick (msg->time),
|
||||||
@@ -2060,7 +1977,7 @@ gdk_event_translate (MSG *msg,
|
|||||||
{
|
{
|
||||||
/* To prevent beeps, don't let DefWindowProcW() be called */
|
/* To prevent beeps, don't let DefWindowProcW() be called */
|
||||||
return_val = TRUE;
|
return_val = TRUE;
|
||||||
goto done;
|
*goto_done = TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2071,12 +1988,13 @@ gdk_event_translate (MSG *msg,
|
|||||||
case WM_IME_ENDCOMPOSITION:
|
case WM_IME_ENDCOMPOSITION:
|
||||||
win32_display->event_record->in_ime_composition = FALSE;
|
win32_display->event_record->in_ime_composition = FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_IME_COMPOSITION:
|
case WM_IME_COMPOSITION:
|
||||||
{
|
{
|
||||||
BYTE key_state[256];
|
BYTE key_state[256];
|
||||||
wchar_t wbuf[100];
|
wchar_t wbuf[100];
|
||||||
int ccount = 0;
|
int ccount = 0;
|
||||||
|
HIMC himc;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* On Win2k WM_IME_CHAR doesn't work correctly for non-Unicode
|
/* On Win2k WM_IME_CHAR doesn't work correctly for non-Unicode
|
||||||
* applications. Thus, handle WM_IME_COMPOSITION with
|
* applications. Thus, handle WM_IME_COMPOSITION with
|
||||||
@@ -2152,6 +2070,120 @@ gdk_event_translate (MSG *msg,
|
|||||||
return_val = TRUE;
|
return_val = TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
g_warning ("Maybe this was reached because this is not a keyboard-related event");
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return return_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define GDK_ANY_BUTTON_MASK (GDK_BUTTON1_MASK | \
|
||||||
|
GDK_BUTTON2_MASK | \
|
||||||
|
GDK_BUTTON3_MASK | \
|
||||||
|
GDK_BUTTON4_MASK | \
|
||||||
|
GDK_BUTTON5_MASK)
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gdk_event_translate (MSG *msg,
|
||||||
|
int *ret_valp)
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
POINT point;
|
||||||
|
MINMAXINFO *mmi;
|
||||||
|
HWND hwnd;
|
||||||
|
WINDOWPOS *hwndpos;
|
||||||
|
gboolean ignore_leave;
|
||||||
|
|
||||||
|
GdkEvent *event;
|
||||||
|
|
||||||
|
GdkDisplay *display;
|
||||||
|
GdkSurface *surface = NULL;
|
||||||
|
GdkWin32Surface *impl;
|
||||||
|
GdkWin32Display *win32_display;
|
||||||
|
|
||||||
|
GdkSurface *new_surface;
|
||||||
|
|
||||||
|
GdkDeviceGrabInfo *keyboard_grab = NULL;
|
||||||
|
GdkDeviceGrabInfo *pointer_grab = NULL;
|
||||||
|
GdkSurface *grab_surface = NULL;
|
||||||
|
|
||||||
|
crossing_cb_t crossing_cb = NULL;
|
||||||
|
|
||||||
|
int button;
|
||||||
|
|
||||||
|
gboolean return_val = FALSE;
|
||||||
|
gboolean goto_done = FALSE;
|
||||||
|
|
||||||
|
display = gdk_display_get_default ();
|
||||||
|
win32_display = GDK_WIN32_DISPLAY (display);
|
||||||
|
|
||||||
|
if (win32_display->filters)
|
||||||
|
{
|
||||||
|
/* Apply display filters */
|
||||||
|
GdkWin32MessageFilterReturn result = apply_message_filters (display, msg, ret_valp, &win32_display->filters);
|
||||||
|
|
||||||
|
if (result == GDK_WIN32_MESSAGE_FILTER_REMOVE)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
surface = gdk_win32_display_handle_table_lookup_ (display, msg->hwnd);
|
||||||
|
|
||||||
|
if (surface == NULL)
|
||||||
|
{
|
||||||
|
/* XXX Handle WM_QUIT here ? */
|
||||||
|
if (msg->message == WM_QUIT)
|
||||||
|
{
|
||||||
|
GDK_NOTE (EVENTS, g_print (" %d", (int) msg->wParam));
|
||||||
|
exit (msg->wParam);
|
||||||
|
}
|
||||||
|
else if (msg->message == WM_CREATE)
|
||||||
|
{
|
||||||
|
surface = (GdkSurface*) (((LPCREATESTRUCTW) msg->lParam)->lpCreateParams);
|
||||||
|
GDK_SURFACE_HWND (surface) = msg->hwnd;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GDK_NOTE (EVENTS, g_print (" (no GdkSurface)"));
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
keyboard_grab = _gdk_display_get_last_device_grab (display,
|
||||||
|
win32_display->device_manager->core_keyboard);
|
||||||
|
pointer_grab = _gdk_display_get_last_device_grab (display,
|
||||||
|
win32_display->device_manager->core_pointer);
|
||||||
|
|
||||||
|
g_object_ref (surface);
|
||||||
|
|
||||||
|
/* surface's refcount has now been increased, so code below should
|
||||||
|
* not just return from this function, but instead goto done (or
|
||||||
|
* break out of the big switch). To protect against forgetting this,
|
||||||
|
* #define return to a syntax error...
|
||||||
|
*/
|
||||||
|
#define return GOTO_DONE_INSTEAD
|
||||||
|
|
||||||
|
if (msg->message == win32_display->event_record->aerosnap_message)
|
||||||
|
_gdk_win32_surface_handle_aerosnap (surface,
|
||||||
|
(GdkWin32AeroSnapCombo) msg->wParam);
|
||||||
|
|
||||||
|
switch (msg->message)
|
||||||
|
{
|
||||||
|
/* keyboard inpout related events (including IME events) */
|
||||||
|
case WM_INPUTLANGCHANGE:
|
||||||
|
case WM_SYSKEYUP:
|
||||||
|
case WM_SYSKEYDOWN:
|
||||||
|
case WM_KEYUP:
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
case WM_SYSCHAR:
|
||||||
|
case WM_IME_STARTCOMPOSITION:
|
||||||
|
case WM_IME_ENDCOMPOSITION:
|
||||||
|
case WM_IME_COMPOSITION:
|
||||||
|
return_val = handle_keyboard_event (display, surface, msg, ret_valp, &goto_done);
|
||||||
|
if (goto_done)
|
||||||
|
goto done;
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
button = 1;
|
button = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user