typedef enum {
CAMERA_STATE_OFF = 0,
- CAMERA_STATE_PREVIEW,
CAMERA_STATE_ON,
} CameraState;
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 */
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. */
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)
{
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
"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,
"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);
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()). */
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 */
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);
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);
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
{
/* 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)
{
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. */
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);
-}
<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>