/* XTERM MOUSE suport by M.Laak */ void xtermmouse_get_event (Bit8u **kbp, int *kbcount) { int btn; static int last_btn = 0; int x_pos, y_pos; /* Decode Xterm mouse information to a GPM style event */ if (*kbcount >= 3) { x_pos = (*kbp)[1] - 32; y_pos = (*kbp)[2] - 32; mouse_move_absolute(x_pos-1, y_pos-1, vga.text_width, vga.text_height); m_printf("XTERM MOUSE: movement (click follows) detected to pos x=%d: y=%d\n", x_pos, y_pos); /* Variable btn has following meaning: */ /* 0 = btn1 dn, 1 = btn2 dn, 2 = btn3 dn, 3 = btn up */ btn = (*kbp)[0] & 3; /* There seems to be no way of knowing which button was released */ /* So we assume all the buttons were released */ if (btn == 3){ if (last_btn) { mouse_move_buttons(0, 0, 0); m_printf("XTERM MOUSE: button release detected\n"); last_btn = 0; } } else { switch (btn) { case 0: mouse_move_buttons(1, 0, 0); m_printf("XTERM MOUSE: left button click detected\n"); last_btn = 1; break; case 1: mouse_move_buttons(0, 1, 0); m_printf("XTERM MOUSE: middle button click detected\n"); last_btn = 2; break; case 2: mouse_move_buttons(0, 0, 1); m_printf("XTERM MOUSE: right button click detected\n"); last_btn = 3; break; } } *kbcount -= 3; /* update count */ *kbp += 3; do_mouse_irq(); } }
static void SDL_handle_events(void) { SDL_Event event; assert(pthread_equal(pthread_self(), dosemu_pthread_self)); if (render_is_updating()) return; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_FOCUS_GAINED: v_printf("SDL: focus in\n"); render_gain_focus(); if (config.X_background_pause && !dosemu_user_froze) unfreeze_dosemu(); break; case SDL_WINDOWEVENT_FOCUS_LOST: v_printf("SDL: focus out\n"); render_lose_focus(); if (config.X_background_pause && !dosemu_user_froze) freeze_dosemu(); break; case SDL_WINDOWEVENT_RESIZED: /* very strange things happen: if renderer size was explicitly * set, SDL reports mouse coords relative to that. Otherwise * it reports mouse coords relative to the window. */ SDL_RenderGetLogicalSize(renderer, &m_x_res, &m_y_res); if (!m_x_res || !m_y_res) { m_x_res = event.window.data1; m_y_res = event.window.data2; } update_mouse_coords(); SDL_redraw(); break; case SDL_WINDOWEVENT_EXPOSED: SDL_redraw(); break; case SDL_WINDOWEVENT_ENTER: /* ignore fake enter events */ if (config.X_fullscreen) break; mouse_drag_to_corner(m_x_res, m_y_res); break; } break; case SDL_KEYDOWN: { if (wait_kup) break; SDL_Keysym keysym = event.key.keysym; if ((keysym.mod & KMOD_CTRL) && (keysym.mod & KMOD_ALT)) { if (keysym.sym == SDLK_HOME || keysym.sym == SDLK_k) { force_grab = 0; toggle_grab(keysym.sym == SDLK_k); break; } else if (keysym.sym == SDLK_f) { toggle_fullscreen_mode(); /* some versions of SDL re-send the keydown events after the * full-screen switch. We need to filter them out to prevent * the infinite switching loop. */ wait_kup = 1; break; } } if (vga.mode_class == TEXT && (keysym.sym == SDLK_LSHIFT || keysym.sym == SDLK_RSHIFT)) { copypaste = 1; /* enable cursor for copy/paste */ if (!m_cursor_visible) SDL_ShowCursor(SDL_ENABLE); } } #if CONFIG_SDL_SELECTION clear_if_in_selection(); #endif #ifdef X_SUPPORT #if HAVE_XKB if (x11_display && config.X_keycode) SDL_process_key_xkb(x11_display, event.key); else #endif #endif SDL_process_key(event.key); break; case SDL_KEYUP: { SDL_Keysym keysym = event.key.keysym; wait_kup = 0; if (copypaste && (keysym.sym == SDLK_LSHIFT || keysym.sym == SDLK_RSHIFT)) { copypaste = 0; if (!m_cursor_visible) SDL_ShowCursor(SDL_DISABLE); } #ifdef X_SUPPORT #if HAVE_XKB if (x11_display && config.X_keycode) SDL_process_key_xkb(x11_display, event.key); else #endif #endif SDL_process_key(event.key); break; } case SDL_MOUSEBUTTONDOWN: { int buttons = SDL_GetMouseState(NULL, NULL); #if CONFIG_SDL_SELECTION if (window_has_focus() && !shift_pressed()) { clear_selection_data(); } else if (vga.mode_class == TEXT && !grab_active) { if (event.button.button == SDL_BUTTON_LEFT) start_selection(x_to_col(event.button.x, m_x_res), y_to_row(event.button.y, m_y_res)); else if (event.button.button == SDL_BUTTON_RIGHT) start_extend_selection(x_to_col(event.button.x, m_x_res), y_to_row(event.button.y, m_y_res)); else if (event.button.button == SDL_BUTTON_MIDDLE) { char *paste = SDL_GetClipboardText(); if (paste) paste_text(paste, strlen(paste), "utf8"); } break; } #endif /* CONFIG_SDL_SELECTION */ mouse_move_buttons(buttons & SDL_BUTTON(1), buttons & SDL_BUTTON(2), buttons & SDL_BUTTON(3)); break; } case SDL_MOUSEBUTTONUP: { int buttons = SDL_GetMouseState(NULL, NULL); #if CONFIG_SDL_SELECTION if (vga.mode_class == TEXT && !grab_active) { t_unicode *sel = end_selection(); if (sel) { char *send_text = get_selection_string(sel, "utf8"); SDL_SetClipboardText(send_text); free(send_text); } } #endif /* CONFIG_SDL_SELECTION */ mouse_move_buttons(buttons & SDL_BUTTON(1), buttons & SDL_BUTTON(2), buttons & SDL_BUTTON(3)); break; } case SDL_MOUSEMOTION: #if CONFIG_SDL_SELECTION extend_selection(x_to_col(event.motion.x, m_x_res), y_to_row(event.motion.y, m_y_res)); #endif /* CONFIG_SDL_SELECTION */ if (grab_active) mouse_move_relative(event.motion.xrel, event.motion.yrel, m_x_res, m_y_res); else mouse_move_absolute(event.motion.x, event.motion.y, m_x_res, m_y_res); break; case SDL_MOUSEWHEEL: mouse_move_wheel(-event.wheel.y); break; case SDL_QUIT: leavedos(0); break; default: v_printf("PAS ENCORE TRAITE %x\n", event.type); /* TODO */ break; } } #ifdef X_SUPPORT if (x11_display && !use_bitmap_font && vga.mode_class == TEXT && X_handle_text_expose()) { /* need to check separately because SDL_VIDEOEXPOSE is eaten by SDL */ redraw_text_screen(); } #endif }