Fix for #137551, by Robert Ögren:
2004-11-11 Tor Lillqvist <tml@iki.fi> Fix for #137551, by Robert Ögren: * gdk/win32/gdkevents-win32.c (generate_focus_event): New function. (gdk_keyboard_grab, gdk_keyboard_ungrab): Generate focus change events. (gdk_event_translate): Check for keyboard grabs and not pointer grabs when handling WM_{SET,KILL}FOCUS. Use generate_focus_event().
This commit is contained in:
committed by
Tor Lillqvist
parent
d1a02aaa34
commit
430a02d854
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
2004-11-11 Tor Lillqvist <tml@iki.fi>
|
||||||
|
|
||||||
|
Fix for #137551, by Robert Ögren:
|
||||||
|
|
||||||
|
* gdk/win32/gdkevents-win32.c (generate_focus_event): New function.
|
||||||
|
|
||||||
|
(gdk_keyboard_grab, gdk_keyboard_ungrab): Generate focus change
|
||||||
|
events.
|
||||||
|
|
||||||
|
(gdk_event_translate): Check for keyboard grabs and not pointer
|
||||||
|
grabs when handling WM_{SET,KILL}FOCUS. Use generate_focus_event().
|
||||||
|
|
||||||
2004-11-11 Matthias Clasen <mclasen@redhat.com>
|
2004-11-11 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkuimanager.c (update_node): Remove two more places
|
* gtk/gtkuimanager.c (update_node): Remove two more places
|
||||||
|
|||||||
@ -1,3 +1,15 @@
|
|||||||
|
2004-11-11 Tor Lillqvist <tml@iki.fi>
|
||||||
|
|
||||||
|
Fix for #137551, by Robert Ögren:
|
||||||
|
|
||||||
|
* gdk/win32/gdkevents-win32.c (generate_focus_event): New function.
|
||||||
|
|
||||||
|
(gdk_keyboard_grab, gdk_keyboard_ungrab): Generate focus change
|
||||||
|
events.
|
||||||
|
|
||||||
|
(gdk_event_translate): Check for keyboard grabs and not pointer
|
||||||
|
grabs when handling WM_{SET,KILL}FOCUS. Use generate_focus_event().
|
||||||
|
|
||||||
2004-11-11 Matthias Clasen <mclasen@redhat.com>
|
2004-11-11 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkuimanager.c (update_node): Remove two more places
|
* gtk/gtkuimanager.c (update_node): Remove two more places
|
||||||
|
|||||||
@ -1,3 +1,15 @@
|
|||||||
|
2004-11-11 Tor Lillqvist <tml@iki.fi>
|
||||||
|
|
||||||
|
Fix for #137551, by Robert Ögren:
|
||||||
|
|
||||||
|
* gdk/win32/gdkevents-win32.c (generate_focus_event): New function.
|
||||||
|
|
||||||
|
(gdk_keyboard_grab, gdk_keyboard_ungrab): Generate focus change
|
||||||
|
events.
|
||||||
|
|
||||||
|
(gdk_event_translate): Check for keyboard grabs and not pointer
|
||||||
|
grabs when handling WM_{SET,KILL}FOCUS. Use generate_focus_event().
|
||||||
|
|
||||||
2004-11-11 Matthias Clasen <mclasen@redhat.com>
|
2004-11-11 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkuimanager.c (update_node): Remove two more places
|
* gtk/gtkuimanager.c (update_node): Remove two more places
|
||||||
|
|||||||
@ -1,3 +1,15 @@
|
|||||||
|
2004-11-11 Tor Lillqvist <tml@iki.fi>
|
||||||
|
|
||||||
|
Fix for #137551, by Robert Ögren:
|
||||||
|
|
||||||
|
* gdk/win32/gdkevents-win32.c (generate_focus_event): New function.
|
||||||
|
|
||||||
|
(gdk_keyboard_grab, gdk_keyboard_ungrab): Generate focus change
|
||||||
|
events.
|
||||||
|
|
||||||
|
(gdk_event_translate): Check for keyboard grabs and not pointer
|
||||||
|
grabs when handling WM_{SET,KILL}FOCUS. Use generate_focus_event().
|
||||||
|
|
||||||
2004-11-11 Matthias Clasen <mclasen@redhat.com>
|
2004-11-11 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkuimanager.c (update_node): Remove two more places
|
* gtk/gtkuimanager.c (update_node): Remove two more places
|
||||||
|
|||||||
@ -112,6 +112,9 @@ static gboolean gdk_event_dispatch (GSource *source,
|
|||||||
GSourceFunc callback,
|
GSourceFunc callback,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
|
static void append_event (GdkDisplay *display,
|
||||||
|
GdkEvent *event);
|
||||||
|
|
||||||
/* Private variable declarations
|
/* Private variable declarations
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -230,6 +233,19 @@ _gdk_win32_get_next_tick (gulong suggested_tick)
|
|||||||
return cur_tick = suggested_tick;
|
return cur_tick = suggested_tick;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
generate_focus_event (GdkWindow *window,
|
||||||
|
gboolean in)
|
||||||
|
{
|
||||||
|
GdkEvent *event;
|
||||||
|
|
||||||
|
event = gdk_event_new (GDK_FOCUS_CHANGE);
|
||||||
|
event->focus_change.window = window;
|
||||||
|
event->focus_change.in = in;
|
||||||
|
|
||||||
|
append_event (gdk_drawable_get_display (window), event);
|
||||||
|
}
|
||||||
|
|
||||||
static LRESULT
|
static LRESULT
|
||||||
inner_window_procedure (HWND hwnd,
|
inner_window_procedure (HWND hwnd,
|
||||||
UINT message,
|
UINT message,
|
||||||
@ -716,6 +732,8 @@ gdk_keyboard_grab (GdkWindow *window,
|
|||||||
gboolean owner_events,
|
gboolean owner_events,
|
||||||
guint32 time)
|
guint32 time)
|
||||||
{
|
{
|
||||||
|
GdkWindow *real_focus_window, *grab_focus_window;
|
||||||
|
|
||||||
gint return_val;
|
gint return_val;
|
||||||
|
|
||||||
g_return_val_if_fail (window != NULL, 0);
|
g_return_val_if_fail (window != NULL, 0);
|
||||||
@ -733,8 +751,32 @@ gdk_keyboard_grab (GdkWindow *window,
|
|||||||
return_val = GDK_GRAB_ALREADY_GRABBED;
|
return_val = GDK_GRAB_ALREADY_GRABBED;
|
||||||
|
|
||||||
if (return_val == GDK_GRAB_SUCCESS)
|
if (return_val == GDK_GRAB_SUCCESS)
|
||||||
|
{
|
||||||
k_grab_window = window;
|
k_grab_window = window;
|
||||||
|
|
||||||
|
if (!k_grab_owner_events)
|
||||||
|
{
|
||||||
|
real_focus_window = gdk_win32_handle_table_lookup ((GdkNativeWindow) GetFocus ());
|
||||||
|
if (real_focus_window)
|
||||||
|
real_focus_window = gdk_window_get_toplevel (real_focus_window);
|
||||||
|
grab_focus_window = gdk_window_get_toplevel (k_grab_window);
|
||||||
|
if (real_focus_window != grab_focus_window)
|
||||||
|
{
|
||||||
|
/* Generate events for focus change from the window that really
|
||||||
|
* has focus to the grabber.
|
||||||
|
*/
|
||||||
|
if (real_focus_window && !GDK_WINDOW_DESTROYED (real_focus_window)
|
||||||
|
&& (((GdkWindowObject *) real_focus_window)->event_mask
|
||||||
|
& GDK_FOCUS_CHANGE_MASK))
|
||||||
|
generate_focus_event (real_focus_window, FALSE);
|
||||||
|
|
||||||
|
if (((GdkWindowObject *) grab_focus_window)->event_mask
|
||||||
|
& GDK_FOCUS_CHANGE_MASK)
|
||||||
|
generate_focus_event (grab_focus_window, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return return_val;
|
return return_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,10 +784,39 @@ void
|
|||||||
gdk_display_keyboard_ungrab (GdkDisplay *display,
|
gdk_display_keyboard_ungrab (GdkDisplay *display,
|
||||||
guint32 time)
|
guint32 time)
|
||||||
{
|
{
|
||||||
|
GdkWindow *real_focus_window, *grab_focus_window;
|
||||||
|
|
||||||
g_return_if_fail (display == gdk_display_get_default ());
|
g_return_if_fail (display == gdk_display_get_default ());
|
||||||
|
|
||||||
GDK_NOTE (EVENTS, g_print ("gdk_keyboard_ungrab\n"));
|
GDK_NOTE (EVENTS, g_print ("gdk_keyboard_ungrab\n"));
|
||||||
|
|
||||||
|
if (k_grab_window && !k_grab_owner_events)
|
||||||
|
{
|
||||||
|
real_focus_window = gdk_win32_handle_table_lookup ((GdkNativeWindow) GetFocus ());
|
||||||
|
if (real_focus_window)
|
||||||
|
real_focus_window = gdk_window_get_toplevel (real_focus_window);
|
||||||
|
if (!GDK_WINDOW_DESTROYED (k_grab_window))
|
||||||
|
grab_focus_window = gdk_window_get_toplevel (k_grab_window);
|
||||||
|
else
|
||||||
|
grab_focus_window = NULL;
|
||||||
|
if (real_focus_window != grab_focus_window)
|
||||||
|
{
|
||||||
|
/* Generate events for focus change from grabber to the window that
|
||||||
|
* really has focus. Important for example if a new window is created
|
||||||
|
* while focus is grabbed.
|
||||||
|
*/
|
||||||
|
if (grab_focus_window
|
||||||
|
&& (((GdkWindowObject *) grab_focus_window)->event_mask
|
||||||
|
& GDK_FOCUS_CHANGE_MASK))
|
||||||
|
generate_focus_event (grab_focus_window, FALSE);
|
||||||
|
|
||||||
|
if (real_focus_window && !GDK_WINDOW_DESTROYED (real_focus_window)
|
||||||
|
&& (((GdkWindowObject *) real_focus_window)->event_mask
|
||||||
|
& GDK_FOCUS_CHANGE_MASK))
|
||||||
|
generate_focus_event (real_focus_window, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
k_grab_window = NULL;
|
k_grab_window = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2831,7 +2902,7 @@ gdk_event_translate (GdkDisplay *display,
|
|||||||
|
|
||||||
case WM_SETFOCUS:
|
case WM_SETFOCUS:
|
||||||
case WM_KILLFOCUS:
|
case WM_KILLFOCUS:
|
||||||
if (p_grab_window != NULL && !p_grab_owner_events && !(p_grab_mask & GDK_FOCUS_CHANGE_MASK))
|
if (k_grab_window != NULL && !k_grab_owner_events)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!(((GdkWindowObject *) window)->event_mask & GDK_FOCUS_CHANGE_MASK))
|
if (!(((GdkWindowObject *) window)->event_mask & GDK_FOCUS_CHANGE_MASK))
|
||||||
@ -2840,12 +2911,7 @@ gdk_event_translate (GdkDisplay *display,
|
|||||||
if (GDK_WINDOW_DESTROYED (window))
|
if (GDK_WINDOW_DESTROYED (window))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
event = gdk_event_new (GDK_FOCUS_CHANGE);
|
generate_focus_event (window, (msg->message == WM_SETFOCUS));
|
||||||
event->focus_change.window = window;
|
|
||||||
event->focus_change.in = (msg->message == WM_SETFOCUS);
|
|
||||||
|
|
||||||
append_event (display, event);
|
|
||||||
|
|
||||||
return_val = TRUE;
|
return_val = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user