/* * * SDL mouse driver * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "fix.h" #include "timer.h" #include "event.h" #include "mouse.h" extern fix FrameTime; struct mousebutton { ubyte pressed; fix time_went_down; fix time_held_down; uint num_downs; uint num_ups; }; static struct mouseinfo { struct mousebutton buttons[MOUSE_MAX_BUTTONS]; int delta_x, delta_y, delta_z; int delta_time; int x,y,z; } Mouse; void d_mouse_init(void) { memset(&Mouse,0,sizeof(Mouse)); } void mouse_button_handler(SDL_MouseButtonEvent *mbe) { // to bad, SDL buttons use a different mapping as descent expects, // this is at least true and tested for the first three buttons int button_remap[11] = { MBTN_LEFT, MBTN_MIDDLE, MBTN_RIGHT, MBTN_Z_UP, MBTN_Z_DOWN, MBTN_PITCH_BACKWARD, MBTN_PITCH_FORWARD, MBTN_BANK_LEFT, MBTN_BANK_RIGHT, MBTN_HEAD_LEFT, MBTN_HEAD_RIGHT }; int button = button_remap[mbe->button - 1]; // -1 since SDL seems to start counting at 1 if (mbe->state == SDL_PRESSED) { Mouse.buttons[button].pressed = 1; Mouse.buttons[button].time_went_down = timer_get_fixed_seconds(); Mouse.buttons[button].num_downs++; if (button == MBTN_Z_UP) { Mouse.delta_z += Z_SENSITIVITY; Mouse.z += Z_SENSITIVITY; } else if (button == MBTN_Z_DOWN) { Mouse.delta_z -= Z_SENSITIVITY; Mouse.z -= Z_SENSITIVITY; } } else { Mouse.buttons[button].pressed = 0; Mouse.buttons[button].time_held_down += timer_get_fixed_seconds() - Mouse.buttons[button].time_went_down; Mouse.buttons[button].num_ups++; } } void mouse_motion_handler(SDL_MouseMotionEvent *mme) { Mouse.delta_x += mme->xrel; Mouse.delta_y += mme->yrel; Mouse.x += mme->xrel; Mouse.y += mme->yrel; } void mouse_flush() // clears all mice events... { int i; fix current_time; event_poll(); current_time = timer_get_fixed_seconds(); for (i=0; i= F1_0/30) { SDL_GetRelativeMouseState( &Mouse.delta_x, &Mouse.delta_y ); *dz = old_delta_z = Mouse.delta_z; Mouse.delta_z = 0; Mouse.delta_time = 0; } else { *dx = old_delta_x; *dy = old_delta_y; *dz = old_delta_z; } // filter delta *dx = (Mouse.delta_x + old_delta_x) * 0.5; *dy = (Mouse.delta_y + old_delta_y) * 0.5; old_delta_x = Mouse.delta_x; old_delta_y = Mouse.delta_y; } int mouse_get_btns() { int i; uint flag=1; int status = 0; event_poll(); for (i=0; i