Skip to content

Commit 308c42c

Browse files
rbernonivyl
authored andcommitted
user32: Implement rudimentary EnableMouseInPointer support.
CW-Bug-Id: 18943
1 parent eb12dcf commit 308c42c

File tree

4 files changed

+64
-4
lines changed

4 files changed

+64
-4
lines changed

dlls/user32/input.c

+5-4
Original file line numberDiff line numberDiff line change
@@ -1144,15 +1144,16 @@ TrackMouseEvent (TRACKMOUSEEVENT *ptme)
11441144
return TRUE;
11451145
}
11461146

1147+
BOOL enable_mouse_in_pointer = FALSE;
1148+
11471149
/***********************************************************************
11481150
* EnableMouseInPointer (USER32.@)
11491151
*/
11501152
BOOL WINAPI EnableMouseInPointer(BOOL enable)
11511153
{
1152-
FIXME("(%#x) stub\n", enable);
1153-
1154-
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1155-
return FALSE;
1154+
FIXME("(%#x) semi-stub\n", enable);
1155+
enable_mouse_in_pointer = TRUE;
1156+
return TRUE;
11561157
}
11571158

11581159
static DWORD CALLBACK devnotify_window_callback(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header)

dlls/user32/message.c

+32
Original file line numberDiff line numberDiff line change
@@ -2597,6 +2597,38 @@ static BOOL process_mouse_message( MSG *msg, UINT hw_id, ULONG_PTR extra_info, H
25972597
in the WM_SETCURSOR message even if it's non-client mouse message */
25982598
SendMessageW( msg->hwnd, WM_SETCURSOR, (WPARAM)msg->hwnd, MAKELONG( hittest, msg->message ));
25992599

2600+
if (enable_mouse_in_pointer) switch (msg->message)
2601+
{
2602+
case WM_MOUSEMOVE:
2603+
case WM_LBUTTONDOWN:
2604+
case WM_LBUTTONUP:
2605+
case WM_RBUTTONDOWN:
2606+
case WM_RBUTTONUP:
2607+
case WM_MBUTTONDOWN:
2608+
case WM_MBUTTONUP:
2609+
case WM_XBUTTONDOWN:
2610+
case WM_XBUTTONUP:
2611+
{
2612+
WORD flags = POINTER_MESSAGE_FLAG_INRANGE|POINTER_MESSAGE_FLAG_INCONTACT|POINTER_MESSAGE_FLAG_PRIMARY;
2613+
if (msg->message == WM_LBUTTONDOWN) flags |= POINTER_MESSAGE_FLAG_FIRSTBUTTON;
2614+
if (msg->message == WM_RBUTTONDOWN) flags |= POINTER_MESSAGE_FLAG_SECONDBUTTON;
2615+
if (msg->message == WM_MBUTTONDOWN) flags |= POINTER_MESSAGE_FLAG_THIRDBUTTON;
2616+
if (msg->message == WM_XBUTTONDOWN && LOWORD( msg->wParam ) == MK_LBUTTON) flags |= POINTER_MESSAGE_FLAG_FIRSTBUTTON;
2617+
if (msg->message == WM_XBUTTONDOWN && LOWORD( msg->wParam ) == MK_RBUTTON) flags |= POINTER_MESSAGE_FLAG_SECONDBUTTON;
2618+
if (msg->message == WM_XBUTTONDOWN && LOWORD( msg->wParam ) == MK_MBUTTON) flags |= POINTER_MESSAGE_FLAG_THIRDBUTTON;
2619+
if (msg->message == WM_XBUTTONDOWN && LOWORD( msg->wParam ) == MK_XBUTTON1) flags |= POINTER_MESSAGE_FLAG_FOURTHBUTTON;
2620+
if (msg->message == WM_XBUTTONDOWN && LOWORD( msg->wParam ) == MK_XBUTTON2) flags |= POINTER_MESSAGE_FLAG_FIFTHBUTTON;
2621+
SendMessageW( msg->hwnd, WM_POINTERUPDATE, MAKELONG( 1, flags ), MAKELONG( msg->pt.x, msg->pt.y ) );
2622+
break;
2623+
}
2624+
case WM_MOUSEWHEEL:
2625+
SendMessageW( msg->hwnd, WM_POINTERWHEEL, MAKELONG( 1, HIWORD( msg->wParam ) ), MAKELONG( msg->pt.x, msg->pt.y ) );
2626+
break;
2627+
case WM_MOUSEHWHEEL:
2628+
SendMessageW( msg->hwnd, WM_POINTERHWHEEL, MAKELONG( 1, HIWORD( msg->wParam ) ), MAKELONG( msg->pt.x, msg->pt.y ) );
2629+
break;
2630+
}
2631+
26002632
msg->message = message;
26012633
return !eatMsg;
26022634
}

dlls/user32/user_private.h

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ static inline BOOL is_broadcast( HWND hwnd )
152152
}
153153

154154
extern HMODULE user32_module DECLSPEC_HIDDEN;
155+
extern BOOL enable_mouse_in_pointer DECLSPEC_HIDDEN;
155156

156157
struct dce;
157158
struct tagWND;

include/winuser.h

+26
Original file line numberDiff line numberDiff line change
@@ -3475,6 +3475,32 @@ typedef struct tagMENUGETOBJECTINFO
34753475
void *pvObj;
34763476
} MENUGETOBJECTINFO, *PMENUGETOBJECTINFO;
34773477

3478+
#define POINTER_MESSAGE_FLAG_NEW 0x00000001
3479+
#define POINTER_MESSAGE_FLAG_INRANGE 0x00000002
3480+
#define POINTER_MESSAGE_FLAG_INCONTACT 0x00000004
3481+
#define POINTER_MESSAGE_FLAG_FIRSTBUTTON 0x00000010
3482+
#define POINTER_MESSAGE_FLAG_SECONDBUTTON 0x00000020
3483+
#define POINTER_MESSAGE_FLAG_THIRDBUTTON 0x00000040
3484+
#define POINTER_MESSAGE_FLAG_FOURTHBUTTON 0x00000080
3485+
#define POINTER_MESSAGE_FLAG_FIFTHBUTTON 0x00000100
3486+
#define POINTER_MESSAGE_FLAG_PRIMARY 0x00002000
3487+
#define POINTER_MESSAGE_FLAG_CONFIDENCE 0x00004000
3488+
#define POINTER_MESSAGE_FLAG_CANCELED 0x00008000
3489+
3490+
#define GET_POINTERID_WPARAM(wparam) (LOWORD(wparam))
3491+
#define IS_POINTER_FLAG_SET_WPARAM(wparam, flags) ((HIWORD(wparam) & (flags)) == (flags))
3492+
#define IS_POINTER_NEW_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_NEW)
3493+
#define IS_POINTER_INRANGE_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_INRANGE)
3494+
#define IS_POINTER_INCONTACT_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_INCONTACT)
3495+
#define IS_POINTER_FIRSTBUTTON_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_FIRSTBUTTON)
3496+
#define IS_POINTER_SECONDBUTTON_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_SECONDBUTTON)
3497+
#define IS_POINTER_THIRDBUTTON_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_THIRDBUTTON)
3498+
#define IS_POINTER_FOURTHBUTTON_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_FOURTHBUTTON)
3499+
#define IS_POINTER_FIFTHBUTTON_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_FIFTHBUTTON)
3500+
#define IS_POINTER_PRIMARY_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_PRIMARY)
3501+
#define HAS_POINTER_CONFIDENCE_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_CONFIDENCE)
3502+
#define IS_POINTER_CANCELED_WPARAM(wparam) IS_POINTER_FLAG_SET_WPARAM(wparam, POINTER_MESSAGE_FLAG_CANCELED)
3503+
34783504
#if defined(_WINGDI_) && !defined(NOGDI)
34793505
WINUSERAPI LONG WINAPI ChangeDisplaySettingsA(LPDEVMODEA,DWORD);
34803506
WINUSERAPI LONG WINAPI ChangeDisplaySettingsW(LPDEVMODEW,DWORD);

0 commit comments

Comments
 (0)