Make empathy_call_window_show return the widget
[empathy.git] / libempathy-gtk / empathy-call-window.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * Copyright (C) 2007 Elliot Fairweather
4  * Copyright (C) 2007 Collabora Ltd.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  * Authors: Elliot Fairweather <elliot.fairweather@collabora.co.uk>
21  *          Xavier Claessens <xclaesse@gmail.com>
22  */
23
24 #include "config.h"
25
26 #include <gtk/gtk.h>
27
28 #include <libempathy/empathy-debug.h>
29
30 #include "empathy-call-window.h"
31 #include "empathy-ui-utils.h"
32
33 #define DEBUG_DOMAIN "CallWindow"
34
35 typedef struct {
36         GtkWidget     *window;
37         GtkWidget     *input_volume_scale;
38         GtkWidget     *output_volume_scale;
39         GtkWidget     *input_mute_togglebutton;
40         GtkWidget     *output_mute_togglebutton;
41         GtkWidget     *preview_video_frame;
42         GtkWidget     *output_video_frame;
43         GtkWidget     *preview_video_socket;
44         GtkWidget     *output_video_socket;
45         GtkWidget     *send_video_checkbutton;
46
47         EmpathyTpCall *call;
48 } EmpathyCallWindow;
49
50 static void
51 call_window_output_volume_changed_cb (GtkWidget         *scale,
52                                       EmpathyCallWindow *window)
53 {
54         guint volume;
55
56         volume = (guint) gtk_range_get_value (GTK_RANGE (scale));
57         empathy_tp_call_set_output_volume (window->call, volume);
58 }
59
60
61 static void
62 call_window_output_mute_toggled_cb (GtkWidget         *button,
63                                     EmpathyCallWindow *window)
64 {
65         gboolean is_muted;
66
67         is_muted = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
68         empathy_tp_call_mute_output (window->call, is_muted);
69 }
70
71
72 static void
73 call_window_input_mute_toggled_cb (GtkWidget         *button,
74                                    EmpathyCallWindow *window)
75 {
76         gboolean is_muted;
77
78         is_muted = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
79         empathy_tp_call_mute_input (window->call, is_muted);
80 }
81
82
83 static void
84 call_window_send_video_toggled_cb (GtkWidget         *button,
85                                    EmpathyCallWindow *window)
86 {
87         gboolean is_sending;
88
89         is_sending = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
90         empathy_tp_call_send_video (window->call, is_sending);
91 }
92
93 static void
94 call_window_capabilities_notify_cb (EmpathyContact    *contact,
95                                     GParamSpec        *param,
96                                     EmpathyCallWindow *window)
97 {
98         EmpathyCapabilities capabilities;
99
100         capabilities = empathy_contact_get_capabilities (contact);
101         empathy_tp_call_request_streams (window->call,
102                                          capabilities & EMPATHY_CAPABILITIES_AUDIO,
103                                          capabilities & EMPATHY_CAPABILITIES_VIDEO);
104 }
105
106 static void
107 call_window_status_notify_cb (EmpathyTpCall     *call,
108                               GParamSpec        *param,
109                               EmpathyCallWindow *window)
110 {
111         guint status;
112
113         status = empathy_tp_call_get_status (call);
114         empathy_debug (DEBUG_DOMAIN, "Status changed to %d",
115                        status);
116
117         if (status == EMPATHY_TP_CALL_STATUS_RINGING) {
118                 if (empathy_tp_call_is_incoming (window->call)) {
119                         empathy_tp_call_accept (window->call);
120                 } else {
121                         EmpathyContact *contact;
122
123                         contact = empathy_tp_call_get_contact (call);
124                         g_signal_connect (contact, "notify::capabilities",
125                                           G_CALLBACK (call_window_capabilities_notify_cb),
126                                           window);
127                         call_window_capabilities_notify_cb (contact, NULL, window);
128                 }
129         }
130
131         if (status == EMPATHY_TP_CALL_STATUS_RUNNING) {
132                 empathy_tp_call_set_output_window (window->call,
133                         gtk_socket_get_id (GTK_SOCKET (window->output_video_socket)));
134         }
135 }
136
137 static void
138 call_window_destroy_cb (GtkWidget         *widget,
139                         EmpathyCallWindow *window)
140 {
141         g_object_unref (window->call);
142         g_slice_free (EmpathyCallWindow, window);
143 }
144
145 GtkWidget *
146 empathy_call_window_show (EmpathyTpCall *call)
147 {
148         EmpathyCallWindow *window;
149         GladeXML          *glade;
150
151         window = g_slice_new0 (EmpathyCallWindow);
152
153         glade = empathy_glade_get_file ("empathy-call-window.glade",
154                                         "window",
155                                         NULL,
156                                         "window", &window->window,
157                                         "input_volume_scale", &window->input_volume_scale,
158                                         "output_volume_scale", &window->output_volume_scale,
159                                         "input_mute_togglebutton", &window->input_mute_togglebutton,
160                                         "output_mute_togglebutton", &window->output_mute_togglebutton,
161                                         "preview_video_frame", &window->preview_video_frame,
162                                         "output_video_frame", &window->output_video_frame,
163                                         "send_video_checkbutton", &window->send_video_checkbutton,
164                                         NULL);
165
166         empathy_glade_connect (glade,
167                                window,
168                                "window", "destroy", call_window_destroy_cb,
169                                "input_mute_togglebutton", "toggled", call_window_input_mute_toggled_cb,
170                                "output_mute_togglebutton", "toggled", call_window_output_mute_toggled_cb,
171                                "output_volume_scale", "value-changed", call_window_output_volume_changed_cb,
172                                "send_video_checkbutton", "toggled", call_window_send_video_toggled_cb,
173                                NULL);
174         g_object_unref (glade);
175
176         /* Set output window socket */
177         window->output_video_socket = gtk_socket_new ();
178         gtk_widget_show (window->output_video_socket);
179         gtk_container_add (GTK_CONTAINER (window->output_video_frame),
180                            window->output_video_socket);
181
182         /* Set preview window socket */
183         window->preview_video_socket = gtk_socket_new ();
184         gtk_widget_show (window->preview_video_socket);
185         gtk_container_add (GTK_CONTAINER (window->preview_video_frame),
186                            window->preview_video_socket);
187
188         /* Setup TpCall */
189         window->call = g_object_ref (call);
190         empathy_tp_call_add_preview_window (window->call,
191                 gtk_socket_get_id (GTK_SOCKET (window->preview_video_socket)));
192         g_signal_connect (window->call, "notify::status",
193                           G_CALLBACK (call_window_status_notify_cb),
194                           window);
195
196         gtk_widget_show (window->window);
197
198         return window->window;
199 }
200