Commit 61b15de4 authored by Rein Klazes's avatar Rein Klazes Committed by Alexandre Julliard

Use an extra bit in the button status byte to flag whether the

DefButtonWndProc should process the WM_LBUTTONUP message.
parent 3d06d20b
...@@ -137,27 +137,31 @@ static inline LRESULT WINAPI ButtonWndProc_locked(WND* wndPtr, UINT uMsg, ...@@ -137,27 +137,31 @@ static inline LRESULT WINAPI ButtonWndProc_locked(WND* wndPtr, UINT uMsg,
break; break;
case WM_LBUTTONDBLCLK: case WM_LBUTTONDBLCLK:
if(wndPtr->dwStyle & BS_NOTIFY || if(wndPtr->dwStyle & BS_NOTIFY ||
style==BS_RADIOBUTTON || style==BS_RADIOBUTTON ||
style==BS_USERBUTTON || style==BS_USERBUTTON ||
style==BS_OWNERDRAW){ style==BS_OWNERDRAW) {
SendMessageA( GetParent(hWnd), WM_COMMAND, SendMessageA( GetParent(hWnd), WM_COMMAND,
MAKEWPARAM( wndPtr->wIDmenu, BN_DOUBLECLICKED ), hWnd); MAKEWPARAM( wndPtr->wIDmenu, BN_DOUBLECLICKED ), hWnd);
break; break;
} }
/* fall through */ /* fall through */
case WM_LBUTTONDOWN: case WM_LBUTTONDOWN:
SetCapture( hWnd ); SetCapture( hWnd );
SetFocus( hWnd ); SetFocus( hWnd );
SendMessageA( hWnd, BM_SETSTATE, TRUE, 0 ); SendMessageA( hWnd, BM_SETSTATE, TRUE, 0 );
infoPtr->state |= BUTTON_BTNPRESSED;
break; break;
case WM_LBUTTONUP: case WM_LBUTTONUP:
/* FIXME: real windows uses extra flags in the status for this */ if (!(infoPtr->state & BUTTON_BTNPRESSED)) break;
if (GetCapture() != hWnd) break; infoPtr->state &= BUTTON_NSTATES;
ReleaseCapture(); if (!(infoPtr->state & BUTTON_HIGHLIGHTED)) {
if (!(infoPtr->state & BUTTON_HIGHLIGHTED)) break; ReleaseCapture();
break;
}
SendMessageA( hWnd, BM_SETSTATE, FALSE, 0 ); SendMessageA( hWnd, BM_SETSTATE, FALSE, 0 );
ReleaseCapture();
GetClientRect( hWnd, &rect ); GetClientRect( hWnd, &rect );
if (PtInRect( &rect, pt )) if (PtInRect( &rect, pt ))
{ {
...@@ -181,6 +185,14 @@ static inline LRESULT WINAPI ButtonWndProc_locked(WND* wndPtr, UINT uMsg, ...@@ -181,6 +185,14 @@ static inline LRESULT WINAPI ButtonWndProc_locked(WND* wndPtr, UINT uMsg,
} }
break; break;
case WM_CAPTURECHANGED:
if (infoPtr->state & BUTTON_BTNPRESSED) {
infoPtr->state &= BUTTON_NSTATES;
if (infoPtr->state & BUTTON_HIGHLIGHTED)
SendMessageA( hWnd, BM_SETSTATE, FALSE, 0 );
}
break;
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
if (GetCapture() == hWnd) if (GetCapture() == hWnd)
{ {
......
...@@ -26,6 +26,11 @@ typedef struct ...@@ -26,6 +26,11 @@ typedef struct
#define BUTTON_3STATE 0x02 #define BUTTON_3STATE 0x02
#define BUTTON_HIGHLIGHTED 0x04 #define BUTTON_HIGHLIGHTED 0x04
#define BUTTON_HASFOCUS 0x08 #define BUTTON_HASFOCUS 0x08
#define BUTTON_NSTATES 0x0F
/* undocumented flags */
#define BUTTON_BTNPRESSED 0x40
#define BUTTON_UNKNOWN2 0x20
#define BUTTON_UNKNOWN3 0x10
#define BUTTON_STATE(hwnd) ((WIN_FindWndPtr(hwnd))->wExtra[0]) #define BUTTON_STATE(hwnd) ((WIN_FindWndPtr(hwnd))->wExtra[0])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment