57
65
guint fade_timeout_tag;
58
66
} CheeseFlashPrivate;
61
cheese_flash_window_expose_event_cb (GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
65
cr = gdk_cairo_create (gtk_widget_get_window (widget));
66
cairo_set_source_rgb (cr, 1, 1, 1);
67
cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
68
/* Copy-pasted from totem/src/backend/video-utils.c
69
* Waiting on GTK+ bug:
70
* https://bugzilla.gnome.org/show_bug.cgi?id=523574 */
71
#ifdef GDK_WINDOWING_X11
73
get_current_desktop (GdkScreen *screen)
77
Atom current_desktop, type;
79
unsigned long n_items, bytes_after;
80
unsigned char *data_return = NULL;
83
display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen));
84
win = XRootWindow (display, GDK_SCREEN_XNUMBER (screen));
86
current_desktop = XInternAtom (display, "_NET_CURRENT_DESKTOP", True);
88
XGetWindowProperty (display,
93
&type, &format, &n_items, &bytes_after,
96
if (type == XA_CARDINAL && format == 32 && n_items > 0)
97
workspace = (int) data_return[0];
105
get_work_area (GdkScreen *screen,
114
gulong max_len = 4 * 32;
115
guchar *ret_workarea;
122
display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen));
123
workarea = XInternAtom (display, "_NET_WORKAREA", True);
125
disp_screen = GDK_SCREEN_XNUMBER (screen);
127
/* Defaults in case of error */
130
rect->width = gdk_screen_get_width (screen);
131
rect->height = gdk_screen_get_height (screen);
133
if (workarea == None)
136
win = XRootWindow (display, disp_screen);
137
result = XGetWindowProperty (display,
150
if (result != Success
158
desktop = get_current_desktop (screen);
160
workareas = (long *) ret_workarea;
161
rect->x = workareas[desktop * 4];
162
rect->y = workareas[desktop * 4 + 1];
163
rect->width = workareas[desktop * 4 + 2];
164
rect->height = workareas[desktop * 4 + 3];
166
XFree (ret_workarea);
170
#endif /* GDK_WINDOWING_X11 */
173
cheese_flash_window_draw_event_cb (GtkWidget *widget, cairo_t *cr, gpointer user_data)
96
201
/* Don't consume input */
97
202
gtk_widget_realize (GTK_WIDGET (window));
98
GdkRegion *input_region;
99
input_region = gdk_region_new ();
203
input_region = cairo_region_create ();
100
204
gdk_window_input_shape_combine_region (gtk_widget_get_window (GTK_WIDGET (window)), input_region, 0, 0);
101
gdk_region_destroy (input_region);
205
cairo_region_destroy (input_region);
103
g_signal_connect (G_OBJECT (window), "expose-event", G_CALLBACK (cheese_flash_window_expose_event_cb), NULL);
207
g_signal_connect (G_OBJECT (window), "draw", G_CALLBACK (cheese_flash_window_draw_event_cb), NULL);
104
208
priv->window = window;
235
339
parent = gtk_widget_get_toplevel (flash_priv->parent);
236
340
screen = gtk_widget_get_screen (parent);
237
341
monitor = gdk_screen_get_monitor_at_window (screen,
238
gtk_widget_get_window (parent));
342
gtk_widget_get_window (parent));
239
343
gdk_screen_get_monitor_geometry (screen, monitor, &rect);
344
#ifdef GDK_WINDOWING_X11
346
GdkRectangle area, dest;
347
get_work_area (screen, &area);
348
if (gdk_rectangle_intersect (&area, &rect, &dest))
351
#endif /* GDK_WINDOWING_X11 */
240
352
gtk_window_set_transient_for (GTK_WINDOW (flash_window), GTK_WINDOW (parent));
241
353
gtk_window_resize (flash_window, rect.width, rect.height);
242
354
gtk_window_move (flash_window, rect.x, rect.y);