static void editMsgLine(struct edit *edit) { static int ck, havenewmail; if (!edit) { ck = 0; havenewmail = chkmail(); return; } if (talkrequest) { talkreply(); clear(); edit->redrawall = 1; } if (++ck >= 10) { havenewmail = chkmail(); ck = 0; } move(t_lines - 1, 0); prints("\033[1;33;44m【%s】", havenewmail ? "\033[5;32m信\033[m\033[1;33;44m" : " "); prints("【%s】", have_msg_unread ? "\033[5;32mMSG\033[m\033[1;33;44m" : " "); prints(" \033[31mCtrl-Q\033[33m 求救 "); prints ("状态 [\033[32m%s\033[33m][\033[32m%d\033[33m,\033[32m%d\033[33m][\033[32m%s\033[33m][\033[32m%s\033[33m] ", edit->overwrite ? "Rep" : "Ins", edit->line + 1, edit->col + 1, "X", editview ? " " : "~"); prints("时间\033[1;33;44m【\033[1;32m%16s\033[33m】 \033[m", Ctime(now_t)); }
void talk_request(int s) { signal(SIGUSR1, talk_request); talkreply(); }
static void talk_request() { bell(); bell(); if(currutmp->msgcount) { char buf[200]; time_t now = time(0); sprintf(buf, "\033[33;41m★%s\033[34;47m [%s] %s \033[0m", utmpshm->uinfo[currutmp->destuip].userid, my_ctime(&now), (currutmp->sig == 2) ? "重要消息廣播!(請Ctrl-U,l查看熱訊記錄)" : "呼叫、呼叫,聽到請回答"); move(0, 0); clrtoeol(); outs(buf); refresh(); } else { unsigned char mode0 = currutmp->mode; char c0 = currutmp->chatid[0]; screenline_t *screen0 = calloc(t_lines, sizeof(screenline_t)); extern screenline_t *big_picture; currutmp->mode = 0; currutmp->chatid[0] = 1; memcpy(screen0, big_picture, t_lines * sizeof(screenline_t)); talkreply(); currutmp->mode = mode0; currutmp->chatid[0] = c0; memcpy(big_picture, screen0, t_lines * sizeof(screenline_t)); free(screen0); redoscr(); } }
void msgline() { char buf[256], buf2[STRLEN * 2]; void display_buffer(); extern int talkrequest; int tmpshow; time_t now; if (ismsgline <= 0) return; now = time(0); tmpshow = showansi; showansi = 1; if (talkrequest) { talkreply(); clear(); showansi = 0; display_buffer(); showansi = 1; } strcpy(buf, "[1;33;44m"); if (chkmail()) strcat(buf, "¡¾[5;32mÐÅ[m[1;33;44m¡¿"); else strcat(buf, "¡¾ ¡¿"); strcat(buf, "ÐÅÏä [[32m°´[31mCtrl-Q[32mÇó¾È[33m] "); sprintf( buf2, "[[32m%s[33m][[32m%4.4d[33m,[32m%3.3d[33m][[32m%d[33m] [[32m%2s[33m]", insert_character ? "²åÈë" : "¸Äд", currln + 1, currpnt + 1, linelen-1, enabledbchar ? "Ë«" : "µ¥"); strcat(buf, buf2); sprintf(buf2, "\033[1;33m¡¾\033[1;32m%.23s\033[33m¡¿\033[m", getdatestring(now, DATE_ZH) + 6); strcat(buf, buf2); move(t_lines - 1, 0); clrtoeol(); prints("%s", buf); showansi = tmpshow; }
static void talk_request() { #ifdef LINUX /* * Linux 下連續 page 對方兩次就可以把對方踢出去: 這是由於某些系統一 * nal 進來就會將 signal handler 設定為內定的 handler, 不幸的是 * default 是將程 erminate. 解決方法是每次 signal 進來就重設 signal * handler */ signal(SIGUSR1, talk_request); #endif bell(); if (currutmp->msgcount) { char buf [200]; time_t now = time(0); sprintf(buf, "[1m[33;41m[%s][34;47m [%s] %s [0m", (currutmp->destuip)->userid, my_ctime(&now), (currutmp->sig == 2) ? "重要消息廣播!(請Ctrl-U,l查看熱訊記錄)" : "呼叫、呼叫,聽到請回答"); move(0, 0); clrtoeol(); outs(buf); refresh(); } else { uschar mode0 = currutmp->mode; char c0 = currutmp->chatid[0]; screenline *screen = (screenline *) calloc(t_lines, sizeof(screenline)); currutmp->mode = 0; currutmp->chatid[0] = 1; vs_save(screen); talkreply(); vs_restore(screen); currutmp->mode = mode0; currutmp->chatid[0] = c0; } }
int igetkey() { int mode; int ch, last, llast; int ret=0; if (keybuffer_count) { ret = *keybuffer; keybuffer++; keybuffer_count--; return ret; } mode = last = llast = 0; // if (ibufsize == icurrchar) // refresh(); while (1) { ch = igetch(); if (kicked) return KEY_TIMEOUT; if (check_calltime()) { mode = 0; continue; } #if defined(SMTH) || defined(FREE) if (scrint&&ch==Ctrl('V')) { if (getCurrentUser()&&HAS_PERM(getCurrentUser(),PERM_BASIC)&&!HAS_PERM(getCurrentUser(),PERM_DENYRELAX)&&uinfo.mode!=LOCKSCREEN&&!dicting) { dicting=1; exec_mbem("@mod:service/libdict.so#dict_main"); dicting=0; } continue; } #endif if (scrint&&(ch == KEY_TALK) && talkrequest) { if (uinfo.mode != CHAT1 && uinfo.mode != CHAT2 && uinfo.mode != CHAT3 && uinfo.mode != CHAT4 && uinfo.mode != TALK && uinfo.mode != PAGE) { talkreply(); return KEY_REFRESH; } else return KEY_TALK; } if (mode == 0) { if (ch == KEY_ESC) { if (ibufsize==icurrchar) { switch (uinfo.mode) { case POSTING: case SMAIL: case EDITUFILE: case EDITSFILE: case NOTEPAD: case EDIT: case EDITANN: case RMAIL: case CALENEDIT: case CSIE_ANNOUNCE: case POSTCROSS: break; default: return KEY_ESC; } } mode = 1; } else { ret = ch; break; /* Normal Key */ } } else if (mode == 1) { /* Escape sequence */ if (ch == '[' || ch == 'O') mode = 2; else if (ch == '1' || ch == '4') mode = 3; else { KEY_ESC_arg = ch; return KEY_ESC; } } else if (mode == 2) { /* Cursor key */ if (ch >= 'A' && ch <= 'D') { ret = KEY_UP + (ch - 'A'); break; } else if (ch >= 'P' && ch <= 'S') { ret = KEY_F1+ch-'P'; break; } else if (ch >= '1' && ch <= '6') mode = 3; else { ret = ch; break; } } else if (mode == 3) { /* Ins Del Home End PgUp PgDn */ if (ch == '~') { ret = KEY_HOME + (last - '1'); break; } else if (ch >= '0' && ch <= '9') mode = 4; else { ret = ch; break; } } else if (mode == 4) { if (ch == '~') { int k=(llast-'1')*10+(last-'1'); if (k<=3) ret = KEY_F1+k; else ret = KEY_F1+k-1; if (scrint&&ret==KEY_F10&&!incalendar) { mode=0; if (getCurrentUser()&&!HAS_PERM(getCurrentUser(),PERM_DENYRELAX)&&uinfo.mode!=LOCKSCREEN) exec_mbem("@mod:service/libcalendar.so#calendar_main"); continue; } else if (scrint&&ret==KEY_F6) { mode=0; auto_chinese(); continue; } else if (scrint&&ret==KEY_F9) { mode=0; if (getCurrentUser()&& (check_mail_perm(getCurrentUser(),NULL) == 0)) mailscr(); continue; } break; } else { ret = ch; break; } } llast = last; last = ch; } #ifdef NEW_HELP if (scrint && ret == KEY_F1 && uinfo.mode != LOCKSCREEN && !f1ing) { int oldmode = uinfo.mode; modify_user_mode(HELP); f1ing=1; newhelp(helpmode); f1ing=0; modify_user_mode(oldmode); return igetkey(); } #endif if (scrint&&keymem_total&&!skip_key&&!ingetdata) { int i,j,p; for (i=0; i<keymem_total; i++) { p=!keymem[i].status[0]; if (keymem[i].status[0]==-1) continue; j=0; while (keymem[i].status[j]&&j<10) { if (keymem[i].status[j]==uinfo.mode) p=1; j++; } if (p&&ret==keymem[i].key) { j=0; while (keymem[i].mapped[j]&&j<10) j++; if (j==0) continue; ret = keymem[i].mapped[0]; keybuffer_count = j-1; keybuffer = keymem[i].mapped+1; break; } } } return ret; }
int vedit(const char *filename, const char *saveheader, char *bname) { int ch, foo; int lastcharindent = -1; BOOL firstkey = TRUE; char bakfile[PATHLEN]; int old_rows = t_lines, old_columns = t_columns; sethomefile(bakfile, curuser.userid, UFNAME_EDIT); if ((saveheader || uinfo.mode == EDITPLAN || uinfo.mode == EDITBMWEL) && isfile(bakfile) /* lthuang */ #ifdef GUEST && strcmp(curuser.userid, GUEST) #endif ) { clear(); outs(_msg_edit_8); if (getkey() != '2') mycp(bakfile, filename); } if (!isfile(filename)) unlink(bakfile); if (saveheader) do_article_sig(filename); read_file(filename); top_of_win = firstline; currline = firstline; curr_window_line = 0; currpnt = 0; ansi_mode = FALSE; clear(); display_buffer(); move(curr_window_line, currpnt); while ((ch = getkey()) != EOF) { if (firstkey) { firstkey = FALSE; show_help_msg(); } if (talkrequest) /* lthuang */ { backup_file(bakfile); talkreply(); pressreturn(); ch = CTRL('G'); /* redraw screen */ } else if (msqrequest) /* lthuang */ { msqrequest = FALSE; msq_reply(); #if 0 ch = CTRL('G'); #endif } if (old_rows != t_lines || old_columns != t_columns) { static const char *msg_resized = "[1;34;47m螢幕大小已改變, 按(Ctrl-G)回到頁首![m"; old_rows = t_lines; old_columns = t_columns; top_of_win = firstline; currline = top_of_win; curr_window_line = 0; currpnt = 0; shift = 0; redraw_everything = TRUE; move(t_lines / 2, (t_columns - strlen(msg_resized)) / 2); outs(msg_resized); while (getkey() != CTRL('G')); } else if (ch < 0x100 && isprint2(ch)) { insert_char(ch); lastcharindent = -1; } else switch (ch) { case KEY_UP: if (lastcharindent == -1) lastcharindent = currpnt; if (!currline->prev) { bell(); break; } curr_window_line--; currline = currline->prev; currpnt = (currline->len > lastcharindent) ? lastcharindent : currline->len; break; case KEY_DOWN: if (lastcharindent == -1) lastcharindent = currpnt; if (!currline->next) { bell(); break; } curr_window_line++; currline = currline->next; currpnt = (currline->len > lastcharindent) ? lastcharindent : currline->len; break; default: lastcharindent = -1; switch (ch) { case CTRL('T'): top_of_win = back_line(lastline, b_lines - 2); currline = lastline; curr_window_line = getlineno(); currpnt = 0; redraw_everything = TRUE; break; case CTRL('S'): top_of_win = firstline; currline = top_of_win; curr_window_line = 0; currpnt = 0; redraw_everything = TRUE; break; case '\t': do { insert_char(' '); } while (currpnt & 0x7); break; case CTRL('U'): case CTRL('V'): insert_char(0x1b); break; case CTRL('C'): insert_char(0x1b); insert_char('['); insert_char('m'); break; case KEY_RIGHT: case CTRL('F'): if (currline->len == currpnt) { if (!currline->next) bell(); else { currpnt = 0; curr_window_line++; currline = currline->next; } } else currpnt++; break; case KEY_LEFT: case CTRL('B'): if (currpnt == 0) { if (!currline->prev) bell(); else { currline = currline->prev; currpnt = currline->len; curr_window_line--; } } else currpnt--; break; case CTRL('G'): clear(); redraw_everything = TRUE; break; case CTRL('Z'): vedit_help(); break; case KEY_PGUP: case CTRL('P'): top_of_win = back_line(top_of_win, b_lines - 2); currline = top_of_win; currpnt = 0; curr_window_line = 0; redraw_everything = TRUE; break; case KEY_PGDN: case CTRL('N'): top_of_win = forward_line(top_of_win, b_lines - 2); currline = top_of_win; currpnt = 0; curr_window_line = 0; redraw_everything = TRUE; break; case KEY_HOME: case CTRL('A'): currpnt = 0; break; case KEY_END: case CTRL('E'): currpnt = currline->len; break; case CTRL('R'): #if 0 backup_file(bakfile); #endif msq_reply(); #if 0 redraw_everything = TRUE; /* lthuang */ #endif break; case CTRL('Q'): ansi_mode = TRUE; display_buffer(); pressreturn(); ansi_mode = FALSE; display_buffer(); break; case CTRL('X'): case CTRL('W'): backup_file(bakfile); clear(); foo = write_file(filename, saveheader, bname); if (foo == BACKUP_EDITING) return foo; else if (foo != KEEP_EDITING) { unlink(bakfile); return foo; } redraw_everything = TRUE; /* lthuang */ break; case '\r': case '\n': split(currline, currpnt); /* lthuang: reduce the times of backup */ if (total_num_of_line % 7 == 0) backup_file(bakfile); break; case '\177': case CTRL('H'): if (currpnt == 0) { if (!currline->prev) { bell(); break; } curr_window_line--; currline = currline->prev; currpnt = currline->len; if (*killsp(currline->next->data) == '\0') { delete_line(currline->next); redraw_everything = TRUE; } else { join_currline(); } if (curr_window_line == -1) { curr_window_line = 0; top_of_win = currline; rscroll(); } break; } currpnt--; delete_char(); break; case CTRL('D'): if (currline->len == currpnt) join_currline(); else delete_char(); break; case CTRL('Y'): currpnt = 0; currline->len = 0; delete_currline(); break; case CTRL('K'): if (currline->len == 0) delete_currline(); else if (currline->len == currpnt) join_currline(); else { currline->len = currpnt; currline->data[currpnt] = '\0'; } break; default: break; } break; } if (curr_window_line == -1) { curr_window_line = 0; if (!top_of_win->prev) { indigestion(6); bell(); } else { top_of_win = top_of_win->prev; rscroll(); } } if (curr_window_line == t_lines - 1) { curr_window_line = t_lines - 2; if (!top_of_win->next) { indigestion(7); bell(); } else { top_of_win = top_of_win->next; scroll(); } } /* lthuang: 99/07 */ if (currpnt - shift >= t_columns - 1) { shift = (currpnt / (t_columns - 1)) * (t_columns - 1) - 1; redraw_everything = TRUE; } else if (currpnt - shift < 0) { shift = 0; redraw_everything = TRUE; } if (redraw_everything) { display_buffer(); redraw_everything = FALSE; } else { move(curr_window_line, 0); clrtoeol(); /* lthuang */ vedit_outs(currline->data); } move(curr_window_line, currpnt - shift); /* lthuang: 99/07 */ } if (uinfo.mode == POSTING || uinfo.mode == SMAIL) unlink(filename); return ABORT_EDITING; }