aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>2011-07-07 17:21:01 +0800
committerEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>2011-07-12 16:46:23 +0800
commitf0c80062b0fcdec789a478ed58528ec6fdd14622 (patch)
tree19e00512cdbff051e3e2357427ac47cf946ff1b8
parent538d987eb2e525e957caf9b05e6233ed7541c1d8 (diff)
downloadgsoc2013-empathy-f0c80062b0fcdec789a478ed58528ec6fdd14622.tar
gsoc2013-empathy-f0c80062b0fcdec789a478ed58528ec6fdd14622.tar.gz
gsoc2013-empathy-f0c80062b0fcdec789a478ed58528ec6fdd14622.tar.bz2
gsoc2013-empathy-f0c80062b0fcdec789a478ed58528ec6fdd14622.tar.lz
gsoc2013-empathy-f0c80062b0fcdec789a478ed58528ec6fdd14622.tar.xz
gsoc2013-empathy-f0c80062b0fcdec789a478ed58528ec6fdd14622.tar.zst
gsoc2013-empathy-f0c80062b0fcdec789a478ed58528ec6fdd14622.zip
CallWindow: allow to show/hide the video preview
There's now a button next to the video preview when it's shown and in a corner when it's hidden that allows to hide and show it.
-rw-r--r--src/empathy-call-window.c103
-rw-r--r--src/empathy-call-window.ui26
2 files changed, 126 insertions, 3 deletions
diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c
index cfca178c6..eee37476e 100644
--- a/src/empathy-call-window.c
+++ b/src/empathy-call-window.c
@@ -116,6 +116,7 @@ struct _EmpathyCallWindowPriv
* alive only during call. */
ClutterActor *video_output;
ClutterActor *video_preview;
+ ClutterActor *preview_hidden_button;
GtkWidget *video_container;
GtkWidget *remote_user_avatar_widget;
GtkWidget *sidebar;
@@ -673,11 +674,66 @@ add_video_preview_to_pipeline (EmpathyCallWindow *self)
}
static void
+empathy_call_window_disable_camera_cb (GtkAction *action,
+ EmpathyCallWindow *self)
+{
+ clutter_actor_destroy (self->priv->preview_hidden_button);
+
+ gtk_toggle_tool_button_set_active (
+ GTK_TOGGLE_TOOL_BUTTON (self->priv->camera_button), FALSE);
+}
+
+static void
+empathy_call_window_minimise_camera_cb (GtkAction *action,
+ EmpathyCallWindow *self)
+{
+ clutter_actor_hide (self->priv->video_preview);
+ clutter_actor_show (self->priv->preview_hidden_button);
+}
+
+static void
+empathy_call_window_maximise_camera_cb (GtkAction *action,
+ EmpathyCallWindow *self)
+{
+ clutter_actor_show (self->priv->video_preview);
+ clutter_actor_hide (self->priv->preview_hidden_button);
+}
+
+static void
+empathy_call_window_preview_button_clicked_cb (GtkButton *button,
+ EmpathyCallWindow *self)
+{
+ GtkWidget *menu;
+
+ menu = gtk_ui_manager_get_widget (self->priv->ui_manager,
+ "/preview-menu");
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
+ 0, gtk_get_current_event_time ());
+ gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE);
+}
+
+static void
+empathy_call_window_preview_hidden_button_clicked_cb (GtkButton *button,
+ EmpathyCallWindow *self)
+{
+ GtkWidget *menu;
+
+ menu = gtk_ui_manager_get_widget (self->priv->ui_manager,
+ "/preview-hidden-menu");
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
+ 0, gtk_get_current_event_time ());
+ gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE);
+}
+
+static void
create_video_preview (EmpathyCallWindow *self)
{
EmpathyCallWindowPriv *priv = GET_PRIV (self);
- ClutterLayoutManager *layout;
+ ClutterLayoutManager *layout, *layout_center;
ClutterActor *preview;
+ ClutterActor *box;
+ ClutterActor *b;
+ GtkWidget *button;
g_assert (priv->video_preview == NULL);
@@ -701,14 +757,52 @@ create_video_preview (EmpathyCallWindow *self)
priv->video_preview = clutter_box_new (layout);
clutter_actor_set_size (priv->video_preview,
SELF_VIDEO_SECTION_WIDTH + 10, SELF_VIDEO_SECTION_HEIGTH + 10);
- clutter_container_add_actor (CLUTTER_CONTAINER (priv->video_preview),
- preview);
+
+ layout_center = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER,
+ CLUTTER_BIN_ALIGNMENT_CENTER);
+ box = clutter_box_new (layout_center);
+ clutter_actor_set_size (box,
+ SELF_VIDEO_SECTION_WIDTH, SELF_VIDEO_SECTION_HEIGTH);
+
+ clutter_container_add_actor (CLUTTER_CONTAINER (box), preview);
+ clutter_container_add_actor (CLUTTER_CONTAINER (priv->video_preview), box);
g_object_set (priv->video_preview_sink,
"sync", FALSE,
"async", TRUE,
NULL);
+ /* Translators: this is an "Info" label. It should be as short
+ * as possible. */
+ button = gtk_button_new_with_label (_("i"));
+ b = gtk_clutter_actor_new_with_contents (button);
+
+ clutter_bin_layout_add (CLUTTER_BIN_LAYOUT (layout_center),
+ b,
+ CLUTTER_BIN_ALIGNMENT_END,
+ CLUTTER_BIN_ALIGNMENT_END);
+
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (empathy_call_window_preview_button_clicked_cb),
+ self);
+
+ /* Translators: this is an "Info" label. It should be as short
+ * as possible. */
+ button = gtk_button_new_with_label (_("i"));
+ priv->preview_hidden_button =
+ gtk_clutter_actor_new_with_contents (button);
+
+ clutter_bin_layout_add (CLUTTER_BIN_LAYOUT (priv->video_layout),
+ priv->preview_hidden_button,
+ CLUTTER_BIN_ALIGNMENT_START,
+ CLUTTER_BIN_ALIGNMENT_END);
+
+ clutter_actor_hide (priv->preview_hidden_button);
+
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (empathy_call_window_preview_hidden_button_clicked_cb),
+ self);
+
clutter_bin_layout_add (CLUTTER_BIN_LAYOUT (priv->video_layout),
priv->video_preview,
CLUTTER_BIN_ALIGNMENT_START,
@@ -912,6 +1006,9 @@ empathy_call_window_init (EmpathyCallWindow *self)
"microphone", "toggled", empathy_call_window_mic_toggled_cb,
"camera", "toggled", empathy_call_window_camera_toggled_cb,
"menufullscreen", "activate", empathy_call_window_fullscreen_cb,
+ "menupreviewdisable", "activate", empathy_call_window_disable_camera_cb,
+ "menupreviewminimise", "activate", empathy_call_window_minimise_camera_cb,
+ "menupreviewmaximise", "activate", empathy_call_window_maximise_camera_cb,
NULL);
gtk_action_set_sensitive (priv->menu_fullscreen, FALSE);
diff --git a/src/empathy-call-window.ui b/src/empathy-call-window.ui
index f078bb4cd..fe246012d 100644
--- a/src/empathy-call-window.ui
+++ b/src/empathy-call-window.ui
@@ -44,6 +44,24 @@
</object>
<accelerator key="F11"/>
</child>
+ <child>
+ <object class="GtkAction" id="menupreviewminimise">
+ <property name="name">menupreviewminimise</property>
+ <property name="label" translatable="yes">Minimise me</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="menupreviewmaximise">
+ <property name="name">menupreviewmaximise</property>
+ <property name="label" translatable="yes">Maximise me</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAction" id="menupreviewdisable">
+ <property name="name">menupreviewdisable</property>
+ <property name="label" translatable="yes">Disable camera</property>
+ </object>
+ </child>
</object>
</child>
<ui>
@@ -60,6 +78,14 @@
<popup name="video-popup">
<menuitem name="menufullscreen" action="menufullscreen"/>
</popup>
+ <popup name="preview-menu">
+ <menuitem name="menupreviewminimise" action="menupreviewminimise"/>
+ <menuitem name="menupreviewdisable" action="menupreviewdisable"/>
+ </popup>
+ <popup name="preview-hidden-menu">
+ <menuitem name="menupreviewmaximise" action="menupreviewmaximise"/>
+ <menuitem name="menupreviewdisable" action="menupreviewdisable"/>
+ </popup>
</ui>
</object>
<object class="GtkVBox" id="call_window_vbox">