forked from Mirrors/wine-wine
parent
3783e49d3a
commit
8ba666f3a7
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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) GetKeyboardState16
|
||||||
223 pascal16 SetKeyboardState(ptr) SetKeyboardState
|
223 pascal16 SetKeyboardState(ptr) SetKeyboardState16
|
||||||
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
|
||||||
|
|
|
@ -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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
struct get_next_hook_reply get_next_hook_reply;
|
struct get_next_hook_reply get_next_hook_reply;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SERVER_PROTOCOL_VERSION 93
|
#define SERVER_PROTOCOL_VERSION 94
|
||||||
|
|
||||||
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
116
server/queue.c
116
server/queue.c
|
@ -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 )
|
||||||
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 )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* 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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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] =
|
||||||
(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,
|
||||||
|
|
|
@ -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] = {
|
||||||
(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] = {
|
||||||
(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] = {
|
||||||
"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",
|
||||||
|
|
|
@ -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
|
||||||
|
@ -130,80 +128,6 @@ static void queue_hardware_message( MSG *msg, ULONG_PTR extra_info )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* 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
|
||||||
*
|
*
|
||||||
|
@ -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 )
|
||||||
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 )
|
||||||
{
|
{
|
||||||
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 )
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* 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
|
||||||
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
|
||||||
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
|
||||||
{
|
{
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* 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 )
|
||||||
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 )
|
||||||
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), QueueKeyStateTable, wp, 2, 0))
|
switch (ToUnicode(msg->wParam, HIWORD(msg->lParam), state, 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;
|
||||||
|
|
Loading…
Reference in New Issue