From e15e168484dbdad0466216cdffe0f899db747d21 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 19 Sep 2009 20:32:33 +0200 Subject: gtk: initialize window.desktop property by default --- src/Makefile.am | 3 ++- src/canberra-gtk-module.c | 14 +++++------ src/canberra-gtk.c | 59 ++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 57 insertions(+), 19 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index ee7bf57..8da9334 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -26,7 +26,8 @@ gnomeautostartdir = $(datadir)/gnome/autostart gdmautostartdir = $(datadir)/gdm/autostart/LoginWindow/ -AM_CFLAGS = $(PTHREAD_CFLAGS) -DCA_PLUGIN_PATH=\"$(plugindir)\" +#AM_CFLAGS = $(PTHREAD_CFLAGS) -DCA_PLUGIN_PATH=\"$(plugindir)\" +AM_CFLAGS = $(PTHREAD_CFLAGS) -DCA_PLUGIN_PATH=\"/home/lennart/projects/libcanberra/src/.libs\" AM_CXXFLAGS = $(PTHREAD_CFLAGS) AM_LDADD = $(PTHREAD_LIBS) diff --git a/src/canberra-gtk-module.c b/src/canberra-gtk-module.c index d0070c1..f9b5463 100644 --- a/src/canberra-gtk-module.c +++ b/src/canberra-gtk-module.c @@ -306,9 +306,9 @@ static gint window_get_desktop(GdkDisplay *d, GdkWindow *w) { gint ret = -1; if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), GDK_WINDOW_XID(w), - gdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"), - 0, G_MAXLONG, False, XA_CARDINAL, &type_return, - &format_return, &nitems_return, &bytes_after_return, + gdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"), + 0, G_MAXLONG, False, XA_CARDINAL, &type_return, + &format_return, &nitems_return, &bytes_after_return, &data) != Success) return -1; @@ -334,10 +334,10 @@ static gint display_get_desktop(GdkDisplay *d) { gint ret = -1; if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), DefaultRootWindow(GDK_DISPLAY_XDISPLAY(d)), - gdk_x11_get_xatom_by_name_for_display(d, "_NET_CURRENT_DESKTOP"), - 0, G_MAXLONG, False, XA_CARDINAL, &type_return, - &format_return, &nitems_return, &bytes_after_return, - &data) != Success) + gdk_x11_get_xatom_by_name_for_display(d, "_NET_CURRENT_DESKTOP"), + 0, G_MAXLONG, False, XA_CARDINAL, &type_return, + &format_return, &nitems_return, &bytes_after_return, + &data) != Success) return -1; if (type_return == XA_CARDINAL && format_return == 32 && data) { diff --git a/src/canberra-gtk.c b/src/canberra-gtk.c index b03eba6..cc6719b 100644 --- a/src/canberra-gtk.c +++ b/src/canberra-gtk.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "canberra.h" #include "canberra-gtk.h" @@ -167,6 +168,34 @@ static GtkWindow* get_toplevel(GtkWidget *w) { return GTK_WINDOW(w); } +static gint window_get_desktop(GdkDisplay *d, GdkWindow *w) { + Atom type_return; + gint format_return; + gulong nitems_return; + gulong bytes_after_return; + guchar *data = NULL; + gint ret = -1; + + if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), GDK_WINDOW_XID(w), + gdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"), + 0, G_MAXLONG, False, XA_CARDINAL, &type_return, + &format_return, &nitems_return, &bytes_after_return, + &data) != Success) + return -1; + + if (type_return == XA_CARDINAL && format_return == 32 && data) { + guint32 desktop = *(guint32*) data; + + if (desktop != 0xFFFFFFFF) + ret = (gint) desktop; + } + + if (type_return != None && data != NULL) + XFree(data); + + return ret; +} + /** * ca_gtk_proplist_set_for_widget: * @p: The proplist to store these sound event properties in @@ -217,19 +246,29 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) { if (GTK_WIDGET_REALIZED(GTK_WIDGET(w))) { GdkWindow *dw = NULL; GdkScreen *screen = NULL; - gint x = 0, y = 0, width = 0, height = 0, screen_width = 0, screen_height = 0; + GdkDisplay *display = NULL; + gint x = -1, y = -1, width = -1, height = -1, screen_width = -1, screen_height = -1; if ((dw = gtk_widget_get_window(GTK_WIDGET(w)))) if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_XID, "%lu", (unsigned long) GDK_WINDOW_XID(dw))) < 0) return ret; - - if ((screen = gtk_widget_get_screen(GTK_WIDGET(w)))) { - - if ((t = gdk_display_get_name(gdk_screen_get_display(screen)))) + if ((display = gtk_widget_get_display(GTK_WIDGET(w)))) { + if ((t = gdk_display_get_name(display))) if ((ret = ca_proplist_sets(p, CA_PROP_WINDOW_X11_DISPLAY, t)) < 0) return ret; + if (dw) { + gint desktop = window_get_desktop(display, dw); + + if (desktop >= 0) + if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_DESKTOP, "%i", desktop)) < 0) + return ret; + } + } + + if ((screen = gtk_widget_get_screen(GTK_WIDGET(w)))) { + if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_SCREEN, "%i", gdk_screen_get_number(screen))) < 0) return ret; @@ -260,11 +299,10 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) { if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_HEIGHT, "%i", height)) < 0) return ret; - if (x > 0 && width > 0) { - x += width/2; - + if (x >= 0 && width > 0) { screen_width = gdk_screen_get_width(gtk_widget_get_screen(GTK_WIDGET(w))); + x += width/2; x = CA_CLAMP(x, 0, screen_width-1); /* We use these strange format strings here to avoid that libc @@ -275,11 +313,10 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) { return ret; } - if (y > 0 && height > 0) { - y += height/2; - + if (y >= 0 && height > 0) { screen_height = gdk_screen_get_height(gtk_widget_get_screen(GTK_WIDGET(w))); + y += height/2; y = CA_CLAMP(y, 0, screen_height-1); if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_VPOS, "%i.%03i", (int) (y/(screen_height-1)), (int) (1000.0*y/(screen_height-1)) % 1000)) < 0) -- cgit