blob: e91901798c3dc7c6c2a6d774df99ab8ffa4ebbc2 [file] [log] [blame]
Stepan Salenikovich61cbab02015-03-16 18:35:10 -04001/*
2 * Copyright (C) 2015 Savoir-Faire Linux Inc.
3 * Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Additional permission under GNU GPL version 3 section 7:
20 *
21 * If you modify this program, or any covered work, by linking or
22 * combining it with the OpenSSL project's OpenSSL library (or a
23 * modified version of that library), containing parts covered by the
24 * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
25 * grants you additional permission to convey the resulting work.
26 * Corresponding Source for a non-source form of such a combination
27 * shall include the source code for the parts of OpenSSL used as well
28 * as that of the covered work.
29 */
30
31#include "accountgeneraltab.h"
32
33#include <gtk/gtk.h>
34#include <account.h>
35
36struct _AccountGeneralTab
37{
38 GtkBox parent;
39};
40
41struct _AccountGeneralTabClass
42{
43 GtkBoxClass parent_class;
44};
45
46typedef struct _AccountGeneralTabPrivate AccountGeneralTabPrivate;
47
48struct _AccountGeneralTabPrivate
49{
50 Account *account;
51 GtkWidget *grid_account;
52 GtkWidget *grid_parameters;
Stepan Salenikovichbd029582015-03-24 11:00:56 -040053
54 QMetaObject::Connection account_updated;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040055};
56
57G_DEFINE_TYPE_WITH_PRIVATE(AccountGeneralTab, account_general_tab, GTK_TYPE_BOX);
58
59#define ACCOUNT_GENERAL_TAB_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ACCOUNT_GENERAL_TAB_TYPE, AccountGeneralTabPrivate))
60
61static void
62account_general_tab_dispose(GObject *object)
63{
Stepan Salenikovichbd029582015-03-24 11:00:56 -040064 AccountGeneralTab *view = ACCOUNT_GENERAL_TAB(object);
65 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
66
67 QObject::disconnect(priv->account_updated);
68
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040069 G_OBJECT_CLASS(account_general_tab_parent_class)->dispose(object);
70}
71
72static void
73account_general_tab_init(AccountGeneralTab *view)
74{
75 gtk_widget_init_template(GTK_WIDGET(view));
76}
77
78static void
79account_general_tab_class_init(AccountGeneralTabClass *klass)
80{
81 G_OBJECT_CLASS(klass)->dispose = account_general_tab_dispose;
82
83 gtk_widget_class_set_template_from_resource(GTK_WIDGET_CLASS (klass),
84 "/cx/ring/RingGnome/accountgeneraltab.ui");
85
86 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_account);
87 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_parameters);
88}
89
90static void
91account_alias_changed(GtkEditable *entry, AccountGeneralTab *view)
92{
93 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
94 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
95 priv->account->setAlias(QString(gtk_editable_get_chars(entry, 0, -1)));
Stepan Salenikovich75a39172015-07-10 13:21:08 -040096 if (priv->account->protocol() == Account::Protocol::RING)
97 priv->account->setDisplayName(gtk_entry_get_text(GTK_ENTRY(entry)));
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040098}
99
100static void
101account_hostname_changed(GtkEditable *entry, AccountGeneralTab *view)
102{
103 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
104 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
105 priv->account->setHostname(QString(gtk_editable_get_chars(entry, 0, -1)));
106}
107
108static void
109account_username_changed(GtkEditable *entry, AccountGeneralTab *view)
110{
111 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
112 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
113 priv->account->setUsername(QString(gtk_editable_get_chars(entry, 0, -1)));
114}
115
116static void
117account_password_changed(GtkEditable *entry, AccountGeneralTab *view)
118{
119 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
120 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
121 priv->account->setPassword(QString(gtk_editable_get_chars(entry, 0, -1)));
122}
123
124static void
125show_password(GtkToggleButton *checkbutton, GtkEntry *entry)
126{
127 gtk_entry_set_visibility(GTK_ENTRY(entry), gtk_toggle_button_get_active(checkbutton));
128}
129
130static void
131account_proxy_changed(GtkEditable *entry, AccountGeneralTab *view)
132{
133 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
134 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
135 priv->account->setProxy(QString(gtk_editable_get_chars(entry, 0, -1)));
136}
137
138static void
139account_mailbox_changed(GtkEditable *entry, AccountGeneralTab *view)
140{
141 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
142 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
143 priv->account->setMailbox(QString(gtk_editable_get_chars(entry, 0, -1)));
144}
145
146static void
147auto_answer(GtkToggleButton *checkbutton, AccountGeneralTab *view)
148{
149 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
150 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
151 priv->account->setAutoAnswer(gtk_toggle_button_get_active(checkbutton));
152}
153
154static void
155upnp_enabled(GtkToggleButton *checkbutton, AccountGeneralTab *view)
156{
157 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
158 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
159 priv->account->setUpnpEnabled(gtk_toggle_button_get_active(checkbutton));
160}
161
Stepan Salenikovich96ee9a02015-04-28 10:23:13 -0400162static void
163dtmf_set_rtp(GtkToggleButton *toggle_rtp, AccountGeneralTab *view)
164{
165 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
166 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
167 if (gtk_toggle_button_get_active(toggle_rtp)) {
168 g_debug("set DTMF over RTP");
169 priv->account->setDTMFType(DtmfType::OverRtp);
170 } else {
171 g_debug("set DTMF over SIP");
172 priv->account->setDTMFType(DtmfType::OverSip);
173 }
174}
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400175
176static void
177build_tab_view(AccountGeneralTab *view)
178{
179 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
180 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
181
182 int grid_row = 0;
183 GtkWidget *label = NULL;
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400184
185 /* separate pointers for each so that we reference them in the account changed callback */
186 GtkWidget *entry_alias = NULL;
187 GtkWidget *entry_username = NULL;
188 GtkWidget *entry_hostname = NULL;
189 GtkWidget *entry_password = NULL;
190 GtkWidget *entry_proxy = NULL;
191 GtkWidget *entry_voicemail = NULL;
192 GtkWidget *checkbutton_autoanswer = NULL;
193 GtkWidget *checkbutton_upnp = NULL;
Stepan Salenikovich96ee9a02015-04-28 10:23:13 -0400194 GtkWidget *radiobutton_dtmf_rtp = NULL;
195 GtkWidget *radiobutton_dtmf_sip = NULL;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400196
197 /* build account grid */
198
199 /* check if its ip2ip account */
200 const QByteArray& alias = priv->account->alias().toLocal8Bit();
201
202 if (strcmp(alias.constData(), "IP2IP") == 0) {
203 label = gtk_label_new("IP2IP");
204 gtk_widget_set_halign(label, GTK_ALIGN_START);
205 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
206 ++grid_row;
207 } else {
208 /* account alias */
209 label = gtk_label_new("Alias");
210 gtk_widget_set_halign(label, GTK_ALIGN_START);
211 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400212 entry_alias = gtk_entry_new();
213 gtk_entry_set_text(GTK_ENTRY(entry_alias), alias.constData());
214 gtk_widget_set_halign(entry_alias, GTK_ALIGN_START);
215 g_signal_connect(entry_alias, "changed", G_CALLBACK(account_alias_changed), view);
216 gtk_grid_attach(GTK_GRID(priv->grid_account), entry_alias, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400217 ++grid_row;
218
219 /* account type */
220 label = gtk_label_new("Type");
221 gtk_widget_set_halign(label, GTK_ALIGN_START);
222 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
223
224 label = gtk_label_new("");
225 gtk_widget_set_halign(label, GTK_ALIGN_START);
226 switch (priv->account->protocol()) {
227 case Account::Protocol::SIP:
228 gtk_label_set_text(GTK_LABEL(label), "SIP");
229 break;
230 case Account::Protocol::IAX:
231 gtk_label_set_text(GTK_LABEL(label), "IAX");
232 break;
233 case Account::Protocol::RING:
234 gtk_label_set_text(GTK_LABEL(label), "RING");
235 break;
236 case Account::Protocol::COUNT__:
237 break;
238 }
239
240 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 1, grid_row, 1, 1);
241 ++grid_row;
242 }
243
244 if (priv->account->protocol() == Account::Protocol::RING) {
245 label = gtk_label_new("Hash");
246 gtk_widget_set_halign(label, GTK_ALIGN_START);
247 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400248 entry_username = gtk_entry_new();
249 gtk_entry_set_placeholder_text(GTK_ENTRY(entry_username), "auto-generating...");
250 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
251 g_object_set(G_OBJECT(entry_username), "editable", FALSE, NULL);
252 g_object_set(G_OBJECT(entry_username), "max-width-chars", 50, NULL);
253 gtk_widget_override_font(entry_username, pango_font_description_from_string("monospace"));
254 gtk_entry_set_alignment(GTK_ENTRY(entry_username), 0.5);
255 gtk_grid_attach(GTK_GRID(priv->grid_account), entry_username, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400256 ++grid_row;
257 }
258
259 gtk_widget_show_all(priv->grid_account);
260
261 /* build parameters grid */
262 grid_row = 0;
263 if (strcmp(alias.constData(), "IP2IP") != 0) {
264 if (priv->account->protocol() != Account::Protocol::RING) {
265 /* SIP and IAX have the same params */
266
267 /* host name */
268 label = gtk_label_new("Host name");
269 gtk_widget_set_halign(label, GTK_ALIGN_START);
270 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400271 entry_hostname = gtk_entry_new();
272 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
273 g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view);
274 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400275 ++grid_row;
276
277 /* user name */
278 label = gtk_label_new("User name");
279 gtk_widget_set_halign(label, GTK_ALIGN_START);
280 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400281 entry_username = gtk_entry_new();
282 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
283 g_signal_connect(entry_username, "changed", G_CALLBACK(account_username_changed), view);
284 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_username, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400285 ++grid_row;
286
287 /* password */
288 label = gtk_label_new("Password");
289 gtk_widget_set_halign(label, GTK_ALIGN_START);
290 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400291 entry_password = gtk_entry_new();
292 gtk_entry_set_input_purpose(GTK_ENTRY(entry_password), GTK_INPUT_PURPOSE_PASSWORD);
293 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry_password), GTK_ENTRY_ICON_PRIMARY, "dialog-password");
294 gtk_entry_set_visibility(GTK_ENTRY(entry_password), FALSE);
295 gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
296 g_signal_connect(entry_password, "changed", G_CALLBACK(account_password_changed), view);
297 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_password, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400298 ++grid_row;
299
300 /* show password */
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400301 GtkWidget *checkbutton = gtk_check_button_new_with_label("Show password");
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400302 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton, 1, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400303 g_signal_connect(checkbutton, "toggled", G_CALLBACK(show_password), entry_password);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400304 ++grid_row;
305
306 /* proxy */
307 label = gtk_label_new("Proxy");
308 gtk_widget_set_halign(label, GTK_ALIGN_START);
309 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400310 entry_proxy = gtk_entry_new();
311 gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
312 g_signal_connect(entry_proxy, "changed", G_CALLBACK(account_proxy_changed), view);
313 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_proxy, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400314 ++grid_row;
315
316 /* voicemail number */
317 label = gtk_label_new("Voicemail number");
318 gtk_widget_set_halign(label, GTK_ALIGN_START);
319 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400320 entry_voicemail = gtk_entry_new();
321 gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
322 g_signal_connect(entry_voicemail, "changed", G_CALLBACK(account_mailbox_changed), view);
323 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_voicemail, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400324 ++grid_row;
325 } else {
326 /* RING accoutn */
327
328 /* bootstrap */
329 label = gtk_label_new("Bootstrap");
330 gtk_widget_set_halign(label, GTK_ALIGN_START);
331 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400332 entry_hostname = gtk_entry_new();
333 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
334 g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view);
335 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400336 ++grid_row;
337 }
338 }
339
340 /* auto answer */
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400341 checkbutton_autoanswer = gtk_check_button_new_with_label("Auto-answer calls");
342 gtk_widget_set_halign(checkbutton_autoanswer, GTK_ALIGN_START);
343 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_autoanswer, 0, grid_row, 1, 1);
344 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer());
345 g_signal_connect(checkbutton_autoanswer, "toggled", G_CALLBACK(auto_answer), view);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400346 ++grid_row;
347
348 /* upnp */
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400349 checkbutton_upnp = gtk_check_button_new_with_label("UPnP enabled");
350 gtk_widget_set_halign(checkbutton_upnp, GTK_ALIGN_START);
351 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_upnp, 0, grid_row, 1, 1);
352 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled());
353 g_signal_connect(checkbutton_upnp, "toggled", G_CALLBACK(upnp_enabled), view);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400354 ++grid_row;
355
Stepan Salenikovich96ee9a02015-04-28 10:23:13 -0400356 /* DTMF tone type */
357 label = gtk_label_new("DTMF tone type:");
358 gtk_widget_set_halign(label, GTK_ALIGN_START);
359 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
360
361 GtkWidget *dtmf_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
362 gtk_button_box_set_layout(GTK_BUTTON_BOX(dtmf_box), GTK_BUTTONBOX_START);
363 gtk_box_set_spacing(GTK_BOX(dtmf_box), 10);
364 radiobutton_dtmf_rtp = gtk_radio_button_new_with_label(NULL, "RTP");
365 radiobutton_dtmf_sip = gtk_radio_button_new_with_label_from_widget(
366 GTK_RADIO_BUTTON(radiobutton_dtmf_rtp),
367 "SIP");
368 gtk_toggle_button_set_active(
369 priv->account->DTMFType() == DtmfType::OverRtp ?
370 GTK_TOGGLE_BUTTON(radiobutton_dtmf_rtp) : GTK_TOGGLE_BUTTON(radiobutton_dtmf_sip),
371 TRUE);
372 g_signal_connect(radiobutton_dtmf_rtp, "toggled", G_CALLBACK(dtmf_set_rtp), view);
373 gtk_box_pack_start(GTK_BOX(dtmf_box),
374 radiobutton_dtmf_rtp,
375 FALSE, TRUE, 0);
376 gtk_box_pack_start(GTK_BOX(dtmf_box),
377 radiobutton_dtmf_sip,
378 FALSE, TRUE, 0);
379 gtk_grid_attach(GTK_GRID(priv->grid_parameters), dtmf_box, 1, grid_row, 1, 1);
380 ++grid_row;
381
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400382 /* update account parameters if model is updated */
383 priv->account_updated = QObject::connect(
384 priv->account,
385 &Account::changed,
386 [=] () {
387 if (strcmp(alias.constData(), "IP2IP") != 0) {
388 gtk_entry_set_text(GTK_ENTRY(entry_alias), priv->account->alias().toLocal8Bit().constData());
389 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
390 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
391
392 if (priv->account->protocol() != Account::Protocol::RING) {
393 gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
394 gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
395 gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
396 }
397 }
398
399 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer());
400 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled());
Stepan Salenikovich96ee9a02015-04-28 10:23:13 -0400401 gtk_toggle_button_set_active(
402 priv->account->DTMFType() == DtmfType::OverRtp ?
403 GTK_TOGGLE_BUTTON(radiobutton_dtmf_rtp) : GTK_TOGGLE_BUTTON(radiobutton_dtmf_sip),
404 TRUE);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400405 }
406 );
407
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400408 gtk_widget_show_all(priv->grid_parameters);
409
410}
411
412GtkWidget *
413account_general_tab_new(Account *account)
414{
415 g_return_val_if_fail(account != NULL, NULL);
416
417 gpointer view = g_object_new(ACCOUNT_GENERAL_TAB_TYPE, NULL);
418
419 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
420 priv->account = account;
421
422 build_tab_view(ACCOUNT_GENERAL_TAB(view));
423
424 return (GtkWidget *)view;
425}