Changeset 11099 for trunk/gtk/main.c


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

File:
1 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
Note: See TracChangeset for help on using the changeset viewer.