Changeset 11099


Ignore:
Timestamp:
Aug 2, 2010, 10:31:31 PM (12 years ago)
Author:
charles
Message:

(trunk gtk) rewrite the main window's drag-and-drop handler s.t. it's GTK+ 3 compliant

Location:
trunk/gtk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/main.c

    r11095 r11099  
    201201static void           wannaquit( gpointer vdata );
    202202
    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 
    215203static void coreerr( TrCore *, guint, const char *, struct cbdata * );
    216204
     
    863851
    864852static void
    865 winsetup( struct cbdata * cbdata,
    866           TrWindow *      wind )
    867 {
    868     GtkTreeModel *     model;
     853on_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
     896static void
     897winsetup( struct cbdata * cbdata, TrWindow * wind )
     898{
     899    GtkWidget * w;
     900    GtkTreeModel * model;
    869901    GtkTreeSelection * sel;
    870902
     
    880912    refreshActions( cbdata );
    881913
    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 );
    883919}
    884920
     
    9941030    /* shut down libT */
    9951031    g_thread_create( sessionCloseThreadFunc, vdata, TRUE, NULL );
    996 }
    997 
    998 static void
    999 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 0
    1013     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 #endif
    1030 
    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             else
    1059                 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 void
    1079 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 );
    10931032}
    10941033
  • trunk/gtk/makemeta-ui.c

    r11098 r11099  
    382382static void
    383383on_drag_data_received( GtkWidget         * widget           UNUSED,
    384                        GdkDragContext    * drag_context     UNUSED,
     384                       GdkDragContext    * drag_context,
    385385                       gint                x                UNUSED,
    386386                       gint                y                UNUSED,
    387387                       GtkSelectionData  * selection_data,
    388388                       guint               info             UNUSED,
    389                        guint               time             UNUSED,
     389                       guint               time_,
    390390                       gpointer            user_data )
    391391{
     392    gboolean success = FALSE;
    392393    MakeMetaUI * ui = user_data;
    393394    char ** uris = gtk_selection_data_get_uris( selection_data );
     
    403404            gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( ui->folder_radio ), TRUE );
    404405            gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER( ui->folder_chooser ), filename );
     406            success = TRUE;
    405407        }
    406408        else if( g_file_test( filename, G_FILE_TEST_IS_REGULAR ) )
     
    409411            gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( ui->file_radio ), TRUE );
    410412            gtk_file_chooser_set_filename( GTK_FILE_CHOOSER( ui->file_chooser ), filename );
     413            success = TRUE;
    411414        }
    412415
     
    415418
    416419    g_strfreev( uris );
     420    gtk_drag_finish( drag_context, success, FALSE, time_ );
    417421}
    418422
  • trunk/gtk/tr-core.c

    r11088 r11099  
    12101210
    12111211    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    }
    12131217
    12141218    tr_core_torrents_added( core );
    1215     freestrlist( torrentFiles );
     1219
     1220    g_slist_free( torrentFiles );
    12161221}
    12171222
  • trunk/gtk/util.c

    r11088 r11099  
    251251    return !tr_mkdirp( path, mode );
    252252#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 void
    282 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;
    316253}
    317254
  • trunk/gtk/util.h

    r11088 r11099  
    9191
    9292gboolean 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 );
    10693
    10794/***
Note: See TracChangeset for help on using the changeset viewer.