int restore() { gfx_restore(gfx); gfx_enable_depth_buffer(gfx, 1); if (atlases_restore(atlases, gfx) != 0) { LOGE("Error occurred during sprites restoring"); return -1; } if (gfx_load_shader_from_file(gfx, "text", "shaders/text.shader") || gfx_load_shader_from_file(gfx, "textured", "shaders/textured.shader") || gfx_load_shader_from_file(gfx, "solid", "shaders/solid.shader") || gfx_load_shader_from_file(gfx, "postprocess", "shaders/postprocess.shader") || gfx_load_shader_from_file(gfx, "debug", "shaders/debug.shader")) { LOGE("Error loading resources"); return -1; } font_restore(font, gfx); font_restore(big_font, gfx); return 0; }
static void keyboard_console_handler(void) { unsigned char buffer[128], scancode; int pressed, repeated, num_bytes, i, key, extended; int vt, orig_vt; struct kbentry entry; struct vt_stat vt_state; num_bytes = read(key_fd, &buffer, sizeof(buffer)); if (num_bytes > 0) { for (i = 0; i < num_bytes; i++) { scancode = kernel_to_scancode[buffer[i] & 0x7F]; pressed = (buffer[i] & 0x80) ^ 0x80; repeated = pressed && key_state[scancode]; key_state[scancode] = pressed; /* Since we took over keyboard control, we have to map our keypresses to ascii * in order to report them in our own keyboard buffer */ extended = 0; switch (scancode) { case SC_CAPSLOCK: if (pressed) key_leds ^= LED_CAP; break; case SC_NUMLOCK: if (pressed) key_leds ^= LED_NUM; break; case SC_SCROLLLOCK: if (pressed) key_leds ^= LED_SCR; break; default: extended = fb_hScancodeToExtendedKey( scancode ); break; } /* Fill in kbentry struct for KDGKBENT query */ entry.kb_table = 0; /* modifier table */ if (key_state[SC_LSHIFT] || key_state[SC_RSHIFT]) entry.kb_table |= 0x1; if (key_state[SC_ALTGR]) entry.kb_table |= 0x2; if (key_state[SC_CONTROL]) entry.kb_table |= 0x4; if (key_state[SC_ALT]) entry.kb_table |= 0x8; entry.kb_index = scancode; /* keycode */ ioctl(key_fd, KDGKBENT, &entry); if (scancode == SC_BACKSPACE) key = 8; else if (entry.kb_value == K_NOSUCHMAP) key = 0; else { key = KVAL(entry.kb_value); switch (KTYP(entry.kb_value)) { case KT_LETTER: if (key_leds & LED_CAP) key ^= 0x20; break; case KT_LATIN: case KT_ASCII: break; case KT_PAD: if (key < NUM_PAD_KEYS) { if (key_leds & LED_NUM) key = pad_numlock_ascii[key]; else key = pad_ascii[key]; } else key = 0; break; case KT_SPEC: if (scancode == SC_ENTER) key = '\r'; break; case KT_CONS: vt = key + 1; if( pressed && (ioctl(key_fd, VT_GETSTATE, &vt_state) >= 0) ) { orig_vt = vt_state.v_active; if (vt != orig_vt) { if (__fb_con.gfx_exit) { gfx_save(); ioctl(key_fd, KDSETMODE, KD_TEXT); } ioctl(key_fd, VT_ACTIVATE, vt); ioctl(key_fd, VT_WAITACTIVE, vt); while (ioctl(key_fd, VT_WAITACTIVE, orig_vt) < 0) usleep(50000); if (__fb_con.gfx_exit) { ioctl(key_fd, KDSETMODE, KD_GRAPHICS); gfx_restore(); } memset(key_state, FALSE, 128); } else { key_state[scancode] = FALSE; } extended = 0; } /* fallthrough */ default: key = 0; break; } } if( extended ) key = extended; if( pressed && key ) { key_buffer[key_tail] = key; if (((key_tail + 1) & (KEY_BUFFER_SIZE - 1)) == key_head) key_head = (key_head + 1) & (KEY_BUFFER_SIZE - 1); key_tail = (key_tail + 1) & (KEY_BUFFER_SIZE - 1); } if( gfx_key_handler ) gfx_key_handler( pressed, repeated, scancode, key ); } } /* CTRL + C */ if( key_state[SC_CONTROL] && key_state[SC_C] ) kill(main_pid, SIGINT); }