[gnome-flashback] libdesktop-background: make sure nautilus is on top
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-flashback] libdesktop-background: make sure nautilus is on top
- Date: Sat, 27 Sep 2014 00:05:04 +0000 (UTC)
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]