mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-22 12:41:21 +00:00
Fix #29 by simplifying mouse button handling
Pressing two mouse buttons at the same time didn't work properly, only one had effect, e.g. when pressing LMB to walk forward and RMB to shoot (when bound like that...) Not sure why that was, but the old mouse button handling (inherited from the super-old win32 backend where it was supposed to work around bugs in WinAPI or whatever, where sometimes there were two mouse button presses in one event or something) was unnecessarily complicated anyway so I replaced it with something simpler.
This commit is contained in:
parent
64a39ce09e
commit
3afe57b8f2
1 changed files with 35 additions and 71 deletions
|
@ -69,8 +69,6 @@
|
|||
/* Globals */
|
||||
Key_Event_fp_t Key_Event_fp;
|
||||
static in_state_t *in_state;
|
||||
static int mouse_buttonstate;
|
||||
static int mouse_oldbuttonstate;
|
||||
static int mouse_x, mouse_y;
|
||||
static int old_mouse_x, old_mouse_y;
|
||||
static qboolean have_grab;
|
||||
|
@ -359,22 +357,50 @@ IN_GetEvent(SDL_Event *event)
|
|||
case SDL_MOUSEWHEEL:
|
||||
IN_AddMouseWheelEvents(event->wheel.y > 0 ? K_MWHEELUP : K_MWHEELDOWN);
|
||||
break;
|
||||
#else
|
||||
#endif
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
|
||||
#if ! SDL_VERSION_ATLEAST(2, 0, 0) // SDL1.2 mousewheel stuff
|
||||
if (event->button.button == 4)
|
||||
{
|
||||
IN_AddMouseWheelEvents(K_MWHEELUP);
|
||||
break;
|
||||
}
|
||||
else if (event->button.button == 5)
|
||||
{
|
||||
IN_AddMouseWheelEvents(K_MWHEELDOWN);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
// fall-through
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
// DG: luckily, we don't need that IN_MouseEvent() magic with SDL,
|
||||
// as it really sends one event per pressed/released button
|
||||
switch( event->button.button )
|
||||
{
|
||||
case SDL_BUTTON_LEFT:
|
||||
key = K_MOUSE1;
|
||||
break;
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
key = K_MOUSE3;
|
||||
break;
|
||||
case SDL_BUTTON_RIGHT:
|
||||
key = K_MOUSE2;
|
||||
break;
|
||||
case SDL_BUTTON_X1:
|
||||
key = K_MOUSE4;
|
||||
break;
|
||||
case SDL_BUTTON_X2:
|
||||
key = K_MOUSE5;
|
||||
break;
|
||||
default: // WTF, unknown mousebutton
|
||||
// TODO: print warning?
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
#endif
|
||||
keyq[keyq_head].key = key;
|
||||
keyq[keyq_head].down = event->type == SDL_MOUSEBUTTONDOWN;
|
||||
keyq_head = (keyq_head + 1) & 127;
|
||||
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
break;
|
||||
|
||||
/* The user pressed a button */
|
||||
|
@ -432,7 +458,6 @@ IN_GetEvent(SDL_Event *event)
|
|||
void
|
||||
IN_Update(void)
|
||||
{
|
||||
int bstate;
|
||||
qboolean want_grab;
|
||||
SDL_Event event;
|
||||
static int protection;
|
||||
|
@ -460,33 +485,6 @@ IN_Update(void)
|
|||
SDL_GetRelativeMouseState(&mouse_x, &mouse_y);
|
||||
}
|
||||
|
||||
/* Mouse button processing. Button 4
|
||||
and 5 are the mousewheel and thus
|
||||
not processed here. */
|
||||
mouse_buttonstate = 0;
|
||||
bstate = SDL_GetMouseState(NULL, NULL);
|
||||
|
||||
if (SDL_BUTTON(1) & bstate)
|
||||
{
|
||||
mouse_buttonstate |= (1 << 0);
|
||||
}
|
||||
else if (SDL_BUTTON(3) & bstate)
|
||||
{
|
||||
mouse_buttonstate |= (1 << 1);
|
||||
}
|
||||
else if (SDL_BUTTON(2) & bstate)
|
||||
{
|
||||
mouse_buttonstate |= (1 << 2);
|
||||
}
|
||||
else if (SDL_BUTTON(6) & bstate)
|
||||
{
|
||||
mouse_buttonstate |= (1 << 3);
|
||||
}
|
||||
else if (SDL_BUTTON(7) & bstate)
|
||||
{
|
||||
mouse_buttonstate |= (1 << 4);
|
||||
}
|
||||
|
||||
/* Grab and ungrab the mouse if the
|
||||
* console or the menu is opened */
|
||||
want_grab = (vid_fullscreen->value || in_grab->value == 1 ||
|
||||
|
@ -619,42 +617,8 @@ IN_BackendShutdown(void)
|
|||
void
|
||||
IN_BackendMouseButtons(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
if ((mouse_buttonstate & (1 << i)) && !(mouse_oldbuttonstate & (1 << i)))
|
||||
{
|
||||
in_state->Key_Event_fp(K_MOUSE1 + i, true);
|
||||
}
|
||||
|
||||
if (!(mouse_buttonstate & (1 << i)) && (mouse_oldbuttonstate & (1 << i)))
|
||||
{
|
||||
in_state->Key_Event_fp(K_MOUSE1 + i, false);
|
||||
}
|
||||
}
|
||||
|
||||
if ((mouse_buttonstate & (1 << 3)) && !(mouse_oldbuttonstate & (1 << 3)))
|
||||
{
|
||||
in_state->Key_Event_fp(K_MOUSE4, true);
|
||||
}
|
||||
|
||||
if (!(mouse_buttonstate & (1 << 3)) && (mouse_oldbuttonstate & (1 << 3)))
|
||||
{
|
||||
in_state->Key_Event_fp(K_MOUSE4, false);
|
||||
}
|
||||
|
||||
if ((mouse_buttonstate & (1 << 4)) && !(mouse_oldbuttonstate & (1 << 4)))
|
||||
{
|
||||
in_state->Key_Event_fp(K_MOUSE5, true);
|
||||
}
|
||||
|
||||
if (!(mouse_buttonstate & (1 << 4)) && (mouse_oldbuttonstate & (1 << 4)))
|
||||
{
|
||||
in_state->Key_Event_fp(K_MOUSE5, false);
|
||||
}
|
||||
|
||||
mouse_oldbuttonstate = mouse_buttonstate;
|
||||
// nothing to do, we don't need this hack with SDL
|
||||
// the mouse events are generated directly in IN_GetEvent()
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue