diff options
Diffstat (limited to 'mbbsd/read.c')
-rw-r--r-- | mbbsd/read.c | 396 |
1 files changed, 199 insertions, 197 deletions
diff --git a/mbbsd/read.c b/mbbsd/read.c index 1158cb02..3b723841 100644 --- a/mbbsd/read.c +++ b/mbbsd/read.c @@ -3,7 +3,6 @@ static fileheader_t *headers = NULL; static int last_line; // PTT: last_line 游標可指的最後一個 -static int hit_thread; #include <sys/mman.h> @@ -95,7 +94,7 @@ AskTag(char *msg) num = TagNum; snprintf(buf, sizeof(buf), "◆ %s A)文章 T)標記 Q)uit?", msg); - switch (rget(b_lines - 1, buf)) { + switch (getans(buf)) { case 'q': num = -1; break; @@ -232,17 +231,16 @@ fixkeep(char *s, int first) static int cursor_pos(keeploc_t * locmem, int val, int from_top) { - int top; - - if (locmem->crs_ln > last_line) { - bell(); + int top=locmem->top_ln; + if (!last_line) + { + cursor_show(3 , 0); + return DONOTHING; + } + if (val > last_line) val = last_line; - } - if (locmem->crs_ln <= 0) { - bell(); + if (val <= 0) val = 1; - } - top = locmem->top_ln; if (val >= top && val < top + p_lines) { cursor_clear(3 + locmem->crs_ln - top, 0); locmem->crs_ln = val; @@ -257,7 +255,7 @@ cursor_pos(keeploc_t * locmem, int val, int from_top) } static int -thread(keeploc_t * locmem, int stype) +thread(keeploc_t * locmem, int stype, int *new_ln) { static char a_ans[32], t_ans[32]; char ans[32], s_pmt[64]; @@ -267,7 +265,7 @@ thread(keeploc_t * locmem, int stype) int circulate_flag = 1; /* circulate at end or begin */ int fd = -1; - match = hit_thread = 0; + match = 0; now = pos = locmem->crs_ln; if (stype == 'A') { if (!*currowner) @@ -283,18 +281,6 @@ thread(keeploc_t * locmem, int stype) query = a_ans; circulate_flag = 0; stype = RS_FORWARD; - } else if (stype == '/') { - if (!*t_ans) - return DONOTHING; - query = t_ans; - circulate_flag = 0; - stype = RS_TITLE | RS_FORWARD; - } else if (stype == '?') { - if (!*t_ans) - return DONOTHING; - circulate_flag = 0; - query = t_ans; - stype = RS_TITLE; } else if (stype & RS_RELATED) { tag = headers[pos - locmem->top_ln].title; if (stype & RS_CURRENT) { @@ -344,8 +330,7 @@ thread(keeploc_t * locmem, int stype) if( fd ) close(fd); if ((stype & RS_FIRST) && (near)) { - hit_thread = 1; - return cursor_pos(locmem, near, 10); + *new_ln = near; } return DONOTHING; } @@ -365,10 +350,10 @@ thread(keeploc_t * locmem, int stype) if (stype & RS_THREAD) { if (strncasecmp(fh.title, str_reply, 3)) { - hit_thread = 1; if( fd ) close(fd); - return cursor_pos(locmem, now, 10); + *new_ln = now; + return DONOTHING; } continue; } @@ -383,8 +368,7 @@ thread(keeploc_t * locmem, int stype) near = now; continue; } - hit_thread = 1; - match = cursor_pos(locmem, now, 10); + *new_ln = now; if ((!(stype & RS_CURRENT)) && (stype & RS_RELATED) && strncmp(currtitle, query, TTLEN)) { @@ -414,19 +398,17 @@ mail_forward(fileheader_t * fhdr, char *direct, int mode) *p = '\0'; switch (i = doforward(buf, fhdr, mode)) { case 0: - outmsg(msg_fwd_ok); + vmsg(msg_fwd_ok); break; case -1: - outmsg(msg_fwd_err1); + vmsg(msg_fwd_err1); break; case -2: - outmsg(msg_fwd_err2); + vmsg(msg_fwd_err2); break; default: break; } - refresh(); - sleep(1); } #endif @@ -554,155 +536,133 @@ select_read(keeploc_t * locmem, int sr_mode) return READ_REDRAW; } +#define select_read_mode(m) select_read(locmem, m) ? NEWDIRECT:READ_REDRAW static int -i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int ch, int bid, int bottom_line) +i_read_key(onekey_t * rcmdlist, char default_ch, keeploc_t * locmem, + int bid, int bottom_line) { int mode = DONOTHING; - int new_cursor, num; + int num; char direct[60]; + int ch, new_ln= locmem->crs_ln; - while(mode == DONOTHING) - { - ch = egetch(); - if (ch >= '0' && ch <= '9'&& (new_cursor = search_num(ch, last_line))!= -1) - { - mode = cursor_pos(locmem, new_cursor+1, p_lines - 2); - } - else - switch (ch) { - case 'q': - case 'e': - case KEY_LEFT: - if(currmode & MODE_SELECT){ - char genbuf[256]; - fileheader_t *fhdr = &headers[locmem->crs_ln - locmem->top_ln]; - board_select(); - setbdir(genbuf, currboard); - locmem = getkeep(genbuf, 0, 1); - locmem->crs_ln = getindex(genbuf, fhdr->filename, sizeof(fileheader_t)); - num = locmem->crs_ln - p_lines + 1; - locmem->top_ln = num < 1 ? 1 : num; - mode= NEWDIRECT; - } - mode= (currmode & MODE_ETC) ? board_etc() : - (currmode & MODE_DIGEST) ? board_digest() : DOQUIT; - break; - case Ctrl('L'): - redoscr(); - break; - case Ctrl('H'): - if (select_read(locmem, RS_NEWPOST)) - mode = NEWDIRECT; - else - mode = READ_REDRAW; - break; - case 'a': - case 'A': - if (select_read(locmem, RS_AUTHOR)) - mode = NEWDIRECT; - else - mode = READ_REDRAW; - break; - - case 'G': - if (select_read(locmem,RS_THREAD)) /* marked articles */ - mode = NEWDIRECT; - else - mode = READ_REDRAW; - break; + do { + if(default_ch) + { + ch = default_ch; + default_ch=0; + } + else + { + if((mode=cursor_pos(locmem, new_ln, 10))!=DONOTHING) + return mode; + ch = igetch(); + } + switch (ch) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if((num = search_num(ch, last_line))!=-1) + new_ln = num+1; + break; + case 'q': + case 'e': + case KEY_LEFT: + if(currmode & MODE_SELECT){ + char genbuf[256]; + fileheader_t *fhdr = &headers[locmem->crs_ln - locmem->top_ln]; + board_select(); + setbdir(genbuf, currboard); + locmem = getkeep(genbuf, 0, 1); + locmem->crs_ln = + getindex(genbuf, fhdr->filename, sizeof(fileheader_t)); + num = locmem->crs_ln - p_lines + 1; + locmem->top_ln = num < 1 ? 1 : num; + + mode = NEWDIRECT; + } + else + mode = (currmode & MODE_ETC) ? board_etc() : + (currmode & MODE_DIGEST) ? board_digest() : DOQUIT; + break; + case Ctrl('L'): + redoscr(); + break; - case '/': - case '?': - if (select_read(locmem, RS_RELATED)) - mode = NEWDIRECT; - else - mode = READ_REDRAW; - break; - case 'S': - if (select_read(locmem, RS_TITLE)) - mode = NEWDIRECT; - else - mode = READ_REDRAW; - break; - /* quick search title first */ - case '=': - mode = thread(locmem, RELATE_FIRST); - break; - case '\\': - mode = thread(locmem, CURSOR_FIRST); - break; - /* quick search title forword */ - case ']': - mode = thread(locmem, RELATE_NEXT); - break; - case '+': - mode = thread(locmem, CURSOR_NEXT); - break; - /* quick search title backword */ - case '[': - mode = thread(locmem, RELATE_PREV); - break; - case '-': - mode = thread(locmem, CURSOR_PREV); - break; - case '<': - case ',': - mode = thread(locmem, THREAD_PREV); - break; - case '.': - case '>': - mode = thread(locmem, THREAD_NEXT); - break; - case 'p': - case 'k': + case Ctrl('H'): + mode = select_read_mode(RS_NEWPOST); + break; + case 'a': + case 'A': + mode = select_read_mode(RS_AUTHOR); + break; + case 'G': + mode = select_read_mode(RS_THREAD); + break; + case '/': + case '?': + mode = select_read_mode(RS_RELATED); + break; + case 'S': + mode = select_read_mode(RS_TITLE); + break; + case '=': + mode = thread(locmem, RELATE_FIRST, &new_ln); + break; + case '\\': + mode = thread(locmem, CURSOR_FIRST, &new_ln); + break; + case ']': + mode = thread(locmem, RELATE_NEXT, &new_ln); + break; + case '+': + mode = thread(locmem, CURSOR_NEXT, &new_ln); + break; + case '[': + mode = thread(locmem, RELATE_PREV, &new_ln); + break; + case '-': + mode = thread(locmem, CURSOR_PREV, &new_ln); + break; + case '<': + case ',': + mode = thread(locmem, THREAD_PREV, &new_ln); + break; + case '.': + case '>': + mode = thread(locmem, THREAD_NEXT, &new_ln); + break; + case 'p': + case 'k': case KEY_UP: - mode = cursor_pos(locmem, locmem->crs_ln - 1, p_lines - 2); + new_ln = locmem->crs_ln - 1; break; case 'n': case 'j': case KEY_DOWN: - mode = cursor_pos(locmem, locmem->crs_ln + 1, 1); + new_ln = locmem->crs_ln + 1; break; case ' ': case KEY_PGDN: case 'N': case Ctrl('F'): - if (last_line >= locmem->top_ln + p_lines) { - if (last_line > locmem->top_ln + p_lines) - locmem->top_ln += p_lines; - else - locmem->top_ln += p_lines - 1; - locmem->crs_ln = locmem->top_ln; - mode = PARTUPDATE; - } - else - cursor_clear(3 + locmem->crs_ln - locmem->top_ln, 0); - locmem->crs_ln = last_line; - cursor_show(3 + locmem->crs_ln - locmem->top_ln, 0); + new_ln = locmem->crs_ln + p_lines; break; case KEY_PGUP: case Ctrl('B'): case 'P': - if (locmem->top_ln > 1) { - locmem->top_ln -= p_lines; - if (locmem->top_ln <= 0) - locmem->top_ln = 1; - locmem->crs_ln = locmem->top_ln; - mode = PARTUPDATE; - } + new_ln = locmem->crs_ln - p_lines; break; case KEY_END: case '$': - if (last_line >= locmem->top_ln + p_lines) { - locmem->top_ln = last_line - p_lines + 1; - if (locmem->top_ln <= 0) - locmem->top_ln = 1; - locmem->crs_ln = last_line; - return PARTUPDATE; - } - cursor_clear(3 + locmem->crs_ln - locmem->top_ln, 0); - locmem->crs_ln = last_line; - cursor_show(3 + locmem->crs_ln - locmem->top_ln, 0); + new_ln = last_line; break; case 'F': case 'U': @@ -715,7 +675,6 @@ i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int ch, int bid, int bottom_ break; case Ctrl('Q'): mode = my_query(headers[locmem->crs_ln - locmem->top_ln].owner); - break; case Ctrl('S'): if (HAS_PERM(PERM_ACCOUNTS)) { int id; @@ -726,7 +685,8 @@ i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int ch, int bid, int bottom_ sizeof(currauthor)); stand_title("使用者設定"); move(1, 0); - if ((id = getuser(headers[locmem->crs_ln - locmem->top_ln].owner))) { + if ((id = getuser(headers[locmem->crs_ln - locmem->top_ln].owner))) + { memcpy(&muser, &xuser, sizeof(muser)); user_display(&muser, 1); uinfo_query(&muser, 1, id); @@ -751,17 +711,17 @@ i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int ch, int bid, int bottom_ (currmode & MODE_SELECT) ? (headers[locmem->crs_ln - locmem->top_ln].money & ~FHR_REFERENCE) : locmem->crs_ln, TAG_TOGGLE)) - mode = POS_NEXT; - else - mode = DONOTHING; - break; + locmem->crs_ln = locmem->crs_ln + 1; + mode = PART_REDRAW; + break; + case Ctrl('C'): if (TagNum) { TagNum = 0; mode = FULLUPDATE; } - mode = DONOTHING; break; + case Ctrl('T'): mode = TagThread(currdirect); break; @@ -775,27 +735,29 @@ i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int ch, int bid, int bottom_ ch = 'r'; default: if( ch == 'h' && currmode & (MODE_ETC | MODE_DIGEST) ) - return DONOTHING; + break; if (ch > 0 && ch <= onekey_size) { int (*func)() = rcmdlist[ch - 1]; if (func != NULL) { - num = locmem->crs_ln - bottom_line; - if (num>0) - { - sprintf(direct,"%s.bottom", currdirect); - mode = (*func)(num, &headers[locmem->crs_ln-locmem->top_ln], + num = locmem->crs_ln - bottom_line; + + if (num>0) + { + sprintf(direct,"%s.bottom", currdirect); + mode= (*func)(num, &headers[locmem->crs_ln-locmem->top_ln], direct); - } - else - mode = (*func)(locmem->crs_ln, + } + else + mode = (*func)(locmem->crs_ln, &headers[locmem->crs_ln - locmem->top_ln], currdirect); } - break; - } - } + } + break; + } // end switch } - return mode; + while (mode == DONOTHING); + return mode; } int @@ -804,6 +766,7 @@ get_records_and_bottom(char *direct, fileheader_t* headers, { int n = bottom_line - recbase + 1, rv; char directbottom[60]; + if(!last_line) return 0; if(n>=p_lines || (currmode & (MODE_SELECT | MODE_DIGEST))) return get_records(direct, headers, sizeof(fileheader_t), recbase, @@ -825,13 +788,12 @@ void i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey_t * rcmdlist, int bidcache) { keeploc_t *locmem = NULL; - int recbase = 0, mode, ch; + int recbase = 0, mode, lastmode = 0, last_ln; int num = 0, entries = 0, n_bottom=0; int i; - char currdirect0[64]; + char currdirect0[64], default_ch = 0; int last_line0 = last_line; int bottom_line = 0; - int hit_thread0 = hit_thread; fileheader_t *headers0 = headers; strlcpy(currdirect0, currdirect, sizeof(currdirect0)); @@ -860,9 +822,6 @@ i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey bottom_line = last_line = get_num_records(currdirect, FHSZ); if (mode == NEWDIRECT) { - if (last_line == 0) { - outs("沒有任何文章..\n"); - } num = last_line - p_lines + 1; locmem = getkeep(currdirect, num < 1 ? 1 : num, last_line); } @@ -903,11 +862,11 @@ i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey clrtobot(); case PART_REDRAW: move(3, 0); - if(!entries) - outs(" 沒有文章......"); + if(last_line==0) + outs(" 沒有文章..."); else - for (i = 0; i < entries; i++) - (*doentry) (locmem->top_ln + i, &headers[i]); + for (i = 0; i < entries; i++) + (*doentry) (locmem->top_ln + i, &headers[i]); case READ_REDRAW: outmsg(curredit & EDIT_ITEM ? "\033[44m 私人收藏 \033[30;47m 繼續? \033[m" : @@ -915,16 +874,59 @@ i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey break; case TITLE_REDRAW: (*dotitle) (); - break; + break; } - /* 讀取鍵盤,加以處理,設定 mode */ - mode = i_read_key(rcmdlist, locmem, ch, currbid, - bottom_line); + mode = i_read_key(rcmdlist, default_ch, locmem, currbid, + bottom_line); + if(mode == READ_SKIP) + mode = lastmode; + // 以下這幾種 mode 要再處理游標 + default_ch=0; + if(mode == READ_PREV || mode == READ_NEXT || mode == RELATE_PREV || + mode == RELATE_FIRST || mode == 'A' || mode == 'a' || + mode == RELATE_NEXT) + { + lastmode = mode; + last_ln = locmem->crs_ln; + + switch(mode) + { + case READ_PREV: + mode = cursor_pos(locmem, locmem->crs_ln - 1, 10); + break; + case READ_NEXT: + mode = cursor_pos(locmem, locmem->crs_ln + 1, 10); + break; + case RELATE_PREV: + thread(locmem, RELATE_PREV, &num); + mode = cursor_pos(locmem, num, 10); + break; + case RELATE_NEXT: + thread(locmem, RELATE_NEXT, &num); + mode = cursor_pos(locmem, num, 10); + break; + case RELATE_FIRST: + thread(locmem, RELATE_FIRST, &num); + mode = cursor_pos(locmem, num, 10); + break; + case 'A': + thread(locmem, 'A', &num); + mode = cursor_pos(locmem, num, 10); + break; + case 'a': + thread(locmem, 'a', &num); + mode = cursor_pos(locmem, num, 10); + break; + } + if(locmem->crs_ln != last_ln) default_ch = 'r'; + else mode = FULLUPDATE; + } } while (mode != DOQUIT); +#undef FHSZ + free(headers); last_line = last_line0; - hit_thread = hit_thread0; headers = headers0; strlcpy(currdirect, currdirect0, sizeof(currdirect)); return; |