diff --git a/remmina/src/remmina_connection_window.c b/remmina/src/remmina_connection_window.c index d380b290ce..9dc8d65b15 100644 --- a/remmina/src/remmina_connection_window.c +++ b/remmina/src/remmina_connection_window.c @@ -2592,6 +2592,7 @@ static void remmina_connection_holder_create_scrolled(RemminaConnectionHolder* c GtkWidget* grid; GtkWidget* toolbar; GtkWidget* notebook; + GList *chain; gchar* tag; int newwin_width, newwin_height; @@ -2640,7 +2641,9 @@ static void remmina_connection_holder_create_scrolled(RemminaConnectionHolder* c gtk_container_add(GTK_CONTAINER(window), grid); - gtk_container_set_focus_chain(GTK_CONTAINER(grid), g_list_append(NULL, notebook)); + chain = g_list_append(NULL, notebook); + gtk_container_set_focus_chain(GTK_CONTAINER(grid), chain); + g_list_free(chain); /* Add drag capabilities to the toolbar */ gtk_drag_source_set(GTK_WIDGET(toolbar), GDK_BUTTON1_MASK, diff --git a/remmina/src/remmina_external_tools.c b/remmina/src/remmina_external_tools.c index acaf41b174..03e0a21bea 100644 --- a/remmina/src/remmina_external_tools.c +++ b/remmina/src/remmina_external_tools.c @@ -41,28 +41,22 @@ #include "remmina_external_tools.h" #include "remmina/remmina_trace_calls.h" -typedef struct _RemminaExternalTools -{ - gchar remminafilename[MAX_PATH_LEN]; - gchar scriptfilename[MAX_PATH_LEN]; - gchar scriptshortname[MAX_PATH_LEN]; -} RemminaExternalTools; - static gboolean remmina_external_tools_launcher(const gchar* filename, const gchar* scriptname, const gchar* shortname); -void view_popup_menu_onDoSomething (GtkWidget *menuitem, gpointer userdata) +static void view_popup_menu_onDoSomething (GtkWidget *menuitem, gpointer userdata) { TRACE_CALL("view_popup_menu_onDoSomething"); - /* we passed the view as userdata when we connected the signal */ - RemminaExternalTools *ret = (RemminaExternalTools *)userdata; - remmina_external_tools_launcher(ret->remminafilename, ret->scriptfilename, ret->scriptshortname); + gchar *remminafilename = g_object_get_data(G_OBJECT(menuitem), "remminafilename"); + gchar *scriptfilename = g_object_get_data(G_OBJECT(menuitem), "scriptfilename"); + gchar *scriptshortname = g_object_get_data(G_OBJECT(menuitem), "scriptshortname"); + + remmina_external_tools_launcher(remminafilename, scriptfilename, scriptshortname); } gboolean remmina_external_tools_from_filename(RemminaMain *remminamain, gchar* remminafilename) { TRACE_CALL("remmina_external_tools_from_filename"); GtkWidget *menu, *menuitem; - menu = gtk_menu_new(); gchar dirname[MAX_PATH_LEN]; gchar filename[MAX_PATH_LEN]; GDir* dir; @@ -74,19 +68,19 @@ gboolean remmina_external_tools_from_filename(RemminaMain *remminamain, gchar* r if (dir == NULL) return FALSE; + menu = gtk_menu_new(); + while ((name = g_dir_read_name(dir)) != NULL) { if (!g_str_has_prefix(name, "remmina_")) continue; g_snprintf(filename, MAX_PATH_LEN, "%s/%s", dirname, name); - RemminaExternalTools *ret; - ret = (RemminaExternalTools *)malloc(sizeof(RemminaExternalTools)); - strcpy(ret->remminafilename,remminafilename); - strcpy(ret->scriptfilename,filename); - strcpy(ret->scriptshortname,name); - menuitem = gtk_menu_item_new_with_label(strndup(name + 8, strlen(name) -8)); - g_signal_connect(menuitem, "activate", (GCallback) view_popup_menu_onDoSomething, ret); + menuitem = gtk_menu_item_new_with_label(name + 8); + g_object_set_data_full(G_OBJECT(menuitem), "remminafilename", g_strdup(remminafilename), g_free); + g_object_set_data_full(G_OBJECT(menuitem), "scriptfilename", g_strdup(filename), g_free); + g_object_set_data_full(G_OBJECT(menuitem), "scriptshortname", g_strdup(name), g_free); + g_signal_connect(menuitem, "activate", (GCallback) view_popup_menu_onDoSomething, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } g_dir_close(dir); diff --git a/remmina/src/remmina_file.c b/remmina/src/remmina_file.c index e9bd6b998f..5d960e3f27 100644 --- a/remmina/src/remmina_file.c +++ b/remmina/src/remmina_file.c @@ -148,11 +148,16 @@ void remmina_file_generate_filename(RemminaFile *remminafile) old = g_dir_open(dirname, 0, NULL); if (old == NULL) g_snprintf(dirname, sizeof(dirname), "%s/%s", g_get_user_data_dir(), remmina); + g_dir_close(old); + /* If the XDG directories exist, use them. */ dir = g_dir_open(dirname, 0, NULL); if (dir != NULL) remminafile->filename = g_strdup_printf("%s/%li%03li.remmina", dirname, gtime.tv_sec, gtime.tv_usec / 1000); + else + remminafile->filename = NULL; + g_dir_close(dir); } void remmina_file_set_filename(RemminaFile *remminafile, const gchar *filename) diff --git a/remmina/src/remmina_file_editor.c b/remmina/src/remmina_file_editor.c index e28a6f07cf..fde48c3b4a 100644 --- a/remmina/src/remmina_file_editor.c +++ b/remmina/src/remmina_file_editor.c @@ -968,7 +968,7 @@ static void remmina_file_editor_protocol_combo_on_changed(GtkComboBox* combo, Re if (priv->config_container) { - gtk_container_remove(GTK_CONTAINER(priv->config_box), priv->config_container); + gtk_widget_destroy(priv->config_container); priv->config_container = NULL; } diff --git a/remmina/src/remmina_file_manager.c b/remmina/src/remmina_file_manager.c index 7109489e00..35c849bc11 100644 --- a/remmina/src/remmina_file_manager.c +++ b/remmina/src/remmina_file_manager.c @@ -54,6 +54,9 @@ void remmina_file_manager_init(void) if (old == NULL) /* If the XDG directories exist, use them. */ g_snprintf(dirname, sizeof(dirname), "%s/%s", g_get_user_data_dir(), remmina); + else + g_dir_close(old); + g_mkdir_with_parents(dirname, 0700); } @@ -72,9 +75,12 @@ gint remmina_file_manager_iterate(GFunc func, gpointer user_data) g_snprintf(dirname, sizeof(dirname), "%s/.%s", g_get_home_dir(), remmina); old = g_dir_open(dirname, 0, NULL); if (old == NULL) + { /* If the XDG directories exist, use them. */ g_snprintf(dirname, sizeof(dirname), "%s/%s", g_get_user_data_dir(), remmina); - dir = g_dir_open(dirname, 0, NULL); + dir = g_dir_open(dirname, 0, NULL); + } else + dir = old; if (dir) { @@ -115,9 +121,12 @@ gchar* remmina_file_manager_get_groups(void) g_snprintf(dirname, sizeof(dirname), "%s/.%s", g_get_home_dir(), remmina); old = g_dir_open(dirname, 0, NULL); if (old == NULL) + { /* If the XDG directories exist, use them. */ g_snprintf(dirname, sizeof(dirname), "%s/%s", g_get_user_data_dir(), remmina); - dir = g_dir_open(dirname, 0, NULL); + dir = g_dir_open(dirname, 0, NULL); + } else + dir = old; if (dir == NULL) return 0; @@ -223,9 +232,13 @@ GNode* remmina_file_manager_get_group_tree(void) g_snprintf(dirname, sizeof(dirname), "%s/.%s", g_get_home_dir(), remmina); old = g_dir_open(dirname, 0, NULL); if (old == NULL) + { /* If the XDG directories exist, use them. */ g_snprintf(dirname, sizeof(dirname), "%s/%s", g_get_user_data_dir(), remmina); - dir = g_dir_open(dirname, 0, NULL); + dir = g_dir_open(dirname, 0, NULL); + } else + dir = old; + if (dir == NULL) return root; while ((name = g_dir_read_name(dir)) != NULL) diff --git a/remmina/src/remmina_init_dialog.c b/remmina/src/remmina_init_dialog.c index d2630313cd..5387960f77 100644 --- a/remmina/src/remmina_init_dialog.c +++ b/remmina/src/remmina_init_dialog.c @@ -282,17 +282,11 @@ gint remmina_init_dialog_authpwd(RemminaInitDialog *dialog, const gchar *label, s = g_strdup_printf(_("Save %s"), label); save_password_check = gtk_check_button_new_with_label(s); g_free(s); - if (allow_save) - { - gtk_widget_show(save_password_check); - gtk_grid_attach(GTK_GRID(grid), save_password_check, 0, 1, 2, 1); - if (dialog->save_password) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(save_password_check), TRUE); - } - else - { - gtk_widget_set_sensitive(save_password_check, FALSE); - } + gtk_widget_show(save_password_check); + gtk_grid_attach(GTK_GRID(grid), save_password_check, 0, 1, 2, 1); + if (dialog->save_password) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(save_password_check), TRUE); + gtk_widget_set_sensitive(save_password_check, allow_save); /* Pack it into the dialog */ gtk_box_pack_start(GTK_BOX(dialog->content_vbox), grid, TRUE, TRUE, 4); @@ -312,7 +306,7 @@ gint remmina_init_dialog_authpwd(RemminaInitDialog *dialog, const gchar *label, dialog->save_password = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(save_password_check)); } - gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), grid); + gtk_widget_destroy(grid); remmina_init_dialog_connecting(dialog); @@ -451,7 +445,7 @@ gint remmina_init_dialog_authuserpwd(RemminaInitDialog *dialog, gboolean want_do dialog->domain = g_strdup(gtk_entry_get_text(GTK_ENTRY(domain_entry))); } - gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), grid); + gtk_widget_destroy(grid); remmina_init_dialog_connecting(dialog); @@ -557,7 +551,7 @@ gint remmina_init_dialog_certificate(RemminaInitDialog* dialog, const gchar* sub } - gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), grid); + gtk_widget_destroy(grid); return status; } @@ -674,7 +668,7 @@ gint remmina_init_dialog_certificate_changed(RemminaInitDialog* dialog, const gc } - gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), grid); + gtk_widget_destroy(grid); return status; } @@ -776,7 +770,7 @@ gint remmina_init_dialog_authx509(RemminaInitDialog *dialog, const gchar *cacert dialog->clientkey = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(clientkey_button)); } - gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), grid); + gtk_widget_destroy(grid); remmina_init_dialog_connecting(dialog); @@ -848,7 +842,7 @@ gint remmina_init_dialog_serverkey_confirm(RemminaInitDialog *dialog, const gcha /* Now run it */ ret = gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), vbox); + gtk_widget_destroy(vbox); remmina_init_dialog_connecting(dialog); return ret; diff --git a/remmina/src/remmina_key_chooser.c b/remmina/src/remmina_key_chooser.c index 2c07261340..2f526a8877 100644 --- a/remmina/src/remmina_key_chooser.c +++ b/remmina/src/remmina_key_chooser.c @@ -85,7 +85,7 @@ gchar* remmina_key_chooser_get_value(guint keyval, guint state) TRACE_CALL("remmina_key_chooser_get_value"); if (!keyval) - return KEY_CHOOSER_NONE; + return g_strdup(KEY_CHOOSER_NONE); return g_strdup_printf("%s%s%s%s%s%s%s", state & GDK_SHIFT_MASK ? KEY_MODIFIER_SHIFT : "", diff --git a/remmina/src/remmina_pref.c b/remmina/src/remmina_pref.c index 74e4acd715..914c8b3b62 100644 --- a/remmina/src/remmina_pref.c +++ b/remmina/src/remmina_pref.c @@ -164,6 +164,7 @@ static void remmina_pref_init_keymap(void) gptr++; } g_strfreev(groups); + g_key_file_free(gkeyfile); } void remmina_pref_init(void) @@ -178,6 +179,8 @@ void remmina_pref_init(void) if (old == NULL) /* If the XDG directories exist, use them. */ g_snprintf(dirname, sizeof(dirname), "%s/%s", g_get_user_config_dir(), remmina); + else + g_dir_close(old); g_mkdir_with_parents(dirname, 0700); remmina_pref_file = g_strdup_printf("%s/remmina.pref", dirname); remmina_keymap_file = g_strdup_printf("%s/remmina.keymap", dirname); diff --git a/remmina/src/remmina_pref_dialog.c b/remmina/src/remmina_pref_dialog.c index a49f341641..1fa6bd6379 100644 --- a/remmina/src/remmina_pref_dialog.c +++ b/remmina/src/remmina_pref_dialog.c @@ -61,7 +61,11 @@ void remmina_pref_dialog_on_key_chooser(GtkWidget *widget, gpointer user_data) arguments = remmina_key_chooser_new(GTK_WINDOW(remmina_pref_dialog->dialog), FALSE); if (arguments->response != GTK_RESPONSE_CANCEL && arguments->response != GTK_RESPONSE_DELETE_EVENT) - gtk_button_set_label(GTK_BUTTON(widget), remmina_key_chooser_get_value(arguments->keyval, arguments->state)); + { + gchar *val = remmina_key_chooser_get_value(arguments->keyval, arguments->state); + gtk_button_set_label(GTK_BUTTON(widget), val); + g_free(val); + } g_free(arguments); } @@ -256,6 +260,16 @@ void remmina_pref_dialog_disable_tray_icon_on_toggled(GtkWidget *widget, Remmina gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->checkbutton_applet_start_in_tray), b); } +/* Helper function for remmina_pref_dialog_init() */ +static void remmina_pref_dialog_set_button_label(GtkButton *button, guint keyval) +{ + gchar *val; + + val = remmina_key_chooser_get_value(keyval, 0); + gtk_button_set_label(button, val); + g_free(val); +} + /* Remmina preferences initialization */ static void remmina_pref_dialog_init(void) { @@ -284,16 +298,16 @@ static void remmina_pref_dialog_init(void) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_applet_start_in_tray), remmina_icon_is_autostart()); gtk_widget_set_sensitive(GTK_WIDGET(remmina_pref_dialog->checkbutton_applet_start_in_tray), !remmina_pref.disable_tray_icon); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_host_key, remmina_key_chooser_get_value(remmina_pref.hostkey, 0)); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_fullscreen, remmina_key_chooser_get_value(remmina_pref.shortcutkey_fullscreen, 0)); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_auto_fit, remmina_key_chooser_get_value(remmina_pref.shortcutkey_autofit, 0)); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_switch_tab_left, remmina_key_chooser_get_value(remmina_pref.shortcutkey_prevtab, 0)); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_switch_tab_right, remmina_key_chooser_get_value(remmina_pref.shortcutkey_nexttab, 0)); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_scaled, remmina_key_chooser_get_value(remmina_pref.shortcutkey_scale, 0)); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_grab_keyboard, remmina_key_chooser_get_value(remmina_pref.shortcutkey_grab, 0)); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_minimize, remmina_key_chooser_get_value(remmina_pref.shortcutkey_minimize, 0)); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_disconnect, remmina_key_chooser_get_value(remmina_pref.shortcutkey_disconnect, 0)); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_toolbar, remmina_key_chooser_get_value(remmina_pref.shortcutkey_toolbar, 0)); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_host_key, remmina_pref.hostkey); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_fullscreen, remmina_pref.shortcutkey_fullscreen); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_auto_fit, remmina_pref.shortcutkey_autofit); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_switch_tab_left, remmina_pref.shortcutkey_prevtab); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_switch_tab_right, remmina_pref.shortcutkey_nexttab); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_scaled, remmina_pref.shortcutkey_scale); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_grab_keyboard, remmina_pref.shortcutkey_grab); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_minimize, remmina_pref.shortcutkey_minimize); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_disconnect, remmina_pref.shortcutkey_disconnect); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_toolbar, remmina_pref.shortcutkey_toolbar); if (!(remmina_pref.vte_font && remmina_pref.vte_font[0])) { @@ -341,8 +355,8 @@ static void remmina_pref_dialog_init(void) gtk_combo_box_set_active(remmina_pref_dialog->comboboxtext_options_ssh_loglevel, remmina_pref.ssh_loglevel); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remmina_pref_dialog->checkbutton_options_ssh_parseconfig), remmina_pref.ssh_parseconfig); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_copy, remmina_key_chooser_get_value(remmina_pref.vte_shortcutkey_copy, 0)); - gtk_button_set_label(remmina_pref_dialog->button_keyboard_paste, remmina_key_chooser_get_value(remmina_pref.vte_shortcutkey_paste, 0)); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_copy, remmina_pref.vte_shortcutkey_copy); + remmina_pref_dialog_set_button_label(remmina_pref_dialog->button_keyboard_paste, remmina_pref.vte_shortcutkey_paste); remmina_plugin_manager_for_each_plugin(REMMINA_PLUGIN_TYPE_PREF, remmina_pref_dialog_add_pref_plugin, remmina_pref_dialog->dialog);