Win32 mouse ported to new mouse driver format
This commit is contained in:
parent
174e60c76d
commit
19e2e7a60c
1 changed files with 97 additions and 36 deletions
|
@ -10,7 +10,7 @@
|
||||||
#if GFX_USE_GDISP
|
#if GFX_USE_GDISP
|
||||||
|
|
||||||
#define GDISP_DRIVER_VMT GDISPVMT_Win32
|
#define GDISP_DRIVER_VMT GDISPVMT_Win32
|
||||||
#include "drivers/multiple/Win32/gdisp_lld_config.h"
|
#include "gdisp_lld_config.h"
|
||||||
#include "src/gdisp/driver.h"
|
#include "src/gdisp/driver.h"
|
||||||
|
|
||||||
#ifndef GDISP_SCREEN_WIDTH
|
#ifndef GDISP_SCREEN_WIDTH
|
||||||
|
@ -52,7 +52,6 @@
|
||||||
|
|
||||||
#define GDISP_FLG_READY (GDISP_FLG_DRIVER<<0)
|
#define GDISP_FLG_READY (GDISP_FLG_DRIVER<<0)
|
||||||
#define GDISP_FLG_HASTOGGLE (GDISP_FLG_DRIVER<<1)
|
#define GDISP_FLG_HASTOGGLE (GDISP_FLG_DRIVER<<1)
|
||||||
#define GDISP_FLG_HASMOUSE (GDISP_FLG_DRIVER<<2)
|
|
||||||
#if GDISP_HARDWARE_STREAM_WRITE || GDISP_HARDWARE_STREAM_READ
|
#if GDISP_HARDWARE_STREAM_WRITE || GDISP_HARDWARE_STREAM_READ
|
||||||
#define GDISP_FLG_WSTREAM (GDISP_FLG_DRIVER<<3)
|
#define GDISP_FLG_WSTREAM (GDISP_FLG_DRIVER<<3)
|
||||||
#define GDISP_FLG_WRAPPED (GDISP_FLG_DRIVER<<4)
|
#define GDISP_FLG_WRAPPED (GDISP_FLG_DRIVER<<4)
|
||||||
|
@ -64,16 +63,50 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if GINPUT_NEED_MOUSE
|
#if GINPUT_NEED_MOUSE
|
||||||
/* Include mouse support code */
|
// Include mouse support code
|
||||||
|
#define GMOUSE_DRIVER_VMT GMOUSEVMT_Win32
|
||||||
#include "src/ginput/driver_mouse.h"
|
#include "src/ginput/driver_mouse.h"
|
||||||
|
|
||||||
|
// Forward definitions
|
||||||
|
static bool_t Win32MouseInit(GMouse *m, unsigned driverinstance);
|
||||||
|
static void Win32MouseRead(GMouse *m, GMouseReading *prd);
|
||||||
|
|
||||||
|
const GMouseVMT const GMOUSE_DRIVER_VMT[1] = {{
|
||||||
|
{
|
||||||
|
GDRIVER_TYPE_MOUSE,
|
||||||
|
GMOUSE_VFLG_NOPOLL|GMOUSE_VFLG_DYNAMICONLY,
|
||||||
|
// Extra flags for testing only
|
||||||
|
//GMOUSE_VFLG_TOUCH|GMOUSE_VFLG_SELFROTATION|GMOUSE_VFLG_DEFAULTFINGER
|
||||||
|
//GMOUSE_VFLG_CALIBRATE|GMOUSE_VFLG_CAL_EXTREMES|GMOUSE_VFLG_CAL_TEST|GMOUSE_VFLG_CAL_LOADFREE
|
||||||
|
//GMOUSE_VFLG_ONLY_DOWN|GMOUSE_VFLG_POORUPDOWN
|
||||||
|
sizeof(GMouse),
|
||||||
|
_gmouseInitDriver, _gmousePostInitDriver, _gmouseDeInitDriver
|
||||||
|
},
|
||||||
|
1, // z_max
|
||||||
|
0, // z_min
|
||||||
|
1, // z_touchon
|
||||||
|
0, // z_touchoff
|
||||||
|
{ // pen_jitter
|
||||||
|
0, // calibrate
|
||||||
|
0, // click
|
||||||
|
0 // move
|
||||||
|
},
|
||||||
|
{ // finger_jitter
|
||||||
|
0, // calibrate
|
||||||
|
2, // click
|
||||||
|
2 // move
|
||||||
|
},
|
||||||
|
Win32MouseInit, // init
|
||||||
|
0, // deinit
|
||||||
|
Win32MouseRead, // get
|
||||||
|
0, //calsave
|
||||||
|
0 //calload
|
||||||
|
}};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static DWORD winThreadId;
|
static DWORD winThreadId;
|
||||||
static volatile bool_t QReady;
|
static volatile bool_t QReady;
|
||||||
static HANDLE drawMutex;
|
static HANDLE drawMutex;
|
||||||
#if GINPUT_NEED_MOUSE
|
|
||||||
static GDisplay * mouseDisplay;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver local routines . */
|
/* Driver local routines . */
|
||||||
|
@ -95,6 +128,7 @@ typedef struct winPriv {
|
||||||
#if GINPUT_NEED_MOUSE
|
#if GINPUT_NEED_MOUSE
|
||||||
coord_t mousex, mousey;
|
coord_t mousex, mousey;
|
||||||
uint16_t mousebuttons;
|
uint16_t mousebuttons;
|
||||||
|
GMouse *mouse;
|
||||||
#endif
|
#endif
|
||||||
#if GINPUT_NEED_TOGGLE
|
#if GINPUT_NEED_TOGGLE
|
||||||
uint8_t toggles;
|
uint8_t toggles;
|
||||||
|
@ -149,7 +183,7 @@ static LRESULT myWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
|
||||||
// Handle mouse down on the window
|
// Handle mouse down on the window
|
||||||
#if GINPUT_NEED_MOUSE
|
#if GINPUT_NEED_MOUSE
|
||||||
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT && (g->flags & GDISP_FLG_HASMOUSE)) {
|
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT) {
|
||||||
priv->mousebuttons |= GINPUT_MOUSE_BTN_LEFT;
|
priv->mousebuttons |= GINPUT_MOUSE_BTN_LEFT;
|
||||||
goto mousemove;
|
goto mousemove;
|
||||||
}
|
}
|
||||||
|
@ -198,7 +232,7 @@ static LRESULT myWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
|
||||||
// Handle mouse up on the window
|
// Handle mouse up on the window
|
||||||
#if GINPUT_NEED_MOUSE
|
#if GINPUT_NEED_MOUSE
|
||||||
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT && (g->flags & GDISP_FLG_HASMOUSE)) {
|
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT) {
|
||||||
priv->mousebuttons &= ~GINPUT_MOUSE_BTN_LEFT;
|
priv->mousebuttons &= ~GINPUT_MOUSE_BTN_LEFT;
|
||||||
goto mousemove;
|
goto mousemove;
|
||||||
}
|
}
|
||||||
|
@ -210,7 +244,7 @@ static LRESULT myWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||||
case WM_MBUTTONDOWN:
|
case WM_MBUTTONDOWN:
|
||||||
g = (GDisplay *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
g = (GDisplay *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
||||||
priv = (winPriv *)g->priv;
|
priv = (winPriv *)g->priv;
|
||||||
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT && (g->flags & GDISP_FLG_HASMOUSE)) {
|
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT) {
|
||||||
priv->mousebuttons |= GINPUT_MOUSE_BTN_MIDDLE;
|
priv->mousebuttons |= GINPUT_MOUSE_BTN_MIDDLE;
|
||||||
goto mousemove;
|
goto mousemove;
|
||||||
}
|
}
|
||||||
|
@ -218,7 +252,7 @@ static LRESULT myWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||||
case WM_MBUTTONUP:
|
case WM_MBUTTONUP:
|
||||||
g = (GDisplay *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
g = (GDisplay *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
||||||
priv = (winPriv *)g->priv;
|
priv = (winPriv *)g->priv;
|
||||||
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT && (g->flags & GDISP_FLG_HASMOUSE)) {
|
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT) {
|
||||||
priv->mousebuttons &= ~GINPUT_MOUSE_BTN_MIDDLE;
|
priv->mousebuttons &= ~GINPUT_MOUSE_BTN_MIDDLE;
|
||||||
goto mousemove;
|
goto mousemove;
|
||||||
}
|
}
|
||||||
|
@ -226,7 +260,7 @@ static LRESULT myWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||||
case WM_RBUTTONDOWN:
|
case WM_RBUTTONDOWN:
|
||||||
g = (GDisplay *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
g = (GDisplay *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
||||||
priv = (winPriv *)g->priv;
|
priv = (winPriv *)g->priv;
|
||||||
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT && (g->flags & GDISP_FLG_HASMOUSE)) {
|
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT) {
|
||||||
priv->mousebuttons |= GINPUT_MOUSE_BTN_RIGHT;
|
priv->mousebuttons |= GINPUT_MOUSE_BTN_RIGHT;
|
||||||
goto mousemove;
|
goto mousemove;
|
||||||
}
|
}
|
||||||
|
@ -234,7 +268,7 @@ static LRESULT myWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||||
case WM_RBUTTONUP:
|
case WM_RBUTTONUP:
|
||||||
g = (GDisplay *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
g = (GDisplay *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
||||||
priv = (winPriv *)g->priv;
|
priv = (winPriv *)g->priv;
|
||||||
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT && (g->flags & GDISP_FLG_HASMOUSE)) {
|
if ((coord_t)HIWORD(lParam) < GDISP_SCREEN_HEIGHT) {
|
||||||
priv->mousebuttons &= ~GINPUT_MOUSE_BTN_RIGHT;
|
priv->mousebuttons &= ~GINPUT_MOUSE_BTN_RIGHT;
|
||||||
goto mousemove;
|
goto mousemove;
|
||||||
}
|
}
|
||||||
|
@ -242,14 +276,13 @@ static LRESULT myWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
g = (GDisplay *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
g = (GDisplay *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
||||||
priv = (winPriv *)g->priv;
|
priv = (winPriv *)g->priv;
|
||||||
if ((coord_t)HIWORD(lParam) >= GDISP_SCREEN_HEIGHT || !(g->flags & GDISP_FLG_HASMOUSE))
|
if ((coord_t)HIWORD(lParam) >= GDISP_SCREEN_HEIGHT)
|
||||||
break;
|
break;
|
||||||
mousemove:
|
mousemove:
|
||||||
priv->mousex = (coord_t)LOWORD(lParam);
|
priv->mousex = (coord_t)LOWORD(lParam);
|
||||||
priv->mousey = (coord_t)HIWORD(lParam);
|
priv->mousey = (coord_t)HIWORD(lParam);
|
||||||
#if GINPUT_MOUSE_POLL_PERIOD == TIME_INFINITE
|
if ((gmvmt(priv->mouse)->d.flags & GMOUSE_VFLG_NOPOLL)) // For normal setup this is always TRUE
|
||||||
ginputMouseWakeup();
|
_gmouseWakeup(priv->mouse);
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -445,14 +478,6 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
g->flags |= GDISP_FLG_HASTOGGLE;
|
g->flags |= GDISP_FLG_HASTOGGLE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Only turn on mouse on the first window for now
|
|
||||||
#if GINPUT_NEED_MOUSE
|
|
||||||
if (!g->controllerdisplay) {
|
|
||||||
mouseDisplay = g;
|
|
||||||
g->flags |= GDISP_FLG_HASMOUSE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Create a private area for this window
|
// Create a private area for this window
|
||||||
priv = gfxAlloc(sizeof(winPriv));
|
priv = gfxAlloc(sizeof(winPriv));
|
||||||
assert(priv != 0);
|
assert(priv != 0);
|
||||||
|
@ -476,6 +501,11 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
ShowWindow(priv->hwnd, SW_SHOW);
|
ShowWindow(priv->hwnd, SW_SHOW);
|
||||||
UpdateWindow(priv->hwnd);
|
UpdateWindow(priv->hwnd);
|
||||||
|
|
||||||
|
// Create the associated mouse
|
||||||
|
#if GINPUT_NEED_MOUSE
|
||||||
|
priv->mouse = (GMouse *)gdriverRegister((const GDriverVMT const *)GMOUSE_DRIVER_VMT, g);
|
||||||
|
#endif
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1134,18 +1164,49 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if GINPUT_NEED_MOUSE
|
#if GINPUT_NEED_MOUSE
|
||||||
void ginput_lld_mouse_init(void) {}
|
static bool_t Win32MouseInit(GMouse *m, unsigned driverinstance) {
|
||||||
void ginput_lld_mouse_get_reading(MouseReading *pt) {
|
(void) m;
|
||||||
|
(void) driverinstance;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
static void Win32MouseRead(GMouse *m, GMouseReading *pt) {
|
||||||
GDisplay * g;
|
GDisplay * g;
|
||||||
winPriv * priv;
|
winPriv * priv;
|
||||||
|
|
||||||
g = mouseDisplay;
|
g = m->display;
|
||||||
priv = g->priv;
|
priv = g->priv;
|
||||||
|
|
||||||
pt->x = priv->mousex;
|
pt->x = priv->mousex;
|
||||||
pt->y = priv->mousey > g->g.Height ? g->g.Height : priv->mousey;
|
pt->y = priv->mousey;
|
||||||
pt->z = (priv->mousebuttons & GINPUT_MOUSE_BTN_LEFT) ? 100 : 0;
|
pt->z = (priv->mousebuttons & GINPUT_MOUSE_BTN_LEFT) ? 1 : 0;
|
||||||
pt->buttons = priv->mousebuttons;
|
pt->buttons = priv->mousebuttons;
|
||||||
|
|
||||||
|
#if GDISP_NEED_CONTROL
|
||||||
|
// If the self-rotation has been set in the VMT then do that here (TESTING ONLY)
|
||||||
|
if ((gmvmt(m)->d.flags & GMOUSE_VFLG_SELFROTATION)) { // For normal setup this is always False
|
||||||
|
coord_t t;
|
||||||
|
|
||||||
|
switch(gdispGGetOrientation(m->display)) {
|
||||||
|
case GDISP_ROTATE_0:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case GDISP_ROTATE_90:
|
||||||
|
t = pt->x;
|
||||||
|
pt->x = g->g.Width - 1 - pt->y;
|
||||||
|
pt->y = t;
|
||||||
|
break;
|
||||||
|
case GDISP_ROTATE_180:
|
||||||
|
pt->x = g->g.Width - 1 - pt->x;
|
||||||
|
pt->y = g->g.Height - 1 - pt->y;
|
||||||
|
break;
|
||||||
|
case GDISP_ROTATE_270:
|
||||||
|
t = pt->y;
|
||||||
|
pt->y = g->g.Height - 1 - pt->x;
|
||||||
|
pt->x = t;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* GINPUT_NEED_MOUSE */
|
#endif /* GINPUT_NEED_MOUSE */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue