[empathy/gnome-3-6] empathy-call: Handle yanking out of current video input



commit 118515887ac5f1017cddd1ce41cf2c964b3665f0
Author: Debarshi Ray <debarshir src gnome org>
Date:   Thu Nov 8 14:51:04 2012 +0100

    empathy-call: Handle yanking out of current video input
    
    If the current video input is yanked out, we continue the call with
    only audio and desensitize the camera menu. Once the call is over we
    sensitize it again and continue.
    
    Fixes: https://bugzilla.gnome.org/687928

 src/empathy-call-window.c |    8 ++++++++
 src/empathy-camera-menu.c |   24 ++++++++++++++++++++----
 src/empathy-camera-menu.h |    3 +++
 3 files changed, 31 insertions(+), 4 deletions(-)
---
diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c
index f49901b..f64d5f9 100644
--- a/src/empathy-call-window.c
+++ b/src/empathy-call-window.c
@@ -2542,6 +2542,13 @@ empathy_call_window_disconnected (EmpathyCallWindow *self,
   gtk_action_set_sensitive (priv->menu_fullscreen, FALSE);
   gtk_widget_set_sensitive (priv->dtmf_panel, FALSE);
 
+  /* Create the video input and then turn on the camera
+   * menu, so that the active camera gets marked as such.
+   */
+  if (priv->video_input == NULL)
+    create_video_input (self);
+  empathy_camera_menu_set_sensitive (priv->camera_menu, TRUE);
+
   could_reset_pipeline = empathy_call_window_reset_pipeline (self);
 
   if (priv->call_state == CONNECTING)
@@ -3569,6 +3576,7 @@ empathy_call_window_remove_video_input (EmpathyCallWindow *self)
   priv->video_preview = NULL;
 
   gtk_widget_set_sensitive (priv->camera_button, FALSE);
+  empathy_camera_menu_set_sensitive (priv->camera_menu, FALSE);
 }
 
 static void
diff --git a/src/empathy-camera-menu.c b/src/empathy-camera-menu.c
index 9633d84..a0e0ca6 100644
--- a/src/empathy-camera-menu.c
+++ b/src/empathy-camera-menu.c
@@ -132,15 +132,16 @@ empathy_camera_menu_activate_cb (GtkAction *action,
 {
   EmpathyGstVideoSrc *video;
   const gchar *device;
-  gchar *current_device;
+  gchar *current_device = NULL;
 
   if (self->priv->in_update)
     return;
 
   video = empathy_call_window_get_video_src (self->priv->window);
+  if (video != NULL)
+    current_device = empathy_video_src_dup_device (video);
 
   device = gtk_action_get_name (action);
-  current_device = empathy_video_src_dup_device (video);
 
   /* Don't change the device if it's the currently used one */
   if (!tp_strdiff (device, current_device))
@@ -158,12 +159,13 @@ empathy_camera_menu_update (EmpathyCameraMenu *self)
   GList *l;
   GtkUIManager *ui_manager;
   EmpathyGstVideoSrc *video;
-  gchar *current_camera;
+  gchar *current_camera = NULL;
 
   ui_manager = empathy_call_window_get_ui_manager (self->priv->window);
 
   video = empathy_call_window_get_video_src (self->priv->window);
-  current_camera = empathy_video_src_dup_device (video);
+  if (video != NULL)
+    current_camera = empathy_video_src_dup_device (video);
 
   empathy_camera_menu_clean (self);
   self->priv->ui_id = gtk_ui_manager_new_merge_id (ui_manager);
@@ -394,3 +396,17 @@ empathy_camera_menu_new (EmpathyCallWindow *window)
       "window", window,
       NULL);
 }
+
+void
+empathy_camera_menu_set_sensitive (EmpathyCameraMenu *self,
+    gboolean sensitive)
+{
+  GtkUIManager *ui_manager;
+
+  gtk_action_group_set_sensitive (self->priv->action_group, sensitive);
+  if (sensitive) /* Mark the active camera as such. */
+    empathy_camera_menu_update (self);
+
+  ui_manager = empathy_call_window_get_ui_manager (self->priv->window);
+  gtk_ui_manager_ensure_update (ui_manager);
+}
diff --git a/src/empathy-camera-menu.h b/src/empathy-camera-menu.h
index f105baf..92760f6 100644
--- a/src/empathy-camera-menu.h
+++ b/src/empathy-camera-menu.h
@@ -51,6 +51,9 @@ GType empathy_camera_menu_get_type (void) G_GNUC_CONST;
 
 EmpathyCameraMenu * empathy_camera_menu_new (EmpathyCallWindow *window);
 
+void empathy_camera_menu_set_sensitive (EmpathyCameraMenu *self,
+    gboolean sensitive);
+
 G_END_DECLS
 
 #endif /* __EMPATHY_CAMERA_MENU_H__ */



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