]> git.0d.be Git - empathy.git/blobdiff - src/empathy-camera-menu.c
Merge remote-tracking branch 'jonny/ft'
[empathy.git] / src / empathy-camera-menu.c
index 16ad07a0b288fa546206e97e9abbd47f21652fad..9633d84fa2b78eb2674c92e3c3c573f55230fde9 100644 (file)
@@ -132,6 +132,7 @@ empathy_camera_menu_activate_cb (GtkAction *action,
 {
   EmpathyGstVideoSrc *video;
   const gchar *device;
+  gchar *current_device;
 
   if (self->priv->in_update)
     return;
@@ -139,8 +140,16 @@ empathy_camera_menu_activate_cb (GtkAction *action,
   video = empathy_call_window_get_video_src (self->priv->window);
 
   device = gtk_action_get_name (action);
+  current_device = empathy_video_src_dup_device (video);
 
-  empathy_video_src_change_device (video, device);
+  /* Don't change the device if it's the currently used one */
+  if (!tp_strdiff (device, current_device))
+    goto out;
+
+  empathy_call_window_change_webcam (self->priv->window, device);
+
+ out:
+  g_free (current_device);
 }
 
 static void
@@ -246,28 +255,39 @@ empathy_camera_menu_prefs_camera_changed_cb (GSettings *settings,
     EmpathyCameraMenu *self)
 {
   gchar *device = g_settings_get_string (settings, key);
+  GtkRadioAction *action = NULL;
+  gboolean found = FALSE;
   GList *l;
 
   for (l = self->priv->cameras->head; l != NULL; l = g_list_next (l))
     {
-      GtkRadioAction *action = l->data;
-      const gchar *name = gtk_action_get_name (GTK_ACTION (action));
+      const gchar *name;
+
+      action = l->data;
+      name = gtk_action_get_name (GTK_ACTION (action));
 
       if (!tp_strdiff (device, name))
         {
-          if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
-            {
-              g_signal_handlers_block_by_func (settings,
-                  empathy_camera_menu_prefs_camera_changed_cb, self);
-              gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
-              g_signal_handlers_unblock_by_func (settings,
-                  empathy_camera_menu_prefs_camera_changed_cb, self);
-            }
-
+          found = TRUE;
           break;
         }
     }
 
+  /* If the selected camera isn't found, we connect the first
+   * available one */
+  if (!found && self->priv->cameras->head != NULL)
+    action = self->priv->cameras->head->data;
+
+  if (action != NULL &&
+      !gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
+    {
+      g_signal_handlers_block_by_func (settings,
+          empathy_camera_menu_prefs_camera_changed_cb, self);
+      gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
+      g_signal_handlers_unblock_by_func (settings,
+          empathy_camera_menu_prefs_camera_changed_cb, self);
+    }
+
   g_free (device);
 }
 
@@ -286,6 +306,11 @@ empathy_camera_menu_get_cameras (EmpathyCameraMenu *self)
     }
 
   empathy_camera_menu_update (self);
+
+  /* Do as if the gsettings key had changed, so we select the key that
+   * was last set. */
+  empathy_camera_menu_prefs_camera_changed_cb (self->priv->settings,
+      EMPATHY_PREFS_CALL_CAMERA_DEVICE, self);
 }
 
 static void
@@ -314,7 +339,7 @@ empathy_camera_menu_constructed (GObject *obj)
       self->priv->anchor_action);
   g_object_unref (self->priv->anchor_action);
 
-  self->priv->camera_monitor = empathy_camera_monitor_dup_singleton ();
+  self->priv->camera_monitor = empathy_camera_monitor_new ();
 
   tp_g_signal_connect_object (self->priv->camera_monitor, "added",
       G_CALLBACK (empathy_camera_menu_camera_added_cb), self, 0);