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