Commit 064bb96ecc94269f0540302f4c5d06d8e3e45034

Authored by Perry Werneck
1 parent 5454f9f5
Exists in master and in 1 other branch develop

Implementing drag&drop on the file settings widget.

src/filetransfer/private.h
@@ -128,6 +128,7 @@ @@ -128,6 +128,7 @@
128 G_GNUC_INTERNAL extern const struct v3270ft_value ft_value[]; 128 G_GNUC_INTERNAL extern const struct v3270ft_value ft_value[];
129 G_GNUC_INTERNAL extern const struct v3270_activity_list_option v3270_activity_list_options[]; 129 G_GNUC_INTERNAL extern const struct v3270_activity_list_option v3270_activity_list_options[];
130 G_GNUC_INTERNAL extern const struct v3270_ft_worker_field v3270_ft_worker_fields[PROGRESS_FIELD_COUNT]; 130 G_GNUC_INTERNAL extern const struct v3270_ft_worker_field v3270_ft_worker_fields[PROGRESS_FIELD_COUNT];
  131 + G_GNUC_INTERNAL extern const gchar * v3270_text_file_extensions[];
131 132
132 #define ENTRY_FILENAME_LENGTH FILENAME_MAX 133 #define ENTRY_FILENAME_LENGTH FILENAME_MAX
133 struct v3270ft_entry { 134 struct v3270ft_entry {
src/filetransfer/settings.c
@@ -352,7 +352,8 @@ static void open_select_file_dialog(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconP @@ -352,7 +352,8 @@ static void open_select_file_dialog(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconP
352 set_valid(widget, VALIDITY_LOCAL_FILENAME); 352 set_valid(widget, VALIDITY_LOCAL_FILENAME);
353 } 353 }
354 354
355 - static void remote_file_changed(GtkEntry *entry, V3270FTSettings *widget) { 355 + static void remote_file_changed(GtkEntry *entry, V3270FTSettings *widget)
  356 + {
356 357
357 const gchar * text = gtk_entry_get_text(entry); 358 const gchar * text = gtk_entry_get_text(entry);
358 359
@@ -366,6 +367,65 @@ static void open_select_file_dialog(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconP @@ -366,6 +367,65 @@ static void open_select_file_dialog(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconP
366 367
367 } 368 }
368 369
  370 + LIB3270_EXPORT gboolean v3270_ft_settings_set_from_filename(GtkWidget *widget, const gchar *filename)
  371 + {
  372 + g_return_val_if_fail(GTK_IS_V3270_FT_SETTINGS(widget) && g_file_test(filename,G_FILE_TEST_IS_REGULAR),FALSE);
  373 +
  374 + debug("%s(%s)",__FUNCTION__,filename);
  375 +
  376 + // Setup dialog from filename.
  377 + V3270FTSettings * settings = GTK_V3270_FT_SETTINGS(widget);
  378 + LIB3270_FT_OPTION options = LIB3270_FT_OPTION_SEND;
  379 + size_t ix;
  380 +
  381 + for(ix = 0; v3270_text_file_extensions[ix]; ix++)
  382 + {
  383 + if(g_str_has_suffix(filename,v3270_text_file_extensions[ix]))
  384 + {
  385 + options |= (LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_CRLF|LIB3270_FT_OPTION_REMAP);
  386 + break;
  387 + }
  388 + }
  389 +
  390 +
  391 +
  392 + gtk_entry_set_text(settings->file.local,filename);
  393 +
  394 + g_autofree gchar * basename = g_path_get_basename(filename);
  395 + gtk_entry_set_text(settings->file.remote,basename);
  396 +
  397 + v3270_ft_settings_set_options(widget,options);
  398 +
  399 + return TRUE;
  400 + }
  401 +
  402 + guint v3270_ft_settings_set_from_selection(GtkWidget *widget, GtkSelectionData *data)
  403 + {
  404 + gchar **uris = g_strsplit((const gchar *) gtk_selection_data_get_text(data),"\n",-1);
  405 + guint rc = 0;
  406 + size_t ix;
  407 +
  408 + for(ix = 0; uris[ix]; ix++)
  409 + {
  410 + if(!g_ascii_strncasecmp("file:///",uris[ix],8)) {
  411 +
  412 + if(v3270_ft_settings_set_from_filename(widget,uris[ix]+7))
  413 + break;
  414 +
  415 + }
  416 + }
  417 +
  418 + g_strfreev(uris);
  419 +
  420 + return rc;
  421 +}
  422 +
  423 + static void drag_data_received(GtkWidget *widget, GdkDragContext *context, G_GNUC_UNUSED gint x, G_GNUC_UNUSED gint y, GtkSelectionData *data, G_GNUC_UNUSED guint info, guint time)
  424 + {
  425 + debug("%s",__FUNCTION__);
  426 + gtk_drag_finish(context, v3270_ft_settings_set_from_selection(widget, data) > 0, FALSE, time);
  427 + }
  428 +
369 static void V3270FTSettings_init(V3270FTSettings *widget) 429 static void V3270FTSettings_init(V3270FTSettings *widget)
370 { 430 {
371 size_t ix; 431 size_t ix;
@@ -537,6 +597,15 @@ static void open_select_file_dialog(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconP @@ -537,6 +597,15 @@ static void open_select_file_dialog(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconP
537 gtk_widget_set_sensitive(GTK_WIDGET(widget->file.local),FALSE); 597 gtk_widget_set_sensitive(GTK_WIDGET(widget->file.local),FALSE);
538 gtk_widget_set_sensitive(GTK_WIDGET(widget->file.remote),FALSE); 598 gtk_widget_set_sensitive(GTK_WIDGET(widget->file.remote),FALSE);
539 599
  600 + // Setup drag & drop
  601 + // http://ftp.math.utah.edu/u/ma/hohn/linux/gnome/developer.gnome.org/doc/tutorials/gnome-libs/x1003.html
  602 + static const GtkTargetEntry targets[] = {
  603 + { "text/plain", GTK_TARGET_OTHER_APP, 0 }
  604 + };
  605 +
  606 + gtk_drag_dest_set(GTK_WIDGET(widget),GTK_DEST_DEFAULT_ALL,targets,G_N_ELEMENTS(targets),GDK_ACTION_COPY);
  607 + g_signal_connect(widget,"drag-data-received",G_CALLBACK(drag_data_received),widget);
  608 +
540 } 609 }
541 610
542 LIB3270_EXPORT GtkWidget * v3270_ft_settings_new() 611 LIB3270_EXPORT GtkWidget * v3270_ft_settings_new()
src/filetransfer/tables.c
@@ -223,3 +223,12 @@ const struct v3270_ft_worker_field v3270_ft_worker_fields[PROGRESS_FIELD_COUNT] @@ -223,3 +223,12 @@ const struct v3270_ft_worker_field v3270_ft_worker_fields[PROGRESS_FIELD_COUNT]
223 { N_("Speed:"), N_("Transfer speed") }, 223 { N_("Speed:"), N_("Transfer speed") },
224 { N_("ETA:"), N_("Estimated transfer arrival") } 224 { N_("ETA:"), N_("Estimated transfer arrival") }
225 }; 225 };
  226 +
  227 +const gchar * v3270_text_file_extensions[] =
  228 +{
  229 + ".txt",
  230 + ".c",
  231 + ".h"
  232 + NULL
  233 +};
  234 +
src/include/v3270/filetransfer.h
@@ -97,6 +97,8 @@ @@ -97,6 +97,8 @@
97 LIB3270_EXPORT void v3270_ft_settings_set_activity(GtkWidget *widget, GObject *activity); 97 LIB3270_EXPORT void v3270_ft_settings_set_activity(GtkWidget *widget, GObject *activity);
98 LIB3270_EXPORT GObject * v3270_ft_settings_get_activity(GtkWidget *widget); 98 LIB3270_EXPORT GObject * v3270_ft_settings_get_activity(GtkWidget *widget);
99 99
  100 + LIB3270_EXPORT gboolean v3270_ft_settings_set_from_filename(GtkWidget *widget, const gchar *filename);
  101 +
100 LIB3270_EXPORT GObject * v3270_ft_settings_create_activity(GtkWidget *widget); 102 LIB3270_EXPORT GObject * v3270_ft_settings_create_activity(GtkWidget *widget);
101 103
102 LIB3270_EXPORT void v3270_ft_settings_reset(GtkWidget *widget); 104 LIB3270_EXPORT void v3270_ft_settings_reset(GtkWidget *widget);
src/testprogram/testprogram.c
@@ -184,18 +184,16 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) @@ -184,18 +184,16 @@ static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
184 v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_REMAP); 184 v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_REMAP);
185 */ 185 */
186 186
187 - /*  
188 // 187 //
189 // Test settings dialog 188 // Test settings dialog
190 // 189 //
191 GtkWidget * dialog = v3270_ft_settings_dialog_new(terminal); 190 GtkWidget * dialog = v3270_ft_settings_dialog_new(terminal);
192 // v3270_ft_settings_dialog_append_activity(dialog,activity,NULL); 191 // v3270_ft_settings_dialog_append_activity(dialog,activity,NULL);
193 - */  
194 192
195 // 193 //
196 // V5.1 dialog 194 // V5.1 dialog
197 // 195 //
198 - GtkWidget *dialog = v3270ft_new(); 196 + //GtkWidget *dialog = v3270ft_new();
199 197
200 /* 198 /*
201 // 199 //