[cheese/cheese-window-refactor] the widget
- From: Filippo Argiolas <fargiolas src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [cheese/cheese-window-refactor] the widget
- Date: Sun, 31 Jan 2010 10:57:58 +0000 (UTC)
commit 92c90dd2722b04e79b82bd9dea8cf7087fa08634
Author: Filippo Argiolas <filippo argiolas gmail com>
Date: Fri Jan 29 20:52:13 2010 +0100
the widget
cheese-gtk.pc.in | 13 -----
data/cheese.ui | 75 ++++++++++++--------------
libcheese/Makefile.am | 1 -
libcheese/cheese-widget-private.h | 9 +++
libcheese/cheese-widget.c | 12 ++++
src/Makefile.am | 4 +-
src/cheese-window.c | 106 ++++++++++++++++++++++++++-----------
7 files changed, 131 insertions(+), 89 deletions(-)
---
diff --git a/data/cheese.ui b/data/cheese.ui
index 0be0be5..a9f00fb 100644
--- a/data/cheese.ui
+++ b/data/cheese.ui
@@ -372,12 +372,7 @@
</packing>
</child>
<child>
- <object class="GtkDrawingArea" id="video_screen">
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
+ <placeholder/>
</child>
</object>
</child>
@@ -385,41 +380,7 @@
<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>
+ <placeholder/>
</child>
<child type="tab">
<placeholder/>
@@ -717,4 +678,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/Makefile.am b/libcheese/Makefile.am
index bea7082..4828928 100644
--- a/libcheese/Makefile.am
+++ b/libcheese/Makefile.am
@@ -51,7 +51,6 @@ libcheese_gtk_la_LIBADD = \
$(CHEESE_LIBS)
libcheese_gtk_la_LDFLAGS = \
-version-info $(CHEESE_LT_VERSION) \
- -export-symbols $(srcdir)/cheese-gtk.symbols \
-no-undefined \
$(AM_LDFLAGS)
diff --git a/libcheese/cheese-widget-private.h b/libcheese/cheese-widget-private.h
index 5fd40b7..c259a62 100644
--- a/libcheese/cheese-widget-private.h
+++ b/libcheese/cheese-widget-private.h
@@ -24,7 +24,16 @@
G_BEGIN_DECLS
+enum
+{
+ SPINNER_PAGE = 0,
+ WEBCAM_PAGE = 1,
+ PROBLEM_PAGE = 2,
+ CUSTOM_PAGE = 3,
+};
+
GObject *cheese_widget_get_camera (CheeseWidget *widget);
+GObject *cheese_widget_get_gconf (CheeseWidget *widget);
G_END_DECLS
diff --git a/libcheese/cheese-widget.c b/libcheese/cheese-widget.c
index 4a6a126..975c409 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;
diff --git a/src/Makefile.am b/src/Makefile.am
index 04f3a04..680b21b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -51,9 +51,9 @@ cheese_SOURCES = \
cheese-prefs-burst-spinbox.c
cheese_LDADD = \
+ $(CHEESE_LIBS) \
$(top_builddir)/libcheese/libcheesecommon.la \
- $(top_builddir)/libcheese/libcheese-gtk.la \
- $(CHEESE_LIBS)
+ $(top_builddir)/libcheese/libcheese-gtk.la
#dbus
BUILT_SOURCES = cheese-dbus-infos.h
diff --git a/src/cheese-window.c b/src/cheese-window.c
index 4cfa576..cd8ff21 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
@@ -77,10 +78,10 @@ typedef enum
typedef enum
{
- PAGE_WEBCAM = 0,
- PAGE_EFFECTS = 1,
- PAGE_SPINNER = 2,
- PAGE_PROBLEM = 3,
+ PAGE_SPINNER = 0,
+ PAGE_WEBCAM = 1,
+ PAGE_PROBLEM = 2,
+ PAGE_EFFECTS = 3,
} CheeseNotebookPage;
typedef struct
@@ -97,6 +98,8 @@ typedef struct
CheeseGConf *gconf;
CheeseFileUtil *fileutil;
+ GtkWidget *weee;
+
GtkWidget *window;
GtkWidget *fullscreen_popup;
@@ -106,6 +109,7 @@ typedef struct
GtkWidget *main_vbox;
GtkWidget *video_vbox;
+ GtkWidget *video_frame_vbox;
GtkWidget *netbook_alignment;
GtkWidget *toolbar_alignment;
@@ -113,6 +117,7 @@ typedef struct
GtkWidget *togglegroup_alignment;
GtkWidget *effect_frame;
+ GtkWidget *effect_vbox;
GtkWidget *effect_alignment;
GtkWidget *effect_chooser;
GtkWidget *throbber_align;
@@ -275,7 +280,7 @@ cheese_window_set_problem_page (CheeseWindow *window,
{
CheeseWindowPrivate *priv = CHEESE_WINDOW_GET_PRIVATE (window);
- gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), PAGE_PROBLEM);
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->weee), 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",
@@ -406,7 +411,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->weee)) != PAGE_EFFECTS)
cheese_window_fullscreen_set_timeout (cheese_window);
}
return FALSE;
@@ -445,7 +450,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->weee)) != PAGE_EFFECTS)
cheese_window_fullscreen_set_timeout (cheese_window);
priv->isFullscreen = TRUE;
@@ -493,9 +498,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->weee,
+ GTK_WIDGET (priv->weee)->allocation.width,
+ GTK_WIDGET (priv->weee)->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 +558,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->weee, -1, -1);
g_object_set (priv->gconf, "gconf_prop_wide_mode", toggled, NULL);
}
@@ -948,9 +953,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->weee)) == PAGE_EFFECTS)
{
- gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), PAGE_WEBCAM);
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->weee), PAGE_WEBCAM);
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 +979,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->weee), PAGE_EFFECTS);
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 +1139,15 @@ 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->video_frame_vbox = GTK_WIDGET (gtk_builder_get_object (builder, "video_frame_vbox"));
priv->notebook = GTK_WIDGET (gtk_builder_get_object (builder, "notebook"));
priv->notebook_bar = GTK_WIDGET (gtk_builder_get_object (builder, "notebook_bar"));
- priv->screen = GTK_WIDGET (gtk_builder_get_object (builder, "video_screen"));
+// 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 +1164,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->weee),
+ priv->effect_vbox, NULL);
g_object_unref (builder);
}
@@ -1274,6 +1283,7 @@ setup_menubar_and_actions (CheeseWindow *cheese_window)
gtk_activatable_set_related_action (GTK_ACTIVATABLE (priv->button_burst_fullscreen), action);
}
+#if 0
void
setup_camera (CheeseWindow *cheese_window)
{
@@ -1348,11 +1358,6 @@ setup_camera (CheeseWindow *cheese_window)
return;
}
- g_signal_connect (priv->camera, "photo-saved",
- G_CALLBACK (cheese_window_photo_saved_cb), cheese_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)));
@@ -1363,7 +1368,7 @@ setup_camera (CheeseWindow *cheese_window)
cheese_camera_play (priv->camera);
gdk_threads_enter ();
- gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), PAGE_WEBCAM);
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->weee), PAGE_WEBCAM);
gtk_spinner_stop (GTK_SPINNER (priv->throbber));
gtk_widget_set_sensitive (GTK_WIDGET (priv->take_picture), TRUE);
@@ -1371,13 +1376,35 @@ setup_camera (CheeseWindow *cheese_window)
gtk_action_group_set_sensitive (priv->actions_effects, TRUE);
gdk_threads_leave ();
}
+#endif
+
+static void
+ready_cb (CheeseWidget *widget,
+ gboolean is_ready,
+ CheeseWindow *window)
+{
+ CheeseWindowPrivate *priv = CHEESE_WINDOW_GET_PRIVATE (window);
+
+ priv->camera = cheese_widget_get_camera (CHEESE_WIDGET (priv->weee));
+
+ g_signal_connect (priv->camera, "photo-saved",
+ G_CALLBACK (cheese_window_photo_saved_cb), window);
+ g_signal_connect (priv->camera, "video-saved",
+ 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);
+
+ cheese_camera_set_effect (priv->camera,
+ cheese_effect_chooser_get_selection (CHEESE_EFFECT_CHOOSER (priv->effect_chooser)));
+}
void
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;
@@ -1386,8 +1413,19 @@ cheese_window_init (CheeseWindow *cheese_window)
priv->fullscreen_timeout_source = NULL;
+ priv->weee = cheese_widget_new ();
+
setup_widgets_from_builder (cheese_window);
+ g_signal_connect (G_OBJECT (priv->weee), "ready",
+ G_CALLBACK (ready_cb), cheese_window);
+ priv->gconf = CHEESE_GCONF (cheese_widget_get_gconf (CHEESE_WIDGET (priv->weee)));
+
setup_menubar_and_actions (cheese_window);
+ gtk_box_pack_start (GTK_BOX (priv->video_frame_vbox), priv->weee, TRUE, TRUE, 0);
+
+ gtk_widget_show (priv->weee);
+
+#if 0
/* Problem page */
priv->problem_page = gtk_vbox_new (FALSE, 0);
@@ -1409,7 +1447,7 @@ cheese_window_init (CheeseWindow *cheese_window)
priv->problem_page,
gtk_label_new ("got problems"),
PAGE_PROBLEM);
-
+#endif
/* configure the popup position and size */
GdkScreen *screen = gtk_window_get_screen (GTK_WINDOW (priv->fullscreen_popup));
@@ -1444,13 +1482,12 @@ 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);
- */
+/* uncomment to debug */
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->weee), TRUE);
+ gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->weee), TRUE);
+ #if 0
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);
@@ -1462,6 +1499,7 @@ cheese_window_init (CheeseWindow *cheese_window)
PAGE_SPINNER);
cheese_window_spinner_invert (priv->throbber, priv->throbber_box);
gtk_widget_show_all (priv->throbber_box);
+#endif
priv->countdown = cheese_countdown_new ();
gtk_container_add (GTK_CONTAINER (priv->countdown_frame), priv->countdown);
@@ -1470,6 +1508,7 @@ cheese_window_init (CheeseWindow *cheese_window)
priv->countdown_fullscreen = cheese_countdown_new ();
gtk_container_add (GTK_CONTAINER (priv->countdown_frame_fullscreen), priv->countdown_fullscreen);
+#if 0
gtk_widget_realize (priv->screen);
GdkWindow *win = gtk_widget_get_window (priv->screen);
if (!gdk_window_ensure_native (win))
@@ -1484,6 +1523,7 @@ cheese_window_init (CheeseWindow *cheese_window)
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);
+#endif
/* Listen for key presses */
gtk_widget_add_events (GTK_WIDGET (cheese_window), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
@@ -1498,15 +1538,18 @@ 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);
+#if 0
gtk_spinner_start (GTK_SPINNER (priv->throbber));
gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), PAGE_SPINNER);
+#endif
priv->camera_mode = CAMERA_MODE_PHOTO;
priv->recording = FALSE;
cheese_window_set_mode (cheese_window, CAMERA_MODE_PHOTO);
+#if 0
/* Run cam setup in its own thread */
GError *error = NULL;
if (!g_thread_create ((GThreadFunc) setup_camera, cheese_window, FALSE, &error))
@@ -1515,6 +1558,7 @@ cheese_window_init (CheeseWindow *cheese_window)
g_error_free (error);
return;
}
+#endif
}
static void
@@ -1543,11 +1587,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->weee,
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->weee, -1, -1);
gtk_widget_show_all (priv->main_vbox);
@@ -1576,7 +1620,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 +1632,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]