1
From e15e168484dbdad0466216cdffe0f899db747d21 Mon Sep 17 00:00:00 2001
2
From: Lennart Poettering <lennart@poettering.net>
3
Date: Sat, 19 Sep 2009 20:32:33 +0200
4
Subject: [PATCH 09/11] gtk: initialize window.desktop property by default
8
src/canberra-gtk-module.c | 14 +++++-----
9
src/canberra-gtk.c | 59 ++++++++++++++++++++++++++++++++++++--------
10
3 files changed, 57 insertions(+), 19 deletions(-)
12
diff --git a/src/Makefile.am b/src/Makefile.am
13
index ee7bf57..8da9334 100644
16
@@ -26,7 +26,8 @@ gnomeautostartdir = $(datadir)/gnome/autostart
18
gdmautostartdir = $(datadir)/gdm/autostart/LoginWindow/
20
-AM_CFLAGS = $(PTHREAD_CFLAGS) -DCA_PLUGIN_PATH=\"$(plugindir)\"
21
+#AM_CFLAGS = $(PTHREAD_CFLAGS) -DCA_PLUGIN_PATH=\"$(plugindir)\"
22
+AM_CFLAGS = $(PTHREAD_CFLAGS) -DCA_PLUGIN_PATH=\"/home/lennart/projects/libcanberra/src/.libs\"
23
AM_CXXFLAGS = $(PTHREAD_CFLAGS)
24
AM_LDADD = $(PTHREAD_LIBS)
26
diff --git a/src/canberra-gtk-module.c b/src/canberra-gtk-module.c
27
index d0070c1..f9b5463 100644
28
--- a/src/canberra-gtk-module.c
29
+++ b/src/canberra-gtk-module.c
30
@@ -306,9 +306,9 @@ static gint window_get_desktop(GdkDisplay *d, GdkWindow *w) {
33
if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), GDK_WINDOW_XID(w),
34
- gdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"),
35
- 0, G_MAXLONG, False, XA_CARDINAL, &type_return,
36
- &format_return, &nitems_return, &bytes_after_return,
37
+ gdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"),
38
+ 0, G_MAXLONG, False, XA_CARDINAL, &type_return,
39
+ &format_return, &nitems_return, &bytes_after_return,
43
@@ -334,10 +334,10 @@ static gint display_get_desktop(GdkDisplay *d) {
46
if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), DefaultRootWindow(GDK_DISPLAY_XDISPLAY(d)),
47
- gdk_x11_get_xatom_by_name_for_display(d, "_NET_CURRENT_DESKTOP"),
48
- 0, G_MAXLONG, False, XA_CARDINAL, &type_return,
49
- &format_return, &nitems_return, &bytes_after_return,
51
+ gdk_x11_get_xatom_by_name_for_display(d, "_NET_CURRENT_DESKTOP"),
52
+ 0, G_MAXLONG, False, XA_CARDINAL, &type_return,
53
+ &format_return, &nitems_return, &bytes_after_return,
57
if (type_return == XA_CARDINAL && format_return == 32 && data) {
58
diff --git a/src/canberra-gtk.c b/src/canberra-gtk.c
59
index b03eba6..cc6719b 100644
60
--- a/src/canberra-gtk.c
61
+++ b/src/canberra-gtk.c
66
+#include <X11/Xatom.h>
69
#include "canberra-gtk.h"
70
@@ -167,6 +168,34 @@ static GtkWindow* get_toplevel(GtkWidget *w) {
74
+static gint window_get_desktop(GdkDisplay *d, GdkWindow *w) {
77
+ gulong nitems_return;
78
+ gulong bytes_after_return;
79
+ guchar *data = NULL;
82
+ if (XGetWindowProperty(GDK_DISPLAY_XDISPLAY(d), GDK_WINDOW_XID(w),
83
+ gdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"),
84
+ 0, G_MAXLONG, False, XA_CARDINAL, &type_return,
85
+ &format_return, &nitems_return, &bytes_after_return,
89
+ if (type_return == XA_CARDINAL && format_return == 32 && data) {
90
+ guint32 desktop = *(guint32*) data;
92
+ if (desktop != 0xFFFFFFFF)
93
+ ret = (gint) desktop;
96
+ if (type_return != None && data != NULL)
103
* ca_gtk_proplist_set_for_widget:
104
* @p: The proplist to store these sound event properties in
105
@@ -217,19 +246,29 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) {
106
if (GTK_WIDGET_REALIZED(GTK_WIDGET(w))) {
107
GdkWindow *dw = NULL;
108
GdkScreen *screen = NULL;
109
- gint x = 0, y = 0, width = 0, height = 0, screen_width = 0, screen_height = 0;
110
+ GdkDisplay *display = NULL;
111
+ gint x = -1, y = -1, width = -1, height = -1, screen_width = -1, screen_height = -1;
113
if ((dw = gtk_widget_get_window(GTK_WIDGET(w))))
114
if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_XID, "%lu", (unsigned long) GDK_WINDOW_XID(dw))) < 0)
118
- if ((screen = gtk_widget_get_screen(GTK_WIDGET(w)))) {
120
- if ((t = gdk_display_get_name(gdk_screen_get_display(screen))))
121
+ if ((display = gtk_widget_get_display(GTK_WIDGET(w)))) {
122
+ if ((t = gdk_display_get_name(display)))
123
if ((ret = ca_proplist_sets(p, CA_PROP_WINDOW_X11_DISPLAY, t)) < 0)
127
+ gint desktop = window_get_desktop(display, dw);
130
+ if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_DESKTOP, "%i", desktop)) < 0)
135
+ if ((screen = gtk_widget_get_screen(GTK_WIDGET(w)))) {
137
if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_SCREEN, "%i", gdk_screen_get_number(screen))) < 0)
140
@@ -260,11 +299,10 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) {
141
if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_HEIGHT, "%i", height)) < 0)
144
- if (x > 0 && width > 0) {
147
+ if (x >= 0 && width > 0) {
148
screen_width = gdk_screen_get_width(gtk_widget_get_screen(GTK_WIDGET(w)));
151
x = CA_CLAMP(x, 0, screen_width-1);
153
/* We use these strange format strings here to avoid that libc
154
@@ -275,11 +313,10 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) {
158
- if (y > 0 && height > 0) {
161
+ if (y >= 0 && height > 0) {
162
screen_height = gdk_screen_get_height(gtk_widget_get_screen(GTK_WIDGET(w)));
165
y = CA_CLAMP(y, 0, screen_height-1);
167
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)