static void curses_resize(DisplayState *ds, int w, int h) { if (w == gwidth && h == gheight) return; gwidth = w; gheight = h; curses_calc_pad(); }
static void curses_resize(DisplayState *ds, int width, int height) { if (width == gwidth && height == gheight) { return; } gwidth = width; gheight = height; curses_calc_pad(); }
static void curses_resize(DisplayChangeListener *dcl, int width, int height) { if (width == gwidth && height == gheight) { return; } gwidth = width; gheight = height; curses_calc_pad(); }
static void curses_resize(DisplayState *ds) { if (ds_get_width(ds) == gwidth && ds_get_height(ds) == gheight) return; gwidth = ds_get_width(ds); gheight = ds_get_height(ds); curses_calc_pad(); ds->surface->width = width * FONT_WIDTH; ds->surface->height = height * FONT_HEIGHT; }
static void curses_winch_handler(int signum) { struct winsize { unsigned short ws_row; unsigned short ws_col; unsigned short ws_xpixel; /* unused */ unsigned short ws_ypixel; /* unused */ } ws; /* terminal size changed */ if (ioctl(1, TIOCGWINSZ, &ws) == -1) return; resize_term(ws.ws_row, ws.ws_col); curses_calc_pad(); invalidate = 1; /* some systems require this */ signal(SIGWINCH, curses_winch_handler); }
static void curses_refresh(DisplayChangeListener *dcl) { int chr, nextchr, keysym, keycode, keycode_alt; if (invalidate) { clear(); refresh(); curses_calc_pad(); vga_hw_invalidate(); invalidate = 0; } vga_hw_text_update(screen); nextchr = ERR; while (1) { /* while there are any pending key strokes to process */ if (nextchr == ERR) chr = getch(); else { chr = nextchr; nextchr = ERR; } if (chr == ERR) break; #ifdef KEY_RESIZE /* this shouldn't occur when we use a custom SIGWINCH handler */ if (chr == KEY_RESIZE) { clear(); refresh(); curses_calc_pad(); curses_update(dcl, 0, 0, width, height); continue; } #endif keycode = curses2keycode[chr]; keycode_alt = 0; /* alt key */ if (keycode == 1) { nextchr = getch(); if (nextchr != ERR) { chr = nextchr; keycode_alt = ALT; keycode = curses2keycode[nextchr]; nextchr = ERR; if (keycode != -1) { keycode |= ALT; /* process keys reserved for qemu */ if (keycode >= QEMU_KEY_CONSOLE0 && keycode < QEMU_KEY_CONSOLE0 + 9) { erase(); wnoutrefresh(stdscr); console_select(keycode - QEMU_KEY_CONSOLE0); invalidate = 1; continue; } } } } if (kbd_layout) { keysym = -1; if (chr < CURSES_KEYS) keysym = curses2keysym[chr]; if (keysym == -1) { if (chr < ' ') { keysym = chr + '@'; if (keysym >= 'A' && keysym <= 'Z') keysym += 'a' - 'A'; keysym |= KEYSYM_CNTRL; } else keysym = chr; } keycode = keysym2scancode(kbd_layout, keysym & KEYSYM_MASK); if (keycode == 0) continue; keycode |= (keysym & ~KEYSYM_MASK) >> 16; keycode |= keycode_alt; } if (keycode == -1) continue; if (is_graphic_console()) { /* since terminals don't know about key press and release * events, we need to emit both for each key received */ if (keycode & SHIFT) kbd_put_keycode(SHIFT_CODE); if (keycode & CNTRL) kbd_put_keycode(CNTRL_CODE); if (keycode & ALT) kbd_put_keycode(ALT_CODE); if (keycode & ALTGR) { kbd_put_keycode(SCANCODE_EMUL0); kbd_put_keycode(ALT_CODE); } if (keycode & GREY) kbd_put_keycode(GREY_CODE); kbd_put_keycode(keycode & KEY_MASK); if (keycode & GREY) kbd_put_keycode(GREY_CODE); kbd_put_keycode((keycode & KEY_MASK) | KEY_RELEASE); if (keycode & ALTGR) { kbd_put_keycode(SCANCODE_EMUL0); kbd_put_keycode(ALT_CODE | KEY_RELEASE); } if (keycode & ALT) kbd_put_keycode(ALT_CODE | KEY_RELEASE); if (keycode & CNTRL) kbd_put_keycode(CNTRL_CODE | KEY_RELEASE); if (keycode & SHIFT) kbd_put_keycode(SHIFT_CODE | KEY_RELEASE); } else { keysym = curses2qemu[chr]; if (keysym == -1) keysym = chr; kbd_put_keysym(keysym); } } }
static void curses_refresh(DisplayState *ds) { int chr, nextchr, keysym, keycode; if (invalidate) { clear(); refresh(); curses_calc_pad(); ds->surface->width = FONT_WIDTH * width; ds->surface->height = FONT_HEIGHT * height; vga_hw_invalidate(); invalidate = 0; } vga_hw_text_update(screen); nextchr = ERR; while (1) { /* while there are any pending key strokes to process */ if (nextchr == ERR) chr = getch(); else { chr = nextchr; nextchr = ERR; } if (chr == ERR) break; #ifdef KEY_RESIZE /* this shouldn't occur when we use a custom SIGWINCH handler */ if (chr == KEY_RESIZE) { clear(); refresh(); curses_calc_pad(); curses_update(ds, 0, 0, width, height); ds->surface->width = FONT_WIDTH * width; ds->surface->height = FONT_HEIGHT * height; continue; } #endif keycode = curses2keycode[chr]; if (keycode == -1) continue; /* alt key */ if (keycode == 1) { nextchr = getch(); if (nextchr != ERR) { keycode = curses2keycode[nextchr]; nextchr = ERR; if (keycode == -1) continue; keycode |= ALT; /* process keys reserved for qemu */ if (keycode >= QEMU_KEY_CONSOLE0 && keycode < QEMU_KEY_CONSOLE0 + 9) { erase(); wnoutrefresh(stdscr); console_select(keycode - QEMU_KEY_CONSOLE0); invalidate = 1; continue; } } } if (kbd_layout && !(keycode & GREY)) { keysym = keycode2keysym[keycode & KEY_MASK]; if (keysym == -1) keysym = chr; keycode &= ~KEY_MASK; keycode |= keysym2scancode(kbd_layout, keysym); } if (is_graphic_console()) { /* since terminals don't know about key press and release * events, we need to emit both for each key received */ if (keycode & SHIFT) kbd_put_keycode(SHIFT_CODE); if (keycode & CNTRL) kbd_put_keycode(CNTRL_CODE); if (keycode & ALT) kbd_put_keycode(ALT_CODE); if (keycode & GREY) kbd_put_keycode(GREY_CODE); kbd_put_keycode(keycode & KEY_MASK); if (keycode & GREY) kbd_put_keycode(GREY_CODE); kbd_put_keycode((keycode & KEY_MASK) | KEY_RELEASE); if (keycode & ALT) kbd_put_keycode(ALT_CODE | KEY_RELEASE); if (keycode & CNTRL) kbd_put_keycode(CNTRL_CODE | KEY_RELEASE); if (keycode & SHIFT) kbd_put_keycode(SHIFT_CODE | KEY_RELEASE); } else { keysym = curses2keysym[chr]; if (keysym == -1) keysym = chr; kbd_put_keysym(keysym); } } }
static void curses_refresh(DisplayChangeListener *dcl) { int chr, keysym, keycode, keycode_alt; curses_winch_check(); if (invalidate) { clear(); refresh(); curses_calc_pad(); graphic_hw_invalidate(NULL); invalidate = 0; } graphic_hw_text_update(NULL, screen); while (1) { /* while there are any pending key strokes to process */ chr = getch(); if (chr == ERR) break; #ifdef KEY_RESIZE /* this shouldn't occur when we use a custom SIGWINCH handler */ if (chr == KEY_RESIZE) { clear(); refresh(); curses_calc_pad(); curses_update(dcl, 0, 0, width, height); continue; } #endif keycode = curses2keycode[chr]; keycode_alt = 0; /* alt key */ if (keycode == 1) { int nextchr = getch(); if (nextchr != ERR) { chr = nextchr; keycode_alt = ALT; keycode = curses2keycode[chr]; if (keycode != -1) { keycode |= ALT; /* process keys reserved for qemu */ if (keycode >= QEMU_KEY_CONSOLE0 && keycode < QEMU_KEY_CONSOLE0 + 9) { erase(); wnoutrefresh(stdscr); console_select(keycode - QEMU_KEY_CONSOLE0); invalidate = 1; continue; } } } } if (kbd_layout) { keysym = -1; if (chr < CURSES_KEYS) keysym = curses2keysym[chr]; if (keysym == -1) { if (chr < ' ') { keysym = chr + '@'; if (keysym >= 'A' && keysym <= 'Z') keysym += 'a' - 'A'; keysym |= KEYSYM_CNTRL; } else keysym = chr; } keycode = keysym2scancode(kbd_layout, keysym & KEYSYM_MASK, false, false, false); if (keycode == 0) continue; keycode |= (keysym & ~KEYSYM_MASK) >> 16; keycode |= keycode_alt; } if (keycode == -1) continue; if (qemu_console_is_graphic(NULL)) { /* since terminals don't know about key press and release * events, we need to emit both for each key received */ if (keycode & SHIFT) { qemu_input_event_send_key_number(NULL, SHIFT_CODE, true); qemu_input_event_send_key_delay(0); } if (keycode & CNTRL) { qemu_input_event_send_key_number(NULL, CNTRL_CODE, true); qemu_input_event_send_key_delay(0); } if (keycode & ALT) { qemu_input_event_send_key_number(NULL, ALT_CODE, true); qemu_input_event_send_key_delay(0); } if (keycode & ALTGR) { qemu_input_event_send_key_number(NULL, GREY | ALT_CODE, true); qemu_input_event_send_key_delay(0); } qemu_input_event_send_key_number(NULL, keycode & KEY_MASK, true); qemu_input_event_send_key_delay(0); qemu_input_event_send_key_number(NULL, keycode & KEY_MASK, false); qemu_input_event_send_key_delay(0); if (keycode & ALTGR) { qemu_input_event_send_key_number(NULL, GREY | ALT_CODE, false); qemu_input_event_send_key_delay(0); } if (keycode & ALT) { qemu_input_event_send_key_number(NULL, ALT_CODE, false); qemu_input_event_send_key_delay(0); } if (keycode & CNTRL) { qemu_input_event_send_key_number(NULL, CNTRL_CODE, false); qemu_input_event_send_key_delay(0); } if (keycode & SHIFT) { qemu_input_event_send_key_number(NULL, SHIFT_CODE, false); qemu_input_event_send_key_delay(0); } } else { keysym = -1; if (chr < CURSES_KEYS) { keysym = curses2qemu[chr]; } if (keysym == -1) keysym = chr; kbd_put_keysym(keysym); } } }