From 7e24a22fe5253cdf25476ba86840befa650a94cb Mon Sep 17 00:00:00 2001 From: Olivier Duchateau Date: Thu, 28 Dec 2017 12:31:13 +0100 Subject: [PATCH] Use 'gdk_screen_is_composited' with Gtk3 --- panel/panel-base-window.c | 11 +++++++++++ plugins/systray/systray-manager.c | 5 +++++ plugins/systray/systray.c | 28 +++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/panel/panel-base-window.c b/panel/panel-base-window.c index 79e159f9..c62cbf7d 100644 --- a/panel/panel-base-window.c +++ b/panel/panel-base-window.c @@ -448,7 +448,11 @@ panel_base_window_screen_changed (GtkWidget *widget, GdkScreen *previous_screen) if (visual != NULL) { gtk_widget_set_visual (widget, visual); +#if GTK_CHECK_VERSION (3, 22, 0) + window->is_composited = gdk_screen_is_composited (screen); +#else window->is_composited = gtk_widget_is_composited (widget); +#endif } panel_debug (PANEL_DEBUG_BASE_WINDOW, @@ -511,7 +515,14 @@ panel_base_window_composited_changed (GtkWidget *widget) GtkAllocation allocation; /* set new compositing state */ +#if GTK_CHECK_VERSION (3, 22, 0) + GdkScreen *screen; + + screen = gtk_window_get_screen (GTK_WINDOW (window)); + window->is_composited = gdk_screen_is_composited (screen); +#else window->is_composited = gtk_widget_is_composited (widget); +#endif if (window->is_composited == was_composited) return; diff --git a/plugins/systray/systray-manager.c b/plugins/systray/systray-manager.c index e24b1924..46827d04 100644 --- a/plugins/systray/systray-manager.c +++ b/plugins/systray/systray-manager.c @@ -766,9 +766,14 @@ systray_manager_set_visual (SystrayManager *manager) visual_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_SYSTEM_TRAY_VISUAL"); +#if GTK_CHECK_VERSION (3, 22, 0) + if (gdk_screen_is_composited (gtk_widget_get_screen (manager->invisible)) + && (gdk_screen_get_rgba_visual (screen) != NULL)) +#else if (gtk_widget_is_composited (manager->invisible) && gdk_screen_get_rgba_visual (screen) != NULL && gdk_display_supports_composite (display)) +#endif { /* get the rgba visual */ xvisual = GDK_VISUAL_XVISUAL (gdk_screen_get_rgba_visual (screen)); diff --git a/plugins/systray/systray.c b/plugins/systray/systray.c index 1264e5a7..9e34c739 100644 --- a/plugins/systray/systray.c +++ b/plugins/systray/systray.c @@ -249,7 +249,7 @@ systray_plugin_init (SystrayPlugin *plugin) plugin->box = systray_box_new (); gtk_box_pack_start (GTK_BOX (plugin->hvbox), plugin->box, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (plugin->box), "draw", - G_CALLBACK (systray_plugin_box_draw), NULL); + G_CALLBACK (systray_plugin_box_draw), plugin); gtk_container_set_border_width (GTK_CONTAINER (plugin->box), FRAME_SPACING); gtk_widget_show (plugin->box); @@ -721,7 +721,32 @@ systray_plugin_box_draw_icon (GtkWidget *child, } +#if GTK_CHECK_VERSION (3, 22, 0) +static void +systray_plugin_box_draw (GtkWidget *box, + cairo_t *cr, + gpointer user_data) +{ + SystrayPlugin *plugin = XFCE_SYSTRAY_PLUGIN (user_data); + GdkScreen *screen; + + panel_return_if_fail (XFCE_IS_SYSTRAY_PLUGIN (plugin)); + panel_return_if_fail (cr != NULL); + + screen = gtk_widget_get_screen (GTK_WIDGET (plugin)); + if (G_LIKELY (screen != NULL)) + { + if (!gdk_screen_is_composited (screen)) + return; + } + + /* separately draw all the composed tray icons after gtk + * handled the draw event */ + gtk_container_foreach (GTK_CONTAINER (box), + (GtkCallback) systray_plugin_box_draw_icon, cr); +} +#else static void systray_plugin_box_draw (GtkWidget *box, cairo_t *cr, @@ -737,6 +762,7 @@ systray_plugin_box_draw (GtkWidget *box, gtk_container_foreach (GTK_CONTAINER (box), (GtkCallback) systray_plugin_box_draw_icon, cr); } +#endif -- 2.14.3