[cheese] Add a photo-taken signal, which passes a pixbuf



commit 5bb282a5d967bb356369bcc9ae2301a4b62a45af
Author: Bastien Nocera <hadess hadess net>
Date:   Wed Dec 2 12:57:43 2009 +0000

    Add a photo-taken signal, which passes a pixbuf
    
    https://bugzilla.gnome.org/show_bug.cgi?id=603595

 libcheese/cheese-camera.c |   45 ++++++++++++++++++++++++++++++++++++++++-----
 libcheese/cheese-camera.h |    1 +
 2 files changed, 41 insertions(+), 5 deletions(-)
---
diff --git a/libcheese/cheese-camera.c b/libcheese/cheese-camera.c
index a45c1db..f43cde7 100644
--- a/libcheese/cheese-camera.c
+++ b/libcheese/cheese-camera.c
@@ -110,6 +110,7 @@ enum
 enum
 {
   PHOTO_SAVED,
+  PHOTO_TAKEN,
   VIDEO_SAVED,
   LAST_SIGNAL
 };
@@ -244,14 +245,22 @@ cheese_camera_photo_data_cb (GstElement *element, GstBuffer *buffer,
                                      FALSE, bits_per_pixel, width, height, stride,
                                      NULL, NULL);
 
-  gdk_pixbuf_save (pixbuf, priv->photo_filename, "jpeg", NULL, NULL);
-  g_object_unref (G_OBJECT (pixbuf));
-
   g_signal_handler_disconnect (G_OBJECT (priv->photo_sink),
-                               priv->photo_handler_signal_id);
+			       priv->photo_handler_signal_id);
   priv->photo_handler_signal_id = 0;
 
-  g_signal_emit (camera, camera_signals[PHOTO_SAVED], 0);
+  if (priv->photo_filename != NULL) {
+    gdk_pixbuf_save (pixbuf, priv->photo_filename, "jpeg", NULL, NULL);
+    g_object_unref (G_OBJECT (pixbuf));
+
+    g_free (priv->photo_filename);
+    priv->photo_filename = NULL;
+
+    g_signal_emit (camera, camera_signals[PHOTO_SAVED], 0);
+  } else {
+    g_signal_emit (camera, camera_signals[PHOTO_TAKEN], 0, pixbuf);
+    g_object_unref (pixbuf);
+  }
 }
 
 static void
@@ -1435,6 +1444,25 @@ cheese_camera_take_photo (CheeseCamera *camera, char *filename)
   return TRUE;
 }
 
+gboolean
+cheese_camera_take_photo_pixbuf (CheeseCamera *camera)
+{
+  CheeseCameraPrivate *priv = CHEESE_CAMERA_GET_PRIVATE (camera);
+
+  if (priv->photo_handler_signal_id != 0)
+  {
+    g_print ("Still waiting for previous photo data, ignoring new request\n");
+    return FALSE;
+  }
+
+  /* Take the photo by connecting the handoff signal */
+  priv->photo_handler_signal_id = g_signal_connect (G_OBJECT (priv->photo_sink),
+                                                    "handoff",
+                                                    G_CALLBACK (cheese_camera_photo_data_cb),
+                                                    camera);
+  return TRUE;
+}
+
 static void
 cheese_camera_finalize (GObject *object)
 {
@@ -1553,6 +1581,13 @@ cheese_camera_class_init (CheeseCameraClass *klass)
                                               g_cclosure_marshal_VOID__VOID,
                                               G_TYPE_NONE, 0);
 
+  camera_signals[PHOTO_TAKEN] = g_signal_new ("photo-taken", G_OBJECT_CLASS_TYPE (klass),
+                                              G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                                              G_STRUCT_OFFSET (CheeseCameraClass, photo_taken),
+                                              NULL, NULL,
+                                              g_cclosure_marshal_VOID__OBJECT,
+                                              G_TYPE_NONE, 1, GDK_TYPE_PIXBUF);
+
   camera_signals[VIDEO_SAVED] = g_signal_new ("video-saved", G_OBJECT_CLASS_TYPE (klass),
                                               G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                                               G_STRUCT_OFFSET (CheeseCameraClass, video_saved),
diff --git a/libcheese/cheese-camera.h b/libcheese/cheese-camera.h
index 7bc9e5d..ee9f336 100644
--- a/libcheese/cheese-camera.h
+++ b/libcheese/cheese-camera.h
@@ -91,6 +91,7 @@ typedef struct
 {
   GObjectClass parent_class;
   void (*photo_saved)(CheeseCamera *camera);
+  void (*photo_taken)(CheeseCamera *camera);
   void (*video_saved)(CheeseCamera *camera);
 } CheeseCameraClass;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]