[cheese/cheese-window-refactor] Port CheeseWindow to use CheeseWidget from libcheese-gtk



commit 0613fe23d0907a4d5a3aa3bf7c522b79299652ec
Author: Filippo Argiolas <filippo argiolas gmail com>
Date:   Fri Jan 29 20:52:13 2010 +0100

    Port CheeseWindow to use CheeseWidget from libcheese-gtk
    
    https://bugzilla.gnome.org/show_bug.cgi?id=603610

 data/cheese.ui                    |  109 ++++--------
 libcheese/cheese-gtk.symbols      |    6 +
 libcheese/cheese-widget-private.h |   12 +-
 libcheese/cheese-widget.c         |   24 +++
 src/cheese-window.c               |  371 ++++++-------------------------------
 5 files changed, 130 insertions(+), 392 deletions(-)
---
diff --git a/data/cheese.ui b/data/cheese.ui
index 0be0be5..0d4fd3a 100644
--- a/data/cheese.ui
+++ b/data/cheese.ui
@@ -350,86 +350,11 @@
             <property name="visible">True</property>
             <property name="orientation">vertical</property>
             <child>
-              <object class="GtkNotebook" id="notebook">
+              <object class="GtkAlignment" id="widget_alignment">
                 <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="show_tabs">False</property>
-                <property name="show_border">False</property>
-                <child>
-                  <object class="GtkVBox" id="video_frame_vbox">
-                    <property name="visible">True</property>
-                    <property name="orientation">vertical</property>
-                    <child>
-                      <object class="GtkAlignment" id="info_bar_frame">
-                        <property name="visible">True</property>
-                        <child>
-                          <placeholder/>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkDrawingArea" id="video_screen">
-                        <property name="visible">True</property>
-                      </object>
-                      <packing>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                  </object>
-                </child>
-                <child type="tab">
-                  <placeholder/>
-                </child>
-                <child>
-                  <object class="GtkVBox" id="vbox3">
-                    <property name="visible">True</property>
-                    <property name="orientation">vertical</property>
-                    <child>
-                      <object class="GtkAspectFrame" id="effect_frame">
-                        <property name="visible">True</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                        <property name="label_xalign">0</property>
-                        <property name="shadow_type">none</property>
-                        <property name="ratio">1.3300000429153442</property>
-                        <property name="obey_child">False</property>
-                        <child>
-                          <placeholder/>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkAlignment" id="effect_alignment">
-                        <property name="visible">True</property>
-                        <child>
-                          <placeholder/>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child type="tab">
-                  <placeholder/>
-                </child>
                 <child>
                   <placeholder/>
                 </child>
-                <child type="tab">
-                  <placeholder/>
-                </child>
               </object>
               <packing>
                 <property name="position">0</property>
@@ -717,4 +642,36 @@
       </packing>
     </child>
   </object>
+  <object class="GtkVBox" id="effect_vbox">
+    <property name="visible">True</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkAspectFrame" id="effect_frame">
+        <property name="visible">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <property name="label_xalign">0</property>
+        <property name="shadow_type">none</property>
+        <property name="ratio">1.3300000429153442</property>
+        <property name="obey_child">False</property>
+        <child>
+          <placeholder/>
+        </child>
+      </object>
+      <packing>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkAlignment" id="effect_alignment">
+        <property name="visible">True</property>
+        <child>
+          <placeholder/>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+  </object>
 </interface>
diff --git a/libcheese/cheese-gtk.symbols b/libcheese/cheese-gtk.symbols
index 216a3d8..a0a147d 100644
--- a/libcheese/cheese-gtk.symbols
+++ b/libcheese/cheese-gtk.symbols
@@ -1,5 +1,11 @@
 cheese_widget_get_type
 cheese_widget_new
+cheese_widget_get_camera
+cheese_widget_get_gconf
+cheese_widget_get_video_area
+cheese_gconf_get_type
+cheese_camera_get_type
+cheese_camera_device_get_type
 cheese_avatar_chooser_get_type
 cheese_avatar_chooser_new
 cheese_avatar_chooser_get_picture
diff --git a/libcheese/cheese-widget-private.h b/libcheese/cheese-widget-private.h
index 5fd40b7..2cba699 100644
--- a/libcheese/cheese-widget-private.h
+++ b/libcheese/cheese-widget-private.h
@@ -24,7 +24,17 @@
 
 G_BEGIN_DECLS
 
-GObject *cheese_widget_get_camera (CheeseWidget *widget);
+enum
+{
+  SPINNER_PAGE = 0,
+  WEBCAM_PAGE  = 1,
+  PROBLEM_PAGE = 2,
+  LAST_PAGE = 3,
+};
+
+GObject   *cheese_widget_get_camera (CheeseWidget *widget);
+GObject   *cheese_widget_get_gconf  (CheeseWidget *widget);
+GtkWidget *cheese_widget_get_video_area (CheeseWidget *widget);
 
 G_END_DECLS
 
diff --git a/libcheese/cheese-widget.c b/libcheese/cheese-widget.c
index 4a6a126..58e3f28 100644
--- a/libcheese/cheese-widget.c
+++ b/libcheese/cheese-widget.c
@@ -451,6 +451,18 @@ cheese_widget_new (void)
 }
 
 GObject *
+cheese_widget_get_gconf (CheeseWidget *widget)
+{
+  CheeseWidgetPrivate *priv;
+
+  g_return_val_if_fail (CHEESE_WIDGET (widget), NULL);
+
+  priv = CHEESE_WIDGET_GET_PRIVATE (widget);
+
+  return G_OBJECT (priv->gconf);
+}
+
+GObject *
 cheese_widget_get_camera (CheeseWidget *widget)
 {
   CheeseWidgetPrivate *priv;
@@ -462,6 +474,18 @@ cheese_widget_get_camera (CheeseWidget *widget)
   return G_OBJECT (priv->webcam);
 }
 
+GtkWidget *
+cheese_widget_get_video_area (CheeseWidget *widget)
+{
+ CheeseWidgetPrivate *priv;
+
+  g_return_val_if_fail (CHEESE_WIDGET (widget), NULL);
+
+  priv = CHEESE_WIDGET_GET_PRIVATE (widget);
+
+  return priv->screen;
+}
+
 /*
  * vim: sw=2 ts=8 cindent noai bs=2
  */
diff --git a/src/cheese-window.c b/src/cheese-window.c
index 4cfa576..e4d06fa 100644
--- a/src/cheese-window.c
+++ b/src/cheese-window.c
@@ -48,6 +48,7 @@
 #include "cheese-no-camera.h"
 #include "cheese-prefs-dialog.h"
 #include "cheese-flash.h"
+#include "cheese-widget-private.h"
 
 #define FULLSCREEN_POPUP_HEIGHT    40
 #define FULLSCREEN_TIMEOUT         5 * 1000
@@ -75,13 +76,11 @@ typedef enum
   CAMERA_MODE_BURST
 } CameraMode;
 
-typedef enum
+/* FIXME: don't use page numbers */
+enum
 {
-  PAGE_WEBCAM  = 0,
-  PAGE_EFFECTS = 1,
-  PAGE_SPINNER = 2,
-  PAGE_PROBLEM = 3,
-} CheeseNotebookPage;
+  EFFECTS_PAGE = LAST_PAGE,
+};
 
 typedef struct
 {
@@ -97,10 +96,13 @@ typedef struct
   CheeseGConf *gconf;
   CheeseFileUtil *fileutil;
 
-  GtkWidget *window;
+  /* if you come up with a better name ping me */
+  GtkWidget *thewidget;
+  GtkWidget *video_area;
+
   GtkWidget *fullscreen_popup;
 
-  GtkWidget *notebook;
+  GtkWidget *widget_alignment;
   GtkWidget *notebook_bar;
   GtkWidget *fullscreen_bar;
 
@@ -113,6 +115,7 @@ typedef struct
   GtkWidget *togglegroup_alignment;
 
   GtkWidget *effect_frame;
+  GtkWidget *effect_vbox;
   GtkWidget *effect_alignment;
   GtkWidget *effect_chooser;
   GtkWidget *throbber_align;
@@ -122,9 +125,6 @@ typedef struct
   GtkWidget *countdown_frame_fullscreen;
   GtkWidget *countdown;
   GtkWidget *countdown_fullscreen;
-  GtkWidget *problem_page;
-  GtkWidget *problem_area;
-  GtkWidget *problem_bar;
 
   GtkWidget *button_effects;
   GtkWidget *button_photo;
@@ -151,7 +151,6 @@ typedef struct
   GtkWidget *thumb_view;
   GtkWidget *thumb_view_popup_menu;
 
-  GtkWidget *screen;
   GtkWidget *take_picture;
   GtkWidget *take_picture_fullscreen;
 
@@ -182,131 +181,6 @@ typedef struct
 
 G_DEFINE_TYPE (CheeseWindow, cheese_window, GTK_TYPE_WINDOW);
 
-/* FIXME: some code borrowed from cheese-widget
- * We should really use it directly instead of duplicating stuff here */
-static GdkPixbuf *
-cheese_window_load_pixbuf (GtkWidget  *widget,
-                           const char *icon_name,
-                           guint       size,
-                           GError    **error)
-{
-  GtkIconTheme *theme;
-  GdkPixbuf    *pixbuf;
-
-  theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (widget));
-  if (!gtk_icon_theme_has_icon (theme, icon_name))
-  {
-    pixbuf = gtk_icon_theme_load_icon (theme, "error",
-                                       size, 0, error);
-  }
-  else
-  {
-    pixbuf = gtk_icon_theme_load_icon (theme, icon_name,
-                                       size, 0, error);
-  }
-  return pixbuf;
-}
-
-static gboolean
-cheese_window_logo_expose (GtkWidget      *w,
-                           GdkEventExpose *event,
-                           gpointer        user_data)
-{
-  const char   *icon_name;
-  GdkPixbuf    *pixbuf, *logo;
-  GError       *error = NULL;
-  cairo_t      *cr;
-  GtkAllocation allocation;
-  guint         s_width, s_height, d_width, d_height;
-  float         ratio;
-
-  gdk_draw_rectangle (w->window, w->style->black_gc, TRUE,
-                      0, 0, w->allocation.width, w->allocation.height);
-  icon_name = g_object_get_data (G_OBJECT (w), "icon-name");
-  if (icon_name == NULL)
-    return FALSE;
-
-  cr = gdk_cairo_create (gtk_widget_get_window (w));
-  cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
-  gtk_widget_get_allocation (w, &allocation);
-  cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
-
-  d_width  = allocation.width;
-  d_height = allocation.height - (allocation.height / 3);
-
-  pixbuf = cheese_window_load_pixbuf (w, icon_name, d_height, &error);
-  if (pixbuf == NULL)
-  {
-    g_warning ("Could not load icon '%s': %s", icon_name, error->message);
-    g_error_free (error);
-    return FALSE;
-  }
-
-  s_width  = gdk_pixbuf_get_width (pixbuf);
-  s_height = gdk_pixbuf_get_height (pixbuf);
-
-  if ((gfloat) d_width / s_width > (gfloat) d_height / s_height)
-  {
-    ratio = (gfloat) d_height / s_height;
-  }
-  else
-  {
-    ratio = (gfloat) d_width / s_width;
-  }
-
-  s_width  *= ratio;
-  s_height *= ratio;
-
-  logo = gdk_pixbuf_scale_simple (pixbuf, s_width, s_height, GDK_INTERP_BILINEAR);
-
-  gdk_cairo_set_source_pixbuf (cr, logo, (allocation.width - s_width) / 2, (allocation.height - s_height) / 2);
-  cairo_paint (cr);
-  cairo_destroy (cr);
-
-  g_object_unref (logo);
-  g_object_unref (pixbuf);
-
-  return FALSE;
-}
-
-static void
-cheese_window_set_problem_page (CheeseWindow *window,
-                                const char   *icon_name)
-{
-  CheeseWindowPrivate *priv = CHEESE_WINDOW_GET_PRIVATE (window);
-
-  gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), PAGE_PROBLEM);
-  g_object_set_data_full (G_OBJECT (priv->problem_area),
-                          "icon-name", g_strdup (icon_name), g_free);
-  g_signal_connect (priv->problem_area, "expose-event",
-                    G_CALLBACK (cheese_window_logo_expose), window);
-}
-
-static void
-cheese_window_spinner_invert (GtkWidget *spinner, GtkWidget *parent)
-{
-  GtkStyle *style;
-  guint     i;
-
-  for (i = GTK_STATE_NORMAL; i <= GTK_STATE_INSENSITIVE; i++)
-  {
-    GdkColor *fg, *bg;
-
-    style = gtk_widget_get_style (spinner);
-    fg    = gdk_color_copy (&style->fg[i]);
-    bg    = gdk_color_copy (&style->bg[i]);
-
-    gtk_widget_modify_fg (spinner, i, bg);
-    gtk_widget_modify_bg (spinner, i, fg);
-
-    gtk_widget_modify_fg (parent, i, bg);
-    gtk_widget_modify_bg (parent, i, fg);
-
-    gdk_color_free (fg);
-    gdk_color_free (bg);
-  }
-}
-
 static gboolean
 cheese_window_key_press_event_cb (GtkWidget *win, GdkEventKey *event, CheeseWindow *cheese_window)
 {
@@ -406,7 +280,7 @@ cheese_window_fullscreen_motion_notify_cb (GtkWidget      *widget,
     }
 
     /* don't set the timeout in effect-chooser mode */
-    if (gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook)) != 1)
+    if (gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->thewidget)) != EFFECTS_PAGE)
       cheese_window_fullscreen_set_timeout (cheese_window);
   }
   return FALSE;
@@ -430,12 +304,12 @@ cheese_window_toggle_fullscreen (GtkWidget *widget, CheeseWindow *cheese_window)
     gtk_widget_modify_bg (GTK_WIDGET (cheese_window), GTK_STATE_NORMAL, &bg_color);
 
     gtk_widget_add_events (GTK_WIDGET (cheese_window), GDK_POINTER_MOTION_MASK);
-    gtk_widget_add_events (priv->screen, GDK_POINTER_MOTION_MASK);
+    gtk_widget_add_events (priv->video_area, GDK_POINTER_MOTION_MASK);
 
     g_signal_connect (cheese_window, "motion-notify-event",
                       G_CALLBACK (cheese_window_fullscreen_motion_notify_cb),
                       cheese_window);
-    g_signal_connect (priv->screen, "motion-notify-event",
+    g_signal_connect (priv->video_area, "motion-notify-event",
                       G_CALLBACK (cheese_window_fullscreen_motion_notify_cb),
                       cheese_window);
 
@@ -445,7 +319,7 @@ cheese_window_toggle_fullscreen (GtkWidget *widget, CheeseWindow *cheese_window)
     cheese_window_fullscreen_show_bar (cheese_window);
 
     /* don't set the timeout in effect-chooser mode */
-    if (gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook)) != 1)
+    if (gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->thewidget)) != EFFECTS_PAGE)
       cheese_window_fullscreen_set_timeout (cheese_window);
 
     priv->isFullscreen = TRUE;
@@ -458,7 +332,7 @@ cheese_window_toggle_fullscreen (GtkWidget *widget, CheeseWindow *cheese_window)
 
     g_signal_handlers_disconnect_by_func (cheese_window,
                                           (gpointer) cheese_window_fullscreen_motion_notify_cb, cheese_window);
-    g_signal_handlers_disconnect_by_func (priv->screen,
+    g_signal_handlers_disconnect_by_func (priv->video_area,
                                           (gpointer) cheese_window_fullscreen_motion_notify_cb, cheese_window);
 
     gtk_window_unfullscreen (GTK_WINDOW (cheese_window));
@@ -493,9 +367,9 @@ cheese_window_toggle_wide_mode (GtkWidget *widget, CheeseWindow *cheese_window)
   CheeseWindowPrivate *priv = CHEESE_WINDOW_GET_PRIVATE (cheese_window);
   gboolean toggled = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (widget));
 
-  gtk_widget_set_size_request (priv->notebook,
-                               GTK_WIDGET (priv->notebook)->allocation.width,
-                               GTK_WIDGET (priv->notebook)->allocation.height);
+  gtk_widget_set_size_request (priv->thewidget,
+                               GTK_WIDGET (priv->thewidget)->allocation.width,
+                               GTK_WIDGET (priv->thewidget)->allocation.height);
 
   /* set a single column in wide mode */
   gtk_icon_view_set_columns (GTK_ICON_VIEW (priv->thumb_view), toggled ? 1 : G_MAXINT);
@@ -553,7 +427,7 @@ cheese_window_toggle_wide_mode (GtkWidget *widget, CheeseWindow *cheese_window)
   GtkRequisition req;
   gtk_widget_size_request (GTK_WIDGET (cheese_window), &req);
   gtk_window_resize (GTK_WINDOW (cheese_window), req.width, req.height);
-  gtk_widget_set_size_request (priv->notebook, -1, -1);
+  gtk_widget_set_size_request (priv->thewidget, -1, -1);
 
   g_object_set (priv->gconf, "gconf_prop_wide_mode", toggled, NULL);
 }
@@ -711,7 +585,7 @@ cheese_window_countdown_picture_cb (gpointer data)
   if (cheese_camera_take_photo (priv->camera, photo_filename))
   {
     cheese_flash_fire (priv->flash);
-    ca_gtk_play_for_widget (priv->screen, 0,
+    ca_gtk_play_for_widget (priv->video_area, 0,
                             CA_PROP_EVENT_ID, "camera-shutter",
                             CA_PROP_MEDIA_ROLE, "event",
                             CA_PROP_EVENT_DESCRIPTION, _("Shutter sound"),
@@ -720,6 +594,7 @@ cheese_window_countdown_picture_cb (gpointer data)
   g_free (photo_filename);
 }
 
+#if 0
 static void
 cheese_window_no_camera_info_bar_response (GtkWidget *widget, gint response_id, CheeseWindow *cheese_window)
 {
@@ -743,6 +618,7 @@ cheese_window_no_camera_info_bar_response (GtkWidget *widget, gint response_id,
     }
   }
 }
+#endif
 
 static void
 cheese_window_stop_recording (CheeseWindow *cheese_window)
@@ -948,9 +824,9 @@ void
 cheese_window_effect_button_pressed_cb (GtkWidget *widget, CheeseWindow *cheese_window)
 {
   CheeseWindowPrivate *priv = CHEESE_WINDOW_GET_PRIVATE (cheese_window);
-  if (gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook)) == 1)
+  if (gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->thewidget)) == EFFECTS_PAGE)
   {
-    gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), PAGE_WEBCAM);
+    gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->thewidget), WEBCAM_PAGE);
     gtk_label_set_text_with_mnemonic (GTK_LABEL (priv->label_effects), _("_Effects"));
     gtk_widget_set_sensitive (priv->take_picture, TRUE);
     gtk_widget_set_sensitive (priv->take_picture_fullscreen, TRUE);
@@ -974,7 +850,7 @@ cheese_window_effect_button_pressed_cb (GtkWidget *widget, CheeseWindow *cheese_
   }
   else
   {
-    gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), PAGE_EFFECTS);
+    gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->thewidget), EFFECTS_PAGE);
     gtk_widget_set_sensitive (GTK_WIDGET (priv->take_picture), FALSE);
     gtk_widget_set_sensitive (GTK_WIDGET (priv->take_picture_fullscreen), FALSE);
     gtk_action_group_set_sensitive (priv->actions_photo, FALSE);
@@ -1134,13 +1010,13 @@ setup_widgets_from_builder (CheeseWindow *cheese_window)
   priv->effect_button_alignment     = GTK_WIDGET (gtk_builder_get_object (builder, "effect_button_alignment"));
   priv->toolbar_alignment           = GTK_WIDGET (gtk_builder_get_object (builder, "toolbar_alignment"));
   priv->video_vbox                  = GTK_WIDGET (gtk_builder_get_object (builder, "video_vbox"));
-  priv->notebook                    = GTK_WIDGET (gtk_builder_get_object (builder, "notebook"));
+  priv->widget_alignment            = GTK_WIDGET (gtk_builder_get_object (builder, "widget_alignment"));
   priv->notebook_bar                = GTK_WIDGET (gtk_builder_get_object (builder, "notebook_bar"));
-  priv->screen                      = GTK_WIDGET (gtk_builder_get_object (builder, "video_screen"));
   priv->take_picture                = GTK_WIDGET (gtk_builder_get_object (builder, "take_picture"));
   priv->thumb_scrollwindow          = GTK_WIDGET (gtk_builder_get_object (builder, "thumb_scrollwindow"));
   priv->countdown_frame             = GTK_WIDGET (gtk_builder_get_object (builder, "countdown_frame"));
   priv->effect_frame                = GTK_WIDGET (gtk_builder_get_object (builder, "effect_frame"));
+  priv->effect_vbox                = GTK_WIDGET (gtk_builder_get_object (builder, "effect_vbox"));
   priv->effect_alignment            = GTK_WIDGET (gtk_builder_get_object (builder, "effect_alignment"));
   priv->fullscreen_popup            = GTK_WIDGET (gtk_builder_get_object (builder, "fullscreen_popup"));
   priv->fullscreen_bar              = GTK_WIDGET (gtk_builder_get_object (builder, "fullscreen_notebook_bar"));
@@ -1157,6 +1033,8 @@ setup_widgets_from_builder (CheeseWindow *cheese_window)
   priv->button_exit_fullscreen      = GTK_WIDGET (gtk_builder_get_object (builder, "button_exit_fullscreen"));
 
   gtk_container_add (GTK_CONTAINER (cheese_window), priv->main_vbox);
+  gtk_notebook_append_page (GTK_NOTEBOOK (priv->thewidget),
+                            priv->effect_vbox, NULL);
 
   g_object_unref (builder);
 }
@@ -1274,102 +1152,26 @@ setup_menubar_and_actions (CheeseWindow *cheese_window)
   gtk_activatable_set_related_action (GTK_ACTIVATABLE (priv->button_burst_fullscreen), action);
 }
 
-void
-setup_camera (CheeseWindow *cheese_window)
+static void
+ready_cb (CheeseWidget        *widget,
+          gboolean             is_ready,
+          CheeseWindow        *window)
 {
-  CheeseWindowPrivate *priv = CHEESE_WINDOW_GET_PRIVATE (cheese_window);
-  char   *camera_device = NULL;
-  int     x_resolution;
-  int     y_resolution;
-  gdouble brightness;
-  gdouble contrast;
-  gdouble saturation;
-  gdouble hue;
-
-  GError *error;
-
-  g_object_get (priv->gconf,
-                "gconf_prop_x_resolution", &x_resolution,
-                "gconf_prop_y_resolution", &y_resolution,
-                "gconf_prop_camera", &camera_device,
-                "gconf_prop_brightness", &brightness,
-                "gconf_prop_contrast", &contrast,
-                "gconf_prop_saturation", &saturation,
-                "gconf_prop_hue", &hue,
-                NULL);
-
-  gdk_threads_enter ();
-  priv->camera = cheese_camera_new (priv->screen,
-                                             camera_device, x_resolution,
-                                             y_resolution);
-  gdk_threads_leave ();
-
-  g_free (camera_device);
-
-  error = NULL;
-  cheese_camera_setup (priv->camera, NULL, &error);
-  if (error != NULL)
-  {
-    if (error->code == CHEESE_CAMERA_ERROR_NO_DEVICE)
-    {
-      gdk_threads_enter ();
-      gtk_spinner_stop (GTK_SPINNER (priv->throbber));
-      cheese_window_set_problem_page (cheese_window, "cheese-no-camera");
-      gdk_threads_leave ();
-      return;
-    }
-    GtkWidget *dialog;
-    gchar     *primary, *secondary;
-
-    primary   = g_strdup (_("Check your GStreamer installation"));
-    secondary = g_strdup (error->message);
-
-    gdk_threads_enter ();
-
-    dialog = gtk_message_dialog_new (NULL,
-                                     GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-                                     GTK_MESSAGE_ERROR,
-                                     GTK_BUTTONS_OK,
-                                     "%s", primary);
-    gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog),
-                                                "%s", secondary);
-    gtk_dialog_run (GTK_DIALOG (dialog));
-    gtk_widget_destroy (dialog);
-    g_error_free (error);
-    g_free (primary);
-    g_free (secondary);
-
-    /* Clean up and exit */
-    /* FIXME: handle errors in the infobar and remove this shit */
-    gtk_widget_destroy (GTK_WIDGET (cheese_window));
+  CheeseWindowPrivate *priv = CHEESE_WINDOW_GET_PRIVATE (window);
 
-    gdk_threads_leave ();
-
-    return;
-  }
+  priv->camera = CHEESE_CAMERA (cheese_widget_get_camera (CHEESE_WIDGET (priv->thewidget)));
 
   g_signal_connect (priv->camera, "photo-saved",
-                    G_CALLBACK (cheese_window_photo_saved_cb), cheese_window);
+                    G_CALLBACK (cheese_window_photo_saved_cb), window);
   g_signal_connect (priv->camera, "video-saved",
-                    G_CALLBACK (cheese_window_video_saved_cb), cheese_window);
-
-  cheese_camera_set_effect (priv->camera,
-                            cheese_effect_chooser_get_selection (CHEESE_EFFECT_CHOOSER (priv->effect_chooser)));
-
-  cheese_camera_set_balance_property (priv->camera, "brightness", brightness);
-  cheese_camera_set_balance_property (priv->camera, "contrast", contrast);
-  cheese_camera_set_balance_property (priv->camera, "saturation", saturation);
-  cheese_camera_set_balance_property (priv->camera, "hue", hue);
-
-  cheese_camera_play (priv->camera);
-  gdk_threads_enter ();
-  gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), PAGE_WEBCAM);
-  gtk_spinner_stop (GTK_SPINNER (priv->throbber));
+                    G_CALLBACK (cheese_window_video_saved_cb), window);
 
   gtk_widget_set_sensitive (GTK_WIDGET (priv->take_picture), TRUE);
   gtk_widget_set_sensitive (GTK_WIDGET (priv->take_picture_fullscreen), TRUE);
   gtk_action_group_set_sensitive (priv->actions_effects, TRUE);
-  gdk_threads_leave ();
+
+  cheese_camera_set_effect (priv->camera,
+                            cheese_effect_chooser_get_selection (CHEESE_EFFECT_CHOOSER (priv->effect_chooser)));
 }
 
 void
@@ -1377,39 +1179,27 @@ cheese_window_init (CheeseWindow *cheese_window)
 {
   CheeseWindowPrivate *priv = CHEESE_WINDOW_GET_PRIVATE (cheese_window);
 
-  priv->gconf               = cheese_gconf_new ();
   priv->fileutil            = cheese_fileutil_new ();
   priv->flash               = cheese_flash_new (NULL);
   priv->isFullscreen        = FALSE;
   priv->is_bursting         = FALSE;
   priv->startup_wide        = FALSE;
+  priv->recording           = FALSE;
 
   priv->fullscreen_timeout_source = NULL;
 
+  priv->thewidget = cheese_widget_new ();
+  priv->gconf = CHEESE_GCONF (cheese_widget_get_gconf (CHEESE_WIDGET (priv->thewidget)));
+  priv->video_area = cheese_widget_get_video_area (CHEESE_WIDGET (priv->thewidget));
+
   setup_widgets_from_builder (cheese_window);
   setup_menubar_and_actions (cheese_window);
 
-  /* Problem page */
-  priv->problem_page = gtk_vbox_new (FALSE, 0);
-  priv->problem_bar  = cheese_no_camera_info_bar_new ();
-
-  g_signal_connect (priv->problem_bar,
-                    "response",
-                    G_CALLBACK (cheese_window_no_camera_info_bar_response),
-                    cheese_window);
-
-  priv->problem_area = gtk_drawing_area_new ();
-  gtk_box_pack_start (GTK_BOX (priv->problem_page),
-                      priv->problem_bar,
-                      FALSE, FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (priv->problem_page),
-                      priv->problem_area,
-                      TRUE, TRUE, 0);
-  gtk_notebook_insert_page (GTK_NOTEBOOK (priv->notebook),
-                            priv->problem_page,
-                            gtk_label_new ("got problems"),
-                            PAGE_PROBLEM);
+  g_signal_connect (G_OBJECT (priv->thewidget), "ready",
+                    G_CALLBACK (ready_cb), cheese_window);
 
+  gtk_container_add (GTK_CONTAINER (priv->widget_alignment), priv->thewidget);
+  gtk_widget_show (priv->thewidget);
 
   /* configure the popup position and size */
   GdkScreen *screen = gtk_window_get_screen (GTK_WINDOW (priv->fullscreen_popup));
@@ -1434,7 +1224,6 @@ cheese_window_init (CheeseWindow *cheese_window)
   priv->thumb_nav  = eog_thumb_nav_new (priv->thumb_view, FALSE);
 
   gtk_container_add (GTK_CONTAINER (priv->thumb_scrollwindow), priv->thumb_nav);
-
   /* show the scroll window to get it included in the size requisition done later */
   gtk_widget_show_all (priv->thumb_scrollwindow);
 
@@ -1444,25 +1233,6 @@ cheese_window_init (CheeseWindow *cheese_window)
   gtk_container_add (GTK_CONTAINER (priv->effect_frame), priv->effect_chooser);
   g_free (gconf_effects);
 
-/* uncomment to debug */
-
-/*
- * gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), TRUE);
- * gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->notebook), TRUE);
- */
-
-  priv->throbber       = gtk_spinner_new ();
-  priv->throbber_box   = gtk_event_box_new ();
-  priv->throbber_align = gtk_alignment_new (0.5, 0.5, 0.6, 0.6);
-  gtk_container_add (GTK_CONTAINER (priv->throbber_box), priv->throbber_align);
-  gtk_container_add (GTK_CONTAINER (priv->throbber_align), priv->throbber);
-  gtk_notebook_insert_page (GTK_NOTEBOOK (priv->notebook),
-                            priv->throbber_box,
-                            gtk_label_new ("spinner"),
-                            PAGE_SPINNER);
-  cheese_window_spinner_invert (priv->throbber, priv->throbber_box);
-  gtk_widget_show_all (priv->throbber_box);
-
   priv->countdown = cheese_countdown_new ();
   gtk_container_add (GTK_CONTAINER (priv->countdown_frame), priv->countdown);
   gtk_widget_show (priv->countdown);
@@ -1470,21 +1240,6 @@ cheese_window_init (CheeseWindow *cheese_window)
   priv->countdown_fullscreen = cheese_countdown_new ();
   gtk_container_add (GTK_CONTAINER (priv->countdown_frame_fullscreen), priv->countdown_fullscreen);
 
-  gtk_widget_realize (priv->screen);
-  GdkWindow *win = gtk_widget_get_window (priv->screen);
-  if (!gdk_window_ensure_native (win))
-  {
-    /* FIXME: this breaks offscreen stuff, we should really find
-     * another way to embed video that doesn't require an XID */
-
-    /* abort: no native window, no xoverlay, no cheese. */
-    g_error ("Could not create a native X11 window for the drawing area");
-  }
-  gdk_window_set_back_pixmap (gtk_widget_get_window (priv->screen), NULL, FALSE);
-  gtk_widget_set_app_paintable (priv->screen, TRUE);
-  gtk_widget_set_double_buffered (priv->screen, FALSE);
-  gtk_widget_add_events (priv->screen, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
-
   /* Listen for key presses */
   gtk_widget_add_events (GTK_WIDGET (cheese_window), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
   g_signal_connect (cheese_window, "key_press_event",
@@ -1498,23 +1253,7 @@ cheese_window_init (CheeseWindow *cheese_window)
   g_signal_connect (priv->thumb_view, "button_press_event",
                     G_CALLBACK (cheese_window_button_press_event_cb), cheese_window);
 
-  gtk_spinner_start (GTK_SPINNER (priv->throbber));
-
-  gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), PAGE_SPINNER);
-
-  priv->camera_mode = CAMERA_MODE_PHOTO;
-  priv->recording   = FALSE;
-
   cheese_window_set_mode (cheese_window, CAMERA_MODE_PHOTO);
-
-  /* Run cam setup in its own thread */
-  GError *error = NULL;
-  if (!g_thread_create ((GThreadFunc) setup_camera, cheese_window, FALSE, &error))
-  {
-    g_error ("Failed to create setup thread: %s\n", error->message);
-    g_error_free (error);
-    return;
-  }
 }
 
 static void
@@ -1532,6 +1271,10 @@ cheese_window_constructed (GObject *object)
                 &startup_wide_saved,
                 NULL);
 
+  /* TODO: understand why this is needed for sizing trick below to work */
+  /*       or at least make sure it doesn't cause any harm              */
+  gtk_widget_realize (priv->thewidget);
+
   priv->startup_wide = startup_wide_saved ? TRUE : priv->startup_wide;
 
   if (priv->startup_wide)
@@ -1543,11 +1286,11 @@ cheese_window_constructed (GObject *object)
   /* handy trick to set default size of the drawing area while not
    * limiting its minimum size, thanks Owen! */
   GtkRequisition req;
-  gtk_widget_set_size_request (priv->notebook,
+  gtk_widget_set_size_request (priv->thewidget,
                                DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT);
   gtk_widget_size_request (GTK_WIDGET (window), &req);
   gtk_window_resize (GTK_WINDOW (window), req.width, req.height);
-  gtk_widget_set_size_request (priv->notebook, -1, -1);
+  gtk_widget_set_size_request (priv->thewidget, -1, -1);
 
   gtk_widget_show_all (priv->main_vbox);
 
@@ -1576,7 +1319,6 @@ cheese_window_finalize (GObject *object)
   CheeseWindow *window = CHEESE_WINDOW (object);
   CheeseWindowPrivate *priv = CHEESE_WINDOW_GET_PRIVATE (window);
 
-  g_object_unref (priv->camera);
   g_object_unref (priv->fileutil);
   g_object_unref (priv->actions_main);
   g_object_unref (priv->actions_countdown);
@@ -1589,7 +1331,6 @@ cheese_window_finalize (GObject *object)
   g_object_unref (priv->actions_video);
   g_object_unref (priv->actions_burst);
   g_object_unref (priv->actions_fullscreen);
-  g_object_unref (priv->gconf);
 
   if (G_OBJECT_CLASS (cheese_window_parent_class)->finalize)
     G_OBJECT_CLASS (cheese_window_parent_class)->finalize (object);



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