http://bugs.winehq.org/show_bug.cgi?id=7909
------- Additional Comments From focht@gmx.net 2007-12-04 07:54 ------- Hello,
your observation is correct. I used ps 5.5 trial + latest wine snapshot.
The following pseudo code snippet illustrates the lockup in photoshop (made up from disassembly):
--- pseudo code --- bool some_app_class::waitMouseRButtonUp( int& x, int& y) { // right mouse button up ? if( ::GetAsyncKeyState( ::GetSystemMetrics(SM_SWAPBUTTON) ? VK_LBUTTON : VK_RBUTTON) & 0x8000) == 0x8000) { // right mouse button still down, wait until up while( ::GetAsyncKeyState( ::GetSystemMetrics(SM_SWAPBUTTON) ? VK_LBUTTON : VK_RBUTTON) & 0x8000) == 0x8000); }
if ( m_hwnd != 0) { MSG msg; if( !::PeekMessage (&msg, m_hwnd, WM_RBUTTONUP, WM_RBUTTONUP, PM_REMOVE)) return false;
POINT pt = { GET_X_LPARAM( msg.lParam), GET_Y_LPARAM( msg.lParam) }; ::ClientToScreen( m_hwnd, &pt); x = pt.x; y = pt.y; }
return true; } --- pseudo code ---
Running "WINEDEBUG=+key,+msg" shows following sequence:
--- trace --- trace:msg:WINPROC_CallProcWtoA (hwnd=0x20196,msg=WM_SETCURSOR,wp=00020196,lp=02040001) trace:msg:WINPROC_CallProcWtoA (hwnd=0x4002e,msg=WM_SETCURSOR,wp=00020196,lp=02040001) trace:msg:WINPROC_CallProcWtoA (hwnd=0x10026,msg=WM_SETCURSOR,wp=00020196,lp=02040001) trace:msg:WINPROC_CallProcWtoA (hwnd=0x10024,msg=WM_SETCURSOR,wp=00020196,lp=02040001) trace:key:X11DRV_GetAsyncKeyState (2) -> ffff8001 trace:key:X11DRV_GetAsyncKeyState (10) -> 0 trace:key:X11DRV_GetAsyncKeyState (12) -> 0 trace:key:X11DRV_GetAsyncKeyState (11) -> 0 trace:msg:WINPROC_CallProcWtoA (hwnd=0x20196,msg=WM_NCHITTEST,wp=00000000,lp=00a3011a) trace:key:X11DRV_GetAsyncKeyState (20) -> 0 trace:key:X11DRV_GetAsyncKeyState (10) -> 0 trace:key:X11DRV_GetAsyncKeyState (20) -> 0 trace:key:X11DRV_GetAsyncKeyState (12) -> 0 trace:key:X11DRV_GetAsyncKeyState (11) -> 0 trace:key:X11DRV_GetAsyncKeyState (2e) -> 0 trace:key:X11DRV_GetAsyncKeyState (8) -> 0 trace:key:X11DRV_GetAsyncKeyState (1b) -> 0 trace:key:X11DRV_GetAsyncKeyState (10) -> 0 trace:key:X11DRV_GetAsyncKeyState (12) -> 0 trace:key:X11DRV_GetAsyncKeyState (11) -> 0 trace:msg:WINPROC_CallProcWtoA (hwnd=0x20196,msg=WM_NCHITTEST,wp=00000000,lp=00a3011a) trace:key:X11DRV_GetAsyncKeyState (20) -> 0 trace:key:X11DRV_GetAsyncKeyState (12) -> 0 trace:key:X11DRV_GetAsyncKeyState (2) -> ffff8000 trace:key:X11DRV_GetAsyncKeyState (2) -> ffff8000 .... <continues endlessly> --- trace ---
The rbutton up event shows up first (trace:key:X11DRV_GetAsyncKeyState (2) -> ffff8001), No previous rbutton down event is seen. The offending code in photoshop is executed after seeing second WM_NCHITTEST message. Due to "trace:key:X11DRV_GetAsyncKeyState (2)" returning "rbutton down" state all the time, it loops forever (see "while" loop in code).
Maybe some kind of race condition or missed mouse event/update (X11DRV_MsgWaitForMultipleObjectsEx)...
Sidenote: While debugging/killing the hanging app, wine x11 subsystem killed my window borders (decorator/compiz) several times.
Regards