⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptk-file-misc.c

📁 台湾人开发的Linux下的文件管理器
💻 C
📖 第 1 页 / 共 2 页
字号:
    sel_files = g_list_copy( sel_files );    g_list_foreach( sel_files, vfs_file_info_ref, NULL );    dlg = file_properties_dlg_new( parent_win,                                   dir_path ? dir_path : cwd,                                   sel_files );    g_signal_connect_swapped( dlg, "destroy",                              G_CALLBACK( vfs_file_info_list_free ), sel_files );    gtk_widget_show( dlg );    g_free( dir_path );}static gboolean open_files_with_app( const char* cwd,                                     GList* files,                                     const char* app_desktop,                                     PtkFileBrowser* file_browser ){    gchar * name;    GError* err = NULL;    GList* l;    VFSAppDesktop* app;    GdkScreen* screen;    /* Check whether this is an app desktop file or just a command line */    /* Not a desktop entry name */    if ( g_str_has_suffix ( app_desktop, ".desktop" ) )    {        app = vfs_app_desktop_new( app_desktop );    }    else    {        /*        * If we are lucky enough, there might be a desktop entry        * for this program        */        name = g_strconcat ( app_desktop, ".desktop", NULL );        if ( g_file_test( name, G_FILE_TEST_EXISTS ) )        {            app = vfs_app_desktop_new( name );        }        else        {            /* dirty hack! */            app = vfs_app_desktop_new( NULL );            app->exec = g_strdup( app_desktop );        }        g_free( name );    }    if( file_browser )        screen = gtk_widget_get_screen( file_browser );    else        screen = gdk_screen_get_default();    if ( ! vfs_app_desktop_open_files( screen, cwd, app, files, &err ) )    {        GtkWidget * toplevel = file_browser ? gtk_widget_get_toplevel( GTK_WIDGET( file_browser ) ) : NULL;        ptk_show_error( GTK_WINDOW( toplevel ),                        err->message );        g_error_free( err );    }    vfs_app_desktop_unref( app );    return TRUE;}static void open_files_with_each_app( gpointer key, gpointer value, gpointer user_data ){    const char * app_desktop = ( const char* ) key;    const char* cwd;    GList* files = ( GList* ) value;    PtkFileBrowser* file_browser = ( PtkFileBrowser* ) user_data;    /* FIXME: cwd should be passed into this function */     cwd = file_browser ? ptk_file_browser_get_cwd(file_browser) : NULL;    open_files_with_app( cwd, files, app_desktop, file_browser );}static void free_file_list_hash( gpointer key, gpointer value, gpointer user_data ){    const char * app_desktop;    GList* files;    app_desktop = ( const char* ) key;    files = ( GList* ) value;    g_list_foreach( files, ( GFunc ) g_free, NULL );    g_list_free( files );}void ptk_open_files_with_app( const char* cwd,                              GList* sel_files,                              char* app_desktop,                              PtkFileBrowser* file_browser ){    GList * l;    gchar* full_path;    const char* desktop_file;    VFSFileInfo* file;    VFSMimeType* mime_type;    gboolean is_first_dir = TRUE;    GList* files_to_open = NULL;    GHashTable* file_list_hash = NULL;    GError* err;    char* new_dir = NULL;    char* choosen_app = NULL;    GtkWidget* toplevel;    for ( l = sel_files; l; l = l->next )    {        file = ( VFSFileInfo* ) l->data;        if ( G_UNLIKELY( ! file ) )            continue;        full_path = g_build_filename( cwd,                                      vfs_file_info_get_name( file ),                                      NULL );        if ( G_LIKELY( full_path ) )        {            if ( ! app_desktop )            {                if ( g_file_test( full_path, G_FILE_TEST_IS_DIR ) )                {                    if ( ! new_dir )                        new_dir = full_path;                    else                    {                        if ( G_LIKELY( file_browser ) )                        {                            ptk_file_browser_emit_open( file_browser,                                                        full_path, PTK_OPEN_NEW_TAB );                        }                        g_free( full_path );                    }                    continue;                }                /* If this file is an executable file, run it. */                if ( vfs_file_info_is_executable( file, full_path ) )                {                    char * argv[ 2 ] = { full_path, NULL };                    GdkScreen* screen = file_browser ? gtk_widget_get_screen( file_browser ) : gdk_screen_get_default();                    err = NULL;                    if ( ! vfs_exec_on_screen ( screen, cwd, argv, NULL,                                                vfs_file_info_get_disp_name( file ),                                                VFS_EXEC_DEFAULT_FLAGS, &err ) )                    {                        toplevel = file_browser ? gtk_widget_get_toplevel( GTK_WIDGET( file_browser ) ) : NULL;                        ptk_show_error( ( GtkWindow* ) toplevel,                                        err->message );                        g_error_free( err );                    }                    else                    {                        if ( G_LIKELY( file_browser ) )                        {                            ptk_file_browser_emit_open( file_browser,                                                        full_path, PTK_OPEN_FILE );                        }                    }                    g_free( full_path );                    continue;                }                mime_type = vfs_file_info_get_mime_type( file );                /* The file itself is a desktop entry file. */                /*                if( g_str_has_suffix( vfs_file_info_get_name( file ), ".desktop" ) ) */                if ( file->flags & VFS_FILE_INFO_DESKTOP_ENTRY )                    app_desktop = full_path;                else                    app_desktop = vfs_mime_type_get_default_action( mime_type );                if ( !app_desktop && xdg_mime_is_text_file( full_path, mime_type->type ) )                {                    /* FIXME: special handling for plain text file */                    /* app = get_default_app_for_mime_type( XDG_MIME_TYPE_PLAIN_TEXT ); */                }                if ( !app_desktop )                {                    toplevel = file_browser ? gtk_widget_get_toplevel( GTK_WIDGET( file_browser ) ) : NULL;                    /* Let the user choose an application */                    choosen_app = ptk_choose_app_for_mime_type(                                      ( GtkWindow* ) toplevel,                                      mime_type );                    app_desktop = choosen_app;                }                if ( ! app_desktop )                {                    g_free( full_path );                    continue;                }                files_to_open = NULL;                if ( ! file_list_hash )                    file_list_hash = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, NULL );                else                    files_to_open = g_hash_table_lookup( file_list_hash, app_desktop );                if ( app_desktop != full_path )                    files_to_open = g_list_append( files_to_open, full_path );                g_hash_table_replace( file_list_hash, app_desktop, files_to_open );                app_desktop = NULL;                vfs_mime_type_unref( mime_type );            }            else            {                files_to_open = g_list_append( files_to_open, full_path );            }        }    }    if ( file_list_hash )    {        g_hash_table_foreach( file_list_hash,                              open_files_with_each_app, file_browser );        g_hash_table_foreach( file_list_hash,                              free_file_list_hash, NULL );        g_hash_table_destroy( file_list_hash );    }    else if ( files_to_open && app_desktop )    {        open_files_with_app( cwd, files_to_open,                             app_desktop, file_browser );        g_list_foreach( files_to_open, ( GFunc ) g_free, NULL );        g_list_free( files_to_open );    }    if ( new_dir )    {        /*        ptk_file_browser_chdir( file_browser, new_dir, TRUE );        */        if ( G_LIKELY( file_browser ) )        {            ptk_file_browser_emit_open( file_browser,                                        full_path, PTK_OPEN_DIR );        }        g_free( new_dir );    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -