~ubuntu-branches/ubuntu/hardy/gnome-commander/hardy

« back to all changes in this revision

Viewing changes to src/ls_colors.c

  • Committer: Bazaar Package Importer
  • Author(s): Michael Vogt
  • Date: 2006-06-13 15:39:48 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20060613153948-gvrt3mb2ddk5u62o
Tags: 1.2.0-3
added --disable-scrollkeeper on build

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
    GNOME Commander - A GNOME based file manager 
 
2
    GNOME Commander - A GNOME based file manager
3
3
    Copyright (C) 2001-2006 Marcus Bjurman
4
4
 
5
5
    This program is free software; you can redistribute it and/or modify
15
15
    You should have received a copy of the GNU General Public License
16
16
    along with this program; if not, write to the Free Software
17
17
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 
*/ 
 
18
*/
19
19
 
20
20
#include "gnome-cmd-includes.h"
21
21
#include "ls_colors.h"
48
48
*/
49
49
static GdkColor *
50
50
code2color (gint code) {
51
 
        switch (code) {
52
 
                case 30: return &black;
53
 
                case 31: return &red;
54
 
                case 32: return &green;
55
 
                case 33: return &yellow;
56
 
                case 34: return &blue;
57
 
                case 35: return &magenta;
58
 
                case 36: return &cyan;
59
 
                case 37: return &white;
60
 
 
61
 
                case 40: return &black;
62
 
                case 41: return &red;
63
 
                case 42: return &green;
64
 
                case 43: return &yellow;
65
 
                case 44: return &blue;
66
 
                case 45: return &magenta;
67
 
                case 46: return &cyan;
68
 
                case 47: return &white;
69
 
        }
70
 
 
71
 
        return NULL;
 
51
    switch (code) {
 
52
        case 30: return &black;
 
53
        case 31: return &red;
 
54
        case 32: return &green;
 
55
        case 33: return &yellow;
 
56
        case 34: return &blue;
 
57
        case 35: return &magenta;
 
58
        case 36: return &cyan;
 
59
        case 37: return &white;
 
60
 
 
61
        case 40: return &black;
 
62
        case 41: return &red;
 
63
        case 42: return &green;
 
64
        case 43: return &yellow;
 
65
        case 44: return &blue;
 
66
        case 45: return &magenta;
 
67
        case 46: return &cyan;
 
68
        case 47: return &white;
 
69
    }
 
70
 
 
71
    return NULL;
72
72
}
73
73
 
74
74
 
75
75
static LsColor *
76
76
ext_color (gchar *key, gchar *val)
77
77
{
78
 
        int i, ret, n[3];
79
 
        LsColor *col;
80
 
 
81
 
        ret = sscanf (val, "%d;%d;%d", &n[0], &n[1], &n[2]);
82
 
        if (ret < 1)
83
 
                return NULL;
84
 
 
85
 
        do {key++;} while (key[0] == '.');
86
 
        col = g_new (LsColor, 1);
87
 
        col->type = GNOME_VFS_FILE_TYPE_REGULAR;
88
 
        col->ext = g_strdup (key);
89
 
        col->fg = NULL;
90
 
        col->bg = NULL;
91
 
        
92
 
        for ( i=0 ; i<ret ; i++ ) {
93
 
                if (n[i] >= 30 && n[i] <= 37)
94
 
                        col->fg = code2color (n[i]);
95
 
                else if (n[i] >= 40 && n[i] <= 47)
96
 
                        col->bg = code2color (n[i]);
97
 
        }
98
 
 
99
 
        return col;
 
78
    int i, ret, n[3];
 
79
    LsColor *col;
 
80
 
 
81
    ret = sscanf (val, "%d;%d;%d", &n[0], &n[1], &n[2]);
 
82
    if (ret < 1)
 
83
        return NULL;
 
84
 
 
85
    do {key++;} while (key[0] == '.');
 
86
    col = g_new (LsColor, 1);
 
87
    col->type = GNOME_VFS_FILE_TYPE_REGULAR;
 
88
    col->ext = g_strdup (key);
 
89
    col->fg = NULL;
 
90
    col->bg = NULL;
 
91
 
 
92
    for ( i=0 ; i<ret ; i++ ) {
 
93
        if (n[i] >= 30 && n[i] <= 37)
 
94
            col->fg = code2color (n[i]);
 
95
        else if (n[i] >= 40 && n[i] <= 47)
 
96
            col->bg = code2color (n[i]);
 
97
    }
 
98
 
 
99
    return col;
100
100
}
101
101
 
102
102
 
103
103
static LsColor *
104
104
type_color (gchar *key, gchar *val)
105
105
{
106
 
        int i, ret, n[3];
107
 
        LsColor *col = g_new (LsColor, 1);
108
 
        col->ext = NULL;
109
 
        col->fg = NULL;
110
 
        col->bg = NULL;
111
 
 
112
 
        if (strcmp (key, "fi") == 0)
113
 
                col->type = GNOME_VFS_FILE_TYPE_REGULAR;
114
 
        else if (strcmp (key, "di") == 0)
115
 
                col->type = GNOME_VFS_FILE_TYPE_DIRECTORY;
116
 
        else if (strcmp (key, "pi") == 0)
117
 
                col->type = GNOME_VFS_FILE_TYPE_FIFO;
118
 
        else if (strcmp (key, "so") == 0)
119
 
                col->type = GNOME_VFS_FILE_TYPE_SOCKET;
120
 
        else if (strcmp (key, "bd") == 0)
121
 
                col->type = GNOME_VFS_FILE_TYPE_BLOCK_DEVICE;
122
 
        else if (strcmp (key, "cd") == 0)
123
 
                col->type = GNOME_VFS_FILE_TYPE_CHARACTER_DEVICE;
124
 
        else if (strcmp (key, "ln") == 0)
125
 
                col->type = GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK;
126
 
        else {
127
 
                g_free (col);
128
 
                return NULL;
129
 
        }
130
 
 
131
 
        ret = sscanf (val, "%d;%d;%d", &n[0], &n[1], &n[2]);
132
 
        for ( i=0 ; i<ret ; i++ ) {
133
 
                if (n[i] >= 30 && n[i] <= 37)
134
 
                        col->fg = code2color (n[i]);
135
 
                else if (n[i] >= 40 && n[i] <= 47)
136
 
                        col->bg = code2color (n[i]);
137
 
        }
138
 
 
139
 
        return col;
 
106
    int i, ret, n[3];
 
107
    LsColor *col = g_new (LsColor, 1);
 
108
    col->ext = NULL;
 
109
    col->fg = NULL;
 
110
    col->bg = NULL;
 
111
 
 
112
    if (strcmp (key, "fi") == 0)
 
113
        col->type = GNOME_VFS_FILE_TYPE_REGULAR;
 
114
    else if (strcmp (key, "di") == 0)
 
115
        col->type = GNOME_VFS_FILE_TYPE_DIRECTORY;
 
116
    else if (strcmp (key, "pi") == 0)
 
117
        col->type = GNOME_VFS_FILE_TYPE_FIFO;
 
118
    else if (strcmp (key, "so") == 0)
 
119
        col->type = GNOME_VFS_FILE_TYPE_SOCKET;
 
120
    else if (strcmp (key, "bd") == 0)
 
121
        col->type = GNOME_VFS_FILE_TYPE_BLOCK_DEVICE;
 
122
    else if (strcmp (key, "cd") == 0)
 
123
        col->type = GNOME_VFS_FILE_TYPE_CHARACTER_DEVICE;
 
124
    else if (strcmp (key, "ln") == 0)
 
125
        col->type = GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK;
 
126
    else {
 
127
        g_free (col);
 
128
        return NULL;
 
129
    }
 
130
 
 
131
    ret = sscanf (val, "%d;%d;%d", &n[0], &n[1], &n[2]);
 
132
    for ( i=0 ; i<ret ; i++ ) {
 
133
        if (n[i] >= 30 && n[i] <= 37)
 
134
            col->fg = code2color (n[i]);
 
135
        else if (n[i] >= 40 && n[i] <= 47)
 
136
            col->bg = code2color (n[i]);
 
137
    }
 
138
 
 
139
    return col;
140
140
}
141
141
 
142
142
 
143
143
static LsColor *
144
144
create_color (gchar *ls_color)
145
 
{       
146
 
        gchar **s, *key, *val;
147
 
        LsColor *col = NULL;
148
 
 
149
 
        s = g_strsplit (ls_color, "=", 0);
150
 
        key = s[0];
 
145
{
 
146
    gchar **s, *key, *val;
 
147
    LsColor *col = NULL;
 
148
 
 
149
    s = g_strsplit (ls_color, "=", 0);
 
150
    key = s[0];
 
151
 
 
152
    if (key) {
151
153
        val = s[1];
152
 
 
153
 
        if (key) {
154
 
                if (key[0] == '*')
155
 
                        col = ext_color (key, val);
156
 
                else    
157
 
                        col = type_color (key, val);
158
 
        }
159
 
 
160
 
        g_strfreev (s);
161
 
        return col;
 
154
        if (key[0] == '*')
 
155
            col = ext_color (key, val);
 
156
        else
 
157
            col = type_color (key, val);
 
158
    }
 
159
 
 
160
    g_strfreev (s);
 
161
    return col;
162
162
}
163
163
 
164
164
 
165
165
static void
166
166
init (gchar *ls_colors)
167
167
{
168
 
        gint i=0;
169
 
        gchar **ents;
170
 
 
171
 
        ents = g_strsplit (ls_colors, ":", 0);
172
 
 
173
 
        if (!ents) return;
174
 
 
175
 
        while (ents[i]) {
176
 
                LsColor *col;
177
 
                col = create_color (ents[i]);
178
 
                if (col) {
179
 
                        if (col->ext)
180
 
                                g_hash_table_insert (map, col->ext, col);
181
 
                        else
182
 
                                type_colors[col->type] = col;
183
 
                }
184
 
                i++;
185
 
        }
186
 
 
187
 
        g_strfreev (ents);
 
168
    gint i=0;
 
169
    gchar **ents;
 
170
 
 
171
    ents = g_strsplit (ls_colors, ":", 0);
 
172
 
 
173
    if (!ents) return;
 
174
 
 
175
    while (ents[i]) {
 
176
        LsColor *col;
 
177
        col = create_color (ents[i]);
 
178
        if (col) {
 
179
            if (col->ext)
 
180
                g_hash_table_insert (map, col->ext, col);
 
181
            else
 
182
                type_colors[col->type] = col;
 
183
        }
 
184
        i++;
 
185
    }
 
186
 
 
187
    g_strfreev (ents);
188
188
}
189
189
 
190
190
 
191
191
void ls_colors_init (void)
192
192
{
193
 
        gchar *s = getenv ("LS_COLORS");
194
 
        if (!s)
195
 
                s = DEFAULT_COLORS;
196
 
        
197
 
        map = g_hash_table_new (g_str_hash, g_str_equal);
198
 
        init (s);
 
193
    gchar *s = getenv ("LS_COLORS");
 
194
    if (!s)
 
195
        s = DEFAULT_COLORS;
 
196
 
 
197
    map = g_hash_table_new (g_str_hash, g_str_equal);
 
198
    init (s);
199
199
}
200
200
 
201
201
 
202
202
LsColor *ls_colors_get (GnomeCmdFile *finfo)
203
203
{
204
 
        const gchar *ext;
205
 
        LsColor *col = NULL;
206
 
 
207
 
        if (finfo->info->symlink_name)
208
 
                return type_colors[GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK];
209
 
 
210
 
        ext = gnome_cmd_file_get_extension (finfo);
211
 
        if (ext)
212
 
                col = g_hash_table_lookup (map, ext);
213
 
 
214
 
        if (!col)
215
 
                col = type_colors[finfo->info->type];
216
 
 
217
 
        return col;
 
204
    const gchar *ext;
 
205
    LsColor *col = NULL;
 
206
 
 
207
    if (finfo->info->symlink_name)
 
208
        return type_colors[GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK];
 
209
 
 
210
    ext = gnome_cmd_file_get_extension (finfo);
 
211
    if (ext)
 
212
        col = g_hash_table_lookup (map, ext);
 
213
 
 
214
    if (!col)
 
215
        col = type_colors[finfo->info->type];
 
216
 
 
217
    return col;
218
218
}
219
 
 
220