88
91
g_signal_handlers_disconnect_by_func (monitor->screen,
89
92
panel_background_monitor_changed, monitor);
91
if (monitor->gdkpixmap)
92
g_object_unref (monitor->gdkpixmap);
93
monitor->gdkpixmap = NULL;
95
cairo_surface_destroy (monitor->surface);
96
monitor->surface= NULL;
95
98
if (monitor->gdkpixbuf)
96
99
g_object_unref (monitor->gdkpixbuf);
127
130
monitor->gdkatom = gdk_atom_intern_static_string ("_XROOTPMAP_ID");
128
131
monitor->xatom = gdk_x11_atom_to_xatom (monitor->gdkatom);
130
monitor->gdkpixmap = NULL;
133
monitor->surface = NULL;
131
134
monitor->gdkpixbuf = NULL;
133
136
monitor->display_grabbed = FALSE;
148
151
G_CALLBACK (panel_background_monitor_changed), monitor);
150
153
monitor->gdkwindow = gdk_screen_get_root_window (screen);
151
monitor->xwindow = gdk_x11_drawable_get_xid (monitor->gdkwindow);
154
monitor->xwindow = GDK_WINDOW_XID (monitor->gdkwindow);
153
156
gdk_window_add_filter (
154
157
monitor->gdkwindow, panel_background_monitor_xevent_filter, monitor);
203
206
panel_background_monitor_changed (PanelBackgroundMonitor *monitor)
205
if (monitor->gdkpixmap)
206
g_object_unref (monitor->gdkpixmap);
207
monitor->gdkpixmap = NULL;
208
if (monitor->surface)
209
cairo_surface_destroy (monitor->surface);
210
monitor->surface = NULL;
209
212
if (monitor->gdkpixbuf)
210
213
g_object_unref (monitor->gdkpixbuf);
234
237
return GDK_FILTER_CONTINUE;
238
panel_background_monitor_setup_pixmap (PanelBackgroundMonitor *monitor)
240
Pixmap *prop_data = NULL;
243
g_assert (monitor->display_grabbed);
245
if (!gdk_property_get (
246
monitor->gdkwindow, monitor->gdkatom,
247
gdk_x11_xatom_to_atom (XA_PIXMAP), 0, 10,
248
FALSE, &prop_type, NULL, NULL, (gpointer) &prop_data))
251
if ((prop_type == GDK_TARGET_PIXMAP) && prop_data && prop_data [0]) {
254
g_assert (monitor->gdkpixmap == NULL);
256
display = gdk_screen_get_display (monitor->screen);
258
monitor->gdkpixmap = gdk_pixmap_foreign_new_for_display (display,
261
if (!monitor->gdkpixmap)
262
g_warning ("couldn't get background pixmap\n");
268
240
static GdkPixbuf *
269
241
panel_background_monitor_tile_background (PanelBackgroundMonitor *monitor,
343
314
gdk_x11_display_grab (display);
344
315
monitor->display_grabbed = TRUE;
346
if (!monitor->gdkpixmap)
347
panel_background_monitor_setup_pixmap (monitor);
317
if (!monitor->surface)
318
monitor->surface = gnome_bg_get_surface_from_root (monitor->screen);
349
if (!monitor->gdkpixmap) {
320
if (!monitor->surface) {
321
g_warning ("couldn't get background pixmap\n");
350
322
gdk_x11_display_ungrab (display);
351
323
monitor->display_grabbed = FALSE;
355
gdk_drawable_get_size (
356
GDK_DRAWABLE (monitor->gdkpixmap), &pwidth, &pheight);
327
pwidth = cairo_xlib_surface_get_width (monitor->surface);
328
pheight = cairo_xlib_surface_get_height (monitor->surface);
358
330
gdk_window_get_geometry (monitor->gdkwindow,
359
NULL, NULL, &rwidth, &rheight, NULL);
331
NULL, NULL, &rwidth, &rheight);
361
333
monitor->width = MIN (pwidth, rwidth);
362
334
monitor->height = MIN (pheight, rheight);
364
colormap = gdk_drawable_get_colormap (monitor->gdkwindow);
366
336
g_assert (monitor->gdkpixbuf == NULL);
367
monitor->gdkpixbuf = gdk_pixbuf_get_from_drawable (
368
NULL, monitor->gdkpixmap, colormap,
370
monitor->width, monitor->height);
337
monitor->gdkpixbuf = gdk_pixbuf_get_from_surface (monitor->surface,
338
0, 0, monitor->width, monitor->height);
372
340
gdk_x11_display_ungrab (display);
373
341
monitor->display_grabbed = FALSE;