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

📄 file-properties.c

📁 台湾人开发的Linux下的文件管理器
💻 C
📖 第 1 页 / 共 2 页
字号:
        gtk_widget_destroy( lookup_widget( dlg, "open_with_label" ) );    }    else /* Add available actions to the option menu */    {        GtkTreeIter it;        char **action, **actions;        mime = vfs_file_info_get_mime_type( file );        actions = vfs_mime_type_get_actions( mime );        GtkCellRenderer* renderer;        GtkListStore* model;        gtk_cell_layout_clear( GTK_CELL_LAYOUT(open_with) );        renderer = gtk_cell_renderer_pixbuf_new();        gtk_cell_layout_pack_start( GTK_CELL_LAYOUT(open_with), renderer, FALSE);        gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT(open_with), renderer,                                        "pixbuf", 0, NULL );        renderer = gtk_cell_renderer_text_new();        gtk_cell_layout_pack_start( GTK_CELL_LAYOUT(open_with), renderer, TRUE);        gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT(open_with),renderer,                                        "text", 1, NULL );        model = gtk_list_store_new( 3, GDK_TYPE_PIXBUF,                                    G_TYPE_STRING,                                    G_TYPE_STRING,                                    G_TYPE_STRING );        if( actions )        {            for( action = actions; *action; ++action )            {                VFSAppDesktop* desktop;                GdkPixbuf* icon;                desktop = vfs_app_desktop_new( *action );                gtk_list_store_append( model, &it );                icon = vfs_app_desktop_get_icon(desktop, 20);                gtk_list_store_set( model, &it,                                    0, icon,                                    1, vfs_app_desktop_get_disp_name(desktop),                                    2, *action, -1 );                if( icon )                    gdk_pixbuf_unref( icon );                vfs_app_desktop_unref( desktop );            }        }        else        {            g_object_set_data( open_with, "prev_sel", GINT_TO_POINTER(-1) );        }        /* separator */        gtk_list_store_append( model, &it );        gtk_list_store_append( model, &it );        gtk_list_store_set( model, &it,                            0, NULL,                            1, _("Other program..."), -1 );        gtk_combo_box_set_model( GTK_COMBO_BOX(open_with),                                 GTK_TREE_MODEL(model) );        gtk_combo_box_set_row_separator_func(                GTK_COMBO_BOX(open_with), combo_sep,                NULL, NULL );        gtk_combo_box_set_active(GTK_COMBO_BOX(open_with), 0);        g_signal_connect( open_with, "changed",                          on_combo_change, mime );        /* vfs_mime_type_unref( mime ); */        /* We can unref mime when combo box gets destroyed */        g_object_weak_ref( G_OBJECT(open_with),                           (GWeakNotify)vfs_mime_type_unref, mime );    }    /* Multiple files are selected */    if ( sel_files && sel_files->next )    {        gtk_widget_set_sensitive( name, FALSE );        gtk_entry_set_text( GTK_ENTRY( name ), multiple_files );        gtk_label_set_text( GTK_LABEL( mtime ), multiple_files );        gtk_label_set_text( GTK_LABEL( atime ), multiple_files );        for ( i = 0; i < N_CHMOD_ACTIONS; ++i )        {            gtk_toggle_button_set_inconsistent ( data->chmod_btns[ i ], TRUE );            data->chmod_states[ i ] = 2;            g_signal_connect( G_OBJECT( data->chmod_btns[ i ] ), "toggled",                              G_CALLBACK( on_chmod_btn_toggled ), data );        }    }    else    {        gtk_editable_set_editable ( GTK_EDITABLE( name ), FALSE );        gtk_entry_set_text( GTK_ENTRY( name ),                            vfs_file_info_get_disp_name( file ) );        if ( ! vfs_file_info_is_dir( file ) )        {            /* Only single "file" is selected, so we don't need to                caculate total file size */            need_calc_size = FALSE;            sprintf( buf, "%s  (%llu Bytes)",                     vfs_file_info_get_disp_size( file ),                     ( guint64 ) vfs_file_info_get_size( file ) );            gtk_label_set_text( data->total_size_label, buf );            file_size_to_string( buf2,                                 vfs_file_info_get_blocks( file ) * 512 );            sprintf( buf, "%s  (%llu Bytes)", buf2,                     ( guint64 ) vfs_file_info_get_blocks( file ) * 512 );            gtk_label_set_text( data->size_on_disk_label, buf );        }        gtk_label_set_text( GTK_LABEL( mtime ),                            vfs_file_info_get_disp_mtime( file ) );        strftime( buf, sizeof( buf ),                  time_format, localtime( vfs_file_info_get_atime( file ) ) );        gtk_label_set_text( GTK_LABEL( atime ), buf );        owner_group = vfs_file_info_get_disp_owner( file );        tmp = strchr( owner_group, ':' );        data->owner_name = g_strndup( owner_group, tmp - owner_group );        gtk_entry_set_text( GTK_ENTRY( data->owner ), data->owner_name );        data->group_name = g_strdup( tmp + 1 );        gtk_entry_set_text( GTK_ENTRY( data->group ), data->group_name );        for ( i = 0; i < N_CHMOD_ACTIONS; ++i )        {            if ( data->chmod_btns[ i ] != 2 )            {                data->chmod_states[ i ] = ( vfs_file_info_get_mode( file ) & chmod_flags[ i ] ? 1 : 0 );                gtk_toggle_button_set_active( data->chmod_btns[ i ], data->chmod_states[ i ] );            }        }    }    if ( need_calc_size )    {        /* The total file size displayed in "File Properties" is not           completely calculated yet. So "Calculating..." is displayed. */        calculating = _( "Calculating..." );        gtk_label_set_text( data->total_size_label, calculating );        gtk_label_set_text( data->size_on_disk_label, calculating );        g_object_set_data( G_OBJECT( dlg ), "calc_size", data );        data->calc_size_thread = g_thread_create ( ( GThreadFunc ) calc_size,                                                   data, TRUE, NULL );        data->update_label_timer = g_timeout_add( 250,                                                  ( GSourceFunc ) on_update_labels,                                                  data );    }    return dlg;}static uid_t uid_from_name( const char* user_name ){    struct passwd * pw;    uid_t uid = -1;    const char* p;    pw = getpwnam( user_name );    if ( pw )    {        uid = pw->pw_uid;    }    else    {        uid = 0;        for ( p = user_name; *p; ++p )        {            if ( !g_ascii_isdigit( *p ) )                return -1;            uid *= 10;            uid += ( *p - '0' );        }#if 0 /* This is not needed */        /* Check the existance */        pw = getpwuid( uid );        if ( !pw )     /* Invalid uid */            return -1;#endif    }    return uid;}gid_t gid_from_name( const char* group_name ){    struct group * grp;    gid_t gid = -1;    const char* p;    grp = getgrnam( group_name );    if ( grp )    {        gid = grp->gr_gid;    }    else    {        gid = 0;        for ( p = group_name; *p; ++p )        {            if ( !g_ascii_isdigit( *p ) )                return -1;            gid *= 10;            gid += ( *p - '0' );        }#if 0 /* This is not needed */        /* Check the existance */        grp = getgrgid( gid );        if ( !grp )     /* Invalid gid */            return -1;#endif    }    return gid;}voidon_filePropertiesDlg_response ( GtkDialog *dialog,                                gint response_id,                                gpointer user_data ){    FilePropertiesDialogData * data;    PtkFileTask* task;    gboolean mod_change;    uid_t uid = -1;    gid_t gid = -1;    const char* owner_name;    const char* group_name;    guchar* chmod_actions;    int i;    GList* l;    GList* file_list;    char* file_path;    GtkWidget* ask_recursive;    VFSFileInfo* file;    data = ( FilePropertiesDialogData* ) g_object_get_data( G_OBJECT( dialog ),                                                            "DialogData" );    if ( data )    {        if ( data->update_label_timer )            g_source_remove( data->update_label_timer );        data->cancel = TRUE;        if ( data->calc_size_thread )            g_thread_join( data->calc_size_thread );        if ( response_id == GTK_RESPONSE_OK )        {            GtkWidget* open_with;            /* Set default action for mimetype */            if( open_with = lookup_widget( GTK_WIDGET(dialog), "open_with" ) )            {                GtkTreeModel* model = gtk_combo_box_get_model( GTK_COMBO_BOX(open_with) );                GtkTreeIter it;                if( model && gtk_combo_box_get_active_iter( GTK_COMBO_BOX(open_with), &it ) )                {                    char* action;                    gtk_tree_model_get( model, &it, 2, &action, -1 );                    if( action )                    {                        file = ( VFSFileInfo* ) data->file_list->data;                        VFSMimeType* mime = vfs_file_info_get_mime_type( file );                        vfs_mime_type_set_default_action( mime, action );                        vfs_mime_type_unref( mime );                        g_free( action );                    }                }            }            /* Check if we need chown */            owner_name = gtk_entry_get_text( data->owner );            if ( owner_name && *owner_name &&                 (!data->owner_name || strcmp( owner_name, data->owner_name )) )            {                uid = uid_from_name( owner_name );                if ( uid == -1 )                {                    ptk_show_error( GTK_WINDOW( dialog ), _( "Invalid User" ) );                    return ;                }            }            group_name = gtk_entry_get_text( data->group );            if ( group_name && *group_name &&                  (!data->group_name || strcmp( group_name, data->group_name )) )            {                gid = gid_from_name( group_name );                if ( gid == -1 )                {                    ptk_show_error( GTK_WINDOW( dialog ), _( "Invalid Group" ) );                    return ;                }            }            for ( i = 0; i < N_CHMOD_ACTIONS; ++i )            {                if ( gtk_toggle_button_get_inconsistent( data->chmod_btns[ i ] ) )                {                    data->chmod_states[ i ] = 2;  /* Don't touch this bit */                }                else if ( data->chmod_states[ i ] != gtk_toggle_button_get_active( data->chmod_btns[ i ] ) )                {                    mod_change = TRUE;                    data->chmod_states[ i ] = gtk_toggle_button_get_active( data->chmod_btns[ i ] );                }                else /* Don't change this bit */                {                    data->chmod_states[ i ] = 2;                }            }            if ( uid != -1 || gid != -1 || mod_change )            {                file_list = NULL;                for ( l = data->file_list; l; l = l->next )                {                    file = ( VFSFileInfo* ) l->data;                    file_path = g_build_filename( data->dir_path,                            vfs_file_info_get_name( file ), NULL );                    file_list = g_list_prepend( file_list, file_path );                }                task = ptk_file_task_new( VFS_FILE_TASK_CHMOD_CHOWN,                                          file_list,                                          NULL,                                          GTK_WINDOW(gtk_widget_get_parent( GTK_WIDGET( dialog ) )) );                for ( l = data->file_list; l; l = l->next )                {                    file = ( VFSFileInfo* ) l->data;                    if ( vfs_file_info_is_dir( file ) )                    {                        ask_recursive = gtk_message_dialog_new(                                            GTK_WINDOW( data->dlg ),                                            GTK_DIALOG_MODAL,                                            GTK_MESSAGE_QUESTION,                                            GTK_BUTTONS_YES_NO,                                            _( "Do you want to recursively apply these changes to all files and sub-folders?" ) );                        ptk_file_task_set_recursive( task,                                ( GTK_RESPONSE_YES == gtk_dialog_run( GTK_DIALOG( ask_recursive ) ) ) );                        gtk_widget_destroy( ask_recursive );                        break;                    }                }                if ( mod_change )                {                     /* If the permissions of file has been changed by the user */                    ptk_file_task_set_chmod( task, data->chmod_states );                }                /* For chown */                ptk_file_task_set_chown( task, uid, gid );                ptk_file_task_run( task );                /*                * This file list will be freed by file operation, so we don't                * need to do this. Just set the pointer to NULL.                */                data->file_list = NULL;            }        }        g_free( data->owner_name );        g_free( data->group_name );        /*         *NOTE: File operation chmod/chown will free the list when it's done,         *and we only need to free it when there is no file operation applyed.        */        g_slice_free( FilePropertiesDialogData, data );    }    gtk_widget_destroy( GTK_WIDGET( dialog ) );}

⌨️ 快捷键说明

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