43 #include <sys/utsname.h> 45 #include <glib/gstdio.h> 46 #include <gdk/gdkkeysyms.h> 63 static const gchar *
default_keymap_data =
"# Please check gdk/gdkkeysyms.h for a full list of all key names or hex key values\n" 81 g_get_current_time(>ime);
84 for (i = 0; i < 32; i++) {
85 s[i] = (guchar)(rand() % 256);
89 gkeyfile = g_key_file_new();
92 content = g_key_file_to_data(gkeyfile, &length, NULL);
95 g_key_file_free(gkeyfile);
101 TRACE_CALL(__func__);
107 k = gdk_keyval_from_name(str);
109 if (sscanf(str,
"%x", &k) < 1)
117 TRACE_CALL(__func__);
133 gkeyfile = g_key_file_new();
137 g_print(
"Failed to initialize keymap table\n");
138 g_key_file_free(gkeyfile);
143 groups = g_key_file_get_groups(gkeyfile, NULL);
146 keys = g_key_file_get_keys(gkeyfile, *gptr, &nkeys, NULL);
147 table = g_new0(guint, nkeys * 2 + 1);
155 value = g_key_file_get_string(gkeyfile, *gptr, *kptr, NULL);
167 g_key_file_free(gkeyfile);
173 GFile *src = g_file_new_for_path(src_path), *dst = g_file_new_for_path(dst_path);
175 const gboolean ok = g_file_copy(src, dst, G_FILE_COPY_NONE, NULL, NULL, NULL, NULL);
190 {
"background", &color_pref->
background,
"#d5ccba" },
191 {
"cursor", &color_pref->
cursor,
"#45373c" },
192 {
"foreground", &color_pref->
foreground,
"#45373c" },
193 {
"color0", &color_pref->
color0,
"#20111b" },
194 {
"color1", &color_pref->
color1,
"#be100e" },
195 {
"color2", &color_pref->
color2,
"#858162" },
196 {
"color3", &color_pref->
color3,
"#eaa549" },
197 {
"color4", &color_pref->
color4,
"#426a79" },
198 {
"color5", &color_pref->
color5,
"#97522c" },
199 {
"color6", &color_pref->
color6,
"#989a9c" },
200 {
"color7", &color_pref->
color7,
"#968c83" },
201 {
"color8", &color_pref->
color8,
"#5e5252" },
202 {
"color9", &color_pref->
color9,
"#be100e" },
203 {
"color10", &color_pref->
color10,
"#858162" },
204 {
"color11", &color_pref->
color11,
"#eaa549" },
205 {
"color12", &color_pref->
color12,
"#426a79" },
206 {
"color13", &color_pref->
color13,
"#97522c" },
207 {
"color14", &color_pref->
color14,
"#989a9c" },
208 {
"color15", &color_pref->
color15,
"#d5ccba" },
212 for (i = 0; i < (
sizeof(colors) /
sizeof(colors[0])); i++) {
213 if (g_key_file_has_key(gkeyfile,
"ssh_colors", colors[i].name, NULL))
214 *colors[i].setting = g_key_file_get_string(gkeyfile,
"ssh_colors", colors[i].name,
217 *colors[i].setting = colors[i].fallback;
223 TRACE_CALL(__func__);
226 const gchar *filename =
"remmina.pref";
227 const gchar *colors_filename =
"remmina.colors";
230 gchar *legacy =
".remmina";
233 remmina_dir = g_build_path(
"/", g_get_user_config_dir(),
"remmina", NULL);
235 g_mkdir_with_parents(remmina_dir, 0750);
237 g_free(remmina_dir), remmina_dir = NULL;
240 remmina_dir = g_build_path(
"/", g_get_home_dir(), legacy, NULL);
241 if (g_file_test(remmina_dir, G_FILE_TEST_IS_DIR)) {
242 dir = g_dir_open(remmina_dir, 0, NULL);
244 g_build_path(
"/", remmina_dir, filename, NULL),
245 g_build_path(
"/", g_get_user_config_dir(),
246 "remmina", filename, NULL));
250 const gchar *
const *dirs = g_get_system_config_dirs();
251 g_free(remmina_dir), remmina_dir = NULL;
252 for (i = 0; dirs[i] != NULL; ++i) {
253 remmina_dir = g_build_path(
"/", dirs[i],
"remmina", NULL);
254 if (g_file_test(remmina_dir, G_FILE_TEST_IS_DIR)) {
255 dir = g_dir_open(remmina_dir, 0, NULL);
256 while ((filename = g_dir_read_name(dir)) != NULL) {
258 g_build_path(
"/", remmina_dir, filename, NULL),
259 g_build_path(
"/", g_get_user_config_dir(),
260 "remmina", filename, NULL));
262 g_free(remmina_dir), remmina_dir = NULL;
267 if (remmina_dir != NULL)
268 g_free(remmina_dir), remmina_dir = NULL;
269 remmina_dir = g_build_path(
"/", g_get_user_config_dir(),
274 remmina_colors_file = g_strdup_printf(
"%s/%s", remmina_dir, colors_filename);
278 gkeyfile = g_key_file_new();
281 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"save_view_mode", NULL))
286 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"use_master_password", NULL))
291 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"unlock_timeout", NULL))
296 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"unlock_password", NULL))
302 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"fullscreen_on_auto", NULL))
307 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"floating_toolbar_placement", NULL))
312 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"prevent_snap_welcome_message", NULL))
317 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"last_quickconnect_protocol", NULL))
322 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"toolbar_placement", NULL))
327 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"always_show_tab", NULL))
332 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"hide_connection_toolbar", NULL))
334 "hide_connection_toolbar", NULL);
338 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"hide_searchbar", NULL))
340 "hide_searchbar", NULL);
344 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"default_action", NULL))
349 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"scale_quality", NULL))
354 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"hide_toolbar", NULL))
359 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"small_toolbutton", NULL))
364 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"view_file_mode", NULL))
369 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"resolutions", NULL))
374 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"keystrokes", NULL))
379 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"main_width", NULL))
384 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"main_height", NULL))
389 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"main_maximize", NULL))
394 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"main_sort_column_id", NULL))
400 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"main_sort_order", NULL))
405 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"expanded_group", NULL))
410 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"toolbar_pin_down", NULL))
415 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"ssh_loglevel", NULL))
420 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"deny_screenshot_clipboard", NULL))
425 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"datadir_path", NULL))
430 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"remmina_file_name", NULL)) {
436 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"screenshot_path", NULL)) {
444 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"screenshot_name", NULL)) {
450 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"ssh_parseconfig", NULL))
455 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"sshtunnel_port", NULL))
460 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"ssh_tcp_keepidle", NULL))
465 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"ssh_tcp_keepintvl", NULL))
470 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"ssh_tcp_keepcnt", NULL))
475 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"ssh_tcp_usrtimeout", NULL))
480 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"applet_new_ontop", NULL))
485 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"applet_hide_count", NULL))
490 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"applet_enable_avahi", NULL))
496 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"disable_tray_icon", NULL))
501 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"dark_tray_icon", NULL))
506 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"recent_maximum", NULL))
511 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"default_mode", NULL))
516 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"tab_mode", NULL))
521 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"fullscreen_toolbar_visibility", NULL))
526 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"auto_scroll_step", NULL))
531 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"hostkey", NULL))
536 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_fullscreen", NULL))
542 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_autofit", NULL))
548 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_nexttab", NULL))
554 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_prevtab", NULL))
560 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_scale", NULL))
565 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_viewonly", NULL))
570 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_grab", NULL))
575 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_minimize", NULL))
580 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_screenshot", NULL))
585 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_disconnect", NULL))
591 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"shortcutkey_toolbar", NULL))
597 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"secret", NULL))
598 remmina_pref.
secret = g_key_file_get_string(gkeyfile,
"remmina_pref",
"secret", NULL);
602 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"uid", NULL))
603 remmina_pref.
uid = g_key_file_get_string(gkeyfile,
"remmina_pref",
"uid", NULL);
607 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"vte_font", NULL))
612 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"vte_allow_bold_text", NULL))
618 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"vte_lines", NULL))
623 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"vte_shortcutkey_copy", NULL))
629 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"vte_shortcutkey_paste", NULL))
635 if (g_key_file_has_key(gkeyfile,
"remmina_pref",
"vte_shortcutkey_select_all", NULL))
643 if (g_file_test(remmina_colors_file, G_FILE_TEST_IS_REGULAR)) {
644 gkeyfile = g_key_file_new();
645 g_key_file_load_from_file(gkeyfile, remmina_colors_file, G_KEY_FILE_NONE, NULL);
646 g_remove(remmina_colors_file);
651 if (g_key_file_has_key(gkeyfile,
"usage_stats",
"periodic_usage_stats_permitted", NULL))
656 if (g_key_file_has_key(gkeyfile,
"usage_stats",
"periodic_usage_stats_last_sent", NULL))
661 if (g_key_file_has_key(gkeyfile,
"usage_stats",
"periodic_usage_stats_uuid_prefix", NULL))
666 if (g_key_file_has_key(gkeyfile,
"remmina_news",
"periodic_rmnews_last_get", NULL))
671 if (g_key_file_has_key(gkeyfile,
"remmina_news",
"periodic_rmnews_get_count", NULL))
676 if (g_key_file_has_key(gkeyfile,
"remmina_news",
"periodic_rmnews_uuid_prefix", NULL))
682 if (!g_key_file_has_key(gkeyfile,
"remmina",
"name", NULL)) {
683 g_key_file_set_string(gkeyfile,
"remmina",
"name",
"");
684 g_key_file_set_integer(gkeyfile,
"remmina",
"ignore-tls-errors", 1);
685 g_key_file_set_integer(gkeyfile,
"remmina",
"enable-plugins", 1);
689 g_key_file_free(gkeyfile);
699 TRACE_CALL(__func__);
709 TRACE_CALL(__func__);
712 g_debug (
"remmina.pref is not writable, returning");
716 GError *error = NULL;
720 gkeyfile = g_key_file_new();
730 #if SODIUM_VERSION_INT >= 90200 735 g_key_file_set_boolean(gkeyfile,
"remmina_pref",
"use_master_password", FALSE);
736 g_key_file_set_integer(gkeyfile,
"remmina_pref",
"unlock_timeout", 0);
737 g_key_file_set_string(gkeyfile,
"remmina_pref",
"unlock_password", g_strdup(
""));
815 g_key_file_set_string(gkeyfile,
"usage_stats",
"periodic_usage_stats_uuid_prefix",
819 g_key_file_set_string(gkeyfile,
"remmina_news",
"periodic_rmnews_uuid_prefix",
823 g_key_file_set_string(gkeyfile,
"remmina",
"name",
"");
824 g_key_file_set_integer(gkeyfile,
"remmina",
"ignore-tls-errors", 1);
826 content = g_key_file_to_data(gkeyfile, &length, NULL);
831 g_warning (
"remmina_pref_save error: %s", error->message);
832 g_clear_error (&error);
833 g_key_file_free(gkeyfile);
837 g_key_file_free(gkeyfile);
844 TRACE_CALL(__func__);
856 gkeyfile = g_key_file_new();
860 g_snprintf(key,
sizeof(key),
"recent_%s", protocol);
872 g_key_file_set_string(gkeyfile,
"remmina_pref", key, val);
875 content = g_key_file_to_data(gkeyfile, &length, NULL);
878 g_key_file_free(gkeyfile);
885 TRACE_CALL(__func__);
890 gkeyfile = g_key_file_new();
894 g_snprintf(key,
sizeof(key),
"recent_%s", protocol);
895 val = g_key_file_get_string(gkeyfile,
"remmina_pref", key, NULL);
897 g_key_file_free(gkeyfile);
904 TRACE_CALL(__func__);
911 gkeyfile = g_key_file_new();
914 keys = g_key_file_get_keys(gkeyfile,
"remmina_pref", NULL, NULL);
916 for (i = 0; keys[i]; i++) {
917 if (strncmp(keys[i],
"recent_", 7) == 0) {
918 g_key_file_set_string(gkeyfile,
"remmina_pref", keys[i],
"");
924 content = g_key_file_to_data(gkeyfile, &length, NULL);
927 g_key_file_free(gkeyfile);
933 TRACE_CALL(__func__);
937 if (!keymap || keymap[0] ==
'\0')
943 for (i = 0; table[i] > 0; i += 2) {
944 if (table[i] == keyval)
953 TRACE_CALL(__func__);
960 len = g_list_length(list);
962 keys = g_new0(gchar*, (len + 1) * 2 + 1);
963 keys[0] = g_strdup(
"");
964 keys[1] = g_strdup(
"");
965 for (i = 0; i < len; i++) {
966 keys[(i + 1) * 2] = g_strdup((gchar*)g_list_nth_data(list, i));
967 keys[(i + 1) * 2 + 1] = g_strdup((gchar*)g_list_nth_data(list, i));
976 TRACE_CALL(__func__);
986 TRACE_CALL(__func__);
992 TRACE_CALL(__func__);
998 TRACE_CALL(__func__);
1004 TRACE_CALL(__func__);
1010 TRACE_CALL(__func__);
1016 TRACE_CALL(__func__);
1022 TRACE_CALL(__func__);
1028 TRACE_CALL(__func__);
1033 gkeyfile = g_key_file_new();
1035 g_key_file_set_string(gkeyfile,
"remmina_pref", key, value);
1036 content = g_key_file_to_data(gkeyfile, &length, NULL);
1039 g_key_file_free(gkeyfile);
1045 TRACE_CALL(__func__);
1049 gkeyfile = g_key_file_new();
1051 value = g_key_file_get_string(gkeyfile,
"remmina_pref", key, NULL);
1052 g_key_file_free(gkeyfile);
1059 TRACE_CALL(__func__);
1063 gkeyfile = g_key_file_new();
1065 value = g_key_file_get_boolean(gkeyfile,
"remmina_pref", key, NULL);
1066 g_key_file_free(gkeyfile);
guint shortcutkey_fullscreen
gint floating_toolbar_placement
gint remmina_pref_get_scale_quality(void)
guint shortcutkey_minimize
static void remmina_pref_gen_secret(void)
gchar ** remmina_pref_keymap_groups(void)
const gchar * default_keystrokes
static const gchar * default_keymap_data
gchar * remmina_pref_file
G_BEGIN_DECLS typedef GPtrArray RemminaStringArray
gint remmina_pref_get_sshtunnel_port(void)
static gboolean remmina_pref_file_do_copy(const char *src_path, const char *dst_path)
guint shortcutkey_screenshot
guint shortcutkey_prevtab
gchar * last_quickconnect_protocol
gint remmina_pref_get_ssh_loglevel(void)
guint vte_shortcutkey_copy
static guint remmina_pref_get_keyval_from_str(const gchar *str)
gchar * remmina_pref_get_recent(const gchar *protocol)
guint shortcutkey_autofit
gboolean use_master_password
gchar * remmina_string_array_to_string(RemminaStringArray *array)
void remmina_pref_add_recent(const gchar *protocol, const gchar *server)
void remmina_pref_set_value(const gchar *key, const gchar *value)
gboolean deny_screenshot_clipboard
guint vte_shortcutkey_select_all
gboolean vte_allow_bold_text
gchar * remmina_pref_get_value(const gchar *key)
gboolean disable_tray_icon
gboolean remmina_pref_get_ssh_parseconfig(void)
static GHashTable * remmina_keymap_table
const gchar * screenshot_path
void remmina_string_array_remove_index(RemminaStringArray *array, gint i)
gchar * periodic_usage_stats_uuid_prefix
gboolean prevent_snap_welcome_message
gchar * periodic_rmnews_uuid_prefix
const gchar * unlock_password
guint vte_shortcutkey_paste
guint shortcutkey_disconnect
gboolean small_toolbutton
gboolean toolbar_pin_down
RemminaStringArray * remmina_string_array_new_from_allocated_string(gchar *strs)
glong periodic_rmnews_get_count
gboolean periodic_usage_stats_permitted
gboolean remmina_pref_get_boolean(const gchar *key)
gint remmina_pref_get_ssh_tcp_keepcnt(void)
void remmina_pref_clear_recent(void)
const gchar * default_resolutions
guint shortcutkey_nexttab
gboolean applet_hide_count
guint remmina_pref_keymap_get_keyval(const gchar *keymap, guint keyval)
void remmina_string_array_remove(RemminaStringArray *array, const gchar *str)
gboolean applet_enable_avahi
const gchar * remmina_file_name
void remmina_pref_init(void)
gchar * remmina_keymap_file
guint shortcutkey_toolbar
glong periodic_usage_stats_last_sent
gboolean remmina_pref_save(void)
gchar * remmina_colors_file
gboolean applet_new_ontop
const gchar * screenshot_name
gboolean hide_connection_toolbar
static void remmina_pref_init_keymap(void)
const gchar * datadir_path
gboolean remmina_pref_is_rw(void)
void remmina_string_array_add(RemminaStringArray *array, const gchar *str)
RemminaColorPref color_pref
glong periodic_rmnews_last_get
void remmina_pref_file_load_colors(GKeyFile *gkeyfile, RemminaColorPref *color_pref)
guint shortcutkey_viewonly
gboolean fullscreen_on_auto
gint fullscreen_toolbar_visibility
gint remmina_pref_get_ssh_tcp_usrtimeout(void)
gint remmina_pref_get_ssh_tcp_keepidle(void)
gint remmina_pref_get_ssh_tcp_keepintvl(void)