//Connect popup, no cancel button and not always in front extern void popup_connect(const char *msg) { GtkWidget *dialog_content_area = NULL, *msg_label = NULL, *addr_grid = NULL, *addr_label = NULL, *address_entry_field = NULL, *port_grid = NULL, *port_label = NULL, *port_entry_field = NULL; /*dialog*/ dialog_connect = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(dialog_connect), "Connect to server"); //set it to transient (belongs to window below, may not outlast it and is always on top) gtk_window_set_transient_for(GTK_WINDOW(dialog_connect), GTK_WINDOW(window) ); dialog_content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog_connect)); /*message label*/ msg_label = gtk_label_new(msg); /*address grid*/ addr_grid = gtk_grid_new(); gtk_grid_set_column_spacing(GTK_GRID(addr_grid), 10); /*address label*/ addr_label = gtk_label_new("Address:"); gtk_widget_set_hexpand(addr_label, TRUE); gtk_widget_set_halign(addr_label, GTK_ALIGN_START); /*address entry*/ address_entry_field = gtk_entry_new(); /*port grid*/ port_grid = gtk_grid_new(); gtk_grid_set_column_spacing(GTK_GRID(port_grid), 10); /*port label*/ port_label = gtk_label_new("Port:"); gtk_widget_set_hexpand(port_label, TRUE); gtk_widget_set_halign(port_label, GTK_ALIGN_START); /*port entry*/ port_entry_field = gtk_entry_new(); gtk_entry_set_input_purpose(GTK_ENTRY(port_entry_field), GTK_INPUT_PURPOSE_DIGITS); //help the onscreen keyboards /*pack message and address and port inputs*/ gtk_box_pack_start( GTK_BOX(dialog_content_area), msg_label, FALSE, FALSE, 0 ); gtk_grid_attach(GTK_GRID(addr_grid), addr_label, 0, 0, 1, 1); gtk_grid_attach(GTK_GRID(addr_grid), address_entry_field, 1, 0, 1, 1); gtk_box_pack_start( GTK_BOX(dialog_content_area), addr_grid, FALSE, FALSE, 0 ); gtk_grid_attach(GTK_GRID(port_grid), port_label, 0, 0, 1, 1); gtk_grid_attach(GTK_GRID(port_grid), port_entry_field, 1, 0, 1, 1); gtk_box_pack_start( GTK_BOX(dialog_content_area), port_grid, FALSE, FALSE, 0 ); gtk_dialog_add_button( GTK_DIALOG(dialog_connect), "Connect", GTK_RESPONSE_OK ); /*connect the "response" signal*/ g_signal_connect( GTK_DIALOG(dialog_connect), "response", G_CALLBACK(connect_cb), NULL); g_signal_connect_swapped( GTK_DIALOG(dialog_connect), "response", G_CALLBACK(gtk_widget_destroy), dialog_connect); //show gtk_widget_show(msg_label); gtk_widget_show(addr_grid); gtk_widget_show(addr_label); gtk_widget_show(address_entry_field); gtk_widget_show(port_grid); gtk_widget_show(port_label); gtk_widget_show(port_entry_field); gtk_widget_show(dialog_connect); //we no longer need the pointer to the dialog, the callbacks have it if they need it dialog_connect = NULL; return; }
static void build_tab_view(AccountGeneralTab *view) { g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view)); AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view); int grid_row = 0; GtkWidget *label = NULL; /* separate pointers for each so that we reference them in the account changed callback */ GtkWidget *entry_alias = NULL; GtkWidget *entry_username = NULL; GtkWidget *entry_hostname = NULL; GtkWidget *entry_password = NULL; GtkWidget *entry_proxy = NULL; GtkWidget *entry_voicemail = NULL; GtkWidget *checkbutton_autoanswer = NULL; GtkWidget *checkbutton_upnp = NULL; GtkWidget *radiobutton_dtmf_rtp = NULL; GtkWidget *radiobutton_dtmf_sip = NULL; /* build account grid */ /* check if its ip2ip account */ const QByteArray& alias = priv->account->alias().toLocal8Bit(); if (strcmp(alias.constData(), "IP2IP") == 0) { label = gtk_label_new("IP2IP"); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1); ++grid_row; } else { /* account alias */ label = gtk_label_new(_("Alias")); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1); entry_alias = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(entry_alias), alias.constData()); gtk_widget_set_halign(entry_alias, GTK_ALIGN_START); g_signal_connect(entry_alias, "changed", G_CALLBACK(account_alias_changed), view); gtk_grid_attach(GTK_GRID(priv->grid_account), entry_alias, 1, grid_row, 1, 1); ++grid_row; /* account type */ label = gtk_label_new(_("Type")); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1); label = gtk_label_new(""); gtk_widget_set_halign(label, GTK_ALIGN_START); switch (priv->account->protocol()) { case Account::Protocol::SIP: gtk_label_set_text(GTK_LABEL(label), "SIP"); break; case Account::Protocol::IAX: gtk_label_set_text(GTK_LABEL(label), "IAX"); break; case Account::Protocol::RING: gtk_label_set_text(GTK_LABEL(label), "RING"); break; case Account::Protocol::COUNT__: break; } gtk_grid_attach(GTK_GRID(priv->grid_account), label, 1, grid_row, 1, 1); ++grid_row; } if (priv->account->protocol() == Account::Protocol::RING) { label = gtk_label_new("RingID"); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1); entry_username = gtk_entry_new(); gtk_entry_set_placeholder_text(GTK_ENTRY(entry_username), _("auto-generating...")); gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData()); g_object_set(G_OBJECT(entry_username), "editable", FALSE, NULL); g_object_set(G_OBJECT(entry_username), "max-width-chars", 50, NULL); gtk_widget_override_font(entry_username, pango_font_description_from_string("monospace")); gtk_entry_set_alignment(GTK_ENTRY(entry_username), 0.5); gtk_grid_attach(GTK_GRID(priv->grid_account), entry_username, 1, grid_row, 1, 1); ++grid_row; } gtk_widget_show_all(priv->grid_account); /* build parameters grid */ grid_row = 0; if (strcmp(alias.constData(), "IP2IP") != 0) { if (priv->account->protocol() != Account::Protocol::RING) { /* SIP and IAX have the same params */ /* host name */ label = gtk_label_new(_("Hostname")); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1); entry_hostname = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData()); g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view); gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1); ++grid_row; /* user name */ label = gtk_label_new(_("Username")); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1); entry_username = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData()); g_signal_connect(entry_username, "changed", G_CALLBACK(account_username_changed), view); gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_username, 1, grid_row, 1, 1); ++grid_row; /* password */ label = gtk_label_new(_("Password")); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1); entry_password = gtk_entry_new(); gtk_entry_set_input_purpose(GTK_ENTRY(entry_password), GTK_INPUT_PURPOSE_PASSWORD); gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry_password), GTK_ENTRY_ICON_PRIMARY, "dialog-password"); gtk_entry_set_visibility(GTK_ENTRY(entry_password), FALSE); gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData()); g_signal_connect(entry_password, "changed", G_CALLBACK(account_password_changed), view); gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_password, 1, grid_row, 1, 1); ++grid_row; /* show password */ GtkWidget *checkbutton = gtk_check_button_new_with_label(_("Show password")); gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton, 1, grid_row, 1, 1); g_signal_connect(checkbutton, "toggled", G_CALLBACK(show_password), entry_password); ++grid_row; /* proxy */ label = gtk_label_new(_("Proxy")); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1); entry_proxy = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData()); g_signal_connect(entry_proxy, "changed", G_CALLBACK(account_proxy_changed), view); gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_proxy, 1, grid_row, 1, 1); ++grid_row; /* voicemail number */ label = gtk_label_new(_("Voicemail number")); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1); entry_voicemail = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData()); g_signal_connect(entry_voicemail, "changed", G_CALLBACK(account_mailbox_changed), view); gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_voicemail, 1, grid_row, 1, 1); ++grid_row; } else { /* RING accoutn */ /* bootstrap */ label = gtk_label_new(C_("The DHT bootstrap server url", "Bootstrap")); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1); entry_hostname = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData()); g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view); gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1); ++grid_row; } } /* auto answer */ checkbutton_autoanswer = gtk_check_button_new_with_label(_("Auto-answer calls")); gtk_widget_set_halign(checkbutton_autoanswer, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_autoanswer, 0, grid_row, 1, 1); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer()); g_signal_connect(checkbutton_autoanswer, "toggled", G_CALLBACK(auto_answer), view); ++grid_row; /* upnp */ checkbutton_upnp = gtk_check_button_new_with_label(_("UPnP enabled")); gtk_widget_set_halign(checkbutton_upnp, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_upnp, 0, grid_row, 1, 1); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled()); g_signal_connect(checkbutton_upnp, "toggled", G_CALLBACK(upnp_enabled), view); ++grid_row; /* DTMF tone type */ label = gtk_label_new(_("DTMF tone type:")); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1); GtkWidget *dtmf_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); gtk_button_box_set_layout(GTK_BUTTON_BOX(dtmf_box), GTK_BUTTONBOX_START); gtk_box_set_spacing(GTK_BOX(dtmf_box), 10); radiobutton_dtmf_rtp = gtk_radio_button_new_with_label(NULL, "RTP"); radiobutton_dtmf_sip = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON(radiobutton_dtmf_rtp), "SIP"); gtk_toggle_button_set_active( priv->account->DTMFType() == DtmfType::OverRtp ? GTK_TOGGLE_BUTTON(radiobutton_dtmf_rtp) : GTK_TOGGLE_BUTTON(radiobutton_dtmf_sip), TRUE); g_signal_connect(radiobutton_dtmf_rtp, "toggled", G_CALLBACK(dtmf_set_rtp), view); gtk_box_pack_start(GTK_BOX(dtmf_box), radiobutton_dtmf_rtp, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(dtmf_box), radiobutton_dtmf_sip, FALSE, TRUE, 0); gtk_grid_attach(GTK_GRID(priv->grid_parameters), dtmf_box, 1, grid_row, 1, 1); ++grid_row; /* update account parameters if model is updated */ priv->account_updated = QObject::connect( priv->account, &Account::changed, [=] () { if (strcmp(alias.constData(), "IP2IP") != 0) { gtk_entry_set_text(GTK_ENTRY(entry_alias), priv->account->alias().toLocal8Bit().constData()); gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData()); gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData()); if (priv->account->protocol() != Account::Protocol::RING) { gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData()); gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData()); gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData()); } } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer()); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled()); gtk_toggle_button_set_active( priv->account->DTMFType() == DtmfType::OverRtp ? GTK_TOGGLE_BUTTON(radiobutton_dtmf_rtp) : GTK_TOGGLE_BUTTON(radiobutton_dtmf_sip), TRUE); } ); gtk_widget_show_all(priv->grid_parameters); }