Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntenore Gatta <antenore@simbiosi.org>2018-05-03 15:38:44 +0300
committerAntenore Gatta <antenore@simbiosi.org>2018-05-03 15:38:44 +0300
commitd77997ca5c06c1dd971cf85383e81bd6584be746 (patch)
tree78a08a34126a30a25655ca748b9e2197e918102b /src/remmina_pref.c
parentbcf9990358f0ac9423734421be45c38fdccdf1f0 (diff)
Renamed remmina in src and moved source files
Diffstat (limited to 'src/remmina_pref.c')
-rw-r--r--src/remmina_pref.c1039
1 files changed, 1039 insertions, 0 deletions
diff --git a/src/remmina_pref.c b/src/remmina_pref.c
new file mode 100644
index 000000000..5dc4a9331
--- /dev/null
+++ b/src/remmina_pref.c
@@ -0,0 +1,1039 @@
+/*
+ * Remmina - The GTK+ Remote Desktop Client
+ * Copyright (C) 2009-2011 Vic Lee
+ * Copyright (C) 2014-2015 Antenore Gatta, Fabio Castelli, Giovanni Panozzo
+ * Copyright (C) 2016-2018 Antenore Gatta, Giovanni Panozzo
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. * If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. * If you
+ * do not wish to do so, delete this exception statement from your
+ * version. * If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/utsname.h>
+
+#include <glib/gstdio.h>
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "remmina_public.h"
+#include "remmina_string_array.h"
+#include "remmina_pref.h"
+#include "remmina/remmina_trace_calls.h"
+
+const gchar *default_resolutions = "640x480,800x600,1024x768,1152x864,1280x960,1400x1050";
+const gchar *default_keystrokes = "Send hello world§hello world\\n";
+
+gchar *remmina_keymap_file;
+static GHashTable *remmina_keymap_table = NULL;
+
+/* We could customize this further if there are more requirements */
+static const gchar *default_keymap_data = "# Please check gdk/gdkkeysyms.h for a full list of all key names or hex key values\n"
+ "\n"
+ "[Map Meta Keys]\n"
+ "Super_L = Meta_L\n"
+ "Super_R = Meta_R\n"
+ "Meta_L = Super_L\n"
+ "Meta_R = Super_R\n";
+
+static void remmina_pref_gen_secret(void)
+{
+ TRACE_CALL(__func__);
+ guchar s[32];
+ gint i;
+ GTimeVal gtime;
+ GKeyFile *gkeyfile;
+ gchar *content;
+ gsize length;
+
+ g_get_current_time(&gtime);
+ srand(gtime.tv_sec);
+
+ for (i = 0; i < 32; i++) {
+ s[i] = (guchar)(rand() % 256);
+ }
+ remmina_pref.secret = g_base64_encode(s, 32);
+
+ gkeyfile = g_key_file_new();
+ g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL);
+ g_key_file_set_string(gkeyfile, "remmina_pref", "secret", remmina_pref.secret);
+ content = g_key_file_to_data(gkeyfile, &length, NULL);
+ g_file_set_contents(remmina_pref_file, content, length, NULL);
+
+ g_key_file_free(gkeyfile);
+ g_free(content);
+}
+
+static guint remmina_pref_get_keyval_from_str(const gchar *str)
+{
+ TRACE_CALL(__func__);
+ guint k;
+
+ if (!str)
+ return 0;
+
+ k = gdk_keyval_from_name(str);
+ if (!k) {
+ if (sscanf(str, "%x", &k) < 1)
+ k = 0;
+ }
+ return k;
+}
+
+static void remmina_pref_init_keymap(void)
+{
+ TRACE_CALL(__func__);
+ GKeyFile *gkeyfile;
+ gchar **groups;
+ gchar **gptr;
+ gchar **keys;
+ gchar **kptr;
+ gsize nkeys;
+ gchar *value;
+ guint *table;
+ guint *tableptr;
+ guint k1, k2;
+
+ if (remmina_keymap_table)
+ g_hash_table_destroy(remmina_keymap_table);
+ remmina_keymap_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+
+ gkeyfile = g_key_file_new();
+ if (!g_key_file_load_from_file(gkeyfile, remmina_keymap_file, G_KEY_FILE_NONE, NULL)) {
+ if (!g_key_file_load_from_data(gkeyfile, default_keymap_data, strlen(default_keymap_data), G_KEY_FILE_NONE,
+ NULL)) {
+ g_print("Failed to initialize keymap table\n");
+ g_key_file_free(gkeyfile);
+ return;
+ }
+ }
+
+ groups = g_key_file_get_groups(gkeyfile, NULL);
+ gptr = groups;
+ while (*gptr) {
+ keys = g_key_file_get_keys(gkeyfile, *gptr, &nkeys, NULL);
+ table = g_new0(guint, nkeys * 2 + 1);
+ g_hash_table_insert(remmina_keymap_table, g_strdup(*gptr), table);
+
+ kptr = keys;
+ tableptr = table;
+ while (*kptr) {
+ k1 = remmina_pref_get_keyval_from_str(*kptr);
+ if (k1) {
+ value = g_key_file_get_string(gkeyfile, *gptr, *kptr, NULL);
+ k2 = remmina_pref_get_keyval_from_str(value);
+ g_free(value);
+ *tableptr++ = k1;
+ *tableptr++ = k2;
+ }
+ kptr++;
+ }
+ g_strfreev(keys);
+ gptr++;
+ }
+ g_strfreev(groups);
+ g_key_file_free(gkeyfile);
+}
+
+/** @todo remmina_pref_file_do_copy and remmina_file_manager_do_copy to remmina_files_copy */
+static gboolean remmina_pref_file_do_copy(const char *src_path, const char *dst_path)
+{
+ GFile *src = g_file_new_for_path(src_path), *dst = g_file_new_for_path(dst_path);
+ /* We don't overwrite the target if it exists, because overwrite is not set */
+ const gboolean ok = g_file_copy(src, dst, G_FILE_COPY_NONE, NULL, NULL, NULL, NULL);
+
+ g_object_unref(dst);
+ g_object_unref(src);
+
+ return ok;
+}
+
+void remmina_pref_init(void)
+{
+ TRACE_CALL(__func__);
+ GKeyFile *gkeyfile;
+ gchar *remmina_dir;
+ const gchar *filename = g_strdup_printf("%s.pref", g_get_prgname());
+ const gchar *colors_filename = g_strdup_printf("%s.colors", g_get_prgname());
+ gchar *remmina_colors_file;
+ GDir *dir;
+ gchar *legacy = g_strdup_printf(".%s", g_get_prgname());
+ int i;
+
+ remmina_dir = g_build_path( "/", g_get_user_config_dir(), g_get_prgname(), NULL);
+ /* Create the XDG_CONFIG_HOME directory */
+ g_mkdir_with_parents(remmina_dir, 0750);
+
+ g_free(remmina_dir), remmina_dir = NULL;
+ /* Legacy ~/.remmina we copy the existing remmina.pref file inside
+ * XDG_CONFIG_HOME */
+ remmina_dir = g_build_path("/", g_get_home_dir(), legacy, NULL);
+ if (g_file_test(remmina_dir, G_FILE_TEST_IS_DIR)) {
+ dir = g_dir_open(remmina_dir, 0, NULL);
+ remmina_pref_file_do_copy(
+ g_build_path( "/", remmina_dir, filename, NULL),
+ g_build_path( "/", g_get_user_config_dir(),
+ g_get_prgname(), filename, NULL));
+ }
+
+ /* /usr/local/etc/remmina */
+ const gchar * const *dirs = g_get_system_config_dirs();
+ g_free(remmina_dir), remmina_dir = NULL;
+ for (i = 0; dirs[i] != NULL; ++i) {
+ remmina_dir = g_build_path( "/", dirs[i], g_get_prgname(), NULL);
+ if (g_file_test(remmina_dir, G_FILE_TEST_IS_DIR)) {
+ dir = g_dir_open(remmina_dir, 0, NULL);
+ while ((filename = g_dir_read_name(dir)) != NULL) {
+ remmina_pref_file_do_copy(
+ g_build_path( "/", remmina_dir, filename, NULL),
+ g_build_path( "/", g_get_user_config_dir(),
+ g_get_prgname(), filename, NULL));
+ }
+ g_free(remmina_dir), remmina_dir = NULL;
+ }
+ }
+
+ /* The last case we use the home ~/.config/remmina */
+ if (remmina_dir != NULL)
+ g_free(remmina_dir), remmina_dir = NULL;
+ remmina_dir = g_build_path( "/", g_get_user_config_dir(),
+ g_get_prgname(), NULL);
+
+ remmina_pref_file = g_strdup_printf("%s/remmina.pref", remmina_dir);
+ /* remmina.colors */
+ remmina_colors_file = g_strdup_printf("%s/%s", remmina_dir, colors_filename);
+
+ remmina_keymap_file = g_strdup_printf("%s/remmina.keymap", remmina_dir);
+
+ gkeyfile = g_key_file_new();
+ g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL);
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "save_view_mode", NULL))
+ remmina_pref.save_view_mode = g_key_file_get_boolean(gkeyfile, "remmina_pref", "save_view_mode", NULL);
+ else
+ remmina_pref.save_view_mode = TRUE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "fullscreen_on_auto", NULL))
+ remmina_pref.fullscreen_on_auto = g_key_file_get_boolean(gkeyfile, "remmina_pref", "fullscreen_on_auto", NULL);
+ else
+ remmina_pref.fullscreen_on_auto = TRUE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "floating_toolbar_placement", NULL))
+ remmina_pref.floating_toolbar_placement = g_key_file_get_integer(gkeyfile, "remmina_pref", "floating_toolbar_placement", NULL);
+ else
+ remmina_pref.floating_toolbar_placement = FLOATING_TOOLBAR_PLACEMENT_TOP;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "prevent_snap_welcome_message", NULL))
+ remmina_pref.prevent_snap_welcome_message = g_key_file_get_boolean(gkeyfile, "remmina_pref", "prevent_snap_welcome_message", NULL);
+ else
+ remmina_pref.prevent_snap_welcome_message = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "toolbar_placement", NULL))
+ remmina_pref.toolbar_placement = g_key_file_get_integer(gkeyfile, "remmina_pref", "toolbar_placement", NULL);
+ else
+ remmina_pref.toolbar_placement = TOOLBAR_PLACEMENT_LEFT;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "always_show_tab", NULL))
+ remmina_pref.always_show_tab = g_key_file_get_boolean(gkeyfile, "remmina_pref", "always_show_tab", NULL);
+ else
+ remmina_pref.always_show_tab = TRUE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "hide_connection_toolbar", NULL))
+ remmina_pref.hide_connection_toolbar = g_key_file_get_boolean(gkeyfile, "remmina_pref",
+ "hide_connection_toolbar", NULL);
+ else
+ remmina_pref.hide_connection_toolbar = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "default_action", NULL))
+ remmina_pref.default_action = g_key_file_get_integer(gkeyfile, "remmina_pref", "default_action", NULL);
+ else
+ remmina_pref.default_action = REMMINA_ACTION_CONNECT;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "scale_quality", NULL))
+ remmina_pref.scale_quality = g_key_file_get_integer(gkeyfile, "remmina_pref", "scale_quality", NULL);
+ else
+ remmina_pref.scale_quality = GDK_INTERP_HYPER;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "hide_toolbar", NULL))
+ remmina_pref.hide_toolbar = g_key_file_get_boolean(gkeyfile, "remmina_pref", "hide_toolbar", NULL);
+ else
+ remmina_pref.hide_toolbar = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "hide_statusbar", NULL))
+ remmina_pref.hide_statusbar = g_key_file_get_boolean(gkeyfile, "remmina_pref", "hide_statusbar", NULL);
+ else
+ remmina_pref.hide_statusbar = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "small_toolbutton", NULL))
+ remmina_pref.small_toolbutton = g_key_file_get_boolean(gkeyfile, "remmina_pref", "small_toolbutton", NULL);
+ else
+ remmina_pref.small_toolbutton = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "view_file_mode", NULL))
+ remmina_pref.view_file_mode = g_key_file_get_integer(gkeyfile, "remmina_pref", "view_file_mode", NULL);
+ else
+ remmina_pref.view_file_mode = REMMINA_VIEW_FILE_LIST;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "resolutions", NULL))
+ remmina_pref.resolutions = g_key_file_get_string(gkeyfile, "remmina_pref", "resolutions", NULL);
+ else
+ remmina_pref.resolutions = g_strdup(default_resolutions);
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "keystrokes", NULL))
+ remmina_pref.keystrokes = g_key_file_get_string(gkeyfile, "remmina_pref", "keystrokes", NULL);
+ else
+ remmina_pref.keystrokes = g_strdup(default_keystrokes);
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "main_width", NULL))
+ remmina_pref.main_width = MAX(600, g_key_file_get_integer(gkeyfile, "remmina_pref", "main_width", NULL));
+ else
+ remmina_pref.main_width = 600;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "main_height", NULL))
+ remmina_pref.main_height = MAX(400, g_key_file_get_integer(gkeyfile, "remmina_pref", "main_height", NULL));
+ else
+ remmina_pref.main_height = 400;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "main_maximize", NULL))
+ remmina_pref.main_maximize = g_key_file_get_boolean(gkeyfile, "remmina_pref", "main_maximize", NULL);
+ else
+ remmina_pref.main_maximize = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "main_sort_column_id", NULL))
+ remmina_pref.main_sort_column_id = g_key_file_get_integer(gkeyfile, "remmina_pref", "main_sort_column_id",
+ NULL);
+ else
+ remmina_pref.main_sort_column_id = 1;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "main_sort_order", NULL))
+ remmina_pref.main_sort_order = g_key_file_get_integer(gkeyfile, "remmina_pref", "main_sort_order", NULL);
+ else
+ remmina_pref.main_sort_order = 0;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "expanded_group", NULL))
+ remmina_pref.expanded_group = g_key_file_get_string(gkeyfile, "remmina_pref", "expanded_group", NULL);
+ else
+ remmina_pref.expanded_group = g_strdup("");
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "toolbar_pin_down", NULL))
+ remmina_pref.toolbar_pin_down = g_key_file_get_boolean(gkeyfile, "remmina_pref", "toolbar_pin_down", NULL);
+ else
+ remmina_pref.toolbar_pin_down = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "ssh_loglevel", NULL))
+ remmina_pref.ssh_loglevel = g_key_file_get_integer(gkeyfile, "remmina_pref", "ssh_loglevel", NULL);
+ else
+ remmina_pref.ssh_loglevel = DEFAULT_SSH_LOGLEVEL;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "screenshot_path", NULL)) {
+ remmina_pref.screenshot_path = g_key_file_get_string(gkeyfile, "remmina_pref", "screenshot_path", NULL);
+ }else{
+ remmina_pref.screenshot_path = g_get_user_special_dir(G_USER_DIRECTORY_PICTURES);
+ if (remmina_pref.screenshot_path == NULL)
+ remmina_pref.screenshot_path = g_get_home_dir();
+ }
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "ssh_parseconfig", NULL))
+ remmina_pref.ssh_parseconfig = g_key_file_get_boolean(gkeyfile, "remmina_pref", "ssh_parseconfig", NULL);
+ else
+ remmina_pref.ssh_parseconfig = DEFAULT_SSH_PARSECONFIG;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "sshtunnel_port", NULL))
+ remmina_pref.sshtunnel_port = g_key_file_get_integer(gkeyfile, "remmina_pref", "sshtunnel_port", NULL);
+ else
+ remmina_pref.sshtunnel_port = DEFAULT_SSHTUNNEL_PORT;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "ssh_tcp_keepidle", NULL))
+ remmina_pref.ssh_tcp_keepidle = g_key_file_get_integer(gkeyfile, "remmina_pref", "ssh_tcp_keepidle", NULL);
+ else
+ remmina_pref.ssh_tcp_keepidle = SSH_SOCKET_TCP_KEEPIDLE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "ssh_tcp_keepintvl", NULL))
+ remmina_pref.ssh_tcp_keepintvl = g_key_file_get_integer(gkeyfile, "remmina_pref", "ssh_tcp_keepintvl", NULL);
+ else
+ remmina_pref.ssh_tcp_keepintvl = SSH_SOCKET_TCP_KEEPINTVL;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "ssh_tcp_keepcnt", NULL))
+ remmina_pref.ssh_tcp_keepcnt = g_key_file_get_integer(gkeyfile, "remmina_pref", "ssh_tcp_keepcnt", NULL);
+ else
+ remmina_pref.ssh_tcp_keepcnt = SSH_SOCKET_TCP_KEEPCNT;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "ssh_tcp_usrtimeout", NULL))
+ remmina_pref.ssh_tcp_usrtimeout = g_key_file_get_integer(gkeyfile, "remmina_pref", "ssh_tcp_usrtimeout", NULL);
+ else
+ remmina_pref.ssh_tcp_usrtimeout = SSH_SOCKET_TCP_USER_TIMEOUT;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "applet_new_ontop", NULL))
+ remmina_pref.applet_new_ontop = g_key_file_get_boolean(gkeyfile, "remmina_pref", "applet_new_ontop", NULL);
+ else
+ remmina_pref.applet_new_ontop = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "applet_hide_count", NULL))
+ remmina_pref.applet_hide_count = g_key_file_get_boolean(gkeyfile, "remmina_pref", "applet_hide_count", NULL);
+ else
+ remmina_pref.applet_hide_count = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "applet_enable_avahi", NULL))
+ remmina_pref.applet_enable_avahi = g_key_file_get_boolean(gkeyfile, "remmina_pref", "applet_enable_avahi",
+ NULL);
+ else
+ remmina_pref.applet_enable_avahi = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "disable_tray_icon", NULL))
+ remmina_pref.disable_tray_icon = g_key_file_get_boolean(gkeyfile, "remmina_pref", "disable_tray_icon", NULL);
+ else
+ remmina_pref.disable_tray_icon = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "dark_tray_icon", NULL))
+ remmina_pref.dark_tray_icon = g_key_file_get_boolean(gkeyfile, "remmina_pref", "dark_tray_icon", NULL);
+ else
+ remmina_pref.dark_tray_icon = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "recent_maximum", NULL))
+ remmina_pref.recent_maximum = g_key_file_get_integer(gkeyfile, "remmina_pref", "recent_maximum", NULL);
+ else
+ remmina_pref.recent_maximum = 10;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "default_mode", NULL))
+ remmina_pref.default_mode = g_key_file_get_integer(gkeyfile, "remmina_pref", "default_mode", NULL);
+ else
+ remmina_pref.default_mode = 0;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "tab_mode", NULL))
+ remmina_pref.tab_mode = g_key_file_get_integer(gkeyfile, "remmina_pref", "tab_mode", NULL);
+ else
+ remmina_pref.tab_mode = 0;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "fullscreen_toolbar_visibility", NULL))
+ remmina_pref.fullscreen_toolbar_visibility = g_key_file_get_integer(gkeyfile, "remmina_pref", "fullscreen_toolbar_visibility", NULL);
+ else
+ remmina_pref.fullscreen_toolbar_visibility = FLOATING_TOOLBAR_VISIBILITY_PEEKING;
+ /* Show buttons icons */
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "show_buttons_icons", NULL)) {
+ remmina_pref.show_buttons_icons = g_key_file_get_integer(gkeyfile, "remmina_pref", "show_buttons_icons", NULL);
+ if (remmina_pref.show_buttons_icons) {
+ g_object_set(gtk_settings_get_default(), "gtk-button-images", remmina_pref.show_buttons_icons == 1, NULL);
+ }
+ }else
+ remmina_pref.show_buttons_icons = 0;
+ /* Show menu icons */
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "show_menu_icons", NULL)) {
+ remmina_pref.show_menu_icons = g_key_file_get_integer(gkeyfile, "remmina_pref", "show_menu_icons", NULL);
+ if (remmina_pref.show_menu_icons) {
+ g_object_set(gtk_settings_get_default(), "gtk-menu-images", remmina_pref.show_menu_icons == 1, NULL);
+ }
+ }else
+ remmina_pref.show_menu_icons = 0;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "auto_scroll_step", NULL))
+ remmina_pref.auto_scroll_step = g_key_file_get_integer(gkeyfile, "remmina_pref", "auto_scroll_step", NULL);
+ else
+ remmina_pref.auto_scroll_step = 10;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "hostkey", NULL))
+ remmina_pref.hostkey = g_key_file_get_integer(gkeyfile, "remmina_pref", "hostkey", NULL);
+ else
+ remmina_pref.hostkey = GDK_KEY_Control_R;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_fullscreen", NULL))
+ remmina_pref.shortcutkey_fullscreen = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_fullscreen",
+ NULL);
+ else
+ remmina_pref.shortcutkey_fullscreen = GDK_KEY_f;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_autofit", NULL))
+ remmina_pref.shortcutkey_autofit = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_autofit",
+ NULL);
+ else
+ remmina_pref.shortcutkey_autofit = GDK_KEY_1;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_nexttab", NULL))
+ remmina_pref.shortcutkey_nexttab = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_nexttab",
+ NULL);
+ else
+ remmina_pref.shortcutkey_nexttab = GDK_KEY_Right;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_prevtab", NULL))
+ remmina_pref.shortcutkey_prevtab = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_prevtab",
+ NULL);
+ else
+ remmina_pref.shortcutkey_prevtab = GDK_KEY_Left;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_scale", NULL))
+ remmina_pref.shortcutkey_scale = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_scale", NULL);
+ else
+ remmina_pref.shortcutkey_scale = GDK_KEY_s;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_viewonly", NULL))
+ remmina_pref.shortcutkey_viewonly = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_viewonly", NULL);
+ else
+ remmina_pref.shortcutkey_viewonly = GDK_KEY_m;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_grab", NULL))
+ remmina_pref.shortcutkey_grab = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_grab", NULL);
+ else
+ remmina_pref.shortcutkey_grab = GDK_KEY_Control_R;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_minimize", NULL))
+ remmina_pref.shortcutkey_minimize = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_minimize", NULL);
+ else
+ remmina_pref.shortcutkey_minimize = GDK_KEY_F9;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_screenshot", NULL))
+ remmina_pref.shortcutkey_screenshot = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_screenshot", NULL);
+ else
+ remmina_pref.shortcutkey_screenshot = GDK_KEY_F12;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_disconnect", NULL))
+ remmina_pref.shortcutkey_disconnect = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_disconnect",
+ NULL);
+ else
+ remmina_pref.shortcutkey_disconnect = GDK_KEY_F4;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_toolbar", NULL))
+ remmina_pref.shortcutkey_toolbar = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_toolbar",
+ NULL);
+ else
+ remmina_pref.shortcutkey_toolbar = GDK_KEY_t;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "secret", NULL))
+ remmina_pref.secret = g_key_file_get_string(gkeyfile, "remmina_pref", "secret", NULL);
+ else
+ remmina_pref.secret = NULL;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "uid", NULL))
+ remmina_pref.uid = g_key_file_get_string(gkeyfile, "remmina_pref", "uid", NULL);
+ else
+ remmina_pref.uid = NULL;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_font", NULL))
+ remmina_pref.vte_font = g_key_file_get_string(gkeyfile, "remmina_pref", "vte_font", NULL);
+ else
+ remmina_pref.vte_font = 0;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_allow_bold_text", NULL))
+ remmina_pref.vte_allow_bold_text = g_key_file_get_boolean(gkeyfile, "remmina_pref", "vte_allow_bold_text",
+ NULL);
+ else
+ remmina_pref.vte_allow_bold_text = TRUE;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_lines", NULL))
+ remmina_pref.vte_lines = g_key_file_get_integer(gkeyfile, "remmina_pref", "vte_lines", NULL);
+ else
+ remmina_pref.vte_lines = 512;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_shortcutkey_copy", NULL))
+ remmina_pref.vte_shortcutkey_copy = g_key_file_get_integer(gkeyfile, "remmina_pref", "vte_shortcutkey_copy",
+ NULL);
+ else
+ remmina_pref.vte_shortcutkey_copy = GDK_KEY_c;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_shortcutkey_paste", NULL))
+ remmina_pref.vte_shortcutkey_paste = g_key_file_get_integer(gkeyfile, "remmina_pref", "vte_shortcutkey_paste",
+ NULL);
+ else
+ remmina_pref.vte_shortcutkey_paste = GDK_KEY_v;
+
+ if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_shortcutkey_select_all", NULL))
+ remmina_pref.vte_shortcutkey_select_all = g_key_file_get_integer(gkeyfile, "remmina_pref", "vte_shortcutkey_select_all",
+ NULL);
+ else
+ remmina_pref.vte_shortcutkey_select_all = GDK_KEY_a;
+
+ /* If we have a color scheme file, we switch to it, GIO will merge it in the
+ * remmina.pref file */
+ if (g_file_test(remmina_colors_file, G_FILE_TEST_IS_REGULAR)) {
+ gkeyfile = g_key_file_new();
+ g_key_file_load_from_file(gkeyfile, remmina_colors_file, G_KEY_FILE_NONE, NULL);
+ g_remove(remmina_colors_file);
+ }
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "background", NULL))
+ remmina_pref.background = g_key_file_get_string(gkeyfile, "ssh_colors", "background",
+ NULL);
+ else
+ remmina_pref.background = "#d5ccba";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "cursor", NULL))
+ remmina_pref.cursor = g_key_file_get_string(gkeyfile, "ssh_colors", "cursor",
+ NULL);
+ else
+ remmina_pref.cursor = "#45373c";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "foreground", NULL))
+ remmina_pref.foreground = g_key_file_get_string(gkeyfile, "ssh_colors", "foreground",
+ NULL);
+ else
+ remmina_pref.foreground = "#45373c";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color0", NULL))
+ remmina_pref.color0 = g_key_file_get_string(gkeyfile, "ssh_colors", "color0",
+ NULL);
+ else
+ remmina_pref.color0 = "#20111b";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color1", NULL))
+ remmina_pref.color1 = g_key_file_get_string(gkeyfile, "ssh_colors", "color1",
+ NULL);
+ else
+ remmina_pref.color1 = "#be100e";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color2", NULL))
+ remmina_pref.color2 = g_key_file_get_string(gkeyfile, "ssh_colors", "color2",
+ NULL);
+ else
+ remmina_pref.color2 = "#858162";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color3", NULL))
+ remmina_pref.color3 = g_key_file_get_string(gkeyfile, "ssh_colors", "color3",
+ NULL);
+ else
+ remmina_pref.color3 = "#eaa549";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color4", NULL))
+ remmina_pref.color4 = g_key_file_get_string(gkeyfile, "ssh_colors", "color4",
+ NULL);
+ else
+ remmina_pref.color4 = "#426a79";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color5", NULL))
+ remmina_pref.color5 = g_key_file_get_string(gkeyfile, "ssh_colors", "color5",
+ NULL);
+ else
+ remmina_pref.color5 = "#97522c";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color6", NULL))
+ remmina_pref.color6 = g_key_file_get_string(gkeyfile, "ssh_colors", "color6",
+ NULL);
+ else
+ remmina_pref.color6 = "#989a9c";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color7", NULL))
+ remmina_pref.color7 = g_key_file_get_string(gkeyfile, "ssh_colors", "color7",
+ NULL);
+ else
+ remmina_pref.color7 = "#968c83";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color8", NULL))
+ remmina_pref.color8 = g_key_file_get_string(gkeyfile, "ssh_colors", "color8",
+ NULL);
+ else
+ remmina_pref.color8 = "#5e5252";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color9", NULL))
+ remmina_pref.color9 = g_key_file_get_string(gkeyfile, "ssh_colors", "color9",
+ NULL);
+ else
+ remmina_pref.color9 = "#be100e";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color10", NULL))
+ remmina_pref.color10 = g_key_file_get_string(gkeyfile, "ssh_colors", "color10",
+ NULL);
+ else
+ remmina_pref.color10 = "#858162";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color11", NULL))
+ remmina_pref.color11 = g_key_file_get_string(gkeyfile, "ssh_colors", "color11",
+ NULL);
+ else
+ remmina_pref.color11 = "#eaa549";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color12", NULL))
+ remmina_pref.color12 = g_key_file_get_string(gkeyfile, "ssh_colors", "color12",
+ NULL);
+ else
+ remmina_pref.color12 = "#426a79";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color13", NULL))
+ remmina_pref.color13 = g_key_file_get_string(gkeyfile, "ssh_colors", "color13",
+ NULL);
+ else
+ remmina_pref.color13 = "#97522c";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color14", NULL))
+ remmina_pref.color14 = g_key_file_get_string(gkeyfile, "ssh_colors", "color14",
+ NULL);
+ else
+ remmina_pref.color14 = "#989a9c";
+
+ if (g_key_file_has_key(gkeyfile, "ssh_colors", "color15", NULL))
+ remmina_pref.color15 = g_key_file_get_string(gkeyfile, "ssh_colors", "color15",
+ NULL);
+ else
+ remmina_pref.color15 = "#d5ccba";
+
+ if (g_key_file_has_key(gkeyfile, "usage_stats", "periodic_usage_stats_permission_asked", NULL))
+ remmina_pref.periodic_usage_stats_permission_asked = g_key_file_get_boolean(gkeyfile, "usage_stats", "periodic_usage_stats_permission_asked", NULL);
+ else
+ remmina_pref.periodic_usage_stats_permission_asked = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "usage_stats", "periodic_usage_stats_permitted", NULL))
+ remmina_pref.periodic_usage_stats_permitted = g_key_file_get_boolean(gkeyfile, "usage_stats", "periodic_usage_stats_permitted", NULL);
+ else
+ remmina_pref.periodic_usage_stats_permitted = FALSE;
+
+ if (g_key_file_has_key(gkeyfile, "usage_stats", "periodic_usage_stats_last_sent", NULL))
+ remmina_pref.periodic_usage_stats_last_sent = g_key_file_get_int64(gkeyfile, "usage_stats", "periodic_usage_stats_last_sent", NULL);
+ else
+ remmina_pref.periodic_usage_stats_last_sent = 0;
+
+ if (g_key_file_has_key(gkeyfile, "usage_stats", "periodic_usage_stats_uuid_prefix", NULL))
+ remmina_pref.periodic_usage_stats_uuid_prefix = g_key_file_get_string(gkeyfile, "usage_stats", "periodic_usage_stats_uuid_prefix", NULL);
+ else
+ remmina_pref.periodic_usage_stats_uuid_prefix = NULL;
+
+
+ g_key_file_free(gkeyfile);
+
+ if (remmina_pref.secret == NULL)
+ remmina_pref_gen_secret();
+
+ remmina_pref_init_keymap();
+}
+
+void remmina_pref_save(void)
+{
+ TRACE_CALL(__func__);
+ GKeyFile *gkeyfile;
+ gchar *content;
+ gsize length;
+
+ gkeyfile = g_key_file_new();
+
+ g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL);
+
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "save_view_mode", remmina_pref.save_view_mode);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "floating_toolbar_placement", remmina_pref.floating_toolbar_placement);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "toolbar_placement", remmina_pref.toolbar_placement);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "prevent_snap_welcome_message", remmina_pref.prevent_snap_welcome_message);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "fullscreen_on_auto", remmina_pref.fullscreen_on_auto);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "always_show_tab", remmina_pref.always_show_tab);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "hide_connection_toolbar", remmina_pref.hide_connection_toolbar);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "default_action", remmina_pref.default_action);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "scale_quality", remmina_pref.scale_quality);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "ssh_loglevel", remmina_pref.ssh_loglevel);
+ g_key_file_set_string(gkeyfile, "remmina_pref", "screenshot_path", remmina_pref.screenshot_path);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "ssh_parseconfig", remmina_pref.ssh_parseconfig);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "hide_toolbar", remmina_pref.hide_toolbar);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "hide_statusbar", remmina_pref.hide_statusbar);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "small_toolbutton", remmina_pref.small_toolbutton);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "view_file_mode", remmina_pref.view_file_mode);
+ g_key_file_set_string(gkeyfile, "remmina_pref", "resolutions", remmina_pref.resolutions);
+ g_key_file_set_string(gkeyfile, "remmina_pref", "keystrokes", remmina_pref.keystrokes);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "main_width", remmina_pref.main_width);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "main_height", remmina_pref.main_height);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "main_maximize", remmina_pref.main_maximize);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "main_sort_column_id", remmina_pref.main_sort_column_id);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "main_sort_order", remmina_pref.main_sort_order);
+ g_key_file_set_string(gkeyfile, "remmina_pref", "expanded_group", remmina_pref.expanded_group);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "toolbar_pin_down", remmina_pref.toolbar_pin_down);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "sshtunnel_port", remmina_pref.sshtunnel_port);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "ssh_tcp_keepidle", remmina_pref.ssh_tcp_keepidle);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "ssh_tcp_keepintvl", remmina_pref.ssh_tcp_keepintvl);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "ssh_tcp_keepcnt", remmina_pref.ssh_tcp_keepcnt);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "ssh_tcp_usrtimeout", remmina_pref.ssh_tcp_usrtimeout);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "applet_new_ontop", remmina_pref.applet_new_ontop);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "applet_hide_count", remmina_pref.applet_hide_count);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "applet_enable_avahi", remmina_pref.applet_enable_avahi);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "disable_tray_icon", remmina_pref.disable_tray_icon);
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "dark_tray_icon", remmina_pref.dark_tray_icon);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "recent_maximum", remmina_pref.recent_maximum);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "default_mode", remmina_pref.default_mode);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "tab_mode", remmina_pref.tab_mode);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "fullscreen_toolbar_visibility", remmina_pref.fullscreen_toolbar_visibility);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "show_buttons_icons", remmina_pref.show_buttons_icons);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "show_menu_icons", remmina_pref.show_menu_icons);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "auto_scroll_step", remmina_pref.auto_scroll_step);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "hostkey", remmina_pref.hostkey);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_fullscreen", remmina_pref.shortcutkey_fullscreen);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_autofit", remmina_pref.shortcutkey_autofit);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_nexttab", remmina_pref.shortcutkey_nexttab);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_prevtab", remmina_pref.shortcutkey_prevtab);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_scale", remmina_pref.shortcutkey_scale);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_grab", remmina_pref.shortcutkey_grab);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_viewonly", remmina_pref.shortcutkey_viewonly);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_screenshot", remmina_pref.shortcutkey_screenshot);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_minimize", remmina_pref.shortcutkey_minimize);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_disconnect", remmina_pref.shortcutkey_disconnect);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_toolbar", remmina_pref.shortcutkey_toolbar);
+ g_key_file_set_string(gkeyfile, "remmina_pref", "vte_font", remmina_pref.vte_font ? remmina_pref.vte_font : "");
+ g_key_file_set_boolean(gkeyfile, "remmina_pref", "vte_allow_bold_text", remmina_pref.vte_allow_bold_text);
+ g_key_file_set_integer(gkeyfile, "remmina_pref", "vte_lines", remmina_pref.vte_lines);
+ g_key_file_set_string(gkeyfile, "ssh_colors", "background", remmina_pref.background ? remmina_pref.background : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "cursor", remmina_pref.cursor ? remmina_pref.cursor : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "foreground", remmina_pref.foreground ? remmina_pref.foreground : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color0", remmina_pref.color0 ? remmina_pref.color0 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color1", remmina_pref.color1 ? remmina_pref.color1 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color2", remmina_pref.color2 ? remmina_pref.color2 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color3", remmina_pref.color3 ? remmina_pref.color3 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color4", remmina_pref.color4 ? remmina_pref.color4 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color5", remmina_pref.color5 ? remmina_pref.color5 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color6", remmina_pref.color6 ? remmina_pref.color6 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color7", remmina_pref.color7 ? remmina_pref.color7 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color8", remmina_pref.color8 ? remmina_pref.color8 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color9", remmina_pref.color9 ? remmina_pref.color9 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color10", remmina_pref.color10 ? remmina_pref.color10 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color11", remmina_pref.color11 ? remmina_pref.color11 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color12", remmina_pref.color12 ? remmina_pref.color12 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color13", remmina_pref.color13 ? remmina_pref.color13 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color14", remmina_pref.color14 ? remmina_pref.color14 : "");
+ g_key_file_set_string(gkeyfile, "ssh_colors", "color15", remmina_pref.color15 ? remmina_pref.color15 : "");
+
+ g_key_file_set_boolean(gkeyfile, "usage_stats", "periodic_usage_stats_permission_asked", remmina_pref.periodic_usage_stats_permission_asked);
+ g_key_file_set_boolean(gkeyfile, "usage_stats", "periodic_usage_stats_permitted", remmina_pref.periodic_usage_stats_permitted);
+ g_key_file_set_int64(gkeyfile, "usage_stats", "periodic_usage_stats_last_sent", remmina_pref.periodic_usage_stats_last_sent);
+ g_key_file_set_string(gkeyfile, "usage_stats", "periodic_usage_stats_uuid_prefix",
+ remmina_pref.periodic_usage_stats_uuid_prefix ? remmina_pref.periodic_usage_stats_uuid_prefix : "");
+
+ content = g_key_file_to_data(gkeyfile, &length, NULL);
+ g_file_set_contents(remmina_pref_file, content, length, NULL);
+
+ g_key_file_free(gkeyfile);
+ g_free(content);
+}
+
+void remmina_pref_add_recent(const gchar *protocol, const gchar *server)
+{
+ TRACE_CALL(__func__);
+ RemminaStringArray *array;
+ GKeyFile *gkeyfile;
+ gchar key[20];
+ gchar *val;
+ gchar *content;
+ gsize length;
+
+ if (remmina_pref.recent_maximum <= 0 || server == NULL || server[0] == 0)
+ return;
+
+ /* Load original value into memory */
+ gkeyfile = g_key_file_new();
+
+ g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL);
+
+ g_snprintf(key, sizeof(key), "recent_%s", protocol);
+ array = remmina_string_array_new_from_allocated_string(g_key_file_get_string(gkeyfile, "remmina_pref", key, NULL));
+
+ /* Add the new value */
+ remmina_string_array_remove(array, server);
+ while (array->len >= remmina_pref.recent_maximum) {
+ remmina_string_array_remove_index(array, 0);
+ }
+ remmina_string_array_add(array, server);
+
+ /* Save */
+ val = remmina_string_array_to_string(array);
+ g_key_file_set_string(gkeyfile, "remmina_pref", key, val);
+ g_free(val);
+
+ content = g_key_file_to_data(gkeyfile, &length, NULL);
+ g_file_set_contents(remmina_pref_file, content, length, NULL);
+
+ g_key_file_free(gkeyfile);
+ g_free(content);
+}
+
+gchar*
+remmina_pref_get_recent(const gchar *protocol)
+{
+ TRACE_CALL(__func__);
+ GKeyFile *gkeyfile;
+ gchar key[20];
+ gchar *val;
+
+ gkeyfile = g_key_file_new();
+
+ g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL);
+
+ g_snprintf(key, sizeof(key), "recent_%s", protocol);
+ val = g_key_file_get_string(gkeyfile, "remmina_pref", key, NULL);
+
+ g_key_file_free(gkeyfile);
+
+ return val;
+}
+
+void remmina_pref_clear_recent(void)
+{
+ TRACE_CALL(__func__);
+ GKeyFile *gkeyfile;
+ gchar **keys;
+ gint i;
+ gchar *content;
+ gsize length;
+
+ gkeyfile = g_key_file_new();
+
+ g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL);
+ keys = g_key_file_get_keys(gkeyfile, "remmina_pref", NULL, NULL);
+ if (keys) {
+ for (i = 0; keys[i]; i++) {
+ if (strncmp(keys[i], "recent_", 7) == 0) {
+ g_key_file_set_string(gkeyfile, "remmina_pref", keys[i], "");
+ }
+ }
+ g_strfreev(keys);
+ }
+
+ content = g_key_file_to_data(gkeyfile, &length, NULL);
+ g_file_set_contents(remmina_pref_file, content, length, NULL);
+
+ g_key_file_free(gkeyfile);
+ g_free(content);
+}
+
+guint remmina_pref_keymap_get_keyval(const gchar *keymap, guint keyval)
+{
+ TRACE_CALL(__func__);
+ guint *table;
+ gint i;
+
+ if (!keymap || keymap[0] == '\0')
+ return keyval;
+
+ table = (guint*)g_hash_table_lookup(remmina_keymap_table, keymap);
+ if (!table)
+ return keyval;
+ for (i = 0; table[i] > 0; i += 2) {
+ if (table[i] == keyval)
+ return table[i + 1];
+ }
+ return keyval;
+}
+
+gchar**
+remmina_pref_keymap_groups(void)
+{
+ TRACE_CALL(__func__);
+ GList *list;
+ guint len;
+ gchar **keys;
+ guint i;
+
+ list = g_hash_table_get_keys(remmina_keymap_table);
+ len = g_list_length(list);
+
+ keys = g_new0(gchar*, (len + 1) * 2 + 1);
+ keys[0] = g_strdup("");
+ keys[1] = g_strdup("");
+ for (i = 0; i < len; i++) {
+ keys[(i + 1) * 2] = g_strdup((gchar*)g_list_nth_data(list, i));
+ keys[(i + 1) * 2 + 1] = g_strdup((gchar*)g_list_nth_data(list, i));
+ }
+ g_list_free(list);
+
+ return keys;
+}
+
+gint remmina_pref_get_scale_quality(void)
+{
+ TRACE_CALL(__func__);
+ /* Paranoid programming */
+ if (remmina_pref.scale_quality < 0) {
+ remmina_pref.scale_quality = 0;
+ }
+ return remmina_pref.scale_quality;
+}
+
+gint remmina_pref_get_ssh_loglevel(void)
+{
+ TRACE_CALL(__func__);
+ return remmina_pref.ssh_loglevel;
+}
+
+gboolean remmina_pref_get_ssh_parseconfig(void)
+{
+ TRACE_CALL(__func__);
+ return remmina_pref.ssh_parseconfig;
+}
+
+gint remmina_pref_get_sshtunnel_port(void)
+{
+ TRACE_CALL(__func__);
+ return remmina_pref.sshtunnel_port;
+}
+
+gint remmina_pref_get_ssh_tcp_keepidle(void)
+{
+ TRACE_CALL(__func__);
+ return remmina_pref.ssh_tcp_keepidle;
+}
+
+gint remmina_pref_get_ssh_tcp_keepintvl(void)
+{
+ TRACE_CALL(__func__);
+ return remmina_pref.ssh_tcp_keepintvl;
+}
+
+gint remmina_pref_get_ssh_tcp_keepcnt(void)
+{
+ TRACE_CALL(__func__);
+ return remmina_pref.ssh_tcp_keepcnt;
+}
+
+gint remmina_pref_get_ssh_tcp_usrtimeout(void)
+{
+ TRACE_CALL(__func__);
+ return remmina_pref.ssh_tcp_usrtimeout;
+}
+
+void remmina_pref_set_value(const gchar *key, const gchar *value)
+{
+ TRACE_CALL(__func__);
+ GKeyFile *gkeyfile;
+ gchar *content;
+ gsize length;
+
+ gkeyfile = g_key_file_new();
+ g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL);
+ g_key_file_set_string(gkeyfile, "remmina_pref", key, value);
+ content = g_key_file_to_data(gkeyfile, &length, NULL);
+ g_file_set_contents(remmina_pref_file, content, length, NULL);
+
+ g_key_file_free(gkeyfile);
+ g_free(content);
+}
+
+gchar*
+remmina_pref_get_value(const gchar *key)
+{
+ TRACE_CALL(__func__);
+ GKeyFile *gkeyfile;
+ gchar *value;
+
+ gkeyfile = g_key_file_new();
+ g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL);
+ value = g_key_file_get_string(gkeyfile, "remmina_pref", key, NULL);
+ g_key_file_free(gkeyfile);
+
+ return value;
+}