📄 xcurse.c
字号:
return(Ntemp);}void wmove(window, row, column) /* move cursor to indicated position in window */WINDOW *window;int row, column;{ if ((row < window->Num_lines) && (column < window->Num_cols)) { window->LX = column; window->LY = row; }}void clear_line(line, column, cols)struct _line *line;int column;int cols;{ int j; if (column > line->last_char) { for (j = line->last_char; j < column; j++) { line->row[j] = ' '; line->attributes[j] = (char) NULL; } } line->last_char = column; line->row[column] = (char) NULL; line->attributes[column] = (char) NULL; line->changed = TRUE;}void werase(window) /* clear the specified window */WINDOW *window;{ int i; struct _line *tmp; window->SCROLL_CLEAR = CLEAR; window->scroll_up = window->scroll_down = 0; for (i = 0, tmp = window->first_line; i < window->Num_lines; i++, tmp = tmp->next_screen) clear_line(tmp, 0, window->Num_cols);}void wclrtoeol(window) /* erase from current cursor position to end of line */WINDOW *window;{ int column, row; struct _line *tmp; window->SCROLL_CLEAR = CHANGE; column = window->LX; row = window->LY; for (row = 0, tmp = window->first_line; row < window->LY; row++) tmp = tmp->next_screen; clear_line(tmp, column, window->Num_cols);}void wrefresh(window) /* flush all previous output */WINDOW *window;{ wnoutrefresh(window); doupdate(); virtual_scr->SCROLL_CLEAR = FALSE; virtual_scr->scroll_down = virtual_scr->scroll_up = 0; XFlush(dp);}void touchwin(window)WINDOW *window;{ struct _line *user_line; int line_counter = 0; for (line_counter = 0, user_line = window->first_line; line_counter < window->Num_lines; line_counter++) { user_line->changed = TRUE; } window->SCROLL_CLEAR = TRUE;}void wnoutrefresh(window)WINDOW *window;{ struct _line *user_line; struct _line *virtual_line; int line_counter = 0; int user_col = 0; int virt_col = 0; cursor(virtual_scr, virtual_scr->LY, virtual_scr->LX, TRUE, FALSE); if (window->SR >= virtual_scr->Num_lines) return; user_line = window->first_line; virtual_line = virtual_scr->first_line; virtual_scr->SCROLL_CLEAR = window->SCROLL_CLEAR; virtual_scr->LX = window->LX + window->SC; virtual_scr->LY = window->LY + window->SR; virtual_scr->scroll_up = window->scroll_up; virtual_scr->scroll_down = window->scroll_down; if ((last_window_refreshed == window) && (!window->SCROLL_CLEAR)) return; for (line_counter = 0; line_counter < window->SR; line_counter++) { virtual_line = virtual_line->next_screen; } for (line_counter = 0; (line_counter < window->Num_lines) && ((line_counter + window->SR) < virtual_scr->Num_lines); line_counter++) { if ((last_window_refreshed != window) || (user_line->changed) || ((SCROLL | CLEAR) & window->SCROLL_CLEAR)) { for (user_col = 0, virt_col = window->SC; (virt_col < virtual_scr->Num_cols) && (user_col < user_line->last_char); virt_col++, user_col++) { virtual_line->row[virt_col] = user_line->row[user_col]; virtual_line->attributes[virt_col] = user_line->attributes[user_col]; } for (user_col = user_line->last_char, virt_col = window->SC + user_line->last_char; (virt_col < virtual_scr->Num_cols) && (user_col < window->Num_cols); virt_col++, user_col++) { virtual_line->row[virt_col] = ' '; virtual_line->attributes[virt_col] = (char) NULL; } } if (virtual_scr->Num_cols != window->Num_cols) { if (virtual_line->last_char < (user_line->last_char + window->SC)) { if (virtual_line->row[virtual_line->last_char] == (char) NULL) virtual_line->row[virtual_line->last_char] = ' '; virtual_line->last_char = min(virtual_scr->Num_cols, (user_line->last_char + window->SC)); } } else virtual_line->last_char = user_line->last_char; virtual_line->row[virtual_line->last_char] = (char) NULL; virtual_line->changed = user_line->changed; virtual_line = virtual_line->next_screen; user_line = user_line->next_screen; } window->SCROLL_CLEAR = FALSE; window->scroll_up = window->scroll_down = 0; last_window_refreshed = window;}void flushinp() /* flush input */{}int wgetch(window) /* get character from specified window */WINDOW *window;{ int status; int in_value; char temp; KeySym keysym_return; if ((status = XLookupString(keyevent, &temp, 1, &keysym_return, NULL))) in_value = temp; else if ((IsModifierKey(keysym_return)) || (IsMiscFunctionKey(keysym_return))) { in_value = 0; } else {/* key_code = XKeysymToKeycode(dp, keysym_return); */ in_value = look_up_key(keysym_return); } return(in_value);}intlook_up_key(key_code) /* decode mapping of key */int key_code;{ int count; count = 0; while ((Key_vals[count] != 255) && (key_code != XKey_vals[count])) count++; if (XKey_vals[count] == key_code) return(Key_vals[count]); else {#ifdef TEST wmove(stdscr, 0, 0); wclrtoeol(stdscr); wprintw(stdscr, "unknown keycode = %o", key_code); wrefresh(stdscr);#endif return(0); }}void waddch(window, c) /* output the character in the specified window */WINDOW *window;int c;{ int column, j; int shift; /* number of spaces to shift if a tab */ struct _line *tmpline; column = window->LX; if (c == '\t') { shift = (column + 1) % 8; if (shift == 0) shift++; else shift = 9 - shift; while (shift > 0) { shift--; waddch(window, ' '); } } else if ((!((window->LY >= (window->Num_lines - 1)) && (column >= (window->Num_cols - 1)))) && (column < window->Num_cols) && (window->LY < window->Num_lines)) { if (( c != '\b') && (c != '\n') && (c != '\r')) { tmpline = window->first_line; tmpline = window->line_array[window->LY]; tmpline->changed = TRUE; tmpline->row[column] = c; tmpline->attributes[column] = window->Attrib; if (column >= tmpline->last_char) { if (column > tmpline->last_char) for (j = tmpline->last_char; j < column; j++) { tmpline->row[j] = ' '; tmpline->attributes[j] = (char) NULL; } tmpline->row[column + 1] = (char) NULL; tmpline->attributes[column + 1] = (char) NULL; tmpline->last_char = column + 1; } } if (c == '\n') { wclrtoeol(window); window->LX = window->Num_cols; } else if (c == '\r') window->LX = 0; else if (c == '\b') window->LX--; else window->LX++; } if (window->LX >= window->Num_cols) { window->LX = 0; window->LY++; if (window->LY >= window->Num_lines) { window->LY = window->Num_lines - 1; wmove(window, 0, 0); wdeleteln(window); wmove(window, window->LY, 0); } } window->SCROLL_CLEAR = CHANGE;}void winsertln(window) /* insert a blank line into the specified window */WINDOW *window;{ int row, column; struct _line *tmp; struct _line *tmp1; window->scroll_down += 1; window->SCROLL_CLEAR = SCROLL; column = window->LX; row = window->LY; for (row = 0, tmp = window->first_line; (row < window->Num_lines) && (tmp->next_screen != NULL); row++) tmp = tmp->next_screen; if (tmp->prev_screen != NULL) tmp->prev_screen->next_screen = NULL; tmp1 = tmp; clear_line(tmp1, 0, window->Num_cols); tmp1->number = -1; for (row = 0, tmp = window->first_line; (row < window->LY) && (tmp->next_screen != NULL); row++) tmp = tmp->next_screen; if ((window->LY == (window->Num_lines - 1)) && (window->Num_lines > 1)) { tmp1->next_screen = tmp->next_screen; tmp->next_screen = tmp1; tmp->next_screen->prev_screen = tmp; } else if (window->Num_lines > 1) { if (tmp->prev_screen != NULL) tmp->prev_screen->next_screen = tmp1; tmp1->prev_screen = tmp->prev_screen; tmp->prev_screen = tmp1; tmp1->next_screen = tmp; tmp->scroll = DOWN; } if (window->LY == 0) window->first_line = tmp1; for (row = 0, tmp1 = window->first_line; row < window->Num_lines; row++) { window->line_array[row] = tmp1; tmp1 = tmp1->next_screen; }}void wdeleteln(window) /* delete a line in the specified window */WINDOW *window;{ int row, column; struct _line *tmp; struct _line *tmpline; if (window->Num_lines > 1) { window->scroll_up += 1; window->SCROLL_CLEAR = SCROLL; column = window->LX; row = window->LY; for (row = 0, tmp = window->first_line; row < window->LY; row++) tmp = tmp->next_screen; if (window->LY == 0) window->first_line = tmp->next_screen; if (tmp->prev_screen != NULL) tmp->prev_screen->next_screen = tmp->next_screen; if (tmp->next_screen != NULL) { tmp->next_screen->scroll = UP; tmp->next_screen->prev_screen = tmp->prev_screen; } tmpline = tmp; clear_line(tmpline, 0, window->Num_cols); tmpline->number = -1; for (row = 0, tmp = window->first_line; tmp->next_screen != NULL; row++) { tmp = tmp->next_screen; } if (tmp != NULL) { tmp->next_screen = tmpline; tmp->next_screen->prev_screen = tmp; tmp = tmp->next_screen; } else tmp = tmpline; tmp->next_screen = NULL; for (row = 0, tmp = window->first_line; row < window->Num_lines; row++) { window->line_array[row] = tmp; tmp = tmp->next_screen; } } else { clear_line(window->first_line, 0, window->Num_cols); }}void wclrtobot(window) /* delete from current position to end of the window */WINDOW *window;{ int row, column; struct _line *tmp; window->SCROLL_CLEAR |= CLEAR; column = window->LX; row = window->LY; for (row = 0, tmp = window->first_line; row < window->LY; row++) tmp = tmp->next_screen; clear_line(tmp, column, window->Num_cols); for (row = (window->LY + 1); row < window->Num_lines; row++) { tmp = tmp->next_screen; clear_line(tmp, 0, window->Num_cols); } wmove(window, row, column);}void wstandout(window) /* begin standout mode in window */WINDOW *window;{ window->Attrib |= A_STANDOUT;}void wstandend(window) /* end standout mode in window */WINDOW *window;{ window->Attrib &= ~A_STANDOUT;}void waddstr(window, string) /* write 'string' in window */WINDOW *window;char *string;{ char *wstring; for (wstring = string; *wstring != (char) NULL; wstring++) waddch(window, *wstring);}void clearok(window, flag) /* erase screen and redraw at next refresh */WINDOW *window;int flag;{ Repaint_screen = TRUE; clear_win = window;}void echo() /* turn on echoing */{}void noecho() /* turn off echoing */{}void raw() /* set to read characters immediately */{}void noraw() /* set to normal character read mode */{}void nl(){}void nonl(){}void saveterm(){}void fixterm(){}void resetterm(){}void nodelay(window, flag)WINDOW *window;int flag;{}void idlok(window, flag)WINDOW *window;int flag;{}void keypad(window, flag)WINDOW *window;int flag;{}void savetty() /* save current tty stats */{}void resetty() /* restore previous tty stats */{}void endwin() /* end windows */{ keypad(stdscr, FALSE); free(stdscr); initialized = FALSE;}void delwin(window) /* delete the window structure */WINDOW *window;{ int i; for (i = 1; (i < window->Num_lines) && (window->first_line->next_screen != NULL); i++) { window->first_line = window->first_line->next_screen; free(window->first_line->prev_screen->row); free(window->first_line->prev_screen->attributes); free(window->first_line->prev_screen); } if (window->first_line != NULL) { free(window->first_line->row); free(window->first_line->attributes); free(window->first_line); free(window); }}#ifndef __STDC__void wprintw(va_alist)va_dcl#else /* __STDC__ */void wprintw(WINDOW *window, const char *format, ...)#endif /* __STDC__ */{#ifndef __STDC__ WINDOW *window; char *format; va_list ap;#else va_list ap;#endif int value; char *fpoint; char *wtemp;#ifndef __STDC__ va_start(ap); window = va_arg(ap, WINDOW *); format = va_arg(ap, char *);#else /* __STDC__ */ va_start(ap, format);#endif /* __STDC__ */ fpoint = (char *) format; while (*fpoint != (char) NULL) { if (*fpoint == '%') { fpoint++; if (*fpoint == 'd') { value = va_arg(ap, int); iout(window, value, 10); } else if (*fpoint == 'c') { value = va_arg(ap, int); waddch(window, value); } else if (*fpoint == 's') { wtemp = va_arg(ap, char *); waddstr(window, wtemp); } fpoint++; } else if (*fpoint == '\\') { fpoint++; if (*fpoint == 'n') waddch(window, '\n'); else if ((*fpoint >= '0') && (*fpoint <= '9')) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -