From d249e77bcb19c3981f750556809b48d406a027eb Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 29 Oct 2016 04:37:20 +0200 Subject: [PATCH] API: screen: Remove gdk_screen_is_composited() Switch code to use gdk_display_is_composited() instead. The new code also doesn't use a vfunc to query the property but rather requires the backend to call set_composited()/set_rgba() to change the value. --- docs/reference/gdk/gdk4-sections.txt | 1 - gdk/broadway/gdkdisplay-broadway.c | 2 - gdk/broadway/gdkscreen-broadway.c | 18 -------- gdk/broadway/gdkscreen-broadway.h | 1 - gdk/gdkdisplay.c | 32 +++++++++++++- gdk/gdkdisplayprivate.h | 8 ++++ gdk/gdkscreen.c | 44 ------------------- gdk/gdkscreen.h | 2 - gdk/gdkscreenprivate.h | 1 - gdk/mir/gdkmirscreen.c | 9 ---- gdk/quartz/gdkscreen-quartz.c | 7 ---- gdk/wayland/gdkscreen-wayland.c | 7 ---- gdk/win32/gdkdisplay-win32.c | 20 +++++++++ gdk/win32/gdkdisplay-win32.h | 2 + gdk/win32/gdkevents-win32.c | 1 + gdk/win32/gdkscreen-win32.c | 21 ---------- gdk/win32/gdkwindow-win32.c | 4 +- gdk/x11/gdkdisplay-x11.c | 28 +++++++++++-- gdk/x11/gdkdnd-x11.c | 2 +- gdk/x11/gdkglcontext-x11.c | 7 +--- gdk/x11/gdkscreen-x11.c | 63 ---------------------------- gdk/x11/gdkscreen-x11.h | 4 -- gtk/gtkdnd.c | 10 +++-- gtk/gtkwidget.c | 8 ++-- gtk/gtkwindow.c | 28 +++---------- gtk/inspector/general.c | 1 - gtk/inspector/inspect-button.c | 12 +++--- tests/testgtk.c | 18 ++++---- 28 files changed, 123 insertions(+), 238 deletions(-) diff --git a/docs/reference/gdk/gdk4-sections.txt b/docs/reference/gdk/gdk4-sections.txt index 59834db034..bbae1d92b4 100644 --- a/docs/reference/gdk/gdk4-sections.txt +++ b/docs/reference/gdk/gdk4-sections.txt @@ -180,7 +180,6 @@ GdkScreen gdk_screen_get_default gdk_screen_get_system_visual gdk_screen_get_rgba_visual -gdk_screen_is_composited gdk_screen_get_root_window gdk_screen_get_display gdk_screen_get_number diff --git a/gdk/broadway/gdkdisplay-broadway.c b/gdk/broadway/gdkdisplay-broadway.c index 3b7d718e5f..a891e0d69d 100644 --- a/gdk/broadway/gdkdisplay-broadway.c +++ b/gdk/broadway/gdkdisplay-broadway.c @@ -101,8 +101,6 @@ _gdk_broadway_display_open (const gchar *display_name) _gdk_broadway_display_init_dnd (display); - _gdk_broadway_screen_setup (broadway_display->screens[0]); - if (display_name == NULL) display_name = g_getenv ("BROADWAY_DISPLAY"); diff --git a/gdk/broadway/gdkscreen-broadway.c b/gdk/broadway/gdkscreen-broadway.c index 0bece910e4..b73dac4247 100644 --- a/gdk/broadway/gdkscreen-broadway.c +++ b/gdk/broadway/gdkscreen-broadway.c @@ -137,23 +137,6 @@ _gdk_broadway_screen_new (GdkDisplay *display, return screen; } -/* - * It is important that we first request the selection - * notification, and then setup the initial state of - * is_composited to avoid a race condition here. - */ -void -_gdk_broadway_screen_setup (GdkScreen *screen) -{ -} - -static gboolean -gdk_broadway_screen_is_composited (GdkScreen *screen) -{ - return TRUE; -} - - static gboolean gdk_broadway_screen_get_setting (GdkScreen *screen, const gchar *name, @@ -178,7 +161,6 @@ gdk_broadway_screen_class_init (GdkBroadwayScreenClass *klass) screen_class->get_display = gdk_broadway_screen_get_display; screen_class->get_root_window = gdk_broadway_screen_get_root_window; - screen_class->is_composited = gdk_broadway_screen_is_composited; screen_class->get_setting = gdk_broadway_screen_get_setting; screen_class->get_rgba_visual = gdk_broadway_screen_get_rgba_visual; screen_class->get_system_visual = _gdk_broadway_screen_get_system_visual; diff --git a/gdk/broadway/gdkscreen-broadway.h b/gdk/broadway/gdkscreen-broadway.h index 12c7f2f0e1..4e91c00b4a 100644 --- a/gdk/broadway/gdkscreen-broadway.h +++ b/gdk/broadway/gdkscreen-broadway.h @@ -68,7 +68,6 @@ struct _GdkBroadwayScreenClass GType gdk_broadway_screen_get_type (void); GdkScreen * _gdk_broadway_screen_new (GdkDisplay *display, gint screen_number); -void _gdk_broadway_screen_setup (GdkScreen *screen); G_END_DECLS diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 32cd537a46..8e5e3b1b75 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -2158,7 +2158,21 @@ gdk_display_is_composited (GdkDisplay *display) { g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); - return gdk_screen_is_composited (gdk_display_get_default_screen (display)); + return display->composited; +} + +void +gdk_display_set_composited (GdkDisplay *display, + gboolean composited) +{ + g_return_if_fail (GDK_IS_DISPLAY (display)); + + if (display->composited == composited) + return; + + display->composited = composited; + + g_object_notify_by_pspec (G_OBJECT (display), props[PROP_COMPOSITED]); } /** @@ -2190,7 +2204,21 @@ gdk_display_is_rgba (GdkDisplay *display) { g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); - return gdk_screen_get_rgba_visual (gdk_display_get_default_screen (display)) != NULL; + return display->rgba; +} + +void +gdk_display_set_rgba (GdkDisplay *display, + gboolean rgba) +{ + g_return_if_fail (GDK_IS_DISPLAY (display)); + + if (display->rgba == rgba) + return; + + display->rgba = rgba; + + g_object_notify_by_pspec (G_OBJECT (display), props[PROP_RGBA]); } diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h index c2a3c08990..f22572189f 100644 --- a/gdk/gdkdisplayprivate.h +++ b/gdk/gdkdisplayprivate.h @@ -123,6 +123,9 @@ struct _GdkDisplay guint has_gl_extension_texture_non_power_of_two : 1; guint has_gl_extension_texture_rectangle : 1; + guint rgba : 1; + guint composited : 1; + GdkRenderingMode rendering_mode; GList *seats; @@ -328,6 +331,11 @@ GdkWindow * _gdk_display_create_window (GdkDisplay *display gboolean gdk_display_make_gl_context_current (GdkDisplay *display, GdkGLContext *context); +void gdk_display_set_rgba (GdkDisplay *display, + gboolean rgba); +void gdk_display_set_composited (GdkDisplay *display, + gboolean composited); + void gdk_display_add_seat (GdkDisplay *display, GdkSeat *seat); void gdk_display_remove_seat (GdkDisplay *display, diff --git a/gdk/gdkscreen.c b/gdk/gdkscreen.c index 1ca9807d43..0b80257564 100644 --- a/gdk/gdkscreen.c +++ b/gdk/gdkscreen.c @@ -65,7 +65,6 @@ enum enum { SIZE_CHANGED, - COMPOSITED_CHANGED, MONITORS_CHANGED, LAST_SIGNAL }; @@ -93,25 +92,6 @@ gdk_screen_class_init (GdkScreenClass *klass) G_PARAM_READWRITE|G_PARAM_STATIC_NAME| G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); - /** - * GdkScreen::composited-changed: - * @screen: the object on which the signal is emitted - * - * The ::composited-changed signal is emitted when the composited - * status of the screen changes - * - * Since: 2.10 - */ - signals[COMPOSITED_CHANGED] = - g_signal_new (g_intern_static_string ("composited-changed"), - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GdkScreenClass, composited_changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - /** * GdkScreen::monitors-changed: * @screen: the object on which the signal is emitted @@ -378,30 +358,6 @@ gdk_screen_get_rgba_visual (GdkScreen *screen) return GDK_SCREEN_GET_CLASS (screen)->get_rgba_visual (screen); } -/** - * gdk_screen_is_composited: - * @screen: a #GdkScreen - * - * Returns whether windows with an RGBA visual can reasonably - * be expected to have their alpha channel drawn correctly on - * the screen. - * - * On X11 this function returns whether a compositing manager is - * compositing @screen. - * - * Returns: Whether windows with RGBA visuals can reasonably be - * expected to have their alpha channels drawn correctly on the screen. - * - * Since: 2.10 - **/ -gboolean -gdk_screen_is_composited (GdkScreen *screen) -{ - g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); - - return GDK_SCREEN_GET_CLASS (screen)->is_composited (screen); -} - /** * gdk_screen_get_setting: * @screen: the #GdkScreen where the setting is located diff --git a/gdk/gdkscreen.h b/gdk/gdkscreen.h index 0899e1d118..ece84cedf9 100644 --- a/gdk/gdkscreen.h +++ b/gdk/gdkscreen.h @@ -45,8 +45,6 @@ GDK_AVAILABLE_IN_ALL GdkVisual * gdk_screen_get_system_visual (GdkScreen *screen); GDK_AVAILABLE_IN_ALL GdkVisual * gdk_screen_get_rgba_visual (GdkScreen *screen); -GDK_AVAILABLE_IN_ALL -gboolean gdk_screen_is_composited (GdkScreen *screen); GDK_AVAILABLE_IN_ALL GdkWindow * gdk_screen_get_root_window (GdkScreen *screen); diff --git a/gdk/gdkscreenprivate.h b/gdk/gdkscreenprivate.h index 5234b46a75..b65bbbe9b9 100644 --- a/gdk/gdkscreenprivate.h +++ b/gdk/gdkscreenprivate.h @@ -61,7 +61,6 @@ struct _GdkScreenClass GList * (* list_visuals) (GdkScreen *screen); GdkVisual * (* get_system_visual) (GdkScreen *screen); GdkVisual * (* get_rgba_visual) (GdkScreen *screen); - gboolean (* is_composited) (GdkScreen *screen); gboolean (* get_setting) (GdkScreen *screen, const gchar *name, GValue *value); diff --git a/gdk/mir/gdkmirscreen.c b/gdk/mir/gdkmirscreen.c index 7ec9d1161d..d325e72842 100644 --- a/gdk/mir/gdkmirscreen.c +++ b/gdk/mir/gdkmirscreen.c @@ -411,14 +411,6 @@ gdk_mir_screen_get_rgba_visual (GdkScreen *screen) return GDK_MIR_SCREEN (screen)->visual; } -static gboolean -gdk_mir_screen_is_composited (GdkScreen *screen) -{ - //g_printerr ("gdk_mir_screen_is_composited\n"); - /* We're always composited */ - return TRUE; -} - static gboolean gdk_mir_screen_get_setting (GdkScreen *screen, const gchar *name, @@ -720,7 +712,6 @@ gdk_mir_screen_class_init (GdkMirScreenClass *klass) screen_class->list_visuals = gdk_mir_screen_list_visuals; screen_class->get_system_visual = gdk_mir_screen_get_system_visual; screen_class->get_rgba_visual = gdk_mir_screen_get_rgba_visual; - screen_class->is_composited = gdk_mir_screen_is_composited; screen_class->get_setting = gdk_mir_screen_get_setting; screen_class->get_monitor_scale_factor = gdk_mir_screen_get_monitor_scale_factor; } diff --git a/gdk/quartz/gdkscreen-quartz.c b/gdk/quartz/gdkscreen-quartz.c index d29615a718..1c7d251501 100644 --- a/gdk/quartz/gdkscreen-quartz.c +++ b/gdk/quartz/gdkscreen-quartz.c @@ -448,12 +448,6 @@ _gdk_quartz_screen_get_monitor_scale_factor (GdkScreen *screen, return scale_factor; } -static gboolean -gdk_quartz_screen_is_composited (GdkScreen *screen) -{ - return TRUE; -} - static void gdk_quartz_screen_class_init (GdkQuartzScreenClass *klass) { @@ -476,7 +470,6 @@ gdk_quartz_screen_class_init (GdkQuartzScreenClass *klass) screen_class->get_monitor_plug_name = gdk_quartz_screen_get_monitor_plug_name; screen_class->get_monitor_geometry = gdk_quartz_screen_get_monitor_geometry; screen_class->get_monitor_workarea = gdk_quartz_screen_get_monitor_workarea; - screen_class->is_composited = gdk_quartz_screen_is_composited; screen_class->get_setting = _gdk_quartz_screen_get_setting; screen_class->get_rgba_visual = _gdk_quartz_screen_get_rgba_visual; screen_class->get_system_visual = _gdk_quartz_screen_get_system_visual; diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c index c610688253..0d40c1062c 100644 --- a/gdk/wayland/gdkscreen-wayland.c +++ b/gdk/wayland/gdkscreen-wayland.c @@ -129,12 +129,6 @@ gdk_wayland_screen_get_rgba_visual (GdkScreen *screen) return (GdkVisual *) GDK_WAYLAND_SCREEN (screen)->visual; } -static gboolean -gdk_wayland_screen_is_composited (GdkScreen *screen) -{ - return TRUE; -} - static void notify_setting (GdkScreen *screen, const gchar *setting) @@ -722,7 +716,6 @@ _gdk_wayland_screen_class_init (GdkWaylandScreenClass *klass) screen_class->get_root_window = gdk_wayland_screen_get_root_window; screen_class->get_system_visual = gdk_wayland_screen_get_system_visual; screen_class->get_rgba_visual = gdk_wayland_screen_get_rgba_visual; - screen_class->is_composited = gdk_wayland_screen_is_composited; screen_class->get_setting = gdk_wayland_screen_get_setting; screen_class->list_visuals = gdk_wayland_screen_list_visuals; } diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c index 3eba020e98..422a83138a 100644 --- a/gdk/win32/gdkdisplay-win32.c +++ b/gdk/win32/gdkdisplay-win32.c @@ -808,6 +808,26 @@ gdk_win32_display_init (GdkWin32Display *display) { display->monitors = g_ptr_array_new_with_free_func (g_object_unref); _gdk_win32_display_init_cursors (display); + gdk_win32_display_check_composited (display); +} + +void +gdk_win32_display_check_composited (GdkWin32Display *display) +{ + gboolean composited; + + /* On Windows 8 and later, DWM (composition) is always enabled */ + if (g_win32_check_windows_version (6, 2, 0, G_WIN32_OS_ANY)) + { + composited = TRUE; + } + else + { + if (DwmIsCompositionEnabled (&composited) != S_OK) + composited = FALSE; + } + + gdk_display_set_composited (GDK_DISPLAY (display), composited); } static void diff --git a/gdk/win32/gdkdisplay-win32.h b/gdk/win32/gdkdisplay-win32.h index 50423b319f..e36d8c47be 100644 --- a/gdk/win32/gdkdisplay-win32.h +++ b/gdk/win32/gdkdisplay-win32.h @@ -60,4 +60,6 @@ gboolean _gdk_win32_display_init_monitors (GdkWin32Display *display); GPtrArray *_gdk_win32_display_get_monitor_list (GdkWin32Display *display); +void gdk_win32_display_check_composited (GdkWin32Display *display); + #endif /* __GDK_DISPLAY__WIN32_H__ */ diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index 9854ee0179..d7899d9eba 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -3511,6 +3511,7 @@ gdk_event_translate (MSG *msg, break; case WM_DWMCOMPOSITIONCHANGED: + gdk_win32_display_check_composited (GDK_WIN32_DISPLAY (display)); _gdk_win32_window_enable_transparency (window); break; diff --git a/gdk/win32/gdkscreen-win32.c b/gdk/win32/gdkscreen-win32.c index cf2243c7a3..05840df500 100644 --- a/gdk/win32/gdkscreen-win32.c +++ b/gdk/win32/gdkscreen-win32.c @@ -37,8 +37,6 @@ struct _GdkWin32Screen GdkVisualType available_visual_types[1]; GdkWindow *root_window; - - gint always_composited : 1; }; struct _GdkWin32ScreenClass @@ -353,9 +351,6 @@ gdk_win32_screen_init (GdkWin32Screen *win32_screen) _gdk_win32_display_init_monitors (GDK_WIN32_DISPLAY (_gdk_display)); init_root_window (win32_screen); - - /* On Windows 8 and later, DWM (composition) is always enabled */ - win32_screen->always_composited = g_win32_check_windows_version (6, 2, 0, G_WIN32_OS_ANY); } void @@ -384,21 +379,6 @@ gdk_win32_screen_get_root_window (GdkScreen *screen) return GDK_WIN32_SCREEN (screen)->root_window; } -static gboolean -gdk_win32_screen_is_composited (GdkScreen *screen) -{ - if (GDK_WIN32_SCREEN (screen)->always_composited) - return TRUE; - else - { - gboolean is_composited; - - if (DwmIsCompositionEnabled (&is_composited) != S_OK) - return FALSE; - return is_composited; - } -} - static GdkVisual * gdk_win32_screen_get_system_visual (GdkScreen *screen) { @@ -439,7 +419,6 @@ gdk_win32_screen_class_init (GdkWin32ScreenClass *klass) screen_class->get_display = gdk_win32_screen_get_display; screen_class->get_root_window = gdk_win32_screen_get_root_window; - screen_class->is_composited = gdk_win32_screen_is_composited; screen_class->get_setting = _gdk_win32_screen_get_setting; screen_class->get_system_visual = gdk_win32_screen_get_system_visual; screen_class->get_rgba_visual = gdk_win32_screen_get_rgba_visual; diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index 0b189a54ba..a68e863b91 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -464,7 +464,7 @@ _gdk_win32_window_enable_transparency (GdkWindow *window) screen = gdk_window_get_screen (window); - if (!gdk_screen_is_composited (screen)) + if (!gdk_display_is_composited (gdk_window_get_display (window))) return FALSE; if (window == gdk_screen_get_root_window (screen)) @@ -4911,7 +4911,7 @@ gdk_win32_window_do_move_resize_drag (GdkWindow *window, */ if (impl->layered) { - if (gdk_screen_is_composited (gdk_window_get_screen (window))) + if (gdk_display_is_composited (gdk_window_get_display (window))) { hdc = NULL; window_size_ptr = NULL; diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index 50af342a8f..3b2c3057ee 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -176,7 +176,6 @@ G_DEFINE_TYPE_WITH_CODE (GdkX11Display, gdk_x11_display, GDK_TYPE_DISPLAY, G_IMPLEMENT_INTERFACE (GDK_TYPE_EVENT_TRANSLATOR, gdk_x11_display_event_translator_init)) - static void gdk_x11_display_init (GdkX11Display *display) { @@ -395,6 +394,12 @@ gdk_check_wm_state_changed (GdkWindow *window) do_net_wm_state_changes (window); } +static Atom +get_cm_atom (GdkDisplay *display) +{ + return _gdk_x11_get_xatom_for_display_printf (display, "_NET_WM_CM_S%d", DefaultScreen (GDK_DISPLAY_XDISPLAY (display))); +} + static Window get_event_xwindow (XEvent *xevent) { @@ -985,8 +990,13 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator, { XFixesSelectionNotifyEvent *selection_notify = (XFixesSelectionNotifyEvent *)xevent; - _gdk_x11_screen_process_owner_change (screen, xevent); - + if (selection_notify->selection == get_cm_atom (display)) + { + gboolean composited = selection_notify->owner != None; + + gdk_display_set_composited (display, composited); + } + event->owner_change.type = GDK_OWNER_CHANGE; event->owner_change.window = window; if (selection_notify->owner != None) @@ -1381,6 +1391,8 @@ _gdk_x11_display_open (const gchar *display_name) /* initialize the display's screens */ display_x11->screen = _gdk_x11_screen_new (display, DefaultScreen (display_x11->xdisplay)); + if (gdk_screen_get_rgba_visual (display_x11->screen) == NULL) + gdk_display_set_rgba (display, FALSE); /* We need to initialize events after we have the screen * structures in places @@ -1571,7 +1583,15 @@ _gdk_x11_display_open (const gchar *display_name) } #endif - _gdk_x11_screen_setup (display_x11->screen); + /* + * It is important that we first request the selection + * notification, and then setup the initial state of + * is_composited to avoid a race condition here. + */ + gdk_display_request_selection_notification (display, + gdk_x11_xatom_to_atom_for_display (display, get_cm_atom (display))); + gdk_display_set_composited (GDK_DISPLAY (display), + XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display), get_cm_atom (display)) != None); g_signal_emit_by_name (display, "opened"); diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index 89460744d1..596a4de44f 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -634,7 +634,7 @@ gdk_window_cache_new (GdkScreen *screen) * the COW. We assume that the CM is using the COW (which is true for pretty * much any CM currently in use). */ - if (gdk_screen_is_composited (screen)) + if (gdk_display_is_composited (gdk_screen_get_display (screen))) { cow = XCompositeGetOverlayWindow (xdisplay, GDK_WINDOW_XID (root_window)); gdk_window_cache_add (result, cow, 0, 0, diff --git a/gdk/x11/gdkglcontext-x11.c b/gdk/x11/gdkglcontext-x11.c index 6de0e2909b..6d91ddf350 100644 --- a/gdk/x11/gdkglcontext-x11.c +++ b/gdk/x11/gdkglcontext-x11.c @@ -1298,8 +1298,6 @@ gdk_x11_display_make_gl_context_current (GdkDisplay *display, { GdkX11GLContext *context_x11; Display *dpy = gdk_x11_display_get_xdisplay (display); - GdkWindow *window; - GdkScreen *screen; gboolean do_frame_sync = FALSE; if (context == NULL) @@ -1330,14 +1328,11 @@ gdk_x11_display_make_gl_context_current (GdkDisplay *display, if (context_x11->is_attached && GDK_X11_DISPLAY (display)->has_glx_swap_interval) { - window = gdk_gl_context_get_window (context); - /* If the WM is compositing there is no particular need to delay * the swap when drawing on the offscreen, rendering to the screen * happens later anyway, and its up to the compositor to sync that * to the vblank. */ - screen = gdk_window_get_screen (window); - do_frame_sync = ! gdk_screen_is_composited (screen); + do_frame_sync = ! gdk_display_is_composited (display); if (do_frame_sync != context_x11->do_frame_sync) { diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c index 91fa9bec08..8555dd3add 100644 --- a/gdk/x11/gdkscreen-x11.c +++ b/gdk/x11/gdkscreen-x11.c @@ -321,23 +321,6 @@ gdk_x11_screen_get_screen_number (GdkScreen *screen) return GDK_X11_SCREEN (screen)->screen_num; } -static Atom -get_cm_atom (GdkX11Screen *x11_screen) -{ - return _gdk_x11_get_xatom_for_display_printf (x11_screen->display, "_NET_WM_CM_S%d", x11_screen->screen_num); -} - -static gboolean -check_is_composited (GdkDisplay *display, - GdkX11Screen *x11_screen) -{ - Window xwindow; - - xwindow = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display), get_cm_atom (x11_screen)); - - return xwindow != None; -} - static GdkX11Monitor * find_monitor_by_output (GdkX11Display *x11_display, XID output) { @@ -887,29 +870,6 @@ _gdk_x11_screen_set_window_scale (GdkX11Screen *x11_screen, g_signal_emit_by_name (GDK_SCREEN (x11_screen), "monitors-changed"); } -/* - * It is important that we first request the selection - * notification, and then setup the initial state of - * is_composited to avoid a race condition here. - */ -void -_gdk_x11_screen_setup (GdkScreen *screen) -{ - GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen); - - gdk_display_request_selection_notification (x11_screen->display, - gdk_x11_xatom_to_atom_for_display (x11_screen->display, get_cm_atom (x11_screen))); - x11_screen->is_composited = check_is_composited (x11_screen->display, x11_screen); -} - -static gboolean -gdk_x11_screen_is_composited (GdkScreen *screen) -{ - GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen); - - return x11_screen->is_composited; -} - static void init_randr_support (GdkScreen *screen) { @@ -1030,28 +990,6 @@ _gdk_x11_screen_window_manager_changed (GdkScreen *screen) g_signal_emit (screen, signals[WINDOW_MANAGER_CHANGED], 0); } -void -_gdk_x11_screen_process_owner_change (GdkScreen *screen, - XEvent *event) -{ -#ifdef HAVE_XFIXES - XFixesSelectionNotifyEvent *selection_event = (XFixesSelectionNotifyEvent *)event; - GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen); - - if (selection_event->selection == get_cm_atom (x11_screen)) - { - gboolean composited = selection_event->owner != None; - - if (composited != x11_screen->is_composited) - { - x11_screen->is_composited = composited; - - g_signal_emit_by_name (screen, "composited-changed"); - } - } -#endif -} - static gboolean gdk_x11_screen_get_setting (GdkScreen *screen, const gchar *name, @@ -1355,7 +1293,6 @@ gdk_x11_screen_class_init (GdkX11ScreenClass *klass) screen_class->get_root_window = gdk_x11_screen_get_root_window; screen_class->get_system_visual = _gdk_x11_screen_get_system_visual; screen_class->get_rgba_visual = gdk_x11_screen_get_rgba_visual; - screen_class->is_composited = gdk_x11_screen_is_composited; screen_class->get_setting = gdk_x11_screen_get_setting; screen_class->list_visuals = _gdk_x11_screen_list_visuals; diff --git a/gdk/x11/gdkscreen-x11.h b/gdk/x11/gdkscreen-x11.h index d94d14af68..67cdd531d8 100644 --- a/gdk/x11/gdkscreen-x11.h +++ b/gdk/x11/gdkscreen-x11.h @@ -71,7 +71,6 @@ struct _GdkX11Screen * fetch of window manager name */ guint need_refetch_wm_name : 1; - guint is_composited : 1; guint xft_init : 1; /* Whether we've intialized these values yet */ guint xft_antialias : 1; guint xft_hinting : 1; @@ -102,13 +101,10 @@ GType _gdk_x11_screen_get_type (void); GdkScreen * _gdk_x11_screen_new (GdkDisplay *display, gint screen_number); -void _gdk_x11_screen_setup (GdkScreen *screen); void _gdk_x11_screen_update_visuals_for_gl (GdkScreen *screen); void _gdk_x11_screen_window_manager_changed (GdkScreen *screen); void _gdk_x11_screen_size_changed (GdkScreen *screen, XEvent *event); -void _gdk_x11_screen_process_owner_change (GdkScreen *screen, - XEvent *event); void _gdk_x11_screen_get_edge_monitors (GdkScreen *screen, gint *top, gint *bottom, diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index 238ed915c1..56ea797f46 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -1579,9 +1579,11 @@ gtk_drag_set_icon_widget_internal (GdkDragContext *context, if (!info->icon_window) { + GdkDisplay *display; GdkScreen *screen; screen = gdk_window_get_screen (gdk_drag_context_get_source_window (context)); + display = gdk_window_get_display (gdk_drag_context_get_source_window (context)); info->icon_window = gtk_window_new (GTK_WINDOW_POPUP); gtk_window_set_type_hint (GTK_WINDOW (info->icon_window), GDK_WINDOW_TYPE_HINT_DND); @@ -1589,7 +1591,7 @@ gtk_drag_set_icon_widget_internal (GdkDragContext *context, gtk_widget_set_size_request (info->icon_window, 24, 24); gtk_widget_set_events (info->icon_window, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - if (gdk_screen_is_composited (screen)) + if (gdk_display_is_composited (display)) gtk_widget_set_app_paintable (info->icon_window, TRUE); gtk_window_set_hardcoded_window (GTK_WINDOW (info->icon_window), @@ -1779,6 +1781,7 @@ gtk_drag_set_icon_surface (GdkDragContext *context, cairo_surface_t *surface) { GtkWidget *window; + GdkDisplay *display; GdkScreen *screen; GdkRectangle extents; cairo_pattern_t *pattern; @@ -1789,6 +1792,7 @@ gtk_drag_set_icon_surface (GdkDragContext *context, _gtk_cairo_surface_extents (surface, &extents); + display = gdk_window_get_display (gdk_drag_context_get_source_window (context)); screen = gdk_window_get_screen (gdk_drag_context_get_source_window (context)); window = gtk_window_new (GTK_WINDOW_POPUP); @@ -1809,8 +1813,8 @@ gtk_drag_set_icon_surface (GdkDragContext *context, g_signal_connect_data (window, "draw", - gdk_screen_is_composited (screen) ? G_CALLBACK (gtk_drag_draw_icon_pattern) - : G_CALLBACK (gtk_drag_draw_icon_pattern_and_background), + gdk_display_is_composited (display) ? G_CALLBACK (gtk_drag_draw_icon_pattern) + : G_CALLBACK (gtk_drag_draw_icon_pattern_and_background), pattern, (GClosureNotify) cairo_pattern_destroy, G_CONNECT_AFTER); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 6a19227b7b..c3fa0067a7 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -8849,7 +8849,7 @@ gtk_widget_propagate_screen_changed_recurse (GtkWidget *widget, * * Whether @widget can rely on having its alpha channel * drawn correctly. On X11 this function returns whether a - * compositing manager is running for @widget’s screen. + * compositing manager is running for @widget’s display. * * Returns: %TRUE if the widget can rely on its alpha * channel being drawn correctly. @@ -8859,13 +8859,13 @@ gtk_widget_propagate_screen_changed_recurse (GtkWidget *widget, gboolean gtk_widget_is_composited (GtkWidget *widget) { - GdkScreen *screen; + GdkDisplay *display; g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); - screen = gtk_widget_get_screen (widget); + display = gtk_widget_get_display (widget); - return gdk_screen_is_composited (screen); + return gdk_display_is_composited (display); } /** diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 18f74cc265..e48ed6b7f9 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -3928,37 +3928,21 @@ gtk_window_supports_client_shadow (GtkWindow *window) { GdkDisplay *display; GdkScreen *screen; - GdkVisual *visual; screen = _gtk_window_get_screen (window); display = gdk_screen_get_display (screen); + if (!gdk_display_is_rgba (display)) + return FALSE; + + if (!gdk_display_is_composited (display)) + return FALSE; + #ifdef GDK_WINDOWING_X11 if (GDK_IS_X11_DISPLAY (display)) { - if (!gdk_screen_is_composited (screen)) - return FALSE; - if (!gdk_x11_screen_supports_net_wm_hint (screen, gdk_atom_intern_static_string ("_GTK_FRAME_EXTENTS"))) return FALSE; - - /* We need a visual with alpha */ - visual = gdk_screen_get_rgba_visual (screen); - if (!visual) - return FALSE; - } -#endif - -#ifdef GDK_WINDOWING_WIN32 - if (GDK_IS_WIN32_DISPLAY (display)) - { - if (!gdk_screen_is_composited (screen)) - return FALSE; - - /* We need a visual with alpha */ - visual = gdk_screen_get_rgba_visual (screen); - if (!visual) - return FALSE; } #endif diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c index 6709d69a34..04df6500e6 100644 --- a/gtk/inspector/general.c +++ b/gtk/inspector/general.c @@ -479,7 +479,6 @@ init_display (GtkInspectorGeneral *gen) screen = gdk_screen_get_default (); g_signal_connect (display, "notify", G_CALLBACK (populate_display_notify_cb), gen); - g_signal_connect (screen, "composited-changed", G_CALLBACK (populate_display), gen); g_signal_connect (screen, "monitors-changed", G_CALLBACK (populate_display), gen); populate_display (screen, gen); diff --git a/gtk/inspector/inspect-button.c b/gtk/inspector/inspect-button.c index e8c55909fe..241a2d6cb8 100644 --- a/gtk/inspector/inspect-button.c +++ b/gtk/inspector/inspect-button.c @@ -275,10 +275,10 @@ on_highlight_widget (GtkWidget *button, static void deemphasize_window (GtkWidget *window) { - GdkScreen *screen; + GdkDisplay *display; - screen = gtk_widget_get_screen (window); - if (gdk_screen_is_composited (screen)) + display = gtk_widget_get_display (window); + if (gdk_display_is_composited (display)) { cairo_rectangle_int_t rect; cairo_region_t *region; @@ -296,10 +296,10 @@ deemphasize_window (GtkWidget *window) static void reemphasize_window (GtkWidget *window) { - GdkScreen *screen; + GdkDisplay *display; - screen = gtk_widget_get_screen (window); - if (gdk_screen_is_composited (screen)) + display = gtk_widget_get_display (window); + if (gdk_display_is_composited (display)) { gtk_widget_set_opacity (window, 1.0); gtk_widget_input_shape_combine_region (window, NULL); diff --git a/tests/testgtk.c b/tests/testgtk.c index 85c14d33fc..5fbf6c8650 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -222,15 +222,19 @@ build_alpha_widgets (void) } static void -on_composited_changed (GdkScreen *screen, - GtkLabel *label) +on_composited_changed (GdkDisplay *display, + GParamSpec *pspec, + GtkLabel *label) { - gboolean is_composited = gdk_screen_is_composited (screen); + gboolean is_composited = gdk_display_is_composited (display); if (is_composited) gtk_label_set_text (label, "Composited"); else gtk_label_set_text (label, "Not composited"); + + /* We draw a different background on the GdkWindow */ + gtk_widget_queue_draw (gtk_widget_get_toplevel (GTK_WIDGET (label))); } void @@ -243,7 +247,7 @@ create_alpha_window (GtkWidget *widget) GtkWidget *content_area; GtkWidget *vbox; GtkWidget *label; - GdkScreen *screen; + GdkDisplay *display; window = gtk_dialog_new_with_buttons ("Alpha Window", GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0, @@ -265,9 +269,9 @@ create_alpha_window (GtkWidget *widget) label = gtk_label_new (NULL); gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE); - screen = gtk_widget_get_screen (window); - on_composited_changed (screen, GTK_LABEL (label)); - g_signal_connect (screen, "composited_changed", G_CALLBACK (on_composited_changed), label); + display = gtk_widget_get_display (window); + on_composited_changed (display, NULL, GTK_LABEL (label)); + g_signal_connect (display, "notify::composited", G_CALLBACK (on_composited_changed), label); gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE);