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

📄 ptk-bookmarks.c

📁 台湾人开发的Linux下的文件管理器
💻 C
字号:
/**  C Implementation: ptkbookmarks** Description:*** Author: Hong Jen Yee (PCMan) <pcman.tw (AT) gmail.com>, (C) 2006** Copyright: See COPYING file that comes with this distribution**/#include "ptk-bookmarks.h"#include <stdio.h>#include <string.h>const char bookmarks_file_name[] = ".gtk-bookmarks";static PtkBookmarks bookmarks = {0};typedef struct{    GFunc callback;    gpointer user_data;}BookmarksCallback;/* Notify all callbacks that the bookmarks are changed. */static void ptk_bookmarks_notify(){    BookmarksCallback* cb;    int i;    /* Call the callback functions set by the user */    if( bookmarks.callbacks && bookmarks.callbacks->len )    {        cb = (BookmarksCallback*)bookmarks.callbacks->data;        for( i = 0; i < bookmarks.callbacks->len; ++i )        {            cb[i].callback( &bookmarks, cb[i].user_data );        }    }}/*  Get a self-maintained list of bookmarks  This is read from "~/.gtk-bookmarks".*/PtkBookmarks* ptk_bookmarks_get (){    FILE* file;    gchar* path;    gchar* upath;    gchar* uri;    gchar* item;    gchar* name;    gchar* basename;    char line[1024];    gsize name_len, upath_len;    if( 0 == bookmarks.n_ref )    {        path = g_build_filename( g_get_home_dir(), bookmarks_file_name, NULL );        file = fopen( path, "r" );        g_free( path );        if( file )        {            while( fgets( line, sizeof(line), file ) )            {                /* Every line is an URI containing no space charactetrs                   with its name appended (optional) */                uri = strtok( line, " \r\n" );                if( ! uri || !*uri )                    continue;                path = g_filename_from_uri(uri, NULL, NULL);                if( path )                {                    upath = g_filename_to_utf8(path, -1, NULL, &upath_len, NULL);                    g_free( path );                    if( upath )                    {                        name = strtok( NULL, "\r\n" );                        if( name )                        {                            name_len = strlen( name );                            basename = NULL;                        }                        else                        {                            name = basename = g_path_get_basename( upath );                            name_len = strlen( basename );                        }                        item = ptk_bookmarks_item_new( name, name_len,                                                       upath, upath_len );                        bookmarks.list = g_list_append( bookmarks.list,                                                        item );                        g_free(upath);                        g_free( basename );                    }                }            }            fclose( file );        }    }    ++bookmarks.n_ref;    return &bookmarks;}/*  Replace the content of the bookmarks with new_list.  PtkBookmarks will then owns new_list, and hence  new_list shouldn't be freed after this function is called.*/void ptk_bookmarks_set ( GList* new_list ){    g_list_foreach( bookmarks.list, (GFunc)g_free, NULL );    g_list_free( bookmarks.list );    bookmarks.list = new_list;    ptk_bookmarks_notify();}/* Insert an item into bookmarks */void ptk_bookmarks_insert ( const char* name, const char* path, gint pos ){    char* item;    item = ptk_bookmarks_item_new(name, strlen(name), path, strlen(path));    bookmarks.list = g_list_insert( bookmarks.list,                                    item, pos );    ptk_bookmarks_notify();}/* Append an item into bookmarks */void ptk_bookmarks_append ( const char* name, const char* path ){    char* item;    item = ptk_bookmarks_item_new(name, strlen(name), path, strlen(path));    bookmarks.list = g_list_append( bookmarks.list,                                    item );    ptk_bookmarks_notify();}static GList* find_item( const char* path ){    GList* l;    char* item;    char* item_path;    int len;    for( l = bookmarks.list; l; l = l->next )    {        item = (char*)l->data;        len = strlen( item );        item_path = item + len + 1;        if( 0 == strcmp( path, item_path ) )            break;    }    return l;}/* find an item from bookmarks */void ptk_bookmarks_remove ( const char* path ){    GList* l;    if( (l = find_item( path )) )    {        g_free( l->data );        bookmarks.list = g_list_delete_link( bookmarks.list, l );        ptk_bookmarks_notify();    }}void ptk_bookmarks_rename ( const char* path, const char* new_name ){    GList* l;    char* item;    if( path && new_name && (l = find_item( path )) )    {        item = ptk_bookmarks_item_new(new_name, strlen(new_name),                                      path, strlen(path));        g_free( l->data );        l->data = item;        ptk_bookmarks_notify();    }}static void ptk_bookmarks_save_item( GList* l, FILE* file ){    gchar* item;    const gchar* upath;    int len;    char* uri;    char* path;    item = (char*)l->data;    upath = ptk_bookmarks_item_get_path( item );    path = g_filename_from_utf8( upath, -1, NULL, NULL, NULL );    if( path )    {        uri = g_filename_to_uri( path, NULL, NULL );        g_free( path );        if( uri )        {            fprintf( file, "%s %s\n", uri, item );            g_free( uri );        }    }}/* Save the content of the bookmarks to "~/.gtk-bookmarks" */void ptk_bookmarks_save (){    FILE* file;    gchar* path;    GList* l;    path = g_build_filename( g_get_home_dir(), bookmarks_file_name, NULL );    file = fopen( path, "w" );    g_free( path );    if( file )    {        for( l = bookmarks.list; l; l = l->next )        {            ptk_bookmarks_save_item( l, file );        }        fclose( file );    }}/* Add a callback which gets called when the content of bookmarks changed */void ptk_bookmarks_add_callback ( GFunc callback, gpointer user_data ){    BookmarksCallback cb;    cb.callback = callback;    cb.user_data = user_data;    if( !bookmarks.callbacks )    {        bookmarks.callbacks = g_array_new (FALSE, FALSE, sizeof(BookmarksCallback));    }    bookmarks.callbacks = g_array_append_val( bookmarks.callbacks, cb );}/* Remove a callback added by ptk_bookmarks_add_callback */void ptk_bookmarks_remove_callback ( GFunc callback, gpointer user_data ){    BookmarksCallback* cb = (BookmarksCallback*)bookmarks.callbacks->data;    int i;    if( bookmarks.callbacks )    {        for(i = 0; i < bookmarks.callbacks->len; ++i )        {            if( cb[i].callback == callback && cb[i].user_data == user_data )            {                bookmarks.callbacks = g_array_remove_index_fast ( bookmarks.callbacks, i );                break;            }        }    }}void ptk_bookmarks_unref (){    --bookmarks.n_ref;    if( bookmarks.n_ref <= 0 )    {        bookmarks.n_ref = 0;        if( bookmarks.list )        {            g_list_foreach( bookmarks.list, (GFunc)g_free, NULL );            g_list_free( bookmarks.list );            bookmarks.list = NULL;        }        if( bookmarks.callbacks )        {            g_array_free(bookmarks.callbacks, TRUE);            bookmarks.callbacks = NULL;        }    }}/** Create a new bookmark item.* name: displayed name of the bookmark item.* name_len: length of name;* upath: dir path of the bookmark item encoded in UTF-8.* upath_len: length of upath;* Returned value is a newly allocated string.*/gchar* ptk_bookmarks_item_new( const gchar* name, gsize name_len,                               const gchar* upath, gsize upath_len ){    char* buf;    ++name_len; /* include terminating null */    ++upath_len; /* include terminating null */    buf = g_new( char, name_len + upath_len );    memcpy( buf, name, name_len );    memcpy( buf + name_len, upath, upath_len );    return buf;}/** item: bookmark item* Returned value: dir path of the bookmark item. (int utf-8)*/const gchar* ptk_bookmarks_item_get_path( const gchar* item ){    int name_len = strlen(item);    return (item + name_len + 1);}

⌨️ 快捷键说明

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