Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
49de5ca3
Commit
49de5ca3
authored
Mar 22, 2010
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
user32: Store the current cursor and show count in the server.
parent
8159d4eb
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
58 additions
and
29 deletions
+58
-29
cursoricon.c
dlls/user32/cursoricon.c
+51
-20
cursoricon.c
dlls/user32/tests/cursoricon.c
+6
-6
user_private.h
dlls/user32/user_private.h
+1
-3
No files found.
dlls/user32/cursoricon.c
View file @
49de5ca3
...
@@ -54,9 +54,10 @@
...
@@ -54,9 +54,10 @@
#include "wine/winbase16.h"
#include "wine/winbase16.h"
#include "wine/winuser16.h"
#include "wine/winuser16.h"
#include "wine/exception.h"
#include "wine/exception.h"
#include "wine/
debug
.h"
#include "wine/
server
.h"
#include "controls.h"
#include "controls.h"
#include "user_private.h"
#include "user_private.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
cursor
);
WINE_DEFAULT_DEBUG_CHANNEL
(
cursor
);
WINE_DECLARE_DEBUG_CHANNEL
(
icon
);
WINE_DECLARE_DEBUG_CHANNEL
(
icon
);
...
@@ -1587,7 +1588,7 @@ BOOL WINAPI DestroyIcon( HICON hIcon )
...
@@ -1587,7 +1588,7 @@ BOOL WINAPI DestroyIcon( HICON hIcon )
*/
*/
BOOL
WINAPI
DestroyCursor
(
HCURSOR
hCursor
)
BOOL
WINAPI
DestroyCursor
(
HCURSOR
hCursor
)
{
{
if
(
get_user_thread_info
()
->
cursor
==
hCursor
)
if
(
GetCursor
()
==
hCursor
)
{
{
WARN_
(
cursor
)(
"Destroying active cursor!
\n
"
);
WARN_
(
cursor
)(
"Destroying active cursor!
\n
"
);
return
FALSE
;
return
FALSE
;
...
@@ -1762,15 +1763,28 @@ BOOL WINAPI DrawIcon( HDC hdc, INT x, INT y, HICON hIcon )
...
@@ -1762,15 +1763,28 @@ BOOL WINAPI DrawIcon( HDC hdc, INT x, INT y, HICON hIcon )
*/
*/
HCURSOR
WINAPI
DECLSPEC_HOTPATCH
SetCursor
(
HCURSOR
hCursor
/* [in] Handle of cursor to show */
)
HCURSOR
WINAPI
DECLSPEC_HOTPATCH
SetCursor
(
HCURSOR
hCursor
/* [in] Handle of cursor to show */
)
{
{
struct
user_thread_info
*
thread_info
=
get_user_thread_info
();
HCURSOR
hOldCursor
;
HCURSOR
hOldCursor
;
int
show_count
;
BOOL
ret
;
if
(
hCursor
==
thread_info
->
cursor
)
return
hCursor
;
/* No change */
TRACE
(
"%p
\n
"
,
hCursor
);
TRACE
(
"%p
\n
"
,
hCursor
);
hOldCursor
=
thread_info
->
cursor
;
thread_info
->
cursor
=
hCursor
;
SERVER_START_REQ
(
set_cursor
)
{
req
->
flags
=
SET_CURSOR_HANDLE
;
req
->
handle
=
wine_server_user_handle
(
hCursor
);
if
((
ret
=
!
wine_server_call_err
(
req
)))
{
hOldCursor
=
wine_server_ptr_handle
(
reply
->
prev_handle
);
show_count
=
reply
->
prev_count
;
}
}
SERVER_END_REQ
;
if
(
!
ret
)
return
0
;
/* Change the cursor shape only if it is visible */
/* Change the cursor shape only if it is visible */
if
(
thread_info
->
cursor
_count
>=
0
)
if
(
show
_count
>=
0
)
{
{
CURSORICONINFO
*
info
=
get_icon_ptr
(
hCursor
);
CURSORICONINFO
*
info
=
get_icon_ptr
(
hCursor
);
/* release before calling driver (FIXME) */
/* release before calling driver (FIXME) */
...
@@ -1785,26 +1799,34 @@ HCURSOR WINAPI DECLSPEC_HOTPATCH SetCursor( HCURSOR hCursor /* [in] Handle of cu
...
@@ -1785,26 +1799,34 @@ HCURSOR WINAPI DECLSPEC_HOTPATCH SetCursor( HCURSOR hCursor /* [in] Handle of cu
*/
*/
INT
WINAPI
DECLSPEC_HOTPATCH
ShowCursor
(
BOOL
bShow
)
INT
WINAPI
DECLSPEC_HOTPATCH
ShowCursor
(
BOOL
bShow
)
{
{
struct
user_thread_info
*
thread_info
=
get_user_thread_info
();
HCURSOR
cursor
;
int
increment
=
bShow
?
1
:
-
1
;
int
prev_count
;
TRACE
(
"%d, count=%d
\n
"
,
bShow
,
thread_info
->
cursor_count
);
SERVER_START_REQ
(
set_cursor
)
{
req
->
flags
=
SET_CURSOR_COUNT
;
req
->
show_count
=
increment
;
wine_server_call
(
req
);
cursor
=
wine_server_ptr_handle
(
reply
->
prev_handle
);
prev_count
=
reply
->
prev_count
;
}
SERVER_END_REQ
;
TRACE
(
"%d, count=%d
\n
"
,
bShow
,
prev_count
+
increment
);
if
(
bShow
)
if
(
!
prev_count
)
{
{
if
(
++
thread_info
->
cursor_count
==
0
)
/* Show it */
if
(
bShow
)
{
{
CURSORICONINFO
*
info
=
get_icon_ptr
(
thread_info
->
cursor
);
CURSORICONINFO
*
info
=
get_icon_ptr
(
cursor
);
/* release before calling driver (FIXME) */
/* release before calling driver (FIXME) */
if
(
info
)
release_icon_ptr
(
thread_info
->
cursor
,
info
);
if
(
info
)
release_icon_ptr
(
cursor
,
info
);
USER_Driver
->
pSetCursor
(
info
);
USER_Driver
->
pSetCursor
(
info
);
}
}
else
USER_Driver
->
pSetCursor
(
NULL
);
}
}
else
return
prev_count
+
increment
;
{
if
(
--
thread_info
->
cursor_count
==
-
1
)
/* Hide it */
USER_Driver
->
pSetCursor
(
NULL
);
}
return
thread_info
->
cursor_count
;
}
}
/***********************************************************************
/***********************************************************************
...
@@ -1812,7 +1834,16 @@ INT WINAPI DECLSPEC_HOTPATCH ShowCursor( BOOL bShow )
...
@@ -1812,7 +1834,16 @@ INT WINAPI DECLSPEC_HOTPATCH ShowCursor( BOOL bShow )
*/
*/
HCURSOR
WINAPI
GetCursor
(
void
)
HCURSOR
WINAPI
GetCursor
(
void
)
{
{
return
get_user_thread_info
()
->
cursor
;
HCURSOR
ret
;
SERVER_START_REQ
(
set_cursor
)
{
req
->
flags
=
0
;
wine_server_call
(
req
);
ret
=
wine_server_ptr_handle
(
reply
->
prev_handle
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
...
dlls/user32/tests/cursoricon.c
View file @
49de5ca3
...
@@ -1445,7 +1445,7 @@ static void test_SetCursor(void)
...
@@ -1445,7 +1445,7 @@ static void test_SetCursor(void)
WaitForSingleObject
(
thread
,
1000
);
WaitForSingleObject
(
thread
,
1000
);
GetExitCodeThread
(
thread
,
&
result
);
GetExitCodeThread
(
thread
,
&
result
);
ok
(
result
==
(
DWORD_PTR
)
old_cursor
,
"wrong thread cursor %x/%p
\n
"
,
result
,
old_cursor
);
ok
(
result
==
(
DWORD_PTR
)
old_cursor
,
"wrong thread cursor %x/%p
\n
"
,
result
,
old_cursor
);
todo_wine
ok
(
GetCursor
()
==
cursor
,
"wrong cursor %p/0
\n
"
,
cursor
);
ok
(
GetCursor
()
==
cursor
,
"wrong cursor %p/0
\n
"
,
cursor
);
if
(
pGetCursorInfo
)
if
(
pGetCursorInfo
)
{
{
...
@@ -1461,7 +1461,7 @@ static void test_SetCursor(void)
...
@@ -1461,7 +1461,7 @@ static void test_SetCursor(void)
cursor
=
SetCursor
(
(
HCURSOR
)
0xbadbad
);
cursor
=
SetCursor
(
(
HCURSOR
)
0xbadbad
);
error
=
GetLastError
();
error
=
GetLastError
();
ok
(
cursor
==
0
,
"wrong cursor %p/0
\n
"
,
cursor
);
ok
(
cursor
==
0
,
"wrong cursor %p/0
\n
"
,
cursor
);
todo_wine
ok
(
error
==
ERROR_INVALID_CURSOR_HANDLE
||
broken
(
error
==
0xdeadbeef
),
/* win9x */
ok
(
error
==
ERROR_INVALID_CURSOR_HANDLE
||
broken
(
error
==
0xdeadbeef
),
/* win9x */
"wrong error %u
\n
"
,
error
);
"wrong error %u
\n
"
,
error
);
if
(
pGetCursorInfo
)
if
(
pGetCursorInfo
)
...
@@ -1559,22 +1559,22 @@ static void test_ShowCursor(void)
...
@@ -1559,22 +1559,22 @@ static void test_ShowCursor(void)
thread
=
CreateThread
(
NULL
,
0
,
show_cursor_thread
,
NULL
,
0
,
&
id
);
thread
=
CreateThread
(
NULL
,
0
,
show_cursor_thread
,
NULL
,
0
,
&
id
);
WaitForSingleObject
(
event_start
,
1000
);
WaitForSingleObject
(
event_start
,
1000
);
count
=
ShowCursor
(
TRUE
);
count
=
ShowCursor
(
TRUE
);
todo_wine
ok
(
count
==
-
2
,
"wrong count %d
\n
"
,
count
);
ok
(
count
==
-
2
,
"wrong count %d
\n
"
,
count
);
SetEvent
(
event_next
);
SetEvent
(
event_next
);
WaitForSingleObject
(
thread
,
1000
);
WaitForSingleObject
(
thread
,
1000
);
GetExitCodeThread
(
thread
,
&
result
);
GetExitCodeThread
(
thread
,
&
result
);
todo_wine
ok
(
result
==
-
3
,
"wrong thread count %d
\n
"
,
result
);
ok
(
result
==
-
3
,
"wrong thread count %d
\n
"
,
result
);
count
=
ShowCursor
(
FALSE
);
count
=
ShowCursor
(
FALSE
);
ok
(
count
==
-
2
,
"wrong count %d
\n
"
,
count
);
ok
(
count
==
-
2
,
"wrong count %d
\n
"
,
count
);
thread
=
CreateThread
(
NULL
,
0
,
show_cursor_thread
,
(
void
*
)
3
,
0
,
&
id
);
thread
=
CreateThread
(
NULL
,
0
,
show_cursor_thread
,
(
void
*
)
3
,
0
,
&
id
);
WaitForSingleObject
(
event_start
,
1000
);
WaitForSingleObject
(
event_start
,
1000
);
count
=
ShowCursor
(
TRUE
);
count
=
ShowCursor
(
TRUE
);
todo_wine
ok
(
count
==
2
,
"wrong count %d
\n
"
,
count
);
ok
(
count
==
2
,
"wrong count %d
\n
"
,
count
);
SetEvent
(
event_next
);
SetEvent
(
event_next
);
WaitForSingleObject
(
thread
,
1000
);
WaitForSingleObject
(
thread
,
1000
);
GetExitCodeThread
(
thread
,
&
result
);
GetExitCodeThread
(
thread
,
&
result
);
todo_wine
ok
(
result
==
1
,
"wrong thread count %d
\n
"
,
result
);
ok
(
result
==
1
,
"wrong thread count %d
\n
"
,
result
);
count
=
ShowCursor
(
FALSE
);
count
=
ShowCursor
(
FALSE
);
ok
(
count
==
-
2
,
"wrong count %d
\n
"
,
count
);
ok
(
count
==
-
2
,
"wrong count %d
\n
"
,
count
);
...
...
dlls/user32/user_private.h
View file @
49de5ca3
...
@@ -175,13 +175,11 @@ struct user_thread_info
...
@@ -175,13 +175,11 @@ struct user_thread_info
DWORD
GetMessageTimeVal
;
/* Value for GetMessageTime */
DWORD
GetMessageTimeVal
;
/* Value for GetMessageTime */
DWORD
GetMessagePosVal
;
/* Value for GetMessagePos */
DWORD
GetMessagePosVal
;
/* Value for GetMessagePos */
ULONG_PTR
GetMessageExtraInfoVal
;
/* Value for GetMessageExtraInfo */
ULONG_PTR
GetMessageExtraInfoVal
;
/* Value for GetMessageExtraInfo */
HCURSOR
cursor
;
/* Current cursor */
INT
cursor_count
;
/* Cursor show count */
UINT
active_hooks
;
/* Bitmap of active hooks */
UINT
active_hooks
;
/* Bitmap of active hooks */
HWND
top_window
;
/* Desktop window */
HWND
top_window
;
/* Desktop window */
HWND
msg_window
;
/* HWND_MESSAGE parent window */
HWND
msg_window
;
/* HWND_MESSAGE parent window */
ULONG
pad
[
9
];
/* Available for more data */
ULONG
pad
[
11
];
/* Available for more data */
};
};
struct
hook_extra_info
struct
hook_extra_info
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment