static void s_video_helper_kbd_atexit (void) { if (s_video_helper_keybd.fd < 0) { return; } if (s_video_helper_keybd.pid == getpid()) { s_video_helper_kbd_uninit(); s_server_quit(xynth_server->window); } }
static void s_video_helper_kbd_signal_handler (int v) { int i; s_video_helper_kbd_uninit(); s_server_quit(xynth_server->window); debugf(DSER, "Signal %d: %s received %s", v, strsignal(v), (v == SIGINT) ? "(ctrl-alt-backspace or ctrl-c pressed)" : ""); for (i = 0; i < sizeof(s_video_helper_keybd_sig2catch); i++) { if (s_video_helper_keybd_sig2catch[i] == v) { sigaction(v, s_video_helper_keybd.old_signal_handler + i, NULL); raise(v); break; } } if (i >= sizeof(s_video_helper_keybd_sig2catch)) { debugf(DSER, "Illegal call to signal_handler, raising segfault"); raise(SIGSEGV); } }
LRESULT CALLBACK MainWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int k = 0; int m = 0; s_rect_t coor; BYTE chars[2]; BYTE keystate[256]; s_video_gdi_data_t *priv = (s_video_gdi_data_t *) xynth_server->driver->driver_data; switch (message) { case WM_DESTROY: s_server_quit(xynth_server->window); PostQuitMessage(0); break; case WM_CREATE: ShowCursor(FALSE); case WM_PAINT: case WM_DISPLAYCHANGE: coor.x = 0; coor.y = 0; coor.w = xynth_server->window->surface->width; coor.h = xynth_server->window->surface->height; s_video_gdi_server_surface_update(&coor); break; case WM_LBUTTONDOWN: priv->mouse.buttons |= MOUSE_BUTTON_LEFT; goto mouse_event; case WM_LBUTTONUP: priv->mouse.buttons &= ~MOUSE_BUTTON_LEFT; goto mouse_event; case WM_RBUTTONDOWN: priv->mouse.buttons |= MOUSE_BUTTON_RIGHT; goto mouse_event; case WM_RBUTTONUP: priv->mouse.buttons &= ~MOUSE_BUTTON_RIGHT; goto mouse_event; case WM_MOUSEMOVE: mouse_event: priv->mouse.x = (((int) lParam) & 0xFFFF); priv->mouse.y = ((((int) lParam) >> 16) & 0xFFFF); if (priv->mouse_fd[1] != -1) { s_pipe_api_write(priv->mouse_fd[1], &m, sizeof(int)); } break; case WM_KEYUP: case WM_SYSKEYUP: priv->keybd.state = EVENT_TYPE_KEYBOARD_RELEASED; goto keybd_event; case WM_KEYDOWN: case WM_SYSKEYDOWN: priv->keybd.state = EVENT_TYPE_KEYBOARD_PRESSED; keybd_event: GetKeyboardState(keystate); priv->keybd.scancode = (((unsigned int) lParam) >> 16) & 0xFF; priv->keybd.button = priv->keymap[priv->keybd.scancode]; priv->keybd.keycode = priv->keymap[priv->keybd.scancode]; priv->keybd.ascii = wParam; if (ToAscii(wParam, lParam, keystate, (WORD *) chars, 0) == 1) { priv->keybd.ascii = chars[0]; } if (priv->keybd_fd[1] != -1) { s_pipe_api_write(priv->keybd_fd[1], &k, sizeof(int)); } break; // default: // printf("%d\n", message); } return DefWindowProc(hwnd, message, wParam, lParam); }