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:
-rw-r--r--data/ui/remmina_main.glade24
-rw-r--r--src/remmina_main.c72
-rw-r--r--src/remmina_main.h2
3 files changed, 96 insertions, 2 deletions
diff --git a/data/ui/remmina_main.glade b/data/ui/remmina_main.glade
index ad0980cb9..a4bdf7f0c 100644
--- a/data/ui/remmina_main.glade
+++ b/data/ui/remmina_main.glade
@@ -234,6 +234,30 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
</object>
</child>
<child>
+ <object class="GtkMenuItem" id="menuitem_delete_rc">
+ <property name="app-paintable">True</property>
+ <property name="can-focus">False</property>
+ <property name="label">Popup menu for delete</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu_popup_delete_rc">
+ <property name="visible">True</property>
+ <property name="app-paintable">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="menuitem_popup_delete_rc">
+ <property name="visible">True</property>
+ <property name="app-paintable">True</property>
+ <property name="can-focus">False</property>
+ <property name="action-name">main.delete_multiple</property>
+ <property name="label" translatable="yes">Delete</property>
+ <property name="use-underline">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
<object class="GtkMenuItem" id="menuitem_popup_full">
<property name="app-paintable">True</property>
<property name="can-focus">False</property>
diff --git a/src/remmina_main.c b/src/remmina_main.c
index 3504c744e..947af7431 100644
--- a/src/remmina_main.c
+++ b/src/remmina_main.c
@@ -112,6 +112,7 @@ static GActionEntry main_actions[] = {
{ "connect", remmina_main_on_action_connection_connect, NULL, NULL, NULL },
{ "copy", remmina_main_on_action_connection_copy, NULL, NULL, NULL },
{ "delete", remmina_main_on_action_connection_delete, NULL, NULL, NULL },
+ { "delete_multiple", remmina_main_on_action_connection_delete_multiple, NULL, NULL, NULL },
{ "edit", remmina_main_on_action_connection_edit, NULL, NULL, NULL },
{ "exttools", remmina_main_on_action_connection_external_tools, NULL, NULL, NULL },
{ "new", remmina_main_on_action_connection_new, NULL, NULL, NULL },
@@ -1007,6 +1008,64 @@ void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *p
remmina_main_clear_selection_data();
}
+void remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data)
+{
+ TRACE_CALL(__func__);
+ GtkWidget *dialog;
+ GtkTreeSelection *sel = gtk_tree_view_get_selection(remminamain->tree_files_list);
+ GtkTreeModel *model = gtk_tree_view_get_model(remminamain->tree_files_list);
+ GList *list = gtk_tree_selection_get_selected_rows(sel, &model);
+ gchar *file_to_delete;
+
+ dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
+ _("Are you sure you want to delete the selected files?"));
+
+ // Delete files if Yes is clicked
+ if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) {
+ while (list) {
+ GtkTreePath *path = list->data;
+ GtkTreeIter iter;
+
+ if (!gtk_tree_model_get_iter(model, &iter, path)) {
+ GtkWidget *dialog_warning;
+ dialog_warning = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
+ _("Failed to delete files!"));
+ gtk_dialog_run(GTK_DIALOG(dialog_warning));
+ gtk_widget_destroy(dialog_warning);
+ gtk_widget_destroy(dialog);
+ remmina_main_clear_selection_data();
+ return;
+ }
+
+ gtk_tree_model_get(model, &iter,
+ FILENAME_COLUMN, &file_to_delete, -1);
+
+ RemminaFile *remminafile = remmina_file_load(file_to_delete);
+
+ if (((remmina_pref_get_boolean("lock_edit")
+ && remmina_pref_get_boolean("use_primary_password"))
+ || remmina_file_get_int (remminafile, "profile-lock", FALSE))
+ && remmina_unlock_new(remminamain->window) == 0)
+ return;
+
+ if (remminafile) {
+ remmina_file_free(remminafile);
+ remminafile = NULL;
+ }
+
+ gchar *delfilename = g_strdup(file_to_delete);
+ remmina_file_delete(delfilename);
+ g_free(delfilename), delfilename = NULL;
+ remmina_icon_populate_menu();
+ remmina_main_load_files();
+ list = g_list_next(list);
+ }
+ }
+
+ gtk_widget_destroy(dialog);
+ remmina_main_clear_selection_data();
+}
+
void remmina_main_on_accel_application_preferences(GSimpleAction *action, GVariant *param, gpointer data)
{
TRACE_CALL(__func__);
@@ -1390,12 +1449,20 @@ gboolean remmina_main_file_list_on_button_press(GtkWidget *widget, GdkEventButto
{
TRACE_CALL(__func__);
if (event->button == MOUSE_BUTTON_RIGHT) {
- if (!kioskmode && kioskmode == FALSE)
+ if (!kioskmode && kioskmode == FALSE) {
#if GTK_CHECK_VERSION(3, 22, 0)
- gtk_menu_popup_at_pointer(GTK_MENU(remminamain->menu_popup), (GdkEvent *)event);
+ // For now, if more than one selected row, display only a delete menu option
+ if (gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(remminamain->tree_files_list)) > 1) {
+ gtk_menu_popup_at_pointer(GTK_MENU(remminamain->menu_popup_delete_rc), (GdkEvent *)event);
+ return GDK_EVENT_STOP;
+ }
+ else {
+ gtk_menu_popup_at_pointer(GTK_MENU(remminamain->menu_popup), (GdkEvent *)event);
+ }
#else
gtk_menu_popup(remminamain->menu_popup, NULL, NULL, NULL, NULL, event->button, event->time);
#endif
+ }
}
return FALSE;
}
@@ -1594,6 +1661,7 @@ GtkWidget *remmina_main_new(void)
remminamain->menu_popup = GTK_MENU(RM_GET_OBJECT("menu_popup"));
remminamain->menu_header_button = GTK_MENU_BUTTON(RM_GET_OBJECT("menu_header_button"));
remminamain->menu_popup_full = GTK_MENU(RM_GET_OBJECT("menu_popup_full"));
+ remminamain->menu_popup_delete_rc = GTK_MENU(RM_GET_OBJECT("menu_popup_delete_rc"));
if (kioskmode && kioskmode == TRUE) {
gtk_widget_set_sensitive(GTK_WIDGET(remminamain->menu_popup_full), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(remminamain->menu_header_button), FALSE);
diff --git a/src/remmina_main.h b/src/remmina_main.h
index e3d70a074..ae5ce1ddc 100644
--- a/src/remmina_main.h
+++ b/src/remmina_main.h
@@ -52,6 +52,7 @@ typedef struct _RemminaMain {
GtkMenu * menu_popup;
GtkMenuButton * menu_header_button;
GtkMenu * menu_popup_full;
+ GtkMenu * menu_popup_delete_rc;
GtkRadioMenuItem * menuitem_view_mode_list;
GtkRadioMenuItem * menuitem_view_mode_tree;
GtkMenuItem * menuitem_connection_quit;
@@ -123,6 +124,7 @@ void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *pa
void remmina_main_on_action_connection_connect(GSimpleAction *action, GVariant *param, gpointer data);
void remmina_main_on_action_connection_copy(GSimpleAction *action, GVariant *param, gpointer data);
void remmina_main_on_action_connection_delete(GSimpleAction *action, GVariant *param, gpointer data);
+void remmina_main_on_action_connection_delete_multiple(GSimpleAction *action, GVariant *param, gpointer data);
void remmina_main_on_action_connection_edit(GSimpleAction *action, GVariant *param, gpointer data);
void remmina_main_on_action_connection_external_tools(GSimpleAction *action, GVariant *param, gpointer data);
void remmina_main_on_action_connection_new(GSimpleAction *action, GVariant *param, gpointer data);