]> git.0d.be Git - empathy.git/commitdiff
CallWindow: only show one button to control the camera
authorEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
Thu, 7 Jul 2011 07:30:47 +0000 (08:30 +0100)
committerEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
Tue, 12 Jul 2011 08:46:23 +0000 (09:46 +0100)
Having three buttons to control the camera clutters the
UI. Displaying the video preview but not sending video is
not very useful, and we'll add a way of sending video without
displaying the preview by clicking on the preview itself.

https://bugzilla.gnome.org/show_bug.cgi?id=611789

src/empathy-call-window.c
src/empathy-call-window.ui

index 43a3cb13ef040b50a6b43dd49b983a34f54c6e4c..cfca178c6c65078f2f75cd419b2f673b543799d2 100644 (file)
@@ -97,7 +97,6 @@ typedef enum {
 
 typedef enum {
   CAMERA_STATE_OFF = 0,
-  CAMERA_STATE_PREVIEW,
   CAMERA_STATE_ON,
 } CameraState;
 
@@ -124,15 +123,12 @@ struct _EmpathyCallWindowPriv
   GtkWidget *volume_button;
   GtkWidget *redial_button;
   GtkWidget *mic_button;
+  GtkWidget *camera_button;
   GtkWidget *toolbar;
   GtkWidget *pane;
   GtkAction *redial;
   GtkAction *menu_dialpad;
   GtkAction *menu_fullscreen;
-  GtkAction *action_camera_on;
-  GtkWidget *tool_button_camera_off;
-  GtkWidget *tool_button_camera_preview;
-  GtkWidget *tool_button_camera_on;
 
   /* The box that contains self and remote avatar and video
      input/output. When we redial, we destroy and re-create the box */
@@ -282,32 +278,11 @@ static void
 empathy_call_window_volume_changed_cb (GtkScaleButton *button,
   gdouble value, EmpathyCallWindow *window);
 
-static void block_camera_control_signals (EmpathyCallWindow *self);
-static void unblock_camera_control_signals (EmpathyCallWindow *self);
-
 static void
 empathy_call_window_setup_toolbar (EmpathyCallWindow *self)
 {
   EmpathyCallWindowPriv *priv = GET_PRIV (self);
   GtkToolItem *tool_item;
-  GtkWidget *camera_off_icon;
-  GdkPixbuf *pixbuf, *modded_pixbuf;
-
-  /* set the icon of the 'camera off' button by greying off the webcam icon */
-  pixbuf = empathy_pixbuf_from_icon_name ("camera-web",
-      GTK_ICON_SIZE_SMALL_TOOLBAR);
-
-  modded_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8,
-      gdk_pixbuf_get_width (pixbuf),
-      gdk_pixbuf_get_height (pixbuf));
-
-  gdk_pixbuf_saturate_and_pixelate (pixbuf, modded_pixbuf, 1.0, TRUE);
-  g_object_unref (pixbuf);
-
-  camera_off_icon = gtk_image_new_from_pixbuf (modded_pixbuf);
-  g_object_unref (modded_pixbuf);
-  gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (
-        priv->tool_button_camera_off), camera_off_icon);
 
   /* Add an empty expanded GtkToolItem so the volume button is at the end of
    * the toolbar. */
@@ -821,100 +796,9 @@ disable_camera (EmpathyCallWindow *self)
   if (priv->camera_state == CAMERA_STATE_ON)
     empathy_call_window_set_send_video (self, CAMERA_STATE_OFF);
 
-  block_camera_control_signals (self);
-  gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
-        priv->tool_button_camera_on), FALSE);
-  gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
-      priv->tool_button_camera_preview), FALSE);
-
-  gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
-      priv->tool_button_camera_off), TRUE);
-  gtk_radio_action_set_current_value (GTK_RADIO_ACTION (priv->action_camera_on),
-      CAMERA_STATE_OFF);
-  unblock_camera_control_signals (self);
-
   priv->camera_state = CAMERA_STATE_OFF;
 }
 
-static void
-tool_button_camera_off_toggled_cb (GtkToggleToolButton *toggle,
-  EmpathyCallWindow *self)
-{
-  EmpathyCallWindowPriv *priv = GET_PRIV (self);
-
-  if (!gtk_toggle_tool_button_get_active (toggle))
-    {
-      if (priv->camera_state == CAMERA_STATE_OFF)
-        {
-          /* We can't change the state by disabling the button */
-          block_camera_control_signals (self);
-          gtk_toggle_tool_button_set_active (toggle, TRUE);
-          unblock_camera_control_signals (self);
-        }
-
-      return;
-    }
-
-  disable_camera (self);
-}
-
-static void
-enable_preview (EmpathyCallWindow *self)
-{
-  EmpathyCallWindowPriv *priv = GET_PRIV (self);
-
-  if (priv->camera_state == CAMERA_STATE_PREVIEW)
-    return;
-
-  DEBUG ("Enable preview");
-
-  if (priv->camera_state == CAMERA_STATE_ON)
-    {
-      /* preview is already displayed so we just have to stop sending */
-      empathy_call_window_set_send_video (self, CAMERA_STATE_PREVIEW);
-    }
-  else
-    {
-      display_video_preview (self, TRUE);
-    }
-
-  block_camera_control_signals (self);
-  gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
-      priv->tool_button_camera_off), FALSE);
-  gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
-        priv->tool_button_camera_on), FALSE);
-
-  gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
-        priv->tool_button_camera_preview), TRUE);
-  gtk_radio_action_set_current_value (GTK_RADIO_ACTION (priv->action_camera_on),
-      CAMERA_STATE_PREVIEW);
-  unblock_camera_control_signals (self);
-
-  priv->camera_state = CAMERA_STATE_PREVIEW;
-}
-
-static void
-tool_button_camera_preview_toggled_cb (GtkToggleToolButton *toggle,
-  EmpathyCallWindow *self)
-{
-  EmpathyCallWindowPriv *priv = GET_PRIV (self);
-
-  if (!gtk_toggle_tool_button_get_active (toggle))
-    {
-      if (priv->camera_state == CAMERA_STATE_PREVIEW)
-        {
-          /* We can't change the state by disabling the button */
-          block_camera_control_signals (self);
-          gtk_toggle_tool_button_set_active (toggle, TRUE);
-          unblock_camera_control_signals (self);
-        }
-
-      return;
-    }
-
-  enable_preview (self);
-}
-
 static void
 enable_camera (EmpathyCallWindow *self)
 {
@@ -929,74 +813,21 @@ enable_camera (EmpathyCallWindow *self)
       return;
     }
 
-
   DEBUG ("Enable camera");
 
   empathy_call_window_set_send_video (self, CAMERA_STATE_ON);
 
-  block_camera_control_signals (self);
-  gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
-      priv->tool_button_camera_off), FALSE);
-  gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
-        priv->tool_button_camera_preview), FALSE);
-
-  gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (
-      priv->tool_button_camera_on), TRUE);
-  gtk_radio_action_set_current_value (GTK_RADIO_ACTION (priv->action_camera_on),
-      CAMERA_STATE_ON);
-  unblock_camera_control_signals (self);
-
   priv->camera_state = CAMERA_STATE_ON;
 }
 
 static void
-tool_button_camera_on_toggled_cb (GtkToggleToolButton *toggle,
+empathy_call_window_camera_toggled_cb (GtkToggleToolButton *toggle,
   EmpathyCallWindow *self)
 {
-  EmpathyCallWindowPriv *priv = GET_PRIV (self);
-
-  if (!gtk_toggle_tool_button_get_active (toggle))
-    {
-      if (priv->camera_state == CAMERA_STATE_ON)
-        {
-          /* We can't change the state by disabling the button */
-          block_camera_control_signals (self);
-          gtk_toggle_tool_button_set_active (toggle, TRUE);
-          unblock_camera_control_signals (self);
-        }
-
-      return;
-    }
-
-  enable_camera (self);
-}
-
-static void
-action_camera_change_cb (GtkRadioAction *action,
-    GtkRadioAction *current,
-    EmpathyCallWindow *self)
-{
-  CameraState state;
-
-  state = gtk_radio_action_get_current_value (current);
-
-  switch (state)
-    {
-      case CAMERA_STATE_OFF:
-        disable_camera (self);
-        break;
-
-      case CAMERA_STATE_PREVIEW:
-        enable_preview (self);
-        break;
-
-      case CAMERA_STATE_ON:
-        enable_camera (self);
-        break;
-
-      default:
-        g_assert_not_reached ();
-    }
+  if (gtk_toggle_tool_button_get_active (toggle))
+    enable_camera (self);
+  else
+    disable_camera (self);
 }
 
 static void
@@ -1050,15 +881,12 @@ empathy_call_window_init (EmpathyCallWindow *self)
     "statusbar", &priv->statusbar,
     "redial", &priv->redial_button,
     "microphone", &priv->mic_button,
+    "camera", &priv->camera_button,
     "toolbar", &priv->toolbar,
     "menuredial", &priv->redial,
     "menudialpad", &priv->menu_dialpad,
     "ui_manager", &priv->ui_manager,
     "menufullscreen", &priv->menu_fullscreen,
-    "camera_off", &priv->tool_button_camera_off,
-    "camera_preview", &priv->tool_button_camera_preview,
-    "camera_on", &priv->tool_button_camera_on,
-    "action_camera_on",  &priv->action_camera_on,
     "details_vbox",  &priv->details_vbox,
     "vcodec_encoding_label", &priv->vcodec_encoding_label,
     "acodec_encoding_label", &priv->acodec_encoding_label,
@@ -1082,11 +910,8 @@ empathy_call_window_init (EmpathyCallWindow *self)
     "redial", "clicked", empathy_call_window_redial_cb,
     "menudialpad", "toggled", empathy_call_window_dialpad_cb,
     "microphone", "toggled", empathy_call_window_mic_toggled_cb,
+    "camera", "toggled", empathy_call_window_camera_toggled_cb,
     "menufullscreen", "activate", empathy_call_window_fullscreen_cb,
-    "camera_off", "toggled", tool_button_camera_off_toggled_cb,
-    "camera_preview", "toggled", tool_button_camera_preview_toggled_cb,
-    "camera_on", "toggled", tool_button_camera_on_toggled_cb,
-    "action_camera_on", "changed", action_camera_change_cb,
     NULL);
 
   gtk_action_set_sensitive (priv->menu_fullscreen, FALSE);
@@ -1557,7 +1382,7 @@ empathy_call_window_constructed (GObject *object)
   if (!empathy_call_handler_has_initial_video (priv->handler))
     {
       gtk_toggle_tool_button_set_active (
-          GTK_TOGGLE_TOOL_BUTTON (priv->tool_button_camera_off), TRUE);
+          GTK_TOGGLE_TOOL_BUTTON (priv->camera_button), FALSE);
     }
   /* If call has InitialVideo, the preview will be started once the call has
    * been started (start_call()). */
@@ -1876,8 +1701,7 @@ empathy_call_window_disconnected (EmpathyCallWindow *self,
       gtk_widget_set_sensitive (priv->redial_button, TRUE);
 
       /* Unsensitive the camera and mic button */
-      gtk_widget_set_sensitive (priv->tool_button_camera_on, FALSE);
-      gtk_action_set_sensitive (priv->action_camera_on, FALSE);
+      gtk_widget_set_sensitive (priv->camera_button, FALSE);
       gtk_widget_set_sensitive (priv->mic_button, FALSE);
 
       /* Be sure that the mic button is enabled */
@@ -1885,12 +1709,6 @@ empathy_call_window_disconnected (EmpathyCallWindow *self,
           GTK_TOGGLE_TOOL_BUTTON (priv->mic_button), TRUE);
 
       if (priv->camera_state == CAMERA_STATE_ON)
-        {
-          /* Enable the 'preview' button as we are not sending atm. */
-          gtk_toggle_tool_button_set_active (
-              GTK_TOGGLE_TOOL_BUTTON (priv->tool_button_camera_preview), TRUE);
-        }
-      else if (priv->camera_state == CAMERA_STATE_PREVIEW)
         {
           /* Restart the preview with the new pipeline. */
           display_video_preview (self, TRUE);
@@ -2357,8 +2175,7 @@ empathy_call_window_state_changed_cb (EmpathyCallHandler *handler,
   if (priv->video_input == NULL)
     empathy_call_window_set_send_video (self, CAMERA_STATE_OFF);
 
-  gtk_widget_set_sensitive (priv->tool_button_camera_on, can_send_video);
-  gtk_action_set_sensitive (priv->action_camera_on, can_send_video);
+  gtk_widget_set_sensitive (priv->camera_button, can_send_video);
 
   gtk_action_set_sensitive (priv->redial, FALSE);
   gtk_widget_set_sensitive (priv->redial_button, FALSE);
@@ -2556,9 +2373,7 @@ empathy_call_window_remove_video_input (EmpathyCallWindow *self)
   clutter_actor_destroy (priv->video_preview);
   priv->video_preview = NULL;
 
-  gtk_widget_set_sensitive (priv->tool_button_camera_on, FALSE);
-  gtk_action_set_sensitive (priv->action_camera_on, FALSE);
-  gtk_widget_set_sensitive (priv->tool_button_camera_preview, FALSE);
+  gtk_widget_set_sensitive (priv->camera_button, FALSE);
 }
 
 static void
@@ -2583,14 +2398,12 @@ start_call (EmpathyCallWindow *self)
         {
           /* Enable 'send video' buttons and display the preview */
           gtk_toggle_tool_button_set_active (
-            GTK_TOGGLE_TOOL_BUTTON (priv->tool_button_camera_on),
-            TRUE);
+            GTK_TOGGLE_TOOL_BUTTON (priv->camera_button), TRUE);
         }
       else
         {
           gtk_toggle_tool_button_set_active (
-            GTK_TOGGLE_TOOL_BUTTON (priv->tool_button_camera_off),
-            TRUE);
+            GTK_TOGGLE_TOOL_BUTTON (priv->camera_button), FALSE);
 
           if (priv->video_preview == NULL)
             {
@@ -2976,8 +2789,7 @@ empathy_call_window_set_send_video (EmpathyCallWindow *window,
 
   priv->sending_video = (state == CAMERA_STATE_ON);
 
-  if (state == CAMERA_STATE_PREVIEW ||
-      state == CAMERA_STATE_ON)
+  if (state == CAMERA_STATE_ON)
     {
       /* When we start sending video, we want to show the video preview by
          default. */
@@ -3233,36 +3045,3 @@ empathy_call_window_volume_changed_cb (GtkScaleButton *button,
   empathy_audio_sink_set_volume (EMPATHY_GST_AUDIO_SINK (priv->audio_output),
     value);
 }
-
-/* block all the signals related to camera control widgets. This is useful
- * when we are manually updating the UI and so don't want to fire the
- * callbacks */
-static void
-block_camera_control_signals (EmpathyCallWindow *self)
-{
-  EmpathyCallWindowPriv *priv = GET_PRIV (self);
-
-  g_signal_handlers_block_by_func (priv->tool_button_camera_off,
-      tool_button_camera_off_toggled_cb, self);
-  g_signal_handlers_block_by_func (priv->tool_button_camera_preview,
-      tool_button_camera_preview_toggled_cb, self);
-  g_signal_handlers_block_by_func (priv->tool_button_camera_on,
-      tool_button_camera_on_toggled_cb, self);
-  g_signal_handlers_block_by_func (priv->action_camera_on,
-      action_camera_change_cb, self);
-}
-
-static void
-unblock_camera_control_signals (EmpathyCallWindow *self)
-{
-  EmpathyCallWindowPriv *priv = GET_PRIV (self);
-
-  g_signal_handlers_unblock_by_func (priv->tool_button_camera_off,
-      tool_button_camera_off_toggled_cb, self);
-  g_signal_handlers_unblock_by_func (priv->tool_button_camera_preview,
-      tool_button_camera_preview_toggled_cb, self);
-  g_signal_handlers_unblock_by_func (priv->tool_button_camera_on,
-      tool_button_camera_on_toggled_cb, self);
-  g_signal_handlers_unblock_by_func (priv->action_camera_on,
-      action_camera_change_cb, self);
-}
index 0d32677f90e3c67863741fca4a4099481ab3004d..f078bb4cdfa8c8889a7b10546fe9fc5f311c5bd8 100644 (file)
             <property name="label" translatable="yes">_Dialpad</property>
           </object>
         </child>
-        <child>
-          <object class="GtkAction" id="camera">
-            <property name="name">camera</property>
-            <property name="label" translatable="yes">V_ideo</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkRadioAction" id="action_camera_off">
-            <property name="name">action_camera_off</property>
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Video Off</property>
-            <property name="draw_as_radio">True</property>
-            <property name="value">0</property>
-            <property name="current-value">0</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkRadioAction" id="action_camera_preview">
-            <property name="name">action_camera_preview</property>
-            <property name="visible">True</property>
-            <property name="label" translatable="yes">Video Preview</property>
-            <property name="draw_as_radio">True</property>
-            <property name="group">action_camera_off</property>
-            <property name="value">1</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkRadioAction" id="action_camera_on">
-            <property name="name">action_camera_on</property>
-            <property name="visible">True</property>
-            <property name="sensitive">False</property>
-            <property name="label" translatable="yes">Video On</property>
-            <property name="draw_as_radio">True</property>
-            <property name="group">action_camera_off</property>
-            <property name="value">2</property>
-          </object>
-        </child>
         <child>
           <object class="GtkAction" id="view">
             <property name="name">view</property>
           <menuitem action="menuredial"/>
           <menuitem action="menudialpad"/>
         </menu>
-        <menu action="camera">
-          <menuitem action="action_camera_off"/>
-          <menuitem action="action_camera_preview"/>
-          <menuitem action="action_camera_on"/>
-        </menu>
         <menu action="view">
           <menuitem action="menufullscreen"/>
         </menu>
               </packing>
             </child>
             <child>
-              <object class="GtkSeparatorToolItem" id="camera_separator">
-                <property name="visible">True</property>
-              </object>
-              <packing>
-                <property name="homogeneous">True</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkToggleToolButton" id="camera_off">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Camera Off</property>
-                <property name="sensitive">True</property>
-                <property name="tooltip_text" translatable="yes">Disable camera and stop sending video</property>
-              </object>
-              <packing>
-                <property name="homogeneous">True</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkToggleToolButton" id="camera_preview">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Preview</property>
-                <property name="icon_name">avatar-default</property>
-                <property name="sensitive">True</property>
-                <property name="tooltip_text" translatable="yes">Enable camera but don't send video</property>
-              </object>
-              <packing>
-                <property name="homogeneous">True</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkToggleToolButton" id="camera_on">
+              <object class="GtkToggleToolButton" id="camera">
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">Camera On</property>
+                <property name="label" translatable="yes">Send Video</property>
                 <property name="icon_name">camera-web</property>
                 <property name="sensitive">False</property>
-                <property name="tooltip_text" translatable="yes">Enable camera and send video</property>
+                <property name="tooltip_text" translatable="yes">Toggle video transmission</property>
               </object>
               <packing>
                 <property name="homogeneous">True</property>