Remmina - The GTK+ Remote Desktop Client  v1.4.2
Remmina is a remote desktop client written in GTK+, aiming to be useful for system administrators and travellers, who need to work with lots of remote computers in front of either large monitors or tiny netbooks. Remmina supports multiple network protocols in an integrated and consistent user interface. Currently RDP, VNC, NX, XDMCP and SSH are supported.
remmina_pref_dialog.c
Go to the documentation of this file.
1 /*
2  * Remmina - The GTK+ Remote Desktop Client
3  * Copyright (C) 2009-2011 Vic Lee
4  * Copyright (C) 2014-2015 Antenore Gatta, Fabio Castelli, Giovanni Panozzo
5  * Copyright (C) 2016-2020 Antenore Gatta, Giovanni Panozzo
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  * In addition, as a special exception, the copyright holders give
23  * permission to link the code of portions of this program with the
24  * OpenSSL library under certain conditions as described in each
25  * individual source file, and distribute linked combinations
26  * including the two.
27  * You must obey the GNU General Public License in all respects
28  * for all of the code used other than OpenSSL. * If you modify
29  * file(s) with this exception, you may extend this exception to your
30  * version of the file(s), but you are not obligated to do so. * If you
31  * do not wish to do so, delete this exception statement from your
32  * version. * If you delete this exception statement from all source
33  * files in the program, then also delete it here.
34  *
35  */
36 
37 #include <gtk/gtk.h>
38 #include <glib/gi18n.h>
39 #include <stdlib.h>
40 #include "config.h"
41 #if defined (HAVE_LIBSSH) && defined (HAVE_LIBVTE)
42 #include <vte/vte.h>
43 #endif
44 #include "remmina_sodium.h"
45 #include "remmina_public.h"
46 #include "remmina_string_list.h"
47 #include "remmina_widget_pool.h"
48 #include "remmina_key_chooser.h"
49 #include "remmina_plugin_manager.h"
50 #include "remmina_icon.h"
51 #include "remmina_pref.h"
52 #include "remmina_pref_dialog.h"
54 
56 
57 #define GET_OBJECT(object_name) gtk_builder_get_object(remmina_pref_dialog->builder, object_name)
58 
59 /* Show a key chooser dialog */
60 void remmina_pref_dialog_on_key_chooser(GtkWidget *widget, gpointer user_data)
61 {
62  TRACE_CALL(__func__);
63  RemminaKeyChooserArguments *arguments;
64 
65  g_return_if_fail(GTK_IS_BUTTON(widget));
66 
67  arguments = remmina_key_chooser_new(GTK_WINDOW(remmina_pref_dialog->dialog), FALSE);
68  if (arguments->response != GTK_RESPONSE_CANCEL && arguments->response != GTK_RESPONSE_DELETE_EVENT) {
69  gchar *val = remmina_key_chooser_get_value(arguments->keyval, arguments->state);
70  gtk_button_set_label(GTK_BUTTON(widget), val);
71  g_free(val);
72  }
73  g_free(arguments);
74 }
75 
76 /* Show the available resolutions list dialog */
77 void remmina_pref_on_button_resolutions_clicked(GtkWidget *widget, gpointer user_data)
78 {
79  TRACE_CALL(__func__);
80  GtkDialog *dialog = remmina_string_list_new(FALSE, NULL);
83  remmina_string_list_set_titles(_("Resolutions"), _("Configure the available resolutions"));
84  gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(remmina_pref_dialog->dialog));
85  gtk_dialog_run(dialog);
86  g_free(remmina_pref.resolutions);
88  gtk_widget_destroy(GTK_WIDGET(dialog));
89 }
90 
91 /* Re-initialize the remmina_pref_init to reload the color scheme when a color scheme
92  * file is selected*/
93 void remmina_pref_on_color_scheme_selected(GtkWidget *widget, gpointer user_data)
94 {
95  TRACE_CALL(__func__);
96  gchar *sourcepath;
97  gchar *remmina_dir;
98  gchar *destpath;
99  GFile *source;
100  GFile *destination;
101 
102  sourcepath = gtk_file_chooser_get_filename(remmina_pref_dialog->button_term_cs);
103  source = g_file_new_for_path(sourcepath);
104 
105  remmina_dir = g_build_path( "/", g_get_user_config_dir(), "remmina", NULL);
106  /* /home/foo/.config/remmina */
107  destpath = g_strdup_printf("%s/remmina.colors", remmina_dir);
108  destination = g_file_new_for_path(destpath);
109 
110  if (g_file_test(sourcepath, G_FILE_TEST_IS_REGULAR)) {
111  g_file_copy( source,
112  destination,
113  G_FILE_COPY_OVERWRITE,
114  NULL,
115  NULL,
116  NULL,
117  NULL);
118  /* Here we should reinitialize the widget */
119  }
120  g_free(sourcepath);
121  g_object_unref(source);
122 }
123 
124 void remmina_pref_dialog_clear_recent(GtkWidget *widget, gpointer user_data)
125 {
126  TRACE_CALL(__func__);
127  GtkDialog *dialog;
128 
130  dialog = GTK_DIALOG(gtk_message_dialog_new(GTK_WINDOW(remmina_pref_dialog->dialog),
131  GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
132  _("Recent lists cleared.")));
133  gtk_dialog_run(dialog);
134  gtk_widget_destroy(GTK_WIDGET(dialog));
135 }
136 
137 /* Configure custom keystrokes to send to the plugins */
138 void remmina_pref_on_button_keystrokes_clicked(GtkWidget *widget, gpointer user_data)
139 {
140  TRACE_CALL(__func__);
141  GtkDialog *dialog = remmina_string_list_new(TRUE, STRING_DELIMITOR2);
143  remmina_string_list_set_titles(_("Keystrokes"), _("Configure the keystrokes"));
144  gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(remmina_pref_dialog->dialog));
145  gtk_dialog_run(dialog);
146  g_free(remmina_pref.keystrokes);
148  gtk_widget_destroy(GTK_WIDGET(dialog));
149 }
150 
152 {
153  TRACE_CALL(__func__);
154  GtkCssProvider *provider;
155  const gchar *color;
156  const gchar *password;
157  const gchar *repassword;
158 
159  provider = gtk_css_provider_new();
160 
161  password = gtk_entry_get_text(remmina_pref_dialog->unlock_password);
162  repassword = gtk_entry_get_text(remmina_pref_dialog->unlock_repassword);
163  if (g_strcmp0(password, repassword) == 0) {
164  color = g_strdup("green");
165  } else {
166  color = g_strdup("red");
167  }
168 
169  if (repassword == NULL || repassword[0] == '\0')
170  color = g_strdup("inherit");
171 
172  gtk_css_provider_load_from_data(provider,
173  g_strdup_printf (
174  ".unlock_repassword {\n"
175  " color: %s;\n"
176  "}\n"
177  , color)
178  , -1, NULL);
179  gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
180  GTK_STYLE_PROVIDER(provider),
181  GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
182 
183  gtk_widget_queue_draw(GTK_WIDGET(remmina_pref_dialog->unlock_repassword));
184  g_object_unref(provider);
185 
186 }
187 
189 {
190  TRACE_CALL(__func__);
191  gtk_widget_destroy(GTK_WIDGET(remmina_pref_dialog->dialog));
192 }
193 
194 void remmina_pref_on_dialog_destroy(GtkWidget *widget, gpointer user_data)
195 {
196  TRACE_CALL(__func__);
197  gboolean b;
198  GdkRGBA color;
199  gboolean rebuild_remmina_icon = FALSE;
200 
201  remmina_pref.datadir_path = gtk_file_chooser_get_filename(remmina_pref_dialog->filechooserbutton_options_datadir_path);
202  if (remmina_pref.datadir_path == NULL)
203  remmina_pref.datadir_path = g_strdup("");
204  remmina_pref.remmina_file_name = gtk_entry_get_text(remmina_pref_dialog->entry_options_file_name);
205  remmina_pref.screenshot_path = gtk_file_chooser_get_filename(remmina_pref_dialog->filechooserbutton_options_screenshots_path);
206  remmina_pref.screenshot_name = gtk_entry_get_text(remmina_pref_dialog->entry_options_screenshot_name);
207  remmina_pref.deny_screenshot_clipboard = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_options_deny_screenshot_clipboard));
208  remmina_pref.save_view_mode = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_options_remember_last_view_mode));
209  remmina_pref.use_master_password = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_security_use_master_password));
210 #if SODIUM_VERSION_INT >= 90200
211  remmina_pref.unlock_repassword = gtk_entry_get_text(remmina_pref_dialog->unlock_repassword);
212  if (gtk_entry_get_text_length(remmina_pref_dialog->unlock_repassword) != 0)
213  remmina_pref.unlock_password = remmina_sodium_pwhash_str(gtk_entry_get_text(remmina_pref_dialog->unlock_password));
214 #endif
215  remmina_pref.screenshot_path = gtk_file_chooser_get_filename(remmina_pref_dialog->filechooserbutton_options_screenshots_path);
216  remmina_pref.fullscreen_on_auto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_fullscreen_on_auto));
217  remmina_pref.always_show_tab = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_show_tabs));
218  remmina_pref.hide_connection_toolbar = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_hide_toolbar));
219  remmina_pref.hide_searchbar = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_hide_searchbar));
220 
221  b = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_permit_send_stats));
223 
224  remmina_pref.default_action = gtk_combo_box_get_active(remmina_pref_dialog->comboboxtext_options_double_click);
225  remmina_pref.default_mode = gtk_combo_box_get_active(remmina_pref_dialog->comboboxtext_appearance_view_mode);
226  remmina_pref.tab_mode = gtk_combo_box_get_active(remmina_pref_dialog->comboboxtext_appearance_tab_interface);
228  remmina_pref.scale_quality = gtk_combo_box_get_active(remmina_pref_dialog->comboboxtext_options_scale_quality);
229  remmina_pref.ssh_loglevel = gtk_combo_box_get_active(remmina_pref_dialog->comboboxtext_options_ssh_loglevel);
230  remmina_pref.sshtunnel_port = atoi(gtk_entry_get_text(remmina_pref_dialog->entry_options_ssh_port));
231  if (remmina_pref.sshtunnel_port <= 0)
232  remmina_pref.sshtunnel_port = DEFAULT_SSHTUNNEL_PORT;
233  remmina_pref.ssh_tcp_keepidle = atoi(gtk_entry_get_text(remmina_pref_dialog->entry_options_ssh_tcp_keepidle));
235  remmina_pref.ssh_tcp_keepidle = SSH_SOCKET_TCP_KEEPIDLE;
236  remmina_pref.ssh_tcp_keepintvl = atoi(gtk_entry_get_text(remmina_pref_dialog->entry_options_ssh_tcp_keepintvl));
238  remmina_pref.ssh_tcp_keepintvl = SSH_SOCKET_TCP_KEEPINTVL;
239  remmina_pref.ssh_tcp_keepcnt = atoi(gtk_entry_get_text(remmina_pref_dialog->entry_options_ssh_tcp_keepcnt));
240  if (remmina_pref.ssh_tcp_keepcnt <= 0)
241  remmina_pref.ssh_tcp_keepcnt = SSH_SOCKET_TCP_KEEPCNT;
242  remmina_pref.ssh_tcp_usrtimeout = atoi(gtk_entry_get_text(remmina_pref_dialog->entry_options_ssh_tcp_usrtimeout));
244  remmina_pref.ssh_tcp_usrtimeout = SSH_SOCKET_TCP_USER_TIMEOUT;
245  remmina_pref.ssh_parseconfig = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_options_ssh_parseconfig));
246 #if SODIUM_VERSION_INT >= 90200
247  remmina_pref.unlock_timeout = atoi(gtk_entry_get_text(remmina_pref_dialog->unlock_timeout));
250 #endif
251 
252  remmina_pref.auto_scroll_step = atoi(gtk_entry_get_text(remmina_pref_dialog->entry_options_scroll));
255  else if (remmina_pref.auto_scroll_step > 500)
257 
258  remmina_pref.recent_maximum = atoi(gtk_entry_get_text(remmina_pref_dialog->entry_options_recent_items));
261 
262  remmina_pref.applet_new_ontop = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_new_connection_on_top));
263  remmina_pref.applet_hide_count = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_hide_totals));
264  b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_light_tray));
265  if (remmina_pref.dark_tray_icon != b) {
267  rebuild_remmina_icon = TRUE;
268  }
269 
270  b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_disable_tray));
271  if (remmina_pref.disable_tray_icon != b) {
273  rebuild_remmina_icon = TRUE;
274  }
275  if (b) {
276  b = FALSE;
277  }else {
278  b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_start_in_tray));
279  }
281 
282  if (rebuild_remmina_icon) {
285  }
286 
287  remmina_pref.hostkey = remmina_key_chooser_get_keyval(gtk_button_get_label(remmina_pref_dialog->button_keyboard_host_key));
289  remmina_pref.shortcutkey_autofit = remmina_key_chooser_get_keyval(gtk_button_get_label(remmina_pref_dialog->button_keyboard_auto_fit));
292  remmina_pref.shortcutkey_scale = remmina_key_chooser_get_keyval(gtk_button_get_label(remmina_pref_dialog->button_keyboard_scaled));
298  remmina_pref.shortcutkey_toolbar = remmina_key_chooser_get_keyval(gtk_button_get_label(remmina_pref_dialog->button_keyboard_toolbar));
299 
300  g_free(remmina_pref.vte_font);
301  if (gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_terminal_font_system))) {
302  remmina_pref.vte_font = NULL;
303  }else {
304  remmina_pref.vte_font = g_strdup(gtk_font_chooser_get_font(GTK_FONT_CHOOSER(remmina_pref_dialog->fontbutton_terminal_font)));
305  }
306  remmina_pref.vte_allow_bold_text = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_terminal_bold));
307  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_foreground), &color);
308  remmina_pref.color_pref.foreground = gdk_rgba_to_string(&color);
309  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_background), &color);
310  remmina_pref.color_pref.background = gdk_rgba_to_string(&color);
311  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_cursor), &color);
312  remmina_pref.color_pref.cursor = gdk_rgba_to_string(&color);
313  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color0), &color);
314  remmina_pref.color_pref.color0 = gdk_rgba_to_string(&color);
315  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color1), &color);
316  remmina_pref.color_pref.color1 = gdk_rgba_to_string(&color);
317  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color2), &color);
318  remmina_pref.color_pref.color2 = gdk_rgba_to_string(&color);
319  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color3), &color);
320  remmina_pref.color_pref.color3 = gdk_rgba_to_string(&color);
321  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color4), &color);
322  remmina_pref.color_pref.color4 = gdk_rgba_to_string(&color);
323  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color5), &color);
324  remmina_pref.color_pref.color5 = gdk_rgba_to_string(&color);
325  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color6), &color);
326  remmina_pref.color_pref.color6 = gdk_rgba_to_string(&color);
327  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color7), &color);
328  remmina_pref.color_pref.color7 = gdk_rgba_to_string(&color);
329  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color8), &color);
330  remmina_pref.color_pref.color8 = gdk_rgba_to_string(&color);
331  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color9), &color);
332  remmina_pref.color_pref.color9 = gdk_rgba_to_string(&color);
333  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color10), &color);
334  remmina_pref.color_pref.color10 = gdk_rgba_to_string(&color);
335  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color11), &color);
336  remmina_pref.color_pref.color11 = gdk_rgba_to_string(&color);
337  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color12), &color);
338  remmina_pref.color_pref.color12 = gdk_rgba_to_string(&color);
339  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color13), &color);
340  remmina_pref.color_pref.color13 = gdk_rgba_to_string(&color);
341  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color14), &color);
342  remmina_pref.color_pref.color14 = gdk_rgba_to_string(&color);
343  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color15), &color);
344  remmina_pref.color_pref.color15 = gdk_rgba_to_string(&color);
345  remmina_pref.vte_lines = atoi(gtk_entry_get_text(remmina_pref_dialog->entry_scrollback_lines));
346  remmina_pref.vte_shortcutkey_copy = remmina_key_chooser_get_keyval(gtk_button_get_label(remmina_pref_dialog->button_keyboard_copy));
347  remmina_pref.vte_shortcutkey_paste = remmina_key_chooser_get_keyval(gtk_button_get_label(remmina_pref_dialog->button_keyboard_paste));
349 
352 
353  remmina_pref_dialog->dialog = NULL;
354 }
355 
356 static gboolean remmina_pref_dialog_add_pref_plugin(gchar *name, RemminaPlugin *plugin, gpointer user_data)
357 {
358  TRACE_CALL(__func__);
359  RemminaPrefPlugin *pref_plugin;
360  GtkWidget *vbox;
361  GtkWidget *widget;
362 
363  pref_plugin = (RemminaPrefPlugin*)plugin;
364 
365  widget = gtk_label_new(pref_plugin->pref_label);
366  gtk_widget_show(widget);
367 
368  vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
369  gtk_widget_show(vbox);
370  gtk_notebook_append_page(GTK_NOTEBOOK(remmina_pref_dialog->notebook_preferences), vbox, widget);
371 
372  widget = pref_plugin->get_pref_body();
373  gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0);
374 
375  return FALSE;
376 }
377 
379 {
380  TRACE_CALL(__func__);
381  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->fontbutton_terminal_font), !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
382 }
383 
385 {
386  TRACE_CALL(__func__);
387  gboolean b;
388 
389  b = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
390 
391  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->checkbutton_applet_start_in_tray), b);
392 }
393 
394 /* Helper function for remmina_pref_dialog_init() */
395 static void remmina_pref_dialog_set_button_label(GtkButton *button, guint keyval)
396 {
397  gchar *val;
398 
399  val = remmina_key_chooser_get_value(keyval, 0);
400  gtk_button_set_label(button, val);
401  g_free(val);
402 }
403 
404 /* Remmina preferences initialization */
405 static void remmina_pref_dialog_init(void)
406 {
407  TRACE_CALL(__func__);
408  gchar buf[100];
409  GdkRGBA color;
410 
411 #if !defined (HAVE_LIBSSH) || !defined (HAVE_LIBVTE)
412  GtkWidget *align;
413 #endif
414 
415 #if !defined (HAVE_LIBVTE)
416  align = GTK_WIDGET(GET_OBJECT("alignment_terminal"));
417  gtk_widget_set_sensitive(align, FALSE);
418 #endif
419 
420 #if !defined (HAVE_LIBSSH)
421  align = GTK_WIDGET(GET_OBJECT("alignment_ssh"));
422  gtk_widget_set_sensitive(align, FALSE);
423 #endif
424 
425  gtk_dialog_set_default_response(GTK_DIALOG(remmina_pref_dialog->dialog), GTK_RESPONSE_CLOSE);
426 
427  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_options_remember_last_view_mode), remmina_pref.save_view_mode);
428 #if SODIUM_VERSION_INT >= 90200
429  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_security_use_master_password), remmina_pref.use_master_password);
430  if (remmina_pref.unlock_password != NULL) {
431  gtk_entry_set_text(remmina_pref_dialog->unlock_password, remmina_pref.unlock_password);
432  }else{
433  gtk_entry_set_text(remmina_pref_dialog->unlock_password, "");
434  }
435  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_use_master_password), TRUE);
436  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->unlock_password), TRUE);
437  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->unlock_repassword), TRUE);
438  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->unlock_timeout), TRUE);
439 #else
440  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_security_use_master_password), FALSE);
441  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_use_master_password), FALSE);
442  // TRANSLATORS: Do not translate libsodium, is the name of a library
443  gtk_widget_set_tooltip_text (GTK_WIDGET(remmina_pref_dialog->switch_security_use_master_password), _("libsodium >= 1.9.0 is required to use master password"));
444  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->unlock_password), FALSE);
445  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->unlock_repassword), FALSE);
446  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->unlock_timeout), FALSE);
447 #endif
448 
449  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_options_deny_screenshot_clipboard), remmina_pref.deny_screenshot_clipboard);
450  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_fullscreen_on_auto), remmina_pref.fullscreen_on_auto);
451  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_show_tabs), remmina_pref.always_show_tab);
452  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_hide_toolbar), remmina_pref.hide_connection_toolbar);
453  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_hide_searchbar), remmina_pref.hide_searchbar);
454 
455  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_permit_send_stats), remmina_pref.periodic_usage_stats_permitted);
456 
457  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.sshtunnel_port);
458  gtk_entry_set_text(remmina_pref_dialog->entry_options_ssh_port, buf);
459  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.ssh_tcp_keepidle);
460  gtk_entry_set_text(remmina_pref_dialog->entry_options_ssh_tcp_keepidle, buf);
461  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.ssh_tcp_keepintvl);
462  gtk_entry_set_text(remmina_pref_dialog->entry_options_ssh_tcp_keepintvl, buf);
463  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.ssh_tcp_keepcnt);
464  gtk_entry_set_text(remmina_pref_dialog->entry_options_ssh_tcp_keepcnt, buf);
465  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.ssh_tcp_usrtimeout);
466  gtk_entry_set_text(remmina_pref_dialog->entry_options_ssh_tcp_usrtimeout, buf);
467  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.auto_scroll_step);
468  gtk_entry_set_text(remmina_pref_dialog->entry_options_scroll, buf);
469  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.recent_maximum);
470  gtk_entry_set_text(remmina_pref_dialog->entry_options_recent_items, buf);
471 
472  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_new_connection_on_top), remmina_pref.applet_new_ontop);
473  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_hide_totals), remmina_pref.applet_hide_count);
474  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_disable_tray), remmina_pref.disable_tray_icon);
475  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_light_tray), remmina_pref.dark_tray_icon);
476  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_start_in_tray), remmina_icon_is_autostart());
477  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->checkbutton_applet_start_in_tray), !remmina_pref.disable_tray_icon);
478 
491 
493  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_terminal_font_system), TRUE);
494  }
496  gtk_font_chooser_set_font(GTK_FONT_CHOOSER(remmina_pref_dialog->fontbutton_terminal_font), remmina_pref.vte_font);
497  }else {
498  gtk_font_chooser_set_font(GTK_FONT_CHOOSER(remmina_pref_dialog->fontbutton_terminal_font), "Monospace 12");
499  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->fontbutton_terminal_font), FALSE);
500  }
501  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_terminal_bold), remmina_pref.vte_allow_bold_text);
502 
503  /* Foreground color option */
504  gdk_rgba_parse(&color, remmina_pref.color_pref.foreground);
505  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_foreground), &color);
506  /* Background color option */
507  gdk_rgba_parse(&color, remmina_pref.color_pref.background);
508  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_background), &color);
509  /* Cursor color option */
510  gdk_rgba_parse(&color, remmina_pref.color_pref.cursor);
511  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_cursor), &color);
512  /* 16 colors */
513  gdk_rgba_parse(&color, remmina_pref.color_pref.color0);
514  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color0), &color);
515  gdk_rgba_parse(&color, remmina_pref.color_pref.color1);
516  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color1), &color);
517  gdk_rgba_parse(&color, remmina_pref.color_pref.color2);
518  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color2), &color);
519  gdk_rgba_parse(&color, remmina_pref.color_pref.color3);
520  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color3), &color);
521  gdk_rgba_parse(&color, remmina_pref.color_pref.color4);
522  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color4), &color);
523  gdk_rgba_parse(&color, remmina_pref.color_pref.color5);
524  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color5), &color);
525  gdk_rgba_parse(&color, remmina_pref.color_pref.color6);
526  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color6), &color);
527  gdk_rgba_parse(&color, remmina_pref.color_pref.color7);
528  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color7), &color);
529  gdk_rgba_parse(&color, remmina_pref.color_pref.color8);
530  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color8), &color);
531  gdk_rgba_parse(&color, remmina_pref.color_pref.color9);
532  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color9), &color);
533  gdk_rgba_parse(&color, remmina_pref.color_pref.color10);
534  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color10), &color);
535  gdk_rgba_parse(&color, remmina_pref.color_pref.color11);
536  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color11), &color);
537  gdk_rgba_parse(&color, remmina_pref.color_pref.color12);
538  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color12), &color);
539  gdk_rgba_parse(&color, remmina_pref.color_pref.color13);
540  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color13), &color);
541  gdk_rgba_parse(&color, remmina_pref.color_pref.color14);
542  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color14), &color);
543  gdk_rgba_parse(&color, remmina_pref.color_pref.color15);
544  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color15), &color);
545 #if defined (HAVE_LIBSSH) && defined (HAVE_LIBVTE)
546 #if !VTE_CHECK_VERSION(0, 38, 0)
547  /* Disable color scheme buttons if old version of VTE */
548  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_cursor), FALSE);
549  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color0), FALSE);
550  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color1), FALSE);
551  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color2), FALSE);
552  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color3), FALSE);
553  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color4), FALSE);
554  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color5), FALSE);
555  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color6), FALSE);
556  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color7), FALSE);
557  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color8), FALSE);
558  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color9), FALSE);
559  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color10), FALSE);
560  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color11), FALSE);
561  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color12), FALSE);
562  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color13), FALSE);
563  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color14), FALSE);
564  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color15), FALSE);
565 #endif
566 #endif
567 
568  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.vte_lines);
569  gtk_entry_set_text(remmina_pref_dialog->entry_scrollback_lines, buf);
570 
571 #if SODIUM_VERSION_INT >= 90200
572  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.unlock_timeout);
573  gtk_entry_set_text(remmina_pref_dialog->unlock_timeout, buf);
574 #endif
575 
576  gtk_combo_box_set_active(remmina_pref_dialog->comboboxtext_options_double_click, remmina_pref.default_action);
577  gtk_combo_box_set_active(remmina_pref_dialog->comboboxtext_appearance_view_mode, remmina_pref.default_mode);
578  gtk_combo_box_set_active(remmina_pref_dialog->comboboxtext_appearance_tab_interface, remmina_pref.tab_mode);
580  gtk_combo_box_set_active(remmina_pref_dialog->comboboxtext_options_scale_quality, remmina_pref.scale_quality);
581  gtk_combo_box_set_active(remmina_pref_dialog->comboboxtext_options_ssh_loglevel, remmina_pref.ssh_loglevel);
582  if (remmina_pref.datadir_path != NULL && strlen(remmina_pref.datadir_path) > 0) {
583  gtk_file_chooser_set_filename(remmina_pref_dialog->filechooserbutton_options_datadir_path, remmina_pref.datadir_path);
584  }
585  if (remmina_pref.remmina_file_name != NULL) {
586  gtk_entry_set_text(remmina_pref_dialog->entry_options_file_name, remmina_pref.remmina_file_name);
587  }else{
588  gtk_entry_set_text(remmina_pref_dialog->entry_options_file_name, "%G_%P_%N_%h.remmina");
589  }
590  if (remmina_pref.screenshot_path != NULL) {
591  gtk_file_chooser_set_filename(remmina_pref_dialog->filechooserbutton_options_screenshots_path, remmina_pref.screenshot_path);
592  }else{
593  gtk_file_chooser_set_filename(remmina_pref_dialog->filechooserbutton_options_screenshots_path, g_get_home_dir());
594  }
595  if (remmina_pref.screenshot_name != NULL) {
596  gtk_entry_set_text(remmina_pref_dialog->entry_options_screenshot_name, remmina_pref.screenshot_name);
597  }else{
598  gtk_entry_set_text(remmina_pref_dialog->entry_options_screenshot_name, "remmina_%p_%h_%Y%m%d-%H%M%S");
599  }
600  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_options_ssh_parseconfig), remmina_pref.ssh_parseconfig);
601 
605 
607 
608  g_object_set_data(G_OBJECT(remmina_pref_dialog->dialog), "tag", "remmina-pref-dialog");
609  remmina_widget_pool_register(GTK_WIDGET(remmina_pref_dialog->dialog));
610 }
611 
612 /* RemminaPrefDialog instance */
613 GtkDialog* remmina_pref_dialog_new(gint default_tab, GtkWindow *parent)
614 {
615  TRACE_CALL(__func__);
616 
617  remmina_pref_dialog = g_new0(RemminaPrefDialog, 1);
618  remmina_pref_dialog->priv = g_new0(RemminaPrefDialogPriv, 1);
619 
620  remmina_pref_dialog->builder = remmina_public_gtk_builder_new_from_file("remmina_preferences.glade");
621  remmina_pref_dialog->dialog = GTK_DIALOG(gtk_builder_get_object(remmina_pref_dialog->builder, "RemminaPrefDialog"));
622  if (parent)
623  gtk_window_set_transient_for(GTK_WINDOW(remmina_pref_dialog->dialog), parent);
624 
625  remmina_pref_dialog->notebook_preferences = GTK_NOTEBOOK(GET_OBJECT("notebook_preferences"));
626 
627  remmina_pref_dialog->filechooserbutton_options_datadir_path = GTK_FILE_CHOOSER(GET_OBJECT("filechooserbutton_options_datadir_path"));
628  remmina_pref_dialog->entry_options_file_name = GTK_ENTRY(GET_OBJECT("entry_options_file_name"));
629  remmina_pref_dialog->filechooserbutton_options_screenshots_path = GTK_FILE_CHOOSER(GET_OBJECT("filechooserbutton_options_screenshots_path"));
630  remmina_pref_dialog->entry_options_screenshot_name = GTK_ENTRY(GET_OBJECT("entry_options_screenshot_name"));
631  remmina_pref_dialog->switch_options_deny_screenshot_clipboard = GTK_SWITCH(GET_OBJECT("switch_options_deny_screenshot_clipboard"));
632  remmina_pref_dialog->switch_options_remember_last_view_mode = GTK_SWITCH(GET_OBJECT("switch_options_remember_last_view_mode"));
633  remmina_pref_dialog->switch_security_use_master_password = GTK_SWITCH(GET_OBJECT("switch_security_use_master_password"));
634  remmina_pref_dialog->unlock_password = GTK_ENTRY(GET_OBJECT("unlock_password"));
635  remmina_pref_dialog->unlock_repassword = GTK_ENTRY(GET_OBJECT("unlock_repassword"));
636  remmina_pref_dialog->checkbutton_options_save_settings = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_options_save_settings"));
637  remmina_pref_dialog->checkbutton_appearance_fullscreen_on_auto = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_fullscreen_on_auto"));
638  remmina_pref_dialog->checkbutton_appearance_show_tabs = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_show_tabs"));
639  remmina_pref_dialog->checkbutton_appearance_hide_toolbar = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_hide_toolbar"));
640  remmina_pref_dialog->checkbutton_appearance_hide_searchbar = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_hide_searchbar"));
641  remmina_pref_dialog->switch_permit_send_stats = GTK_SWITCH(GET_OBJECT("switch_permit_send_stats"));
642  remmina_pref_dialog->comboboxtext_options_double_click = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_options_double_click"));
643  remmina_pref_dialog->comboboxtext_appearance_view_mode = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_appearance_view_mode"));
644  remmina_pref_dialog->comboboxtext_appearance_tab_interface = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_appearance_tab_interface"));
645  remmina_pref_dialog->comboboxtext_appearance_fullscreen_toolbar_visibility = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_appearance_fullscreen_toolbar_visibility"));
646  remmina_pref_dialog->comboboxtext_options_scale_quality = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_options_scale_quality"));
647  remmina_pref_dialog->checkbutton_options_ssh_parseconfig = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_options_ssh_parseconfig"));
648  remmina_pref_dialog->comboboxtext_options_ssh_loglevel = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_options_ssh_loglevel"));
649  remmina_pref_dialog->entry_options_ssh_port = GTK_ENTRY(GET_OBJECT("entry_options_ssh_port"));
650  remmina_pref_dialog->entry_options_ssh_tcp_keepidle = GTK_ENTRY(GET_OBJECT("entry_options_ssh_tcp_keepidle"));
651  remmina_pref_dialog->entry_options_ssh_tcp_keepintvl = GTK_ENTRY(GET_OBJECT("entry_options_ssh_tcp_keepintvl"));
652  remmina_pref_dialog->entry_options_ssh_tcp_keepcnt = GTK_ENTRY(GET_OBJECT("entry_options_ssh_tcp_keepcnt"));
653  remmina_pref_dialog->entry_options_ssh_tcp_usrtimeout = GTK_ENTRY(GET_OBJECT("entry_options_ssh_tcp_usrtimeout"));
654  remmina_pref_dialog->entry_options_scroll = GTK_ENTRY(GET_OBJECT("entry_options_scroll"));
655  remmina_pref_dialog->entry_options_recent_items = GTK_ENTRY(GET_OBJECT("entry_options_recent_items"));
656  remmina_pref_dialog->button_options_recent_items_clear = GTK_BUTTON(GET_OBJECT("button_options_recent_items_clear"));
657  remmina_pref_dialog->unlock_timeout = GTK_ENTRY(GET_OBJECT("unlock_timeout"));
658 
659  remmina_pref_dialog->checkbutton_applet_new_connection_on_top = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_applet_new_connection_on_top"));
660  remmina_pref_dialog->checkbutton_applet_hide_totals = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_applet_hide_totals"));
661  remmina_pref_dialog->checkbutton_applet_disable_tray = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_applet_disable_tray"));
662  remmina_pref_dialog->checkbutton_applet_light_tray = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_applet_light_tray"));
663  remmina_pref_dialog->checkbutton_applet_start_in_tray = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_applet_start_in_tray"));
664 
665  remmina_pref_dialog->button_keyboard_host_key = GTK_BUTTON(GET_OBJECT("button_keyboard_host_key"));
666  remmina_pref_dialog->button_keyboard_fullscreen = GTK_BUTTON(GET_OBJECT("button_keyboard_fullscreen"));
667  remmina_pref_dialog->button_keyboard_auto_fit = GTK_BUTTON(GET_OBJECT("button_keyboard_auto_fit"));
668  remmina_pref_dialog->button_keyboard_switch_tab_left = GTK_BUTTON(GET_OBJECT("button_keyboard_switch_tab_left"));
669  remmina_pref_dialog->button_keyboard_switch_tab_right = GTK_BUTTON(GET_OBJECT("button_keyboard_switch_tabright"));
670  remmina_pref_dialog->button_keyboard_scaled = GTK_BUTTON(GET_OBJECT("button_keyboard_scaled"));
671  remmina_pref_dialog->button_keyboard_grab_keyboard = GTK_BUTTON(GET_OBJECT("button_keyboard_grab_keyboard"));
672  remmina_pref_dialog->button_keyboard_screenshot = GTK_BUTTON(GET_OBJECT("button_keyboard_screenshot"));
673  remmina_pref_dialog->button_keyboard_viewonly = GTK_BUTTON(GET_OBJECT("button_keyboard_viewonly"));
674  remmina_pref_dialog->button_keyboard_minimize = GTK_BUTTON(GET_OBJECT("button_keyboard_minimize"));
675  remmina_pref_dialog->button_keyboard_disconnect = GTK_BUTTON(GET_OBJECT("button_keyboard_disconnect"));
676  remmina_pref_dialog->button_keyboard_toolbar = GTK_BUTTON(GET_OBJECT("button_keyboard_toolbar"));
677 
678  remmina_pref_dialog->switch_terminal_font_system = GTK_SWITCH(GET_OBJECT("switch_terminal_font_system"));
679  remmina_pref_dialog->fontbutton_terminal_font = GTK_FONT_BUTTON(GET_OBJECT("fontbutton_terminal_font"));
680  remmina_pref_dialog->switch_terminal_bold = GTK_SWITCH(GET_OBJECT("switch_terminal_bold"));
681  remmina_pref_dialog->entry_scrollback_lines = GTK_ENTRY(GET_OBJECT("entry_scrollback_lines"));
682  remmina_pref_dialog->button_keyboard_copy = GTK_BUTTON(GET_OBJECT("button_keyboard_copy"));
683  remmina_pref_dialog->button_keyboard_paste = GTK_BUTTON(GET_OBJECT("button_keyboard_paste"));
684  remmina_pref_dialog->button_keyboard_select_all = GTK_BUTTON(GET_OBJECT("button_keyboard_select_all"));
685  remmina_pref_dialog->label_terminal_foreground = GTK_LABEL(GET_OBJECT("label_terminal_foreground"));
686  remmina_pref_dialog->colorbutton_foreground = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_foreground"));
687  remmina_pref_dialog->label_terminal_background = GTK_LABEL(GET_OBJECT("label_terminal_background"));
688  remmina_pref_dialog->colorbutton_background = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_background"));
689  remmina_pref_dialog->label_terminal_cursor_color = GTK_LABEL(GET_OBJECT("label_terminal_cursor_color"));
690  remmina_pref_dialog->colorbutton_cursor = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_cursor"));
691  remmina_pref_dialog->label_terminal_normal_colors = GTK_LABEL(GET_OBJECT("label_terminal_normal_colors"));
692  remmina_pref_dialog->colorbutton_color0 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color0"));
693  remmina_pref_dialog->colorbutton_color1 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color1"));
694  remmina_pref_dialog->colorbutton_color2 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color2"));
695  remmina_pref_dialog->colorbutton_color3 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color3"));
696  remmina_pref_dialog->colorbutton_color4 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color4"));
697  remmina_pref_dialog->colorbutton_color5 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color5"));
698  remmina_pref_dialog->colorbutton_color6 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color6"));
699  remmina_pref_dialog->colorbutton_color7 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color7"));
700  remmina_pref_dialog->label_terminal_bright_colors = GTK_LABEL(GET_OBJECT("label_terminal_bright_colors"));
701  remmina_pref_dialog->colorbutton_color8 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color8"));
702  remmina_pref_dialog->colorbutton_color9 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color9"));
703  remmina_pref_dialog->colorbutton_color10 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color10"));
704  remmina_pref_dialog->colorbutton_color11 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color11"));
705  remmina_pref_dialog->colorbutton_color12 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color12"));
706  remmina_pref_dialog->colorbutton_color13 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color13"));
707  remmina_pref_dialog->colorbutton_color14 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color14"));
708  remmina_pref_dialog->colorbutton_color15 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color15"));
709 #if defined (HAVE_LIBSSH) && defined (HAVE_LIBVTE)
710 #if VTE_CHECK_VERSION(0, 38, 0)
711  remmina_pref_dialog->button_term_cs = GTK_FILE_CHOOSER(GET_OBJECT("button_term_cs"));
712  gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(remmina_pref_dialog->button_term_cs), REMMINA_RUNTIME_TERM_CS_DIR);
713 #endif
714 #endif
715 
716  /* Connect signals */
717  gtk_builder_connect_signals(remmina_pref_dialog->builder, NULL);
718  /* Initialize the window and load the preferences */
720 
721  if (default_tab > 0)
722  gtk_notebook_set_current_page(remmina_pref_dialog->notebook_preferences, default_tab);
723  return remmina_pref_dialog->dialog;
724 }
725 
727 {
728  if (!remmina_pref_dialog)
729  return NULL;
730  return remmina_pref_dialog->dialog;
731 }
guint shortcutkey_fullscreen
Definition: remmina_pref.h:152
GtkDialog * remmina_string_list_new(gboolean two_columns, const gchar *fields_separator)
gboolean hide_searchbar
Definition: remmina_pref.h:133
GtkButton * button_keyboard_select_all
static gboolean remmina_pref_dialog_add_pref_plugin(gchar *name, RemminaPlugin *plugin, gpointer user_data)
GtkColorButton * colorbutton_color2
guint shortcutkey_minimize
Definition: remmina_pref.h:161
GtkColorButton * colorbutton_color14
GtkButton * button_keyboard_grab_keyboard
RemminaKeyChooserArguments * remmina_key_chooser_new(GtkWindow *parent_window, gboolean use_modifiers)
static void remmina_pref_dialog_set_button_label(GtkButton *button, guint keyval)
gint default_action
Definition: remmina_pref.h:123
GtkComboBox * comboboxtext_appearance_fullscreen_toolbar_visibility
void remmina_string_list_set_validation_func(RemminaStringListValidationFunc func)
GtkButton * button_keyboard_paste
gchar * keystrokes
Definition: remmina_pref.h:128
GtkButton * button_options_recent_items_clear
GtkEntry * entry_options_screenshot_name
guint shortcutkey_screenshot
Definition: remmina_pref.h:160
guint shortcutkey_prevtab
Definition: remmina_pref.h:154
gboolean ssh_parseconfig
Definition: remmina_pref.h:144
static void remmina_pref_dialog_init(void)
void remmina_plugin_manager_for_each_plugin(RemminaPluginType type, RemminaPluginFunc func, gpointer data)
GtkEntry * entry_options_file_name
GtkCheckButton * checkbutton_appearance_fullscreen_on_auto
GtkLabel * label_terminal_foreground
void remmina_widget_pool_register(GtkWidget *widget)
gint ssh_tcp_keepintvl
Definition: remmina_pref.h:147
GtkButton * button_keyboard_fullscreen
GtkWidget *(* get_pref_body)(void)
Definition: plugin.h:126
GtkCheckButton * checkbutton_options_save_settings
GtkButton * button_keyboard_toolbar
gboolean dark_tray_icon
Definition: remmina_pref.h:141
GtkButton * button_keyboard_disconnect
gint auto_scroll_step
Definition: remmina_pref.h:125
GtkEntry * entry_options_recent_items
guint vte_shortcutkey_copy
Definition: remmina_pref.h:169
GtkEntry * entry_options_ssh_tcp_usrtimeout
void remmina_pref_dialog_disable_tray_icon_on_toggled(GtkWidget *widget, RemminaPrefDialog *dialog)
gboolean remmina_public_resolution_validation_func(const gchar *new_str, gchar **error)
GtkBuilder * remmina_public_gtk_builder_new_from_file(gchar *filename)
GtkSwitch * switch_terminal_bold
guint shortcutkey_autofit
Definition: remmina_pref.h:153
GtkColorButton * colorbutton_color6
void remmina_icon_populate_menu(void)
Definition: remmina_icon.c:264
GtkLabel * label_terminal_normal_colors
gboolean use_master_password
Definition: remmina_pref.h:119
GtkSwitch * switch_options_remember_last_view_mode
GtkFontButton * fontbutton_terminal_font
GtkColorButton * colorbutton_color3
GtkColorButton * colorbutton_color15
gint scale_quality
Definition: remmina_pref.h:124
gboolean deny_screenshot_clipboard
Definition: remmina_pref.h:116
gchar * resolutions
Definition: remmina_pref.h:127
guint vte_shortcutkey_select_all
Definition: remmina_pref.h:171
GtkCheckButton * checkbutton_appearance_hide_searchbar
GtkCheckButton * checkbutton_appearance_hide_toolbar
void remmina_pref_on_dialog_destroy(GtkWidget *widget, gpointer user_data)
void remmina_pref_on_color_scheme_selected(GtkWidget *widget, gpointer user_data)
GtkButton * button_keyboard_copy
GtkEntry * entry_options_ssh_tcp_keepintvl
GtkEntry * entry_options_ssh_port
gboolean vte_allow_bold_text
Definition: remmina_pref.h:166
GtkFileChooser * filechooserbutton_options_screenshots_path
GtkEntry * entry_options_ssh_tcp_keepidle
gboolean disable_tray_icon
Definition: remmina_pref.h:140
GtkEntry * entry_scrollback_lines
GtkColorButton * colorbutton_color4
gint recent_maximum
Definition: remmina_pref.h:126
gchar * vte_font
Definition: remmina_pref.h:165
void remmina_pref_dialog_on_key_chooser(GtkWidget *widget, gpointer user_data)
const gchar * screenshot_path
Definition: remmina_pref.h:115
void remmina_icon_init(void)
Definition: remmina_icon.c:429
GtkButton * button_keyboard_screenshot
GtkButton * button_keyboard_viewonly
GtkCheckButton * checkbutton_applet_new_connection_on_top
GtkSwitch * switch_terminal_font_system
gint unlock_timeout
Definition: remmina_pref.h:122
GtkColorButton * colorbutton_color13
GtkColorButton * colorbutton_color5
GtkEntry * entry_options_ssh_tcp_keepcnt
GtkNotebook * notebook_preferences
const gchar * unlock_password
Definition: remmina_pref.h:120
guint vte_shortcutkey_paste
Definition: remmina_pref.h:170
gchar * remmina_sodium_pwhash_str(const gchar *pass)
guint shortcutkey_disconnect
Definition: remmina_pref.h:162
gint ssh_tcp_usrtimeout
Definition: remmina_pref.h:149
GtkButton * button_keyboard_switch_tab_left
const gchar * pref_label
Definition: plugin.h:125
void remmina_pref_dialog_on_close_clicked(GtkWidget *widget, RemminaPrefDialog *dialog)
GtkCheckButton * checkbutton_applet_start_in_tray
GtkButton * button_keyboard_auto_fit
guint shortcutkey_grab
Definition: remmina_pref.h:158
gboolean always_show_tab
Definition: remmina_pref.h:131
GtkLabel * label_terminal_background
GtkFileChooser * button_term_cs
guint shortcutkey_scale
Definition: remmina_pref.h:157
GtkCheckButton * checkbutton_applet_light_tray
GtkColorButton * colorbutton_color0
GtkComboBox * comboboxtext_options_scale_quality
GtkEntry * entry_options_scroll
GtkCheckButton * checkbutton_appearance_show_tabs
const gchar * unlock_repassword
Definition: remmina_pref.h:121
gboolean remmina_icon_is_autostart(void)
Definition: remmina_icon.c:514
GtkColorButton * colorbutton_foreground
gboolean periodic_usage_stats_permitted
Definition: remmina_pref.h:200
static RemminaPrefDialog * remmina_pref_dialog
GtkColorButton * colorbutton_color11
GtkButton * button_keyboard_host_key
void remmina_string_list_set_text(const gchar *text, const gboolean clear_data)
void remmina_pref_clear_recent(void)
Definition: remmina_pref.c:902
GtkComboBox * comboboxtext_appearance_tab_interface
guint shortcutkey_nexttab
Definition: remmina_pref.h:155
gboolean applet_hide_count
Definition: remmina_pref.h:139
GtkCheckButton * checkbutton_applet_disable_tray
gint ssh_tcp_keepidle
Definition: remmina_pref.h:146
GtkComboBox * comboboxtext_options_ssh_loglevel
void remmina_prefdiag_unlock_repwd_on_changed(GtkEditable *editable, RemminaPrefDialog *dialog)
void remmina_string_list_set_titles(gchar *title1, gchar *title2)
GtkLabel * label_terminal_cursor_color
RemminaPref remmina_pref
Definition: rcw.c:73
void remmina_pref_dialog_vte_font_on_toggled(GtkWidget *widget, RemminaPrefDialog *dialog)
const gchar * remmina_file_name
Definition: remmina_pref.h:114
void remmina_pref_init(void)
Definition: remmina_pref.c:221
guint shortcutkey_toolbar
Definition: remmina_pref.h:163
void remmina_pref_on_button_resolutions_clicked(GtkWidget *widget, gpointer user_data)
GtkComboBox * comboboxtext_options_double_click
void remmina_pref_on_button_keystrokes_clicked(GtkWidget *widget, gpointer user_data)
gboolean remmina_pref_save(void)
Definition: remmina_pref.c:707
gint ssh_tcp_keepcnt
Definition: remmina_pref.h:148
gboolean applet_new_ontop
Definition: remmina_pref.h:138
const gchar * screenshot_name
Definition: remmina_pref.h:117
GtkButton * button_keyboard_minimize
gboolean hide_connection_toolbar
Definition: remmina_pref.h:132
GtkDialog * remmina_pref_dialog_get_dialog()
GtkCheckButton * checkbutton_options_ssh_parseconfig
gint sshtunnel_port
Definition: remmina_pref.h:145
const gchar * datadir_path
Definition: remmina_pref.h:113
GtkSwitch * switch_options_deny_screenshot_clipboard
void remmina_pref_dialog_clear_recent(GtkWidget *widget, gpointer user_data)
GtkCheckButton * checkbutton_applet_hide_totals
GtkColorButton * colorbutton_color10
GtkButton * button_keyboard_switch_tab_right
GtkComboBox * comboboxtext_appearance_view_mode
GtkButton * button_keyboard_scaled
GtkDialog * remmina_pref_dialog_new(gint default_tab, GtkWindow *parent)
GtkColorButton * colorbutton_color8
GtkSwitch * switch_permit_send_stats
GtkColorButton * colorbutton_background
GtkSwitch * switch_security_use_master_password
GtkColorButton * colorbutton_cursor
GtkColorButton * colorbutton_color7
void remmina_icon_set_autostart(gboolean autostart)
Definition: remmina_icon.c:527
RemminaColorPref color_pref
Definition: remmina_pref.h:197
guint shortcutkey_viewonly
Definition: remmina_pref.h:159
RemminaPrefDialogPriv * priv
gboolean fullscreen_on_auto
Definition: remmina_pref.h:130
GtkColorButton * colorbutton_color9
GtkLabel * label_terminal_bright_colors
gboolean save_view_mode
Definition: remmina_pref.h:118
gint fullscreen_toolbar_visibility
Definition: remmina_pref.h:136
GtkColorButton * colorbutton_color12
GtkFileChooser * filechooserbutton_options_datadir_path
GtkColorButton * colorbutton_color1
guint remmina_key_chooser_get_keyval(const gchar *value)
gchar * remmina_key_chooser_get_value(guint keyval, guint state)
gchar * remmina_string_list_get_text(void)