@@ -1057,8 +1057,9 @@ drop_left_child(Window *w) {
10571057
10581058#define ds w->drag_source
10591059
1060- static void
1061- drag_free_built_data (Window * w ) {
1060+ void
1061+ drag_free_offer (Window * w ) {
1062+ free (ds .mimes_buf ); ds .mimes_buf = NULL ; ds .bufsz = 0 ;
10621063 if (ds .items ) {
10631064 for (size_t i = 0 ; i < ds .num_mimes ; i ++ ) {
10641065 free (ds .items [i ].optional_data );
@@ -1072,12 +1073,6 @@ drag_free_built_data(Window *w) {
10721073 if (ds .images [i ].data ) free (ds .images [i ].data );
10731074 zero_at_ptr (ds .images + i );
10741075 }
1075- }
1076-
1077- void
1078- drag_free_offer (Window * w ) {
1079- free (ds .mimes_buf ); ds .mimes_buf = NULL ; ds .bufsz = 0 ;
1080- drag_free_built_data (w );
10811076 ds .allowed_operations = 0 ;
10821077 ds .state = DRAG_SOURCE_NONE ;
10831078 ds .pre_sent_total_sz = 0 ;
@@ -1148,6 +1143,7 @@ drag_add_mimes(Window *w, int allowed_operations, uint32_t client_id, const char
11481143 while (p < end ) {
11491144 if (* p ) {
11501145 if (ds .num_mimes >= rough_count + 1 ) break ;
1146+ ds .items [ds .num_mimes ].is_uri_list = strcmp (p , "text/uri-list" ) == 0 ;
11511147 ds .items [ds .num_mimes ++ ].mime_type = p ;
11521148 p += strlen (p ) + 1 ;
11531149 } else p ++ ;
@@ -1367,8 +1363,9 @@ drag_get_data(Window *w, const char *mime_type, size_t *sz, int *err_code) {
13671363 }
13681364 // No fd yet, request data from the client
13691365 char buf [128 ];
1366+ ds .items [i ].requested_remote_files = ds .is_remote_client && ds .items [i ].is_uri_list ;
13701367 int header_sz = snprintf (buf , sizeof (buf ), "\x1b]%d;t=e:x=%d:y=%zu:Y=%d" ,
1371- DND_CODE , DRAG_NOTIFY_FINISHED + 2 , i , ds .is_remote_client );
1368+ DND_CODE , DRAG_NOTIFY_FINISHED + 2 , i , ds .items [ i ]. requested_remote_files );
13721369 queue_payload_to_child (w -> id , w -> drag_source .client_id , & w -> drag_source .pending , buf , header_sz , NULL , 0 , false);
13731370 * err_code = EAGAIN ;
13741371 return NULL ;
@@ -1427,8 +1424,10 @@ drag_process_item_data(Window *w, size_t idx, int has_more, const uint8_t *paylo
14271424 if (has_more == 0 && payload_sz == 0 ) {
14281425 ds .items [idx ].data_decode_initialized = false;
14291426 if (ds .items [idx ].fd_plus_one > 0 ) {
1430- int ret = notify_drag_data_ready (global_state .drag_source .from_os_window , ds .items [idx ].mime_type );
1431- if (ret ) cancel_drag (w , ret );
1427+ if (!ds .items [idx ].requested_remote_files ) {
1428+ int ret = notify_drag_data_ready (global_state .drag_source .from_os_window , ds .items [idx ].mime_type );
1429+ if (ret ) cancel_drag (w , ret );
1430+ }
14321431 }
14331432 return ;
14341433 }
@@ -1465,8 +1464,10 @@ drag_process_item_data(Window *w, size_t idx, int has_more, const uint8_t *paylo
14651464 }
14661465 ds .items [idx ].data_capacity += outlen ;
14671466 // Notify as soon as any data is available
1468- int ret = notify_drag_data_ready (global_state .drag_source .from_os_window , ds .items [idx ].mime_type );
1469- if (ret ) cancel_drag (w , ret );
1467+ if (!ds .items [idx ].requested_remote_files ) {
1468+ int ret = notify_drag_data_ready (global_state .drag_source .from_os_window , ds .items [idx ].mime_type );
1469+ if (ret ) cancel_drag (w , ret );
1470+ }
14701471 }
14711472}
14721473
0 commit comments