@@ -25,55 +25,79 @@ enum {
25
25
BUFED_ALL_VISIBLE = 1
26
26
};
27
27
28
+ static int bufed_signature ;
29
+
28
30
typedef struct BufedState {
31
+ void * signature ;
29
32
StringArray items ;
30
33
int flags ;
31
34
int last_index ;
32
35
} BufedState ;
33
36
34
37
static ModeDef bufed_mode ;
35
38
39
+ static BufedState * bufed_get_state (EditState * s )
40
+ {
41
+ BufedState * bs = s -> b -> priv_data ;
42
+
43
+ if (bs && bs -> signature == & bufed_signature )
44
+ return bs ;
45
+
46
+ put_status (s , "Not a bufed buffer" );
47
+ return NULL ;
48
+ }
49
+
36
50
static void build_bufed_list (EditState * s )
37
51
{
38
52
QEmacsState * qs = s -> qe_state ;
39
53
EditBuffer * b ;
40
- BufedState * hs ;
54
+ BufedState * bs ;
41
55
int last_index = list_get_pos (s );
42
- int i , flags ;
56
+ int i ;
43
57
44
- hs = s -> mode_data ;
58
+ if (!(bs = bufed_get_state (s )))
59
+ return ;
45
60
46
- free_strings (& hs -> items );
61
+ free_strings (& bs -> items );
47
62
for (b = qs -> first_buffer ; b != NULL ; b = b -> next ) {
48
- if (!(b -> flags & BF_SYSTEM ) || (hs -> flags & BUFED_ALL_VISIBLE ))
49
- add_string (& hs -> items , b -> name );
63
+ if (!(b -> flags & BF_SYSTEM ) || (bs -> flags & BUFED_ALL_VISIBLE ))
64
+ add_string (& bs -> items , b -> name );
50
65
}
51
66
52
67
/* build buffer */
53
68
b = s -> b ;
54
- flags = b -> flags ;
55
69
b -> flags &= ~BF_READONLY ;
56
70
eb_delete (b , 0 , b -> total_size );
57
- for (i = 0 ; i < hs -> items .nb_items ; i ++ ) {
58
- EditBuffer * b1 = eb_find (hs -> items .items [i ]-> str );
71
+
72
+ for (i = 0 ; i < bs -> items .nb_items ; i ++ ) {
73
+ EditBuffer * b1 = eb_find (bs -> items .items [i ]-> str );
59
74
char flags [4 ];
60
75
char * flagp = flags ;
61
76
77
+ if (i == last_index ) {
78
+ s -> offset = b -> total_size ;
79
+ }
62
80
if (b1 ) {
63
81
if (b1 -> modified )
64
82
* flagp ++ = '*' ;
65
83
if (b1 -> flags & BF_READONLY )
66
84
* flagp ++ = '%' ;
67
85
}
68
86
* flagp = '\0' ;
69
- eb_printf (b , " %-2s%-16s" , flags , hs -> items .items [i ]-> str );
87
+ eb_printf (b , " %-2s%-16s" , flags , bs -> items .items [i ]-> str );
70
88
if (b1 ) {
71
89
char path [MAX_FILENAME_SIZE ];
72
90
const char * mode_name ;
73
91
EditState * e ;
74
92
93
+ if (b1 -> saved_mode ) {
94
+ mode_name = b1 -> saved_mode -> name ;
95
+ } else
75
96
if (b1 -> saved_data ) {
76
97
mode_name = b1 -> saved_data -> mode -> name ;
98
+ } else
99
+ if (b1 -> default_mode ) {
100
+ mode_name = b1 -> default_mode -> name ;
77
101
} else {
78
102
mode_name = "none" ;
79
103
for (e = qs -> first_window ; e != NULL ; e = e -> next_window ) {
@@ -93,15 +117,18 @@ static void build_bufed_list(EditState *s)
93
117
}
94
118
eb_printf (b , "\n" );
95
119
}
96
- b -> flags = flags ;
97
- s -> offset = eb_goto_pos ( s -> b , last_index , 0 ) ;
120
+ b -> modified = 0 ;
121
+ b -> flags |= BF_READONLY ;
98
122
}
99
123
100
124
static EditBuffer * bufed_get_buffer (EditState * s )
101
125
{
102
- BufedState * bs = s -> mode_data ;
126
+ BufedState * bs ;
103
127
int index ;
104
128
129
+ if (!(bs = bufed_get_state (s )))
130
+ return NULL ;
131
+
105
132
index = list_get_pos (s );
106
133
if (index < 0 || index >= bs -> items .nb_items )
107
134
return NULL ;
@@ -111,12 +138,15 @@ static EditBuffer *bufed_get_buffer(EditState *s)
111
138
112
139
static void bufed_select (EditState * s , int temp )
113
140
{
114
- BufedState * bs = s -> mode_data ;
141
+ BufedState * bs ;
115
142
StringItem * item ;
116
143
EditBuffer * b ;
117
144
EditState * e ;
118
145
int index ;
119
146
147
+ if (!(bs = bufed_get_state (s )))
148
+ return ;
149
+
120
150
index = list_get_pos (s );
121
151
if (index < 0 || index >= bs -> items .nb_items )
122
152
return ;
@@ -137,7 +167,7 @@ static void bufed_select(EditState *s, int temp)
137
167
return ;
138
168
}
139
169
if (e ) {
140
- /* delete dired window */
170
+ /* delete bufed window */
141
171
do_delete_window (s , 1 );
142
172
switch_to_buffer (e , b );
143
173
} else {
@@ -175,13 +205,20 @@ static void string_selection_iterate(StringArray *cs,
175
205
static void bufed_kill_item (void * opaque , StringItem * item )
176
206
{
177
207
EditState * s = opaque ;
178
- do_kill_buffer (s , item -> str );
208
+
209
+ /* XXX: avoid killing buffer list by mistake */
210
+ if (strcmp (s -> b -> name , item -> str ))
211
+ do_kill_buffer (s , item -> str );
179
212
}
180
213
181
214
static void bufed_kill_buffer (EditState * s )
182
215
{
183
- BufedState * hs = s -> mode_data ;
184
- string_selection_iterate (& hs -> items , list_get_pos (s ),
216
+ BufedState * bs ;
217
+
218
+ if (!(bs = bufed_get_state (s )))
219
+ return ;
220
+
221
+ string_selection_iterate (& bs -> items , list_get_pos (s ),
185
222
bufed_kill_item , s );
186
223
build_bufed_list (s );
187
224
}
@@ -209,7 +246,9 @@ static void do_list_buffers(EditState *s, int argval)
209
246
e = insert_window_left (b , width , WF_MODELINE );
210
247
edit_set_mode (e , & bufed_mode );
211
248
212
- bs = e -> mode_data ;
249
+ if (!(bs = bufed_get_state (e )))
250
+ return ;
251
+
213
252
if (argval != NO_ARG ) {
214
253
bs -> flags |= BUFED_ALL_VISIBLE ;
215
254
build_bufed_list (e );
@@ -257,7 +296,10 @@ static void bufed_toggle_read_only(EditState *s)
257
296
258
297
static void bufed_refresh (EditState * s , int toggle )
259
298
{
260
- BufedState * bs = s -> mode_data ;
299
+ BufedState * bs ;
300
+
301
+ if (!(bs = bufed_get_state (s )))
302
+ return ;
261
303
262
304
if (toggle )
263
305
bs -> flags ^= BUFED_ALL_VISIBLE ;
@@ -274,21 +316,57 @@ static void bufed_display_hook(EditState *s)
274
316
bufed_select (s , 1 );
275
317
}
276
318
319
+ static int bufed_mode_probe (ModeDef * mode , ModeProbeData * p )
320
+ {
321
+ if (p -> b -> priv_data ) {
322
+ BufedState * bs = p -> b -> priv_data ;
323
+ if (bs -> signature == & bufed_signature )
324
+ return 95 ;
325
+ else
326
+ return 0 ;
327
+ }
328
+ return 0 ;
329
+ }
330
+
331
+ static void bufed_close (EditBuffer * b )
332
+ {
333
+ BufedState * bs = b -> priv_data ;
334
+
335
+ if (bs ) {
336
+ free_strings (& bs -> items );
337
+ }
338
+
339
+ qe_free (& b -> priv_data );
340
+ }
341
+
277
342
static int bufed_mode_init (EditState * s , ModeSavedData * saved_data )
278
343
{
344
+ BufedState * bs ;
345
+
279
346
list_mode .mode_init (s , saved_data );
280
347
281
- build_bufed_list (s );
348
+ if (s -> b -> priv_data ) {
349
+ bs = s -> b -> priv_data ;
350
+ if (bs -> signature != & bufed_signature )
351
+ return -1 ;
352
+ } else {
353
+ /* XXX: should be allocated by buffer_load API */
354
+ bs = qe_mallocz (BufedState );
355
+ if (!bs )
356
+ return -1 ;
357
+
358
+ bs -> signature = & bufed_signature ;
359
+ s -> b -> priv_data = bs ;
360
+ s -> b -> close = bufed_close ;
282
361
362
+ /* XXX: should be built by buffer_load API */
363
+ build_bufed_list (s );
364
+ }
283
365
return 0 ;
284
366
}
285
367
286
368
static void bufed_mode_close (EditState * s )
287
369
{
288
- BufedState * bs = s -> mode_data ;
289
-
290
- free_strings (& bs -> items );
291
-
292
370
list_mode .mode_close (s );
293
371
}
294
372
@@ -315,7 +393,7 @@ static CmdDef bufed_commands[] = {
315
393
"previous-line" , do_up_down , -1 )
316
394
CMD1 ( 'r' , 'g' ,
317
395
"bufed-refresh" , bufed_refresh , 0 )
318
- CMD0 ( 'k' , KEY_F8 ,
396
+ CMD0 ( 'k' , 'd' ,
319
397
"bufed-kill-buffer" , bufed_kill_buffer )
320
398
CMD_DEF_END ,
321
399
};
@@ -332,7 +410,7 @@ static int bufed_init(void)
332
410
/* CG: assuming list_mode already initialized ? */
333
411
memcpy (& bufed_mode , & list_mode , sizeof (ModeDef ));
334
412
bufed_mode .name = "bufed" ;
335
- bufed_mode .instance_size = sizeof ( BufedState ) ;
413
+ bufed_mode .mode_probe = bufed_mode_probe ;
336
414
bufed_mode .mode_init = bufed_mode_init ;
337
415
bufed_mode .mode_close = bufed_mode_close ;
338
416
/* CG: not a good idea, display hook has side effect on layout */
0 commit comments