* 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
{
GQueue *cameras;
EmpathyCameraMonitor *camera_monitor;
+
+ GSettings *settings;
};
G_DEFINE_TYPE (EmpathyCameraMenu, empathy_camera_menu, G_TYPE_OBJECT);
{
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);
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)
{
}
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
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);
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);
}
"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);
+}