Changeset 11099
Legend:
- Unmodified
- Added
- Removed
-
trunk/gtk/main.c
r11095 r11099 201 201 static void wannaquit( gpointer vdata ); 202 202 203 static void setupdrag( GtkWidget * widget,204 struct cbdata *data );205 206 static void gotdrag( GtkWidget * widget,207 GdkDragContext * dc,208 gint x,209 gint y,210 GtkSelectionData *sel,211 guint info,212 guint time,213 gpointer gdata );214 215 203 static void coreerr( TrCore *, guint, const char *, struct cbdata * ); 216 204 … … 863 851 864 852 static void 865 winsetup( struct cbdata * cbdata, 866 TrWindow * wind ) 867 { 868 GtkTreeModel * model; 853 on_drag_data_received( GtkWidget * widget UNUSED, 854 GdkDragContext * drag_context, 855 gint x UNUSED, 856 gint y UNUSED, 857 GtkSelectionData * selection_data, 858 guint info UNUSED, 859 guint time_, 860 gpointer gdata ) 861 { 862 int i; 863 gboolean success = FALSE; 864 GSList * filenames = NULL; 865 struct cbdata * data = gdata; 866 char ** uris = gtk_selection_data_get_uris( selection_data ); 867 868 /* try to add the filename URIs... */ 869 for( i=0; uris && uris[i]; ++i ) 870 { 871 const char * uri = uris[i]; 872 char * filename = g_filename_from_uri( uri, NULL, NULL ); 873 874 if( filename && g_file_test( filename, G_FILE_TEST_EXISTS ) ) 875 { 876 filenames = g_slist_append( filenames, g_strdup( filename ) ); 877 success = TRUE; 878 } 879 else if( tr_urlIsValid( uri ) ) 880 { 881 tr_core_add_from_url( data->core, uri ); 882 success = TRUE; 883 } 884 } 885 886 if( filenames ) 887 tr_core_add_list_defaults( data->core, g_slist_reverse( filenames ), TRUE ); 888 889 tr_core_torrents_added( data->core ); 890 gtk_drag_finish( drag_context, success, FALSE, time_ ); 891 892 /* cleanup */ 893 g_strfreev( uris ); 894 } 895 896 static void 897 winsetup( struct cbdata * cbdata, TrWindow * wind ) 898 { 899 GtkWidget * w; 900 GtkTreeModel * model; 869 901 GtkTreeSelection * sel; 870 902 … … 880 912 refreshActions( cbdata ); 881 913 882 setupdrag( GTK_WIDGET( wind ), cbdata ); 914 /* register to handle URIs that get dragged onto our main window */ 915 w = GTK_WIDGET( wind ); 916 gtk_drag_dest_set( w, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY ); 917 gtk_drag_dest_add_uri_targets( w ); 918 g_signal_connect( w, "drag-data-received", G_CALLBACK(on_drag_data_received), cbdata ); 883 919 } 884 920 … … 994 1030 /* shut down libT */ 995 1031 g_thread_create( sessionCloseThreadFunc, vdata, TRUE, NULL ); 996 }997 998 static void999 gotdrag( GtkWidget * widget UNUSED,1000 GdkDragContext * dc,1001 gint x UNUSED,1002 gint y UNUSED,1003 GtkSelectionData * sel,1004 guint info UNUSED,1005 guint time,1006 gpointer gdata )1007 {1008 struct cbdata * data = gdata;1009 GSList * paths = NULL;1010 GSList * freeme = NULL;1011 1012 #if 01013 int i;1014 char * sele = gdk_atom_name( sel->selection );1015 char * targ = gdk_atom_name( sel->target );1016 char * type = gdk_atom_name( sel->type );1017 1018 g_message( "dropped file: sel=%s targ=%s type=%s fmt=%i len=%i",1019 sele, targ, type, sel->format, sel->length );1020 g_free( sele );1021 g_free( targ );1022 g_free( type );1023 if( sel->format == 8 )1024 {1025 for( i = 0; i < sel->length; ++i )1026 fprintf( stderr, "%02X ", sel->data[i] );1027 fprintf( stderr, "\n" );1028 }1029 #endif1030 1031 if( ( sel->format == 8 )1032 && ( sel->selection == gdk_atom_intern( "XdndSelection", FALSE ) ) )1033 {1034 int i;1035 char * str = g_strndup( (char*)sel->data, sel->length );1036 gchar ** files = g_strsplit_set( str, "\r\n", -1 );1037 for( i = 0; files && files[i]; ++i )1038 {1039 char * filename;1040 if( !*files[i] ) /* empty filename... */1041 continue;1042 1043 /* decode the filename */1044 filename = decode_uri( files[i] );1045 freeme = g_slist_prepend( freeme, filename );1046 if( !g_utf8_validate( filename, -1, NULL ) )1047 continue;1048 1049 /* walk past "file://", if present */1050 if( g_str_has_prefix( filename, "file:" ) ) {1051 filename += 5;1052 while( g_str_has_prefix( filename, "//" ) )1053 ++filename;1054 }1055 1056 if( g_file_test( filename, G_FILE_TEST_EXISTS ) )1057 paths = g_slist_prepend( paths, g_strdup( filename ) );1058 else1059 tr_core_add_from_url( data->core, filename );1060 }1061 1062 /* try to add any torrents we found */1063 if( paths )1064 {1065 paths = g_slist_reverse( paths );1066 tr_core_add_list_defaults( data->core, paths, TRUE );1067 tr_core_torrents_added( data->core );1068 }1069 1070 freestrlist( freeme );1071 g_strfreev( files );1072 g_free( str );1073 }1074 1075 gtk_drag_finish( dc, ( NULL != paths ), FALSE, time );1076 }1077 1078 static void1079 setupdrag( GtkWidget * widget,1080 struct cbdata *data )1081 {1082 GtkTargetEntry targets[] = {1083 { (char*)"STRING", 0, 0 },1084 { (char*)"text/plain", 0, 0 },1085 { (char*)"text/uri-list", 0, 0 },1086 };1087 1088 g_signal_connect( widget, "drag_data_received", G_CALLBACK(1089 gotdrag ), data );1090 1091 gtk_drag_dest_set( widget, GTK_DEST_DEFAULT_ALL, targets,1092 G_N_ELEMENTS( targets ), GDK_ACTION_COPY | GDK_ACTION_MOVE );1093 1032 } 1094 1033 -
trunk/gtk/makemeta-ui.c
r11098 r11099 382 382 static void 383 383 on_drag_data_received( GtkWidget * widget UNUSED, 384 GdkDragContext * drag_context UNUSED,384 GdkDragContext * drag_context, 385 385 gint x UNUSED, 386 386 gint y UNUSED, 387 387 GtkSelectionData * selection_data, 388 388 guint info UNUSED, 389 guint time UNUSED,389 guint time_, 390 390 gpointer user_data ) 391 391 { 392 gboolean success = FALSE; 392 393 MakeMetaUI * ui = user_data; 393 394 char ** uris = gtk_selection_data_get_uris( selection_data ); … … 403 404 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( ui->folder_radio ), TRUE ); 404 405 gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER( ui->folder_chooser ), filename ); 406 success = TRUE; 405 407 } 406 408 else if( g_file_test( filename, G_FILE_TEST_IS_REGULAR ) ) … … 409 411 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( ui->file_radio ), TRUE ); 410 412 gtk_file_chooser_set_filename( GTK_FILE_CHOOSER( ui->file_chooser ), filename ); 413 success = TRUE; 411 414 } 412 415 … … 415 418 416 419 g_strfreev( uris ); 420 gtk_drag_finish( drag_context, success, FALSE, time_ ); 417 421 } 418 422 -
trunk/gtk/tr-core.c
r11088 r11099 1210 1210 1211 1211 for( l = torrentFiles; l != NULL; l = l->next ) 1212 add_filename( core, l->data, doStart, doPrompt, doNotify ); 1212 { 1213 char * filename = l->data; 1214 add_filename( core, filename, doStart, doPrompt, doNotify ); 1215 g_free( filename ); 1216 } 1213 1217 1214 1218 tr_core_torrents_added( core ); 1215 freestrlist( torrentFiles ); 1219 1220 g_slist_free( torrentFiles ); 1216 1221 } 1217 1222 -
trunk/gtk/util.c
r11088 r11099 251 251 return !tr_mkdirp( path, mode ); 252 252 #endif 253 }254 255 GSList *256 dupstrlist( GSList * l )257 {258 GSList * ret = NULL;259 260 for( ; l != NULL; l = l->next )261 ret = g_slist_prepend( ret, g_strdup( l->data ) );262 return g_slist_reverse( ret );263 }264 265 char *266 joinstrlist( GSList *list,267 char * sep )268 {269 GSList * l;270 GString *gstr = g_string_new ( NULL );271 272 for( l = list; l != NULL; l = l->next )273 {274 g_string_append ( gstr, (char*)l->data );275 if( l->next != NULL )276 g_string_append ( gstr, ( sep ) );277 }278 return g_string_free ( gstr, FALSE );279 }280 281 void282 freestrlist( GSList *list )283 {284 g_slist_foreach ( list, (GFunc)g_free, NULL );285 g_slist_free ( list );286 }287 288 char *289 decode_uri( const char * uri )290 {291 gboolean in_query = FALSE;292 char * ret = g_new( char, strlen( uri ) + 1 );293 char * out = ret;294 295 for( ; uri && *uri; )296 {297 char ch = *uri;298 if( ch == '?' )299 in_query = TRUE;300 else if( ch == '+' && in_query )301 ch = ' ';302 else if( ch == '%' && isxdigit( (unsigned char)uri[1] )303 && isxdigit( (unsigned char)uri[2] ) )304 {305 char buf[3] = { uri[1], uri[2], '\0' };306 ch = (char) g_ascii_strtoull( buf, NULL, 16 );307 uri += 2;308 }309 310 ++uri;311 *out++ = ch;312 }313 314 *out = '\0';315 return ret;316 253 } 317 254 -
trunk/gtk/util.h
r11088 r11099 91 91 92 92 gboolean gtr_is_hex_hashcode( const char * str ); 93 94 95 /* create a copy of a GSList of strings, this dups the actual strings too */96 GSList * dupstrlist( GSList * list );97 98 /* joins a GSList of strings into one string using an optional separator */99 char * joinstrlist( GSList *list, char * sep );100 101 /* free a GSList of strings */102 void freestrlist( GSList *list );103 104 /* decodes a string that has been urlencoded */105 char * decode_uri( const char * uri );106 93 107 94 /***
Note: See TracChangeset
for help on using the changeset viewer.