| |
1 The Mutt "sidebar" patch as taken over by Debian for Mutt 1.5.21 |
| |
2 but with the patches for Makefile.in applied again. |
| |
3 |
| |
4 Index: Makefile.am |
| |
5 --- Makefile.am.orig 2010-08-24 18:34:21.000000000 +0200 |
| |
6 +++ Makefile.am 2011-01-17 19:33:57.000000000 +0100 |
| |
7 @@ -33,7 +33,7 @@ |
| |
8 score.c send.c sendlib.c signal.c sort.c \ |
| |
9 status.c system.c thread.c charset.c history.c lib.c \ |
| |
10 muttlib.c editmsg.c mbyte.c \ |
| |
11 - url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c |
| |
12 + url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c sidebar.c |
| |
13 |
| |
14 nodist_mutt_SOURCES = $(BUILT_SOURCES) |
| |
15 |
| |
16 Index: Makefile.in |
| |
17 --- Makefile.in.orig 2010-08-25 18:31:48.000000000 +0200 |
| |
18 +++ Makefile.in 2011-01-17 19:33:57.000000000 +0100 |
| |
19 @@ -85,7 +85,7 @@ |
| |
20 system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ |
| |
21 history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ |
| |
22 editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ |
| |
23 - ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) |
| |
24 + ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) sidebar.$(OBJEXT) |
| |
25 am__objects_1 = |
| |
26 am__objects_2 = patchlist.$(OBJEXT) $(am__objects_1) |
| |
27 nodist_mutt_OBJECTS = $(am__objects_2) |
| |
28 @@ -359,7 +359,7 @@ |
| |
29 score.c send.c sendlib.c signal.c sort.c \ |
| |
30 status.c system.c thread.c charset.c history.c lib.c \ |
| |
31 muttlib.c editmsg.c mbyte.c \ |
| |
32 - url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c |
| |
33 + url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c sidebar.c |
| |
34 |
| |
35 nodist_mutt_SOURCES = $(BUILT_SOURCES) |
| |
36 mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \ |
| |
37 @@ -391,7 +391,7 @@ |
| |
38 README.SSL smime.h group.h \ |
| |
39 muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ |
| |
40 ChangeLog mkchangelog.sh mutt_idna.h \ |
| |
41 - snprintf.c regex.c crypt-gpgme.h hcachever.sh.in |
| |
42 + snprintf.c regex.c crypt-gpgme.h sidebar.h hcachever.sh.in |
| |
43 |
| |
44 EXTRA_SCRIPTS = smime_keys |
| |
45 mutt_dotlock_SOURCES = mutt_dotlock.c |
| |
46 Index: OPS |
| |
47 --- OPS.orig 2010-03-01 18:56:19.000000000 +0100 |
| |
48 +++ OPS 2011-01-17 19:33:15.000000000 +0100 |
| |
49 @@ -179,3 +179,8 @@ |
| |
50 OP_MAIN_SHOW_LIMIT "show currently active limit pattern" |
| |
51 OP_MAIN_COLLAPSE_THREAD "collapse/uncollapse current thread" |
| |
52 OP_MAIN_COLLAPSE_ALL "collapse/uncollapse all threads" |
| |
53 +OP_SIDEBAR_SCROLL_UP "scroll the mailbox pane up 1 page" |
| |
54 +OP_SIDEBAR_SCROLL_DOWN "scroll the mailbox pane down 1 page" |
| |
55 +OP_SIDEBAR_NEXT "go down to next mailbox" |
| |
56 +OP_SIDEBAR_PREV "go to previous mailbox" |
| |
57 +OP_SIDEBAR_OPEN "open hilighted mailbox" |
| |
58 Index: buffy.c |
| |
59 --- buffy.c.orig 2010-09-13 19:19:55.000000000 +0200 |
| |
60 +++ buffy.c 2011-01-17 19:33:15.000000000 +0100 |
| |
61 @@ -312,6 +312,10 @@ |
| |
62 return 0; |
| |
63 } |
| |
64 |
| |
65 + mailbox->msgcount = 0; |
| |
66 + mailbox->msg_unread = 0; |
| |
67 + mailbox->msg_flagged = 0; |
| |
68 + |
| |
69 while ((de = readdir (dirp)) != NULL) |
| |
70 { |
| |
71 if (*de->d_name == '.') |
| |
72 @@ -329,7 +333,9 @@ |
| |
73 continue; |
| |
74 } |
| |
75 /* one new and undeleted message is enough */ |
| |
76 - mailbox->new = 1; |
| |
77 + mailbox->has_new = mailbox->new = 1; |
| |
78 + mailbox->msgcount++; |
| |
79 + mailbox->msg_unread++; |
| |
80 rc = 1; |
| |
81 break; |
| |
82 } |
| |
83 @@ -337,6 +343,32 @@ |
| |
84 |
| |
85 closedir (dirp); |
| |
86 |
| |
87 + /* |
| |
88 + * count read messages (for folderlist (sidebar) we also need to count |
| |
89 + * messages in cur so that we the total number of messages |
| |
90 + */ |
| |
91 + snprintf (path, sizeof (path), "%s/cur", mailbox->path); |
| |
92 + if ((dirp = opendir (path)) == NULL) |
| |
93 + { |
| |
94 + mailbox->magic = 0; |
| |
95 + } |
| |
96 + while ((de = readdir (dirp)) != NULL) |
| |
97 + { |
| |
98 + char *p; |
| |
99 + if (*de->d_name != '.') { |
| |
100 + if ((p = strstr (de->d_name, ":2,"))) { |
| |
101 + if (!strchr (p + 3, 'T')) { |
| |
102 + mailbox->msgcount++; |
| |
103 + if ( !strchr (p + 3, 'S')) |
| |
104 + mailbox->msg_unread++; |
| |
105 + if (strchr(p + 3, 'F')) |
| |
106 + mailbox->msg_flagged++; |
| |
107 + } |
| |
108 + } else |
| |
109 + mailbox->msgcount++; |
| |
110 + } |
| |
111 + } |
| |
112 + |
| |
113 return rc; |
| |
114 } |
| |
115 |
| |
116 @@ -345,14 +377,33 @@ |
| |
117 { |
| |
118 int rc = 0; |
| |
119 int statcheck; |
| |
120 + CONTEXT *ctx; |
| |
121 |
| |
122 if (option (OPTCHECKMBOXSIZE)) |
| |
123 statcheck = sb->st_size > mailbox->size; |
| |
124 else |
| |
125 statcheck = sb->st_mtime > sb->st_atime |
| |
126 || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime); |
| |
127 - if (statcheck) |
| |
128 + if (statcheck || mailbox->msgcount == 0) |
| |
129 { |
| |
130 + BUFFY b = *mailbox; |
| |
131 + int msgcount = 0; |
| |
132 + int msg_unread = 0; |
| |
133 + /* parse the mailbox, to see how much mail there is */ |
| |
134 + ctx = mx_open_mailbox( mailbox->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL); |
| |
135 + if(ctx) |
| |
136 + { |
| |
137 + msgcount = ctx->msgcount; |
| |
138 + msg_unread = ctx->unread; |
| |
139 + mx_close_mailbox(ctx, 0); |
| |
140 + } |
| |
141 + *mailbox = b; |
| |
142 + mailbox->msgcount = msgcount; |
| |
143 + mailbox->msg_unread = msg_unread; |
| |
144 + if(statcheck) |
| |
145 + { |
| |
146 + mailbox->has_new = mailbox->new = 1; |
| |
147 + } |
| |
148 if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited) |
| |
149 { |
| |
150 rc = 1; |
| |
151 @@ -374,9 +425,11 @@ |
| |
152 int mutt_buffy_check (int force) |
| |
153 { |
| |
154 BUFFY *tmp; |
| |
155 + struct dirent *de, *dp; |
| |
156 struct stat sb; |
| |
157 struct stat contex_sb; |
| |
158 time_t t; |
| |
159 + CONTEXT *ctx; |
| |
160 |
| |
161 sb.st_size=0; |
| |
162 contex_sb.st_dev=0; |
| |
163 @@ -456,6 +509,20 @@ |
| |
164 case M_MH: |
| |
165 if ((tmp->new = mh_buffy (tmp->path)) > 0) |
| |
166 BuffyCount++; |
| |
167 + |
| |
168 + if ((dp = opendir (tmp->path)) == NULL) |
| |
169 + break; |
| |
170 + tmp->msgcount = 0; |
| |
171 + while ((de = readdir (dp))) |
| |
172 + { |
| |
173 + if (mh_valid_message (de->d_name)) |
| |
174 + { |
| |
175 + tmp->msgcount++; |
| |
176 + tmp->has_new = tmp->new = 1; |
| |
177 + } |
| |
178 + } |
| |
179 + closedir (dp); |
| |
180 + |
| |
181 break; |
| |
182 } |
| |
183 } |
| |
184 Index: buffy.h |
| |
185 --- buffy.h.orig 2010-09-13 19:19:55.000000000 +0200 |
| |
186 +++ buffy.h 2011-01-17 19:33:15.000000000 +0100 |
| |
187 @@ -25,7 +25,12 @@ |
| |
188 char path[_POSIX_PATH_MAX]; |
| |
189 off_t size; |
| |
190 struct buffy_t *next; |
| |
191 + struct buffy_t *prev; |
| |
192 short new; /* mailbox has new mail */ |
| |
193 + short has_new; /* set it new if new and not read */ |
| |
194 + int msgcount; /* total number of messages */ |
| |
195 + int msg_unread; /* number of unread messages */ |
| |
196 + int msg_flagged; /* number of flagged messages */ |
| |
197 short notified; /* user has been notified */ |
| |
198 short magic; /* mailbox type */ |
| |
199 short newly_created; /* mbox or mmdf just popped into existence */ |
| |
200 Index: color.c |
| |
201 --- color.c.orig 2009-05-15 19:18:23.000000000 +0200 |
| |
202 +++ color.c 2011-01-17 19:33:15.000000000 +0100 |
| |
203 @@ -93,6 +93,8 @@ |
| |
204 { "bold", MT_COLOR_BOLD }, |
| |
205 { "underline", MT_COLOR_UNDERLINE }, |
| |
206 { "index", MT_COLOR_INDEX }, |
| |
207 + { "sidebar_new", MT_COLOR_NEW }, |
| |
208 + { "sidebar_flagged", MT_COLOR_FLAGGED }, |
| |
209 { NULL, 0 } |
| |
210 }; |
| |
211 |
| |
212 Index: compose.c |
| |
213 --- compose.c.orig 2010-04-14 20:50:19.000000000 +0200 |
| |
214 +++ compose.c 2011-01-17 19:33:15.000000000 +0100 |
| |
215 @@ -72,7 +72,7 @@ |
| |
216 |
| |
217 #define HDR_XOFFSET 10 |
| |
218 #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ |
| |
219 -#define W (COLS - HDR_XOFFSET) |
| |
220 +#define W (COLS - HDR_XOFFSET - SidebarWidth) |
| |
221 |
| |
222 static char *Prompts[] = |
| |
223 { |
| |
224 @@ -112,7 +112,7 @@ |
| |
225 { |
| |
226 int off = 0; |
| |
227 |
| |
228 - mvaddstr (HDR_CRYPT, 0, "Security: "); |
| |
229 + mvaddstr (HDR_CRYPT, SidebarWidth, "Security: "); |
| |
230 |
| |
231 if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) |
| |
232 { |
| |
233 @@ -144,7 +144,7 @@ |
| |
234 } |
| |
235 |
| |
236 clrtoeol (); |
| |
237 - move (HDR_CRYPTINFO, 0); |
| |
238 + move (HDR_CRYPTINFO, SidebarWidth); |
| |
239 clrtoeol (); |
| |
240 |
| |
241 if ((WithCrypto & APPLICATION_PGP) |
| |
242 @@ -161,7 +161,7 @@ |
| |
243 && (msg->security & ENCRYPT) |
| |
244 && SmimeCryptAlg |
| |
245 && *SmimeCryptAlg) { |
| |
246 - mvprintw (HDR_CRYPTINFO, 40, "%s%s", _("Encrypt with: "), |
| |
247 + mvprintw (HDR_CRYPTINFO, SidebarWidth + 40, "%s%s", _("Encrypt with: "), |
| |
248 NONULL(SmimeCryptAlg)); |
| |
249 off = 20; |
| |
250 } |
| |
251 @@ -175,7 +175,7 @@ |
| |
252 int c; |
| |
253 char *t; |
| |
254 |
| |
255 - mvaddstr (HDR_MIX, 0, " Mix: "); |
| |
256 + mvaddstr (HDR_MIX, SidebarWidth, " Mix: "); |
| |
257 |
| |
258 if (!chain) |
| |
259 { |
| |
260 @@ -190,7 +190,7 @@ |
| |
261 if (t && t[0] == '0' && t[1] == '\0') |
| |
262 t = "<random>"; |
| |
263 |
| |
264 - if (c + mutt_strlen (t) + 2 >= COLS) |
| |
265 + if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth) |
| |
266 break; |
| |
267 |
| |
268 addstr (NONULL(t)); |
| |
269 @@ -242,7 +242,7 @@ |
| |
270 |
| |
271 buf[0] = 0; |
| |
272 rfc822_write_address (buf, sizeof (buf), addr, 1); |
| |
273 - mvprintw (line, 0, TITLE_FMT, Prompts[line - 1]); |
| |
274 + mvprintw (line, SidebarWidth, TITLE_FMT, Prompts[line - 1]); |
| |
275 mutt_paddstr (W, buf); |
| |
276 } |
| |
277 |
| |
278 @@ -252,10 +252,10 @@ |
| |
279 draw_envelope_addr (HDR_TO, msg->env->to); |
| |
280 draw_envelope_addr (HDR_CC, msg->env->cc); |
| |
281 draw_envelope_addr (HDR_BCC, msg->env->bcc); |
| |
282 - mvprintw (HDR_SUBJECT, 0, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); |
| |
283 + mvprintw (HDR_SUBJECT, SidebarWidth, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); |
| |
284 mutt_paddstr (W, NONULL (msg->env->subject)); |
| |
285 draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to); |
| |
286 - mvprintw (HDR_FCC, 0, TITLE_FMT, Prompts[HDR_FCC - 1]); |
| |
287 + mvprintw (HDR_FCC, SidebarWidth, TITLE_FMT, Prompts[HDR_FCC - 1]); |
| |
288 mutt_paddstr (W, fcc); |
| |
289 |
| |
290 if (WithCrypto) |
| |
291 @@ -266,7 +266,7 @@ |
| |
292 #endif |
| |
293 |
| |
294 SETCOLOR (MT_COLOR_STATUS); |
| |
295 - mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments")); |
| |
296 + mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments")); |
| |
297 BKGDSET (MT_COLOR_STATUS); |
| |
298 clrtoeol (); |
| |
299 |
| |
300 @@ -304,7 +304,7 @@ |
| |
301 /* redraw the expanded list so the user can see the result */ |
| |
302 buf[0] = 0; |
| |
303 rfc822_write_address (buf, sizeof (buf), *addr, 1); |
| |
304 - move (line, HDR_XOFFSET); |
| |
305 + move (line, HDR_XOFFSET+SidebarWidth); |
| |
306 mutt_paddstr (W, buf); |
| |
307 |
| |
308 return 0; |
| |
309 @@ -549,7 +549,7 @@ |
| |
310 if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) |
| |
311 { |
| |
312 mutt_str_replace (&msg->env->subject, buf); |
| |
313 - move (HDR_SUBJECT, HDR_XOFFSET); |
| |
314 + move (HDR_SUBJECT, HDR_XOFFSET + SidebarWidth); |
| |
315 clrtoeol (); |
| |
316 if (msg->env->subject) |
| |
317 mutt_paddstr (W, msg->env->subject); |
| |
318 @@ -566,7 +566,7 @@ |
| |
319 { |
| |
320 strfcpy (fcc, buf, fcclen); |
| |
321 mutt_pretty_mailbox (fcc, fcclen); |
| |
322 - move (HDR_FCC, HDR_XOFFSET); |
| |
323 + move (HDR_FCC, HDR_XOFFSET + SidebarWidth); |
| |
324 mutt_paddstr (W, fcc); |
| |
325 fccSet = 1; |
| |
326 } |
| |
327 Index: curs_main.c |
| |
328 --- curs_main.c.orig 2010-09-13 19:19:55.000000000 +0200 |
| |
329 +++ curs_main.c 2011-01-17 19:33:15.000000000 +0100 |
| |
330 @@ -26,7 +26,9 @@ |
| |
331 #include "mailbox.h" |
| |
332 #include "mapping.h" |
| |
333 #include "sort.h" |
| |
334 +#include "buffy.h" |
| |
335 #include "mx.h" |
| |
336 +#include "sidebar.h" |
| |
337 |
| |
338 #ifdef USE_POP |
| |
339 #include "pop.h" |
| |
340 @@ -519,8 +521,12 @@ |
| |
341 menu->redraw |= REDRAW_STATUS; |
| |
342 if (do_buffy_notify) |
| |
343 { |
| |
344 - if (mutt_buffy_notify () && option (OPTBEEPNEW)) |
| |
345 - beep (); |
| |
346 + if (mutt_buffy_notify ()) |
| |
347 + { |
| |
348 + menu->redraw |= REDRAW_FULL; |
| |
349 + if (option (OPTBEEPNEW)) |
| |
350 + beep (); |
| |
351 + } |
| |
352 } |
| |
353 else |
| |
354 do_buffy_notify = 1; |
| |
355 @@ -532,6 +538,7 @@ |
| |
356 if (menu->redraw & REDRAW_FULL) |
| |
357 { |
| |
358 menu_redraw_full (menu); |
| |
359 + draw_sidebar(menu->menu); |
| |
360 mutt_show_error (); |
| |
361 } |
| |
362 |
| |
363 @@ -554,10 +561,13 @@ |
| |
364 |
| |
365 if (menu->redraw & REDRAW_STATUS) |
| |
366 { |
| |
367 + DrawFullLine = 1; |
| |
368 menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); |
| |
369 + DrawFullLine = 0; |
| |
370 CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES-2); |
| |
371 SETCOLOR (MT_COLOR_STATUS); |
| |
372 BKGDSET (MT_COLOR_STATUS); |
| |
373 + set_buffystats(Context); |
| |
374 mutt_paddstr (COLS, buf); |
| |
375 SETCOLOR (MT_COLOR_NORMAL); |
| |
376 BKGDSET (MT_COLOR_NORMAL); |
| |
377 @@ -571,7 +581,7 @@ |
| |
378 menu->oldcurrent = -1; |
| |
379 |
| |
380 if (option (OPTARROWCURSOR)) |
| |
381 - move (menu->current - menu->top + menu->offset, 2); |
| |
382 + move (menu->current - menu->top + menu->offset, SidebarWidth + 2); |
| |
383 else if (option (OPTBRAILLEFRIENDLY)) |
| |
384 move (menu->current - menu->top + menu->offset, 0); |
| |
385 else |
| |
386 @@ -1069,6 +1079,7 @@ |
| |
387 menu->redraw = REDRAW_FULL; |
| |
388 break; |
| |
389 |
| |
390 + case OP_SIDEBAR_OPEN: |
| |
391 case OP_MAIN_CHANGE_FOLDER: |
| |
392 case OP_MAIN_NEXT_UNREAD_MAILBOX: |
| |
393 |
| |
394 @@ -1100,7 +1111,11 @@ |
| |
395 { |
| |
396 mutt_buffy (buf, sizeof (buf)); |
| |
397 |
| |
398 - if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) |
| |
399 + if ( op == OP_SIDEBAR_OPEN ) { |
| |
400 + if(!CurBuffy) |
| |
401 + break; |
| |
402 + strncpy( buf, CurBuffy->path, sizeof(buf) ); |
| |
403 + } else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) |
| |
404 { |
| |
405 if (menu->menu == MENU_PAGER) |
| |
406 { |
| |
407 @@ -1118,6 +1133,7 @@ |
| |
408 } |
| |
409 |
| |
410 mutt_expand_path (buf, sizeof (buf)); |
| |
411 + set_curbuffy(buf); |
| |
412 if (mx_get_magic (buf) <= 0) |
| |
413 { |
| |
414 mutt_error (_("%s is not a mailbox."), buf); |
| |
415 @@ -2208,6 +2224,12 @@ |
| |
416 mutt_what_key(); |
| |
417 break; |
| |
418 |
| |
419 + case OP_SIDEBAR_SCROLL_UP: |
| |
420 + case OP_SIDEBAR_SCROLL_DOWN: |
| |
421 + case OP_SIDEBAR_NEXT: |
| |
422 + case OP_SIDEBAR_PREV: |
| |
423 + scroll_sidebar(op, menu->menu); |
| |
424 + break; |
| |
425 default: |
| |
426 if (menu->menu == MENU_MAIN) |
| |
427 km_error_key (MENU_MAIN); |
| |
428 Index: doc/Muttrc |
| |
429 --- doc/Muttrc.orig 2010-09-15 19:07:19.000000000 +0200 |
| |
430 +++ doc/Muttrc 2011-01-17 19:33:15.000000000 +0100 |
| |
431 @@ -657,6 +657,26 @@ |
| |
432 # $crypt_autosign, $crypt_replysign and $smime_is_default. |
| |
433 # |
| |
434 # |
| |
435 +# set sidebar_visible=no |
| |
436 +# |
| |
437 +# Name: sidebar_visible |
| |
438 +# Type: boolean |
| |
439 +# Default: no |
| |
440 +# |
| |
441 +# |
| |
442 +# This specifies whether or not to show sidebar (left-side list of folders). |
| |
443 +# |
| |
444 +# |
| |
445 +# set sidebar_width=0 |
| |
446 +# |
| |
447 +# Name: sidebar_width |
| |
448 +# Type: number |
| |
449 +# Default: 0 |
| |
450 +# |
| |
451 +# |
| |
452 +# The width of the sidebar. |
| |
453 +# |
| |
454 +# |
| |
455 # set crypt_autosign=no |
| |
456 # |
| |
457 # Name: crypt_autosign |
| |
458 Index: flags.c |
| |
459 --- flags.c.orig 2009-01-04 00:27:10.000000000 +0100 |
| |
460 +++ flags.c 2011-01-17 19:33:15.000000000 +0100 |
| |
461 @@ -22,8 +22,10 @@ |
| |
462 |
| |
463 #include "mutt.h" |
| |
464 #include "mutt_curses.h" |
| |
465 +#include "mutt_menu.h" |
| |
466 #include "sort.h" |
| |
467 #include "mx.h" |
| |
468 +#include "sidebar.h" |
| |
469 |
| |
470 void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx) |
| |
471 { |
| |
472 @@ -263,6 +265,7 @@ |
| |
473 */ |
| |
474 if (h->searched && (changed != h->changed || deleted != ctx->deleted || tagged != ctx->tagged || flagged != ctx->flagged)) |
| |
475 h->searched = 0; |
| |
476 + draw_sidebar(0); |
| |
477 } |
| |
478 |
| |
479 void mutt_tag_set_flag (int flag, int bf) |
| |
480 Index: functions.h |
| |
481 --- functions.h.orig 2010-08-24 18:34:21.000000000 +0200 |
| |
482 +++ functions.h 2011-01-17 19:33:15.000000000 +0100 |
| |
483 @@ -169,6 +169,11 @@ |
| |
484 { "decrypt-save", OP_DECRYPT_SAVE, NULL }, |
| |
485 |
| |
486 |
| |
487 + { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, |
| |
488 + { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, |
| |
489 + { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, |
| |
490 + { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, |
| |
491 + { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, |
| |
492 { NULL, 0, NULL } |
| |
493 }; |
| |
494 |
| |
495 @@ -272,6 +277,11 @@ |
| |
496 |
| |
497 { "what-key", OP_WHAT_KEY, NULL }, |
| |
498 |
| |
499 + { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, |
| |
500 + { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, |
| |
501 + { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, |
| |
502 + { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, |
| |
503 + { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, |
| |
504 { NULL, 0, NULL } |
| |
505 }; |
| |
506 |
| |
507 Index: globals.h |
| |
508 --- globals.h.orig 2009-08-25 21:08:52.000000000 +0200 |
| |
509 +++ globals.h 2011-01-17 19:33:15.000000000 +0100 |
| |
510 @@ -117,6 +117,7 @@ |
| |
511 WHERE char *SendCharset; |
| |
512 WHERE char *Sendmail; |
| |
513 WHERE char *Shell; |
| |
514 +WHERE char *SidebarDelim; |
| |
515 WHERE char *Signature; |
| |
516 WHERE char *SimpleSearch; |
| |
517 #if USE_SMTP |
| |
518 @@ -207,6 +208,9 @@ |
| |
519 WHERE short ScoreThresholdRead; |
| |
520 WHERE short ScoreThresholdFlag; |
| |
521 |
| |
522 +WHERE struct buffy_t *CurBuffy INITVAL(0); |
| |
523 +WHERE short DrawFullLine INITVAL(0); |
| |
524 +WHERE short SidebarWidth; |
| |
525 #ifdef USE_IMAP |
| |
526 WHERE short ImapKeepalive; |
| |
527 WHERE short ImapPipelineDepth; |
| |
528 Index: imap/command.c |
| |
529 --- imap/command.c.orig 2010-09-15 17:39:31.000000000 +0200 |
| |
530 +++ imap/command.c 2011-01-17 19:33:15.000000000 +0100 |
| |
531 @@ -1011,6 +1011,13 @@ |
| |
532 opened */ |
| |
533 status->uidnext = oldun; |
| |
534 |
| |
535 + /* Added to make the sidebar show the correct numbers */ |
| |
536 + if (status->messages) |
| |
537 + { |
| |
538 + inc->msgcount = status->messages; |
| |
539 + inc->msg_unread = status->unseen; |
| |
540 + } |
| |
541 + |
| |
542 FREE (&value); |
| |
543 return; |
| |
544 } |
| |
545 Index: imap/imap.c |
| |
546 --- imap/imap.c.orig 2009-08-25 21:08:52.000000000 +0200 |
| |
547 +++ imap/imap.c 2011-01-17 19:33:15.000000000 +0100 |
| |
548 @@ -1521,7 +1521,7 @@ |
| |
549 |
| |
550 imap_munge_mbox_name (munged, sizeof (munged), name); |
| |
551 snprintf (command, sizeof (command), |
| |
552 - "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged); |
| |
553 + "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged); |
| |
554 |
| |
555 if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) |
| |
556 { |
| |
557 Index: init.h |
| |
558 --- init.h.orig 2010-09-15 17:39:31.000000000 +0200 |
| |
559 +++ init.h 2011-01-17 19:33:15.000000000 +0100 |
| |
560 @@ -1953,6 +1953,22 @@ |
| |
561 ** not used. |
| |
562 ** (PGP only) |
| |
563 */ |
| |
564 + {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, "|"}, |
| |
565 + /* |
| |
566 + ** .pp |
| |
567 + ** This specifies the delimiter between the sidebar (if visible) and |
| |
568 + ** other screens. |
| |
569 + */ |
| |
570 + { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 }, |
| |
571 + /* |
| |
572 + ** .pp |
| |
573 + ** This specifies whether or not to show sidebar (left-side list of folders). |
| |
574 + */ |
| |
575 + { "sidebar_width", DT_NUM, R_BOTH, UL &SidebarWidth, 0 }, |
| |
576 + /* |
| |
577 + ** .pp |
| |
578 + ** The width of the sidebar. |
| |
579 + */ |
| |
580 { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0}, |
| |
581 /* |
| |
582 ** .pp |
| |
583 Index: mailbox.h |
| |
584 --- mailbox.h.orig 2009-04-30 19:33:48.000000000 +0200 |
| |
585 +++ mailbox.h 2011-01-17 19:33:15.000000000 +0100 |
| |
586 @@ -27,6 +27,7 @@ |
| |
587 #define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses |
| |
588 * safe_fopen() for mbox-style folders. |
| |
589 */ |
| |
590 +#define M_PEEK (1<<5) /* revert atime back after taking a look (if applicable) */ |
| |
591 |
| |
592 /* mx_open_new_message() */ |
| |
593 #define M_ADD_FROM 1 /* add a From_ line */ |
| |
594 Index: mbox.c |
| |
595 --- mbox.c.orig 2010-09-13 19:19:55.000000000 +0200 |
| |
596 +++ mbox.c 2011-01-17 19:33:15.000000000 +0100 |
| |
597 @@ -100,6 +100,7 @@ |
| |
598 mutt_perror (ctx->path); |
| |
599 return (-1); |
| |
600 } |
| |
601 + ctx->atime = sb.st_atime; |
| |
602 ctx->mtime = sb.st_mtime; |
| |
603 ctx->size = sb.st_size; |
| |
604 |
| |
605 @@ -251,6 +252,7 @@ |
| |
606 |
| |
607 ctx->size = sb.st_size; |
| |
608 ctx->mtime = sb.st_mtime; |
| |
609 + ctx->atime = sb.st_atime; |
| |
610 |
| |
611 #ifdef NFS_ATTRIBUTE_HACK |
| |
612 if (sb.st_mtime > sb.st_atime) |
| |
613 Index: menu.c |
| |
614 --- menu.c.orig 2010-08-25 18:31:40.000000000 +0200 |
| |
615 +++ menu.c 2011-01-17 19:33:15.000000000 +0100 |
| |
616 @@ -24,6 +24,7 @@ |
| |
617 #include "mutt_curses.h" |
| |
618 #include "mutt_menu.h" |
| |
619 #include "mbyte.h" |
| |
620 +#include "sidebar.h" |
| |
621 |
| |
622 #include <string.h> |
| |
623 #include <stdlib.h> |
| |
624 @@ -156,7 +157,7 @@ |
| |
625 { |
| |
626 char *scratch = safe_strdup (s); |
| |
627 int shift = option (OPTARROWCURSOR) ? 3 : 0; |
| |
628 - int cols = COLS - shift; |
| |
629 + int cols = COLS - shift - SidebarWidth; |
| |
630 |
| |
631 mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); |
| |
632 s[n - 1] = 0; |
| |
633 @@ -207,6 +208,7 @@ |
| |
634 char buf[LONG_STRING]; |
| |
635 int i; |
| |
636 |
| |
637 + draw_sidebar(1); |
| |
638 for (i = menu->top; i < menu->top + menu->pagelen; i++) |
| |
639 { |
| |
640 if (i < menu->max) |
| |
641 @@ -217,7 +219,7 @@ |
| |
642 if (option (OPTARROWCURSOR)) |
| |
643 { |
| |
644 attrset (menu->color (i)); |
| |
645 - CLEARLINE (i - menu->top + menu->offset); |
| |
646 + CLEARLINE_WIN (i - menu->top + menu->offset); |
| |
647 |
| |
648 if (i == menu->current) |
| |
649 { |
| |
650 @@ -246,14 +248,14 @@ |
| |
651 BKGDSET (MT_COLOR_INDICATOR); |
| |
652 } |
| |
653 |
| |
654 - CLEARLINE (i - menu->top + menu->offset); |
| |
655 + CLEARLINE_WIN (i - menu->top + menu->offset); |
| |
656 print_enriched_string (menu->color(i), (unsigned char *) buf, i != menu->current); |
| |
657 SETCOLOR (MT_COLOR_NORMAL); |
| |
658 BKGDSET (MT_COLOR_NORMAL); |
| |
659 } |
| |
660 } |
| |
661 else |
| |
662 - CLEARLINE (i - menu->top + menu->offset); |
| |
663 + CLEARLINE_WIN (i - menu->top + menu->offset); |
| |
664 } |
| |
665 menu->redraw = 0; |
| |
666 } |
| |
667 @@ -268,7 +270,7 @@ |
| |
668 return; |
| |
669 } |
| |
670 |
| |
671 - move (menu->oldcurrent + menu->offset - menu->top, 0); |
| |
672 + move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth); |
| |
673 SETCOLOR (MT_COLOR_NORMAL); |
| |
674 BKGDSET (MT_COLOR_NORMAL); |
| |
675 |
| |
676 @@ -283,13 +285,13 @@ |
| |
677 clrtoeol (); |
| |
678 menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); |
| |
679 menu_pad_string (buf, sizeof (buf)); |
| |
680 - move (menu->oldcurrent + menu->offset - menu->top, 3); |
| |
681 + move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3); |
| |
682 print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); |
| |
683 SETCOLOR (MT_COLOR_NORMAL); |
| |
684 } |
| |
685 |
| |
686 /* now draw it in the new location */ |
| |
687 - move (menu->current + menu->offset - menu->top, 0); |
| |
688 + move (menu->current + menu->offset - menu->top, SidebarWidth); |
| |
689 attrset (menu->color (menu->current)); |
| |
690 ADDCOLOR (MT_COLOR_INDICATOR); |
| |
691 addstr ("->"); |
| |
692 @@ -310,7 +312,7 @@ |
| |
693 attrset (menu->color (menu->current)); |
| |
694 ADDCOLOR (MT_COLOR_INDICATOR); |
| |
695 BKGDSET (MT_COLOR_INDICATOR); |
| |
696 - CLEARLINE (menu->current - menu->top + menu->offset); |
| |
697 + CLEARLINE_WIN (menu->current - menu->top + menu->offset); |
| |
698 print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); |
| |
699 SETCOLOR (MT_COLOR_NORMAL); |
| |
700 BKGDSET (MT_COLOR_NORMAL); |
| |
701 @@ -322,7 +324,7 @@ |
| |
702 { |
| |
703 char buf[LONG_STRING]; |
| |
704 |
| |
705 - move (menu->current + menu->offset - menu->top, 0); |
| |
706 + move (menu->current + menu->offset - menu->top, SidebarWidth); |
| |
707 menu_make_entry (buf, sizeof (buf), menu, menu->current); |
| |
708 menu_pad_string (buf, sizeof (buf)); |
| |
709 |
| |
710 @@ -875,7 +877,7 @@ |
| |
711 |
| |
712 |
| |
713 if (option (OPTARROWCURSOR)) |
| |
714 - move (menu->current - menu->top + menu->offset, 2); |
| |
715 + move (menu->current - menu->top + menu->offset, SidebarWidth + 2); |
| |
716 else if (option (OPTBRAILLEFRIENDLY)) |
| |
717 move (menu->current - menu->top + menu->offset, 0); |
| |
718 else |
| |
719 Index: mutt.h |
| |
720 --- mutt.h.orig 2010-09-13 19:19:55.000000000 +0200 |
| |
721 +++ mutt.h 2011-01-17 19:33:15.000000000 +0100 |
| |
722 @@ -419,6 +419,7 @@ |
| |
723 OPTSAVEEMPTY, |
| |
724 OPTSAVENAME, |
| |
725 OPTSCORE, |
| |
726 + OPTSIDEBAR, |
| |
727 OPTSIGDASHES, |
| |
728 OPTSIGONTOP, |
| |
729 OPTSORTRE, |
| |
730 @@ -859,6 +860,7 @@ |
| |
731 { |
| |
732 char *path; |
| |
733 FILE *fp; |
| |
734 + time_t atime; |
| |
735 time_t mtime; |
| |
736 off_t size; |
| |
737 off_t vsize; |
| |
738 @@ -893,6 +895,7 @@ |
| |
739 unsigned int quiet : 1; /* inhibit status messages? */ |
| |
740 unsigned int collapsed : 1; /* are all threads collapsed? */ |
| |
741 unsigned int closing : 1; /* mailbox is being closed */ |
| |
742 + unsigned int peekonly : 1; /* just taking a glance, revert atime */ |
| |
743 |
| |
744 /* driver hooks */ |
| |
745 void *data; /* driver specific data */ |
| |
746 Index: mutt_curses.h |
| |
747 --- mutt_curses.h.orig 2008-03-19 21:07:57.000000000 +0100 |
| |
748 +++ mutt_curses.h 2011-01-17 19:33:15.000000000 +0100 |
| |
749 @@ -64,6 +64,7 @@ |
| |
750 #undef lines |
| |
751 #endif /* lines */ |
| |
752 |
| |
753 +#define CLEARLINE_WIN(x) move(x,SidebarWidth), clrtoeol() |
| |
754 #define CLEARLINE(x) move(x,0), clrtoeol() |
| |
755 #define CENTERLINE(x,y) move(y, (COLS-strlen(x))/2), addstr(x) |
| |
756 #define BEEP() do { if (option (OPTBEEP)) beep(); } while (0) |
| |
757 @@ -126,6 +127,8 @@ |
| |
758 MT_COLOR_BOLD, |
| |
759 MT_COLOR_UNDERLINE, |
| |
760 MT_COLOR_INDEX, |
| |
761 + MT_COLOR_NEW, |
| |
762 + MT_COLOR_FLAGGED, |
| |
763 MT_COLOR_MAX |
| |
764 }; |
| |
765 |
| |
766 Index: muttlib.c |
| |
767 --- muttlib.c.orig 2010-08-25 18:31:40.000000000 +0200 |
| |
768 +++ muttlib.c 2011-01-17 19:33:15.000000000 +0100 |
| |
769 @@ -1286,6 +1286,8 @@ |
| |
770 pl = pw = 1; |
| |
771 |
| |
772 /* see if there's room to add content, else ignore */ |
| |
773 + if ( DrawFullLine ) |
| |
774 + { |
| |
775 if ((col < COLS && wlen < destlen) || soft) |
| |
776 { |
| |
777 int pad; |
| |
778 @@ -1329,6 +1331,52 @@ |
| |
779 col += wid; |
| |
780 src += pl; |
| |
781 } |
| |
782 + } |
| |
783 + else |
| |
784 + { |
| |
785 + if ((col < COLS-SidebarWidth && wlen < destlen) || soft) |
| |
786 + { |
| |
787 + int pad; |
| |
788 + |
| |
789 + /* get contents after padding */ |
| |
790 + mutt_FormatString (buf, sizeof (buf), 0, src + pl, callback, data, flags); |
| |
791 + len = mutt_strlen (buf); |
| |
792 + wid = mutt_strwidth (buf); |
| |
793 + |
| |
794 + /* try to consume as many columns as we can, if we don't have |
| |
795 + * memory for that, use as much memory as possible */ |
| |
796 + pad = (COLS - SidebarWidth - col - wid) / pw; |
| |
797 + if (pad > 0 && wlen + (pad * pl) + len > destlen) |
| |
798 + pad = ((signed)(destlen - wlen - len)) / pl; |
| |
799 + if (pad > 0) |
| |
800 + { |
| |
801 + while (pad--) |
| |
802 + { |
| |
803 + memcpy (wptr, src, pl); |
| |
804 + wptr += pl; |
| |
805 + wlen += pl; |
| |
806 + col += pw; |
| |
807 + } |
| |
808 + } |
| |
809 + else if (soft && pad < 0) |
| |
810 + { |
| |
811 + /* \0-terminate dest for length computation in mutt_wstr_trunc() */ |
| |
812 + *wptr = 0; |
| |
813 + /* make sure right part is at most as wide as display */ |
| |
814 + len = mutt_wstr_trunc (buf, destlen, COLS, &wid); |
| |
815 + /* truncate left so that right part fits completely in */ |
| |
816 + wlen = mutt_wstr_trunc (dest, destlen - len, col + pad, &col); |
| |
817 + wptr = dest + wlen; |
| |
818 + } |
| |
819 + if (len + wlen > destlen) |
| |
820 + len = mutt_wstr_trunc (buf, destlen - wlen, COLS - SidebarWidth - col, NULL); |
| |
821 + memcpy (wptr, buf, len); |
| |
822 + wptr += len; |
| |
823 + wlen += len; |
| |
824 + col += wid; |
| |
825 + src += pl; |
| |
826 + } |
| |
827 + } |
| |
828 break; /* skip rest of input */ |
| |
829 } |
| |
830 else if (ch == '|') |
| |
831 Index: mx.c |
| |
832 --- mx.c.orig 2010-09-13 19:19:55.000000000 +0200 |
| |
833 +++ mx.c 2011-01-17 19:33:15.000000000 +0100 |
| |
834 @@ -580,6 +580,7 @@ |
| |
835 * M_APPEND open mailbox for appending |
| |
836 * M_READONLY open mailbox in read-only mode |
| |
837 * M_QUIET only print error messages |
| |
838 + * M_PEEK revert atime where applicable |
| |
839 * ctx if non-null, context struct to use |
| |
840 */ |
| |
841 CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx) |
| |
842 @@ -602,6 +603,8 @@ |
| |
843 ctx->quiet = 1; |
| |
844 if (flags & M_READONLY) |
| |
845 ctx->readonly = 1; |
| |
846 + if (flags & M_PEEK) |
| |
847 + ctx->peekonly = 1; |
| |
848 |
| |
849 if (flags & (M_APPEND|M_NEWFOLDER)) |
| |
850 { |
| |
851 @@ -701,9 +704,21 @@ |
| |
852 void mx_fastclose_mailbox (CONTEXT *ctx) |
| |
853 { |
| |
854 int i; |
| |
855 +#ifndef BUFFY_SIZE |
| |
856 + struct utimbuf ut; |
| |
857 +#endif |
| |
858 |
| |
859 if(!ctx) |
| |
860 return; |
| |
861 +#ifndef BUFFY_SIZE |
| |
862 + /* fix up the times so buffy won't get confused */ |
| |
863 + if (ctx->peekonly && ctx->path && ctx->mtime > ctx->atime) |
| |
864 + { |
| |
865 + ut.actime = ctx->atime; |
| |
866 + ut.modtime = ctx->mtime; |
| |
867 + utime (ctx->path, &ut); |
| |
868 + } |
| |
869 +#endif |
| |
870 |
| |
871 /* never announce that a mailbox we've just left has new mail. #3290 |
| |
872 * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ |
| |
873 Index: pager.c |
| |
874 --- pager.c.orig 2010-08-25 18:31:40.000000000 +0200 |
| |
875 +++ pager.c 2011-01-17 19:33:15.000000000 +0100 |
| |
876 @@ -29,6 +29,7 @@ |
| |
877 #include "pager.h" |
| |
878 #include "attach.h" |
| |
879 #include "mbyte.h" |
| |
880 +#include "sidebar.h" |
| |
881 |
| |
882 #include "mutt_crypt.h" |
| |
883 |
| |
884 @@ -1099,6 +1100,7 @@ |
| |
885 if (check_attachment_marker ((char *)buf) == 0) |
| |
886 wrap_cols = COLS; |
| |
887 |
| |
888 + wrap_cols -= SidebarWidth; |
| |
889 /* FIXME: this should come from lineInfo */ |
| |
890 memset(&mbstate, 0, sizeof(mbstate)); |
| |
891 |
| |
892 @@ -1745,7 +1747,7 @@ |
| |
893 if ((redraw & REDRAW_BODY) || topline != oldtopline) |
| |
894 { |
| |
895 do { |
| |
896 - move (bodyoffset, 0); |
| |
897 + move (bodyoffset, SidebarWidth); |
| |
898 curline = oldtopline = topline; |
| |
899 lines = 0; |
| |
900 force_redraw = 0; |
| |
901 @@ -1758,6 +1760,7 @@ |
| |
902 &QuoteList, &q_level, &force_redraw, &SearchRE) > 0) |
| |
903 lines++; |
| |
904 curline++; |
| |
905 + move(lines + bodyoffset, SidebarWidth); |
| |
906 } |
| |
907 last_offset = lineInfo[curline].offset; |
| |
908 } while (force_redraw); |
| |
909 @@ -1771,6 +1774,7 @@ |
| |
910 addch ('~'); |
| |
911 addch ('\n'); |
| |
912 lines++; |
| |
913 + move(lines + bodyoffset, SidebarWidth); |
| |
914 } |
| |
915 /* We are going to update the pager status bar, so it isn't |
| |
916 * necessary to reset to normal color now. */ |
| |
917 @@ -1794,11 +1798,11 @@ |
| |
918 /* print out the pager status bar */ |
| |
919 SETCOLOR (MT_COLOR_STATUS); |
| |
920 BKGDSET (MT_COLOR_STATUS); |
| |
921 - CLEARLINE (statusoffset); |
| |
922 + CLEARLINE_WIN (statusoffset); |
| |
923 |
| |
924 if (IsHeader (extra) || IsMsgAttach (extra)) |
| |
925 { |
| |
926 - size_t l1 = COLS * MB_LEN_MAX; |
| |
927 + size_t l1 = (COLS-SidebarWidth) * MB_LEN_MAX; |
| |
928 size_t l2 = sizeof (buffer); |
| |
929 hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; |
| |
930 mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); |
| |
931 @@ -1808,7 +1812,7 @@ |
| |
932 { |
| |
933 char bn[STRING]; |
| |
934 snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); |
| |
935 - mutt_paddstr (COLS, bn); |
| |
936 + mutt_paddstr (COLS, IsHeader (extra) || IsMsgAttach (extra) ? buffer : banner); |
| |
937 } |
| |
938 BKGDSET (MT_COLOR_NORMAL); |
| |
939 SETCOLOR (MT_COLOR_NORMAL); |
| |
940 @@ -1819,18 +1823,23 @@ |
| |
941 /* redraw the pager_index indicator, because the |
| |
942 * flags for this message might have changed. */ |
| |
943 menu_redraw_current (index); |
| |
944 + draw_sidebar(MENU_PAGER); |
| |
945 |
| |
946 /* print out the index status bar */ |
| |
947 menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); |
| |
948 |
| |
949 - move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0); |
| |
950 + move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), SidebarWidth); |
| |
951 SETCOLOR (MT_COLOR_STATUS); |
| |
952 BKGDSET (MT_COLOR_STATUS); |
| |
953 - mutt_paddstr (COLS, buffer); |
| |
954 + mutt_paddstr (COLS-SidebarWidth, buffer); |
| |
955 SETCOLOR (MT_COLOR_NORMAL); |
| |
956 BKGDSET (MT_COLOR_NORMAL); |
| |
957 } |
| |
958 |
| |
959 + /* if we're not using the index, update every time */ |
| |
960 + if ( index == 0 ) |
| |
961 + draw_sidebar(MENU_PAGER); |
| |
962 + |
| |
963 redraw = 0; |
| |
964 |
| |
965 if (option(OPTBRAILLEFRIENDLY)) { |
| |
966 @@ -2756,6 +2765,13 @@ |
| |
967 mutt_what_key (); |
| |
968 break; |
| |
969 |
| |
970 + case OP_SIDEBAR_SCROLL_UP: |
| |
971 + case OP_SIDEBAR_SCROLL_DOWN: |
| |
972 + case OP_SIDEBAR_NEXT: |
| |
973 + case OP_SIDEBAR_PREV: |
| |
974 + scroll_sidebar(ch, MENU_PAGER); |
| |
975 + break; |
| |
976 + |
| |
977 default: |
| |
978 ch = -1; |
| |
979 break; |
| |
980 Index: sidebar.c |
| |
981 --- sidebar.c.orig 2011-01-17 19:33:15.000000000 +0100 |
| |
982 +++ sidebar.c 2011-01-17 19:33:15.000000000 +0100 |
| |
983 @@ -0,0 +1,333 @@ |
| |
984 +/* |
| |
985 + * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu> |
| |
986 + * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com> |
| |
987 + * |
| |
988 + * This program is free software; you can redistribute it and/or modify |
| |
989 + * it under the terms of the GNU General Public License as published by |
| |
990 + * the Free Software Foundation; either version 2 of the License, or |
| |
991 + * (at your option) any later version. |
| |
992 + * |
| |
993 + * This program is distributed in the hope that it will be useful, |
| |
994 + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| |
995 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| |
996 + * GNU General Public License for more details. |
| |
997 + * |
| |
998 + * You should have received a copy of the GNU General Public License |
| |
999 + * along with this program; if not, write to the Free Software |
| |
1000 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. |
| |
1001 + */ |
| |
1002 + |
| |
1003 + |
| |
1004 +#if HAVE_CONFIG_H |
| |
1005 +# include "config.h" |
| |
1006 +#endif |
| |
1007 + |
| |
1008 +#include "mutt.h" |
| |
1009 +#include "mutt_menu.h" |
| |
1010 +#include "mutt_curses.h" |
| |
1011 +#include "sidebar.h" |
| |
1012 +#include "buffy.h" |
| |
1013 +#include <libgen.h> |
| |
1014 +#include "keymap.h" |
| |
1015 +#include <stdbool.h> |
| |
1016 + |
| |
1017 +/*BUFFY *CurBuffy = 0;*/ |
| |
1018 +static BUFFY *TopBuffy = 0; |
| |
1019 +static BUFFY *BottomBuffy = 0; |
| |
1020 +static int known_lines = 0; |
| |
1021 + |
| |
1022 +static int quick_log10(int n) |
| |
1023 +{ |
| |
1024 + char string[32]; |
| |
1025 + sprintf(string, "%d", n); |
| |
1026 + return strlen(string); |
| |
1027 +} |
| |
1028 + |
| |
1029 +void calc_boundaries (int menu) |
| |
1030 +{ |
| |
1031 + BUFFY *tmp = Incoming; |
| |
1032 + |
| |
1033 + if ( known_lines != LINES ) { |
| |
1034 + TopBuffy = BottomBuffy = 0; |
| |
1035 + known_lines = LINES; |
| |
1036 + } |
| |
1037 + for ( ; tmp->next != 0; tmp = tmp->next ) |
| |
1038 + tmp->next->prev = tmp; |
| |
1039 + |
| |
1040 + if ( TopBuffy == 0 && BottomBuffy == 0 ) |
| |
1041 + TopBuffy = Incoming; |
| |
1042 + if ( BottomBuffy == 0 ) { |
| |
1043 + int count = LINES - 2 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); |
| |
1044 + BottomBuffy = TopBuffy; |
| |
1045 + while ( --count && BottomBuffy->next ) |
| |
1046 + BottomBuffy = BottomBuffy->next; |
| |
1047 + } |
| |
1048 + else if ( TopBuffy == CurBuffy->next ) { |
| |
1049 + int count = LINES - 2 - (menu != MENU_PAGER); |
| |
1050 + BottomBuffy = CurBuffy; |
| |
1051 + tmp = BottomBuffy; |
| |
1052 + while ( --count && tmp->prev) |
| |
1053 + tmp = tmp->prev; |
| |
1054 + TopBuffy = tmp; |
| |
1055 + } |
| |
1056 + else if ( BottomBuffy == CurBuffy->prev ) { |
| |
1057 + int count = LINES - 2 - (menu != MENU_PAGER); |
| |
1058 + TopBuffy = CurBuffy; |
| |
1059 + tmp = TopBuffy; |
| |
1060 + while ( --count && tmp->next ) |
| |
1061 + tmp = tmp->next; |
| |
1062 + BottomBuffy = tmp; |
| |
1063 + } |
| |
1064 +} |
| |
1065 + |
| |
1066 +char *make_sidebar_entry(char *box, int size, int new, int flagged) |
| |
1067 +{ |
| |
1068 + static char *entry = 0; |
| |
1069 + char *c; |
| |
1070 + int i = 0; |
| |
1071 + int delim_len = strlen(SidebarDelim); |
| |
1072 + |
| |
1073 + c = realloc(entry, SidebarWidth - delim_len + 2); |
| |
1074 + if ( c ) entry = c; |
| |
1075 + entry[SidebarWidth - delim_len + 1] = 0; |
| |
1076 + for (; i < SidebarWidth - delim_len + 1; entry[i++] = ' ' ); |
| |
1077 + i = strlen(box); |
| |
1078 + strncpy( entry, box, i < (SidebarWidth - delim_len + 1) ? i : (SidebarWidth - delim_len + 1) ); |
| |
1079 + |
| |
1080 + if (size == -1) |
| |
1081 + sprintf(entry + SidebarWidth - delim_len - 3, "?"); |
| |
1082 + else if ( new ) { |
| |
1083 + if (flagged > 0) { |
| |
1084 + sprintf( |
| |
1085 + entry + SidebarWidth - delim_len - 5 - quick_log10(size) - quick_log10(new) - quick_log10(flagged), |
| |
1086 + "% d(%d)[%d]", size, new, flagged); |
| |
1087 + } else { |
| |
1088 + sprintf( |
| |
1089 + entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(new), |
| |
1090 + "% d(%d)", size, new); |
| |
1091 + } |
| |
1092 + } else if (flagged > 0) { |
| |
1093 + sprintf( entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(flagged), "% d[%d]", size, flagged); |
| |
1094 + } else { |
| |
1095 + sprintf( entry + SidebarWidth - delim_len - 1 - quick_log10(size), "% d", size); |
| |
1096 + } |
| |
1097 + return entry; |
| |
1098 +} |
| |
1099 + |
| |
1100 +void set_curbuffy(char buf[LONG_STRING]) |
| |
1101 +{ |
| |
1102 + BUFFY* tmp = CurBuffy = Incoming; |
| |
1103 + |
| |
1104 + if (!Incoming) |
| |
1105 + return; |
| |
1106 + |
| |
1107 + while(1) { |
| |
1108 + if(!strcmp(tmp->path, buf)) { |
| |
1109 + CurBuffy = tmp; |
| |
1110 + break; |
| |
1111 + } |
| |
1112 + |
| |
1113 + if(tmp->next) |
| |
1114 + tmp = tmp->next; |
| |
1115 + else |
| |
1116 + break; |
| |
1117 + } |
| |
1118 +} |
| |
1119 + |
| |
1120 +int draw_sidebar(int menu) { |
| |
1121 + |
| |
1122 + int lines = option(OPTHELP) ? 1 : 0; |
| |
1123 + BUFFY *tmp; |
| |
1124 +#ifndef USE_SLANG_CURSES |
| |
1125 + attr_t attrs; |
| |
1126 +#endif |
| |
1127 + short delim_len = strlen(SidebarDelim); |
| |
1128 + short color_pair; |
| |
1129 + |
| |
1130 + static bool initialized = false; |
| |
1131 + static int prev_show_value; |
| |
1132 + static short saveSidebarWidth; |
| |
1133 + |
| |
1134 + /* initialize first time */ |
| |
1135 + if(!initialized) { |
| |
1136 + prev_show_value = option(OPTSIDEBAR); |
| |
1137 + saveSidebarWidth = SidebarWidth; |
| |
1138 + if(!option(OPTSIDEBAR)) SidebarWidth = 0; |
| |
1139 + initialized = true; |
| |
1140 + } |
| |
1141 + |
| |
1142 + /* save or restore the value SidebarWidth */ |
| |
1143 + if(prev_show_value != option(OPTSIDEBAR)) { |
| |
1144 + if(prev_show_value && !option(OPTSIDEBAR)) { |
| |
1145 + saveSidebarWidth = SidebarWidth; |
| |
1146 + SidebarWidth = 0; |
| |
1147 + } else if(!prev_show_value && option(OPTSIDEBAR)) { |
| |
1148 + SidebarWidth = saveSidebarWidth; |
| |
1149 + } |
| |
1150 + prev_show_value = option(OPTSIDEBAR); |
| |
1151 + } |
| |
1152 + |
| |
1153 + |
| |
1154 +// if ( SidebarWidth == 0 ) return 0; |
| |
1155 + if (SidebarWidth > 0 && option (OPTSIDEBAR) |
| |
1156 + && delim_len >= SidebarWidth) { |
| |
1157 + unset_option (OPTSIDEBAR); |
| |
1158 + /* saveSidebarWidth = SidebarWidth; */ |
| |
1159 + if (saveSidebarWidth > delim_len) { |
| |
1160 + SidebarWidth = saveSidebarWidth; |
| |
1161 + mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar.")); |
| |
1162 + sleep (2); |
| |
1163 + } else { |
| |
1164 + SidebarWidth = 0; |
| |
1165 + mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar. Please set your sidebar_width to a sane value.")); |
| |
1166 + sleep (4); /* the advise to set a sane value should be seen long enough */ |
| |
1167 + } |
| |
1168 + saveSidebarWidth = 0; |
| |
1169 + return (0); |
| |
1170 + } |
| |
1171 + |
| |
1172 + if ( SidebarWidth == 0 || !option(OPTSIDEBAR)) { |
| |
1173 + if (SidebarWidth > 0) { |
| |
1174 + saveSidebarWidth = SidebarWidth; |
| |
1175 + SidebarWidth = 0; |
| |
1176 + } |
| |
1177 + unset_option(OPTSIDEBAR); |
| |
1178 + return 0; |
| |
1179 + } |
| |
1180 + |
| |
1181 + /* get attributes for divider */ |
| |
1182 + SETCOLOR(MT_COLOR_STATUS); |
| |
1183 +#ifndef USE_SLANG_CURSES |
| |
1184 + attr_get(&attrs, &color_pair, 0); |
| |
1185 +#else |
| |
1186 + color_pair = attr_get(); |
| |
1187 +#endif |
| |
1188 + SETCOLOR(MT_COLOR_NORMAL); |
| |
1189 + |
| |
1190 + /* draw the divider */ |
| |
1191 + |
| |
1192 + for ( ; lines < LINES-1-(menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) { |
| |
1193 + move(lines, SidebarWidth - delim_len); |
| |
1194 + addstr(NONULL(SidebarDelim)); |
| |
1195 +#ifndef USE_SLANG_CURSES |
| |
1196 + mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL); |
| |
1197 +#endif |
| |
1198 + } |
| |
1199 + |
| |
1200 + if ( Incoming == 0 ) return 0; |
| |
1201 + lines = option(OPTHELP) ? 1 : 0; /* go back to the top */ |
| |
1202 + |
| |
1203 + if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 ) |
| |
1204 + calc_boundaries(menu); |
| |
1205 + if ( CurBuffy == 0 ) CurBuffy = Incoming; |
| |
1206 + |
| |
1207 + tmp = TopBuffy; |
| |
1208 + |
| |
1209 + SETCOLOR(MT_COLOR_NORMAL); |
| |
1210 + |
| |
1211 + for ( ; tmp && lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); tmp = tmp->next ) { |
| |
1212 + if ( tmp == CurBuffy ) |
| |
1213 + SETCOLOR(MT_COLOR_INDICATOR); |
| |
1214 + else if ( tmp->msg_unread > 0 ) |
| |
1215 + SETCOLOR(MT_COLOR_NEW); |
| |
1216 + else if ( tmp->msg_flagged > 0 ) |
| |
1217 + SETCOLOR(MT_COLOR_FLAGGED); |
| |
1218 + else |
| |
1219 + SETCOLOR(MT_COLOR_NORMAL); |
| |
1220 + |
| |
1221 + move( lines, 0 ); |
| |
1222 + if ( Context && !strcmp( tmp->path, Context->path ) ) { |
| |
1223 + tmp->msg_unread = Context->unread; |
| |
1224 + tmp->msgcount = Context->msgcount; |
| |
1225 + tmp->msg_flagged = Context->flagged; |
| |
1226 + } |
| |
1227 + // check whether Maildir is a prefix of the current folder's path |
| |
1228 + short maildir_is_prefix = 0; |
| |
1229 + if ( (strlen(tmp->path) > strlen(Maildir)) && |
| |
1230 + (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) ) |
| |
1231 + maildir_is_prefix = 1; |
| |
1232 + // calculate depth of current folder and generate its display name with indented spaces |
| |
1233 + int sidebar_folder_depth = 0; |
| |
1234 + char *sidebar_folder_name; |
| |
1235 + sidebar_folder_name = basename(tmp->path); |
| |
1236 + if ( maildir_is_prefix ) { |
| |
1237 + char *tmp_folder_name; |
| |
1238 + int i; |
| |
1239 + tmp_folder_name = tmp->path + strlen(Maildir); |
| |
1240 + for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) { |
| |
1241 + if (tmp_folder_name[i] == '/') sidebar_folder_depth++; |
| |
1242 + } |
| |
1243 + if (sidebar_folder_depth > 0) { |
| |
1244 + sidebar_folder_name = malloc(strlen(basename(tmp->path)) + sidebar_folder_depth + 1); |
| |
1245 + for (i=0; i < sidebar_folder_depth; i++) |
| |
1246 + sidebar_folder_name[i]=' '; |
| |
1247 + sidebar_folder_name[i]=0; |
| |
1248 + strncat(sidebar_folder_name, basename(tmp->path), strlen(basename(tmp->path)) + sidebar_folder_depth); |
| |
1249 + } |
| |
1250 + } |
| |
1251 + printw( "%.*s", SidebarWidth - delim_len + 1, |
| |
1252 + make_sidebar_entry(sidebar_folder_name, tmp->msgcount, |
| |
1253 + tmp->msg_unread, tmp->msg_flagged)); |
| |
1254 + if (sidebar_folder_depth > 0) |
| |
1255 + free(sidebar_folder_name); |
| |
1256 + lines++; |
| |
1257 + } |
| |
1258 + SETCOLOR(MT_COLOR_NORMAL); |
| |
1259 + for ( ; lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) { |
| |
1260 + int i = 0; |
| |
1261 + move( lines, 0 ); |
| |
1262 + for ( ; i < SidebarWidth - delim_len; i++ ) |
| |
1263 + addch(' '); |
| |
1264 + } |
| |
1265 + return 0; |
| |
1266 +} |
| |
1267 + |
| |
1268 + |
| |
1269 +void set_buffystats(CONTEXT* Context) |
| |
1270 +{ |
| |
1271 + BUFFY *tmp = Incoming; |
| |
1272 + while(tmp) { |
| |
1273 + if(Context && !strcmp(tmp->path, Context->path)) { |
| |
1274 + tmp->msg_unread = Context->unread; |
| |
1275 + tmp->msgcount = Context->msgcount; |
| |
1276 + break; |
| |
1277 + } |
| |
1278 + tmp = tmp->next; |
| |
1279 + } |
| |
1280 +} |
| |
1281 + |
| |
1282 +void scroll_sidebar(int op, int menu) |
| |
1283 +{ |
| |
1284 + if(!SidebarWidth) return; |
| |
1285 + if(!CurBuffy) return; |
| |
1286 + |
| |
1287 + switch (op) { |
| |
1288 + case OP_SIDEBAR_NEXT: |
| |
1289 + if ( CurBuffy->next == NULL ) return; |
| |
1290 + CurBuffy = CurBuffy->next; |
| |
1291 + break; |
| |
1292 + case OP_SIDEBAR_PREV: |
| |
1293 + if ( CurBuffy->prev == NULL ) return; |
| |
1294 + CurBuffy = CurBuffy->prev; |
| |
1295 + break; |
| |
1296 + case OP_SIDEBAR_SCROLL_UP: |
| |
1297 + CurBuffy = TopBuffy; |
| |
1298 + if ( CurBuffy != Incoming ) { |
| |
1299 + calc_boundaries(menu); |
| |
1300 + CurBuffy = CurBuffy->prev; |
| |
1301 + } |
| |
1302 + break; |
| |
1303 + case OP_SIDEBAR_SCROLL_DOWN: |
| |
1304 + CurBuffy = BottomBuffy; |
| |
1305 + if ( CurBuffy->next ) { |
| |
1306 + calc_boundaries(menu); |
| |
1307 + CurBuffy = CurBuffy->next; |
| |
1308 + } |
| |
1309 + break; |
| |
1310 + default: |
| |
1311 + return; |
| |
1312 + } |
| |
1313 + calc_boundaries(menu); |
| |
1314 + draw_sidebar(menu); |
| |
1315 +} |
| |
1316 + |
| |
1317 Index: sidebar.h |
| |
1318 --- sidebar.h.orig 2011-01-17 19:33:15.000000000 +0100 |
| |
1319 +++ sidebar.h 2011-01-17 19:33:15.000000000 +0100 |
| |
1320 @@ -0,0 +1,36 @@ |
| |
1321 +/* |
| |
1322 + * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu> |
| |
1323 + * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com> |
| |
1324 + * |
| |
1325 + * This program is free software; you can redistribute it and/or modify |
| |
1326 + * it under the terms of the GNU General Public License as published by |
| |
1327 + * the Free Software Foundation; either version 2 of the License, or |
| |
1328 + * (at your option) any later version. |
| |
1329 + * |
| |
1330 + * This program is distributed in the hope that it will be useful, |
| |
1331 + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| |
1332 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| |
1333 + * GNU General Public License for more details. |
| |
1334 + * |
| |
1335 + * You should have received a copy of the GNU General Public License |
| |
1336 + * along with this program; if not, write to the Free Software |
| |
1337 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. |
| |
1338 + */ |
| |
1339 + |
| |
1340 +#ifndef SIDEBAR_H |
| |
1341 +#define SIDEBAR_H |
| |
1342 + |
| |
1343 +struct MBOX_LIST { |
| |
1344 + char *path; |
| |
1345 + int msgcount; |
| |
1346 + int new; |
| |
1347 +} MBLIST; |
| |
1348 + |
| |
1349 +/* parameter is whether or not to go to the status line */ |
| |
1350 +/* used for omitting the last | that covers up the status bar in the index */ |
| |
1351 +int draw_sidebar(int); |
| |
1352 +void scroll_sidebar(int, int); |
| |
1353 +void set_curbuffy(char*); |
| |
1354 +void set_buffystats(CONTEXT*); |
| |
1355 + |
| |
1356 +#endif /* SIDEBAR_H */ |
| |
1357 |
| |
1358 ============================================================================== |
| |
1359 |
| |
1360 Fix drawing of sidebar delimiter with the intended |
| |
1361 attributes of the "status" bar --rse 20070906 |
| |
1362 |
| |
1363 Index: sidebar.c |
| |
1364 --- sidebar.c.orig 2007-11-04 15:05:17 +0100 |
| |
1365 +++ sidebar.c 2007-11-04 15:05:17 +0100 |
| |
1366 @@ -186,23 +186,14 @@ |
| |
1367 return 0; |
| |
1368 } |
| |
1369 |
| |
1370 - /* get attributes for divider */ |
| |
1371 - SETCOLOR(MT_COLOR_STATUS); |
| |
1372 -#ifndef USE_SLANG_CURSES |
| |
1373 - attr_get(&attrs, &color_pair, 0); |
| |
1374 -#else |
| |
1375 - color_pair = attr_get(); |
| |
1376 -#endif |
| |
1377 - SETCOLOR(MT_COLOR_NORMAL); |
| |
1378 |
| |
1379 /* draw the divider */ |
| |
1380 |
| |
1381 for ( ; lines < LINES-1-(menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) { |
| |
1382 + SETCOLOR(MT_COLOR_STATUS); |
| |
1383 move(lines, SidebarWidth - delim_len); |
| |
1384 addstr(NONULL(SidebarDelim)); |
| |
1385 -#ifndef USE_SLANG_CURSES |
| |
1386 - mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL); |
| |
1387 -#endif |
| |
1388 + SETCOLOR(MT_COLOR_NORMAL); |
| |
1389 } |
| |
1390 |
| |
1391 if ( Incoming == 0 ) return 0; |