quartz: Misc. fixes for getting offscreen windows to work
Mainly fixes to properly differentiate between toplevel and offscreen windows, since these sometimes need different treatment. Furthermore, usage of gdk_window_get_effective_foo() instead of gdk_window_get_foo() where applicable.
This commit is contained in:
committed by
Benjamin Otte
parent
d819bc4814
commit
bde0f9a8f6
@ -147,7 +147,7 @@ translate_coords_to_child_coords (GdkWindow *parent,
|
|||||||
*x -= tmp_x;
|
*x -= tmp_x;
|
||||||
*y -= tmp_y;
|
*y -= tmp_y;
|
||||||
|
|
||||||
current = gdk_window_get_parent (current);
|
current = gdk_window_get_effective_parent (current);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,7 +204,7 @@ gdk_device_core_query_state_helper (GdkWindow *window,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
toplevel = GDK_WINDOW_OBJECT (gdk_window_get_toplevel (window));
|
toplevel = GDK_WINDOW_OBJECT (gdk_window_get_effective_toplevel (window));
|
||||||
|
|
||||||
*mask = _gdk_quartz_events_get_current_event_mask ();
|
*mask = _gdk_quartz_events_get_current_event_mask ();
|
||||||
|
|
||||||
|
|||||||
@ -37,6 +37,11 @@
|
|||||||
#define GRIP_WIDTH 15
|
#define GRIP_WIDTH 15
|
||||||
#define GRIP_HEIGHT 15
|
#define GRIP_HEIGHT 15
|
||||||
|
|
||||||
|
#define WINDOW_IS_TOPLEVEL(window) \
|
||||||
|
(GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
|
||||||
|
GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN && \
|
||||||
|
GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
|
||||||
|
|
||||||
/* This is the window corresponding to the key window */
|
/* This is the window corresponding to the key window */
|
||||||
static GdkWindow *current_keyboard_window;
|
static GdkWindow *current_keyboard_window;
|
||||||
|
|
||||||
@ -505,7 +510,7 @@ find_toplevel_under_pointer (GdkDisplay *display,
|
|||||||
|
|
||||||
info = _gdk_display_get_pointer_info (display, display->core_pointer);
|
info = _gdk_display_get_pointer_info (display, display->core_pointer);
|
||||||
toplevel = info->toplevel_under_pointer;
|
toplevel = info->toplevel_under_pointer;
|
||||||
if (toplevel)
|
if (toplevel && WINDOW_IS_TOPLEVEL (toplevel))
|
||||||
{
|
{
|
||||||
GdkWindowObject *private;
|
GdkWindowObject *private;
|
||||||
NSWindow *nswindow;
|
NSWindow *nswindow;
|
||||||
@ -551,7 +556,7 @@ find_toplevel_for_keyboard_event (NSEvent *nsevent)
|
|||||||
grab = _gdk_display_get_last_device_grab (display, device);
|
grab = _gdk_display_get_last_device_grab (display, device);
|
||||||
if (grab && grab->window && !grab->owner_events)
|
if (grab && grab->window && !grab->owner_events)
|
||||||
{
|
{
|
||||||
window = gdk_window_get_toplevel (grab->window);
|
window = gdk_window_get_effective_toplevel (grab->window);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -596,7 +601,7 @@ find_toplevel_for_mouse_event (NSEvent *nsevent,
|
|||||||
*/
|
*/
|
||||||
grab = _gdk_display_get_last_device_grab (display,
|
grab = _gdk_display_get_last_device_grab (display,
|
||||||
display->core_pointer);
|
display->core_pointer);
|
||||||
if (grab)
|
if (WINDOW_IS_TOPLEVEL (toplevel) && grab)
|
||||||
{
|
{
|
||||||
/* Implicit grabs do not go through XGrabPointer and thus the
|
/* Implicit grabs do not go through XGrabPointer and thus the
|
||||||
* event mask should not be checked.
|
* event mask should not be checked.
|
||||||
@ -634,7 +639,7 @@ find_toplevel_for_mouse_event (NSEvent *nsevent,
|
|||||||
GdkWindowObject *grab_private;
|
GdkWindowObject *grab_private;
|
||||||
NSWindow *grab_nswindow;
|
NSWindow *grab_nswindow;
|
||||||
|
|
||||||
grab_toplevel = gdk_window_get_toplevel (grab->window);
|
grab_toplevel = gdk_window_get_effective_toplevel (grab->window);
|
||||||
grab_private = (GdkWindowObject *)grab_toplevel;
|
grab_private = (GdkWindowObject *)grab_toplevel;
|
||||||
|
|
||||||
grab_nswindow = ((GdkWindowImplQuartz *)grab_private->impl)->toplevel;
|
grab_nswindow = ((GdkWindowImplQuartz *)grab_private->impl)->toplevel;
|
||||||
@ -670,7 +675,8 @@ find_toplevel_for_mouse_event (NSEvent *nsevent,
|
|||||||
toplevel_under_pointer = find_toplevel_under_pointer (display,
|
toplevel_under_pointer = find_toplevel_under_pointer (display,
|
||||||
screen_point,
|
screen_point,
|
||||||
&x_tmp, &y_tmp);
|
&x_tmp, &y_tmp);
|
||||||
if (toplevel_under_pointer)
|
if (toplevel_under_pointer
|
||||||
|
&& WINDOW_IS_TOPLEVEL (toplevel_under_pointer))
|
||||||
{
|
{
|
||||||
GdkWindowObject *toplevel_private;
|
GdkWindowObject *toplevel_private;
|
||||||
GdkWindowImplQuartz *toplevel_impl;
|
GdkWindowImplQuartz *toplevel_impl;
|
||||||
|
|||||||
@ -355,8 +355,8 @@ _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
|
|||||||
{
|
{
|
||||||
GdkWindow *toplevel;
|
GdkWindow *toplevel;
|
||||||
|
|
||||||
toplevel = gdk_window_get_toplevel (window);
|
toplevel = gdk_window_get_effective_toplevel (window);
|
||||||
if (toplevel)
|
if (toplevel && WINDOW_IS_TOPLEVEL (toplevel))
|
||||||
{
|
{
|
||||||
GdkWindowObject *toplevel_private;
|
GdkWindowObject *toplevel_private;
|
||||||
GdkWindowImplQuartz *toplevel_impl;
|
GdkWindowImplQuartz *toplevel_impl;
|
||||||
@ -378,7 +378,10 @@ _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (WINDOW_IS_TOPLEVEL (window))
|
||||||
_gdk_quartz_window_set_needs_display_in_region (window, region);
|
_gdk_quartz_window_set_needs_display_in_region (window, region);
|
||||||
|
else
|
||||||
|
_gdk_window_process_updates_recurse (window, region);
|
||||||
|
|
||||||
/* NOTE: I'm not sure if we should displayIfNeeded here. It slows down a
|
/* NOTE: I'm not sure if we should displayIfNeeded here. It slows down a
|
||||||
* lot (since it triggers the beam syncing) and things seem to work
|
* lot (since it triggers the beam syncing) and things seem to work
|
||||||
@ -784,7 +787,7 @@ _gdk_quartz_window_did_resign_main (GdkWindow *window)
|
|||||||
if (new_window &&
|
if (new_window &&
|
||||||
new_window != window &&
|
new_window != window &&
|
||||||
GDK_WINDOW_IS_MAPPED (new_window) &&
|
GDK_WINDOW_IS_MAPPED (new_window) &&
|
||||||
GDK_WINDOW_OBJECT (new_window)->window_type != GDK_WINDOW_TEMP)
|
WINDOW_IS_TOPLEVEL (new_window))
|
||||||
{
|
{
|
||||||
GdkWindowObject *private = (GdkWindowObject *) new_window;
|
GdkWindowObject *private = (GdkWindowObject *) new_window;
|
||||||
GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
|
GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
|
||||||
@ -901,6 +904,8 @@ _gdk_window_impl_new (GdkWindow *window,
|
|||||||
(attributes->cursor) :
|
(attributes->cursor) :
|
||||||
NULL));
|
NULL));
|
||||||
|
|
||||||
|
impl->view = NULL;
|
||||||
|
|
||||||
switch (attributes->window_type)
|
switch (attributes->window_type)
|
||||||
{
|
{
|
||||||
case GDK_WINDOW_TOPLEVEL:
|
case GDK_WINDOW_TOPLEVEL:
|
||||||
@ -1148,7 +1153,7 @@ gdk_window_quartz_show (GdkWindow *window, gboolean already_mapped)
|
|||||||
else
|
else
|
||||||
focus_on_map = TRUE;
|
focus_on_map = TRUE;
|
||||||
|
|
||||||
if (impl->toplevel)
|
if (WINDOW_IS_TOPLEVEL (window) && impl->toplevel)
|
||||||
{
|
{
|
||||||
gboolean make_key;
|
gboolean make_key;
|
||||||
|
|
||||||
@ -1243,7 +1248,7 @@ gdk_window_quartz_hide (GdkWindow *window)
|
|||||||
|
|
||||||
impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
|
impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
|
||||||
|
|
||||||
if (impl->toplevel)
|
if (WINDOW_IS_TOPLEVEL (window))
|
||||||
{
|
{
|
||||||
/* Update main window. */
|
/* Update main window. */
|
||||||
main_window_stack = g_slist_remove (main_window_stack, window);
|
main_window_stack = g_slist_remove (main_window_stack, window);
|
||||||
|
|||||||
Reference in New Issue
Block a user