diff options
Diffstat (limited to 'manualPorts/alpine/backwards-search.patch')
-rw-r--r-- | manualPorts/alpine/backwards-search.patch | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/manualPorts/alpine/backwards-search.patch b/manualPorts/alpine/backwards-search.patch new file mode 100644 index 0000000..8926609 --- /dev/null +++ b/manualPorts/alpine/backwards-search.patch @@ -0,0 +1,93 @@ +diff --git a/alpine/mailindx.c b/alpine/mailindx.c +index 18583c3..f1dd874 100644 +--- a/alpine/mailindx.c ++++ b/alpine/mailindx.c +@@ -2954,19 +2954,21 @@ away. + void + index_search(struct pine *state, MAILSTREAM *stream, int command_line, MSGNO_S *msgmap) + { +- int rc, select_all = 0, flags, prefetch, we_turned_on = 0; ++ int rc, select_all = 0, flags, prefetch, searchbound, otherbound, offset = 0, we_turned_on = 0; + long i, sorted_msg, selected = 0L; + char prompt[MAX_SEARCH+50], new_string[MAX_SEARCH+1]; + char buf[MAX_SCREEN_COLS+1], *p; + HelpType help; + char search_string[MAX_SEARCH+1]; + ICE_S *ice, *ic; ++ static int direction = 1; + static HISTORY_S *history = NULL; + static ESCKEY_S header_search_key[] = { {0, 0, NULL, NULL }, + {ctrl('Y'), 10, "^Y", N_("First Msg")}, + {ctrl('V'), 11, "^V", N_("Last Msg")}, + {KEY_UP, 30, "", ""}, + {KEY_DOWN, 31, "", ""}, ++ {ctrl('W'), 32, "^W", N_("Direction")}, + {-1, 0, NULL, NULL} }; + #define KU_IS (3) /* index of KEY_UP */ + #define PREFETCH_THIS_MANY_LINES (50) +@@ -2995,7 +2997,8 @@ index_search(struct pine *state, MAILSTREAM *stream, int command_line, MSGNO_S * + new_string[0] = '\0'; + + while(1) { +- snprintf(prompt, sizeof(prompt), _("Word to search for [%s] : "), search_string); ++ snprintf(prompt, sizeof(prompt), _("Word to search %sfor [%s] : "), ++ direction == -1 ? _("(backwards) ") : "", search_string); + + if(F_ON(F_ENABLE_AGG_OPS, ps_global)){ + header_search_key[0].ch = ctrl('X'); +@@ -3092,6 +3095,10 @@ index_search(struct pine *state, MAILSTREAM *stream, int command_line, MSGNO_S * + + continue; + } ++ else if(rc == 32){ ++ direction *= -1; ++ continue; ++ } + + if(rc != 4){ /* 4 is redraw */ + save_hist(history, new_string, 0, NULL); +@@ -3115,9 +3122,18 @@ index_search(struct pine *state, MAILSTREAM *stream, int command_line, MSGNO_S * + we_turned_on = intr_handling_on(); + + prefetch = 0; +- for(i = sorted_msg + ((select_all)?0:1); +- i <= mn_get_total(msgmap) && !ps_global->intr_pending; +- i++){ ++ if (direction == -1) { ++ searchbound = -1; ++ otherbound = mn_get_total(msgmap); ++ offset = 2; ++ } else { ++ searchbound = mn_get_total(msgmap); ++ otherbound = 1; ++ } ++ ++ for(i = sorted_msg + ((select_all)?0:1) - offset; ++ i * direction <= searchbound && !ps_global->intr_pending; ++ i += direction){ + if(msgline_hidden(stream, msgmap, i, 0)) + continue; + +@@ -3139,8 +3155,11 @@ index_search(struct pine *state, MAILSTREAM *stream, int command_line, MSGNO_S * + } + + prefetch = 0; +- if(i > mn_get_total(msgmap)){ +- for(i = 1; i < sorted_msg && !ps_global->intr_pending; i++){ ++ if(i * direction > searchbound){ ++ for(i = otherbound; ++ i * direction < sorted_msg * direction && !ps_global->intr_pending; ++ i += direction ){ ++ + if(msgline_hidden(stream, msgmap, i, 0)) + continue; + +@@ -3194,7 +3213,7 @@ index_search(struct pine *state, MAILSTREAM *stream, int command_line, MSGNO_S * + } + else if(selected){ + q_status_message1(SM_ORDER, 0, 3, _("Word found%s"), +- (i < sorted_msg) ? _(". Search wrapped to beginning") : ++ (i * direction < sorted_msg * direction) ? _(". Search wrapped to beginning") : + (i == sorted_msg) ? _(". Current line contains only match") : ""); + mn_set_cur(msgmap, i); + } |