亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vfs-dir.c

?? 臺灣人開發的Linux下的文件管理器
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**  C Implementation: vfs-dir** Description: Object used to present a directory*** Author: Hong Jen Yee (PCMan) <pcman.tw (AT) gmail.com>, (C) 2006** Copyright: See COPYING file that comes with this distribution**//*FIXME: The original multi-threading synchronization in this file is poor and       needs re-check.  Briefly speaking, it's totally in a mess.       If this works without any problems, you are really lucky.       If not, take it easy.  That's quite normal.        Finally, I found Thunar's thunar/thunar-thumbnail-generator.c, whose author       is Benedikt Meurer, and use it as a reference.  Now, the multi-threading       handling is learned from Thunar and re-written.*/#include "vfs-dir.h"#include "vfs-file-info.h"#include "glib-mem.h"#include <string.h>static void vfs_dir_class_init( VFSDirClass* klass );static void vfs_dir_init( VFSDir* dir );static void vfs_dir_finalize( GObject *obj );static void vfs_dir_set_property ( GObject *obj,                                   guint prop_id,                                   const GValue *value,                                   GParamSpec *pspec );static void vfs_dir_get_property ( GObject *obj,                                   guint prop_id,                                   GValue *value,                                   GParamSpec *pspec );static void vfs_dir_load( VFSDir* dir, const char* path );static gpointer vfs_dir_load_thread( VFSDir* dir );static void vfs_dir_file_created( VFSDir* dir, const VFSFileInfo* file );static void vfs_dir_file_deleted( VFSDir* dir, const VFSFileInfo* file );static void vfs_dir_file_changed( VFSDir* dir, const VFSFileInfo* file );static void vfs_dir_monitor_callback( VFSFileMonitor* fm,                                      VFSFileMonitorEvent event,                                      const char* file_name,                                      gpointer user_data );static gboolean vfs_dir_call_state_callback( VFSDir* dir );static gpointer load_thumbnail_thread( gpointer user_data );static gboolean on_thumbnail_idle( VFSDir* dir );static void on_mime_type_reload( gpointer user_data );enum {    FILE_CREATED_SIGNAL = 0,    FILE_DELETED_SIGNAL,    FILE_CHANGED_SIGNAL,    N_SIGNALS};static guint signals[ N_SIGNALS ] = { 0 };static GObjectClass *parent_class = NULL;static GHashTable* dir_hash = NULL;static int xdg_mime_cb_id = 0;static guint change_notify_timeout = 0;struct VFSDirStateCallbackEnt{    VFSDirStateCallback func;    gpointer user_data;    int stage;};enum{    LOAD_BIG_THUMBNAIL,    LOAD_SMALL_THUMBNAIL,    N_LOAD_TYPES};typedef struct _ThumbnailRequest{    int n_requests[ N_LOAD_TYPES ];    VFSFileInfo* file;}ThumbnailRequest;GType vfs_dir_get_type(){    static GType type = G_TYPE_INVALID;    if ( G_UNLIKELY ( type == G_TYPE_INVALID ) )    {        static const GTypeInfo info =            {                sizeof ( VFSDirClass ),                NULL,                NULL,                ( GClassInitFunc ) vfs_dir_class_init,                NULL,                NULL,                sizeof ( VFSDir ),                0,                ( GInstanceInitFunc ) vfs_dir_init,                NULL,            };        type = g_type_register_static ( G_TYPE_OBJECT, "VFSDir", &info, 0 );    }    return type;}void vfs_dir_class_init( VFSDirClass* klass ){    GObjectClass * object_class;    object_class = ( GObjectClass * ) klass;    parent_class = g_type_class_peek_parent ( klass );    object_class->set_property = vfs_dir_set_property;    object_class->get_property = vfs_dir_get_property;    object_class->finalize = vfs_dir_finalize;    /* signals */    klass->file_created = vfs_dir_file_created;    klass->file_deleted = vfs_dir_file_deleted;    klass->file_changed = vfs_dir_file_changed;    /*    * file-created is emitted when there is a new file created in the dir.    * The param is VFSFileInfo of the newly created file.    */    signals[ FILE_CREATED_SIGNAL ] =        g_signal_new ( "file-created",                       G_TYPE_FROM_CLASS ( klass ),                       G_SIGNAL_RUN_LAST,                       G_STRUCT_OFFSET ( VFSDirClass, file_created ),                       NULL, NULL,                       g_cclosure_marshal_VOID__POINTER,                       G_TYPE_NONE, 1, G_TYPE_POINTER );    /*    * file-deleted is emitted when there is a file deleted in the dir.    * The param is VFSFileInfo of the newly created file.    */    signals[ FILE_DELETED_SIGNAL ] =        g_signal_new ( "file-deleted",                       G_TYPE_FROM_CLASS ( klass ),                       G_SIGNAL_RUN_LAST,                       G_STRUCT_OFFSET ( VFSDirClass, file_deleted ),                       NULL, NULL,                       g_cclosure_marshal_VOID__POINTER,                       G_TYPE_NONE, 1, G_TYPE_POINTER );    /*    * file-changed is emitted when there is a file changed in the dir.    * The param is VFSFileInfo of the newly created file.    */    signals[ FILE_CHANGED_SIGNAL ] =        g_signal_new ( "file-changed",                       G_TYPE_FROM_CLASS ( klass ),                       G_SIGNAL_RUN_LAST,                       G_STRUCT_OFFSET ( VFSDirClass, file_changed ),                       NULL, NULL,                       g_cclosure_marshal_VOID__POINTER,                       G_TYPE_NONE, 1, G_TYPE_POINTER );}/* constructor */void vfs_dir_init( VFSDir* dir ){    dir->mutex = g_mutex_new();}/* destructor */static void vfs_dir_clear( VFSDir* dir ){    ThumbnailRequest * req;    GList* l;    if ( dir->monitor )    {        vfs_file_monitor_remove( dir->monitor,                                 vfs_dir_monitor_callback,                                 dir );    }    if ( dir->path )    {        g_hash_table_remove( dir_hash, dir->path );        /* There is no VFSDir instance */        if ( 0 == g_hash_table_size( dir_hash ) )        {            g_hash_table_destroy( dir_hash );            dir_hash = NULL;            xdg_mime_remove_callback( xdg_mime_cb_id );            xdg_mime_cb_id = 0;            if( change_notify_timeout )            {                g_source_remove( change_notify_timeout );                change_notify_timeout = 0;            }        }        g_free( dir->path );        g_free( dir->disp_path );    }    if ( dir->thumbnail_mutex )    {        g_mutex_lock( dir->thumbnail_mutex );        if ( dir->loaded_thumbnails )        {            for ( l = dir->loaded_thumbnails; l ;l = l->next )            {                req = l->data;                vfs_file_info_unref( req->file );                g_slice_free( ThumbnailRequest, req );            }            g_list_free( dir->loaded_thumbnails );            dir->loaded_thumbnails = NULL;        }        if ( dir->thumbnail_requests )        {            while ( req = ( ThumbnailRequest* ) g_queue_pop_head( dir->thumbnail_requests ) )            {                vfs_file_info_unref( req->file );                g_slice_free( ThumbnailRequest, req );            }            g_mutex_unlock( dir->thumbnail_mutex );            if ( dir->thumbnail_thread )            {                g_cond_wait( dir->thumbnail_cond, dir->thumbnail_mutex );            }            g_cond_free( dir->thumbnail_cond );            dir->thumbnail_cond = NULL;        }        else        {            g_mutex_unlock( dir->thumbnail_mutex );        }        if ( dir->thumbnail_idle )        {            g_source_remove( dir->thumbnail_idle );            dir->thumbnail_idle = 0;        }        g_mutex_free( dir->thumbnail_mutex );        dir->thumbnail_mutex = NULL;    }    if ( dir->file_list )    {        g_list_foreach( dir->file_list, ( GFunc ) vfs_file_info_unref, NULL );        g_list_free( dir->file_list );        dir->file_list = NULL;        dir->n_files = 0;    }    if( dir->changed_files )    {        g_slist_foreach( dir->changed_files, (GFunc)vfs_file_info_unref, NULL );        g_slist_free( dir->changed_files );         dir->changed_files = NULL;    }}void vfs_dir_finalize( GObject *obj ){    VFSDir * dir = VFS_DIR( obj );    do{}    while( g_source_remove_by_user_data( dir ) );    vfs_dir_clear( dir );    G_OBJECT_CLASS( parent_class ) ->finalize( obj );}void vfs_dir_get_property ( GObject *obj,                            guint prop_id,                            GValue *value,                            GParamSpec *pspec ){}void vfs_dir_set_property ( GObject *obj,                            guint prop_id,                            const GValue *value,                            GParamSpec *pspec ){}/* signal handlers */void vfs_dir_file_created( VFSDir* dir, const VFSFileInfo* file ){}void vfs_dir_file_deleted( VFSDir* dir, const VFSFileInfo* file ){}void vfs_dir_file_changed( VFSDir* dir, const VFSFileInfo* file ){}/* methods */VFSDir* vfs_dir_new(){    VFSDir * dir;    dir = ( VFSDir* ) g_object_new( VFS_TYPE_DIR, NULL );    return dir;}void vfs_dir_load( VFSDir* dir, const char* path ){    GSList * l;    struct VFSDirStateCallbackEnt* ent;    if ( path )    {        vfs_dir_clear( dir );        dir->path = g_strdup( path );        dir->disp_path = g_filename_display_name( path );        for ( l = dir->state_callback_list; l; l = l->next )        {            ent = ( struct VFSDirStateCallbackEnt* ) l->data;            ent->stage = 0;        }        dir->thread = g_thread_create( ( GThreadFunc ) vfs_dir_load_thread,                                       dir, FALSE, NULL );    }}static gboolean is_dir_desktop( const char* path ){    static int len_home_dir = 0;    static const char* home_dir;    gboolean is_desktop = FALSE;    if( G_UNLIKELY( 0 == len_home_dir ) )    {        home_dir = g_get_home_dir();        len_home_dir = strlen( home_dir );    }    if( 0 == strncmp( path, home_dir, len_home_dir) )    {        if( path[len_home_dir] == '/' &&            G_UNLIKELY(0 == strcmp(path+len_home_dir+1, "Desktop")))            return TRUE;    }    return FALSE;}gpointer vfs_dir_load_thread( VFSDir* dir ){    const gchar * file_name;    char* full_path;    GDir* dir_content;    VFSFileInfo* file;    GList* l;    gboolean is_desktop;    dir->file_listed = 0;    dir->load_complete = 0;    if ( dir->path )    {        /* Install file alteration monitor */        dir->monitor = vfs_file_monitor_add( dir->path,                                             vfs_dir_monitor_callback,                                             dir );        dir_content = g_dir_open( dir->path, 0, NULL );        if ( dir_content )        {            is_desktop = is_dir_desktop( dir->path );            while ( !dir->cancel && ( file_name = g_dir_read_name( dir_content ) ) )            {                full_path = g_build_filename( dir->path, file_name, NULL );                if ( !full_path )                    continue;                file = vfs_file_info_new();                if ( vfs_file_info_get( file, full_path, file_name ) )                {                    g_mutex_lock( dir->mutex );                    /* Special processing for desktop folder */                    if( G_UNLIKELY(is_desktop) )                        vfs_file_info_load_special_info( file, full_path );                    dir->file_list = g_list_prepend( dir->file_list, file );                    g_mutex_unlock( dir->mutex );                    ++dir->n_files;                }                else                {                    vfs_file_info_unref( file );                }                g_free( full_path );            }            g_dir_close( dir_content );        }        dir->file_listed = 1;        //        dir->load_notify = g_idle_add(        //                               ( GSourceFunc ) vfs_dir_call_state_callback, dir );        /* FIXME: load thumbnails and do some time-consuming tasks here */        dir->load_complete = 1;        dir->load_notify = g_idle_add(                               ( GSourceFunc ) vfs_dir_call_state_callback, dir );    }    return NULL;}gboolean vfs_dir_is_loading( VFSDir* dir ){    return dir->thread ? TRUE : FALSE;}void vfs_cancel_load( VFSDir* dir ){    dir->cancel = TRUE;    if ( dir->thread )    {        g_thread_join( dir->thread );        dir->thread = NULL;    }}GList* vfs_dir_find_file( VFSDir* dir, const char* file_name ){    GList * l;    VFSFileInfo* file;    for ( l = dir->file_list; l; l = l->next )    {        file = ( VFSFileInfo* ) l->data;        if ( file->name && 0 == strcmp( file->name, file_name ) )        {            return l;        }    }    return NULL;}static gboolean update_file_info( VFSDir* dir, VFSFileInfo* file ){    char* full_path;    char* file_name;    gboolean ret;    gboolean is_desktop = is_dir_desktop(dir->path);    /* FIXME: Dirty hack: steal the string to prevent memory allocation */    file_name = file->name;    if( file->name == file->disp_name )        file->disp_name = NULL;    file->name = NULL;    full_path = g_build_filename( dir->path, file_name, NULL );    if ( G_LIKELY( full_path ) )    {        if( G_LIKELY( vfs_file_info_get( file, full_path, file_name ) ) )        {            ret = TRUE;            if( G_UNLIKELY(is_desktop) )                vfs_file_info_load_special_info( file, full_path );        }        else /* The file doesn't exist */        {            GList* l;            l = g_list_find( dir->file_list, file );            if( G_UNLIKELY(l) )

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色一情一乱一乱一91av| 国产精品女主播av| 久久久久久久久久久99999| 国产日韩在线不卡| 亚洲精品亚洲人成人网| 免费成人在线影院| 99re这里只有精品视频首页| 欧美日韩亚洲高清一区二区| 欧美成人a在线| 中文字幕一区二区三区色视频 | 亚洲欧美在线视频观看| 午夜精品免费在线观看| 国产成人超碰人人澡人人澡| 在线观看国产日韩| 久久久久久久久久久久电影| 一级女性全黄久久生活片免费| 国产乱码精品一区二区三区忘忧草 | 国产精品久久久久aaaa樱花| 亚洲视频网在线直播| 亚洲图片欧美色图| 成人av电影观看| 欧美三片在线视频观看| 中文一区二区完整视频在线观看| 日韩国产精品91| 色综合久久中文综合久久97| 久久久久久久久久久久电影| 偷窥少妇高潮呻吟av久久免费| 成人美女在线观看| 久久精品视频一区二区三区| 亚洲国产日韩一级| 成人h动漫精品一区二区| 日韩三级在线观看| 免费人成黄页网站在线一区二区| 色综合中文综合网| 亚洲国产va精品久久久不卡综合| 国产精品一二三在| 亚洲精品一区二区三区蜜桃下载 | 一区二区免费视频| 一本一道波多野结衣一区二区 | 婷婷一区二区三区| 制服丝袜中文字幕一区| 日本中文在线一区| 久久先锋影音av鲁色资源网| 国产精品一区久久久久| xnxx国产精品| 成人午夜电影网站| 亚洲精品菠萝久久久久久久| 91国产福利在线| 日韩和欧美一区二区三区| 欧美一区永久视频免费观看| 蜜臀av性久久久久蜜臀av麻豆| 日韩一级免费观看| 大桥未久av一区二区三区中文| 亚洲免费av观看| 在线成人av网站| 久久99久久精品欧美| 欧美韩国日本不卡| 欧美色窝79yyyycom| 美腿丝袜亚洲一区| 国产综合久久久久久鬼色| 欧美高清在线视频| 欧美日韩精品欧美日韩精品| 久草这里只有精品视频| 中文字幕一区二区三区四区不卡| 欧美日韩国产成人在线免费| 国产成人一级电影| 亚洲bt欧美bt精品777| 久久久久一区二区三区四区| 欧洲精品一区二区| 欧美一级在线免费| 一本到一区二区三区| 狠狠色狠狠色综合日日91app| 亚洲欧美日韩国产一区二区三区 | 久久99在线观看| 午夜精品久久久| 亚洲综合丁香婷婷六月香| 日本精品裸体写真集在线观看 | 亚洲精品在线免费观看视频| 91久久精品网| 处破女av一区二区| 卡一卡二国产精品| 五月婷婷激情综合| 亚洲一区二区av在线| 国产精品久久久久久久久图文区| 精品国内二区三区| 日韩小视频在线观看专区| 69堂国产成人免费视频| 欧美日韩国产美| 欧美在线观看视频在线| 91一区二区三区在线观看| 国产福利不卡视频| 成人激情文学综合网| 国产成人在线观看免费网站| 国产精品2024| 成人福利视频在线看| 激情av综合网| 国产不卡在线视频| 成人精品一区二区三区中文字幕| 国产成人精品三级麻豆| 国产成人免费av在线| 成人黄色网址在线观看| 99综合电影在线视频| 91在线精品一区二区| 欧美性猛交xxxxxxxx| 欧美一级免费观看| 国产亚洲成av人在线观看导航| 一区免费观看视频| 性久久久久久久| 国产精品一色哟哟哟| 欧美制服丝袜第一页| 欧美一级高清大全免费观看| 久久久www成人免费无遮挡大片 | 在线免费不卡视频| 欧美一级在线观看| 1000精品久久久久久久久| 天堂成人国产精品一区| 国产高清精品网站| 91精品一区二区三区久久久久久| 日本一区二区综合亚洲| 一区二区三区四区激情| 精品一区二区av| 色呦呦一区二区三区| 日韩美女视频在线| 亚洲一区二区三区自拍| 狠狠色狠狠色综合| 欧美剧情电影在线观看完整版免费励志电影 | 国产91精品久久久久久久网曝门 | 99国产精品久| 2021久久国产精品不只是精品| 自拍偷拍欧美激情| 国产乱子轮精品视频| 678五月天丁香亚洲综合网| 亚洲欧美综合网| 国产美女在线精品| 亚洲超碰精品一区二区| 91国产成人在线| 亚洲欧洲成人自拍| 成人激情小说乱人伦| 久久久国产精华| 国产综合久久久久久鬼色| 欧美电影免费观看高清完整版 | 精品卡一卡二卡三卡四在线| 日韩理论电影院| 99精品欧美一区二区三区小说| 久久久久国产精品麻豆| 国产99久久久国产精品潘金| 亚洲精品一线二线三线| 麻豆精品视频在线| 91精品国产一区二区三区蜜臀| 亚洲少妇30p| 一本大道久久a久久精品综合| 综合久久给合久久狠狠狠97色 | 日韩一区和二区| 理论电影国产精品| 亚洲欧美日韩一区| 337p日本欧洲亚洲大胆精品| 丁香激情综合国产| 18欧美亚洲精品| 91精品欧美综合在线观看最新 | 色呦呦国产精品| 丝袜亚洲精品中文字幕一区| 欧美日韩国产高清一区二区三区| 男男成人高潮片免费网站| 26uuu亚洲综合色欧美| av成人老司机| 日韩高清一区在线| 亚洲私人影院在线观看| 91麻豆精品国产91久久久久 | 日韩一级欧美一级| 91色porny| 国产成人8x视频一区二区| 亚洲国产中文字幕在线视频综合| 精品国产凹凸成av人导航| 波多野结衣中文字幕一区| 偷窥国产亚洲免费视频| 国产精品免费视频观看| 欧美精品第一页| 成人免费毛片嘿嘿连载视频| 另类专区欧美蜜桃臀第一页| 亚洲人成伊人成综合网小说| 日韩欧美国产不卡| 欧美日本在线视频| 日本丶国产丶欧美色综合| av在线不卡电影| 成人免费毛片aaaaa**| 一区二区免费看| 国产精品视频在线看| 国产欧美一区二区精品性色| 日韩视频一区二区在线观看| 91 com成人网| 欧美变态tickling挠脚心| 欧美变态tickling挠脚心| 欧美成人一区二区三区片免费| 日韩欧美中文一区| 欧美日韩一区三区四区| 99re这里只有精品6| 9色porny自拍视频一区二区| 国产精品69久久久久水密桃| 九九九精品视频| 国产精品亚洲午夜一区二区三区|