Fixed regression where cursor wasn't locked to screen when a mouse

button is down on win32.
This commit is contained in:
crs 2004-05-01 08:56:24 +00:00
parent 4d2d4a2171
commit dcfe49ef48
2 changed files with 45 additions and 32 deletions

View File

@ -964,8 +964,8 @@ bool
CMSWindowsScreen::onMouseButton(WPARAM wParam, LPARAM lParam) CMSWindowsScreen::onMouseButton(WPARAM wParam, LPARAM lParam)
{ {
// get which button // get which button
bool pressed = false; bool pressed = mapPressFromEvent(wParam, lParam);
const ButtonID button = mapButtonFromEvent(wParam, lParam); ButtonID button = mapButtonFromEvent(wParam, lParam);
// keep our shadow key state up to date // keep our shadow key state up to date
if (button >= kButtonLeft && button <= kButtonExtra0 + 1) { if (button >= kButtonLeft && button <= kButtonExtra0 + 1) {
@ -979,44 +979,17 @@ CMSWindowsScreen::onMouseButton(WPARAM wParam, LPARAM lParam)
// ignore message if posted prior to last mark change // ignore message if posted prior to last mark change
if (!ignore()) { if (!ignore()) {
switch (wParam) { if (pressed) {
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_XBUTTONDOWN:
case WM_LBUTTONDBLCLK:
case WM_MBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
case WM_XBUTTONDBLCLK:
case WM_NCLBUTTONDOWN:
case WM_NCMBUTTONDOWN:
case WM_NCRBUTTONDOWN:
case WM_NCXBUTTONDOWN:
case WM_NCLBUTTONDBLCLK:
case WM_NCMBUTTONDBLCLK:
case WM_NCRBUTTONDBLCLK:
case WM_NCXBUTTONDBLCLK:
LOG((CLOG_DEBUG1 "event: button press button=%d", button)); LOG((CLOG_DEBUG1 "event: button press button=%d", button));
if (button != kButtonNone) { if (button != kButtonNone) {
sendEvent(getButtonDownEvent(), CButtonInfo::alloc(button)); sendEvent(getButtonDownEvent(), CButtonInfo::alloc(button));
} }
pressed = true; }
break; else {
case WM_LBUTTONUP:
case WM_MBUTTONUP:
case WM_RBUTTONUP:
case WM_XBUTTONUP:
case WM_NCLBUTTONUP:
case WM_NCMBUTTONUP:
case WM_NCRBUTTONUP:
case WM_NCXBUTTONUP:
LOG((CLOG_DEBUG1 "event: button release button=%d", button)); LOG((CLOG_DEBUG1 "event: button release button=%d", button));
if (button != kButtonNone) { if (button != kButtonNone) {
sendEvent(getButtonUpEvent(), CButtonInfo::alloc(button)); sendEvent(getButtonUpEvent(), CButtonInfo::alloc(button));
} }
pressed = false;
break;
} }
} }
@ -1302,6 +1275,43 @@ CMSWindowsScreen::mapButtonFromEvent(WPARAM msg, LPARAM button) const
} }
} }
bool
CMSWindowsScreen::mapPressFromEvent(WPARAM msg, LPARAM) const
{
switch (msg) {
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_XBUTTONDOWN:
case WM_LBUTTONDBLCLK:
case WM_MBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
case WM_XBUTTONDBLCLK:
case WM_NCLBUTTONDOWN:
case WM_NCMBUTTONDOWN:
case WM_NCRBUTTONDOWN:
case WM_NCXBUTTONDOWN:
case WM_NCLBUTTONDBLCLK:
case WM_NCMBUTTONDBLCLK:
case WM_NCRBUTTONDBLCLK:
case WM_NCXBUTTONDBLCLK:
return true;
case WM_LBUTTONUP:
case WM_MBUTTONUP:
case WM_RBUTTONUP:
case WM_XBUTTONUP:
case WM_NCLBUTTONUP:
case WM_NCMBUTTONUP:
case WM_NCRBUTTONUP:
case WM_NCXBUTTONUP:
return false;
default:
return false;
}
}
void void
CMSWindowsScreen::fixKeys() CMSWindowsScreen::fixKeys()
{ {

View File

@ -157,6 +157,9 @@ private:
// map a button event to a button ID // map a button event to a button ID
ButtonID mapButtonFromEvent(WPARAM msg, LPARAM button) const; ButtonID mapButtonFromEvent(WPARAM msg, LPARAM button) const;
// map a button event to a press (true) or release (false)
bool mapPressFromEvent(WPARAM msg, LPARAM button) const;
// fix the key state, synthesizing fake key releases for keys // fix the key state, synthesizing fake key releases for keys
// that aren't down anymore. // that aren't down anymore.
void fixKeys(); void fixKeys();