/* mick_handler: * Movement callback for mickey-mode driver. */ static void mick_handler(__dpmi_regs *r) { int x = (signed short)r->x.si; int y = (signed short)r->x.di; _mouse_b = r->x.bx; mymickey_x += x - mymickey_ox; mymickey_y += y - mymickey_oy; mymickey_ox = x; mymickey_oy = y; _mouse_x = MICKEY_TO_COORD_X(mouse_mx + x); _mouse_y = MICKEY_TO_COORD_Y(mouse_my + y); if ((_mouse_x < mouse_minx) || (_mouse_x > mouse_maxx) || (_mouse_y < mouse_miny) || (_mouse_y > mouse_maxy)) { _mouse_x = CLAMP(mouse_minx, _mouse_x, mouse_maxx); _mouse_y = CLAMP(mouse_miny, _mouse_y, mouse_maxy); mouse_mx = COORD_TO_MICKEY_X(_mouse_x); mouse_my = COORD_TO_MICKEY_Y(_mouse_y); CLEAR_MICKEYS(); } _handle_mouse_input(); }
/* mouse_dinput_handle: [input thread] * Handles queued mouse input. */ static void mouse_dinput_handle(void) { static DIDEVICEOBJECTDATA message_buffer[DINPUT_BUFFERSIZE]; long int waiting_messages; HRESULT hr; int i; /* the whole buffer is free */ waiting_messages = DINPUT_BUFFERSIZE; /* fill the buffer */ hr = IDirectInputDevice_GetDeviceData(mouse_dinput_device, sizeof(DIDEVICEOBJECTDATA), message_buffer, &waiting_messages, 0); /* was device lost ? */ if ((hr == DIERR_NOTACQUIRED) || (hr == DIERR_INPUTLOST)) { /* reacquire device */ _TRACE(PREFIX_W "mouse device not acquired or lost\n"); wnd_schedule_proc(mouse_dinput_acquire); } else if (FAILED(hr)) { /* other error? */ _TRACE(PREFIX_E "unexpected error while filling mouse message buffer\n"); } else { /* normally only this case should happen */ for (i = 0; i < waiting_messages; i++) { mouse_dinput_handle_event(message_buffer[i].dwOfs, message_buffer[i].dwData); } if (gfx_driver && gfx_driver->windowed) { /* windowed input mode */ if (!wnd_sysmenu) { POINT p; READ_CURSOR_POS(p); mymickey_x += p.x - mymickey_ox; mymickey_y += p.y - mymickey_oy; mymickey_ox = p.x; mymickey_oy = p.y; _handle_mouse_input(); } } else { /* fullscreen input mode */ mymickey_x += dinput_x - mymickey_ox; mymickey_y += dinput_y - mymickey_oy; mymickey_ox = dinput_x; mymickey_oy = dinput_y; _mouse_x = MICKEY_TO_COORD_X(mouse_mx + dinput_x); _mouse_y = MICKEY_TO_COORD_Y(mouse_my + dinput_y); if ((_mouse_x < mouse_minx) || (_mouse_x > mouse_maxx) || (_mouse_y < mouse_miny) || (_mouse_y > mouse_maxy)) { _mouse_x = MID(mouse_minx, _mouse_x, mouse_maxx); _mouse_y = MID(mouse_miny, _mouse_y, mouse_maxy); mouse_mx = COORD_TO_MICKEY_X(_mouse_x); mouse_my = COORD_TO_MICKEY_Y(_mouse_y); CLEAR_MICKEYS(); } if (!_mouse_on) { _mouse_on = TRUE; wnd_schedule_proc(mouse_set_syscursor); } _handle_mouse_input(); } } }