Add the necessary plumbing to sdlayer to detect mousedown, mouseup, and dragging.

git-svn-id: https://svn.eduke32.com/eduke32@4853 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2014-12-27 18:36:43 +00:00
parent bfb3614b92
commit 598e33319c
8 changed files with 80 additions and 35 deletions

View file

@ -101,8 +101,18 @@ extern int32_t GetKey(int32_t key);
extern void SetKey(int32_t key, int32_t state); extern void SetKey(int32_t key, int32_t state);
// mouse // mouse
extern int32_t mousex, mousey, mouseb, mouseabsx, mouseabsy; extern int32_t mousex, mousey, mouseb;
extern vec2_t mouseabs;
extern uint8_t mousepressstate;
extern uint8_t mousegrab, moustat, mouseinwindow, AppMouseGrab; extern uint8_t mousegrab, moustat, mouseinwindow, AppMouseGrab;
enum
{
Mouse_Idle = 0,
Mouse_Pressed = 1,
Mouse_Held = 2,
Mouse_Released = 3,
};
extern int32_t mousepressstateadvance(void);
// joystick // joystick
extern int32_t *joyaxis, *joyhat, joyb; extern int32_t *joyaxis, *joyhat, joyb;
@ -161,7 +171,7 @@ void uninitmouse(void);
void grabmouse(char a); void grabmouse(char a);
void AppGrabMouse(char a); void AppGrabMouse(char a);
void readmousexy(int32_t *x, int32_t *y); void readmousexy(int32_t *x, int32_t *y);
int32_t readmouseabsxy(int32_t *x, int32_t *y); int32_t readmouseabsxy(vec2_t * const destination, vec2_t const * const source);
void readmousebstatus(int32_t *b); void readmousebstatus(int32_t *b);
void readjoybstatus(int32_t *b); void readjoybstatus(int32_t *b);
void setjoydeadzone(int32_t axis, uint16_t dead, uint16_t satur); void setjoydeadzone(int32_t axis, uint16_t dead, uint16_t satur);

View file

@ -285,22 +285,6 @@ extern "C" {
#endif // __cplusplus #endif // __cplusplus
typedef struct {
int32_t x, y;
} vec2_t;
typedef struct {
int32_t x, y, z;
} vec3_t;
typedef struct {
float x, y;
} vec2f_t;
typedef struct {
float x, y, z;
} vec3f_t;
// Links to various ABIs specifying (or documenting non-normatively) the // Links to various ABIs specifying (or documenting non-normatively) the
// alignment requirements of aggregates: // alignment requirements of aggregates:
// //

View file

@ -590,6 +590,24 @@ typedef intptr_t ssize_t;
typedef int32_t bssize_t; typedef int32_t bssize_t;
#endif #endif
typedef struct {
int32_t x, y;
} vec2_t;
typedef struct {
int32_t x, y, z;
} vec3_t;
typedef struct {
float x, y;
} vec2f_t;
typedef struct {
float x, y, z;
} vec3f_t;
#if RAND_MAX == 32767 #if RAND_MAX == 32767
FORCE_INLINE uint16_t system_15bit_rand(void) { return (uint16_t)rand(); } FORCE_INLINE uint16_t system_15bit_rand(void) { return (uint16_t)rand(); }
#else // RAND_MAX > 32767, assumed to be of the form 2^k - 1 #else // RAND_MAX > 32767, assumed to be of the form 2^k - 1

View file

@ -15,8 +15,27 @@ uint8_t keyfifoplc, keyfifoend, keyasciififoplc, keyasciififoend;
char keyremap[KEYSTATUSSIZ]; char keyremap[KEYSTATUSSIZ];
int32_t keyremapinit=0; int32_t keyremapinit=0;
char key_names[NUMKEYS][24]; char key_names[NUMKEYS][24];
int32_t mousex=0,mousey=0,mouseb=0,mouseabsx=0,mouseabsy=0; int32_t mousex=0,mousey=0,mouseb=0;
vec2_t mouseabs;
uint8_t mousepressstate;
uint8_t moustat = 0, mousegrab = 0, mouseinwindow = 1, AppMouseGrab = 1; uint8_t moustat = 0, mousegrab = 0, mouseinwindow = 1, AppMouseGrab = 1;
int32_t mousepressstateadvance(void)
{
if (mousepressstate == Mouse_Pressed)
{
mousepressstate = Mouse_Held;
return 1;
}
else if (mousepressstate == Mouse_Released)
{
mousepressstate = Mouse_Idle;
return 1;
}
return 0;
}
int32_t *joyaxis = NULL, joyb=0, *joyhat = NULL; int32_t *joyaxis = NULL, joyb=0, *joyhat = NULL;
char joyisgamepad=0, joynumaxes=0, joynumbuttons=0, joynumhats=0; char joyisgamepad=0, joynumaxes=0, joynumbuttons=0, joynumhats=0;
int32_t joyaxespresent=0; int32_t joyaxespresent=0;
@ -105,7 +124,7 @@ void readmousexy(int32_t *x, int32_t *y)
mousex = mousey = 0; mousex = mousey = 0;
} }
int32_t readmouseabsxy(int32_t *x, int32_t *y) int32_t readmouseabsxy(vec2_t * const destination, vec2_t const * const source)
{ {
int32_t xwidth; int32_t xwidth;
@ -114,8 +133,8 @@ int32_t readmouseabsxy(int32_t *x, int32_t *y)
xwidth = max(scale(240<<16, xdim, ydim), 320<<16); xwidth = max(scale(240<<16, xdim, ydim), 320<<16);
*x = scale(mouseabsx, xwidth, xdim) - ((xwidth>>1) - (320<<15)); destination->x = scale(source->x, xwidth, xdim) - ((xwidth>>1) - (320<<15));
*y = scale(mouseabsy, 200<<16, ydim); destination->y = scale(source->y, 200<<16, ydim);
return 1; return 1;
} }

View file

@ -1718,6 +1718,11 @@ int32_t handleevents_peekkeys(void)
#endif #endif
} }
void handleevents_updatemousestate(uint8_t state)
{
mousepressstate = state == SDL_RELEASED ? Mouse_Released : Mouse_Pressed;
}
// //
// handleevents() -- process the SDL message queue // handleevents() -- process the SDL message queue
@ -1732,8 +1737,8 @@ int32_t handleevents_sdlcommon(SDL_Event *ev)
{ {
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
#ifndef GEKKO #ifndef GEKKO
mouseabsx = ev->motion.x; mouseabs.x = ev->motion.x;
mouseabsy = ev->motion.y; mouseabs.y = ev->motion.y;
#endif #endif
// SDL <VER> doesn't handle relative mouse movement correctly yet as the cursor still clips to the // SDL <VER> doesn't handle relative mouse movement correctly yet as the cursor still clips to the
// screen edges // screen edges
@ -1762,7 +1767,7 @@ int32_t handleevents_sdlcommon(SDL_Event *ev)
switch (ev->button.button) switch (ev->button.button)
{ {
default: j = -1; break; default: j = -1; break;
case SDL_BUTTON_LEFT: j = 0; break; case SDL_BUTTON_LEFT: j = 0; handleevents_updatemousestate(ev->button.state); break;
case SDL_BUTTON_RIGHT: j = 1; break; case SDL_BUTTON_RIGHT: j = 1; break;
case SDL_BUTTON_MIDDLE: j = 2; break; case SDL_BUTTON_MIDDLE: j = 2; break;
@ -1849,6 +1854,11 @@ int32_t handleevents_sdlcommon(SDL_Event *ev)
joyb |= 1 << ev->jbutton.button; joyb |= 1 << ev->jbutton.button;
else else
joyb &= ~(1 << ev->jbutton.button); joyb &= ~(1 << ev->jbutton.button);
#ifdef GEKKO
if (ev->jbutton.button == 0) // WII_A
handleevents_updatemousestate(ev->jbutton.state);
#endif
} }
break; break;

View file

@ -568,8 +568,8 @@ int32_t handleevents_pollsdl(void)
if (ev.motion.state & SDL_BUTTON_X2MASK) if (ev.motion.state & SDL_BUTTON_X2MASK)
{ {
// the absolute values are used to draw the crosshair // the absolute values are used to draw the crosshair
mouseabsx = ev.motion.x; mouseabs.x = ev.motion.x;
mouseabsy = ev.motion.y; mouseabs.y = ev.motion.y;
// hack: reduce the scale of the "relative" motions // hack: reduce the scale of the "relative" motions
// to make it act more like a real mouse // to make it act more like a real mouse
ev.motion.xrel /= 16; ev.motion.xrel /= 16;

View file

@ -3739,17 +3739,17 @@ void G_DisplayRest(int32_t smoothratio)
if (a == 0 || a > 1) if (a == 0 || a > 1)
{ {
int32_t x = 160<<16, y = 100<<16; vec2_t crosshairpos = { 160<<16, 100<<16 };
if (a == 0) if (a == 0)
a = CROSSHAIR; a = CROSSHAIR;
rotatesprite_win(x-(g_player[myconnectindex].ps->look_ang<<15),y,scale(65536,ud.crosshairscale,100), rotatesprite_win(crosshairpos.x-(g_player[myconnectindex].ps->look_ang<<15),crosshairpos.y,scale(65536,ud.crosshairscale,100),
0,a,0,CROSSHAIR_PAL,2+1); 0,a,0,CROSSHAIR_PAL,2+1);
#ifdef GEKKO #ifdef GEKKO
if (readmouseabsxy(&x, &y)) if ((g_player[myconnectindex].ps->gm&MODE_MENU) == 0 && readmouseabsxy(&crosshairpos, &mouseabs))
rotatesprite_win(x,y,scale(65536,ud.crosshairscale,100),0,a,0,CROSSHAIR_PAL,2+1); rotatesprite_win(crosshairpos.x,crosshairpos.y,scale(65536,ud.crosshairscale,100),0,a,0,CROSSHAIR_PAL,2+1);
#endif #endif
} }
} }

View file

@ -3163,13 +3163,13 @@ static inline int32_t M_UpdateScreenOK(MenuID_t cm)
#define M_MOUSETIMEOUT 120 #define M_MOUSETIMEOUT 120
static int32_t m_mouselastactivity; static int32_t m_mouselastactivity;
static vec2_t m_prevmousepos, m_mousepos; static vec2_t m_prevmousepos, m_mousepos, m_mousedownpos;
void M_OpenMenu(size_t playerID) void M_OpenMenu(size_t playerID)
{ {
g_player[playerID].ps->gm |= MODE_MENU; g_player[playerID].ps->gm |= MODE_MENU;
readmouseabsxy(&m_prevmousepos.x, &m_prevmousepos.y); readmouseabsxy(&m_prevmousepos, &mouseabs);
m_mouselastactivity = -M_MOUSETIMEOUT; m_mouselastactivity = -M_MOUSETIMEOUT;
AppGrabMouse(0); AppGrabMouse(0);
@ -4881,6 +4881,10 @@ void M_DisplayMenus(void)
if (!M_IsTextInput(m_currentMenu) && KB_KeyPressed(sc_Q)) if (!M_IsTextInput(m_currentMenu) && KB_KeyPressed(sc_Q))
M_ChangeMenuAnimate(MENU_QUIT, MA_Advance); M_ChangeMenuAnimate(MENU_QUIT, MA_Advance);
int32_t mousestatus = readmouseabsxy(&m_mousepos, &mouseabs);
if (mousestatus && mousepressstate == Mouse_Pressed)
m_mousedownpos = m_mousepos;
M_RunMenuInput(m_currentMenu); M_RunMenuInput(m_currentMenu);
VM_OnEvent(EVENT_DISPLAYMENU, g_player[screenpeek].ps->i, screenpeek); VM_OnEvent(EVENT_DISPLAYMENU, g_player[screenpeek].ps->i, screenpeek);
@ -4911,9 +4915,9 @@ void M_DisplayMenus(void)
if (VM_HaveEvent(EVENT_DISPLAYMENUREST)) if (VM_HaveEvent(EVENT_DISPLAYMENUREST))
VM_OnEvent(EVENT_DISPLAYMENUREST, g_player[screenpeek].ps->i, screenpeek); VM_OnEvent(EVENT_DISPLAYMENUREST, g_player[screenpeek].ps->i, screenpeek);
if (readmouseabsxy(&m_mousepos.x, &m_mousepos.y)) if (mousestatus)
{ {
if (m_mousepos.x != m_prevmousepos.x || m_mousepos.y != m_prevmousepos.y) if (((totalclock - m_mouselastactivity < M_MOUSETIMEOUT) && mousepressstateadvance()) || m_mousepos.x != m_prevmousepos.x || m_mousepos.y != m_prevmousepos.y)
{ {
m_prevmousepos = m_mousepos; m_prevmousepos = m_mousepos;
m_mouselastactivity = totalclock; m_mouselastactivity = totalclock;