Vincent Povirk : server: Implement QS_HOTKEY.
Alexandre Julliard
julliard at winehq.org
Wed Jul 6 13:31:10 CDT 2011
Module: wine
Branch: master
Commit: 79556aeab740f28b651aac6c439ec713e6f26236
URL: http://source.winehq.org/git/wine.git/?a=commit;h=79556aeab740f28b651aac6c439ec713e6f26236
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Thu May 26 15:52:17 2011 -0500
server: Implement QS_HOTKEY.
---
server/queue.c | 22 +++++++++++++++++++++-
1 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/server/queue.c b/server/queue.c
index 5dd4bf3..03b0e92 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -120,6 +120,7 @@ struct msg_queue
unsigned int changed_bits; /* changed wakeup bits */
unsigned int changed_mask; /* changed wakeup mask */
int paint_count; /* pending paint messages count */
+ int hotkey_count; /* pending hotkey messages count */
int quit_message; /* is there a pending quit message? */
int exit_code; /* exit code of pending quit message */
int cursor_count; /* per-queue cursor show count */
@@ -279,6 +280,7 @@ static struct msg_queue *create_msg_queue( struct thread *thread, struct thread_
queue->changed_bits = 0;
queue->changed_mask = 0;
queue->paint_count = 0;
+ queue->hotkey_count = 0;
queue->quit_message = 0;
queue->cursor_count = 0;
queue->recv_result = NULL;
@@ -600,6 +602,8 @@ static void remove_queue_message( struct msg_queue *queue, struct message *msg,
case POST_MESSAGE:
if (list_empty( &queue->msg_list[kind] ) && !queue->quit_message)
clear_queue_bits( queue, QS_POSTMESSAGE|QS_ALLPOSTMESSAGE );
+ if (msg->msg == WM_HOTKEY && --queue->hotkey_count == 0)
+ clear_queue_bits( queue, QS_HOTKEY );
break;
}
free_message( msg );
@@ -1358,7 +1362,8 @@ found:
msg->data_size = 0;
list_add_tail( &hotkey->queue->msg_list[POST_MESSAGE], &msg->entry );
- set_queue_bits( hotkey->queue, QS_POSTMESSAGE|QS_ALLPOSTMESSAGE );
+ set_queue_bits( hotkey->queue, QS_POSTMESSAGE|QS_ALLPOSTMESSAGE|QS_HOTKEY );
+ hotkey->queue->hotkey_count++;
return 1;
}
@@ -1942,6 +1947,11 @@ void post_message( user_handle_t win, unsigned int message, lparam_t wparam, lpa
list_add_tail( &thread->queue->msg_list[POST_MESSAGE], &msg->entry );
set_queue_bits( thread->queue, QS_POSTMESSAGE|QS_ALLPOSTMESSAGE );
+ if (message == WM_HOTKEY)
+ {
+ set_queue_bits( thread->queue, QS_HOTKEY );
+ thread->queue->hotkey_count++;
+ }
}
release_object( thread );
}
@@ -2150,6 +2160,11 @@ DECL_HANDLER(send_message)
case MSG_POSTED:
list_add_tail( &recv_queue->msg_list[POST_MESSAGE], &msg->entry );
set_queue_bits( recv_queue, QS_POSTMESSAGE|QS_ALLPOSTMESSAGE );
+ if (msg->msg == WM_HOTKEY)
+ {
+ set_queue_bits( recv_queue, QS_HOTKEY );
+ recv_queue->hotkey_count++;
+ }
break;
case MSG_HARDWARE: /* should use send_hardware_message instead */
case MSG_CALLBACK_RESULT: /* cannot send this one */
@@ -2245,6 +2260,11 @@ DECL_HANDLER(get_message)
get_posted_message( queue, get_win, req->get_first, req->get_last, req->flags, reply ))
return;
+ if ((filter & QS_HOTKEY) && queue->hotkey_count &&
+ req->get_first <= WM_HOTKEY && req->get_last >= WM_HOTKEY &&
+ get_posted_message( queue, get_win, WM_HOTKEY, WM_HOTKEY, req->flags, reply ))
+ return;
+
/* only check for quit messages if not posted messages pending.
* note: the quit message isn't filtered */
if (get_quit_message( queue, req->flags, reply ))
More information about the wine-cvs
mailing list