~ubuntu-branches/ubuntu/raring/remmina/raring

« back to all changes in this revision

Viewing changes to src/remminafileeditor.c

  • Committer: Package Import Robot
  • Author(s): Luca Falavigna
  • Date: 2012-02-11 17:28:48 UTC
  • mfrom: (1.2.8)
  • Revision ID: package-import@ubuntu.com-20120211172848-rh3ffi7075qyobuq
Tags: 1.0.0-1
* New upstream release.
  - Compatible with FreeRDP 1.0 (Closes: #658363).
  - Ported to GTK3, this also fixes an incompatibility with
    GTK2 and recent Avahi with GTK3 support, which lead to
    crashes when scanning network services (Closes: #626499).
* debian/patches/libvncserver.patch:
  - Do not use convenience copy of libvncserver.
* debian/patches/g_thread_init.patch:
  - Do not use deprecated g_thread_init function.
* debian/patches/REMMINA_COMMAND_NONE.patch:
  - Removed, obsoleted by GApplication port.
* debian/clean:
  - Remove spurious files created at build-time.
* debian/compat:
  - Bump compatibility level to 9.
* debian/control:
  - Refresh build-dependencies to match new structure.
  - Drop remmina-dev package, no longer used.
  - Build packages once provided by remmina-plugins.
  - Provide remmina-common package.
  - Provide remmina-plugin-gnome package.
* debian/copyright:
  - Refresh copyright information.
* debian/docs:
  - Documentation is no longer accurate, do not ship it anymore.
* debian/remmina-dev.install:
  - Drop remmina-dev package, no longer used.
* debian/remmina-plugin-telepathy.install:
  - Adjust location for Remmina.client.
  - Disable D-BUS support for now.
* debian/rules:
  - Compile with -DWITH_APPINDICATOR=OFF.
  - Do not treat plugins as shared libraries.
* debian/watch:
  - Adjust watch file to match new download location.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Remmina - The GTK+ Remote Desktop Client
3
 
 * Copyright (C) 2009-2010 Vic Lee 
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 2 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., 59 Temple Place, Suite 330, 
18
 
 * Boston, MA 02111-1307, USA.
19
 
 */
20
 
 
21
 
#include <gtk/gtk.h>
22
 
#include <glib/gi18n.h>
23
 
#include <stdlib.h>
24
 
#include "config.h"
25
 
#ifdef HAVE_LIBAVAHI_UI
26
 
#include <avahi-ui/avahi-ui.h>
27
 
#endif
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"
39
 
 
40
 
G_DEFINE_TYPE (RemminaFileEditor, remmina_file_editor, GTK_TYPE_DIALOG)
41
 
 
42
 
static const gchar *charset_list =
43
 
    "ASCII,BIG5,"
44
 
    "CP437,CP720,CP737,CP775,CP850,CP852,CP855,"
45
 
    "CP857,CP858,CP862,CP866,CP874,CP1125,CP1250,"
46
 
    "CP1251,CP1252,CP1253,CP1254,CP1255,CP1256,"
47
 
    "CP1257,CP1258,"
48
 
    "EUC-JP,EUC-KR,GBK,"
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,"
53
 
    "KOI8-R,SJIS,UTF-8";
54
 
 
55
 
static const gchar *server_tips = N_(
56
 
    "<tt><big>"
57
 
    "Supported formats\n"
58
 
    "* server\n"
59
 
    "* server:port\n"
60
 
    "* [server]:port"
61
 
    "</big></tt>");
62
 
static const gchar *server_tips2 = N_(
63
 
    "<tt><big>"
64
 
    "Supported formats\n"
65
 
    "* :port\n"
66
 
    "* server\n"
67
 
    "* server:port\n"
68
 
    "* [server]:port"
69
 
    "</big></tt>");
70
 
 
71
 
struct _RemminaFileEditorPriv
72
 
{
73
 
    RemminaFile *remmina_file;
74
 
    RemminaProtocolPlugin *plugin;
75
 
    const gchar *avahi_service_type;
76
 
 
77
 
    GtkWidget *name_entry;
78
 
    GtkWidget *group_combo;
79
 
    GtkWidget *protocol_combo;
80
 
    GtkWidget *save_button;
81
 
 
82
 
    GtkWidget *config_box;
83
 
    GtkWidget *config_container;
84
 
 
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;
92
 
 
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;
104
 
 
105
 
    GHashTable *setting_widgets;
106
 
};
107
 
 
108
 
static void
109
 
remmina_file_editor_class_init (RemminaFileEditorClass *klass)
110
 
{
111
 
}
112
 
 
113
 
#ifdef HAVE_LIBAVAHI_UI
114
 
static void
115
 
remmina_file_editor_browse_avahi (GtkWidget *button, RemminaFileEditor *gfe)
116
 
{
117
 
    GtkWidget *dialog;
118
 
    gchar *host;
119
 
 
120
 
    dialog = aui_service_dialog_new (_("Choose a Remote Desktop Server"),
121
 
        GTK_WINDOW (gfe),
122
 
        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
123
 
        GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
124
 
        NULL);
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)
131
 
    {
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)));
135
 
    }
136
 
    else
137
 
    {
138
 
        host = NULL;
139
 
    }
140
 
    gtk_widget_destroy (dialog);
141
 
 
142
 
    if (host)
143
 
    {
144
 
        gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (gfe->priv->server_combo))), host);
145
 
        g_free (host);
146
 
    }
147
 
}
148
 
#endif
149
 
 
150
 
static void
151
 
remmina_file_editor_on_realize (GtkWidget *widget, gpointer user_data)
152
 
{
153
 
    RemminaFileEditor *gfe;
154
 
    GtkWidget *defaultwidget;
155
 
 
156
 
    gfe = REMMINA_FILE_EDITOR (widget);
157
 
 
158
 
    defaultwidget = gfe->priv->name_entry;
159
 
 
160
 
    if (defaultwidget)
161
 
    {
162
 
        if (GTK_IS_EDITABLE (defaultwidget))
163
 
        {
164
 
            gtk_editable_select_region (GTK_EDITABLE (defaultwidget), 0, -1);
165
 
        }
166
 
        gtk_widget_grab_focus (defaultwidget);
167
 
    }
168
 
}
169
 
 
170
 
static void
171
 
remmina_file_editor_destroy (GtkWidget *widget, gpointer data)
172
 
{
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);
176
 
}
177
 
 
178
 
static void
179
 
remmina_file_editor_button_on_toggled (GtkToggleButton *togglebutton, GtkWidget *widget)
180
 
{
181
 
    gtk_widget_set_sensitive (widget, 
182
 
        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (togglebutton)));
183
 
}
184
 
 
185
 
static void
186
 
remmina_file_editor_create_notebook_container (RemminaFileEditor *gfe)
187
 
{
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);
193
 
}
194
 
 
195
 
static GtkWidget*
196
 
remmina_file_editor_create_notebook_tab (RemminaFileEditor *gfe,
197
 
    const gchar *stock_id, const gchar *label, gint rows, gint cols)
198
 
{
199
 
    GtkWidget *tablabel, *tabbody;
200
 
    GtkWidget *table;
201
 
    GtkWidget *widget;
202
 
 
203
 
    tablabel = gtk_hbox_new (FALSE, 0);
204
 
    gtk_widget_show (tablabel);
205
 
 
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);
209
 
 
210
 
    widget = gtk_label_new (label);
211
 
    gtk_box_pack_start (GTK_BOX (tablabel), widget, FALSE, FALSE, 0);
212
 
    gtk_widget_show (widget);
213
 
 
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);
217
 
 
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);
224
 
 
225
 
    return table;
226
 
}
227
 
 
228
 
#ifdef HAVE_LIBSSH
229
 
static void
230
 
remmina_file_editor_ssh_server_custom_radio_on_toggled (GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
231
 
{
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)))
236
 
    );
237
 
}
238
 
 
239
 
static void
240
 
remmina_file_editor_ssh_auth_publickey_radio_on_toggled (GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
241
 
{
242
 
    gboolean b;
243
 
    gchar *s;
244
 
 
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);
249
 
 
250
 
    if (b && remmina_file_get_string (gfe->priv->remmina_file, "ssh_privatekey"))
251
 
    {
252
 
        s = remmina_ssh_find_identity ();
253
 
        if (s)
254
 
        {
255
 
            gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (gfe->priv->ssh_privatekey_chooser), s);
256
 
            g_free (s);
257
 
        }
258
 
    }
259
 
}
260
 
 
261
 
static void
262
 
remmina_file_editor_ssh_enabled_check_on_toggled (GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
263
 
{
264
 
    gboolean enabled = TRUE;
265
 
 
266
 
    if (gfe->priv->ssh_enabled_check)
267
 
    {
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);
278
 
    }
279
 
    remmina_file_editor_ssh_auth_publickey_radio_on_toggled (NULL, gfe);
280
 
 
281
 
    if (enabled && gtk_entry_get_text (GTK_ENTRY (gfe->priv->ssh_username_entry)) [0] == '\0')
282
 
    {
283
 
        gtk_entry_set_text (GTK_ENTRY (gfe->priv->ssh_username_entry), g_get_user_name ());
284
 
    }
285
 
}
286
 
 
287
 
static void
288
 
remmina_file_editor_create_ssh_privatekey (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint column)
289
 
{
290
 
    RemminaFileEditorPriv *priv = gfe->priv;
291
 
    GtkWidget *widget;
292
 
    GtkWidget *dialog;
293
 
    const gchar *ssh_privatekey;
294
 
    gchar *s;
295
 
 
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);
303
 
 
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,
307
 
        NULL);
308
 
 
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))
312
 
    {
313
 
        gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (widget), s);
314
 
    }
315
 
    g_free (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;
319
 
 
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))
323
 
    {
324
 
        gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (priv->ssh_privatekey_chooser),
325
 
            ssh_privatekey);
326
 
    }
327
 
    else
328
 
    {
329
 
        remmina_file_set_string (priv->remmina_file, "ssh_privatekey", NULL);
330
 
    }
331
 
}
332
 
#endif
333
 
 
334
 
static void
335
 
remmina_file_editor_create_server (RemminaFileEditor *gfe, const RemminaProtocolSetting *setting, GtkWidget *table, gint row)
336
 
{
337
 
    RemminaProtocolPlugin *plugin = gfe->priv->plugin;
338
 
    GtkWidget *widget;
339
 
    GtkWidget *hbox;
340
 
    gchar *s;
341
 
 
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);
346
 
 
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;
353
 
    g_free (s);
354
 
 
355
 
#ifdef HAVE_LIBAVAHI_UI
356
 
    if (setting->opt1)
357
 
    {
358
 
        gfe->priv->avahi_service_type = (const gchar*) setting->opt1;
359
 
 
360
 
        hbox = gtk_hbox_new (FALSE, 0);
361
 
        gtk_widget_show (hbox);
362
 
        gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
363
 
 
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);
367
 
        g_free (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);
371
 
 
372
 
        gtk_table_attach_defaults (GTK_TABLE (table), hbox, 1, 2, row, row + 1);
373
 
    }
374
 
    else
375
 
#endif
376
 
    {
377
 
        gtk_table_attach_defaults (GTK_TABLE (table), widget, 1, 2, row, row + 1);
378
 
    }
379
 
}
380
 
 
381
 
static void
382
 
remmina_file_editor_create_password (RemminaFileEditor *gfe, GtkWidget *table, gint row)
383
 
{
384
 
    GtkWidget *widget;
385
 
    const gchar *cs;
386
 
 
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);
391
 
 
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;
399
 
}
400
 
 
401
 
static void
402
 
remmina_file_editor_update_resolution (GtkWidget *widget, RemminaFileEditor *gfe)
403
 
{
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"),
407
 
        NULL);
408
 
}
409
 
 
410
 
static void
411
 
remmina_file_editor_browse_resolution (GtkWidget *button, RemminaFileEditor *gfe)
412
 
{
413
 
    GtkWidget *widget;
414
 
 
415
 
    widget = remmina_pref_dialog_new (REMMINA_PREF_RESOLUTIONS_TAB);
416
 
    gtk_widget_show (widget);
417
 
 
418
 
    g_signal_connect (G_OBJECT (widget), "destroy", G_CALLBACK (remmina_file_editor_update_resolution), gfe);
419
 
}
420
 
 
421
 
static void
422
 
remmina_file_editor_create_resolution (RemminaFileEditor *gfe, const RemminaProtocolSetting *setting, GtkWidget *table, gint row)
423
 
{
424
 
    GtkWidget *widget;
425
 
    GtkWidget *hbox;
426
 
    const gchar *resolution;
427
 
 
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);
432
 
 
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;
438
 
 
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);
442
 
 
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;
448
 
 
449
 
    resolution = remmina_file_get_string (gfe->priv->remmina_file, "resolution");
450
 
 
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;
455
 
 
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);
460
 
 
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);
463
 
 
464
 
    if (!resolution ||
465
 
        strchr (resolution, 'x') == NULL)
466
 
    {
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);
469
 
    }
470
 
    else
471
 
    {
472
 
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gfe->priv->resolution_custom_radio), TRUE);
473
 
    }
474
 
}
475
 
 
476
 
static GtkWidget*
477
 
remmina_file_editor_create_text (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint col,
478
 
    const gchar *label, const gchar *value)
479
 
{
480
 
    GtkWidget *widget;
481
 
 
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);
486
 
 
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);
491
 
 
492
 
    return widget;
493
 
}
494
 
 
495
 
static GtkWidget*
496
 
remmina_file_editor_create_select (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint col,
497
 
    const gchar *label, const gpointer *list, const gchar *value)
498
 
{
499
 
    GtkWidget *widget;
500
 
 
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);
505
 
 
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);
509
 
 
510
 
    return widget;
511
 
}
512
 
 
513
 
static GtkWidget*
514
 
remmina_file_editor_create_combo (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint col,
515
 
    const gchar *label, const gchar *list, const gchar *value)
516
 
{
517
 
    GtkWidget *widget;
518
 
 
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);
523
 
 
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);
527
 
 
528
 
    return widget;
529
 
}
530
 
 
531
 
static GtkWidget*
532
 
remmina_file_editor_create_check (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint col,
533
 
    const gchar *label, gboolean value)
534
 
{
535
 
    GtkWidget *widget;
536
 
 
537
 
    widget = gtk_check_button_new_with_label (label);
538
 
    gtk_widget_show (widget);
539
 
    if (row >= 0)
540
 
    {
541
 
        gtk_table_attach_defaults (GTK_TABLE (table), widget, col, col + 2, row, row + 1);
542
 
    }
543
 
    else
544
 
    {
545
 
        gtk_box_pack_start (GTK_BOX (table), widget, TRUE, TRUE, 0);
546
 
    }
547
 
    if (value) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
548
 
    return widget;
549
 
}
550
 
 
551
 
static GtkWidget*
552
 
remmina_file_editor_create_chooser (RemminaFileEditor *gfe, GtkWidget *table, gint row, gint col,
553
 
    const gchar *label, const gchar *value, gint type)
554
 
{
555
 
    GtkWidget *check;
556
 
    GtkWidget *widget;
557
 
    GtkWidget *hbox;
558
 
 
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);
563
 
 
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);
567
 
 
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);
572
 
 
573
 
    widget = gtk_file_chooser_button_new (label, type);
574
 
    gtk_widget_show (widget);
575
 
    if (value)
576
 
    {
577
 
        gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), value);
578
 
    }
579
 
    gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
580
 
 
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);
584
 
 
585
 
    return widget;
586
 
}
587
 
 
588
 
static void
589
 
remmina_file_editor_create_settings (RemminaFileEditor *gfe, GtkWidget *table, const RemminaProtocolSetting *settings)
590
 
{
591
 
    RemminaFileEditorPriv *priv = gfe->priv;
592
 
    GtkWidget *hbox = NULL;
593
 
    GtkWidget *widget;
594
 
    gint row = 0;
595
 
    gchar **strarr;
596
 
 
597
 
    while (settings->type != REMMINA_PROTOCOL_SETTING_TYPE_END)
598
 
    {
599
 
        if (settings->compact)
600
 
        {
601
 
            if (hbox == NULL)
602
 
            {
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);
606
 
            }
607
 
        }
608
 
        switch (settings->type)
609
 
        {
610
 
        case REMMINA_PROTOCOL_SETTING_TYPE_SERVER:
611
 
            remmina_file_editor_create_server (gfe, settings, table, row);
612
 
            break;
613
 
 
614
 
        case REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD:
615
 
            remmina_file_editor_create_password (gfe, table, row);
616
 
            break;
617
 
 
618
 
        case REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION:
619
 
            remmina_file_editor_create_resolution (gfe, settings, table, row);
620
 
            row++;
621
 
            break;
622
 
 
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"));
627
 
            g_strfreev (strarr);
628
 
            break;
629
 
 
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);
635
 
 
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);
640
 
 
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;
649
 
 
650
 
            row++;
651
 
            break;
652
 
 
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);
658
 
            break;
659
 
 
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);
665
 
            break;
666
 
 
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);
672
 
            break;
673
 
 
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);
679
 
            break;
680
 
 
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);
687
 
            break;
688
 
 
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);
695
 
            break;
696
 
 
697
 
        default:
698
 
            break;
699
 
        }
700
 
 
701
 
        if (!settings->compact)
702
 
        {
703
 
            hbox = NULL;
704
 
            row++;
705
 
        }
706
 
 
707
 
        settings++;
708
 
    }
709
 
 
710
 
    gtk_table_resize (GTK_TABLE (table), row, 2);
711
 
}
712
 
 
713
 
static void
714
 
remmina_file_editor_create_ssh_tab (RemminaFileEditor *gfe, RemminaProtocolSSHSetting ssh_setting)
715
 
{
716
 
#ifdef HAVE_LIBSSH
717
 
    RemminaFileEditorPriv *priv = gfe->priv;
718
 
    GtkWidget *table;
719
 
    GtkWidget *hbox;
720
 
    GtkWidget *widget;
721
 
    const gchar *cs;
722
 
    gchar *s;
723
 
    gint row = 0;
724
 
 
725
 
    if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_NONE) return;
726
 
 
727
 
    /* The SSH tab (implementation) */
728
 
    if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SSH ||
729
 
        ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SFTP)
730
 
    {
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);
734
 
        g_free (s);
735
 
    }
736
 
    else
737
 
    {
738
 
        table = remmina_file_editor_create_notebook_tab (gfe, GTK_STOCK_DIALOG_AUTHENTICATION,
739
 
            "SSH", 9, 3);
740
 
 
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);
744
 
        row++;
745
 
 
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;
752
 
 
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;
757
 
    }
758
 
 
759
 
    /* SSH Server group */
760
 
    remmina_public_create_group (GTK_TABLE (table), _("SSH Server"), row, 3, 3);
761
 
    row++;
762
 
 
763
 
    switch (ssh_setting)
764
 
    {
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);
768
 
        g_free (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;
772
 
        row++;
773
 
 
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;
781
 
 
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;
787
 
        row++;
788
 
        break;
789
 
 
790
 
    case REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL:
791
 
        priv->ssh_server_default_radio = NULL;
792
 
        priv->ssh_server_custom_radio = NULL;
793
 
 
794
 
        priv->ssh_server_entry = remmina_file_editor_create_text (gfe, table, row, 1,
795
 
            _("Server"), NULL);
796
 
        gtk_widget_set_tooltip_markup (priv->ssh_server_entry, _(server_tips));
797
 
        row++;
798
 
        break;
799
 
 
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;
805
 
 
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);
811
 
        g_free (s);
812
 
        row++;
813
 
        break;
814
 
 
815
 
    default:
816
 
        break;
817
 
    }
818
 
 
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"));
821
 
    row++;
822
 
 
823
 
    if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SSH)
824
 
    {
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);
830
 
        row++;
831
 
    }
832
 
    else if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SFTP)
833
 
    {
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);
839
 
        row++;
840
 
    }
841
 
 
842
 
    /* SSH Authentication frame */
843
 
    remmina_public_create_group (GTK_TABLE (table), _("SSH Authentication"), row, 5, 3);
844
 
    row++;
845
 
 
846
 
    priv->ssh_username_entry = remmina_file_editor_create_text (gfe, table, row, 1,
847
 
        _("User name"), NULL);
848
 
    row++;
849
 
 
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;
854
 
    row++;
855
 
 
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;
861
 
    row++;
862
 
 
863
 
    remmina_file_editor_create_ssh_privatekey (gfe, table, row, 1);
864
 
    row++;
865
 
 
866
 
    /* Set the values */
867
 
    cs = remmina_file_get_string (priv->remmina_file, "ssh_server");
868
 
    if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_TUNNEL)
869
 
    {
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));
874
 
 
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),
878
 
            cs ? cs : "");
879
 
    }
880
 
    else if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL)
881
 
    {
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),
887
 
            cs ? cs : "");
888
 
    }
889
 
 
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);
898
 
 
899
 
    remmina_file_editor_ssh_enabled_check_on_toggled (NULL, gfe);
900
 
#endif
901
 
}
902
 
 
903
 
static void
904
 
remmina_file_editor_create_all_settings (RemminaFileEditor *gfe)
905
 
{
906
 
    RemminaFileEditorPriv *priv = gfe->priv;
907
 
    GtkWidget *table;
908
 
 
909
 
    remmina_file_editor_create_notebook_container (gfe);
910
 
 
911
 
    /* The Basic tab */
912
 
    if (priv->plugin->basic_settings)
913
 
    {
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);
916
 
    }
917
 
 
918
 
    /* The Advanced tab */
919
 
    if (priv->plugin->advanced_settings)
920
 
    {
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);
923
 
    }
924
 
 
925
 
    /* The SSH tab */
926
 
    remmina_file_editor_create_ssh_tab (gfe, priv->plugin->ssh_setting);
927
 
}
928
 
 
929
 
static void
930
 
remmina_file_editor_protocol_combo_on_changed (GtkComboBox *combo, RemminaFileEditor *gfe)
931
 
{
932
 
    RemminaFileEditorPriv *priv = gfe->priv;
933
 
    gchar *protocol;
934
 
 
935
 
    if (priv->config_container)
936
 
    {
937
 
        gtk_container_remove (GTK_CONTAINER (priv->config_box), priv->config_container);
938
 
        priv->config_container = NULL;
939
 
    }
940
 
 
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;
948
 
 
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;
960
 
 
961
 
    g_hash_table_remove_all (priv->setting_widgets);
962
 
 
963
 
    protocol = gtk_combo_box_get_active_text (combo);
964
 
    if (protocol)
965
 
    {
966
 
        priv->plugin = (RemminaProtocolPlugin *) remmina_plugin_manager_get_plugin (REMMINA_PLUGIN_TYPE_PROTOCOL, protocol);
967
 
        g_free (protocol);
968
 
        remmina_file_editor_create_all_settings (gfe);
969
 
    }
970
 
}
971
 
 
972
 
static void
973
 
remmina_file_editor_update_ssh (RemminaFileEditor *gfe)
974
 
{
975
 
    RemminaFileEditorPriv *priv = gfe->priv;
976
 
    gboolean ssh_enabled;
977
 
 
978
 
    if (priv->ssh_charset_combo)
979
 
    {
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)));
982
 
    }
983
 
 
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)
986
 
    {
987
 
        ssh_enabled = TRUE;
988
 
    }
989
 
    else
990
 
    {
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));
995
 
    }
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));
1014
 
}
1015
 
 
1016
 
static void
1017
 
remmina_file_editor_update_settings (RemminaFileEditor *gfe)
1018
 
{
1019
 
    RemminaFileEditorPriv *priv = gfe->priv;
1020
 
    GHashTableIter iter;
1021
 
    gpointer key, value;
1022
 
 
1023
 
    g_hash_table_iter_init (&iter, priv->setting_widgets);
1024
 
    while (g_hash_table_iter_next (&iter, &key, &value))
1025
 
    {
1026
 
        if (GTK_IS_ENTRY (value))
1027
 
        {
1028
 
            remmina_file_set_string (priv->remmina_file, (gchar*) key,
1029
 
                gtk_entry_get_text (GTK_ENTRY (value)));
1030
 
        }
1031
 
        else if (GTK_IS_COMBO_BOX (value))
1032
 
        {
1033
 
            remmina_file_set_string_ref (priv->remmina_file, (gchar*) key,
1034
 
                gtk_combo_box_get_active_text (GTK_COMBO_BOX (value)));
1035
 
        }
1036
 
        else if (GTK_IS_FILE_CHOOSER (value))
1037
 
        {
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)) :
1041
 
                NULL);
1042
 
        }
1043
 
        else if (GTK_IS_TOGGLE_BUTTON (value))
1044
 
        {
1045
 
            remmina_file_set_int (priv->remmina_file, (gchar*) key,
1046
 
                gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (value)));
1047
 
        }
1048
 
    }
1049
 
}
1050
 
 
1051
 
static void
1052
 
remmina_file_editor_update (RemminaFileEditor *gfe)
1053
 
{
1054
 
    RemminaFileEditorPriv *priv = gfe->priv;
1055
 
 
1056
 
    remmina_file_set_string (priv->remmina_file, "name", gtk_entry_get_text (GTK_ENTRY (priv->name_entry)));
1057
 
 
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));
1060
 
 
1061
 
    remmina_file_set_string_ref (priv->remmina_file, "protocol",
1062
 
        gtk_combo_box_get_active_text (GTK_COMBO_BOX (priv->protocol_combo)));
1063
 
 
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));
1066
 
 
1067
 
    remmina_file_set_string (priv->remmina_file, "password", (priv->password_entry ?
1068
 
        gtk_entry_get_text (GTK_ENTRY (priv->password_entry)) : NULL));
1069
 
 
1070
 
    if (priv->resolution_auto_radio)
1071
 
    {
1072
 
        remmina_file_set_string_ref (priv->remmina_file, "resolution", (
1073
 
            gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->resolution_auto_radio)) ?
1074
 
                NULL :
1075
 
                gtk_combo_box_get_active_text (GTK_COMBO_BOX (priv->resolution_custom_combo))));
1076
 
    }
1077
 
 
1078
 
    if (priv->keymap_combo)
1079
 
    {
1080
 
        remmina_file_set_string_ref (priv->remmina_file, "keymap",
1081
 
            gtk_combo_box_get_active_text (GTK_COMBO_BOX (priv->keymap_combo)));
1082
 
    }
1083
 
 
1084
 
    if (priv->scaler_widget)
1085
 
    {
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);
1089
 
    }
1090
 
 
1091
 
    remmina_file_editor_update_ssh (gfe);
1092
 
    remmina_file_editor_update_settings (gfe);
1093
 
}
1094
 
 
1095
 
static void
1096
 
remmina_file_editor_on_default (GtkWidget *button, RemminaFileEditor *gfe)
1097
 
{
1098
 
    RemminaFile *gf;
1099
 
    GtkWidget *dialog;
1100
 
 
1101
 
    remmina_file_editor_update (gfe);
1102
 
 
1103
 
    gf = remmina_file_dup (gfe->priv->remmina_file);
1104
 
 
1105
 
    remmina_file_set_filename (gf, remmina_pref_file);
1106
 
 
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);
1111
 
 
1112
 
    remmina_file_save_all (gf);
1113
 
    remmina_file_free (gf);
1114
 
 
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);
1120
 
}
1121
 
 
1122
 
static void
1123
 
remmina_file_editor_on_save (GtkWidget *button, RemminaFileEditor *gfe)
1124
 
{
1125
 
    remmina_file_editor_update (gfe);
1126
 
    remmina_file_save_all (gfe->priv->remmina_file);
1127
 
    gtk_widget_destroy (GTK_WIDGET (gfe));
1128
 
}
1129
 
 
1130
 
static void
1131
 
remmina_file_editor_on_connect (GtkWidget *button, RemminaFileEditor *gfe)
1132
 
{
1133
 
    RemminaFile *gf;
1134
 
 
1135
 
    remmina_file_editor_update (gfe);
1136
 
    if (remmina_pref.save_when_connect)
1137
 
    {
1138
 
        remmina_file_save_all (gfe->priv->remmina_file);
1139
 
    }
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)
1143
 
    {
1144
 
        remmina_file_set_string (gf, "name", remmina_file_get_string (gf, "server"));
1145
 
    }
1146
 
    gtk_widget_destroy (GTK_WIDGET (gfe));
1147
 
    remmina_connection_window_open_from_file (gf);
1148
 
}
1149
 
 
1150
 
static void
1151
 
remmina_file_editor_on_cancel (GtkWidget *button, RemminaFileEditor *gfe)
1152
 
{
1153
 
    gtk_widget_destroy (GTK_WIDGET (gfe));
1154
 
}
1155
 
 
1156
 
static void
1157
 
remmina_file_editor_init (RemminaFileEditor *gfe)
1158
 
{
1159
 
    RemminaFileEditorPriv *priv;
1160
 
    GtkWidget *widget;
1161
 
 
1162
 
    priv = g_new0 (RemminaFileEditorPriv, 1);
1163
 
    gfe->priv = priv;
1164
 
 
1165
 
    /* Create the editor dialog */
1166
 
    gtk_window_set_title (GTK_WINDOW (gfe), _("Remote Desktop Preference"));
1167
 
 
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;
1172
 
 
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);
1175
 
 
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);
1178
 
 
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);
1184
 
 
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);
1189
 
 
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);
1196
 
 
1197
 
    g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (remmina_file_editor_on_default), gfe);
1198
 
 
1199
 
    priv->setting_widgets = g_hash_table_new (g_str_hash, g_str_equal);
1200
 
 
1201
 
    remmina_widget_pool_register (GTK_WIDGET (gfe));
1202
 
}
1203
 
 
1204
 
static gboolean
1205
 
remmina_file_editor_iterate_protocol (gchar *protocol, RemminaPlugin *plugin, gpointer data)
1206
 
{
1207
 
    RemminaFileEditor *gfe = REMMINA_FILE_EDITOR (data);
1208
 
    GtkListStore *store;
1209
 
    GtkTreeIter iter;
1210
 
    gboolean first;
1211
 
 
1212
 
    store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (gfe->priv->protocol_combo)));
1213
 
 
1214
 
    first = !gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
1215
 
 
1216
 
    gtk_list_store_append (store, &iter);
1217
 
    gtk_list_store_set (store, &iter,
1218
 
        0, protocol,
1219
 
        1, g_dgettext (plugin->domain, plugin->description),
1220
 
        2, ((RemminaProtocolPlugin *)plugin)->icon_name,
1221
 
        -1);
1222
 
 
1223
 
    if (first || g_strcmp0 (protocol, remmina_file_get_string (gfe->priv->remmina_file, "protocol")) == 0)
1224
 
    {
1225
 
        gtk_combo_box_set_active_iter (GTK_COMBO_BOX (gfe->priv->protocol_combo), &iter);
1226
 
    }
1227
 
 
1228
 
    return FALSE;
1229
 
}
1230
 
 
1231
 
static void
1232
 
remmina_file_editor_check_profile (RemminaFileEditor *gfe)
1233
 
{
1234
 
    RemminaFileEditorPriv *priv;
1235
 
 
1236
 
    priv = gfe->priv;
1237
 
    if (remmina_file_get_filename (priv->remmina_file))
1238
 
    {
1239
 
        gtk_widget_set_sensitive (priv->group_combo, TRUE);
1240
 
        gtk_widget_set_sensitive (priv->save_button, TRUE);
1241
 
    }
1242
 
}
1243
 
 
1244
 
static void
1245
 
remmina_file_editor_name_on_changed (GtkEditable *editable, RemminaFileEditor *gfe)
1246
 
{
1247
 
    RemminaFileEditorPriv *priv;
1248
 
 
1249
 
    priv = gfe->priv;
1250
 
    if (remmina_file_get_filename (priv->remmina_file) == NULL)
1251
 
    {
1252
 
        remmina_file_generate_filename (priv->remmina_file);
1253
 
        remmina_file_editor_check_profile (gfe);
1254
 
    }
1255
 
}
1256
 
 
1257
 
GtkWidget*
1258
 
remmina_file_editor_new_from_file (RemminaFile *remminafile)
1259
 
{
1260
 
    RemminaFileEditor *gfe;
1261
 
    RemminaFileEditorPriv *priv;
1262
 
    GtkWidget *table;
1263
 
    GtkWidget *widget;
1264
 
    gchar *groups;
1265
 
    gchar *s;
1266
 
    const gchar *cs;
1267
 
 
1268
 
    gfe = REMMINA_FILE_EDITOR (g_object_new (REMMINA_TYPE_FILE_EDITOR, NULL));
1269
 
    priv = gfe->priv;
1270
 
    priv->remmina_file = remminafile;
1271
 
 
1272
 
    if (remmina_file_get_filename (remminafile) == NULL)
1273
 
    {
1274
 
        gtk_dialog_set_response_sensitive (GTK_DIALOG (gfe), GTK_RESPONSE_APPLY, FALSE);
1275
 
    }
1276
 
 
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);
1284
 
 
1285
 
    remmina_public_create_group (GTK_TABLE (table), _("Profile"), 0, 4, 3);
1286
 
 
1287
 
    /* Profile: Name */
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);
1292
 
 
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;
1297
 
 
1298
 
    if (remmina_file_get_filename (remminafile) == NULL)
1299
 
    {
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);
1302
 
    }
1303
 
    else
1304
 
    {
1305
 
        cs = remmina_file_get_string (remminafile, "name");
1306
 
        gtk_entry_set_text (GTK_ENTRY (widget), cs ? cs : "");
1307
 
    }
1308
 
 
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);
1314
 
 
1315
 
    groups = remmina_file_manager_get_groups ();
1316
 
    priv->group_combo = remmina_public_create_combo_entry (groups, remmina_file_get_string (remminafile, "group"), FALSE);
1317
 
    g_free (groups);
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);
1321
 
 
1322
 
    s = g_strdup_printf (_("Use '%s' as subgroup delimiter"), "/");
1323
 
    gtk_widget_set_tooltip_text (priv->group_combo, s);
1324
 
    g_free (s);
1325
 
 
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);
1331
 
 
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);
1338
 
 
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;
1344
 
 
1345
 
    priv->config_container = NULL;
1346
 
 
1347
 
    remmina_file_editor_protocol_combo_on_changed (GTK_COMBO_BOX (priv->protocol_combo), gfe);
1348
 
 
1349
 
    remmina_file_editor_check_profile (gfe);
1350
 
 
1351
 
    return GTK_WIDGET (gfe);
1352
 
}
1353
 
 
1354
 
GtkWidget*
1355
 
remmina_file_editor_new (void)
1356
 
{
1357
 
    return remmina_file_editor_new_full (NULL, NULL);
1358
 
}
1359
 
 
1360
 
GtkWidget*
1361
 
remmina_file_editor_new_full (const gchar *server, const gchar *protocol)
1362
 
{
1363
 
    RemminaFile *remminafile;
1364
 
 
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);
1368
 
 
1369
 
    return remmina_file_editor_new_from_file (remminafile);
1370
 
}
1371
 
 
1372
 
GtkWidget*
1373
 
remmina_file_editor_new_copy (const gchar *filename)
1374
 
{
1375
 
    RemminaFile *remminafile;
1376
 
    GtkWidget *dialog;
1377
 
 
1378
 
    remminafile = remmina_file_copy (filename);
1379
 
    if (remminafile)
1380
 
    {
1381
 
        return remmina_file_editor_new_from_file (remminafile);
1382
 
    }
1383
 
    else
1384
 
    {
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);
1389
 
        return NULL;
1390
 
    }
1391
 
}
1392
 
 
1393
 
GtkWidget*
1394
 
remmina_file_editor_new_from_filename (const gchar *filename)
1395
 
{
1396
 
    RemminaFile *remminafile;
1397
 
    GtkWidget *dialog;
1398
 
 
1399
 
    remminafile = remmina_file_manager_load_file (filename);
1400
 
    if (remminafile)
1401
 
    {
1402
 
        return remmina_file_editor_new_from_file (remminafile);
1403
 
    }
1404
 
    else
1405
 
    {
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);
1410
 
        return NULL;
1411
 
    }
1412
 
}
1413