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