~ubuntu-branches/ubuntu/precise/cheese/precise-proposed

« back to all changes in this revision

Viewing changes to libcheese/cheese-flash.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher, Jeremy Bicha, Robert Ancell
  • Date: 2011-06-10 11:45:37 UTC
  • mfrom: (1.2.24 upstream)
  • Revision ID: james.westby@ubuntu.com-20110610114537-p9e4zl8m0ehf2b5a
Tags: 3.0.0-0ubuntu1
* Upload to oneiric

[ Jeremy Bicha ]
* Depend on gnome-video-effects since clicking Effects when it is
  not installed results in a segmentation fault.

[ Robert Ancell]
* New upstream version
* debian/control:
  - Use standards version 3.9.1
  - Add build-depends on dh-autoreconf, valac, libclutter-1.0-dev,
    libclutter-gtk-1.0-dev, libclutter-gst-dev, libmx-dev,
    gnome-video-effects-dev, libgee-dev, gnome-common, gobject-introspection, 
    libgirepository1.0-dev, gir1.2-freedesktop, gir1.2-glib-2.0, 
    gir1.2-gstreamer-0.10, gir1.2-clutter-1.0, gir1.2-gdkpixbuf-2.0
  - Drop build-depends on libgconf2-dev, libdbus-1-dev, libdbus-glib-1-dev,
  - Bump build-depends on libglib2.0-dev, libgtk-3-dev,
    libgnome-desktop-3-dev, libgstreamer0.10-dev,
    libgstreamer-plugins-base0.10-dev, libcairo2-dev, libpango1.0-dev,
    librsvg2-dev, libcanberra-gtk3-dev
  - Add new gir1.2-cheese-3.0 package
  - libcheese-gtk18 -> libcheese-gtk19
* debian/cheese.install:
* debian/cheese-common.install:
* debian/libcheese-gtk-dev.install
  - Update for new/changed files
* debian/gir1.2-cheese-3.0.install:
  - Install typelib
* debian/patches/fix-linking.patch:
  - Fix linking issues
* debian/patches/no-gnu-gettext.patch:
  - Don't use both AM_GNU_GETTEXT and IT_PROG_INTLTOOL

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
#include <cheese-camera.h>
28
28
#include "cheese-flash.h"
29
29
 
 
30
#ifdef GDK_WINDOWING_X11
 
31
#include <X11/Xproto.h>
 
32
#include <X11/Xlib.h>
 
33
#include <X11/Xutil.h>
 
34
#include <X11/Xatom.h>
 
35
#include <gdk/gdkx.h>
 
36
#endif /* GDK_WINDOWING_X11 */
 
37
 
30
38
enum
31
39
{
32
40
  PROP_0,
57
65
  guint fade_timeout_tag;
58
66
} CheeseFlashPrivate;
59
67
 
60
 
static gboolean
61
 
cheese_flash_window_expose_event_cb (GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
62
 
{
63
 
  cairo_t *cr;
64
 
 
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
 
72
static int
 
73
get_current_desktop (GdkScreen *screen)
 
74
{
 
75
        Display *display;
 
76
        Window win;
 
77
        Atom current_desktop, type;
 
78
        int format;
 
79
        unsigned long n_items, bytes_after;
 
80
        unsigned char *data_return = NULL;
 
81
        int workspace = 0;
 
82
 
 
83
        display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen));
 
84
        win = XRootWindow (display, GDK_SCREEN_XNUMBER (screen));
 
85
 
 
86
        current_desktop = XInternAtom (display, "_NET_CURRENT_DESKTOP", True);
 
87
 
 
88
        XGetWindowProperty (display,
 
89
                            win,
 
90
                            current_desktop,
 
91
                            0, G_MAXLONG,
 
92
                            False, XA_CARDINAL,
 
93
                            &type, &format, &n_items, &bytes_after,
 
94
                            &data_return);
 
95
 
 
96
        if (type == XA_CARDINAL && format == 32 && n_items > 0)
 
97
                workspace = (int) data_return[0];
 
98
        if (data_return)
 
99
                XFree (data_return);
 
100
 
 
101
        return workspace;
 
102
}
 
103
 
 
104
static gboolean
 
105
get_work_area (GdkScreen      *screen,
 
106
               GdkRectangle   *rect)
 
107
{
 
108
        Atom            workarea;
 
109
        Atom            type;
 
110
        Window          win;
 
111
        int             format;
 
112
        gulong          num;
 
113
        gulong          leftovers;
 
114
        gulong          max_len = 4 * 32;
 
115
        guchar         *ret_workarea;
 
116
        long           *workareas;
 
117
        int             result;
 
118
        int             disp_screen;
 
119
        int             desktop;
 
120
        Display        *display;
 
121
 
 
122
        display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen));
 
123
        workarea = XInternAtom (display, "_NET_WORKAREA", True);
 
124
 
 
125
        disp_screen = GDK_SCREEN_XNUMBER (screen);
 
126
 
 
127
        /* Defaults in case of error */
 
128
        rect->x = 0;
 
129
        rect->y = 0;
 
130
        rect->width = gdk_screen_get_width (screen);
 
131
        rect->height = gdk_screen_get_height (screen);
 
132
 
 
133
        if (workarea == None)
 
134
                return FALSE;
 
135
 
 
136
        win = XRootWindow (display, disp_screen);
 
137
        result = XGetWindowProperty (display,
 
138
                                     win,
 
139
                                     workarea,
 
140
                                     0,
 
141
                                     max_len,
 
142
                                     False,
 
143
                                     AnyPropertyType,
 
144
                                     &type,
 
145
                                     &format,
 
146
                                     &num,
 
147
                                     &leftovers,
 
148
                                     &ret_workarea);
 
149
 
 
150
        if (result != Success
 
151
            || type == None
 
152
            || format == 0
 
153
            || leftovers
 
154
            || num % 4) {
 
155
                return FALSE;
 
156
        }
 
157
 
 
158
        desktop = get_current_desktop (screen);
 
159
 
 
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];
 
165
 
 
166
        XFree (ret_workarea);
 
167
 
 
168
        return TRUE;
 
169
}
 
170
#endif /* GDK_WINDOWING_X11 */
 
171
 
 
172
static gboolean
 
173
cheese_flash_window_draw_event_cb (GtkWidget *widget, cairo_t *cr, gpointer user_data)
 
174
{
68
175
  cairo_fill (cr);
69
 
  cairo_destroy (cr);
70
 
 
71
176
  return TRUE;
72
177
}
73
178
 
75
180
cheese_flash_init (CheeseFlash *self)
76
181
{
77
182
  CheeseFlashPrivate *priv = CHEESE_FLASH_GET_PRIVATE (self);
78
 
 
 
183
  cairo_region_t *input_region;
79
184
  GtkWindow *window;
80
185
 
81
186
  priv->flash_timeout_tag = 0;
95
200
 
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);
102
206
 
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;
105
209
}
106
210
 
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
 
345
  {
 
346
    GdkRectangle area, dest;
 
347
    get_work_area (screen, &area);
 
348
    if (gdk_rectangle_intersect (&area, &rect, &dest))
 
349
      rect = dest;
 
350
  }
 
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);