]> git.0d.be Git - empathy.git/blobdiff - src/empathy-camera-menu.c
Use a flat namespace for internal includes
[empathy.git] / src / empathy-camera-menu.c
index a7bc26fa83ffd196b4f055320da86f72b2f105d3..0674e7076cc5a576cac92ce01263671da015c281 100644 (file)
  * Thanks guys!
  */
 
-#include <config.h>
+#include "config.h"
 
-#include <gtk/gtk.h>
-
-#include <libempathy/empathy-camera-monitor.h>
+#include "empathy-camera-monitor.h"
+#include "empathy-gsettings.h"
 
 #include "empathy-camera-menu.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_VOIP
-#include <libempathy/empathy-debug.h>
+#include "empathy-debug.h"
 
 struct _EmpathyCameraMenuPrivate
 {
@@ -54,6 +53,8 @@ struct _EmpathyCameraMenuPrivate
   GQueue *cameras;
 
   EmpathyCameraMonitor *camera_monitor;
+
+  GSettings *settings;
 };
 
 G_DEFINE_TYPE (EmpathyCameraMenu, empathy_camera_menu, G_TYPE_OBJECT);
@@ -129,29 +130,48 @@ empathy_camera_menu_activate_cb (GtkAction *action,
 {
   EmpathyGstVideoSrc *video;
   const gchar *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);
 
-  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
 empathy_camera_menu_update (EmpathyCameraMenu *self)
 {
   GList *l;
+  GtkAction *menu;
   GtkUIManager *ui_manager;
   EmpathyGstVideoSrc *video;
-  gchar *current_camera;
+  gboolean show_menu;
+  gchar *current_camera = NULL;
+  guint n_cameras;
 
   ui_manager = empathy_call_window_get_ui_manager (self->priv->window);
 
+  menu = gtk_ui_manager_get_action (ui_manager, "/menubar1/edit/menucamera");
+  n_cameras = g_queue_get_length (self->priv->cameras);
+  show_menu = (n_cameras > 1);
+  gtk_action_set_visible (menu, show_menu);
+
   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);
@@ -237,6 +257,48 @@ empathy_camera_menu_camera_removed_cb (EmpathyCameraMonitor *monitor,
   empathy_camera_menu_update (self);
 }
 
+static void
+empathy_camera_menu_prefs_camera_changed_cb (GSettings *settings,
+    gchar *key,
+    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))
+    {
+      const gchar *name;
+
+      action = l->data;
+      name = gtk_action_get_name (GTK_ACTION (action));
+
+      if (!tp_strdiff (device, name))
+        {
+          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);
+}
+
 static void
 empathy_camera_menu_get_cameras (EmpathyCameraMenu *self)
 {
@@ -252,6 +314,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
@@ -280,13 +347,18 @@ 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);
   tp_g_signal_connect_object (self->priv->camera_monitor, "removed",
       G_CALLBACK (empathy_camera_menu_camera_removed_cb), self, 0);
 
+  self->priv->settings = g_settings_new (EMPATHY_PREFS_CALL_SCHEMA);
+  g_signal_connect (self->priv->settings,
+      "changed::"EMPATHY_PREFS_CALL_CAMERA_DEVICE,
+      G_CALLBACK (empathy_camera_menu_prefs_camera_changed_cb), self);
+
   self->priv->cameras = g_queue_new ();
 
   empathy_camera_menu_get_cameras (self);
@@ -300,6 +372,7 @@ empathy_camera_menu_dispose (GObject *obj)
   tp_clear_pointer (&self->priv->cameras, g_queue_free);
 
   tp_clear_object (&self->priv->camera_monitor);
+  tp_clear_object (&self->priv->settings);
 
   G_OBJECT_CLASS (empathy_camera_menu_parent_class)->dispose (obj);
 }
@@ -329,3 +402,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);
+}