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
8ba666f3
Commit
8ba666f3
authored
Jan 08, 2003
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Store the keyboard state in the thread input structure on the server
side.
parent
3783e49d
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
291 additions
and
166 deletions
+291
-166
message.c
dlls/user/message.c
+66
-0
msg16.c
dlls/user/msg16.c
+27
-0
user.exe.spec
dlls/user/user.exe.spec
+2
-2
server_protocol.h
include/wine/server_protocol.h
+33
-1
protocol.def
server/protocol.def
+15
-0
queue.c
server/queue.c
+111
-5
request.h
server/request.h
+4
-0
trace.c
server/trace.c
+26
-0
message.c
windows/message.c
+7
-158
No files found.
dlls/user/message.c
View file @
8ba666f3
...
@@ -2298,3 +2298,69 @@ BOOL WINAPI GetGUIThreadInfo( DWORD id, GUITHREADINFO *info )
...
@@ -2298,3 +2298,69 @@ BOOL WINAPI GetGUIThreadInfo( DWORD id, GUITHREADINFO *info )
SERVER_END_REQ
;
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
/**********************************************************************
* GetKeyState (USER32.@)
*
* An application calls the GetKeyState function in response to a
* keyboard-input message. This function retrieves the state of the key
* at the time the input message was generated.
*/
SHORT
WINAPI
GetKeyState
(
INT
vkey
)
{
SHORT
retval
=
0
;
SERVER_START_REQ
(
get_key_state
)
{
req
->
tid
=
GetCurrentThreadId
();
req
->
key
=
vkey
;
if
(
!
wine_server_call
(
req
))
retval
=
(
signed
char
)
reply
->
state
;
}
SERVER_END_REQ
;
TRACE
(
"key (0x%x) -> %x
\n
"
,
vkey
,
retval
);
return
retval
;
}
/**********************************************************************
* GetKeyboardState (USER32.@)
*/
BOOL
WINAPI
GetKeyboardState
(
LPBYTE
state
)
{
BOOL
ret
;
TRACE
(
"(%p)
\n
"
,
state
);
memset
(
state
,
0
,
256
);
SERVER_START_REQ
(
get_key_state
)
{
req
->
tid
=
GetCurrentThreadId
();
req
->
key
=
-
1
;
wine_server_set_reply
(
req
,
state
,
256
);
ret
=
!
wine_server_call_err
(
req
);
}
SERVER_END_REQ
;
return
ret
;
}
/**********************************************************************
* SetKeyboardState (USER32.@)
*/
BOOL
WINAPI
SetKeyboardState
(
LPBYTE
state
)
{
BOOL
ret
;
TRACE
(
"(%p)
\n
"
,
state
);
memset
(
state
,
0
,
256
);
SERVER_START_REQ
(
set_key_state
)
{
req
->
tid
=
GetCurrentThreadId
();
wine_server_add_data
(
req
,
state
,
256
);
ret
=
!
wine_server_call_err
(
req
);
}
SERVER_END_REQ
;
return
ret
;
}
dlls/user/msg16.c
View file @
8ba666f3
...
@@ -403,6 +403,33 @@ void WINAPI PostQuitMessage16( INT16 exitCode )
...
@@ -403,6 +403,33 @@ void WINAPI PostQuitMessage16( INT16 exitCode )
}
}
/**********************************************************************
* GetKeyState (USER.106)
*/
INT16
WINAPI
GetKeyState16
(
INT16
vkey
)
{
return
GetKeyState
(
vkey
);
}
/**********************************************************************
* GetKeyboardState (USER.222)
*/
BOOL
WINAPI
GetKeyboardState16
(
LPBYTE
state
)
{
return
GetKeyboardState
(
state
);
}
/**********************************************************************
* SetKeyboardState (USER.223)
*/
BOOL
WINAPI
SetKeyboardState16
(
LPBYTE
state
)
{
return
SetKeyboardState
(
state
);
}
/***********************************************************************
/***********************************************************************
* SetMessageQueue (USER.266)
* SetMessageQueue (USER.266)
*/
*/
...
...
dlls/user/user.exe.spec
View file @
8ba666f3
...
@@ -219,8 +219,8 @@
...
@@ -219,8 +219,8 @@
219 pascal16 CreateDialogIndirect(word ptr word segptr) CreateDialogIndirect16
219 pascal16 CreateDialogIndirect(word ptr word segptr) CreateDialogIndirect16
220 pascal16 LoadMenuIndirect(ptr) LoadMenuIndirect16
220 pascal16 LoadMenuIndirect(ptr) LoadMenuIndirect16
221 pascal16 ScrollDC(word s_word s_word ptr ptr word ptr) ScrollDC16
221 pascal16 ScrollDC(word s_word s_word ptr ptr word ptr) ScrollDC16
222 pascal16 GetKeyboardState(ptr) GetKeyboardState
222 pascal16 GetKeyboardState(ptr) GetKeyboardState
16
223 pascal16 SetKeyboardState(ptr) SetKeyboardState
223 pascal16 SetKeyboardState(ptr) SetKeyboardState
16
224 pascal16 GetWindowTask(word) GetWindowTask16
224 pascal16 GetWindowTask(word) GetWindowTask16
225 pascal16 EnumTaskWindows(word segptr long) EnumTaskWindows16
225 pascal16 EnumTaskWindows(word segptr long) EnumTaskWindows16
226 stub LockInput # not in W2.0
226 stub LockInput # not in W2.0
...
...
include/wine/server_protocol.h
View file @
8ba666f3
...
@@ -2778,6 +2778,32 @@ struct get_thread_input_reply
...
@@ -2778,6 +2778,32 @@ struct get_thread_input_reply
};
};
struct
get_key_state_request
{
struct
request_header
__header
;
thread_id_t
tid
;
int
key
;
};
struct
get_key_state_reply
{
struct
reply_header
__header
;
unsigned
char
state
;
/* VARARG(keystate,bytes); */
};
struct
set_key_state_request
{
struct
request_header
__header
;
thread_id_t
tid
;
/* VARARG(keystate,bytes); */
};
struct
set_key_state_reply
{
struct
reply_header
__header
;
};
struct
set_foreground_window_request
struct
set_foreground_window_request
{
{
struct
request_header
__header
;
struct
request_header
__header
;
...
@@ -3112,6 +3138,8 @@ enum request
...
@@ -3112,6 +3138,8 @@ enum request
REQ_get_window_properties
,
REQ_get_window_properties
,
REQ_attach_thread_input
,
REQ_attach_thread_input
,
REQ_get_thread_input
,
REQ_get_thread_input
,
REQ_get_key_state
,
REQ_set_key_state
,
REQ_set_foreground_window
,
REQ_set_foreground_window
,
REQ_set_focus_window
,
REQ_set_focus_window
,
REQ_set_active_window
,
REQ_set_active_window
,
...
@@ -3289,6 +3317,8 @@ union generic_request
...
@@ -3289,6 +3317,8 @@ union generic_request
struct
get_window_properties_request
get_window_properties_request
;
struct
get_window_properties_request
get_window_properties_request
;
struct
attach_thread_input_request
attach_thread_input_request
;
struct
attach_thread_input_request
attach_thread_input_request
;
struct
get_thread_input_request
get_thread_input_request
;
struct
get_thread_input_request
get_thread_input_request
;
struct
get_key_state_request
get_key_state_request
;
struct
set_key_state_request
set_key_state_request
;
struct
set_foreground_window_request
set_foreground_window_request
;
struct
set_foreground_window_request
set_foreground_window_request
;
struct
set_focus_window_request
set_focus_window_request
;
struct
set_focus_window_request
set_focus_window_request
;
struct
set_active_window_request
set_active_window_request
;
struct
set_active_window_request
set_active_window_request
;
...
@@ -3464,6 +3494,8 @@ union generic_reply
...
@@ -3464,6 +3494,8 @@ union generic_reply
struct
get_window_properties_reply
get_window_properties_reply
;
struct
get_window_properties_reply
get_window_properties_reply
;
struct
attach_thread_input_reply
attach_thread_input_reply
;
struct
attach_thread_input_reply
attach_thread_input_reply
;
struct
get_thread_input_reply
get_thread_input_reply
;
struct
get_thread_input_reply
get_thread_input_reply
;
struct
get_key_state_reply
get_key_state_reply
;
struct
set_key_state_reply
set_key_state_reply
;
struct
set_foreground_window_reply
set_foreground_window_reply
;
struct
set_foreground_window_reply
set_foreground_window_reply
;
struct
set_focus_window_reply
set_focus_window_reply
;
struct
set_focus_window_reply
set_focus_window_reply
;
struct
set_active_window_reply
set_active_window_reply
;
struct
set_active_window_reply
set_active_window_reply
;
...
@@ -3477,6 +3509,6 @@ union generic_reply
...
@@ -3477,6 +3509,6 @@ union generic_reply
struct
get_next_hook_reply
get_next_hook_reply
;
struct
get_next_hook_reply
get_next_hook_reply
;
};
};
#define SERVER_PROTOCOL_VERSION 9
3
#define SERVER_PROTOCOL_VERSION 9
4
#endif
/* __WINE_WINE_SERVER_PROTOCOL_H */
#endif
/* __WINE_WINE_SERVER_PROTOCOL_H */
server/protocol.def
View file @
8ba666f3
...
@@ -1941,6 +1941,21 @@ enum message_type
...
@@ -1941,6 +1941,21 @@ enum message_type
rectangle_t rect; /* caret rectangle */
rectangle_t rect; /* caret rectangle */
@END
@END
/* Retrieve queue keyboard state for a given thread */
@REQ(get_key_state)
thread_id_t tid; /* id of thread */
int key; /* optional key code or -1 */
@REPLY
unsigned char state; /* state of specified key */
VARARG(keystate,bytes); /* state array for all the keys */
@END
/* Set queue keyboard state for a given thread */
@REQ(set_key_state)
thread_id_t tid; /* id of thread */
VARARG(keystate,bytes); /* state array for all the keys */
@END
/* Set the system foreground window */
/* Set the system foreground window */
@REQ(set_foreground_window)
@REQ(set_foreground_window)
user_handle_t handle; /* handle to the foreground window */
user_handle_t handle; /* handle to the foreground window */
...
...
server/queue.c
View file @
8ba666f3
...
@@ -868,6 +868,68 @@ static struct timer *set_timer( struct msg_queue *queue, unsigned int rate )
...
@@ -868,6 +868,68 @@ static struct timer *set_timer( struct msg_queue *queue, unsigned int rate )
return
timer
;
return
timer
;
}
}
/* change the input key state for a given key */
static
void
set_input_key_state
(
struct
thread_input
*
input
,
unsigned
char
key
,
int
down
)
{
if
(
down
)
{
if
(
!
(
input
->
keystate
[
key
]
&
0x80
))
input
->
keystate
[
key
]
^=
0x01
;
input
->
keystate
[
key
]
|=
0x80
;
}
else
input
->
keystate
[
key
]
&=
~
0x80
;
}
/* update the input key state for a keyboard message */
static
void
update_input_key_state
(
struct
thread_input
*
input
,
const
struct
message
*
msg
)
{
unsigned
char
key
;
int
down
=
0
,
extended
;
switch
(
msg
->
msg
)
{
case
WM_LBUTTONDOWN
:
down
=
1
;
/* fall through */
case
WM_LBUTTONUP
:
set_input_key_state
(
input
,
VK_LBUTTON
,
down
);
break
;
case
WM_MBUTTONDOWN
:
down
=
1
;
/* fall through */
case
WM_MBUTTONUP
:
set_input_key_state
(
input
,
VK_MBUTTON
,
down
);
break
;
case
WM_RBUTTONDOWN
:
down
=
1
;
/* fall through */
case
WM_RBUTTONUP
:
set_input_key_state
(
input
,
VK_RBUTTON
,
down
);
break
;
case
WM_KEYDOWN
:
case
WM_SYSKEYDOWN
:
down
=
1
;
/* fall through */
case
WM_KEYUP
:
case
WM_SYSKEYUP
:
key
=
(
unsigned
char
)
msg
->
wparam
;
extended
=
((
msg
->
lparam
>>
16
)
&
KF_EXTENDED
)
!=
0
;
set_input_key_state
(
input
,
key
,
down
);
switch
(
key
)
{
case
VK_SHIFT
:
set_input_key_state
(
input
,
extended
?
VK_RSHIFT
:
VK_LSHIFT
,
down
);
break
;
case
VK_CONTROL
:
set_input_key_state
(
input
,
extended
?
VK_RCONTROL
:
VK_LCONTROL
,
down
);
break
;
case
VK_MENU
:
set_input_key_state
(
input
,
extended
?
VK_RMENU
:
VK_LMENU
,
down
);
break
;
}
break
;
}
}
/* release the hardware message currently being processed by the given thread */
/* release the hardware message currently being processed by the given thread */
static
void
release_hardware_message
(
struct
thread
*
thread
,
int
remove
)
static
void
release_hardware_message
(
struct
thread
*
thread
,
int
remove
)
{
{
...
@@ -879,6 +941,7 @@ static void release_hardware_message( struct thread *thread, int remove )
...
@@ -879,6 +941,7 @@ static void release_hardware_message( struct thread *thread, int remove )
struct
message
*
other
;
struct
message
*
other
;
int
clr_bit
;
int
clr_bit
;
update_input_key_state
(
input
,
input
->
msg
);
unlink_message
(
&
input
->
msg_list
,
input
->
msg
);
unlink_message
(
&
input
->
msg_list
,
input
->
msg
);
clr_bit
=
get_hardware_msg_bit
(
input
->
msg
);
clr_bit
=
get_hardware_msg_bit
(
input
->
msg
);
for
(
other
=
input
->
msg_list
.
first
;
other
;
other
=
other
->
next
)
for
(
other
=
input
->
msg_list
.
first
;
other
;
other
=
other
->
next
)
...
@@ -892,13 +955,19 @@ static void release_hardware_message( struct thread *thread, int remove )
...
@@ -892,13 +955,19 @@ static void release_hardware_message( struct thread *thread, int remove )
}
}
/* find the window that should receive a given hardware message */
/* find the window that should receive a given hardware message */
static
user_handle_t
find_hardware_message_window
(
struct
thread_input
*
input
,
struct
message
*
msg
)
static
user_handle_t
find_hardware_message_window
(
struct
thread_input
*
input
,
struct
message
*
msg
,
unsigned
int
*
msg_code
)
{
{
user_handle_t
win
=
0
;
user_handle_t
win
=
0
;
*
msg_code
=
msg
->
msg
;
if
(
is_keyboard_msg
(
msg
))
if
(
is_keyboard_msg
(
msg
))
{
{
if
(
input
&&
!
(
win
=
input
->
focus
))
win
=
input
->
active
;
if
(
input
&&
!
(
win
=
input
->
focus
))
{
win
=
input
->
active
;
if
(
*
msg_code
<
WM_SYSKEYDOWN
)
*
msg_code
+=
WM_SYSKEYDOWN
-
WM_KEYDOWN
;
}
}
}
else
/* mouse message */
else
/* mouse message */
{
{
...
@@ -916,8 +985,9 @@ static void queue_hardware_message( struct msg_queue *queue, struct message *msg
...
@@ -916,8 +985,9 @@ static void queue_hardware_message( struct msg_queue *queue, struct message *msg
user_handle_t
win
;
user_handle_t
win
;
struct
thread
*
thread
;
struct
thread
*
thread
;
struct
thread_input
*
input
;
struct
thread_input
*
input
;
unsigned
int
msg_code
;
win
=
find_hardware_message_window
(
queue
?
queue
->
input
:
foreground_input
,
msg
);
win
=
find_hardware_message_window
(
queue
?
queue
->
input
:
foreground_input
,
msg
,
&
msg_code
);
if
(
!
win
||
!
(
thread
=
get_window_thread
(
win
)))
if
(
!
win
||
!
(
thread
=
get_window_thread
(
win
)))
{
{
free
(
msg
);
free
(
msg
);
...
@@ -943,6 +1013,7 @@ static int get_hardware_message( struct thread *thread, struct message *first,
...
@@ -943,6 +1013,7 @@ static int get_hardware_message( struct thread *thread, struct message *first,
struct
message
*
msg
;
struct
message
*
msg
;
user_handle_t
win
;
user_handle_t
win
;
int
clear_bits
,
got_one
=
0
;
int
clear_bits
,
got_one
=
0
;
unsigned
int
msg_code
;
if
(
input
->
msg_thread
&&
input
->
msg_thread
!=
thread
)
if
(
input
->
msg_thread
&&
input
->
msg_thread
!=
thread
)
return
0
;
/* locked by another thread */
return
0
;
/* locked by another thread */
...
@@ -960,11 +1031,12 @@ static int get_hardware_message( struct thread *thread, struct message *first,
...
@@ -960,11 +1031,12 @@ static int get_hardware_message( struct thread *thread, struct message *first,
while
(
msg
)
while
(
msg
)
{
{
win
=
find_hardware_message_window
(
input
,
msg
);
win
=
find_hardware_message_window
(
input
,
msg
,
&
msg_code
);
if
(
!
win
||
!
(
win_thread
=
get_window_thread
(
win
)))
if
(
!
win
||
!
(
win_thread
=
get_window_thread
(
win
)))
{
{
/* no window at all, remove it */
/* no window at all, remove it */
struct
message
*
next
=
msg
->
next
;
struct
message
*
next
=
msg
->
next
;
update_input_key_state
(
input
,
msg
);
unlink_message
(
&
input
->
msg_list
,
msg
);
unlink_message
(
&
input
->
msg_list
,
msg
);
free_message
(
msg
);
free_message
(
msg
);
msg
=
next
;
msg
=
next
;
...
@@ -998,7 +1070,7 @@ static int get_hardware_message( struct thread *thread, struct message *first,
...
@@ -998,7 +1070,7 @@ static int get_hardware_message( struct thread *thread, struct message *first,
reply
->
type
=
MSG_HARDWARE
;
reply
->
type
=
MSG_HARDWARE
;
reply
->
win
=
win
;
reply
->
win
=
win
;
reply
->
msg
=
msg
->
msg
;
reply
->
msg
=
msg
_code
;
reply
->
wparam
=
msg
->
wparam
;
reply
->
wparam
=
msg
->
wparam
;
reply
->
lparam
=
msg
->
lparam
;
reply
->
lparam
=
msg
->
lparam
;
reply
->
x
=
msg
->
x
;
reply
->
x
=
msg
->
x
;
...
@@ -1458,6 +1530,40 @@ DECL_HANDLER(get_thread_input)
...
@@ -1458,6 +1530,40 @@ DECL_HANDLER(get_thread_input)
}
}
/* retrieve queue keyboard state for a given thread */
DECL_HANDLER
(
get_key_state
)
{
struct
thread
*
thread
;
struct
thread_input
*
input
;
if
(
!
(
thread
=
get_thread_from_id
(
req
->
tid
)))
return
;
input
=
thread
->
queue
?
thread
->
queue
->
input
:
NULL
;
if
(
input
)
{
if
(
req
->
key
>=
0
)
reply
->
state
=
input
->
keystate
[
req
->
key
&
0xff
];
set_reply_data
(
input
->
keystate
,
min
(
get_reply_max_size
(),
sizeof
(
input
->
keystate
)
));
}
release_object
(
thread
);
}
/* set queue keyboard state for a given thread */
DECL_HANDLER
(
set_key_state
)
{
struct
thread
*
thread
=
NULL
;
struct
thread_input
*
input
;
if
(
!
(
thread
=
get_thread_from_id
(
req
->
tid
)))
return
;
input
=
thread
->
queue
?
thread
->
queue
->
input
:
NULL
;
if
(
input
)
{
size_t
size
=
min
(
sizeof
(
input
->
keystate
),
get_req_data_size
()
);
if
(
size
)
memcpy
(
input
->
keystate
,
get_req_data
(),
size
);
}
release_object
(
thread
);
}
/* set the system foreground window */
/* set the system foreground window */
DECL_HANDLER
(
set_foreground_window
)
DECL_HANDLER
(
set_foreground_window
)
{
{
...
...
server/request.h
View file @
8ba666f3
...
@@ -262,6 +262,8 @@ DECL_HANDLER(get_window_property);
...
@@ -262,6 +262,8 @@ DECL_HANDLER(get_window_property);
DECL_HANDLER
(
get_window_properties
);
DECL_HANDLER
(
get_window_properties
);
DECL_HANDLER
(
attach_thread_input
);
DECL_HANDLER
(
attach_thread_input
);
DECL_HANDLER
(
get_thread_input
);
DECL_HANDLER
(
get_thread_input
);
DECL_HANDLER
(
get_key_state
);
DECL_HANDLER
(
set_key_state
);
DECL_HANDLER
(
set_foreground_window
);
DECL_HANDLER
(
set_foreground_window
);
DECL_HANDLER
(
set_focus_window
);
DECL_HANDLER
(
set_focus_window
);
DECL_HANDLER
(
set_active_window
);
DECL_HANDLER
(
set_active_window
);
...
@@ -438,6 +440,8 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
...
@@ -438,6 +440,8 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
(
req_handler
)
req_get_window_properties
,
(
req_handler
)
req_get_window_properties
,
(
req_handler
)
req_attach_thread_input
,
(
req_handler
)
req_attach_thread_input
,
(
req_handler
)
req_get_thread_input
,
(
req_handler
)
req_get_thread_input
,
(
req_handler
)
req_get_key_state
,
(
req_handler
)
req_set_key_state
,
(
req_handler
)
req_set_foreground_window
,
(
req_handler
)
req_set_foreground_window
,
(
req_handler
)
req_set_focus_window
,
(
req_handler
)
req_set_focus_window
,
(
req_handler
)
req_set_active_window
,
(
req_handler
)
req_set_active_window
,
...
...
server/trace.c
View file @
8ba666f3
...
@@ -2211,6 +2211,26 @@ static void dump_get_thread_input_reply( const struct get_thread_input_reply *re
...
@@ -2211,6 +2211,26 @@ static void dump_get_thread_input_reply( const struct get_thread_input_reply *re
dump_rectangle
(
&
req
->
rect
);
dump_rectangle
(
&
req
->
rect
);
}
}
static
void
dump_get_key_state_request
(
const
struct
get_key_state_request
*
req
)
{
fprintf
(
stderr
,
" tid=%08x,"
,
req
->
tid
);
fprintf
(
stderr
,
" key=%d"
,
req
->
key
);
}
static
void
dump_get_key_state_reply
(
const
struct
get_key_state_reply
*
req
)
{
fprintf
(
stderr
,
" state=%02x,"
,
req
->
state
);
fprintf
(
stderr
,
" keystate="
);
dump_varargs_bytes
(
cur_size
);
}
static
void
dump_set_key_state_request
(
const
struct
set_key_state_request
*
req
)
{
fprintf
(
stderr
,
" tid=%08x,"
,
req
->
tid
);
fprintf
(
stderr
,
" keystate="
);
dump_varargs_bytes
(
cur_size
);
}
static
void
dump_set_foreground_window_request
(
const
struct
set_foreground_window_request
*
req
)
static
void
dump_set_foreground_window_request
(
const
struct
set_foreground_window_request
*
req
)
{
{
fprintf
(
stderr
,
" handle=%p"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%p"
,
req
->
handle
);
...
@@ -2509,6 +2529,8 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
...
@@ -2509,6 +2529,8 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(
dump_func
)
dump_get_window_properties_request
,
(
dump_func
)
dump_get_window_properties_request
,
(
dump_func
)
dump_attach_thread_input_request
,
(
dump_func
)
dump_attach_thread_input_request
,
(
dump_func
)
dump_get_thread_input_request
,
(
dump_func
)
dump_get_thread_input_request
,
(
dump_func
)
dump_get_key_state_request
,
(
dump_func
)
dump_set_key_state_request
,
(
dump_func
)
dump_set_foreground_window_request
,
(
dump_func
)
dump_set_foreground_window_request
,
(
dump_func
)
dump_set_focus_window_request
,
(
dump_func
)
dump_set_focus_window_request
,
(
dump_func
)
dump_set_active_window_request
,
(
dump_func
)
dump_set_active_window_request
,
...
@@ -2682,6 +2704,8 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
...
@@ -2682,6 +2704,8 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
(
dump_func
)
dump_get_window_properties_reply
,
(
dump_func
)
dump_get_window_properties_reply
,
(
dump_func
)
0
,
(
dump_func
)
0
,
(
dump_func
)
dump_get_thread_input_reply
,
(
dump_func
)
dump_get_thread_input_reply
,
(
dump_func
)
dump_get_key_state_reply
,
(
dump_func
)
0
,
(
dump_func
)
dump_set_foreground_window_reply
,
(
dump_func
)
dump_set_foreground_window_reply
,
(
dump_func
)
dump_set_focus_window_reply
,
(
dump_func
)
dump_set_focus_window_reply
,
(
dump_func
)
dump_set_active_window_reply
,
(
dump_func
)
dump_set_active_window_reply
,
...
@@ -2855,6 +2879,8 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
...
@@ -2855,6 +2879,8 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
"get_window_properties"
,
"get_window_properties"
,
"attach_thread_input"
,
"attach_thread_input"
,
"get_thread_input"
,
"get_thread_input"
,
"get_key_state"
,
"set_key_state"
,
"set_foreground_window"
,
"set_foreground_window"
,
"set_focus_window"
,
"set_focus_window"
,
"set_active_window"
,
"set_active_window"
,
...
...
windows/message.c
View file @
8ba666f3
...
@@ -51,8 +51,6 @@ WINE_DECLARE_DEBUG_CHANNEL(key);
...
@@ -51,8 +51,6 @@ WINE_DECLARE_DEBUG_CHANNEL(key);
#define WM_NCMOUSEFIRST WM_NCMOUSEMOVE
#define WM_NCMOUSEFIRST WM_NCMOUSEMOVE
#define WM_NCMOUSELAST WM_NCMBUTTONDBLCLK
#define WM_NCMOUSELAST WM_NCMBUTTONDBLCLK
static
BYTE
QueueKeyStateTable
[
256
];
/***********************************************************************
/***********************************************************************
* is_keyboard_message
* is_keyboard_message
...
@@ -131,80 +129,6 @@ static void queue_hardware_message( MSG *msg, ULONG_PTR extra_info )
...
@@ -131,80 +129,6 @@ static void queue_hardware_message( MSG *msg, ULONG_PTR extra_info )
/***********************************************************************
/***********************************************************************
* update_queue_key_state
*/
static
void
update_queue_key_state
(
UINT
msg
,
WPARAM
wp
,
LPARAM
lp
)
{
BOOL
down
=
FALSE
,
iskey
=
FALSE
;
WPARAM
dualkey
=
0
;
switch
(
msg
)
{
case
WM_LBUTTONDOWN
:
down
=
TRUE
;
/* fall through */
case
WM_LBUTTONUP
:
wp
=
VK_LBUTTON
;
break
;
case
WM_MBUTTONDOWN
:
down
=
TRUE
;
/* fall through */
case
WM_MBUTTONUP
:
wp
=
VK_MBUTTON
;
break
;
case
WM_RBUTTONDOWN
:
down
=
TRUE
;
/* fall through */
case
WM_RBUTTONUP
:
wp
=
VK_RBUTTON
;
break
;
case
WM_KEYDOWN
:
case
WM_SYSKEYDOWN
:
down
=
TRUE
;
/* fall through */
case
WM_KEYUP
:
case
WM_SYSKEYUP
:
wp
=
wp
&
0xff
;
iskey
=
TRUE
;
break
;
}
if
(
iskey
)
{
switch
(
wp
)
{
case
VK_SHIFT
:
dualkey
=
(
HIWORD
(
lp
)
&
KF_EXTENDED
)
?
VK_RSHIFT
:
VK_LSHIFT
;
break
;
case
VK_CONTROL
:
dualkey
=
(
HIWORD
(
lp
)
&
KF_EXTENDED
)
?
VK_RCONTROL
:
VK_LCONTROL
;
break
;
case
VK_MENU
:
dualkey
=
(
HIWORD
(
lp
)
&
KF_EXTENDED
)
?
VK_RMENU
:
VK_LMENU
;
break
;
}
}
if
(
down
)
{
BYTE
*
p
=
&
QueueKeyStateTable
[
wp
];
if
(
!
(
*
p
&
0x80
))
*
p
^=
0x01
;
*
p
|=
0x80
;
}
else
QueueKeyStateTable
[
wp
]
&=
~
0x80
;
if
(
dualkey
)
{
/* also update the "dual" keys properly */
if
(
down
)
{
BYTE
*
p
=
&
QueueKeyStateTable
[
dualkey
];
if
(
!
(
*
p
&
0x80
))
*
p
^=
0x01
;
*
p
|=
0x80
;
}
else
QueueKeyStateTable
[
dualkey
]
&=
~
0x80
;
}
}
/***********************************************************************
* MSG_SendParentNotify
* MSG_SendParentNotify
*
*
* Send a WM_PARENTNOTIFY to all ancestors of the given window, unless
* Send a WM_PARENTNOTIFY to all ancestors of the given window, unless
...
@@ -330,18 +254,10 @@ void MSG_JournalPlayBackMsg(void)
...
@@ -330,18 +254,10 @@ void MSG_JournalPlayBackMsg(void)
*
*
* returns TRUE if the contents of 'msg' should be passed to the application
* returns TRUE if the contents of 'msg' should be passed to the application
*/
*/
static
BOOL
process_raw_keyboard_message
(
MSG
*
msg
,
ULONG_PTR
extra_info
)
static
void
process_raw_keyboard_message
(
MSG
*
msg
)
{
{
EVENTMSG
event
;
EVENTMSG
event
;
if
(
!
(
msg
->
hwnd
=
GetFocus
()))
{
/* Send the message to the active window instead, */
/* translating messages to their WM_SYS equivalent */
msg
->
hwnd
=
GetActiveWindow
();
if
(
msg
->
message
<
WM_SYSKEYDOWN
)
msg
->
message
+=
WM_SYSKEYDOWN
-
WM_KEYDOWN
;
}
event
.
message
=
msg
->
message
;
event
.
message
=
msg
->
message
;
event
.
hwnd
=
msg
->
hwnd
;
event
.
hwnd
=
msg
->
hwnd
;
event
.
time
=
msg
->
time
;
event
.
time
=
msg
->
time
;
...
@@ -349,11 +265,6 @@ static BOOL process_raw_keyboard_message( MSG *msg, ULONG_PTR extra_info )
...
@@ -349,11 +265,6 @@ static BOOL process_raw_keyboard_message( MSG *msg, ULONG_PTR extra_info )
event
.
paramH
=
msg
->
lParam
&
0x7FFF
;
event
.
paramH
=
msg
->
lParam
&
0x7FFF
;
if
(
HIWORD
(
msg
->
lParam
)
&
0x0100
)
event
.
paramH
|=
0x8000
;
/* special_key - bit */
if
(
HIWORD
(
msg
->
lParam
)
&
0x0100
)
event
.
paramH
|=
0x8000
;
/* special_key - bit */
HOOK_CallHooks
(
WH_JOURNALRECORD
,
HC_ACTION
,
0
,
(
LPARAM
)
&
event
,
TRUE
);
HOOK_CallHooks
(
WH_JOURNALRECORD
,
HC_ACTION
,
0
,
(
LPARAM
)
&
event
,
TRUE
);
/* if we are going to throw away the message, update the queue state now */
if
(
!
msg
->
hwnd
)
update_queue_key_state
(
msg
->
message
,
msg
->
wParam
,
msg
->
lParam
);
return
(
msg
->
hwnd
!=
0
);
}
}
...
@@ -366,8 +277,6 @@ static BOOL process_cooked_keyboard_message( MSG *msg, BOOL remove )
...
@@ -366,8 +277,6 @@ static BOOL process_cooked_keyboard_message( MSG *msg, BOOL remove )
{
{
if
(
remove
)
if
(
remove
)
{
{
update_queue_key_state
(
msg
->
message
,
msg
->
wParam
,
msg
->
lParam
);
/* Handle F1 key by sending out WM_HELP message */
/* Handle F1 key by sending out WM_HELP message */
if
((
msg
->
message
==
WM_KEYUP
)
&&
if
((
msg
->
message
==
WM_KEYUP
)
&&
(
msg
->
wParam
==
VK_F1
)
&&
(
msg
->
wParam
==
VK_F1
)
&&
...
@@ -398,10 +307,8 @@ static BOOL process_cooked_keyboard_message( MSG *msg, BOOL remove )
...
@@ -398,10 +307,8 @@ static BOOL process_cooked_keyboard_message( MSG *msg, BOOL remove )
/***********************************************************************
/***********************************************************************
* process_raw_mouse_message
* process_raw_mouse_message
*
* returns TRUE if the contents of 'msg' should be passed to the application
*/
*/
static
BOOL
process_raw_mouse_message
(
MSG
*
msg
,
ULONG_PTR
extra_info
,
BOOL
remove
)
static
void
process_raw_mouse_message
(
MSG
*
msg
,
BOOL
remove
)
{
{
static
MSG
clk_msg
;
static
MSG
clk_msg
;
...
@@ -478,7 +385,6 @@ static BOOL process_raw_mouse_message( MSG *msg, ULONG_PTR extra_info, BOOL remo
...
@@ -478,7 +385,6 @@ static BOOL process_raw_mouse_message( MSG *msg, ULONG_PTR extra_info, BOOL remo
if
(
!
(
info
.
flags
&
GUI_INMENUMODE
))
ScreenToClient
(
msg
->
hwnd
,
&
pt
);
if
(
!
(
info
.
flags
&
GUI_INMENUMODE
))
ScreenToClient
(
msg
->
hwnd
,
&
pt
);
}
}
msg
->
lParam
=
MAKELONG
(
pt
.
x
,
pt
.
y
);
msg
->
lParam
=
MAKELONG
(
pt
.
x
,
pt
.
y
);
return
TRUE
;
}
}
...
@@ -506,8 +412,6 @@ static BOOL process_cooked_mouse_message( MSG *msg, ULONG_PTR extra_info, BOOL r
...
@@ -506,8 +412,6 @@ static BOOL process_cooked_mouse_message( MSG *msg, ULONG_PTR extra_info, BOOL r
raw_message
+=
WM_LBUTTONDOWN
-
WM_LBUTTONDBLCLK
;
raw_message
+=
WM_LBUTTONDOWN
-
WM_LBUTTONDBLCLK
;
}
}
if
(
remove
)
update_queue_key_state
(
raw_message
,
0
,
0
);
hook
.
pt
=
msg
->
pt
;
hook
.
pt
=
msg
->
pt
;
hook
.
hwnd
=
msg
->
hwnd
;
hook
.
hwnd
=
msg
->
hwnd
;
hook
.
wHitTestCode
=
hittest
;
hook
.
wHitTestCode
=
hittest
;
...
@@ -602,11 +506,11 @@ BOOL MSG_process_raw_hardware_message( MSG *msg, ULONG_PTR extra_info, HWND hwnd
...
@@ -602,11 +506,11 @@ BOOL MSG_process_raw_hardware_message( MSG *msg, ULONG_PTR extra_info, HWND hwnd
{
{
if
(
is_keyboard_message
(
msg
->
message
))
if
(
is_keyboard_message
(
msg
->
message
))
{
{
if
(
!
process_raw_keyboard_message
(
msg
,
extra_info
))
return
FALSE
;
process_raw_keyboard_message
(
msg
)
;
}
}
else
if
(
is_mouse_message
(
msg
->
message
))
else
if
(
is_mouse_message
(
msg
->
message
))
{
{
if
(
!
process_raw_mouse_message
(
msg
,
extra_info
,
remove
))
return
FALSE
;
process_raw_mouse_message
(
msg
,
remove
)
;
}
}
else
else
{
{
...
@@ -635,63 +539,6 @@ BOOL MSG_process_cooked_hardware_message( MSG *msg, ULONG_PTR extra_info, BOOL r
...
@@ -635,63 +539,6 @@ BOOL MSG_process_cooked_hardware_message( MSG *msg, ULONG_PTR extra_info, BOOL r
}
}
/**********************************************************************
* GetKeyState (USER.106)
*/
INT16
WINAPI
GetKeyState16
(
INT16
vkey
)
{
return
GetKeyState
(
vkey
);
}
/**********************************************************************
* GetKeyState (USER32.@)
*
* An application calls the GetKeyState function in response to a
* keyboard-input message. This function retrieves the state of the key
* at the time the input message was generated. (SDK 3.1 Vol 2. p 390)
*/
SHORT
WINAPI
GetKeyState
(
INT
vkey
)
{
INT
retval
;
if
(
vkey
>=
'a'
&&
vkey
<=
'z'
)
vkey
+=
'A'
-
'a'
;
retval
=
((
WORD
)(
QueueKeyStateTable
[
vkey
]
&
0x80
)
<<
8
)
|
(
QueueKeyStateTable
[
vkey
]
&
0x80
)
|
(
QueueKeyStateTable
[
vkey
]
&
0x01
);
TRACE
(
"key (0x%x) -> %x
\n
"
,
vkey
,
retval
);
return
retval
;
}
/**********************************************************************
* GetKeyboardState (USER.222)
* GetKeyboardState (USER32.@)
*
* An application calls the GetKeyboardState function in response to a
* keyboard input message. This function retrieves the state of the keyboard
* at the time the input message was generated. (SDK 3.1 Vol 2. p 387)
*/
BOOL
WINAPI
GetKeyboardState
(
LPBYTE
lpKeyState
)
{
TRACE_
(
key
)(
"(%p)
\n
"
,
lpKeyState
);
if
(
lpKeyState
)
memcpy
(
lpKeyState
,
QueueKeyStateTable
,
256
);
return
TRUE
;
}
/**********************************************************************
* SetKeyboardState (USER.223)
* SetKeyboardState (USER32.@)
*/
BOOL
WINAPI
SetKeyboardState
(
LPBYTE
lpKeyState
)
{
TRACE_
(
key
)(
"(%p)
\n
"
,
lpKeyState
);
if
(
lpKeyState
)
memcpy
(
QueueKeyStateTable
,
lpKeyState
,
256
);
return
TRUE
;
}
/***********************************************************************
/***********************************************************************
* WaitMessage (USER.112) Suspend thread pending messages
* WaitMessage (USER.112) Suspend thread pending messages
* WaitMessage (USER32.@) Suspend thread pending messages
* WaitMessage (USER32.@) Suspend thread pending messages
...
@@ -974,6 +821,7 @@ BOOL WINAPI TranslateMessage( const MSG *msg )
...
@@ -974,6 +821,7 @@ BOOL WINAPI TranslateMessage( const MSG *msg )
UINT
message
;
UINT
message
;
WCHAR
wp
[
2
];
WCHAR
wp
[
2
];
BOOL
rc
=
FALSE
;
BOOL
rc
=
FALSE
;
BYTE
state
[
256
];
if
(
msg
->
message
>=
WM_KEYFIRST
&&
msg
->
message
<=
WM_KEYLAST
)
if
(
msg
->
message
>=
WM_KEYFIRST
&&
msg
->
message
<=
WM_KEYLAST
)
{
{
...
@@ -989,8 +837,9 @@ BOOL WINAPI TranslateMessage( const MSG *msg )
...
@@ -989,8 +837,9 @@ BOOL WINAPI TranslateMessage( const MSG *msg )
TRACE_
(
key
)(
"Translating key %s (%04x), scancode %02x
\n
"
,
TRACE_
(
key
)(
"Translating key %s (%04x), scancode %02x
\n
"
,
SPY_GetVKeyName
(
msg
->
wParam
),
msg
->
wParam
,
LOBYTE
(
HIWORD
(
msg
->
lParam
)));
SPY_GetVKeyName
(
msg
->
wParam
),
msg
->
wParam
,
LOBYTE
(
HIWORD
(
msg
->
lParam
)));
GetKeyboardState
(
state
);
/* FIXME : should handle ToUnicode yielding 2 */
/* FIXME : should handle ToUnicode yielding 2 */
switch
(
ToUnicode
(
msg
->
wParam
,
HIWORD
(
msg
->
lParam
),
QueueKeyStateTabl
e
,
wp
,
2
,
0
))
switch
(
ToUnicode
(
msg
->
wParam
,
HIWORD
(
msg
->
lParam
),
stat
e
,
wp
,
2
,
0
))
{
{
case
1
:
case
1
:
message
=
(
msg
->
message
==
WM_KEYDOWN
)
?
WM_CHAR
:
WM_SYSCHAR
;
message
=
(
msg
->
message
==
WM_KEYDOWN
)
?
WM_CHAR
:
WM_SYSCHAR
;
...
...
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