Remmina - The GTK+ Remote Desktop Client  v1.4.34
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-2022 Antenore Gatta, Giovanni Panozzo
6  * Copyright (C) 2022-2023 Antenore Gatta, Giovanni Panozzo, Hiroyuki Tanaka
7  * Copyright (C) 2023-2024 Hiroyuki Tanaka, Sunil Bhat
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor,
22  * Boston, MA 02110-1301, USA.
23  *
24  * In addition, as a special exception, the copyright holders give
25  * permission to link the code of portions of this program with the
26  * OpenSSL library under certain conditions as described in each
27  * individual source file, and distribute linked combinations
28  * including the two.
29  * You must obey the GNU General Public License in all respects
30  * for all of the code used other than OpenSSL. * If you modify
31  * file(s) with this exception, you may extend this exception to your
32  * version of the file(s), but you are not obligated to do so. * If you
33  * do not wish to do so, delete this exception statement from your
34  * version. * If you delete this exception statement from all source
35  * files in the program, then also delete it here.
36  *
37  */
38 
39 #include <gtk/gtk.h>
40 #include <glib/gi18n.h>
41 #include <stdlib.h>
42 #include "config.h"
43 #if defined (HAVE_LIBSSH) && defined (HAVE_LIBVTE)
44 #include <vte/vte.h>
45 #endif
46 #include "remmina_log.h"
47 #include "remmina_file_manager.h"
48 #include "remmina_sodium.h"
49 #include "remmina_passwd.h"
50 #include "remmina_public.h"
51 #include "remmina_main.h"
52 #include "remmina_string_list.h"
53 #include "remmina_widget_pool.h"
54 #include "remmina_key_chooser.h"
55 #include "remmina_plugin_manager.h"
56 #include "remmina_icon.h"
57 #include "remmina_pref.h"
58 #include "remmina_pref_dialog.h"
60 
62 
63 #define GET_OBJECT(object_name) gtk_builder_get_object(remmina_pref_dialog->builder, object_name)
64 
65 static GActionEntry pref_actions[] = {
66  { "close", remmina_pref_dialog_on_action_close, NULL, NULL, NULL },
67 };
68 
69 
70 /* Show a key chooser dialog */
71 void remmina_pref_dialog_on_key_chooser(GtkWidget *widget, gpointer user_data)
72 {
73  TRACE_CALL(__func__);
74  RemminaKeyChooserArguments *arguments;
75 
76  g_return_if_fail(GTK_IS_BUTTON(widget));
77 
78  arguments = remmina_key_chooser_new(GTK_WINDOW(remmina_pref_dialog->dialog), FALSE);
79  if (arguments->response != GTK_RESPONSE_CANCEL && arguments->response != GTK_RESPONSE_DELETE_EVENT) {
80  gchar *val = remmina_key_chooser_get_value(arguments->keyval, arguments->state);
81  gtk_button_set_label(GTK_BUTTON(widget), val);
82  g_free(val);
83  }
84  g_free(arguments);
85 }
86 
87 /* Show the available resolutions list dialog */
88 void remmina_pref_on_button_resolutions_clicked(GtkWidget *widget, gpointer user_data)
89 {
90  TRACE_CALL(__func__);
91  GtkDialog *dialog = remmina_string_list_new(FALSE, NULL);
92 
95  remmina_string_list_set_titles(_("Resolutions"), _("Configure the available resolutions"));
96  gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(remmina_pref_dialog->dialog));
97  gtk_dialog_run(dialog);
98  g_free(remmina_pref.resolutions);
100  gtk_widget_destroy(GTK_WIDGET(dialog));
101 }
102 
103 /* Re-initialize the remmina_pref_init to reload the color scheme when a color scheme
104  * file is selected*/
105 void remmina_pref_on_color_scheme_selected(GtkWidget *widget, gpointer user_data)
106 {
107  TRACE_CALL(__func__);
108  gchar *sourcepath;
109  gchar *remmina_dir;
110  gchar *destpath;
111  GFile *source;
112  GFile *destination;
113 
114  sourcepath = gtk_file_chooser_get_filename(remmina_pref_dialog->button_term_cs);
115  source = g_file_new_for_path(sourcepath);
116 
117  remmina_dir = g_build_path("/", g_get_user_config_dir(), "remmina", NULL);
118  /* /home/foo/.config/remmina */
119  destpath = g_strdup_printf("%s/remmina.colors", remmina_dir);
120  destination = g_file_new_for_path(destpath);
121 
122  if (g_file_test(sourcepath, G_FILE_TEST_IS_REGULAR)) {
123  g_file_copy(source,
124  destination,
125  G_FILE_COPY_OVERWRITE,
126  NULL,
127  NULL,
128  NULL,
129  NULL);
130  /* Here we should reinitialize the widget */
131  gtk_file_chooser_set_file(remmina_pref_dialog->button_term_cs, source, NULL);
132  }
133  g_free(sourcepath);
134  g_free(remmina_dir);
135  g_free(destpath);
136  g_object_unref(source);
137 }
138 
139 void remmina_pref_dialog_clear_recent(GtkWidget *widget, gpointer user_data)
140 {
141  TRACE_CALL(__func__);
142  GtkDialog *dialog;
143 
145  dialog = GTK_DIALOG(gtk_message_dialog_new(GTK_WINDOW(remmina_pref_dialog->dialog),
146  GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
147  _("Recent lists cleared.")));
148  gtk_dialog_run(dialog);
149  gtk_widget_destroy(GTK_WIDGET(dialog));
150 }
151 
152 /* Configure custom keystrokes to send to the plugins */
153 void remmina_pref_on_button_keystrokes_clicked(GtkWidget *widget, gpointer user_data)
154 {
155  TRACE_CALL(__func__);
156  GtkDialog *dialog = remmina_string_list_new(TRUE, STRING_DELIMITOR2);
157 
159  remmina_string_list_set_titles(_("Keystrokes"), _("Configure the keystrokes"));
160  gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(remmina_pref_dialog->dialog));
161  gtk_dialog_run(dialog);
162  g_free(remmina_pref.keystrokes);
164  gtk_widget_destroy(GTK_WIDGET(dialog));
165 }
166 
167 void remmina_prefdiag_on_grab_color_activated(GtkSwitch *widget, gpointer user_data)
168 {
169  TRACE_CALL(__func__);
170  //REMMINA_DEBUG ("entry_grab_color %d", gtk_switch_get_active(widget));
171  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->entry_grab_color), gtk_switch_get_active(widget));
172 }
173 
174 /* connect to notify::active or toggled (in this case ::toggled */
175 void remmina_prefdiag_on_use_password_activated(GtkSwitch *sw, gpointer user_data)
176 {
177  TRACE_CALL(__func__);
178  //REMMINA_DEBUG ("Use Primary Password %d", gtk_switch_get_active(sw));
179  if (gtk_switch_get_active(sw)) {
180  //REMMINA_DEBUG ("use_password activated");
181  gchar *unlock_password = NULL;
182  unlock_password = g_strdup(remmina_pref_get_value("unlock_password"));
183  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_lock_connect), TRUE);
184  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_lock_edit), TRUE);
185  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_lock_view_passwords), TRUE);
186  //REMMINA_DEBUG ("Password from preferences is: %s", unlock_password);
187  if (unlock_password == NULL || unlock_password[0] == '\0') {
188  if (remmina_passwd(GTK_WINDOW(remmina_pref_dialog->dialog), &unlock_password)) {
189  //REMMINA_DEBUG ("Password is: %s", unlock_password);
190  remmina_pref_set_value("unlock_password", g_strdup(unlock_password));
191  remmina_pref.unlock_password = g_strdup(unlock_password);
192  } else {
194  remmina_pref_set_value("unlock_password", "");
195  }
196  }
197  g_free(unlock_password), unlock_password = NULL;
198  } else {
199  //REMMINA_DEBUG ("use_password deactivated");
200  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_lock_connect), FALSE);
201  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_lock_edit), FALSE);
202  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_lock_view_passwords), FALSE);
204  remmina_pref_set_value("unlock_password", "");
205  }
206 }
207 
208 void remmina_pref_dialog_on_action_close(GSimpleAction *action, GVariant *param, gpointer data)
209 {
210  TRACE_CALL(__func__);
211  gtk_widget_destroy(GTK_WIDGET(remmina_pref_dialog->dialog));
212  /* Reload to use new preferences */
214 }
215 
217 {
218  TRACE_CALL(__func__);
219  gtk_widget_destroy(GTK_WIDGET(remmina_pref_dialog->dialog));
220 }
221 
222 void remmina_pref_on_dialog_destroy(GtkWidget *widget, gpointer user_data)
223 {
224  TRACE_CALL(__func__);
225  gboolean b;
226  GdkRGBA color;
227  gboolean rebuild_remmina_icon = FALSE;
228 
230  if (remmina_pref.datadir_path == NULL)
231  remmina_pref.datadir_path = g_strdup("");
237  remmina_pref.confirm_close = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_options_confirm_close));
239  remmina_pref.lock_connect = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_security_lock_connect));
240  remmina_pref.lock_edit = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_security_lock_edit));
243  remmina_pref.audit = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_security_audit));
244  remmina_pref.trust_all = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_security_trust_all));
246  remmina_pref.fullscreen_on_auto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_fullscreen_on_auto));
247  remmina_pref.always_show_tab = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_show_tabs));
248  remmina_pref.always_show_notes = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_show_notes));
249  remmina_pref.hide_connection_toolbar = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_hide_toolbar));
250  remmina_pref.hide_searchbar = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_hide_searchbar));
251  remmina_pref.disable_news = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_disable_news));
252  remmina_pref.disable_stats = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_disable_stats));
253  remmina_pref.disable_tip = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_disable_tip));
261  if (remmina_pref.sshtunnel_port <= 0)
262  remmina_pref.sshtunnel_port = DEFAULT_SSHTUNNEL_PORT;
265  remmina_pref.ssh_tcp_keepidle = SSH_SOCKET_TCP_KEEPIDLE;
268  remmina_pref.ssh_tcp_keepintvl = SSH_SOCKET_TCP_KEEPINTVL;
270  if (remmina_pref.ssh_tcp_keepcnt <= 0)
271  remmina_pref.ssh_tcp_keepcnt = SSH_SOCKET_TCP_KEEPCNT;
274  remmina_pref.ssh_tcp_usrtimeout = SSH_SOCKET_TCP_USER_TIMEOUT;
275  remmina_pref.ssh_parseconfig = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_options_ssh_parseconfig));
276 #if SODIUM_VERSION_INT >= 90200
277  remmina_pref.unlock_timeout = atoi(gtk_entry_get_text(remmina_pref_dialog->unlock_timeout));
280 #endif
281 
285  else if (remmina_pref.auto_scroll_step > 500)
287 
291 
292  remmina_pref.applet_new_ontop = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_new_connection_on_top));
293  remmina_pref.applet_hide_count = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_hide_totals));
294  b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_dark_theme));
295  if (remmina_pref.dark_theme != b) {
297  rebuild_remmina_icon = TRUE;
298  }
299 
302 
303  b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_disable_tray));
304  if (remmina_pref.disable_tray_icon != b) {
306  rebuild_remmina_icon = TRUE;
307  }
308  if (b)
309  b = FALSE;
310  else
311  b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_start_in_tray));
313 
314  if (rebuild_remmina_icon) {
317  }
318 
333 
334  g_free(remmina_pref.vte_font);
335  if (gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_terminal_font_system)))
336  remmina_pref.vte_font = NULL;
337  else
338  remmina_pref.vte_font = g_strdup(gtk_font_chooser_get_font(GTK_FONT_CHOOSER(remmina_pref_dialog->fontbutton_terminal_font)));
339  remmina_pref.vte_allow_bold_text = gtk_switch_get_active(GTK_SWITCH(remmina_pref_dialog->switch_terminal_bold));
340  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_foreground), &color);
341  remmina_pref.color_pref.foreground = gdk_rgba_to_string(&color);
342  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_background), &color);
343  remmina_pref.color_pref.background = gdk_rgba_to_string(&color);
344  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_cursor), &color);
345  remmina_pref.color_pref.cursor = gdk_rgba_to_string(&color);
346  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_cursor_foreground), &color);
347  remmina_pref.color_pref.cursor_foreground = gdk_rgba_to_string(&color);
348  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_highlight), &color);
349  remmina_pref.color_pref.highlight = gdk_rgba_to_string(&color);
350  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_highlight_foreground), &color);
351  remmina_pref.color_pref.highlight_foreground = gdk_rgba_to_string(&color);
352  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_colorBD), &color);
353  remmina_pref.color_pref.colorBD = gdk_rgba_to_string(&color);
354  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color0), &color);
355  remmina_pref.color_pref.color0 = gdk_rgba_to_string(&color);
356  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color1), &color);
357  remmina_pref.color_pref.color1 = gdk_rgba_to_string(&color);
358  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color2), &color);
359  remmina_pref.color_pref.color2 = gdk_rgba_to_string(&color);
360  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color3), &color);
361  remmina_pref.color_pref.color3 = gdk_rgba_to_string(&color);
362  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color4), &color);
363  remmina_pref.color_pref.color4 = gdk_rgba_to_string(&color);
364  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color5), &color);
365  remmina_pref.color_pref.color5 = gdk_rgba_to_string(&color);
366  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color6), &color);
367  remmina_pref.color_pref.color6 = gdk_rgba_to_string(&color);
368  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color7), &color);
369  remmina_pref.color_pref.color7 = gdk_rgba_to_string(&color);
370  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color8), &color);
371  remmina_pref.color_pref.color8 = gdk_rgba_to_string(&color);
372  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color9), &color);
373  remmina_pref.color_pref.color9 = gdk_rgba_to_string(&color);
374  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color10), &color);
375  remmina_pref.color_pref.color10 = gdk_rgba_to_string(&color);
376  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color11), &color);
377  remmina_pref.color_pref.color11 = gdk_rgba_to_string(&color);
378  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color12), &color);
379  remmina_pref.color_pref.color12 = gdk_rgba_to_string(&color);
380  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color13), &color);
381  remmina_pref.color_pref.color13 = gdk_rgba_to_string(&color);
382  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color14), &color);
383  remmina_pref.color_pref.color14 = gdk_rgba_to_string(&color);
384  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color15), &color);
385  remmina_pref.color_pref.color15 = gdk_rgba_to_string(&color);
393 
396 
397  remmina_pref_dialog->dialog = NULL;
398 }
399 
400 static gboolean remmina_pref_dialog_add_pref_plugin(gchar *name, RemminaPlugin *plugin, gpointer user_data)
401 {
402  TRACE_CALL(__func__);
403  RemminaPrefPlugin *pref_plugin;
404  GtkWidget *vbox;
405  GtkWidget *widget;
406 
407  pref_plugin = (RemminaPrefPlugin *)plugin;
408 
409  widget = gtk_label_new(pref_plugin->pref_label);
410  gtk_widget_set_halign(widget, GTK_ALIGN_START);
411  gtk_widget_show(widget);
412 
413  vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
414  gtk_widget_show(vbox);
415  gtk_notebook_append_page(GTK_NOTEBOOK(remmina_pref_dialog->notebook_preferences), vbox, widget);
416 
417  widget = pref_plugin->get_pref_body(pref_plugin);
418  gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0);
419 
420  return FALSE;
421 }
422 
424 {
425  TRACE_CALL(__func__);
426  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->fontbutton_terminal_font), !gtk_switch_get_active(widget));
427 }
428 
430 {
431  TRACE_CALL(__func__);
432  gboolean b;
433 
434  b = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
435 
436  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->checkbutton_applet_start_in_tray), b);
437 }
438 
439 /* Helper function for remmina_pref_dialog_init() */
440 static void remmina_pref_dialog_set_button_label(GtkButton *button, guint keyval)
441 {
442  gchar *val;
443 
444  val = remmina_key_chooser_get_value(keyval, 0);
445  gtk_button_set_label(button, val);
446  g_free(val);
447 }
448 
449 /* Remmina preferences initialization */
450 static void remmina_pref_dialog_init(void)
451 {
452  TRACE_CALL(__func__);
453  gchar buf[100];
454  GdkRGBA color;
455 
456 #if !defined (HAVE_LIBSSH) || !defined (HAVE_LIBVTE)
457  GtkWidget *align;
458 #endif
459 
460 #if !defined (HAVE_LIBVTE)
461  align = GTK_WIDGET(GET_OBJECT("alignment_terminal"));
462  gtk_widget_set_sensitive(align, FALSE);
463 #endif
464 
465 #if !defined (HAVE_LIBSSH)
466  align = GTK_WIDGET(GET_OBJECT("alignment_ssh"));
467  gtk_widget_set_sensitive(align, FALSE);
468 #endif
469 
471  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_options_confirm_close), remmina_pref.confirm_close);
472 #if SODIUM_VERSION_INT >= 90200
474  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_use_primary_password), TRUE);
475  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_security_lock_connect), remmina_pref.lock_connect);
476  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_security_lock_edit), remmina_pref.lock_edit);
478  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->unlock_timeout), TRUE);
479 #else
480  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_security_use_primary_password), FALSE);
481  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_use_primary_password), FALSE);
482  // TRANSLATORS: Do not translate libsodium, is the name of a library
483  gtk_widget_set_tooltip_text(GTK_WIDGET(remmina_pref_dialog->switch_security_use_primary_password), _("libsodium >= 1.9.0 is required to use Primary Password"));
484  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_security_lock_connect), FALSE);
485  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_security_lock_edit), FALSE);
486  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->unlock_timeout), FALSE);
487 #endif
488  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_security_audit), remmina_pref.audit);
489  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->switch_security_audit), TRUE);
490  if (remmina_pref.remmina_file_name != NULL)
492  else
493  gtk_entry_set_text(remmina_pref_dialog->entry_options_file_name, "%G_%P_%N_%h.remmina");
494 
495  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_security_trust_all), remmina_pref.trust_all);
496 
498  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_fullscreen_on_auto), remmina_pref.fullscreen_on_auto);
499  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_show_tabs), remmina_pref.always_show_tab);
500  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_show_notes), remmina_pref.always_show_notes);
501  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_hide_toolbar), remmina_pref.hide_connection_toolbar);
502  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_appearance_hide_searchbar), remmina_pref.hide_searchbar);
503 
504  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_disable_news), remmina_pref.disable_news);
505 #ifdef DISABLE_NEWS
506  gtk_widget_hide(GTK_WIDGET(remmina_pref_dialog->switch_disable_news));
507  gtk_widget_hide(GTK_WIDGET(remmina_pref_dialog->label_disable_news));
508 #endif
509 
510  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_disable_stats), remmina_pref.disable_stats);
511 #ifdef DISABLE_STATS
512  gtk_widget_hide(GTK_WIDGET(remmina_pref_dialog->switch_disable_stats));
513  gtk_widget_hide(GTK_WIDGET(remmina_pref_dialog->label_disable_stats));
514 #endif
515 
516 #ifdef DISABLE_TIP
517  gtk_widget_hide(GTK_WIDGET(remmina_pref_dialog->switch_disable_tip));
518  gtk_widget_hide(GTK_WIDGET(remmina_pref_dialog->label_disable_tip));
519 #endif
520  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_disable_tip), remmina_pref.disable_tip);
521 
522  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.sshtunnel_port);
523  gtk_entry_set_text(remmina_pref_dialog->entry_options_ssh_port, buf);
524  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.ssh_tcp_keepidle);
525  gtk_entry_set_text(remmina_pref_dialog->entry_options_ssh_tcp_keepidle, buf);
526  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.ssh_tcp_keepintvl);
527  gtk_entry_set_text(remmina_pref_dialog->entry_options_ssh_tcp_keepintvl, buf);
528  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.ssh_tcp_keepcnt);
529  gtk_entry_set_text(remmina_pref_dialog->entry_options_ssh_tcp_keepcnt, buf);
530  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.ssh_tcp_usrtimeout);
531  gtk_entry_set_text(remmina_pref_dialog->entry_options_ssh_tcp_usrtimeout, buf);
532  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.auto_scroll_step);
533  gtk_entry_set_text(remmina_pref_dialog->entry_options_scroll, buf);
534  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.recent_maximum);
535  gtk_entry_set_text(remmina_pref_dialog->entry_options_recent_items, buf);
536 
537 #ifdef HAVE_LIBAPPINDICATOR
538  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_new_connection_on_top), remmina_pref.applet_new_ontop);
539  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_hide_totals), remmina_pref.applet_hide_count);
540  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_disable_tray), remmina_pref.disable_tray_icon);
541  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_dark_theme), remmina_pref.dark_theme);
542  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_start_in_tray), remmina_icon_is_autostart());
544 #else
546  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_dark_theme), remmina_pref.dark_theme);
547  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->checkbutton_applet_new_connection_on_top), FALSE);
548  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->checkbutton_applet_hide_totals), FALSE);
549  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->checkbutton_applet_disable_tray), FALSE);
550  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->checkbutton_applet_start_in_tray), FALSE);
551 #endif
552 
567 
569  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_terminal_font_system), TRUE);
571  gtk_font_chooser_set_font(GTK_FONT_CHOOSER(remmina_pref_dialog->fontbutton_terminal_font), remmina_pref.vte_font);
572  } else {
573  gtk_font_chooser_set_font(GTK_FONT_CHOOSER(remmina_pref_dialog->fontbutton_terminal_font), "Monospace 12");
574  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->fontbutton_terminal_font), FALSE);
575  }
576  gtk_switch_set_active(GTK_SWITCH(remmina_pref_dialog->switch_terminal_bold), remmina_pref.vte_allow_bold_text);
577 
578  /* Foreground color option */
579  gdk_rgba_parse(&color, remmina_pref.color_pref.foreground);
580  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_foreground), &color);
581  /* Background color option */
582  gdk_rgba_parse(&color, remmina_pref.color_pref.background);
583  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_background), &color);
584  /* Cursor color option */
585  gdk_rgba_parse(&color, remmina_pref.color_pref.cursor);
586  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_cursor), &color);
587  gdk_rgba_parse(&color, remmina_pref.color_pref.cursor_foreground);
588  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_cursor_foreground), &color);
589  /* Highlight color option */
590  gdk_rgba_parse(&color, remmina_pref.color_pref.highlight);
591  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_highlight), &color);
592  gdk_rgba_parse(&color, remmina_pref.color_pref.highlight_foreground);
593  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_highlight_foreground), &color);
594  /* Bold color option */
595  gdk_rgba_parse(&color, remmina_pref.color_pref.colorBD);
596  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_colorBD), &color);
597  /* 16 colors */
598  gdk_rgba_parse(&color, remmina_pref.color_pref.color0);
599  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color0), &color);
600  gdk_rgba_parse(&color, remmina_pref.color_pref.color1);
601  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color1), &color);
602  gdk_rgba_parse(&color, remmina_pref.color_pref.color2);
603  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color2), &color);
604  gdk_rgba_parse(&color, remmina_pref.color_pref.color3);
605  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color3), &color);
606  gdk_rgba_parse(&color, remmina_pref.color_pref.color4);
607  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color4), &color);
608  gdk_rgba_parse(&color, remmina_pref.color_pref.color5);
609  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color5), &color);
610  gdk_rgba_parse(&color, remmina_pref.color_pref.color6);
611  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color6), &color);
612  gdk_rgba_parse(&color, remmina_pref.color_pref.color7);
613  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color7), &color);
614  gdk_rgba_parse(&color, remmina_pref.color_pref.color8);
615  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color8), &color);
616  gdk_rgba_parse(&color, remmina_pref.color_pref.color9);
617  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color9), &color);
618  gdk_rgba_parse(&color, remmina_pref.color_pref.color10);
619  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color10), &color);
620  gdk_rgba_parse(&color, remmina_pref.color_pref.color11);
621  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color11), &color);
622  gdk_rgba_parse(&color, remmina_pref.color_pref.color12);
623  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color12), &color);
624  gdk_rgba_parse(&color, remmina_pref.color_pref.color13);
625  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color13), &color);
626  gdk_rgba_parse(&color, remmina_pref.color_pref.color14);
627  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color14), &color);
628  gdk_rgba_parse(&color, remmina_pref.color_pref.color15);
629  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(remmina_pref_dialog->colorbutton_color15), &color);
630 #if defined (HAVE_LIBSSH) && defined (HAVE_LIBVTE)
631 #if !VTE_CHECK_VERSION(0, 38, 0)
632  /* Disable color scheme buttons if old version of VTE */
633  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_cursor), FALSE);
634  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_cursor_foreground), FALSE);
635  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_highlight), FALSE);
636  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_highlight_foreground), FALSE);
637  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_colorBD), FALSE);
638  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color0), FALSE);
639  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color1), FALSE);
640  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color2), FALSE);
641  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color3), FALSE);
642  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color4), FALSE);
643  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color5), FALSE);
644  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color6), FALSE);
645  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color7), FALSE);
646  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color8), FALSE);
647  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color9), FALSE);
648  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color10), FALSE);
649  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color11), FALSE);
650  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color12), FALSE);
651  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color13), FALSE);
652  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color14), FALSE);
653  gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->colorbutton_color15), FALSE);
654 #endif
655 #endif
656 
657  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.vte_lines);
658  gtk_entry_set_text(remmina_pref_dialog->entry_scrollback_lines, buf);
659 
660 #if SODIUM_VERSION_INT >= 90200
661  g_snprintf(buf, sizeof(buf), "%i", remmina_pref.unlock_timeout);
662  gtk_entry_set_text(remmina_pref_dialog->unlock_timeout, buf);
663 #endif
664 
672  if (remmina_pref.datadir_path != NULL && strlen(remmina_pref.datadir_path) > 0)
674  else
676  if (remmina_pref.remmina_file_name != NULL)
678  else
679  gtk_entry_set_text(remmina_pref_dialog->entry_options_file_name, "%G_%P_%N_%h.remmina");
680 
681  if (remmina_pref.screenshot_path != NULL)
683  else
684  gtk_file_chooser_set_filename(remmina_pref_dialog->filechooserbutton_options_screenshots_path, g_get_home_dir());
685  if (remmina_pref.screenshot_name != NULL)
687  else
688  gtk_entry_set_text(remmina_pref_dialog->entry_options_screenshot_name, "remmina_%p_%h_%Y%m%d-%H%M%S");
689 
691  if (remmina_pref.grab_color != NULL)
693  else
694  gtk_entry_set_text(remmina_pref_dialog->entry_options_file_name, "#00FF00");
695 
696  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_options_ssh_parseconfig), remmina_pref.ssh_parseconfig);
697 
704 
706 
707  g_signal_connect(G_OBJECT(remmina_pref_dialog->dialog), "destroy", G_CALLBACK(remmina_pref_on_dialog_destroy), NULL);
708 
709  g_object_set_data(G_OBJECT(remmina_pref_dialog->dialog), "tag", "remmina-pref-dialog");
711 }
712 
713 /* RemminaPrefDialog instance */
714 GtkWidget *remmina_pref_dialog_new(gint default_tab, GtkWindow *parent)
715 {
716  TRACE_CALL(__func__);
717  GSimpleActionGroup *actions;
718  GtkAccelGroup *accel_group = NULL;
719 
722 
723  remmina_pref_dialog->builder = remmina_public_gtk_builder_new_from_resource("/org/remmina/Remmina/src/../data/ui/remmina_preferences.glade");
724  remmina_pref_dialog->dialog = GTK_WIDGET(gtk_builder_get_object(remmina_pref_dialog->builder, "RemminaPrefDialog"));
725  if (parent)
726  gtk_window_set_transient_for(GTK_WINDOW(remmina_pref_dialog->dialog), parent);
727 
728  remmina_pref_dialog->notebook_preferences = GTK_NOTEBOOK(GET_OBJECT("notebook_preferences"));
729 
730  remmina_pref_dialog->filechooserbutton_options_datadir_path = GTK_FILE_CHOOSER(GET_OBJECT("filechooserbutton_options_datadir_path"));
731  remmina_pref_dialog->entry_options_file_name = GTK_ENTRY(GET_OBJECT("entry_options_file_name"));
732  remmina_pref_dialog->filechooserbutton_options_screenshots_path = GTK_FILE_CHOOSER(GET_OBJECT("filechooserbutton_options_screenshots_path"));
733  remmina_pref_dialog->entry_options_screenshot_name = GTK_ENTRY(GET_OBJECT("entry_options_screenshot_name"));
734  remmina_pref_dialog->switch_options_deny_screenshot_clipboard = GTK_SWITCH(GET_OBJECT("switch_options_deny_screenshot_clipboard"));
735  remmina_pref_dialog->switch_options_remember_last_view_mode = GTK_SWITCH(GET_OBJECT("switch_options_remember_last_view_mode"));
736  remmina_pref_dialog->switch_options_confirm_close = GTK_SWITCH(GET_OBJECT("switch_options_confirm_close"));
737  remmina_pref_dialog->switch_security_use_primary_password = GTK_SWITCH(GET_OBJECT("switch_security_use_primary_password"));
738  remmina_pref_dialog->unlock_timeout = GTK_ENTRY(GET_OBJECT("unlock_timeout"));
739  remmina_pref_dialog->switch_security_lock_connect = GTK_SWITCH(GET_OBJECT("switch_security_lock_connect"));
740  remmina_pref_dialog->switch_security_lock_edit = GTK_SWITCH(GET_OBJECT("switch_security_lock_edit"));
741  remmina_pref_dialog->switch_security_lock_view_passwords = GTK_SWITCH(GET_OBJECT("switch_security_lock_view_passwords"));
742  remmina_pref_dialog->comboboxtext_security_enc_method = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_security_enc_method"));
743 
744  remmina_pref_dialog->switch_security_audit = GTK_SWITCH(GET_OBJECT("switch_security_audit"));
745  remmina_pref_dialog->switch_security_trust_all = GTK_SWITCH(GET_OBJECT("switch_security_trust_all"));
746  remmina_pref_dialog->checkbutton_options_save_settings = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_options_save_settings"));
747  remmina_pref_dialog->checkbutton_appearance_fullscreen_on_auto = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_fullscreen_on_auto"));
748  remmina_pref_dialog->checkbutton_appearance_show_tabs = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_show_tabs"));
749  remmina_pref_dialog->checkbutton_appearance_show_notes = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_show_notes"));
750  remmina_pref_dialog->checkbutton_appearance_hide_toolbar = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_hide_toolbar"));
751  remmina_pref_dialog->checkbutton_appearance_hide_searchbar = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_appearance_hide_searchbar"));
752 
753  remmina_pref_dialog->switch_disable_news = GTK_SWITCH(GET_OBJECT("switch_disable_news"));
754  remmina_pref_dialog->switch_disable_stats = GTK_SWITCH(GET_OBJECT("switch_disable_stats"));
755  remmina_pref_dialog->switch_disable_tip = GTK_SWITCH(GET_OBJECT("switch_disable_tip"));
756  remmina_pref_dialog->label_disable_news = GTK_LABEL(GET_OBJECT("remmina_info_disable_news_label"));
757  remmina_pref_dialog->label_disable_stats = GTK_LABEL(GET_OBJECT("remmina_info_disable_stats_label"));
758  remmina_pref_dialog->label_disable_tip = GTK_LABEL(GET_OBJECT("remmina_info_disable_tip"));
759 
760  remmina_pref_dialog->comboboxtext_options_double_click = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_options_double_click"));
761  remmina_pref_dialog->comboboxtext_appearance_view_mode = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_appearance_view_mode"));
762  remmina_pref_dialog->comboboxtext_appearance_tab_interface = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_appearance_tab_interface"));
763  remmina_pref_dialog->comboboxtext_appearance_fullscreen_toolbar_visibility = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_appearance_fullscreen_toolbar_visibility"));
764  remmina_pref_dialog->comboboxtext_options_scale_quality = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_options_scale_quality"));
765  remmina_pref_dialog->checkbutton_options_ssh_parseconfig = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_options_ssh_parseconfig"));
766  remmina_pref_dialog->comboboxtext_options_ssh_loglevel = GTK_COMBO_BOX(GET_OBJECT("comboboxtext_options_ssh_loglevel"));
767  remmina_pref_dialog->entry_options_ssh_port = GTK_ENTRY(GET_OBJECT("entry_options_ssh_port"));
768  remmina_pref_dialog->entry_options_ssh_tcp_keepidle = GTK_ENTRY(GET_OBJECT("entry_options_ssh_tcp_keepidle"));
769  remmina_pref_dialog->entry_options_ssh_tcp_keepintvl = GTK_ENTRY(GET_OBJECT("entry_options_ssh_tcp_keepintvl"));
770  remmina_pref_dialog->entry_options_ssh_tcp_keepcnt = GTK_ENTRY(GET_OBJECT("entry_options_ssh_tcp_keepcnt"));
771  remmina_pref_dialog->entry_options_ssh_tcp_usrtimeout = GTK_ENTRY(GET_OBJECT("entry_options_ssh_tcp_usrtimeout"));
772  remmina_pref_dialog->entry_options_scroll = GTK_ENTRY(GET_OBJECT("entry_options_scroll"));
773  remmina_pref_dialog->entry_options_recent_items = GTK_ENTRY(GET_OBJECT("entry_options_recent_items"));
774  remmina_pref_dialog->entry_grab_color = GTK_ENTRY(GET_OBJECT("entry_grab_color"));
775  remmina_pref_dialog->switch_appearance_grab_color = GTK_SWITCH(GET_OBJECT("switch_appearance_grab_color"));
776  remmina_pref_dialog->button_options_recent_items_clear = GTK_BUTTON(GET_OBJECT("button_options_recent_items_clear"));
777 
778  remmina_pref_dialog->checkbutton_applet_new_connection_on_top = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_applet_new_connection_on_top"));
779  remmina_pref_dialog->checkbutton_applet_hide_totals = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_applet_hide_totals"));
780  remmina_pref_dialog->checkbutton_applet_disable_tray = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_applet_disable_tray"));
781  remmina_pref_dialog->checkbutton_dark_theme = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_dark_theme"));
782  remmina_pref_dialog->checkbutton_applet_start_in_tray = GTK_CHECK_BUTTON(GET_OBJECT("checkbutton_applet_start_in_tray"));
783 
784  remmina_pref_dialog->button_keyboard_host_key = GTK_BUTTON(GET_OBJECT("button_keyboard_host_key"));
785  remmina_pref_dialog->button_keyboard_fullscreen = GTK_BUTTON(GET_OBJECT("button_keyboard_fullscreen"));
786  remmina_pref_dialog->button_keyboard_auto_fit = GTK_BUTTON(GET_OBJECT("button_keyboard_auto_fit"));
787  remmina_pref_dialog->button_keyboard_switch_tab_left = GTK_BUTTON(GET_OBJECT("button_keyboard_switch_tab_left"));
788  remmina_pref_dialog->button_keyboard_switch_tab_right = GTK_BUTTON(GET_OBJECT("button_keyboard_switch_tabright"));
789  remmina_pref_dialog->button_keyboard_scaled = GTK_BUTTON(GET_OBJECT("button_keyboard_scaled"));
790  remmina_pref_dialog->button_keyboard_clipboard = GTK_BUTTON(GET_OBJECT("button_keyboard_clipboard"));
791  remmina_pref_dialog->button_keyboard_grab_keyboard = GTK_BUTTON(GET_OBJECT("button_keyboard_grab_keyboard"));
792  remmina_pref_dialog->button_keyboard_multimon = GTK_BUTTON(GET_OBJECT("button_keyboard_multimon"));
793  remmina_pref_dialog->button_keyboard_screenshot = GTK_BUTTON(GET_OBJECT("button_keyboard_screenshot"));
794  remmina_pref_dialog->button_keyboard_viewonly = GTK_BUTTON(GET_OBJECT("button_keyboard_viewonly"));
795  remmina_pref_dialog->button_keyboard_minimize = GTK_BUTTON(GET_OBJECT("button_keyboard_minimize"));
796  remmina_pref_dialog->button_keyboard_disconnect = GTK_BUTTON(GET_OBJECT("button_keyboard_disconnect"));
797  remmina_pref_dialog->button_keyboard_toolbar = GTK_BUTTON(GET_OBJECT("button_keyboard_toolbar"));
798 
799  remmina_pref_dialog->switch_terminal_font_system = GTK_SWITCH(GET_OBJECT("switch_terminal_font_system"));
800  remmina_pref_dialog->fontbutton_terminal_font = GTK_FONT_BUTTON(GET_OBJECT("fontbutton_terminal_font"));
801  remmina_pref_dialog->switch_terminal_bold = GTK_SWITCH(GET_OBJECT("switch_terminal_bold"));
802  remmina_pref_dialog->entry_scrollback_lines = GTK_ENTRY(GET_OBJECT("entry_scrollback_lines"));
803  remmina_pref_dialog->button_keyboard_copy = GTK_BUTTON(GET_OBJECT("button_keyboard_copy"));
804  remmina_pref_dialog->button_keyboard_paste = GTK_BUTTON(GET_OBJECT("button_keyboard_paste"));
805  remmina_pref_dialog->button_keyboard_select_all = GTK_BUTTON(GET_OBJECT("button_keyboard_select_all"));
806  remmina_pref_dialog->button_keyboard_increase_font = GTK_BUTTON(GET_OBJECT("button_keyboard_increase_font"));
807  remmina_pref_dialog->button_keyboard_decrease_font = GTK_BUTTON(GET_OBJECT("button_keyboard_decrease_font"));
808  remmina_pref_dialog->button_keyboard_search_text = GTK_BUTTON(GET_OBJECT("button_keyboard_search_text"));
809  remmina_pref_dialog->label_terminal_foreground = GTK_LABEL(GET_OBJECT("label_terminal_foreground"));
810  remmina_pref_dialog->colorbutton_foreground = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_foreground"));
811  remmina_pref_dialog->label_terminal_background = GTK_LABEL(GET_OBJECT("label_terminal_background"));
812  remmina_pref_dialog->colorbutton_background = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_background"));
813  remmina_pref_dialog->label_terminal_cursor_color = GTK_LABEL(GET_OBJECT("label_terminal_cursor_color"));
814  remmina_pref_dialog->colorbutton_cursor = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_cursor"));
815  remmina_pref_dialog->colorbutton_cursor_foreground = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_cursor_foreground"));
816  remmina_pref_dialog->colorbutton_highlight = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_highlight"));
817  remmina_pref_dialog->colorbutton_highlight_foreground = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_highlight_foreground"));
818  remmina_pref_dialog->label_terminal_bold_color = GTK_LABEL(GET_OBJECT("label_terminal_bold_color"));
819  remmina_pref_dialog->colorbutton_colorBD = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_colorBD"));
820  remmina_pref_dialog->label_terminal_normal_colors = GTK_LABEL(GET_OBJECT("label_terminal_normal_colors"));
821  remmina_pref_dialog->colorbutton_color0 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color0"));
822  remmina_pref_dialog->colorbutton_color1 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color1"));
823  remmina_pref_dialog->colorbutton_color2 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color2"));
824  remmina_pref_dialog->colorbutton_color3 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color3"));
825  remmina_pref_dialog->colorbutton_color4 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color4"));
826  remmina_pref_dialog->colorbutton_color5 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color5"));
827  remmina_pref_dialog->colorbutton_color6 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color6"));
828  remmina_pref_dialog->colorbutton_color7 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color7"));
829  remmina_pref_dialog->label_terminal_bright_colors = GTK_LABEL(GET_OBJECT("label_terminal_bright_colors"));
830  remmina_pref_dialog->colorbutton_color8 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color8"));
831  remmina_pref_dialog->colorbutton_color9 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color9"));
832  remmina_pref_dialog->colorbutton_color10 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color10"));
833  remmina_pref_dialog->colorbutton_color11 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color11"));
834  remmina_pref_dialog->colorbutton_color12 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color12"));
835  remmina_pref_dialog->colorbutton_color13 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color13"));
836  remmina_pref_dialog->colorbutton_color14 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color14"));
837  remmina_pref_dialog->colorbutton_color15 = GTK_COLOR_BUTTON(GET_OBJECT("colorbutton_color15"));
838 #if defined (HAVE_LIBSSH) && defined (HAVE_LIBVTE)
839 #if VTE_CHECK_VERSION(0, 38, 0)
840  const gchar *remmina_dir;
841  gchar *destpath;
842  remmina_dir = g_build_path("/", g_get_user_config_dir(), "remmina", NULL);
843  destpath = g_strdup_printf("%s/remmina.colors", remmina_dir);
844  remmina_pref_dialog->button_term_cs = GTK_FILE_CHOOSER(GET_OBJECT("button_term_cs"));
845  const gchar *fc_tooltip_text = g_strconcat(_("Picking a terminal colouring file replaces the file: "),
846  "\n",
847  destpath,
848  "\n",
849  _("This file contains the “Custom” terminal colour scheme selectable from the “Advanced” tab of terminal connections and editable in the “Terminal” tab in the settings."),
850  NULL);
851  gtk_widget_set_tooltip_text(GTK_WIDGET(remmina_pref_dialog->button_term_cs), fc_tooltip_text);
852  gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(remmina_pref_dialog->button_term_cs), REMMINA_RUNTIME_TERM_CS_DIR);
853  g_free(destpath);
854 #endif
855 #endif
856  /* Non widget objects */
857  actions = g_simple_action_group_new();
858  g_action_map_add_action_entries(G_ACTION_MAP(actions), pref_actions, G_N_ELEMENTS(pref_actions), remmina_pref_dialog->dialog);
859  gtk_widget_insert_action_group(GTK_WIDGET(remmina_pref_dialog->dialog), "pref", G_ACTION_GROUP(actions));
860  g_action_map_add_action_entries(G_ACTION_MAP(actions), pref_actions, G_N_ELEMENTS(pref_actions), remmina_pref_dialog->dialog);
861  g_object_unref(actions);
862  /* Accelerators */
863  accel_group = gtk_accel_group_new();
864  gtk_window_add_accel_group(GTK_WINDOW(remmina_pref_dialog->dialog), accel_group);
865  gtk_accel_group_connect(accel_group, GDK_KEY_Q, GDK_CONTROL_MASK, 0,
866  g_cclosure_new_swap(G_CALLBACK(remmina_pref_dialog_on_action_close), NULL, NULL));
867 
868  /* Connect signals */
869  gtk_builder_connect_signals(remmina_pref_dialog->builder, NULL);
870  /* Initialize the window and load the preferences */
872 
873  if (default_tab > 0)
874  gtk_notebook_set_current_page(remmina_pref_dialog->notebook_preferences, default_tab);
875  return remmina_pref_dialog->dialog;
876 }
877 
879 {
880  if (!remmina_pref_dialog)
881  return NULL;
882  return remmina_pref_dialog->dialog;
883 }
@ REMMINA_PLUGIN_TYPE_PREF
Definition: plugin.h:52
RemminaPref remmina_pref
Definition: rcw.c:79
gchar * remmina_file_get_datadir(void)
Return datadir_path from pref or first found data dir as per XDG specs.
void remmina_icon_set_autostart(gboolean autostart)
Definition: remmina_icon.c:458
gboolean remmina_icon_is_autostart(void)
Definition: remmina_icon.c:438
void remmina_icon_populate_menu(void)
Definition: remmina_icon.c:256
void remmina_icon_init(void)
Definition: remmina_icon.c:362
gchar * remmina_key_chooser_get_value(guint keyval, guint state)
RemminaKeyChooserArguments * remmina_key_chooser_new(GtkWindow *parent_window, gboolean use_modifiers)
guint remmina_key_chooser_get_keyval(const gchar *value)
void remmina_main_reload_preferences()
gboolean remmina_passwd(GtkWindow *parent, gchar **unlock_password)
void remmina_plugin_manager_for_each_plugin(RemminaPluginType type, RemminaPluginFunc func, gpointer data)
void remmina_pref_init(void)
Definition: remmina_pref.c:228
void remmina_pref_set_value(const gchar *key, const gchar *value)
gchar * remmina_pref_get_value(const gchar *key)
void remmina_pref_clear_recent(void)
gboolean remmina_pref_save(void)
Definition: remmina_pref.c:861
void remmina_pref_on_button_keystrokes_clicked(GtkWidget *widget, gpointer user_data)
void remmina_pref_dialog_disable_tray_icon_on_toggled(GtkWidget *widget, RemminaPrefDialog *dialog)
static GActionEntry pref_actions[]
void remmina_pref_dialog_vte_font_on_toggled(GtkSwitch *widget, RemminaPrefDialog *dialog)
static RemminaPrefDialog * remmina_pref_dialog
static void remmina_pref_dialog_set_button_label(GtkButton *button, guint keyval)
void remmina_pref_dialog_clear_recent(GtkWidget *widget, gpointer user_data)
void remmina_pref_on_color_scheme_selected(GtkWidget *widget, gpointer user_data)
void remmina_pref_dialog_on_action_close(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_pref_dialog_on_key_chooser(GtkWidget *widget, gpointer user_data)
static void remmina_pref_dialog_init(void)
void remmina_prefdiag_on_use_password_activated(GtkSwitch *sw, gpointer user_data)
GtkWidget * remmina_pref_dialog_get_dialog()
GtkWidget * remmina_pref_dialog_new(gint default_tab, GtkWindow *parent)
void remmina_pref_on_dialog_destroy(GtkWidget *widget, gpointer user_data)
void remmina_pref_on_button_resolutions_clicked(GtkWidget *widget, gpointer user_data)
void remmina_prefdiag_on_grab_color_activated(GtkSwitch *widget, gpointer user_data)
void remmina_pref_dialog_on_close_clicked(GtkWidget *widget, RemminaPrefDialog *dialog)
static gboolean remmina_pref_dialog_add_pref_plugin(gchar *name, RemminaPlugin *plugin, gpointer user_data)
gboolean remmina_public_resolution_validation_func(const gchar *new_str, gchar **error)
GtkBuilder * remmina_public_gtk_builder_new_from_resource(gchar *resource)
GtkDialog * remmina_string_list_new(gboolean two_columns, const gchar *fields_separator)
void remmina_string_list_set_validation_func(RemminaStringListValidationFunc func)
gchar * remmina_string_list_get_text(void)
void remmina_string_list_set_titles(gchar *title1, gchar *title2)
void remmina_string_list_set_text(const gchar *text, const gboolean clear_data)
void remmina_widget_pool_register(GtkWidget *widget)
gchar * cursor_foreground
Definition: remmina_pref.h:111
gchar * highlight_foreground
Definition: remmina_pref.h:113
GtkButton * button_keyboard_increase_font
GtkLabel * label_terminal_background
GtkNotebook * notebook_preferences
GtkButton * button_keyboard_minimize
GtkCheckButton * checkbutton_appearance_show_tabs
GtkButton * button_options_recent_items_clear
GtkLabel * label_terminal_cursor_color
GtkButton * button_keyboard_copy
GtkColorButton * colorbutton_color8
GtkButton * button_keyboard_search_text
GtkSwitch * switch_disable_news
GtkSwitch * switch_appearance_grab_color
GtkButton * button_keyboard_multimon
GtkCheckButton * checkbutton_options_save_settings
RemminaPrefDialogPriv * priv
GtkColorButton * colorbutton_color9
GtkSwitch * switch_security_lock_edit
GtkEntry * entry_options_ssh_tcp_keepintvl
GtkLabel * label_disable_stats
GtkColorButton * colorbutton_color3
GtkButton * button_keyboard_fullscreen
GtkLabel * label_terminal_foreground
GtkLabel * label_terminal_bold_color
GtkCheckButton * checkbutton_applet_start_in_tray
GtkButton * button_keyboard_clipboard
GtkSwitch * switch_disable_tip
GtkFileChooser * button_term_cs
GtkCheckButton * checkbutton_appearance_hide_searchbar
GtkSwitch * switch_security_use_primary_password
GtkColorButton * colorbutton_color11
GtkComboBox * comboboxtext_appearance_tab_interface
GtkColorButton * colorbutton_color14
GtkCheckButton * checkbutton_appearance_hide_toolbar
GtkColorButton * colorbutton_color5
GtkComboBox * comboboxtext_options_ssh_loglevel
GtkSwitch * switch_security_lock_connect
GtkEntry * entry_options_file_name
GtkComboBox * comboboxtext_options_scale_quality
GtkLabel * label_terminal_normal_colors
GtkSwitch * switch_terminal_bold
GtkColorButton * colorbutton_cursor
GtkEntry * entry_options_ssh_tcp_keepidle
GtkButton * button_keyboard_host_key
GtkButton * button_keyboard_screenshot
GtkEntry * entry_options_screenshot_name
GtkCheckButton * checkbutton_appearance_show_notes
GtkEntry * entry_options_ssh_port
GtkSwitch * switch_security_lock_view_passwords
GtkEntry * entry_options_ssh_tcp_keepcnt
GtkColorButton * colorbutton_color13
GtkSwitch * switch_options_remember_last_view_mode
GtkButton * button_keyboard_decrease_font
GtkComboBox * comboboxtext_appearance_fullscreen_toolbar_visibility
GtkCheckButton * checkbutton_applet_new_connection_on_top
GtkSwitch * switch_disable_stats
GtkEntry * entry_options_recent_items
GtkComboBox * comboboxtext_options_double_click
GtkColorButton * colorbutton_color0
GtkColorButton * colorbutton_color1
GtkButton * button_keyboard_grab_keyboard
GtkColorButton * colorbutton_color6
GtkSwitch * switch_options_confirm_close
GtkComboBox * comboboxtext_appearance_view_mode
GtkColorButton * colorbutton_color2
GtkColorButton * colorbutton_foreground
GtkColorButton * colorbutton_color12
GtkColorButton * colorbutton_cursor_foreground
GtkButton * button_keyboard_switch_tab_left
GtkSwitch * switch_security_audit
GtkEntry * entry_options_ssh_tcp_usrtimeout
GtkButton * button_keyboard_auto_fit
GtkColorButton * colorbutton_color15
GtkCheckButton * checkbutton_applet_hide_totals
GtkButton * button_keyboard_toolbar
GtkColorButton * colorbutton_highlight
GtkCheckButton * checkbutton_options_ssh_parseconfig
GtkFileChooser * filechooserbutton_options_datadir_path
GtkEntry * entry_options_scroll
GtkSwitch * switch_terminal_font_system
GtkCheckButton * checkbutton_dark_theme
GtkLabel * label_terminal_bright_colors
GtkCheckButton * checkbutton_applet_disable_tray
GtkColorButton * colorbutton_colorBD
GtkComboBox * comboboxtext_security_enc_method
GtkCheckButton * checkbutton_appearance_fullscreen_on_auto
GtkSwitch * switch_options_deny_screenshot_clipboard
GtkColorButton * colorbutton_color10
GtkButton * button_keyboard_scaled
GtkColorButton * colorbutton_background
GtkColorButton * colorbutton_color7
GtkEntry * entry_scrollback_lines
GtkButton * button_keyboard_switch_tab_right
GtkButton * button_keyboard_disconnect
GtkFileChooser * filechooserbutton_options_screenshots_path
GtkButton * button_keyboard_paste
GtkColorButton * colorbutton_highlight_foreground
GtkButton * button_keyboard_viewonly
GtkFontButton * fontbutton_terminal_font
GtkSwitch * switch_security_trust_all
GtkColorButton * colorbutton_color4
GtkButton * button_keyboard_select_all
gint default_action
Definition: remmina_pref.h:142
gint ssh_tcp_keepcnt
Definition: remmina_pref.h:172
gchar * keystrokes
Definition: remmina_pref.h:147
gint scale_quality
Definition: remmina_pref.h:143
guint shortcutkey_fullscreen
Definition: remmina_pref.h:176
guint shortcutkey_disconnect
Definition: remmina_pref.h:188
gboolean disable_news
Definition: remmina_pref.h:244
guint shortcutkey_screenshot
Definition: remmina_pref.h:186
guint shortcutkey_clipboard
Definition: remmina_pref.h:179
gboolean ssh_parseconfig
Definition: remmina_pref.h:168
guint shortcutkey_scale
Definition: remmina_pref.h:182
guint vte_shortcutkey_decrease_font
Definition: remmina_pref.h:210
gint ssh_tcp_keepidle
Definition: remmina_pref.h:170
gboolean always_show_notes
Definition: remmina_pref.h:154
gboolean audit
Definition: remmina_pref.h:199
guint shortcutkey_grab
Definition: remmina_pref.h:184
gboolean grab_color_switch
Definition: remmina_pref.h:161
const gchar * screenshot_path
Definition: remmina_pref.h:138
guint vte_shortcutkey_search_text
Definition: remmina_pref.h:211
guint shortcutkey_prevtab
Definition: remmina_pref.h:178
gboolean fullscreen_on_auto
Definition: remmina_pref.h:152
guint shortcutkey_viewonly
Definition: remmina_pref.h:185
guint shortcutkey_multimon
Definition: remmina_pref.h:183
gboolean vte_allow_bold_text
Definition: remmina_pref.h:203
guint vte_shortcutkey_copy
Definition: remmina_pref.h:206
gboolean lock_edit
Definition: remmina_pref.h:196
gchar * resolutions
Definition: remmina_pref.h:146
const gchar * grab_color
Definition: remmina_pref.h:160
gint auto_scroll_step
Definition: remmina_pref.h:144
const gchar * unlock_password
Definition: remmina_pref.h:192
gboolean always_show_tab
Definition: remmina_pref.h:153
gboolean use_primary_password
Definition: remmina_pref.h:191
guint shortcutkey_nexttab
Definition: remmina_pref.h:180
gboolean lock_connect
Definition: remmina_pref.h:195
gint ssh_tcp_keepintvl
Definition: remmina_pref.h:171
gboolean dark_theme
Definition: remmina_pref.h:150
RemminaColorPref color_pref
Definition: remmina_pref.h:237
guint shortcutkey_minimize
Definition: remmina_pref.h:187
guint vte_shortcutkey_paste
Definition: remmina_pref.h:207
guint vte_shortcutkey_increase_font
Definition: remmina_pref.h:209
const gchar * datadir_path
Definition: remmina_pref.h:136
gboolean hide_connection_toolbar
Definition: remmina_pref.h:155
gint fullscreen_toolbar_visibility
Definition: remmina_pref.h:159
gboolean applet_new_ontop
Definition: remmina_pref.h:163
guint vte_shortcutkey_select_all
Definition: remmina_pref.h:208
gboolean lock_view_passwords
Definition: remmina_pref.h:197
const gchar * remmina_file_name
Definition: remmina_pref.h:137
guint shortcutkey_toolbar
Definition: remmina_pref.h:189
gboolean disable_tip
Definition: remmina_pref.h:247
gboolean confirm_close
Definition: remmina_pref.h:148
gboolean save_view_mode
Definition: remmina_pref.h:141
gint recent_maximum
Definition: remmina_pref.h:145
gchar * vte_font
Definition: remmina_pref.h:202
gboolean applet_hide_count
Definition: remmina_pref.h:164
gint ssh_tcp_usrtimeout
Definition: remmina_pref.h:173
gboolean disable_stats
Definition: remmina_pref.h:240
const gchar * screenshot_name
Definition: remmina_pref.h:140
gboolean hide_searchbar
Definition: remmina_pref.h:156
gboolean trust_all
Definition: remmina_pref.h:200
guint shortcutkey_autofit
Definition: remmina_pref.h:177
gboolean deny_screenshot_clipboard
Definition: remmina_pref.h:139
gint unlock_timeout
Definition: remmina_pref.h:194
gint sshtunnel_port
Definition: remmina_pref.h:169
gboolean disable_tray_icon
Definition: remmina_pref.h:165
GtkWidget *(* get_pref_body)(struct _RemminaPrefPlugin *instance)
Definition: plugin.h:148
const gchar * pref_label
Definition: plugin.h:147