Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
4da1c437
Commit
4da1c437
authored
Nov 05, 2018
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
user32: Implement GetCurrentInputMessageSource().
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
771123af
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
62 additions
and
26 deletions
+62
-26
message.c
dlls/user32/message.c
+16
-2
user_private.h
dlls/user32/user_private.h
+4
-3
server_protocol.h
include/wine/server_protocol.h
+11
-4
protocol.def
server/protocol.def
+10
-3
queue.c
server/queue.c
+21
-14
No files found.
dlls/user32/message.c
View file @
4da1c437
...
...
@@ -280,6 +280,8 @@ struct send_message_info
enum
wm_char_mapping
wm_char
;
};
static
const
INPUT_MESSAGE_SOURCE
msg_source_unavailable
=
{
IMDT_UNAVAILABLE
,
IMO_UNAVAILABLE
};
/* Message class descriptor */
static
const
WCHAR
messageW
[]
=
{
'M'
,
'e'
,
's'
,
's'
,
'a'
,
'g'
,
'e'
,
0
};
...
...
@@ -2701,6 +2703,9 @@ static BOOL process_hardware_message( MSG *msg, UINT hw_id, const struct hardwar
DPI_AWARENESS_CONTEXT
context
;
BOOL
ret
=
FALSE
;
get_user_thread_info
()
->
msg_source
.
deviceType
=
msg_data
->
source
.
device
;
get_user_thread_info
()
->
msg_source
.
originId
=
msg_data
->
source
.
origin
;
/* hardware messages are always in physical coords */
context
=
SetThreadDpiAwarenessContext
(
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE
);
...
...
@@ -2745,6 +2750,7 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags
{
LRESULT
result
;
struct
user_thread_info
*
thread_info
=
get_user_thread_info
();
INPUT_MESSAGE_SOURCE
prev_source
=
thread_info
->
msg_source
;
struct
received_message_info
info
,
*
old_info
;
unsigned
int
hw_id
=
0
;
/* id of previous hardware message */
void
*
buffer
;
...
...
@@ -2761,6 +2767,8 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags
size_t
size
=
0
;
const
message_data_t
*
msg_data
=
buffer
;
thread_info
->
msg_source
=
prev_source
;
SERVER_START_REQ
(
get_message
)
{
req
->
flags
=
flags
;
...
...
@@ -2952,6 +2960,7 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags
thread_info
->
GetMessagePosVal
=
MAKELONG
(
msg
->
pt
.
x
,
msg
->
pt
.
y
);
thread_info
->
GetMessageTimeVal
=
info
.
msg
.
time
;
thread_info
->
GetMessageExtraInfoVal
=
0
;
thread_info
->
msg_source
=
msg_source_unavailable
;
HeapFree
(
GetProcessHeap
(),
0
,
buffer
);
HOOK_CallHooks
(
WH_GETMESSAGE
,
HC_ACTION
,
flags
&
PM_REMOVE
,
(
LPARAM
)
msg
,
TRUE
);
return
TRUE
;
...
...
@@ -2960,6 +2969,7 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags
/* if we get here, we have a sent message; call the window procedure */
old_info
=
thread_info
->
receive_info
;
thread_info
->
receive_info
=
&
info
;
thread_info
->
msg_source
=
msg_source_unavailable
;
result
=
call_window_proc
(
info
.
msg
.
hwnd
,
info
.
msg
.
message
,
info
.
msg
.
wParam
,
info
.
msg
.
lParam
,
(
info
.
type
!=
MSG_ASCII
),
FALSE
,
WMCHAR_MAP_RECVMESSAGE
);
...
...
@@ -3252,6 +3262,8 @@ static BOOL is_message_broadcastable(UINT msg)
*/
static
BOOL
send_message
(
struct
send_message_info
*
info
,
DWORD_PTR
*
res_ptr
,
BOOL
unicode
)
{
struct
user_thread_info
*
thread_info
=
get_user_thread_info
();
INPUT_MESSAGE_SOURCE
prev_source
=
thread_info
->
msg_source
;
DWORD
dest_pid
;
BOOL
ret
;
LRESULT
result
;
...
...
@@ -3268,6 +3280,7 @@ static BOOL send_message( struct send_message_info *info, DWORD_PTR *res_ptr, BO
if
(
USER_IsExitingThread
(
info
->
dest_tid
))
return
FALSE
;
thread_info
->
msg_source
=
msg_source_unavailable
;
SPY_EnterMessage
(
SPY_SENDMESSAGE
,
info
->
hwnd
,
info
->
msg
,
info
->
wparam
,
info
->
lparam
);
if
(
info
->
dest_tid
==
GetCurrentThreadId
())
...
...
@@ -3293,6 +3306,7 @@ static BOOL send_message( struct send_message_info *info, DWORD_PTR *res_ptr, BO
}
SPY_ExitMessage
(
SPY_RESULT_OK
,
info
->
hwnd
,
info
->
msg
,
result
,
info
->
wparam
,
info
->
lparam
);
thread_info
->
msg_source
=
prev_source
;
if
(
ret
&&
res_ptr
)
*
res_ptr
=
result
;
return
ret
;
}
...
...
@@ -4136,8 +4150,8 @@ LPARAM WINAPI SetMessageExtraInfo(LPARAM lParam)
*/
BOOL
WINAPI
GetCurrentInputMessageSource
(
INPUT_MESSAGE_SOURCE
*
source
)
{
FIXME
(
"stub
\n
"
)
;
return
FALS
E
;
*
source
=
get_user_thread_info
()
->
msg_source
;
return
TRU
E
;
}
...
...
dlls/user32/user_private.h
View file @
4da1c437
...
...
@@ -169,21 +169,22 @@ struct wm_char_mapping_data
/* no attempt is made to keep the layout compatible with the Windows one */
struct
user_thread_info
{
DPI_AWARENESS
dpi_awareness
;
/* DPI awareness */
HANDLE
server_queue
;
/* Handle to server-side queue */
DWORD
wake_mask
;
/* Current queue wake mask */
DWORD
changed_mask
;
/* Current queue changed mask */
WORD
recursion_count
;
/* SendMessage recursion counter */
WORD
message_count
;
/* Get/PeekMessage loop counter */
WORD
hook_call_depth
;
/* Number of recursively called hook procs */
BOOL
hook_unicode
;
/* Is current hook unicode? */
WORD
hook_unicode
;
/* Is current hook unicode? */
HHOOK
hook
;
/* Current hook */
UINT
active_hooks
;
/* Bitmap of active hooks */
DPI_AWARENESS
dpi_awareness
;
/* DPI awareness */
INPUT_MESSAGE_SOURCE
msg_source
;
/* Message source for current message */
struct
received_message_info
*
receive_info
;
/* Message being currently received */
struct
wm_char_mapping_data
*
wmchar_data
;
/* Data for WM_CHAR mappings */
DWORD
GetMessageTimeVal
;
/* Value for GetMessageTime */
DWORD
GetMessagePosVal
;
/* Value for GetMessagePos */
ULONG_PTR
GetMessageExtraInfoVal
;
/* Value for GetMessageExtraInfo */
UINT
active_hooks
;
/* Bitmap of active hooks */
struct
user_key_state_info
*
key_state
;
/* Cache of global key state */
HWND
top_window
;
/* Desktop window */
HWND
msg_window
;
/* HWND_MESSAGE parent window */
...
...
include/wine/server_protocol.h
View file @
4da1c437
...
...
@@ -264,11 +264,18 @@ typedef struct
struct
hw_msg_source
{
unsigned
int
device
;
unsigned
int
origin
;
};
struct
hardware_msg_data
{
lparam_t
info
;
unsigned
int
hw_id
;
unsigned
int
flags
;
lparam_t
info
;
unsigned
int
hw_id
;
unsigned
int
flags
;
struct
hw_msg_source
source
;
union
{
int
type
;
...
...
@@ -6546,6 +6553,6 @@ union generic_reply
struct
terminate_job_reply
terminate_job_reply
;
};
#define SERVER_PROTOCOL_VERSION 57
0
#define SERVER_PROTOCOL_VERSION 57
1
#endif
/* __WINE_WINE_SERVER_PROTOCOL_H */
server/protocol.def
View file @
4da1c437
...
...
@@ -280,11 +280,18 @@ typedef struct
/* structures for extra message data */
struct hw_msg_source
{
unsigned int device; /* source device (IMDT_* values) */
unsigned int origin; /* source origin (IMO_* values) */
};
struct hardware_msg_data
{
lparam_t info; /* extra info */
unsigned int hw_id; /* unique id */
unsigned int flags; /* hook flags */
lparam_t info; /* extra info */
unsigned int hw_id; /* unique id */
unsigned int flags; /* hook flags */
struct hw_msg_source source; /* message source */
union
{
int type;
...
...
server/queue.c
View file @
4da1c437
...
...
@@ -340,7 +340,8 @@ static int assign_thread_input( struct thread *thread, struct thread_input *new_
}
/* allocate a hardware message and its data */
static
struct
message
*
alloc_hardware_message
(
lparam_t
info
,
unsigned
int
time
)
static
struct
message
*
alloc_hardware_message
(
lparam_t
info
,
struct
hw_msg_source
source
,
unsigned
int
time
)
{
struct
hardware_msg_data
*
msg_data
;
struct
message
*
msg
;
...
...
@@ -359,15 +360,17 @@ static struct message *alloc_hardware_message( lparam_t info, unsigned int time
memset
(
msg_data
,
0
,
sizeof
(
*
msg_data
)
);
msg_data
->
info
=
info
;
msg_data
->
source
=
source
;
return
msg
;
}
/* set the cursor position and queue the corresponding mouse message */
static
void
set_cursor_pos
(
struct
desktop
*
desktop
,
int
x
,
int
y
)
{
static
const
struct
hw_msg_source
source
=
{
IMDT_UNAVAILABLE
,
IMO_SYSTEM
};
struct
message
*
msg
;
if
(
!
(
msg
=
alloc_hardware_message
(
0
,
get_tick_count
()
)))
return
;
if
(
!
(
msg
=
alloc_hardware_message
(
0
,
source
,
get_tick_count
()
)))
return
;
msg
->
msg
=
WM_MOUSEMOVE
;
msg
->
x
=
x
;
...
...
@@ -1593,12 +1596,13 @@ static int send_hook_ll_message( struct desktop *desktop, struct message *hardwa
/* queue a hardware message for a mouse event */
static
int
queue_mouse_message
(
struct
desktop
*
desktop
,
user_handle_t
win
,
const
hw_input_t
*
input
,
unsigned
int
hook_flags
,
struct
msg_queue
*
sender
)
unsigned
int
origin
,
struct
msg_queue
*
sender
)
{
const
struct
rawinput_device
*
device
;
struct
hardware_msg_data
*
msg_data
;
struct
message
*
msg
;
unsigned
int
i
,
time
,
flags
;
struct
hw_msg_source
source
=
{
IMDT_MOUSE
,
origin
};
int
wait
=
0
,
x
,
y
;
static
const
unsigned
int
messages
[]
=
...
...
@@ -1647,7 +1651,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons
if
((
device
=
current
->
process
->
rawinput_mouse
))
{
if
(
!
(
msg
=
alloc_hardware_message
(
input
->
mouse
.
info
,
time
)))
return
0
;
if
(
!
(
msg
=
alloc_hardware_message
(
input
->
mouse
.
info
,
source
,
time
)))
return
0
;
msg_data
=
msg
->
data
;
msg
->
win
=
device
->
target
;
...
...
@@ -1670,7 +1674,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons
if
(
!
(
flags
&
(
1
<<
i
)))
continue
;
flags
&=
~
(
1
<<
i
);
if
(
!
(
msg
=
alloc_hardware_message
(
input
->
mouse
.
info
,
time
)))
return
0
;
if
(
!
(
msg
=
alloc_hardware_message
(
input
->
mouse
.
info
,
source
,
time
)))
return
0
;
msg_data
=
msg
->
data
;
msg
->
win
=
get_user_full_handle
(
win
);
...
...
@@ -1679,7 +1683,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons
msg
->
lparam
=
0
;
msg
->
x
=
x
;
msg
->
y
=
y
;
if
(
hook_flags
&
SEND_HWMSG
_INJECTED
)
msg_data
->
flags
=
LLMHF_INJECTED
;
if
(
origin
==
IMO
_INJECTED
)
msg_data
->
flags
=
LLMHF_INJECTED
;
/* specify a sender only when sending the last message */
if
(
!
(
flags
&
((
1
<<
ARRAY_SIZE
(
messages
))
-
1
)))
...
...
@@ -1695,8 +1699,9 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons
/* queue a hardware message for a keyboard event */
static
int
queue_keyboard_message
(
struct
desktop
*
desktop
,
user_handle_t
win
,
const
hw_input_t
*
input
,
unsigned
int
hook_flags
,
struct
msg_queue
*
sender
)
unsigned
int
origin
,
struct
msg_queue
*
sender
)
{
struct
hw_msg_source
source
=
{
IMDT_KEYBOARD
,
origin
};
const
struct
rawinput_device
*
device
;
struct
hardware_msg_data
*
msg_data
;
struct
message
*
msg
;
...
...
@@ -1770,7 +1775,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c
break
;
}
if
(
!
(
msg
=
alloc_hardware_message
(
input
->
kbd
.
info
,
time
)))
return
0
;
if
(
!
(
msg
=
alloc_hardware_message
(
input
->
kbd
.
info
,
source
,
time
)))
return
0
;
msg_data
=
msg
->
data
;
if
((
device
=
current
->
process
->
rawinput_kbd
))
...
...
@@ -1791,7 +1796,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c
msg
->
win
=
get_user_full_handle
(
win
);
msg
->
msg
=
message_code
;
msg
->
lparam
=
(
input
->
kbd
.
scan
<<
16
)
|
1u
;
/* repeat count */
if
(
hook_flags
&
SEND_HWMSG
_INJECTED
)
msg_data
->
flags
=
LLKHF_INJECTED
;
if
(
origin
==
IMO
_INJECTED
)
msg_data
->
flags
=
LLKHF_INJECTED
;
if
(
input
->
kbd
.
flags
&
KEYEVENTF_UNICODE
)
{
...
...
@@ -1818,11 +1823,12 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c
/* queue a hardware message for a custom type of event */
static
void
queue_custom_hardware_message
(
struct
desktop
*
desktop
,
user_handle_t
win
,
const
hw_input_t
*
input
)
unsigned
int
origin
,
const
hw_input_t
*
input
)
{
struct
hw_msg_source
source
=
{
IMDT_UNAVAILABLE
,
origin
};
struct
message
*
msg
;
if
(
!
(
msg
=
alloc_hardware_message
(
0
,
get_tick_count
()
)))
return
;
if
(
!
(
msg
=
alloc_hardware_message
(
0
,
source
,
get_tick_count
()
)))
return
;
msg
->
win
=
get_user_full_handle
(
win
);
msg
->
msg
=
input
->
hw
.
msg
;
...
...
@@ -2317,6 +2323,7 @@ DECL_HANDLER(send_hardware_message)
{
struct
thread
*
thread
=
NULL
;
struct
desktop
*
desktop
;
unsigned
int
origin
=
(
req
->
flags
&
SEND_HWMSG_INJECTED
?
IMO_INJECTED
:
IMO_HARDWARE
);
struct
msg_queue
*
sender
=
get_current_queue
();
data_size_t
size
=
min
(
256
,
get_reply_max_size
()
);
...
...
@@ -2339,13 +2346,13 @@ DECL_HANDLER(send_hardware_message)
switch
(
req
->
input
.
type
)
{
case
INPUT_MOUSE
:
reply
->
wait
=
queue_mouse_message
(
desktop
,
req
->
win
,
&
req
->
input
,
req
->
flags
,
sender
);
reply
->
wait
=
queue_mouse_message
(
desktop
,
req
->
win
,
&
req
->
input
,
origin
,
sender
);
break
;
case
INPUT_KEYBOARD
:
reply
->
wait
=
queue_keyboard_message
(
desktop
,
req
->
win
,
&
req
->
input
,
req
->
flags
,
sender
);
reply
->
wait
=
queue_keyboard_message
(
desktop
,
req
->
win
,
&
req
->
input
,
origin
,
sender
);
break
;
case
INPUT_HARDWARE
:
queue_custom_hardware_message
(
desktop
,
req
->
win
,
&
req
->
input
);
queue_custom_hardware_message
(
desktop
,
req
->
win
,
origin
,
&
req
->
input
);
break
;
default
:
set_error
(
STATUS_INVALID_PARAMETER
);
...
...
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