void fb_hXTermExitFocus(void) { #ifndef DISABLE_X11 ref_count--; if (ref_count > 0) return; X.CloseDisplay(display); fb_hDynUnload(&xlib); #endif }
static int keyboard_init(void) { #ifndef DISABLE_X11 const char *funcs[] = { "XOpenDisplay", "XCloseDisplay", "XQueryKeymap", "XDisplayKeycodes", "XGetKeyboardMapping", NULL }; #endif struct termios term; main_pid = getpid(); old_getch = __fb_con.keyboard_getch; if(__fb_con.inited == INIT_CONSOLE) { key_fd = dup(__fb_con.h_in); term.c_iflag = 0; term.c_cflag = CS8; term.c_lflag = 0; term.c_cc[VMIN] = 0; term.c_cc[VTIME] = 0; if ((ioctl(key_fd, KDGKBMODE, &key_old_mode) < 0) || (tcsetattr(key_fd, TCSANOW, &term) < 0) || (ioctl(key_fd, KDSKBMODE, K_MEDIUMRAW) < 0)) { close(key_fd); return -1; } __fb_con.keyboard_handler = keyboard_console_handler; __fb_con.keyboard_getch = keyboard_console_getch; key_head = key_tail = 0; ioctl(key_fd, KDGETLED, &key_leds); } #ifndef DISABLE_X11 else { xlib = fb_hDynLoad("libX11.so", funcs, (void **)&X); if (!xlib) return -1; display = X.OpenDisplay(NULL); if (!display) return -1; fb_hInitX11KeycodeToScancodeTb( display, X.DisplayKeycodes, X.GetKeyboardMapping ); fb_hXTermInitFocus(); __fb_con.keyboard_handler = keyboard_x11_handler; } #endif __fb_con.keyboard_init = keyboard_init; __fb_con.keyboard_exit = keyboard_exit; return 0; }
int fb_hXTermHasFocus(void) { #ifndef DISABLE_X11 Window focus_window; int dummy; X.GetInputFocus(display, &focus_window, &dummy); return (focus_window == xterm_window); #else return 0; #endif }
int fb_hXTermInitFocus(void) { #ifndef DISABLE_X11 const char *funcs[] = { "XOpenDisplay", "XCloseDisplay", "XGetInputFocus", NULL }; int dummy; ref_count++; if (ref_count > 1) return 0; xlib = fb_hDynLoad("libX11.so", funcs, (void **)&X); if (!xlib) return -1; display = X.OpenDisplay(NULL); if (!display) return -1; X.GetInputFocus(display, &xterm_window, &dummy); #endif return 0; }
static void keyboard_x11_handler(void) { unsigned char keymap[32]; int i; if (!fb_hXTermHasFocus()) return; X.QueryKeymap(display, keymap); memset(key_state, FALSE, 128); for (i = 0; i < 256; i++) { if (keymap[i / 8] & (1 << (i & 0x7))) key_state[fb_x11keycode_to_scancode[i]] = TRUE; } }
static void keyboard_exit(void) { if (__fb_con.inited == INIT_CONSOLE) { ioctl(key_fd, KDSKBMODE, key_old_mode); close(key_fd); key_fd = -1; } #ifndef DISABLE_X11 else if (__fb_con.inited == INIT_X11) { X.CloseDisplay(display); fb_hDynUnload(&xlib); fb_hXTermExitFocus(); } #endif __fb_con.keyboard_getch = old_getch; __fb_con.keyboard_handler = NULL; __fb_con.keyboard_exit = NULL; }