Compare commits

...

4 Commits

Author SHA1 Message Date
Matthias Clasen
a7564a15e1 Drop foreign window checks in Broadway
The broadway backen never creates foreign windows,
so no need to check for this type of window.
2017-08-23 07:49:04 -04:00
Matthias Clasen
6e1c1d89d7 Drop foreign window checks in Wayland
The wayland backend never creates foreign windows,
so no need to check for this type of window.
2017-08-22 22:46:33 -04:00
Matthias Clasen
76b7f65452 Stop using foreign windows for xsettings
Stop wrapping the xsettings manager window in a foreign
window. This means that we cannot use the gdk window filter
APIs anymore, so just do the filtering in a non-generic
way.
2017-08-22 22:46:33 -04:00
Matthias Clasen
69b6be6bc9 Stop providing the owner in GdkEventOwnerChange
This information is rarely useful, and it is one
of the last places where we create foreign windows.
2017-08-22 22:46:33 -04:00
12 changed files with 67 additions and 116 deletions

View File

@@ -47,13 +47,9 @@ static void gdk_window_impl_broadway_finalize (GObject *obje
static const cairo_user_data_key_t gdk_broadway_cairo_key;
#define WINDOW_IS_TOPLEVEL_OR_FOREIGN(window) \
#define WINDOW_IS_TOPLEVEL(window) \
(GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD)
#define WINDOW_IS_TOPLEVEL(window) \
(GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
struct _GdkBroadwayWindow {
GdkWindow parent;
};
@@ -391,12 +387,7 @@ static void
gdk_broadway_window_destroy_notify (GdkWindow *window)
{
if (!GDK_WINDOW_DESTROYED (window))
{
if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
g_warning ("GdkWindow %p unexpectedly destroyed", window);
_gdk_window_destroy (window, TRUE);
}
_gdk_window_destroy (window, TRUE);
g_object_unref (window);
}
@@ -800,7 +791,7 @@ gdk_broadway_window_set_icon_name (GdkWindow *window,
const gchar *name)
{
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
g_object_set_qdata (G_OBJECT (window), g_quark_from_static_string ("gdk-icon-name-set"),
@@ -811,7 +802,7 @@ static void
gdk_broadway_window_iconify (GdkWindow *window)
{
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
}
@@ -819,7 +810,7 @@ static void
gdk_broadway_window_deiconify (GdkWindow *window)
{
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
}
@@ -827,7 +818,7 @@ static void
gdk_broadway_window_stick (GdkWindow *window)
{
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
}
@@ -836,7 +827,7 @@ static void
gdk_broadway_window_unstick (GdkWindow *window)
{
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
}
@@ -850,7 +841,7 @@ gdk_broadway_window_maximize (GdkWindow *window)
GdkRectangle geom;
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
@@ -882,7 +873,7 @@ gdk_broadway_window_unmaximize (GdkWindow *window)
GdkWindowImplBroadway *impl;
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
@@ -905,7 +896,7 @@ static void
gdk_broadway_window_fullscreen (GdkWindow *window)
{
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
}
@@ -914,7 +905,7 @@ static void
gdk_broadway_window_unfullscreen (GdkWindow *window)
{
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
}
@@ -926,7 +917,7 @@ gdk_broadway_window_set_keep_above (GdkWindow *window,
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
}
@@ -937,7 +928,7 @@ gdk_broadway_window_set_keep_below (GdkWindow *window, gboolean setting)
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
}
@@ -963,7 +954,7 @@ gdk_broadway_window_set_decorations (GdkWindow *window,
GdkWMDecoration decorations)
{
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
}
@@ -975,7 +966,7 @@ gdk_broadway_window_get_decorations (GdkWindow *window,
gboolean result = FALSE;
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return FALSE;
return result;
@@ -988,7 +979,7 @@ gdk_broadway_window_set_functions (GdkWindow *window,
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
}
@@ -1372,7 +1363,7 @@ gdk_broadway_window_begin_resize_drag (GdkWindow *window,
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
if (impl->maximized)
@@ -1412,7 +1403,7 @@ gdk_broadway_window_begin_move_drag (GdkWindow *window,
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
if (impl->maximized)

View File

@@ -723,12 +723,6 @@ gdk_event_copy (const GdkEvent *event)
sizeof (gdouble) * gdk_device_get_n_axes (event->motion.device));
break;
case GDK_OWNER_CHANGE:
new_event->owner_change.owner = event->owner_change.owner;
if (new_event->owner_change.owner)
g_object_ref (new_event->owner_change.owner);
break;
case GDK_SELECTION_CLEAR:
case GDK_SELECTION_NOTIFY:
case GDK_SELECTION_REQUEST:
@@ -813,19 +807,14 @@ gdk_event_free (GdkEvent *event)
if (event->expose.region)
cairo_region_destroy (event->expose.region);
break;
case GDK_MOTION_NOTIFY:
g_free (event->motion.axes);
break;
case GDK_SETTING:
g_free (event->setting.name);
break;
case GDK_OWNER_CHANGE:
if (event->owner_change.owner)
g_object_unref (event->owner_change.owner);
break;
case GDK_SELECTION_CLEAR:
case GDK_SELECTION_NOTIFY:

View File

@@ -1029,7 +1029,6 @@ struct _GdkEventSelection
* @type: the type of the event (%GDK_OWNER_CHANGE).
* @window: the window which received the event
* @send_event: %TRUE if the event was sent explicitly.
* @owner: the new owner of the selection, or %NULL if there is none
* @reason: the reason for the ownership change as a #GdkOwnerChange value
* @selection: the atom identifying the selection
* @time: the timestamp of the event
@@ -1047,7 +1046,6 @@ struct _GdkEventOwnerChange
GdkEventType type;
GdkWindow *window;
gint8 send_event;
GdkWindow *owner;
GdkOwnerChange reason;
GdkAtom selection;
guint32 time;

View File

@@ -1087,7 +1087,6 @@ emit_selection_owner_change (GdkWindow *window,
event = gdk_event_new (GDK_OWNER_CHANGE);
event->owner_change.window = g_object_ref (window);
event->owner_change.owner = NULL;
event->owner_change.reason = GDK_OWNER_CHANGE_NEW_OWNER;
event->owner_change.selection = atom;
event->owner_change.time = GDK_CURRENT_TIME;

View File

@@ -47,13 +47,9 @@ enum {
static guint signals[LAST_SIGNAL];
#define WINDOW_IS_TOPLEVEL_OR_FOREIGN(window) \
#define WINDOW_IS_TOPLEVEL(window) \
(GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD)
#define WINDOW_IS_TOPLEVEL(window) \
(GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
#define MAX_WL_BUFFER_SIZE (4083) /* 4096 minus header, string argument length and NUL byte */
typedef struct _GdkWaylandWindow GdkWaylandWindow;
@@ -2989,7 +2985,7 @@ gdk_wayland_window_set_geometry_hints (GdkWindow *window,
int width, height;
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
@@ -3178,7 +3174,7 @@ gdk_wayland_window_iconify (GdkWindow *window)
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
if (!impl->display_server.xdg_toplevel)
@@ -3191,7 +3187,7 @@ static void
gdk_wayland_window_deiconify (GdkWindow *window)
{
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
if (GDK_WINDOW_IS_MAPPED (window))
@@ -3352,7 +3348,7 @@ gdk_wayland_window_begin_resize_drag (GdkWindow *window,
uint32_t resize_edges, serial;
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
!WINDOW_IS_TOPLEVEL (window))
return;
switch (edge)
@@ -3461,9 +3457,7 @@ gdk_wayland_window_destroy_notify (GdkWindow *window)
{
if (!GDK_WINDOW_DESTROYED (window))
{
if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
g_warning ("GdkWindow %p unexpectedly destroyed", window);
g_warning ("GdkWindow %p unexpectedly destroyed", window);
_gdk_window_destroy (window, TRUE);
}

View File

@@ -626,13 +626,8 @@ inner_clipboard_window_procedure (HWND hwnd,
GDK_NOTE (DND, g_print (" \n"));
owner = gdk_win32_window_lookup_for_display (_gdk_display, hwnd_owner);
if (owner == NULL)
owner = gdk_win32_window_foreign_new_for_display (_gdk_display, hwnd_owner);
event = gdk_event_new (GDK_OWNER_CHANGE);
event->owner_change.window = gdk_get_default_root_window ();
event->owner_change.owner = owner;
event->owner_change.reason = GDK_OWNER_CHANGE_NEW_OWNER;
event->owner_change.selection = GDK_SELECTION_CLIPBOARD;
event->owner_change.time = _gdk_win32_get_next_tick (0);

View File

@@ -854,9 +854,6 @@ fixup_event (GdkEvent *event)
(event->any.type == GDK_SELECTION_REQUEST)) &&
(event->selection.requestor != NULL))
g_object_ref (event->selection.requestor);
if ((event->any.type == GDK_OWNER_CHANGE) &&
(event->owner_change.owner != NULL))
g_object_ref (event->owner_change.owner);
event->any.send_event = InSendMessage ();
}

View File

@@ -1002,18 +1002,13 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
event->owner_change.type = GDK_OWNER_CHANGE;
event->owner_change.window = window;
if (selection_notify->owner != None)
event->owner_change.owner = gdk_x11_window_foreign_new_for_display (display,
selection_notify->owner);
else
event->owner_change.owner = NULL;
event->owner_change.reason = selection_notify->subtype;
event->owner_change.selection =
gdk_x11_xatom_to_atom_for_display (display,
event->owner_change.selection =
gdk_x11_xatom_to_atom_for_display (display,
selection_notify->selection);
event->owner_change.time = selection_notify->timestamp;
event->owner_change.selection_time = selection_notify->selection_timestamp;
return_val = TRUE;
}
else

View File

@@ -22,6 +22,7 @@
#include "gdkinternals.h"
#include "gdkwindow-x11.h"
#include "gdkprivate-x11.h"
#include "xsettings-client.h"
static gboolean gdk_event_source_prepare (GSource *source,
@@ -175,6 +176,9 @@ gdk_event_source_translate_event (GdkEventSource *event_source,
GdkEventTranslator *event_translator;
GdkWindow *filter_window;
Display *dpy;
GdkX11Screen *x11_screen;
x11_screen = (GdkX11Screen*)gdk_display_get_default_screen (event_source->display);
dpy = GDK_DISPLAY_XDISPLAY (event_source->display);
@@ -191,8 +195,17 @@ gdk_event_source_translate_event (GdkEventSource *event_source,
if (filter_window)
event->any.window = g_object_ref (filter_window);
/* apply XSettings filters */
if (xevent->xany.window == XRootWindow (dpy, 0))
result = gdk_xsettings_root_window_filter (xevent, event, x11_screen);
if (result == GDK_FILTER_CONTINUE &&
xevent->xany.window == x11_screen->xsettings_manager_window)
result = gdk_xsettings_manager_window_filter (xevent, event, x11_screen);
/* Run default filters */
if (_gdk_default_filters)
if (result == GDK_FILTER_CONTINUE &&
_gdk_default_filters)
{
/* Apply global filters */
result = gdk_event_apply_filters (xevent, event, NULL);

View File

@@ -59,7 +59,7 @@ struct _GdkX11Screen
char *window_manager_name;
/* X Settings */
GdkWindow *xsettings_manager_window;
Window xsettings_manager_window;
Atom xsettings_selection_atom;
GHashTable *xsettings; /* string of GDK settings name => GValue */

View File

@@ -417,14 +417,14 @@ read_settings (GdkX11Screen *x11_screen,
x11_screen->xsettings = NULL;
if (x11_screen->xsettings_manager_window)
if (x11_screen->xsettings_manager_window != 0)
{
GdkDisplay *display = x11_screen->display;
Atom xsettings_atom = gdk_x11_get_xatom_by_name_for_display (display, "_XSETTINGS_SETTINGS");
gdk_x11_display_error_trap_push (display);
result = XGetWindowProperty (gdk_x11_display_get_xdisplay (display),
gdk_x11_window_get_xid (x11_screen->xsettings_manager_window),
x11_screen->xsettings_manager_window,
xsettings_atom, 0, LONG_MAX,
False, xsettings_atom,
&type, &format, &n_items, &bytes_after, &data);
@@ -516,53 +516,33 @@ get_selection_atom (GdkX11Screen *x11_screen)
return _gdk_x11_get_xatom_for_display_printf (x11_screen->display, "_XSETTINGS_S%d", x11_screen->screen_num);
}
static GdkFilterReturn
gdk_xsettings_manager_window_filter (GdkXEvent *xevent,
GdkEvent *event,
gpointer data);
static void
check_manager_window (GdkX11Screen *x11_screen,
gboolean notify_changes)
{
GdkDisplay *display;
Display *xdisplay;
Window manager_window_xid;
display = x11_screen->display;
xdisplay = gdk_x11_display_get_xdisplay (display);
if (x11_screen->xsettings_manager_window)
{
gdk_window_remove_filter (x11_screen->xsettings_manager_window, gdk_xsettings_manager_window_filter, x11_screen);
g_object_unref (x11_screen->xsettings_manager_window);
}
gdk_x11_display_grab (display);
manager_window_xid = XGetSelectionOwner (xdisplay, get_selection_atom (x11_screen));
x11_screen->xsettings_manager_window = gdk_x11_window_foreign_new_for_display (display,
manager_window_xid);
/* XXX: Can't use gdk_window_set_events() here because the first call to this
* function happens too early in gdk_init() */
if (x11_screen->xsettings_manager_window)
x11_screen->xsettings_manager_window = XGetSelectionOwner (xdisplay, get_selection_atom (x11_screen));
if (x11_screen->xsettings_manager_window != 0)
XSelectInput (xdisplay,
gdk_x11_window_get_xid (x11_screen->xsettings_manager_window),
x11_screen->xsettings_manager_window,
PropertyChangeMask | StructureNotifyMask);
gdk_x11_display_ungrab (display);
gdk_display_flush (display);
if (x11_screen->xsettings_manager_window)
{
gdk_window_add_filter (x11_screen->xsettings_manager_window, gdk_xsettings_manager_window_filter, x11_screen);
}
read_settings (x11_screen, notify_changes);
}
static GdkFilterReturn
GdkFilterReturn
gdk_xsettings_root_window_filter (GdkXEvent *xevent,
GdkEvent *event,
gpointer data)
@@ -583,11 +563,11 @@ gdk_xsettings_root_window_filter (GdkXEvent *xevent,
check_manager_window (x11_screen, TRUE);
return GDK_FILTER_REMOVE;
}
return GDK_FILTER_CONTINUE;
}
static GdkFilterReturn
GdkFilterReturn
gdk_xsettings_manager_window_filter (GdkXEvent *xevent,
GdkEvent *event,
gpointer data)
@@ -599,22 +579,20 @@ gdk_xsettings_manager_window_filter (GdkXEvent *xevent,
{
check_manager_window (x11_screen, TRUE);
/* let GDK do its cleanup */
return GDK_FILTER_CONTINUE;
return GDK_FILTER_CONTINUE;
}
else if (xev->xany.type == PropertyNotify)
{
read_settings (x11_screen, TRUE);
return GDK_FILTER_REMOVE;
}
return GDK_FILTER_CONTINUE;;
return GDK_FILTER_CONTINUE;
}
void
_gdk_x11_xsettings_init (GdkX11Screen *x11_screen)
{
gdk_window_add_filter (gdk_screen_get_root_window (GDK_SCREEN (x11_screen)), gdk_xsettings_root_window_filter, x11_screen);
check_manager_window (x11_screen, FALSE);
}
@@ -627,18 +605,12 @@ _gdk_x11_settings_force_reread (GdkX11Screen *x11_screen)
void
_gdk_x11_xsettings_finish (GdkX11Screen *x11_screen)
{
gdk_window_remove_filter (gdk_screen_get_root_window (GDK_SCREEN (x11_screen)), gdk_xsettings_root_window_filter, x11_screen);
if (x11_screen->xsettings_manager_window)
{
gdk_window_remove_filter (x11_screen->xsettings_manager_window, gdk_xsettings_manager_window_filter, x11_screen);
g_object_unref (x11_screen->xsettings_manager_window);
x11_screen->xsettings_manager_window = NULL;
}
x11_screen->xsettings_manager_window = 0;
if (x11_screen->xsettings)
{
g_hash_table_unref (x11_screen->xsettings);
x11_screen->xsettings = NULL;
}
}

View File

@@ -29,4 +29,12 @@ void _gdk_x11_xsettings_init (GdkX11Screen *x11_screen);
void _gdk_x11_xsettings_finish (GdkX11Screen *x11_screen);
void _gdk_x11_settings_force_reread (GdkX11Screen *x11_screen);
GdkFilterReturn gdk_xsettings_root_window_filter (GdkXEvent *xevent,
GdkEvent *event,
gpointer data);
GdkFilterReturn gdk_xsettings_manager_window_filter (GdkXEvent *xevent,
GdkEvent *event,
gpointer data);
#endif /* XSETTINGS_CLIENT_H */