[gnome-flashback] libdesktop-background: make sure nautilus is on top



commit 86e8bb31d686b17bbc32a64b08c9f8c18aa54733
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sat Sep 27 02:56:30 2014 +0300

    libdesktop-background: make sure nautilus is on top
    
    Another attempt to make sure that nautilus desktop window is on top
    of our background window.

 .../libdesktop-background/desktop-background.c     |  138 ++++++++++++++++++++
 .../libdesktop-background/desktop-window.c         |  123 -----------------
 2 files changed, 138 insertions(+), 123 deletions(-)
---
diff --git a/gnome-flashback/libdesktop-background/desktop-background.c 
b/gnome-flashback/libdesktop-background/desktop-background.c
index 4d8e7b9..9583f2b 100644
--- a/gnome-flashback/libdesktop-background/desktop-background.c
+++ b/gnome-flashback/libdesktop-background/desktop-background.c
@@ -16,6 +16,8 @@
  */
 
 #include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+#include <X11/Xatom.h>
 #include <libgnome-desktop/gnome-bg.h>
 
 #include "desktop-window.h"
@@ -39,6 +41,138 @@ struct _DesktopBackgroundPrivate {
 
 G_DEFINE_TYPE_WITH_PRIVATE (DesktopBackground, desktop_background, G_TYPE_OBJECT);
 
+static gboolean
+is_nautilus_desktop_manager (void)
+{
+       GdkDisplay *display;
+       GdkScreen  *screen;
+       gchar      *name;
+       Atom        atom;
+       Window      window;
+
+       display = gdk_display_get_default ();
+       screen = gdk_display_get_default_screen (display);
+
+       name = g_strdup_printf ("_NET_DESKTOP_MANAGER_S%d", gdk_screen_get_number (screen));
+       atom = XInternAtom (GDK_DISPLAY_XDISPLAY (display), name, FALSE);
+       g_free (name);
+
+       window = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display), atom);
+
+       if (window != None)
+               return TRUE;
+
+       return FALSE;
+}
+
+static gboolean
+is_desktop_window (Display *display,
+                   Window   window)
+{
+       Atom           type;
+       Atom          *atoms;
+       int            result;
+       int            format;
+       unsigned long  items;
+       unsigned long  left;
+       unsigned char *data;
+
+       result = XGetWindowProperty (display, window,
+                                    XInternAtom (display, "_NET_WM_WINDOW_TYPE", False),
+                                    0L, 1L, False, XA_ATOM, &type, &format,
+                                    &items, &left, &data);
+
+       if (result != Success)
+               return FALSE;
+
+       atoms = (Atom *) data;
+
+       if (items && atoms[0] == XInternAtom (display, "_NET_WM_WINDOW_TYPE_DESKTOP", False)) {
+               XFree (data);
+               return TRUE;
+       }
+
+       XFree (data);
+       return FALSE;
+}
+
+static GdkWindow *
+get_nautilus_window (DesktopBackground *background)
+{
+       GdkDisplay    *display;
+       GdkWindow     *window;
+       Display       *xdisplay;
+       Atom           type;
+       int            result;
+       int            format;
+       unsigned long  items;
+       unsigned long  left;
+       unsigned char *list;
+       int            i;
+       Window        *windows;
+       Window         nautilus;
+       Window         desktop;
+
+       gdk_error_trap_push ();
+
+       display = gdk_display_get_default ();
+       xdisplay = GDK_DISPLAY_XDISPLAY (display);
+       result = XGetWindowProperty (xdisplay, XDefaultRootWindow (xdisplay),
+                                    XInternAtom (xdisplay, "_NET_CLIENT_LIST", False),
+                                    0L, 1024L, False, XA_WINDOW, &type, &format,
+                                    &items, &left, &list);
+
+       if (result != Success) {
+               gdk_error_trap_pop_ignored ();
+               return NULL;
+       }
+
+       nautilus = None;
+       desktop = GDK_WINDOW_XID (gtk_widget_get_window (background->priv->background));
+       windows = (Window *) list;
+       for     (i = 0; i < items; i++) {
+               if (is_desktop_window (xdisplay, windows[i]) && windows[i] != desktop) {
+                       nautilus = windows[i];
+                       break;
+               }
+       }
+
+       XFree (list);
+
+       window = NULL;
+       if (nautilus != None) {
+               window = gdk_x11_window_foreign_new_for_display (display, nautilus);
+       }
+
+       gdk_error_trap_pop_ignored ();
+
+       return window;
+}
+
+static GdkFilterReturn
+event_filter_func (GdkXEvent *xevent,
+                   GdkEvent  *event,
+                   gpointer   data)
+{
+       DesktopBackground *background = DESKTOP_BACKGROUND (data);
+       static gboolean nautilus_raised = FALSE;
+
+       if (is_nautilus_desktop_manager ()) {
+               if (nautilus_raised == FALSE) {
+                       GdkWindow *nautilus = get_nautilus_window (background);
+
+                       gdk_window_hide (nautilus);
+                       gdk_window_show (nautilus);
+
+                       nautilus_raised = TRUE;
+               }
+       } else {
+               nautilus_raised = FALSE;
+       }
+
+       return GDK_FILTER_CONTINUE;
+}
+
 static void
 free_fade (DesktopBackground *background)
 {
@@ -273,6 +407,8 @@ desktop_background_finalize (GObject *object)
        g_clear_object (&priv->gnome_settings);
        g_clear_object (&priv->background_settings);
 
+       gdk_window_remove_filter (NULL, event_filter_func, background);
+
        G_OBJECT_CLASS (desktop_background_parent_class)->finalize (object);
 }
 
@@ -311,6 +447,8 @@ desktop_background_init (DesktopBackground *background)
                          G_CALLBACK (desktop_background_update), background);
 
        queue_background_change (background);
+
+       gdk_window_add_filter (NULL, event_filter_func, background);
 }
 
 static void
diff --git a/gnome-flashback/libdesktop-background/desktop-window.c 
b/gnome-flashback/libdesktop-background/desktop-window.c
index ee0cdd6..41a01a5 100644
--- a/gnome-flashback/libdesktop-background/desktop-window.c
+++ b/gnome-flashback/libdesktop-background/desktop-window.c
@@ -33,110 +33,6 @@ enum {
 
 static guint signals [LAST_SIGNAL] = { 0 };
 
-static Atom _NET_CLIENT_LIST = None;
-static Atom _NET_WM_WINDOW_TYPE = None;
-static Atom _NET_WM_WINDOW_TYPE_DESKTOP = None;
-
-static Window *
-get_windows (Display       *display,
-             unsigned long *items)
-{
-       Atom           type;
-       unsigned long  left;
-    unsigned char *list;
-    int            result;
-    int            format;
-
-       result = XGetWindowProperty (display, XDefaultRootWindow (display), _NET_CLIENT_LIST,
-                                    0L, 1024L, False, XA_WINDOW, &type, &format,
-                                    items, &left, &list);
-
-       if (result != Success)
-               return (Window *) 0;
-
-       return (Window *) list;
-}
-
-static gboolean
-is_desktop_window (Display *display,
-                   Window   window)
-{
-       Atom           type;
-       Atom          *atoms;
-       int            result;
-       int            format;
-       unsigned long  items;
-       unsigned long  left;
-       unsigned char *data;
-
-       result = XGetWindowProperty (display, window, _NET_WM_WINDOW_TYPE,
-                                    0L, 1L, False, XA_ATOM, &type, &format,
-                                    &items, &left, &data);
-
-       if (result != Success)
-               return FALSE;
-
-       atoms = (Atom *) data;
-
-       if (items && atoms[0] == _NET_WM_WINDOW_TYPE_DESKTOP) {
-               XFree (data);
-               return TRUE;
-       }
-
-       XFree (data);
-       return FALSE;
-}
-
-static Window *
-get_desktop_windows_list (Display       *display,
-                          unsigned long *items)
-{
-       Window        *list;
-       unsigned long  all_items;
-       int            i;
-       Window        *desktops;
-
-       *items = 0;
-       list = get_windows (display, &all_items);
-       desktops = g_new0 (Window, all_items);
-
-       for (i = 0; i < all_items; i++) {
-               if (is_desktop_window (display, list[i])) {
-                       desktops[(*items)++] = list[i];
-               }
-       }
-
-       return desktops;
-}
-
-static void
-desktop_window_ensure_below (GtkWidget *widget)
-{
-       GdkWindow     *our_desktop_window;
-       GdkWindow     *other_desktop_window;
-       GdkDisplay    *display;
-       Window        *list;
-       unsigned long  items;
-       int            i;
-
-       gdk_error_trap_push ();
-
-       our_desktop_window = gtk_widget_get_window (widget);
-       display = gdk_display_get_default ();
-       list = get_desktop_windows_list (gdk_x11_display_get_xdisplay (display), &items);
-
-       for (i = 0; i < items; i++) {
-               other_desktop_window = gdk_x11_window_foreign_new_for_display (display, list[i]);
-               if (other_desktop_window != our_desktop_window) {
-                       gdk_window_raise (other_desktop_window);
-               }
-       }
-
-       gdk_error_trap_pop_ignored ();
-
-       g_free (list);
-}
-
 static void
 desktop_window_screen_changed (GdkScreen *screen,
                                gpointer   user_data)
@@ -217,11 +113,9 @@ desktop_window_init (DesktopWindow *window)
        DesktopWindowPrivate *priv;
        gint                  id;
        GdkScreen            *screen;
-       Display              *display;
 
        priv = window->priv = desktop_window_get_instance_private (window);
        screen = gdk_screen_get_default ();
-       display = gdk_x11_display_get_xdisplay (gdk_display_get_default ());
 
        id = g_signal_connect (screen, "monitors-changed",
                               G_CALLBACK (desktop_window_screen_changed), window);
@@ -232,22 +126,6 @@ desktop_window_init (DesktopWindow *window)
        priv->size_changed_id = id;
 
        desktop_window_screen_changed (screen, window);
-
-       _NET_CLIENT_LIST = XInternAtom (display, "_NET_CLIENT_LIST", False);
-       _NET_WM_WINDOW_TYPE = XInternAtom (display, "_NET_WM_WINDOW_TYPE", False);
-       _NET_WM_WINDOW_TYPE_DESKTOP = XInternAtom (display, "_NET_WM_WINDOW_TYPE_DESKTOP", False);
-}
-
-static gboolean
-desktop_window_configure_event (GtkWidget         *widget,
-                                GdkEventConfigure *event)
-{
-       if (GTK_WIDGET_CLASS (desktop_window_parent_class)->configure_event)
-               GTK_WIDGET_CLASS (desktop_window_parent_class)->configure_event (widget, event);
-
-       desktop_window_ensure_below (widget);
-
-       return TRUE;
 }
 
 static void
@@ -274,7 +152,6 @@ desktop_window_class_init (DesktopWindowClass *class)
        widget_class->realize = desktop_window_relaize;
        widget_class->unrealize = desktop_window_unrelaize;
        widget_class->map = desktop_window_map;
-       widget_class->configure_event = desktop_window_configure_event;
        widget_class->style_updated = desktop_window_style_updated;
 
        signals [UPDATE_SIGNAL] =


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]