static void etsm_node_deleted (ETreeModel *etm, ETreePath child, ETreeSelectionModel *etsm) { restore_cursor (etsm, etm); }
static void etsm_node_changed (ETreeModel *etm, ETreePath node, ETreeSelectionModel *etsm) { restore_cursor (etsm, etm); }
void region_scroll_up(int top, int bottom) { int i; if (top > bottom) { i = top; top = bottom; bottom = i; } if (top < 0 || bottom >= scr_lns) return; for (i = top; i < bottom; i++) big_picture[i] = big_picture[i + 1]; memset(big_picture + i, 0, sizeof(*big_picture)); memset(big_picture[i].data, ' ', scr_cols); save_cursor(); change_scroll_range(top, bottom); do_move(0, bottom); scroll_forward(); change_scroll_range(0, scr_lns - 1); restore_cursor(); refresh(); }
static void etsm_node_removed (ETreeModel *etm, ETreePath parent, ETreePath child, gint old_position, ETreeSelectionModel *etsm) { restore_cursor (etsm, etm); }
int mouse_test(fb_info fb) { int fd; int xx = 123, yy = 234; if((fd = mouse_open("/dev/input/mice")) < 0) { perror("mouse_open"); exit(1); } mevent_t mevent; u8_t buf[] = {0xf3,0xc8,0xf3,0x64,0xf3,0x50}; if(write(fd, buf, sizeof(buf)) < sizeof(buf)) { perror("mouse_write"); fprintf(stderr, "Error write to mice device\n"); } save_cursor(fb,xx,yy,cursor_save); while(1) { if(mouse_parse(fd, &mevent) == 0 && (mevent.x || mevent.y || mevent.z || mevent.button)) { restore_cursor(fb,xx,yy,cursor_save); xx += mevent.x; yy += mevent.y; if(xx > 1366) xx = 1366; if(xx < 0) xx = 0; if(yy > 721) yy = 721; if(yy < 0) yy = 0; if(mevent.button == 1 && xx < 420) { if(xx >= 300 && yy >=210 && yy <= 290) who = 2; else if(xx >= 300 && yy >= 510 && yy <= 590) who = 1; } if(mevent.button == 1 && xx >= 420 && yy <= 710 && xx <= 1320) { if(! check(xx,yy)) { draw_piece(fb,(xx + 15)/30 * 30,yy/30 * 30 + 15,13,(who - 1) ? 0x00000000 : 0xffffffff); chess_count(xx, yy); if(check_all(fb)) exit(0); printf("%d %d\n",(xx + 15 - 420) / 30, (yy) / 30); who = (who - 1) ? 1 : 2; } } save_cursor(fb,xx,yy,cursor_save); draw_cursor(fb,xx,yy,cursor_16_25); } usleep(100); } }
/* Reset all of the keyboard modes. */ static void reset(void) { g_print(MODE_NORMAL_KEYPAD); decset(MODE_APPLICATION_CURSOR_KEYS, FALSE); decset(MODE_SUN_FUNCTION_KEYS, FALSE); decset(MODE_HP_FUNCTION_KEYS, FALSE); decset(MODE_XTERM_FUNCTION_KEYS, FALSE); decset(MODE_VT220_FUNCTION_KEYS, FALSE); reset_scrolling_region(); restore_cursor(); }
bool cTextField::handleClick(location clickLoc) { if(!haveFocus && parent && !parent->setFocus(this)) return true; haveFocus = true; redraw(); // This ensures the snippets array is populated. std::string contents = getText(); bool hadSelection = selectionPoint != insertionPoint; bool is_double = click_timer.getElapsedTime().asMilliseconds() < 500; click_timer.restart(); bool is_shift = sf::Keyboard::isKeyPressed(sf::Keyboard::LShift) || sf::Keyboard::isKeyPressed(sf::Keyboard::RShift); set_ip(clickLoc, is_shift ? &cTextField::selectionPoint : &cTextField::insertionPoint); if(!is_shift) selectionPoint = insertionPoint; if(is_double && !is_shift && !hadSelection) { cKey key = {true, key_word_right, mod_none}; if(insertionPoint < contents.size() && contents[insertionPoint] != ' ') handleInput(key); key.k = key_word_left; key.mod += mod_shift; handleInput(key); } bool done = false; sf::Event e; int initial_ip = insertionPoint, initial_sp = selectionPoint; while(!done) { redraw(); if(!inWindow->pollEvent(e)) continue; if(e.type == sf::Event::MouseButtonReleased){ done = true; } else if(e.type == sf::Event::MouseMoved){ restore_cursor(); location newLoc(e.mouseMove.x, e.mouseMove.y); set_ip(newLoc, &cTextField::selectionPoint); if(is_double) { if(selectionPoint > initial_ip) { insertionPoint = initial_sp; while(selectionPoint < contents.length() && contents[selectionPoint] != ' ') selectionPoint++; } else { insertionPoint = initial_ip; while(selectionPoint > 0 && contents[selectionPoint - 1] != ' ') selectionPoint--; } } } } redraw(); return true; }
int main(int argc, char* argv[]) { #if 0 void debug_oldstructs(); debug_oldstructs(); #endif try{ init_boe(argc, argv); if(!get_bool_pref("GameRunBefore")) cChoiceDlog("welcome").show(); else if(get_bool_pref("GiveIntroHint", true)) tip_of_day(); set_pref("GameRunBefore", true); finished_init = true; if(ae_loading) { finish_load_party(); post_load(); } menu_activate(); restore_cursor(); while(!All_Done) Handle_One_Event(); close_program(); return 0; } catch(std::exception& x) { showFatalError(x.what()); throw; } catch(std::string& x) { showFatalError(x); throw; } catch(...) { showFatalError("An unknown error occurred!"); throw; } }
LRESULT CALLBACK menuProc(HWND handle, UINT message, WPARAM wParam, LPARAM lParam) { MSG msg = {handle, message, wParam, lParam}; if(HIWORD(wParam) != 1 || message != WM_COMMAND) { if(TranslateAccelerator(handle, accel.handle, &msg)) return 0; } if(message == WM_COMMAND) { int cmd = LOWORD(wParam); if(cmd >= 1000 && cmd < 2000) { handle_monster_info_menu(cmd - 1000); } else if(cmd >= 2000 && cmd < 3000) { handle_menu_spell(cSpell::fromNum(eSkill::MAGE_SPELLS, cmd - 2000)); } else if(cmd >= 3000 && cmd < 4000) { handle_menu_spell(cSpell::fromNum(eSkill::PRIEST_SPELLS, cmd - 3000)); } else handle_menu_choice(menuChoices[cmd]); } else if(message == WM_SETCURSOR) { // Windows resets the cursor to an arrow whenever the mouse moves, unless we do this. // Note: By handling this message, sf::Window::setMouseCursorVisible() will NOT work. restore_cursor(); return true; } return CallWindowProc(reinterpret_cast<WNDPROC>(mainProc), handle, message, wParam, lParam); }
long CALLBACK WndProc (HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; //RECT s_rect = {0,0,30,30},d_rect = {0,0,30,30},d2 = {0,0,420,216},s2 = {0,0,420,216}; POINT press; short handled = 0,sbar_pos = 0,old_setting; long which_sbar; int min = 0, max = 0; HMENU menu; POINT p; RECT r; switch (message) { case WM_KEYDOWN: if (hwnd != mainPtr) { check_cd_event(hwnd,message,wParam,lParam); } else { All_Done = handle_syskeystroke(wParam,lParam,&handled); } return 0; break; case WM_CHAR: if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { All_Done = handle_keystroke(wParam,lParam); } return 0; break; case WM_LBUTTONDOWN: cursor_stay(); if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { SetFocus(hwnd); press = MAKEPOINT(lParam); All_Done = handle_action(press, wParam,lParam); check_game_done(); } return 0; break; case WM_LBUTTONUP: mouse_button_held = FALSE; break; case WM_RBUTTONDOWN: mouse_button_held = FALSE; cursor_stay(); if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else { SetFocus(hwnd); press = MAKEPOINT(lParam); All_Done = handle_action(press, wParam,-2); check_game_done(); } return 0; break; case WM_TIMER: // first, mouse held? if ((wParam == 1) && (mouse_button_held == TRUE)) { GetCursorPos(&p); ScreenToClient(mainPtr,&p); All_Done = handle_action(p, 0,0); } // second, refresh cursor? if ((wParam == 1) && (overall_mode < 60) && (GetFocus() == mainPtr)) { GetCursorPos(&p); ScreenToClient(mainPtr,&p); GetClientRect(mainPtr,&r); if (PtInRect(&r,p)) restore_cursor(); } if(play_anim == TRUE){ anim_ticks++; if(overall_mode < 60){ draw_terrain(); } if(overall_mode == 62){ if(store_ter.picture >= 2000) csp(813,14,store_ter.picture - 2000, 5); else if (store_ter.picture >= 400 && store_ter.picture < 1000) csp(813,14,store_ter.picture - 100, 0); if(do_choose_anim == TRUE){ put_choice_pics(); } } } break; case WM_PALETTECHANGED: palette_suspect = TRUE; return 0; case WM_ACTIVATE: if (hwnd == mainPtr) { if (((wParam == WA_ACTIVE) ||(wParam == WA_CLICKACTIVE)) && (palette_suspect == TRUE)) { palette_suspect = FALSE; } if ((wParam == WA_ACTIVE) ||(wParam == WA_CLICKACTIVE)) { window_in_front = TRUE; } if (wParam == WA_INACTIVE) { window_in_front = FALSE; } } return 0; case WM_MOUSEMOVE: if ((mouse_button_held == TRUE) && (hwnd == mainPtr)) { press = MAKEPOINT(lParam); All_Done = handle_action(press, wParam,lParam); } restore_cursor(); return 0; case WM_PAINT: hdc = BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); if (hwnd != mainPtr) check_cd_event(hwnd,message,wParam,lParam); else redraw_screen(); return 0; case WM_VSCROLL: which_sbar = GetWindowLong((HWND) lParam, GWL_ID); switch (which_sbar) { case 1: sbar_pos = GetScrollPos(right_sbar,SB_CTL); old_setting = sbar_pos; GetScrollRange(right_sbar,SB_CTL,&min,&max); switch (LOWORD(wParam)) { case SB_PAGEDOWN: sbar_pos += NRSONPAGE - 1; break; case SB_LINEDOWN: sbar_pos++; break; case SB_PAGEUP: sbar_pos -= NRSONPAGE - 1; break; case SB_LINEUP: sbar_pos--; break; case SB_TOP: sbar_pos = 0; break; case SB_BOTTOM: sbar_pos = max; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: sbar_pos = HIWORD(wParam); break; } if (sbar_pos < 0) sbar_pos = 0; if (sbar_pos > max) sbar_pos = max; lpsi.fMask = SIF_POS; lpsi.nPos = sbar_pos; SetScrollInfo(right_sbar,SB_CTL,&lpsi,TRUE); // SetScrollPos(right_sbar,SB_CTL,sbar_pos,TRUE); if (sbar_pos != old_setting) draw_rb(); break; } SetFocus(mainPtr); return 0; case WM_COMMAND: if (hwnd == mainPtr) { menu = GetMenu(mainPtr); handle_menu((short) wParam, menu); check_game_done(); } else { check_cd_event(hwnd,message,wParam,lParam); } return 0; case WM_DESTROY: case WM_CLOSE: if (hwnd == mainPtr) { discard_graphics(); PostQuitMessage(0); } return 0; case WM_QUIT: if (hwnd == mainPtr) discard_graphics(); break; } return DefWindowProc(hwnd,message,wParam,lParam); }
short check_cd_event(HWND hwnd, UINT message, WPARAM wparam,LPARAM lparam) { POINT press; short wind_hit = -1,item_hit = -1; switch (message) { case WM_COMMAND: if ((LOWORD(wparam) >= 150) && (LOWORD(wparam) <= 250)) { if (HIWORD(wparam) == EN_ERRSPACE) play_sound(0); return 0; } cd_find_dlog(hwnd,&wind_hit,&item_hit); // item_hit is dummy item_hit = (short) wparam; break; case WM_KEYDOWN: if ((wparam >= 150) && (wparam <= 250)) { return -1; } wind_hit = cd_process_syskeystroke(hwnd, wparam, lparam,&item_hit); break; case WM_CHAR: wind_hit = cd_process_keystroke(hwnd, wparam, lparam,&item_hit); break; case WM_LBUTTONDOWN: press = MAKEPOINT(lparam); wind_hit = cd_process_click(hwnd,press, wparam, lparam,&item_hit); break; case WM_RBUTTONDOWN: press = MAKEPOINT(lparam); wparam = wparam | MK_CONTROL; wind_hit = cd_process_click(hwnd,press, wparam, lparam,&item_hit); break; case WM_MOUSEMOVE: restore_cursor(); break; case WM_PAINT: cd_redraw(hwnd); break; } if (wind_hit < 0) return 0; switch (wind_hit) { case -1: break; case 970: case 971: case 972: case 973: display_strings_event_filter(item_hit); break; case 800: edit_make_scen_1_event_filter(item_hit); break; case 801: edit_make_scen_2_event_filter(item_hit); break; case 803: edit_scen_details_event_filter(item_hit); break; case 804: edit_scen_intro_event_filter(item_hit); break; case 805: set_starting_loc_filter(item_hit); break; case 806: edit_spec_item_event_filter(item_hit); break; case 807: edit_save_rects_event_filter(item_hit); break; case 808: edit_horses_event_filter(item_hit); break; case 809: edit_boats_event_filter(item_hit); break; case 810: edit_add_town_event_filter(item_hit); break; case 811: edit_scenario_events_event_filter(item_hit); break; case 812: edit_item_placement_event_filter(item_hit); break; case 813: edit_ter_type_event_filter(item_hit); break; case 814: edit_monst_type_event_filter(item_hit); break; case 815: edit_monst_abil_event_filter(item_hit); break; case 816: edit_text_event_filter(item_hit); break; case 817: edit_talk_node_event_filter(item_hit); break; case 818: edit_item_type_event_filter(item_hit); break; case 819: choose_graphic_event_filter(item_hit); break; case 820: choose_text_res_event_filter(item_hit); break; case 821: edit_basic_dlog_event_filter(item_hit); break; case 822: edit_spec_enc_event_filter(item_hit); break; case 824: edit_item_abil_event_filter(item_hit); break; case 825: edit_special_num_event_filter(item_hit); break; case 826: edit_spec_text_event_filter(item_hit); break; case 830: new_town_event_filter(item_hit); break; case 831: edit_sign_event_filter(item_hit); break; case 832: edit_town_details_event_filter(item_hit); break; case 833: edit_town_events_event_filter(item_hit); break; case 834: edit_advanced_town_event_filter(item_hit); break; case 835: edit_town_wand_event_filter(item_hit); break; case 836: edit_placed_item_event_filter(item_hit); break; case 837: edit_placed_monst_event_filter(item_hit); break; case 838: edit_placed_monst_adv_event_filter(item_hit); break; case 839: edit_town_strs_event_filter(item_hit); break; case 840: edit_area_rect_event_filter(item_hit); break; case 841: pick_import_town_event_filter(item_hit); break; case 842: edit_dialog_text_event_filter(item_hit); break; case 850: edit_out_strs_event_filter(item_hit); break; case 851: outdoor_details_event_filter(item_hit); break; case 852: edit_out_wand_event_filter(item_hit); break; case 854: pick_out_event_filter(item_hit); break; case 855: case 856: pick_town_num_event_filter(item_hit); break; case 857: change_ter_event_filter(item_hit); break; default: fancy_choice_dialog_event_filter (item_hit); break; } return 0; }
static void change_private_mode(int mode, int set) { switch (mode) { case 1: /* DECCKM */ console->cursor_key_mode = set; break; case 3: if (set) /* 132 column mode */ console_set_size(132, 24); else /* 80 column mode */ console_set_size(80, 24); /* Clear window content and reset scrolling regions */ erase_screen(2); set_pos(0, 0); break; case 6: console->origin_mode = set; break; case 7: console->wraparound_mode = set; break; case 47: if (set) switch_to_alternate_buffer(); else switch_to_normal_buffer(); break; case 1047: if (set) { if (console->out == console->normal_buffer) { switch_to_alternate_buffer(); erase_screen(ERASE_SCREEN_BEGIN_TO_END); } } else { if (console->out == console->alternate_buffer) { switch_to_normal_buffer(); erase_screen(ERASE_SCREEN_BEGIN_TO_END); } } break; case 1048: if (set) save_cursor(); else restore_cursor(); break; case 1049: if (set) { save_cursor(); if (console->out == console->normal_buffer) { switch_to_alternate_buffer(); erase_screen(ERASE_SCREEN_BEGIN_TO_END); } } else { if (console->out == console->alternate_buffer) { switch_to_normal_buffer(); erase_screen(ERASE_SCREEN_BEGIN_TO_END); } restore_cursor(); } break; default: log_error("change_private_mode(): private mode %d not supported.\n", mode); } }
static void control_escape(char ch) { switch (ch) { case '[': for (int i = 0; i < CONSOLE_MAX_PARAMS; i++) console->params[i] = 0; console->param_count = 0; console->csi_prefix = 0; console->processor = control_escape_csi; break; case ']': console->params[0] = 0; console->string_len = -1; console->processor = control_escape_osc; break; case 'D': /* IND */ nl(); console->processor = NULL; break; case 'E': /* NEL */ crnl(); console->processor = NULL; break; case 'M': /* RI */ if (console->y == console->scroll_top) scroll_down(1); else set_pos(console->x, console->y - 1); console->processor = NULL; break; case '(': console->processor = control_escape_set_default_character_set; break; case ')': console->processor = control_escape_set_alternate_character_set; break; case '#': console->processor = control_escape_sharp; break; case '7': /* DECSC */ save_cursor(); console->processor = NULL; break; case '8': /* DECRC */ restore_cursor(); console->processor = NULL; break; default: log_error("control_escape(): Unhandled character %c\n", ch); console->processor = NULL; } }
int main(int argc, char **argv) { char c; guint i; struct termios tcattr; GByteArray *bytes; gboolean done = FALSE, saved = FALSE; struct timeval tv; fd_set readset; /* Start up: save the cursor location and put the terminal in * raw mode. */ bytes = g_byte_array_new(); save_cursor(); if (tcgetattr(STDIN_FILENO, &tcattr) != 0) { perror("tcgetattr"); return 1; } original = tcattr; signal(SIGINT, sigint_handler); /* Here we approximate what cfmakeraw() would do, for the benefit * of systems which don't actually provide the function. */ tcattr.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); tcattr.c_oflag &= ~(OPOST); tcattr.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); tcattr.c_cflag &= ~(CSIZE | PARENB); tcattr.c_cflag |= CS8; #ifdef HAVE_CFMAKERAW cfmakeraw(&tcattr); #endif if (tcsetattr(STDIN_FILENO, TCSANOW, &tcattr) != 0) { perror("tcsetattr"); return 1; } /* Switch to the alternate screen, clear it, and reset the keyboard. */ decset(MODE_ALTERNATE_SCREEN, TRUE); clear(); reset(); /* Main processing loop. */ while (!done) { print_help(); set_scrolling_region(); if (saved) { restore_cursor(); } /* Read a single byte. */ if (read(STDIN_FILENO, &c, 1) != 1) { done = TRUE; } switch (c) { case 'A': case 'a': keypad_mode = 1 - keypad_mode; if (keypad_mode == normal) { g_print(MODE_NORMAL_KEYPAD); } else { g_print(MODE_APPLICATION_KEYPAD); } break; case 'B': case 'b': cursor_mode = 1 - cursor_mode; decset(MODE_APPLICATION_CURSOR_KEYS, cursor_mode == application); break; case 'C': case 'c': sun_fkeys = !sun_fkeys; decset(MODE_SUN_FUNCTION_KEYS, sun_fkeys); break; case 'D': case 'd': hp_fkeys = !hp_fkeys; decset(MODE_HP_FUNCTION_KEYS, hp_fkeys); break; case 'E': case 'e': xterm_fkeys = !xterm_fkeys; decset(MODE_XTERM_FUNCTION_KEYS, xterm_fkeys); break; case 'F': case 'f': vt220_fkeys = !vt220_fkeys; decset(MODE_VT220_FUNCTION_KEYS, vt220_fkeys); break; case 'R': case 'r': keypad_mode = cursor_mode = normal; sun_fkeys = hp_fkeys = xterm_fkeys = vt220_fkeys = FALSE; reset(); break; case 'Q': case 'q': done = TRUE; break; case 0x0c: /* ^L */ clear(); if (saved) { restore_cursor(); saved = FALSE; } break; default: /* We get here if it's not one of the keys we care * about, so it might be a sequence. */ if (saved) { restore_cursor(); } g_byte_array_append(bytes, &c, 1); /* Wait for up to just under 1/50 second. */ tv.tv_sec = 0; tv.tv_usec = 1000000 / 50; FD_ZERO(&readset); FD_SET(STDIN_FILENO, &readset); while (select(STDIN_FILENO + 1, &readset, NULL, NULL, &tv) == 1) { if (read(STDIN_FILENO, &c, 1) == 1) { g_byte_array_append(bytes, &c, 1); } else { break; } tv.tv_sec = 0; tv.tv_usec = 1000000 / 50; FD_ZERO(&readset); FD_SET(STDIN_FILENO, &readset); } /* Clear this line, and print the sequence. */ g_print(ESC "[K"); for (i = 0; i < bytes->len; i++) { if (bytes->data[i] == 27) { g_print("<ESC> "); } else if ((((guint8)bytes->data[i]) < 32) || (((guint8)bytes->data[i]) > 126)) { g_print("<0x%02x> ", bytes->data[i]); } else { g_print("`%c' ", bytes->data[i]); } } g_print("\r\n"); g_byte_array_set_size(bytes, 0); save_cursor(); saved = TRUE; break; } reset_scrolling_region(); } decset(MODE_ALTERNATE_SCREEN, FALSE); if (tcsetattr(STDIN_FILENO, TCSANOW, &original) != 0) { perror("tcsetattr"); return 1; } g_byte_array_free(bytes, TRUE); reset(); return 0; }
static void do_talk_char(struct talk_win *twin, int ch) { extern int dumb_term; extern screenline* big_picture; screenline* line; int i; char ch0, buf[81]; if (isprint2(ch)) { ch0 = big_picture[twin->curln].data[twin->curcol]; if (big_picture[twin->curln].len < 79) move(twin->curln, twin->curcol); else do_talk_nextline(twin); outc(ch); ++(twin->curcol); line = big_picture + twin->curln; if (twin->curcol < line->len) { /* insert */ ++(line->len); memcpy(buf, line->data + twin->curcol, 80); save_cursor(); do_move(twin->curcol, twin->curln); ochar(line->data[twin->curcol] = ch0); for (i = twin->curcol + 1; i < line->len; i++) ochar(line->data[i] = buf[i - twin->curcol - 1]); restore_cursor(); } line->data[line->len] = 0; return; } switch (ch) { case Ctrl('H'): case '\177': if (twin->curcol == 0) { return; } line = big_picture + twin->curln; --(twin->curcol); if (twin->curcol < line->len) { --(line->len); save_cursor(); do_move(twin->curcol, twin->curln); for (i = twin->curcol; i < line->len; i++) ochar(line->data[i] = line->data[i + 1]); line->data[i] = 0; ochar(' '); restore_cursor(); } move(twin->curln, twin->curcol); return; case Ctrl('D'): line = big_picture + twin->curln; if (twin->curcol < line->len) { --(line->len); save_cursor(); do_move(twin->curcol, twin->curln); for (i = twin->curcol; i < line->len; i++) ochar(line->data[i] = line->data[i + 1]); line->data[i] = 0; ochar(' '); restore_cursor(); } return; case Ctrl('G'): bell(); return; case Ctrl('B'): if (twin->curcol > 0) { --(twin->curcol); move(twin->curln, twin->curcol); } return; case Ctrl('F'): if (twin->curcol < 79) { ++(twin->curcol); move(twin->curln, twin->curcol); } return; case Ctrl('A'): twin->curcol = 0; move(twin->curln, twin->curcol); return; case Ctrl('K'): clrtoeol(); return; case Ctrl('Y'): twin->curcol = 0; move(twin->curln, twin->curcol); clrtoeol(); return; case Ctrl('E'): twin->curcol = big_picture[twin->curln].len; move(twin->curln, twin->curcol); return; case Ctrl('M'): case Ctrl('J'): line = big_picture + twin->curln; strncpy(buf, line->data, line->len); buf[line->len] = 0; if (dumb_term) outc('\n'); do_talk_nextline(twin); break; case Ctrl('P'): line = big_picture + twin->curln; strncpy(buf, line->data, line->len); buf[line->len] = 0; if (twin->curln > twin->sline) { --(twin->curln); move(twin->curln, twin->curcol); } break; case Ctrl('N'): line = big_picture + twin->curln; strncpy(buf, line->data, line->len); buf[line->len] = 0; if (twin->curln < twin->eline) { ++(twin->curln); move(twin->curln, twin->curcol); } break; } str_trim(buf); if (*buf) fprintf(flog, "%s%s: %s%s\n", (twin->eline == b_lines - 1) ? "[1;33m" : "", (twin->eline == b_lines - 1) ? getuserid(currutmp->destuid) : cuser.userid, buf, (ch == Ctrl('P')) ? "[37;45m(Up)[m" : "[m"); }