[Win32k]
[reactos.git] / reactos / win32ss / user / ntuser / msgqueue.h
1 #pragma once
2
3 #define MSQ_HUNG 5000
4 #define MSQ_NORMAL 0
5 #define MSQ_ISHOOK 1
6 #define MSQ_ISEVENT 2
7 #define MSQ_INJECTMODULE 3
8
9 typedef struct _USER_MESSAGE
10 {
11 LIST_ENTRY ListEntry;
12 MSG Msg;
13 DWORD QS_Flags;
14 LONG_PTR ExtraInfo;
15 DWORD dwQEvent;
16 PTHREADINFO pti;
17 } USER_MESSAGE, *PUSER_MESSAGE;
18
19 struct _USER_MESSAGE_QUEUE;
20
21 typedef struct _USER_SENT_MESSAGE
22 {
23 LIST_ENTRY ListEntry;
24 MSG Msg;
25 DWORD QS_Flags; // Original QS bits used to create this message.
26 PKEVENT CompletionEvent;
27 LRESULT* Result;
28 LRESULT lResult;
29 PTHREADINFO ptiSender;
30 PTHREADINFO ptiReceiver;
31 SENDASYNCPROC CompletionCallback;
32 PTHREADINFO ptiCallBackSender;
33 ULONG_PTR CompletionCallbackContext;
34 /* entry in the dispatching list of the sender's message queue */
35 LIST_ENTRY DispatchingListEntry;
36 INT HookMessage;
37 BOOL HasPackedLParam;
38 } USER_SENT_MESSAGE, *PUSER_SENT_MESSAGE;
39
40 typedef struct _USER_MESSAGE_QUEUE
41 {
42 /* Reference counter, only access this variable with interlocked functions! */
43 LONG References;
44
45 /* Desktop that the message queue is attached to */
46 struct _DESKTOP *Desktop;
47
48 PTHREADINFO ptiSysLock;
49 ULONG_PTR idSysLock;
50 ULONG_PTR idSysPeek;
51 PTHREADINFO ptiMouse;
52 PTHREADINFO ptiKeyboard;
53
54 /* Queue for hardware messages for the queue. */
55 LIST_ENTRY HardwareMessagesListHead;
56 /* Last click message for translating double clicks */
57 MSG msgDblClk;
58 /* Current capture window for this queue. */
59 PWND spwndCapture;
60 /* Current window with focus (ie. receives keyboard input) for this queue. */
61 PWND spwndFocus;
62 /* Current active window for this queue. */
63 PWND spwndActive;
64 PWND spwndActivePrev;
65 /* Current move/size window for this queue */
66 HWND MoveSize;
67 /* Current menu owner window for this queue */
68 HWND MenuOwner;
69 /* Identifes the menu state */
70 BYTE MenuState;
71 /* Caret information for this queue */
72 PTHRDCARETINFO CaretInfo;
73 /* Message Queue Flags */
74 DWORD QF_flags;
75 DWORD cThreads; // Shared message queue counter.
76
77 /* Extra message information */
78 LPARAM ExtraInfo;
79
80 /* State of each key */
81 BYTE afKeyRecentDown[256 / 8]; // 1 bit per key
82 BYTE afKeyState[256 * 2 / 8]; // 2 bits per key
83
84 /* Showing cursor counter (value>=0 - cursor visible, value<0 - cursor hidden) */
85 INT iCursorLevel;
86 /* Cursor object */
87 PCURICON_OBJECT CursorObject;
88
89 } USER_MESSAGE_QUEUE, *PUSER_MESSAGE_QUEUE;
90
91 #define QF_UPDATEKEYSTATE 0x00000001
92 #define QF_FMENUSTATUSBREAK 0x00000004
93 #define QF_FMENUSTATUS 0x00000008
94 #define QF_FF10STATUS 0x00000010
95 #define QF_MOUSEMOVED 0x00000020
96 #define QF_ACTIVATIONCHANGE 0x00000040
97 #define QF_TABSWITCHING 0x00000080
98 #define QF_KEYSTATERESET 0x00000100
99 #define QF_INDESTROY 0x00000200
100 #define QF_LOCKNOREMOVE 0x00000400
101 #define QF_FOCUSNULLSINCEACTIVE 0x00000800
102 #define QF_DIALOGACTIVE 0x00004000
103 #define QF_EVENTDEACTIVATEREMOVED 0x00008000
104 #define QF_TRACKMOUSELEAVE 0x00020000
105 #define QF_TRACKMOUSEHOVER 0x00040000
106 #define QF_TRACKMOUSEFIRING 0x00080000
107 #define QF_CAPTURELOCKED 0x00100000
108 #define QF_ACTIVEWNDTRACKING 0x00200000
109
110 /* Internal messages codes */
111 enum internal_event_message
112 {
113 WM_ASYNC_SHOWWINDOW = 0x80000000,
114 WM_ASYNC_SETWINDOWPOS,
115 WM_ASYNC_SETACTIVEWINDOW
116 };
117
118 BOOL FASTCALL MsqIsHung(PTHREADINFO pti);
119 VOID CALLBACK HungAppSysTimerProc(HWND,UINT,UINT_PTR,DWORD);
120 NTSTATUS FASTCALL co_MsqSendMessage(PTHREADINFO ptirec,
121 HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam,
122 UINT uTimeout, BOOL Block, INT HookMessage, ULONG_PTR *uResult);
123 PUSER_MESSAGE FASTCALL MsqCreateMessage(LPMSG Msg);
124 VOID FASTCALL MsqDestroyMessage(PUSER_MESSAGE Message);
125 VOID FASTCALL MsqPostMessage(PTHREADINFO, MSG*, BOOLEAN, DWORD, DWORD, LONG_PTR);
126 VOID FASTCALL MsqPostQuitMessage(PTHREADINFO pti, ULONG ExitCode);
127 BOOLEAN APIENTRY
128 MsqPeekMessage(IN PTHREADINFO pti,
129 IN BOOLEAN Remove,
130 IN PWND Window,
131 IN UINT MsgFilterLow,
132 IN UINT MsgFilterHigh,
133 IN UINT QSflags,
134 OUT LONG_PTR *ExtraInfo,
135 OUT PMSG Message);
136 BOOL APIENTRY
137 co_MsqPeekHardwareMessage(IN PTHREADINFO pti,
138 IN BOOL Remove,
139 IN PWND Window,
140 IN UINT MsgFilterLow,
141 IN UINT MsgFilterHigh,
142 IN UINT QSflags,
143 OUT MSG* pMsg);
144 BOOLEAN FASTCALL MsqInitializeMessageQueue(PTHREADINFO, PUSER_MESSAGE_QUEUE);
145 PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO);
146 VOID FASTCALL MsqCleanupThreadMsgs(PTHREADINFO);
147 VOID FASTCALL MsqDestroyMessageQueue(PTHREADINFO);
148 INIT_FUNCTION NTSTATUS NTAPI MsqInitializeImpl(VOID);
149 BOOLEAN FASTCALL co_MsqDispatchOneSentMessage(PTHREADINFO pti);
150 NTSTATUS FASTCALL
151 co_MsqWaitForNewMessages(PTHREADINFO pti, PWND WndFilter,
152 UINT MsgFilterMin, UINT MsgFilterMax);
153 VOID FASTCALL MsqIncPaintCountQueue(PTHREADINFO);
154 VOID FASTCALL MsqDecPaintCountQueue(PTHREADINFO);
155 LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
156 LRESULT FASTCALL co_IntPostOrSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
157 LRESULT FASTCALL
158 co_IntSendMessageTimeout(HWND hWnd,
159 UINT Msg,
160 WPARAM wParam,
161 LPARAM lParam,
162 UINT uFlags,
163 UINT uTimeout,
164 ULONG_PTR *uResult);
165
166 BOOL FASTCALL UserSendNotifyMessage( HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam );
167 LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd,
168 UINT Msg,
169 WPARAM wParam,
170 LPARAM lParam);
171 LRESULT FASTCALL
172 co_IntSendMessageWithCallBack(HWND hWnd,
173 UINT Msg,
174 WPARAM wParam,
175 LPARAM lParam,
176 SENDASYNCPROC CompletionCallback,
177 ULONG_PTR CompletionCallbackContext,
178 ULONG_PTR *uResult);
179 BOOL FASTCALL
180 co_MsqSendMessageAsync(PTHREADINFO ptiReceiver,
181 HWND hwnd,
182 UINT Msg,
183 WPARAM wParam,
184 LPARAM lParam,
185 SENDASYNCPROC CompletionCallback,
186 ULONG_PTR CompletionCallbackContext,
187 BOOL HasPackedLParam,
188 INT HookMessage);
189
190 VOID FASTCALL IntCoalesceMouseMove(PTHREADINFO);
191 LRESULT FASTCALL IntDispatchMessage(MSG* Msg);
192 BOOL FASTCALL IntTranslateKbdMessage(LPMSG lpMsg, UINT flags);
193 VOID FASTCALL co_MsqInsertMouseMessage(MSG* Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook);
194 BOOL FASTCALL MsqIsClkLck(LPMSG Msg, BOOL Remove);
195 BOOL FASTCALL MsqIsDblClk(LPMSG Msg, BOOL Remove);
196 HWND FASTCALL MsqSetStateWindow(PTHREADINFO pti, ULONG Type, HWND hWnd);
197 BOOL APIENTRY IntInitMessagePumpHook(VOID);
198 BOOL APIENTRY IntUninitMessagePumpHook(VOID);
199
200 LPARAM FASTCALL MsqSetMessageExtraInfo(LPARAM lParam);
201 LPARAM FASTCALL MsqGetMessageExtraInfo(VOID);
202 VOID APIENTRY MsqRemoveWindowMessagesFromQueue(PWND pWindow);
203
204 #define IntReferenceMessageQueue(MsgQueue) \
205 InterlockedIncrement(&(MsgQueue)->References)
206
207 #define IntDereferenceMessageQueue(MsgQueue) \
208 do { \
209 if(InterlockedDecrement(&(MsgQueue)->References) == 0) \
210 { \
211 TRACE("Free message queue 0x%p\n", (MsgQueue)); \
212 ExFreePoolWithTag((MsgQueue), USERTAG_Q); \
213 } \
214 } while(0)
215
216 #define IS_BTN_MESSAGE(message,code) \
217 ((message) == WM_LBUTTON##code || \
218 (message) == WM_MBUTTON##code || \
219 (message) == WM_RBUTTON##code || \
220 (message) == WM_XBUTTON##code || \
221 (message) == WM_NCLBUTTON##code || \
222 (message) == WM_NCMBUTTON##code || \
223 (message) == WM_NCRBUTTON##code || \
224 (message) == WM_NCXBUTTON##code )
225
226 #define WM_NCMOUSEFIRST WM_NCMOUSEMOVE
227 #define WM_NCMOUSELAST (WM_NCMOUSEFIRST+(WM_MOUSELAST-WM_MOUSEFIRST))
228
229 #define IS_MOUSE_MESSAGE(message) \
230 ((message >= WM_NCMOUSEFIRST && message <= WM_NCMOUSELAST) || \
231 (message >= WM_MOUSEFIRST && message <= WM_MOUSELAST))
232
233 #define IS_KBD_MESSAGE(message) \
234 (message >= WM_KEYFIRST && message <= WM_KEYLAST)
235
236 HANDLE FASTCALL IntMsqSetWakeMask(DWORD WakeMask);
237 BOOL FASTCALL IntMsqClearWakeMask(VOID);
238
239 static __inline LONG
240 MsqCalculateMessageTime(IN PLARGE_INTEGER TickCount)
241 {
242 return (LONG)(TickCount->QuadPart * (KeQueryTimeIncrement() / 10000));
243 }
244
245 VOID FASTCALL IdlePing(VOID);
246 VOID FASTCALL IdlePong(VOID);
247 BOOL FASTCALL co_MsqReplyMessage(LRESULT);
248 VOID FASTCALL MsqWakeQueue(PTHREADINFO,DWORD,BOOL);
249 VOID FASTCALL ClearMsgBitsMask(PTHREADINFO,UINT);
250 BOOL FASTCALL IntCallMsgFilter(LPMSG,INT);
251 WPARAM FASTCALL MsqGetDownKeyState(PUSER_MESSAGE_QUEUE);
252
253 int UserShowCursor(BOOL bShow);
254 PCURICON_OBJECT
255 FASTCALL
256 UserSetCursor(PCURICON_OBJECT NewCursor,
257 BOOL ForceChange);
258
259 DWORD APIENTRY IntGetQueueStatus(DWORD);
260
261 UINT lParamMemorySize(UINT Msg, WPARAM wParam, LPARAM lParam);
262
263 BOOL APIENTRY
264 co_IntGetPeekMessage( PMSG pMsg,
265 HWND hWnd,
266 UINT MsgFilterMin,
267 UINT MsgFilterMax,
268 UINT RemoveMsg,
269 BOOL bGMSG );
270 BOOL FASTCALL
271 UserPostThreadMessage( PTHREADINFO pti,
272 UINT Msg,
273 WPARAM wParam,
274 LPARAM lParam );
275
276 /* EOF */