2
* Remmina - The GTK+ Remote Desktop Client
3
* Copyright (C) 2009-2010 Vic Lee
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 2 of the License, or
8
* (at your option) any later version.
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.
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., 59 Temple Place, Suite 330,
18
* Boston, MA 02111-1307, USA.
22
#include <glib/gi18n.h>
25
#ifdef HAVE_LIBAVAHI_UI
26
#include <avahi-ui/avahi-ui.h>
28
#include "remminapublic.h"
29
#include "remminapref.h"
30
#include "remminaconnectionwindow.h"
31
#include "remminaprefdialog.h"
32
#include "remminafile.h"
33
#include "remminafilemanager.h"
34
#include "remminassh.h"
35
#include "remminascaler.h"
36
#include "remminawidgetpool.h"
37
#include "remminapluginmanager.h"
38
#include "remminafileeditor.h"
40
G_DEFINE_TYPE (RemminaFileEditor, remmina_file_editor, GTK_TYPE_DIALOG)
42
static const gchar *charset_list =
44
"CP437,CP720,CP737,CP775,CP850,CP852,CP855,"
45
"CP857,CP858,CP862,CP866,CP874,CP1125,CP1250,"
46
"CP1251,CP1252,CP1253,CP1254,CP1255,CP1256,"
49
"ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4,"
50
"ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,"
51
"ISO-8859-9,ISO-8859-10,ISO-8859-11,ISO-8859-12,"
52
"ISO-8859-13,ISO-8859-14,ISO-8859-15,ISO-8859-16,"
55
static const gchar *server_tips = N_(
62
static const gchar *server_tips2 = N_(
71
struct _RemminaFileEditorPriv
73
RemminaFile *remmina_file;
74
RemminaProtocolPlugin *plugin;
75
const gchar *avahi_service_type;
77
GtkWidget *name_entry;
78
GtkWidget *group_combo;
79
GtkWidget *protocol_combo;
80
GtkWidget *save_button;
82
GtkWidget *config_box;
83
GtkWidget *config_container;
85
GtkWidget *server_combo;
86
GtkWidget *password_entry;
87
GtkWidget *resolution_auto_radio;
88
GtkWidget *resolution_custom_radio;
89
GtkWidget *resolution_custom_combo;
90
GtkWidget *keymap_combo;
91
GtkWidget *scaler_widget;
93
GtkWidget *ssh_enabled_check;
94
GtkWidget *ssh_loopback_check;
95
GtkWidget *ssh_server_default_radio;
96
GtkWidget *ssh_server_custom_radio;
97
GtkWidget *ssh_server_entry;
98
GtkWidget *ssh_auth_password_radio;
99
GtkWidget *ssh_auth_publickey_radio;
100
GtkWidget *ssh_auth_auto_publickey_radio;
101
GtkWidget *ssh_username_entry;
102
GtkWidget *ssh_privatekey_chooser;
103
GtkWidget *ssh_charset_combo;
105
GHashTable *setting_widgets;
109
remmina_file_editor_class_init (RemminaFileEditorClass *klass)
113
#ifdef HAVE_LIBAVAHI_UI
115
remmina_file_editor_browse_avahi (GtkWidget *button, RemminaFileEditor *gfe)
120
dialog = aui_service_dialog_new (_("Choose a Remote Desktop Server"),
122
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
123
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
125
gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (gfe));
126
aui_service_dialog_set_resolve_service (AUI_SERVICE_DIALOG (dialog), TRUE);
127
aui_service_dialog_set_resolve_host_name (AUI_SERVICE_DIALOG (dialog), TRUE);
128
aui_service_dialog_set_browse_service_types (AUI_SERVICE_DIALOG (dialog),
129
gfe->priv->avahi_service_type, NULL);
130
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
132
host = g_strdup_printf ("[%s]:%i",
133
aui_service_dialog_get_host_name (AUI_SERVICE_DIALOG (dialog)),
134
aui_service_dialog_get_port (AUI_SERVICE_DIALOG (dialog)));
140
gtk_widget_destroy (dialog);
144
gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (gfe->priv->server_combo))), host);
151
remmina_file_editor_on_realize (GtkWidget *widget, gpointer user_data)
153
RemminaFileEditor *gfe;
154
GtkWidget *defaultwidget;
156
gfe = REMMINA_FILE_EDITOR (widget);
158
defaultwidget = gfe->priv->name_entry;
162
if (GTK_IS_EDITABLE (defaultwidget))
164
gtk_editable_select_region (GTK_EDITABLE (defaultwidget), 0, -1);
166
gtk_widget_grab_focus (defaultwidget);
171
remmina_file_editor_destroy (GtkWidget *widget, gpointer data)
173
remmina_file_free (REMMINA_FILE_EDITOR (widget)->priv->remmina_file);
174
g_hash_table_destroy (REMMINA_FILE_EDITOR (widget)->priv->setting_widgets);
175
g_free (REMMINA_FILE_EDITOR (widget)->priv);
179
remmina_file_editor_button_on_toggled (GtkToggleButton *togglebutton, GtkWidget *widget)
181
gtk_widget_set_sensitive (widget,
182
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (togglebutton)));
186
remmina_file_editor_create_notebook_container (RemminaFileEditor *gfe)
188
/* Create the notebook */
189
gfe->priv->config_container = gtk_notebook_new ();
190
gtk_container_add (GTK_CONTAINER (gfe->priv->config_box), gfe->priv->config_container);
191
gtk_container_set_border_width (GTK_CONTAINER (gfe->priv->config_container), 4);
192
gtk_widget_show (gfe->priv->config_container);
196
remmina_file_editor_create_notebook_tab (RemminaFileEditor *gfe,
197
const gchar *stock_id, const gchar *label, gint rows, gint cols)
199
GtkWidget *tablabel, *tabbody;
203
tablabel = gtk_hbox_new (FALSE, 0);
204
gtk_widget_show (tablabel);
206
widget = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
207
gtk_box_pack_start (GTK_BOX (tablabel), widget, FALSE, FALSE, 0);
208
gtk_widget_show (widget);
210
widget = gtk_label_new (label);
211
gtk_box_pack_start (GTK_BOX (tablabel), widget, FALSE, FALSE, 0);
212
gtk_widget_show (widget);
214
tabbody = gtk_vbox_new (FALSE, 0);
215
gtk_widget_show (tabbody);
216
gtk_notebook_append_page (GTK_NOTEBOOK (gfe->priv->config_container), tabbody, tablabel);
218
table = gtk_table_new (rows, cols, FALSE);
219
gtk_widget_show (table);
220
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
221
gtk_table_set_col_spacings (GTK_TABLE (table), 8);
222
gtk_container_set_border_width (GTK_CONTAINER (table), 15);
223
gtk_box_pack_start (GTK_BOX (tabbody), table, FALSE, FALSE, 0);
230
remmina_file_editor_ssh_server_custom_radio_on_toggled (GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
232
gtk_widget_set_sensitive (gfe->priv->ssh_server_entry,
233
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gfe->priv->ssh_enabled_check)) &&
234
(gfe->priv->ssh_server_custom_radio == NULL ||
235
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gfe->priv->ssh_server_custom_radio)))
240
remmina_file_editor_ssh_auth_publickey_radio_on_toggled (GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
245
b = ((!gfe->priv->ssh_enabled_check ||
246
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gfe->priv->ssh_enabled_check))) &&
247
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gfe->priv->ssh_auth_publickey_radio)));
248
gtk_widget_set_sensitive (gfe->priv->ssh_privatekey_chooser, b);
250
if (b && remmina_file_get_string (gfe->priv->remmina_file, "ssh_privatekey"))
252
s = remmina_ssh_find_identity ();
255
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (gfe->priv->ssh_privatekey_chooser), s);
262
remmina_file_editor_ssh_enabled_check_on_toggled (GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
264
gboolean enabled = TRUE;
266
if (gfe->priv->ssh_enabled_check)
268
enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gfe->priv->ssh_enabled_check));
269
if (gfe->priv->ssh_loopback_check) gtk_widget_set_sensitive (gfe->priv->ssh_loopback_check, enabled);
270
if (gfe->priv->ssh_server_default_radio) gtk_widget_set_sensitive (gfe->priv->ssh_server_default_radio, enabled);
271
if (gfe->priv->ssh_server_custom_radio) gtk_widget_set_sensitive (gfe->priv->ssh_server_custom_radio, enabled);
272
remmina_file_editor_ssh_server_custom_radio_on_toggled (NULL, gfe);
273
gtk_widget_set_sensitive (gfe->priv->ssh_charset_combo, enabled);
274
gtk_widget_set_sensitive (gfe->priv->ssh_username_entry, enabled);
275
gtk_widget_set_sensitive (gfe->priv->ssh_auth_password_radio, enabled);
276
gtk_widget_set_sensitive (gfe->priv->ssh_auth_publickey_radio, enabled);
277
gtk_widget_set_sensitive (gfe->priv->ssh_auth_auto_publickey_radio, enabled);
279
remmina_file_editor_ssh_auth_publickey_radio_on_toggled (NULL, gfe);
281
if (enabled && gtk_entry_get_text (GTK_ENTRY (gfe->priv->ssh_username_entry)) [0] == '\0')
283
gtk_entry_set_text (GTK_ENTRY (gfe->priv->ssh_username_entry), g_get_user_name ());
288
remmina_file_editor_create_ssh_privatekey (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint column)
290
RemminaFileEditorPriv *priv = gfe->priv;
293
const gchar *ssh_privatekey;
296
widget = gtk_radio_button_new_with_label_from_widget (
297
GTK_RADIO_BUTTON (priv->ssh_auth_password_radio), _("Identity file"));
298
g_signal_connect (G_OBJECT (widget), "toggled",
299
G_CALLBACK (remmina_file_editor_ssh_auth_publickey_radio_on_toggled), gfe);
300
priv->ssh_auth_publickey_radio = widget;
301
gtk_widget_show (widget);
302
gtk_table_attach (GTK_TABLE (table), widget, column, column + 1, row, row + 1, GTK_FILL, 0, 0, 0);
304
dialog = gtk_file_chooser_dialog_new (_("Identity file"), GTK_WINDOW (gfe), GTK_FILE_CHOOSER_ACTION_OPEN,
305
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
306
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
309
widget = gtk_file_chooser_button_new_with_dialog (dialog);
310
s = g_strdup_printf ("%s/.ssh", g_get_home_dir ());
311
if (g_file_test (s, G_FILE_TEST_IS_DIR))
313
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (widget), s);
316
gtk_widget_show (widget);
317
gtk_table_attach_defaults (GTK_TABLE (table), widget, column + 1, column + 2, row, row + 1);
318
priv->ssh_privatekey_chooser = widget;
320
ssh_privatekey = remmina_file_get_string (priv->remmina_file, "ssh_privatekey");
321
if (ssh_privatekey &&
322
g_file_test (ssh_privatekey, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_EXISTS))
324
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (priv->ssh_privatekey_chooser),
329
remmina_file_set_string (priv->remmina_file, "ssh_privatekey", NULL);
335
remmina_file_editor_create_server (RemminaFileEditor *gfe, const RemminaProtocolSetting *setting, GtkWidget *table, gint row)
337
RemminaProtocolPlugin *plugin = gfe->priv->plugin;
342
widget = gtk_label_new (_("Server"));
343
gtk_widget_show (widget);
344
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
345
gtk_table_attach (GTK_TABLE (table), widget, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0);
347
s = remmina_pref_get_recent (plugin->name);
348
widget = remmina_public_create_combo_entry (s, remmina_file_get_string (gfe->priv->remmina_file, "server"), TRUE);
349
gtk_widget_show (widget);
350
gtk_widget_set_tooltip_markup (widget, _(server_tips));
351
gtk_entry_set_activates_default (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (widget))), TRUE);
352
gfe->priv->server_combo = widget;
355
#ifdef HAVE_LIBAVAHI_UI
358
gfe->priv->avahi_service_type = (const gchar*) setting->opt1;
360
hbox = gtk_hbox_new (FALSE, 0);
361
gtk_widget_show (hbox);
362
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
364
widget = gtk_button_new_with_label ("...");
365
s = g_strdup_printf (_("Browse the network to find a %s server"), plugin->name);
366
gtk_widget_set_tooltip_text (widget, s);
368
gtk_widget_show (widget);
369
gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
370
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (remmina_file_editor_browse_avahi), gfe);
372
gtk_table_attach_defaults (GTK_TABLE (table), hbox, 1, 2, row, row + 1);
377
gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 2, row, row + 1);
382
remmina_file_editor_create_password (RemminaFileEditor *gfe, GtkWidget *table, gint row)
387
widget = gtk_label_new (_("Password"));
388
gtk_widget_show (widget);
389
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
390
gtk_table_attach (GTK_TABLE (table), widget, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0);
392
widget = gtk_entry_new_with_max_length (100);
393
gtk_widget_show (widget);
394
gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 2, row, row + 1);
395
gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE);
396
cs = remmina_file_get_string (gfe->priv->remmina_file, "password");
397
if (cs) gtk_entry_set_text (GTK_ENTRY (widget), cs);
398
gfe->priv->password_entry = widget;
402
remmina_file_editor_update_resolution (GtkWidget *widget, RemminaFileEditor *gfe)
404
remmina_public_load_combo_text_d (gfe->priv->resolution_custom_combo,
405
remmina_pref.resolutions,
406
remmina_file_get_string (gfe->priv->remmina_file, "resolution"),
411
remmina_file_editor_browse_resolution (GtkWidget *button, RemminaFileEditor *gfe)
415
widget = remmina_pref_dialog_new (REMMINA_PREF_RESOLUTIONS_TAB);
416
gtk_widget_show (widget);
418
g_signal_connect (G_OBJECT (widget), "destroy", G_CALLBACK (remmina_file_editor_update_resolution), gfe);
422
remmina_file_editor_create_resolution (RemminaFileEditor *gfe, const RemminaProtocolSetting *setting, GtkWidget *table, gint row)
426
const gchar *resolution;
428
widget = gtk_label_new (_("Resolution"));
429
gtk_widget_show (widget);
430
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
431
gtk_table_attach (GTK_TABLE (table), widget, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0);
433
widget = gtk_radio_button_new_with_label (NULL,
434
setting->opt1 ? _("Use window size") : _("Use client resolution"));
435
gtk_widget_show (widget);
436
gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 2, row, row + 1);
437
gfe->priv->resolution_auto_radio = widget;
439
hbox = gtk_hbox_new (FALSE, 0);
440
gtk_widget_show (hbox);
441
gtk_table_attach_defaults (GTK_TABLE (table), hbox, 1, 2, row + 1, row + 2);
443
widget = gtk_radio_button_new_with_label_from_widget (
444
GTK_RADIO_BUTTON (gfe->priv->resolution_auto_radio), _("Custom"));
445
gtk_widget_show (widget);
446
gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
447
gfe->priv->resolution_custom_radio = widget;
449
resolution = remmina_file_get_string (gfe->priv->remmina_file, "resolution");
451
widget = remmina_public_create_combo_text_d (remmina_pref.resolutions, resolution, NULL);
452
gtk_widget_show (widget);
453
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
454
gfe->priv->resolution_custom_combo = widget;
456
widget = gtk_button_new_with_label ("...");
457
gtk_widget_show (widget);
458
gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
459
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (remmina_file_editor_browse_resolution), gfe);
461
g_signal_connect (G_OBJECT (gfe->priv->resolution_custom_radio), "toggled",
462
G_CALLBACK (remmina_file_editor_button_on_toggled), gfe->priv->resolution_custom_combo);
465
strchr (resolution, 'x') == NULL)
467
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gfe->priv->resolution_auto_radio), TRUE);
468
gtk_widget_set_sensitive (gfe->priv->resolution_custom_combo, FALSE);
472
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gfe->priv->resolution_custom_radio), TRUE);
477
remmina_file_editor_create_text (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint col,
478
const gchar *label, const gchar *value)
482
widget = gtk_label_new (label);
483
gtk_widget_show (widget);
484
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
485
gtk_table_attach (GTK_TABLE (table), widget, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0);
487
widget = gtk_entry_new_with_max_length (300);
488
gtk_widget_show (widget);
489
gtk_table_attach_defaults (GTK_TABLE (table), widget, col + 1, col + 2, row, row + 1);
490
if (value) gtk_entry_set_text (GTK_ENTRY (widget), value);
496
remmina_file_editor_create_select (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint col,
497
const gchar *label, const gpointer *list, const gchar *value)
501
widget = gtk_label_new (label);
502
gtk_widget_show (widget);
503
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
504
gtk_table_attach (GTK_TABLE (table), widget, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0);
506
widget = remmina_public_create_combo_map (list, value, FALSE, gfe->priv->plugin->domain);
507
gtk_widget_show (widget);
508
gtk_table_attach_defaults (GTK_TABLE (table), widget, col + 1, col + 2, row, row + 1);
514
remmina_file_editor_create_combo (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint col,
515
const gchar *label, const gchar *list, const gchar *value)
519
widget = gtk_label_new (label);
520
gtk_widget_show (widget);
521
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
522
gtk_table_attach (GTK_TABLE (table), widget, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0);
524
widget = remmina_public_create_combo_entry (list, value, FALSE);
525
gtk_widget_show (widget);
526
gtk_table_attach_defaults (GTK_TABLE (table), widget, col + 1, col + 2, row, row + 1);
532
remmina_file_editor_create_check (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint col,
533
const gchar *label, gboolean value)
537
widget = gtk_check_button_new_with_label (label);
538
gtk_widget_show (widget);
541
gtk_table_attach_defaults (GTK_TABLE (table), widget, col, col + 2, row, row + 1);
545
gtk_box_pack_start (GTK_BOX (table), widget, TRUE, TRUE, 0);
547
if (value) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
552
remmina_file_editor_create_chooser (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint col,
553
const gchar *label, const gchar *value, gint type)
559
widget = gtk_label_new (label);
560
gtk_widget_show (widget);
561
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
562
gtk_table_attach (GTK_TABLE (table), widget, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0);
564
hbox = gtk_hbox_new (FALSE, 0);
565
gtk_widget_show (hbox);
566
gtk_table_attach_defaults (GTK_TABLE (table), hbox, col + 1, col + 2, row, row + 1);
568
check = gtk_check_button_new ();
569
gtk_widget_show (check);
570
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), (value && value[0] == '/'));
571
gtk_box_pack_start (GTK_BOX (hbox), check, FALSE, FALSE, 0);
573
widget = gtk_file_chooser_button_new (label, type);
574
gtk_widget_show (widget);
577
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), value);
579
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
581
g_signal_connect (G_OBJECT (check), "toggled",
582
G_CALLBACK (remmina_file_editor_button_on_toggled), widget);
583
remmina_file_editor_button_on_toggled (GTK_TOGGLE_BUTTON (check), widget);
589
remmina_file_editor_create_settings (RemminaFileEditor *gfe, GtkWidget *table, const RemminaProtocolSetting *settings)
591
RemminaFileEditorPriv *priv = gfe->priv;
592
GtkWidget *hbox = NULL;
597
while (settings->type != REMMINA_PROTOCOL_SETTING_TYPE_END)
599
if (settings->compact)
603
hbox = gtk_hbox_new (TRUE, 0);
604
gtk_widget_show (hbox);
605
gtk_table_attach_defaults (GTK_TABLE (table), hbox, 0, 2, row, row + 1);
608
switch (settings->type)
610
case REMMINA_PROTOCOL_SETTING_TYPE_SERVER:
611
remmina_file_editor_create_server (gfe, settings, table, row);
614
case REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD:
615
remmina_file_editor_create_password (gfe, table, row);
618
case REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION:
619
remmina_file_editor_create_resolution (gfe, settings, table, row);
623
case REMMINA_PROTOCOL_SETTING_TYPE_KEYMAP:
624
strarr = remmina_pref_keymap_groups ();
625
priv->keymap_combo = remmina_file_editor_create_select (gfe, table, row, 0,
626
_("Keyboard mapping"), (const gpointer*) strarr, remmina_file_get_string (priv->remmina_file, "keymap"));
630
case REMMINA_PROTOCOL_SETTING_TYPE_SCALE:
631
widget = gtk_label_new (_("Horizontal scale"));
632
gtk_widget_show (widget);
633
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
634
gtk_table_attach (GTK_TABLE (table), widget, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0);
636
widget = gtk_label_new (_("Vertical scale"));
637
gtk_widget_show (widget);
638
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
639
gtk_table_attach (GTK_TABLE (table), widget, 0, 1, row + 1, row + 2, GTK_FILL, 0, 0, 0);
641
widget = remmina_scaler_new ();
642
gtk_widget_show (widget);
643
gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 2, row, row + 2);
644
remmina_scaler_set (REMMINA_SCALER (widget),
645
remmina_file_get_int (priv->remmina_file, "hscale", 0),
646
remmina_file_get_int (priv->remmina_file, "vscale", 0),
647
remmina_file_get_int (priv->remmina_file, "aspectscale", FALSE));
648
priv->scaler_widget = widget;
653
case REMMINA_PROTOCOL_SETTING_TYPE_TEXT:
654
widget = remmina_file_editor_create_text (gfe, table, row, 0,
655
g_dgettext (priv->plugin->domain, settings->label),
656
remmina_file_get_string (priv->remmina_file, settings->name));
657
g_hash_table_insert (priv->setting_widgets, (gchar*) settings->name, widget);
660
case REMMINA_PROTOCOL_SETTING_TYPE_SELECT:
661
widget = remmina_file_editor_create_select (gfe, table, row, 0,
662
g_dgettext (priv->plugin->domain, settings->label),
663
(const gpointer*) settings->opt1, remmina_file_get_string (priv->remmina_file, settings->name));
664
g_hash_table_insert (priv->setting_widgets, (gchar*) settings->name, widget);
667
case REMMINA_PROTOCOL_SETTING_TYPE_COMBO:
668
widget = remmina_file_editor_create_combo (gfe, table, row, 0,
669
g_dgettext (priv->plugin->domain, settings->label),
670
(const gchar*) settings->opt1, remmina_file_get_string (priv->remmina_file, settings->name));
671
g_hash_table_insert (priv->setting_widgets, (gchar*) settings->name, widget);
674
case REMMINA_PROTOCOL_SETTING_TYPE_CHECK:
675
widget = remmina_file_editor_create_check (gfe, (hbox ? hbox : table), (hbox ? -1 : row), 0,
676
g_dgettext (priv->plugin->domain, settings->label),
677
remmina_file_get_int (priv->remmina_file, (gchar*) settings->name, FALSE));
678
g_hash_table_insert (priv->setting_widgets, (gchar*) settings->name, widget);
681
case REMMINA_PROTOCOL_SETTING_TYPE_FILE:
682
widget = remmina_file_editor_create_chooser (gfe, table, row, 0,
683
g_dgettext (priv->plugin->domain, settings->label),
684
remmina_file_get_string (priv->remmina_file, settings->name),
685
GTK_FILE_CHOOSER_ACTION_OPEN);
686
g_hash_table_insert (priv->setting_widgets, (gchar*) settings->name, widget);
689
case REMMINA_PROTOCOL_SETTING_TYPE_FOLDER:
690
widget = remmina_file_editor_create_chooser (gfe, table, row, 0,
691
g_dgettext (priv->plugin->domain, settings->label),
692
remmina_file_get_string (priv->remmina_file, settings->name),
693
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
694
g_hash_table_insert (priv->setting_widgets, (gchar*) settings->name, widget);
701
if (!settings->compact)
710
gtk_table_resize (GTK_TABLE (table), row, 2);
714
remmina_file_editor_create_ssh_tab (RemminaFileEditor *gfe, RemminaProtocolSSHSetting ssh_setting)
717
RemminaFileEditorPriv *priv = gfe->priv;
725
if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_NONE) return;
727
/* The SSH tab (implementation) */
728
if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SSH ||
729
ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SFTP)
731
s = gtk_combo_box_get_active_text (GTK_COMBO_BOX (priv->protocol_combo));
732
table = remmina_file_editor_create_notebook_tab (gfe, GTK_STOCK_DIALOG_AUTHENTICATION,
733
(s ? s : "SSH"), 8, 3);
738
table = remmina_file_editor_create_notebook_tab (gfe, GTK_STOCK_DIALOG_AUTHENTICATION,
741
hbox = gtk_hbox_new (TRUE, 0);
742
gtk_widget_show (hbox);
743
gtk_table_attach_defaults (GTK_TABLE (table), hbox, 0, 3, 0, 1);
746
widget = gtk_check_button_new_with_label (_("Enable SSH tunnel"));
747
gtk_widget_show (widget);
748
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
749
g_signal_connect (G_OBJECT (widget), "toggled",
750
G_CALLBACK (remmina_file_editor_ssh_enabled_check_on_toggled), gfe);
751
priv->ssh_enabled_check = widget;
753
widget = gtk_check_button_new_with_label (_("Tunnel via loopback address"));
754
gtk_widget_show (widget);
755
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
756
priv->ssh_loopback_check = widget;
759
/* SSH Server group */
760
remmina_public_create_group (GTK_TABLE (table), _("SSH Server"), row, 3, 3);
765
case REMMINA_PROTOCOL_SSH_SETTING_TUNNEL:
766
s = g_strdup_printf (_("Same server at port %i"), DEFAULT_SSH_PORT);
767
widget = gtk_radio_button_new_with_label (NULL, s);
769
gtk_widget_show (widget);
770
gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 3, row, row + 1);
771
priv->ssh_server_default_radio = widget;
774
widget = gtk_radio_button_new_with_label_from_widget (
775
GTK_RADIO_BUTTON (priv->ssh_server_default_radio), _("Custom"));
776
gtk_widget_show (widget);
777
gtk_table_attach (GTK_TABLE (table), widget, 1, 2, row, row + 1, GTK_FILL, 0, 0, 0);
778
g_signal_connect (G_OBJECT (widget), "toggled",
779
G_CALLBACK (remmina_file_editor_ssh_server_custom_radio_on_toggled), gfe);
780
priv->ssh_server_custom_radio = widget;
782
widget = gtk_entry_new_with_max_length (100);
783
gtk_widget_show (widget);
784
gtk_widget_set_tooltip_markup (widget, _(server_tips2));
785
gtk_table_attach_defaults (GTK_TABLE (table), widget, 2, 3, row, row + 1);
786
priv->ssh_server_entry = widget;
790
case REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL:
791
priv->ssh_server_default_radio = NULL;
792
priv->ssh_server_custom_radio = NULL;
794
priv->ssh_server_entry = remmina_file_editor_create_text (gfe, table, row, 1,
796
gtk_widget_set_tooltip_markup (priv->ssh_server_entry, _(server_tips));
800
case REMMINA_PROTOCOL_SSH_SETTING_SSH:
801
case REMMINA_PROTOCOL_SSH_SETTING_SFTP:
802
priv->ssh_server_default_radio = NULL;
803
priv->ssh_server_custom_radio = NULL;
804
priv->ssh_server_entry = NULL;
806
s = remmina_pref_get_recent ("SFTP");
807
priv->server_combo = remmina_file_editor_create_combo (gfe, table, row, 1,
808
_("Server"), s, remmina_file_get_string (priv->remmina_file, "server"));
809
gtk_widget_set_tooltip_markup (priv->server_combo, _(server_tips));
810
gtk_entry_set_activates_default (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->server_combo))), TRUE);
819
priv->ssh_charset_combo = remmina_file_editor_create_combo (gfe, table, row, 1,
820
_("Character set"), charset_list, remmina_file_get_string (priv->remmina_file, "ssh_charset"));
823
if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SSH)
825
widget = remmina_file_editor_create_text (gfe, table, row, 1,
826
_("Startup program"), NULL);
827
cs = remmina_file_get_string (priv->remmina_file, "exec");
828
gtk_entry_set_text (GTK_ENTRY (widget), cs ? cs : "");
829
g_hash_table_insert (priv->setting_widgets, "exec", widget);
832
else if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SFTP)
834
widget = remmina_file_editor_create_text (gfe, table, row, 1,
835
_("Startup path"), NULL);
836
cs = remmina_file_get_string (priv->remmina_file, "execpath");
837
gtk_entry_set_text (GTK_ENTRY (widget), cs ? cs : "");
838
g_hash_table_insert (priv->setting_widgets, "execpath", widget);
842
/* SSH Authentication frame */
843
remmina_public_create_group (GTK_TABLE (table), _("SSH Authentication"), row, 5, 3);
846
priv->ssh_username_entry = remmina_file_editor_create_text (gfe, table, row, 1,
847
_("User name"), NULL);
850
widget = gtk_radio_button_new_with_label (NULL, _("Password"));
851
gtk_widget_show (widget);
852
gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 3, row, row + 1);
853
priv->ssh_auth_password_radio = widget;
856
widget = gtk_radio_button_new_with_label_from_widget (
857
GTK_RADIO_BUTTON (priv->ssh_auth_password_radio), _("Public key (automatic)"));
858
gtk_widget_show (widget);
859
gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 3, row, row + 1);
860
priv->ssh_auth_auto_publickey_radio = widget;
863
remmina_file_editor_create_ssh_privatekey (gfe, table, row, 1);
867
cs = remmina_file_get_string (priv->remmina_file, "ssh_server");
868
if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_TUNNEL)
870
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->ssh_enabled_check),
871
remmina_file_get_int (priv->remmina_file, "ssh_enabled", FALSE));
872
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->ssh_loopback_check),
873
remmina_file_get_int (priv->remmina_file, "ssh_loopback", FALSE));
875
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cs ?
876
priv->ssh_server_custom_radio : priv->ssh_server_default_radio), TRUE);
877
gtk_entry_set_text (GTK_ENTRY (priv->ssh_server_entry),
880
else if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL)
882
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->ssh_enabled_check),
883
remmina_file_get_int (priv->remmina_file, "ssh_enabled", FALSE));
884
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->ssh_loopback_check),
885
remmina_file_get_int (priv->remmina_file, "ssh_loopback", FALSE));
886
gtk_entry_set_text (GTK_ENTRY (priv->ssh_server_entry),
890
cs = remmina_file_get_string (priv->remmina_file, "ssh_username");
891
gtk_entry_set_text (GTK_ENTRY (priv->ssh_username_entry), cs ? cs : "");
892
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (
893
remmina_file_get_int (priv->remmina_file, "ssh_auth", 0) == SSH_AUTH_PUBLICKEY ?
894
priv->ssh_auth_publickey_radio :
895
remmina_file_get_int (priv->remmina_file, "ssh_auth", 0) == SSH_AUTH_AUTO_PUBLICKEY ?
896
priv->ssh_auth_auto_publickey_radio :
897
priv->ssh_auth_password_radio), TRUE);
899
remmina_file_editor_ssh_enabled_check_on_toggled (NULL, gfe);
904
remmina_file_editor_create_all_settings (RemminaFileEditor *gfe)
906
RemminaFileEditorPriv *priv = gfe->priv;
909
remmina_file_editor_create_notebook_container (gfe);
912
if (priv->plugin->basic_settings)
914
table = remmina_file_editor_create_notebook_tab (gfe, GTK_STOCK_INFO, _("Basic"), 20, 2);
915
remmina_file_editor_create_settings (gfe, table, priv->plugin->basic_settings);
918
/* The Advanced tab */
919
if (priv->plugin->advanced_settings)
921
table = remmina_file_editor_create_notebook_tab (gfe, GTK_STOCK_DIALOG_WARNING, _("Advanced"), 20, 2);
922
remmina_file_editor_create_settings (gfe, table, priv->plugin->advanced_settings);
926
remmina_file_editor_create_ssh_tab (gfe, priv->plugin->ssh_setting);
930
remmina_file_editor_protocol_combo_on_changed (GtkComboBox *combo, RemminaFileEditor *gfe)
932
RemminaFileEditorPriv *priv = gfe->priv;
935
if (priv->config_container)
937
gtk_container_remove (GTK_CONTAINER (priv->config_box), priv->config_container);
938
priv->config_container = NULL;
941
priv->server_combo = NULL;
942
priv->password_entry = NULL;
943
priv->resolution_auto_radio = NULL;
944
priv->resolution_custom_radio = NULL;
945
priv->resolution_custom_combo = NULL;
946
priv->keymap_combo = NULL;
947
priv->scaler_widget = NULL;
949
priv->ssh_enabled_check = NULL;
950
priv->ssh_loopback_check = NULL;
951
priv->ssh_server_default_radio = NULL;
952
priv->ssh_server_custom_radio = NULL;
953
priv->ssh_server_entry = NULL;
954
priv->ssh_username_entry = NULL;
955
priv->ssh_auth_password_radio = NULL;
956
priv->ssh_auth_publickey_radio = NULL;
957
priv->ssh_auth_auto_publickey_radio = NULL;
958
priv->ssh_privatekey_chooser = NULL;
959
priv->ssh_charset_combo = NULL;
961
g_hash_table_remove_all (priv->setting_widgets);
963
protocol = gtk_combo_box_get_active_text (combo);
966
priv->plugin = (RemminaProtocolPlugin *) remmina_plugin_manager_get_plugin (REMMINA_PLUGIN_TYPE_PROTOCOL, protocol);
968
remmina_file_editor_create_all_settings (gfe);
973
remmina_file_editor_update_ssh (RemminaFileEditor *gfe)
975
RemminaFileEditorPriv *priv = gfe->priv;
976
gboolean ssh_enabled;
978
if (priv->ssh_charset_combo)
980
remmina_file_set_string_ref (priv->remmina_file, "ssh_charset",
981
gtk_combo_box_get_active_text (GTK_COMBO_BOX (priv->ssh_charset_combo)));
984
if (g_strcmp0 (remmina_file_get_string (priv->remmina_file, "protocol"), "SFTP") == 0 ||
985
g_strcmp0 (remmina_file_get_string (priv->remmina_file, "protocol"), "SSH") == 0)
991
ssh_enabled = (priv->ssh_enabled_check ?
992
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->ssh_enabled_check)) : FALSE);
993
remmina_file_set_int (priv->remmina_file, "ssh_loopback", (priv->ssh_loopback_check ?
994
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->ssh_loopback_check)) : FALSE));
996
remmina_file_set_int (priv->remmina_file, "ssh_enabled", ssh_enabled);
997
remmina_file_set_string (priv->remmina_file, "ssh_username", (ssh_enabled ?
998
gtk_entry_get_text (GTK_ENTRY (priv->ssh_username_entry)) : NULL));
999
remmina_file_set_string (priv->remmina_file, "ssh_server", (ssh_enabled && priv->ssh_server_entry &&
1000
(priv->ssh_server_custom_radio == NULL ||
1001
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->ssh_server_custom_radio))) ?
1002
gtk_entry_get_text (GTK_ENTRY (priv->ssh_server_entry)) : NULL));
1003
remmina_file_set_int (priv->remmina_file, "ssh_auth", (
1004
priv->ssh_auth_publickey_radio &&
1005
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->ssh_auth_publickey_radio)) ?
1006
SSH_AUTH_PUBLICKEY :
1007
priv->ssh_auth_auto_publickey_radio &&
1008
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->ssh_auth_auto_publickey_radio)) ?
1009
SSH_AUTH_AUTO_PUBLICKEY :
1010
SSH_AUTH_PASSWORD));
1011
remmina_file_set_string (priv->remmina_file, "ssh_privatekey", (
1012
priv->ssh_privatekey_chooser ?
1013
gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (priv->ssh_privatekey_chooser)) : NULL));
1017
remmina_file_editor_update_settings (RemminaFileEditor *gfe)
1019
RemminaFileEditorPriv *priv = gfe->priv;
1020
GHashTableIter iter;
1021
gpointer key, value;
1023
g_hash_table_iter_init (&iter, priv->setting_widgets);
1024
while (g_hash_table_iter_next (&iter, &key, &value))
1026
if (GTK_IS_ENTRY (value))
1028
remmina_file_set_string (priv->remmina_file, (gchar*) key,
1029
gtk_entry_get_text (GTK_ENTRY (value)));
1031
else if (GTK_IS_COMBO_BOX (value))
1033
remmina_file_set_string_ref (priv->remmina_file, (gchar*) key,
1034
gtk_combo_box_get_active_text (GTK_COMBO_BOX (value)));
1036
else if (GTK_IS_FILE_CHOOSER (value))
1038
remmina_file_set_string (priv->remmina_file, (gchar*) key,
1039
gtk_widget_get_sensitive (GTK_WIDGET (value)) ?
1040
gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (value)) :
1043
else if (GTK_IS_TOGGLE_BUTTON (value))
1045
remmina_file_set_int (priv->remmina_file, (gchar*) key,
1046
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (value)));
1052
remmina_file_editor_update (RemminaFileEditor *gfe)
1054
RemminaFileEditorPriv *priv = gfe->priv;
1056
remmina_file_set_string (priv->remmina_file, "name", gtk_entry_get_text (GTK_ENTRY (priv->name_entry)));
1058
remmina_file_set_string_ref (priv->remmina_file, "group", (priv->group_combo ?
1059
gtk_combo_box_get_active_text (GTK_COMBO_BOX (priv->group_combo)) : NULL));
1061
remmina_file_set_string_ref (priv->remmina_file, "protocol",
1062
gtk_combo_box_get_active_text (GTK_COMBO_BOX (priv->protocol_combo)));
1064
remmina_file_set_string_ref (priv->remmina_file, "server", (priv->server_combo ?
1065
gtk_combo_box_get_active_text (GTK_COMBO_BOX (priv->server_combo)) : NULL));
1067
remmina_file_set_string (priv->remmina_file, "password", (priv->password_entry ?
1068
gtk_entry_get_text (GTK_ENTRY (priv->password_entry)) : NULL));
1070
if (priv->resolution_auto_radio)
1072
remmina_file_set_string_ref (priv->remmina_file, "resolution", (
1073
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->resolution_auto_radio)) ?
1075
gtk_combo_box_get_active_text (GTK_COMBO_BOX (priv->resolution_custom_combo))));
1078
if (priv->keymap_combo)
1080
remmina_file_set_string_ref (priv->remmina_file, "keymap",
1081
gtk_combo_box_get_active_text (GTK_COMBO_BOX (priv->keymap_combo)));
1084
if (priv->scaler_widget)
1086
remmina_file_set_int (priv->remmina_file, "hscale", REMMINA_SCALER (priv->scaler_widget)->hscale);
1087
remmina_file_set_int (priv->remmina_file, "vscale", REMMINA_SCALER (priv->scaler_widget)->vscale);
1088
remmina_file_set_int (priv->remmina_file, "aspectscale", REMMINA_SCALER (priv->scaler_widget)->aspectscale);
1091
remmina_file_editor_update_ssh (gfe);
1092
remmina_file_editor_update_settings (gfe);
1096
remmina_file_editor_on_default (GtkWidget *button, RemminaFileEditor *gfe)
1101
remmina_file_editor_update (gfe);
1103
gf = remmina_file_dup (gfe->priv->remmina_file);
1105
remmina_file_set_filename (gf, remmina_pref_file);
1107
/* Clear properties that should never be default */
1108
remmina_file_set_string (gf, "name", NULL);
1109
remmina_file_set_string (gf, "server", NULL);
1110
remmina_file_set_string (gf, "password", NULL);
1112
remmina_file_save_all (gf);
1113
remmina_file_free (gf);
1115
dialog = gtk_message_dialog_new (GTK_WINDOW (gfe),
1116
GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
1117
_("Default settings saved."));
1118
gtk_dialog_run (GTK_DIALOG (dialog));
1119
gtk_widget_destroy (dialog);
1123
remmina_file_editor_on_save (GtkWidget *button, RemminaFileEditor *gfe)
1125
remmina_file_editor_update (gfe);
1126
remmina_file_save_all (gfe->priv->remmina_file);
1127
gtk_widget_destroy (GTK_WIDGET (gfe));
1131
remmina_file_editor_on_connect (GtkWidget *button, RemminaFileEditor *gfe)
1135
remmina_file_editor_update (gfe);
1136
if (remmina_pref.save_when_connect)
1138
remmina_file_save_all (gfe->priv->remmina_file);
1140
gf = remmina_file_dup (gfe->priv->remmina_file);
1141
/* Put server into name for Quick Connect */
1142
if (remmina_file_get_filename (gf) == NULL)
1144
remmina_file_set_string (gf, "name", remmina_file_get_string (gf, "server"));
1146
gtk_widget_destroy (GTK_WIDGET (gfe));
1147
remmina_connection_window_open_from_file (gf);
1151
remmina_file_editor_on_cancel (GtkWidget *button, RemminaFileEditor *gfe)
1153
gtk_widget_destroy (GTK_WIDGET (gfe));
1157
remmina_file_editor_init (RemminaFileEditor *gfe)
1159
RemminaFileEditorPriv *priv;
1162
priv = g_new0 (RemminaFileEditorPriv, 1);
1165
/* Create the editor dialog */
1166
gtk_window_set_title (GTK_WINDOW (gfe), _("Remote Desktop Preference"));
1168
widget = gtk_dialog_add_button (GTK_DIALOG (gfe), GTK_STOCK_SAVE, GTK_RESPONSE_APPLY);
1169
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (remmina_file_editor_on_save), gfe);
1170
gtk_widget_set_sensitive (widget, FALSE);
1171
priv->save_button = widget;
1173
widget = gtk_dialog_add_button (GTK_DIALOG (gfe), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
1174
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (remmina_file_editor_on_cancel), gfe);
1176
widget = gtk_dialog_add_button (GTK_DIALOG (gfe), GTK_STOCK_CONNECT, GTK_RESPONSE_OK);
1177
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (remmina_file_editor_on_connect), gfe);
1179
gtk_dialog_set_alternative_button_order (GTK_DIALOG (gfe),
1180
GTK_RESPONSE_OK, GTK_RESPONSE_APPLY, GTK_RESPONSE_CANCEL, -1);
1181
gtk_dialog_set_default_response (GTK_DIALOG (gfe), GTK_RESPONSE_OK);
1182
gtk_dialog_set_has_separator (GTK_DIALOG (gfe), FALSE);
1183
gtk_window_set_default_size (GTK_WINDOW (gfe), 450, 500);
1185
g_signal_connect (G_OBJECT (gfe),
1186
"destroy",G_CALLBACK (remmina_file_editor_destroy), NULL);
1187
g_signal_connect (G_OBJECT (gfe),
1188
"realize",G_CALLBACK (remmina_file_editor_on_realize), NULL);
1190
/* The Set As Default button */
1191
widget = gtk_button_new_with_label (_("Default"));
1192
gtk_widget_show (widget);
1193
gtk_button_set_image (GTK_BUTTON (widget), gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_BUTTON));
1194
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (gfe)->action_area), widget, FALSE, TRUE, 0);
1195
gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (GTK_DIALOG (gfe)->action_area), widget, TRUE);
1197
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (remmina_file_editor_on_default), gfe);
1199
priv->setting_widgets = g_hash_table_new (g_str_hash, g_str_equal);
1201
remmina_widget_pool_register (GTK_WIDGET (gfe));
1205
remmina_file_editor_iterate_protocol (gchar *protocol, RemminaPlugin *plugin, gpointer data)
1207
RemminaFileEditor *gfe = REMMINA_FILE_EDITOR (data);
1208
GtkListStore *store;
1212
store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (gfe->priv->protocol_combo)));
1214
first = !gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
1216
gtk_list_store_append (store, &iter);
1217
gtk_list_store_set (store, &iter,
1219
1, g_dgettext (plugin->domain, plugin->description),
1220
2, ((RemminaProtocolPlugin *)plugin)->icon_name,
1223
if (first || g_strcmp0 (protocol, remmina_file_get_string (gfe->priv->remmina_file, "protocol")) == 0)
1225
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (gfe->priv->protocol_combo), &iter);
1232
remmina_file_editor_check_profile (RemminaFileEditor *gfe)
1234
RemminaFileEditorPriv *priv;
1237
if (remmina_file_get_filename (priv->remmina_file))
1239
gtk_widget_set_sensitive (priv->group_combo, TRUE);
1240
gtk_widget_set_sensitive (priv->save_button, TRUE);
1245
remmina_file_editor_name_on_changed (GtkEditable *editable, RemminaFileEditor *gfe)
1247
RemminaFileEditorPriv *priv;
1250
if (remmina_file_get_filename (priv->remmina_file) == NULL)
1252
remmina_file_generate_filename (priv->remmina_file);
1253
remmina_file_editor_check_profile (gfe);
1258
remmina_file_editor_new_from_file (RemminaFile *remminafile)
1260
RemminaFileEditor *gfe;
1261
RemminaFileEditorPriv *priv;
1268
gfe = REMMINA_FILE_EDITOR (g_object_new (REMMINA_TYPE_FILE_EDITOR, NULL));
1270
priv->remmina_file = remminafile;
1272
if (remmina_file_get_filename (remminafile) == NULL)
1274
gtk_dialog_set_response_sensitive (GTK_DIALOG (gfe), GTK_RESPONSE_APPLY, FALSE);
1277
/* Create the Profile group on the top (for name and protocol) */
1278
table = gtk_table_new (4, 3, FALSE);
1279
gtk_widget_show (table);
1280
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
1281
gtk_table_set_col_spacings (GTK_TABLE (table), 8);
1282
gtk_container_set_border_width (GTK_CONTAINER (table), 8);
1283
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (gfe)->vbox), table, FALSE, FALSE, 2);
1285
remmina_public_create_group (GTK_TABLE (table), _("Profile"), 0, 4, 3);
1288
widget = gtk_label_new (_("Name"));
1289
gtk_widget_show (widget);
1290
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
1291
gtk_table_attach (GTK_TABLE (table), widget, 1, 2, 1, 2, GTK_FILL, 0, 0, 0);
1293
widget = gtk_entry_new_with_max_length (100);
1294
gtk_widget_show (widget);
1295
gtk_table_attach_defaults (GTK_TABLE (table), widget, 2, 3, 1, 2);
1296
priv->name_entry = widget;
1298
if (remmina_file_get_filename (remminafile) == NULL)
1300
gtk_entry_set_text (GTK_ENTRY (widget), _("Quick Connect"));
1301
g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (remmina_file_editor_name_on_changed), gfe);
1305
cs = remmina_file_get_string (remminafile, "name");
1306
gtk_entry_set_text (GTK_ENTRY (widget), cs ? cs : "");
1309
/* Profile: Group */
1310
widget = gtk_label_new (_("Group"));
1311
gtk_widget_show (widget);
1312
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
1313
gtk_table_attach (GTK_TABLE (table), widget, 1, 2, 2, 3, GTK_FILL, 0, 0, 0);
1315
groups = remmina_file_manager_get_groups ();
1316
priv->group_combo = remmina_public_create_combo_entry (groups, remmina_file_get_string (remminafile, "group"), FALSE);
1318
gtk_widget_show (priv->group_combo);
1319
gtk_table_attach_defaults (GTK_TABLE (table), priv->group_combo, 2, 3, 2, 3);
1320
gtk_widget_set_sensitive (priv->group_combo, FALSE);
1322
s = g_strdup_printf (_("Use '%s' as subgroup delimiter"), "/");
1323
gtk_widget_set_tooltip_text (priv->group_combo, s);
1326
/* Profile: Protocol */
1327
widget = gtk_label_new (_("Protocol"));
1328
gtk_widget_show (widget);
1329
gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
1330
gtk_table_attach (GTK_TABLE (table), widget, 1, 2, 3, 4, GTK_FILL, 0, 0, 0);
1332
widget = remmina_public_create_combo (TRUE);
1333
gtk_widget_show (widget);
1334
gtk_table_attach_defaults (GTK_TABLE (table), widget, 2, 3, 3, 4);
1335
priv->protocol_combo = widget;
1336
remmina_plugin_manager_for_each_plugin (REMMINA_PLUGIN_TYPE_PROTOCOL, remmina_file_editor_iterate_protocol, gfe);
1337
g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (remmina_file_editor_protocol_combo_on_changed), gfe);
1339
/* Create the Preference frame */
1340
widget = gtk_event_box_new ();
1341
gtk_widget_show (widget);
1342
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (gfe)->vbox), widget, TRUE, TRUE, 2);
1343
priv->config_box = widget;
1345
priv->config_container = NULL;
1347
remmina_file_editor_protocol_combo_on_changed (GTK_COMBO_BOX (priv->protocol_combo), gfe);
1349
remmina_file_editor_check_profile (gfe);
1351
return GTK_WIDGET (gfe);
1355
remmina_file_editor_new (void)
1357
return remmina_file_editor_new_full (NULL, NULL);
1361
remmina_file_editor_new_full (const gchar *server, const gchar *protocol)
1363
RemminaFile *remminafile;
1365
remminafile = remmina_file_new ();
1366
if (server) remmina_file_set_string (remminafile, "server", server);
1367
if (protocol) remmina_file_set_string (remminafile, "protocol", protocol);
1369
return remmina_file_editor_new_from_file (remminafile);
1373
remmina_file_editor_new_copy (const gchar *filename)
1375
RemminaFile *remminafile;
1378
remminafile = remmina_file_copy (filename);
1381
return remmina_file_editor_new_from_file (remminafile);
1385
dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
1386
_("File %s not found."), filename);
1387
gtk_dialog_run (GTK_DIALOG (dialog));
1388
gtk_widget_destroy (dialog);
1394
remmina_file_editor_new_from_filename (const gchar *filename)
1396
RemminaFile *remminafile;
1399
remminafile = remmina_file_manager_load_file (filename);
1402
return remmina_file_editor_new_from_file (remminafile);
1406
dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
1407
_("File %s not found."), filename);
1408
gtk_dialog_run (GTK_DIALOG (dialog));
1409
gtk_widget_destroy (dialog);