From 7665c0637d7cf691a90631097b4fec598dcfcadd Mon Sep 17 00:00:00 2001 From: rakslice Date: Sat, 23 Nov 2024 22:30:24 -0800 Subject: [PATCH 1/2] copy the volume list drag and drop support over from the windows gui --- SheepShaver/src/Unix/prefs_editor_gtk.cpp | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/SheepShaver/src/Unix/prefs_editor_gtk.cpp b/SheepShaver/src/Unix/prefs_editor_gtk.cpp index 28af64e2..5b3bf7c8 100644 --- a/SheepShaver/src/Unix/prefs_editor_gtk.cpp +++ b/SheepShaver/src/Unix/prefs_editor_gtk.cpp @@ -493,6 +493,30 @@ static void cl_selected(GtkWidget *list, int row, int column) selected_volume = row; } +// Something dropped on volume list +static void drag_data_received(GtkWidget *list, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, + guint info, guint time, gpointer user_data) +{ + // reordering drags have already been handled by clist + if (data->type == gdk_atom_intern("gtk-clist-drag-reorder", true)) { + return; + } + + // get URIs from the drag selection data and add them + gchar ** uris = g_strsplit((gchar *)(data->data), "\r\n", -1); + for (gchar ** uri = uris; *uri != NULL; uri++) { + if (strlen(*uri) < 7) continue; + if (strncmp("file://", *uri, 7) != 0) continue; + + gchar * filename = g_filename_from_uri(*uri, NULL, NULL); + if (filename) { + gtk_clist_append(GTK_CLIST(volume_list), &filename); + g_free(filename); + } + } + g_strfreev(uris); +} + // Volume selected for addition static void cb_add_volume_response (GtkWidget *chooser, int response) { @@ -635,6 +659,12 @@ static void create_volumes_pane(GtkWidget *top) gtk_clist_set_shadow_type(GTK_CLIST(volume_list), GTK_SHADOW_NONE); gtk_clist_set_reorderable(GTK_CLIST(volume_list), true); g_signal_connect(volume_list, "select_row", G_CALLBACK(cl_selected), NULL); + + // also support volume files dragged onto the list from outside + gtk_drag_dest_add_uri_targets(volume_list); + // add a drop handler to get dropped files; don't supersede the drop handler for reordering + gtk_signal_connect_after(GTK_OBJECT(volume_list), "drag_data_received", GTK_SIGNAL_FUNC(drag_data_received), NULL); + char *str; int32 index = 0; while ((str = (char *)PrefsFindString("disk", index++)) != NULL) From 4c11b3487287d8a7c06d8588fbfe6f8928a1e3b6 Mon Sep 17 00:00:00 2001 From: rakslice Date: Thu, 28 Nov 2024 16:45:16 -0800 Subject: [PATCH 2/2] also copy the volume list drag and drop support to the b2 version of the unix gtk2 gui --- BasiliskII/src/Unix/prefs_editor_gtk.cpp | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/BasiliskII/src/Unix/prefs_editor_gtk.cpp b/BasiliskII/src/Unix/prefs_editor_gtk.cpp index c3452ff7..cd85c094 100644 --- a/BasiliskII/src/Unix/prefs_editor_gtk.cpp +++ b/BasiliskII/src/Unix/prefs_editor_gtk.cpp @@ -541,6 +541,30 @@ static void cl_selected(GtkWidget *list, int row, int column) selected_volume = row; } +// Something dropped on volume list +static void drag_data_received(GtkWidget *list, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, + guint info, guint time, gpointer user_data) +{ + // reordering drags have already been handled by clist + if (data->type == gdk_atom_intern("gtk-clist-drag-reorder", true)) { + return; + } + + // get URIs from the drag selection data and add them + gchar ** uris = g_strsplit((gchar *)(data->data), "\r\n", -1); + for (gchar ** uri = uris; *uri != NULL; uri++) { + if (strlen(*uri) < 7) continue; + if (strncmp("file://", *uri, 7) != 0) continue; + + gchar * filename = g_filename_from_uri(*uri, NULL, NULL); + if (filename) { + gtk_clist_append(GTK_CLIST(volume_list), &filename); + g_free(filename); + } + } + g_strfreev(uris); +} + // Volume selected for addition static void cb_add_volume_response (GtkWidget *chooser, int response) { @@ -684,6 +708,12 @@ static void create_volumes_pane(GtkWidget *top) gtk_clist_set_shadow_type(GTK_CLIST(volume_list), GTK_SHADOW_NONE); gtk_clist_set_reorderable(GTK_CLIST(volume_list), true); g_signal_connect(volume_list, "select_row", G_CALLBACK(cl_selected), NULL); + + // also support volume files dragged onto the list from outside + gtk_drag_dest_add_uri_targets(volume_list); + // add a drop handler to get dropped files; don't supersede the drop handler for reordering + gtk_signal_connect_after(GTK_OBJECT(volume_list), "drag_data_received", GTK_SIGNAL_FUNC(drag_data_received), NULL); + char *str; int32 index = 0; while ((str = const_cast(PrefsFindString("disk", index++))) != NULL)