Release 970824
[wine/multimedia.git] / windows / queue.c
bloba0f50c4293785ea3c0bcfd53720ddefdc735b30f
1 /*
2 * Message queues related functions
4 * Copyright 1993, 1994 Alexandre Julliard
5 */
7 #include <stdlib.h>
8 #include <signal.h>
9 #include "miscemu.h"
10 #include "module.h"
11 #include "queue.h"
12 #include "task.h"
13 #include "win.h"
14 #include "hook.h"
15 #include "thread.h"
16 #include "process.h"
17 #include "stddebug.h"
18 #include "debug.h"
20 #define MAX_QUEUE_SIZE 120 /* Max. size of a message queue */
22 static HQUEUE16 hFirstQueue = 0;
23 static HQUEUE16 hExitingQueue = 0;
24 static HQUEUE16 hmemSysMsgQueue = 0;
25 static MESSAGEQUEUE *sysMsgQueue = NULL;
27 static MESSAGEQUEUE *pMouseQueue = NULL; /* Queue for last mouse message */
28 static MESSAGEQUEUE *pKbdQueue = NULL; /* Queue for last kbd message */
30 MESSAGEQUEUE *pCursorQueue = NULL;
31 MESSAGEQUEUE *pActiveQueue = NULL;
33 /***********************************************************************
34 * QUEUE_DumpQueue
36 void QUEUE_DumpQueue( HQUEUE16 hQueue )
38 MESSAGEQUEUE *pq;
40 if (!(pq = (MESSAGEQUEUE*) GlobalLock16( hQueue )) ||
41 GlobalSize16(hQueue) < sizeof(MESSAGEQUEUE)+pq->queueSize*sizeof(QMSG))
43 fprintf( stderr, "%04x is not a queue handle\n", hQueue );
44 return;
47 fprintf( stderr,
48 "next: %12.4x Intertask SendMessage:\n"
49 "hTask: %11.4x ----------------------\n"
50 "msgSize: %9.4x hWnd: %10.4x\n"
51 "msgCount: %8.4x msg: %11.4x\n"
52 "msgNext: %9.4x wParam: %8.4x\n"
53 "msgFree: %9.4x lParam: %8.8x\n"
54 "qSize: %11.4x lRet: %10.8x\n"
55 "wWinVer: %9.4x ISMH: %10.4x\n"
56 "paints: %10.4x hSendTask: %5.4x\n"
57 "timers: %10.4x hPrevSend: %5.4x\n"
58 "wakeBits: %8.4x\n"
59 "wakeMask: %8.4x\n"
60 "hCurHook: %8.4x\n",
61 pq->next, pq->hTask, pq->msgSize, pq->hWnd,
62 pq->msgCount, pq->msg, pq->nextMessage, pq->wParam,
63 pq->nextFreeMessage, (unsigned)pq->lParam, pq->queueSize,
64 (unsigned)pq->SendMessageReturn, pq->wWinVersion, pq->InSendMessageHandle,
65 pq->wPaintCount, pq->hSendingTask, pq->wTimerCount,
66 pq->hPrevSendingTask, pq->wakeBits, pq->wakeMask, pq->hCurHook);
70 /***********************************************************************
71 * QUEUE_WalkQueues
73 void QUEUE_WalkQueues(void)
75 HQUEUE16 hQueue = hFirstQueue;
77 fprintf( stderr, "Queue Size Msgs Task\n" );
78 while (hQueue)
80 MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( hQueue );
81 if (!queue)
83 fprintf( stderr, "*** Bad queue handle %04x\n", hQueue );
84 return;
86 fprintf( stderr, "%04x %5d %4d %04x %s\n",
87 hQueue, queue->msgSize, queue->msgCount, queue->hTask,
88 MODULE_GetModuleName( GetExePtr(queue->hTask) ) );
89 hQueue = queue->next;
91 fprintf( stderr, "\n" );
95 /***********************************************************************
96 * QUEUE_IsExitingQueue
98 BOOL32 QUEUE_IsExitingQueue( HQUEUE16 hQueue )
100 return (hExitingQueue && (hQueue == hExitingQueue));
104 /***********************************************************************
105 * QUEUE_SetExitingQueue
107 void QUEUE_SetExitingQueue( HQUEUE16 hQueue )
109 hExitingQueue = hQueue;
113 /***********************************************************************
114 * QUEUE_CreateMsgQueue
116 * Creates a message queue. Doesn't link it into queue list!
118 static HQUEUE16 QUEUE_CreateMsgQueue( int size )
120 HQUEUE16 hQueue;
121 MESSAGEQUEUE * msgQueue;
122 int queueSize;
123 TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
125 dprintf_msg(stddeb,"Creating message queue...\n");
127 queueSize = sizeof(MESSAGEQUEUE) + size * sizeof(QMSG);
128 if (!(hQueue = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, queueSize )))
129 return 0;
130 msgQueue = (MESSAGEQUEUE *) GlobalLock16( hQueue );
131 msgQueue->self = hQueue;
132 msgQueue->msgSize = sizeof(QMSG);
133 msgQueue->queueSize = size;
134 msgQueue->wakeBits = msgQueue->changeBits = QS_SMPARAMSFREE;
135 msgQueue->wWinVersion = pTask ? pTask->version : 0;
136 GlobalUnlock16( hQueue );
137 return hQueue;
141 /***********************************************************************
142 * QUEUE_DeleteMsgQueue
144 * Unlinks and deletes a message queue.
146 * Note: We need to mask asynchronous events to make sure PostMessage works
147 * even in the signal handler.
149 BOOL32 QUEUE_DeleteMsgQueue( HQUEUE16 hQueue )
151 MESSAGEQUEUE * msgQueue = (MESSAGEQUEUE*)GlobalLock16(hQueue);
152 HQUEUE16 senderQ;
153 HQUEUE16 *pPrev;
155 dprintf_msg(stddeb,"Deleting message queue %04x\n", hQueue);
157 if (!hQueue || !msgQueue)
159 dprintf_msg(stddeb,"DeleteMsgQueue: invalid argument.\n");
160 return 0;
162 if( pCursorQueue == msgQueue ) pCursorQueue = NULL;
163 if( pActiveQueue == msgQueue ) pActiveQueue = NULL;
165 /* flush sent messages */
166 senderQ = msgQueue->hSendingTask;
167 while( senderQ )
169 MESSAGEQUEUE* sq = (MESSAGEQUEUE*)GlobalLock16(senderQ);
170 if( !sq ) break;
171 sq->SendMessageReturn = 0L;
172 QUEUE_SetWakeBit( sq, QS_SMRESULT );
173 senderQ = sq->hPrevSendingTask;
176 SIGNAL_MaskAsyncEvents( TRUE );
178 pPrev = &hFirstQueue;
179 while (*pPrev && (*pPrev != hQueue))
181 MESSAGEQUEUE *msgQ = (MESSAGEQUEUE*)GlobalLock16(*pPrev);
182 pPrev = &msgQ->next;
184 if (*pPrev) *pPrev = msgQueue->next;
185 msgQueue->self = 0;
187 SIGNAL_MaskAsyncEvents( FALSE );
189 GlobalFree16( hQueue );
190 return 1;
194 /***********************************************************************
195 * QUEUE_CreateSysMsgQueue
197 * Create the system message queue, and set the double-click speed.
198 * Must be called only once.
200 BOOL32 QUEUE_CreateSysMsgQueue( int size )
202 if (size > MAX_QUEUE_SIZE) size = MAX_QUEUE_SIZE;
203 else if (size <= 0) size = 1;
204 if (!(hmemSysMsgQueue = QUEUE_CreateMsgQueue( size ))) return FALSE;
205 sysMsgQueue = (MESSAGEQUEUE *) GlobalLock16( hmemSysMsgQueue );
206 return TRUE;
210 /***********************************************************************
211 * QUEUE_GetSysQueue
213 MESSAGEQUEUE *QUEUE_GetSysQueue(void)
215 return sysMsgQueue;
219 /***********************************************************************
220 * QUEUE_SetWakeBit
222 * See "Windows Internals", p.449
224 void QUEUE_SetWakeBit( MESSAGEQUEUE *queue, WORD bit )
226 dprintf_msg(stddeb,"SetWakeBit: queue = %04x (wm=%04x), bit = %04x\n",
227 queue->self, queue->wakeMask, bit );
229 if (bit & QS_MOUSE) pMouseQueue = queue;
230 if (bit & QS_KEY) pKbdQueue = queue;
231 queue->changeBits |= bit;
232 queue->wakeBits |= bit;
233 if (queue->wakeMask & bit)
235 queue->wakeMask = 0;
236 PostEvent( queue->hTask );
241 /***********************************************************************
242 * QUEUE_ClearWakeBit
244 void QUEUE_ClearWakeBit( MESSAGEQUEUE *queue, WORD bit )
246 queue->changeBits &= ~bit;
247 queue->wakeBits &= ~bit;
251 /***********************************************************************
252 * QUEUE_WaitBits
254 * See "Windows Internals", p.447
256 void QUEUE_WaitBits( WORD bits )
258 MESSAGEQUEUE *queue;
260 dprintf_msg(stddeb,"WaitBits: q %04x waiting for %04x\n", GetTaskQueue(0), bits);
262 for (;;)
264 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return;
266 if (queue->changeBits & bits)
268 /* One of the bits is set; we can return */
269 queue->wakeMask = 0;
270 return;
272 if (queue->wakeBits & QS_SENDMESSAGE)
274 /* Process the sent message immediately */
276 queue->wakeMask = 0;
277 QUEUE_ReceiveMessage( queue );
278 continue; /* nested sm crux */
281 queue->wakeMask = bits | QS_SENDMESSAGE;
282 if(queue->changeBits & bits) continue;
284 dprintf_msg(stddeb,"wb: (%04x) wakeMask is %04x, waiting\n", queue->self, queue->wakeMask);
286 WaitEvent( 0 );
291 /***********************************************************************
292 * QUEUE_ReceiveMessage
294 * This routine is called when a sent message is waiting for the queue.
296 void QUEUE_ReceiveMessage( MESSAGEQUEUE *queue )
298 MESSAGEQUEUE *senderQ = NULL;
299 HQUEUE16 prevSender = 0;
300 QSMCTRL* prevCtrlPtr = NULL;
301 LRESULT result = 0;
303 dprintf_msg(stddeb, "ReceiveMessage, queue %04x\n", queue->self );
304 if (!(queue->wakeBits & QS_SENDMESSAGE) ||
305 !(senderQ = (MESSAGEQUEUE*)GlobalLock16( queue->hSendingTask)))
306 { dprintf_msg(stddeb,"\trcm: nothing to do\n"); return; }
308 if( !senderQ->hPrevSendingTask )
310 queue->wakeBits &= ~QS_SENDMESSAGE; /* no more sent messages */
311 queue->changeBits &= ~QS_SENDMESSAGE;
314 /* Save current state on stack */
315 prevSender = queue->InSendMessageHandle;
316 prevCtrlPtr = queue->smResultCurrent;
318 /* Remove sending queue from the list */
319 queue->InSendMessageHandle = queue->hSendingTask;
320 queue->smResultCurrent = senderQ->smResultInit;
321 queue->hSendingTask = senderQ->hPrevSendingTask;
323 dprintf_msg(stddeb, "\trcm: smResultCurrent = %08x, prevCtrl = %08x\n",
324 (unsigned)queue->smResultCurrent, (unsigned)prevCtrlPtr );
325 QUEUE_SetWakeBit( senderQ, QS_SMPARAMSFREE );
327 dprintf_msg(stddeb, "\trcm: calling wndproc - %04x %04x %04x%04x %08x\n",
328 senderQ->hWnd, senderQ->msg, senderQ->wParamHigh,
329 senderQ->wParam, (unsigned)senderQ->lParam );
331 if (IsWindow32( senderQ->hWnd ))
333 WND *wndPtr = WIN_FindWndPtr( senderQ->hWnd );
334 DWORD extraInfo = queue->GetMessageExtraInfoVal;
335 queue->GetMessageExtraInfoVal = senderQ->GetMessageExtraInfoVal;
337 if (senderQ->flags & QUEUE_SM_WIN32)
339 WPARAM32 wParam = MAKELONG( senderQ->wParam, senderQ->wParamHigh );
340 dprintf_msg(stddeb, "\trcm: msg is Win32\n" );
341 if (senderQ->flags & QUEUE_SM_UNICODE)
342 result = CallWindowProc32W( wndPtr->winproc,
343 senderQ->hWnd, senderQ->msg,
344 wParam, senderQ->lParam );
345 else
346 result = CallWindowProc32A( wndPtr->winproc,
347 senderQ->hWnd, senderQ->msg,
348 wParam, senderQ->lParam );
350 else /* Win16 message */
351 result = CallWindowProc16( (WNDPROC16)wndPtr->winproc,
352 senderQ->hWnd, senderQ->msg,
353 senderQ->wParam, senderQ->lParam );
355 queue->GetMessageExtraInfoVal = extraInfo; /* Restore extra info */
356 dprintf_msg(stddeb,"\trcm: result = %08x\n", (unsigned)result );
358 else dprintf_msg(stddeb,"\trcm: bad hWnd\n");
360 /* Return the result to the sender task */
361 ReplyMessage16( result );
363 queue->InSendMessageHandle = prevSender;
364 queue->smResultCurrent = prevCtrlPtr;
366 dprintf_msg(stddeb,"ReceiveMessage: done!\n");
369 /***********************************************************************
370 * QUEUE_FlushMessage
372 * Try to reply to all pending sent messages on exit.
374 void QUEUE_FlushMessages( HQUEUE16 hQueue )
376 MESSAGEQUEUE *queue = (MESSAGEQUEUE*)GlobalLock16( hQueue );
378 if( queue )
380 MESSAGEQUEUE *senderQ = (MESSAGEQUEUE*)GlobalLock16( queue->hSendingTask);
381 QSMCTRL* CtrlPtr = queue->smResultCurrent;
383 while( senderQ )
385 if( !(queue->hSendingTask = senderQ->hPrevSendingTask) )
386 queue->wakeBits &= ~QS_SENDMESSAGE;
387 QUEUE_SetWakeBit( senderQ, QS_SMPARAMSFREE );
389 queue->smResultCurrent = CtrlPtr;
390 while( senderQ->wakeBits & QS_SMRESULT ) OldYield();
392 senderQ->SendMessageReturn = 0;
393 senderQ->smResult = queue->smResultCurrent;
394 QUEUE_SetWakeBit( senderQ, QS_SMRESULT);
396 if( (senderQ = (MESSAGEQUEUE*)GlobalLock16( queue->hSendingTask)) )
397 CtrlPtr = senderQ->smResultInit;
399 queue->InSendMessageHandle = 0;
403 /***********************************************************************
404 * QUEUE_AddMsg
406 * Add a message to the queue. Return FALSE if queue is full.
408 BOOL32 QUEUE_AddMsg( HQUEUE16 hQueue, MSG16 * msg, DWORD extraInfo )
410 int pos;
411 MESSAGEQUEUE *msgQueue;
413 SIGNAL_MaskAsyncEvents( TRUE );
415 if (!(msgQueue = (MESSAGEQUEUE *)GlobalLock16( hQueue ))) return FALSE;
416 pos = msgQueue->nextFreeMessage;
418 /* Check if queue is full */
419 if ((pos == msgQueue->nextMessage) && (msgQueue->msgCount > 0))
421 SIGNAL_MaskAsyncEvents( FALSE );
422 fprintf(stderr,"MSG_AddMsg // queue is full !\n");
423 return FALSE;
426 /* Store message */
427 msgQueue->messages[pos].msg = *msg;
428 msgQueue->messages[pos].extraInfo = extraInfo;
429 if (pos < msgQueue->queueSize-1) pos++;
430 else pos = 0;
431 msgQueue->nextFreeMessage = pos;
432 msgQueue->msgCount++;
434 SIGNAL_MaskAsyncEvents( FALSE );
436 QUEUE_SetWakeBit( msgQueue, QS_POSTMESSAGE );
437 return TRUE;
441 /***********************************************************************
442 * QUEUE_FindMsg
444 * Find a message matching the given parameters. Return -1 if none available.
446 int QUEUE_FindMsg( MESSAGEQUEUE * msgQueue, HWND32 hwnd, int first, int last )
448 int i, pos = msgQueue->nextMessage;
450 dprintf_msg(stddeb,"QUEUE_FindMsg: hwnd=%04x pos=%d\n", hwnd, pos );
452 if (!msgQueue->msgCount) return -1;
453 if (!hwnd && !first && !last) return pos;
455 for (i = 0; i < msgQueue->msgCount; i++)
457 MSG16 * msg = &msgQueue->messages[pos].msg;
459 if (!hwnd || (msg->hwnd == hwnd))
461 if (!first && !last) return pos;
462 if ((msg->message >= first) && (msg->message <= last)) return pos;
464 if (pos < msgQueue->queueSize-1) pos++;
465 else pos = 0;
467 return -1;
471 /***********************************************************************
472 * QUEUE_RemoveMsg
474 * Remove a message from the queue (pos must be a valid position).
476 void QUEUE_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos )
478 SIGNAL_MaskAsyncEvents( TRUE );
480 if (pos >= msgQueue->nextMessage)
482 for ( ; pos > msgQueue->nextMessage; pos--)
483 msgQueue->messages[pos] = msgQueue->messages[pos-1];
484 msgQueue->nextMessage++;
485 if (msgQueue->nextMessage >= msgQueue->queueSize)
486 msgQueue->nextMessage = 0;
488 else
490 for ( ; pos < msgQueue->nextFreeMessage; pos++)
491 msgQueue->messages[pos] = msgQueue->messages[pos+1];
492 if (msgQueue->nextFreeMessage) msgQueue->nextFreeMessage--;
493 else msgQueue->nextFreeMessage = msgQueue->queueSize-1;
495 msgQueue->msgCount--;
496 if (!msgQueue->msgCount) msgQueue->wakeBits &= ~QS_POSTMESSAGE;
498 SIGNAL_MaskAsyncEvents( FALSE );
502 /***********************************************************************
503 * QUEUE_WakeSomeone
505 * Wake a queue upon reception of a hardware event.
507 static void QUEUE_WakeSomeone( UINT32 message )
509 WND* wndPtr = NULL;
510 WORD wakeBit;
511 HWND32 hwnd;
512 MESSAGEQUEUE *queue = pCursorQueue;
514 if( (message >= WM_KEYFIRST) && (message <= WM_KEYLAST) )
516 wakeBit = QS_KEY;
517 if( pActiveQueue ) queue = pActiveQueue;
519 else
521 wakeBit = (message == WM_MOUSEMOVE) ? QS_MOUSEMOVE : QS_MOUSEBUTTON;
522 if( (hwnd = GetCapture32()) )
523 if( (wndPtr = WIN_FindWndPtr( hwnd )) )
524 queue = (MESSAGEQUEUE *)GlobalLock16( wndPtr->hmemTaskQ );
527 if( (hwnd = GetSysModalWindow16()) )
528 if( (wndPtr = WIN_FindWndPtr( hwnd )) )
529 queue = (MESSAGEQUEUE *)GlobalLock16( wndPtr->hmemTaskQ );
531 if( !queue )
533 queue = GlobalLock16( hFirstQueue );
534 while( queue )
536 if (queue->wakeMask & wakeBit) break;
537 queue = GlobalLock16( queue->next );
539 if( !queue )
541 dprintf_msg(stddeb,"WakeSomeone: couldn't find queue\n");
542 return;
546 QUEUE_SetWakeBit( queue, wakeBit );
550 /***********************************************************************
551 * hardware_event
553 * Add an event to the system message queue.
554 * Note: the position is relative to the desktop window.
556 void hardware_event( WORD message, WORD wParam, LONG lParam,
557 int xPos, int yPos, DWORD time, DWORD extraInfo )
559 MSG16 *msg;
560 int pos;
562 if (!sysMsgQueue) return;
563 pos = sysMsgQueue->nextFreeMessage;
565 /* Merge with previous event if possible */
567 if ((message == WM_MOUSEMOVE) && sysMsgQueue->msgCount)
569 if (pos > 0) pos--;
570 else pos = sysMsgQueue->queueSize - 1;
571 msg = &sysMsgQueue->messages[pos].msg;
572 if ((msg->message == message) && (msg->wParam == wParam))
573 sysMsgQueue->msgCount--; /* Merge events */
574 else
575 pos = sysMsgQueue->nextFreeMessage; /* Don't merge */
578 /* Check if queue is full */
580 if ((pos == sysMsgQueue->nextMessage) && sysMsgQueue->msgCount)
582 /* Queue is full, beep (but not on every mouse motion...) */
583 if (message != WM_MOUSEMOVE) MessageBeep32(0);
584 return;
587 /* Store message */
589 msg = &sysMsgQueue->messages[pos].msg;
590 msg->hwnd = 0;
591 msg->message = message;
592 msg->wParam = wParam;
593 msg->lParam = lParam;
594 msg->time = time;
595 msg->pt.x = xPos & 0xffff;
596 msg->pt.y = yPos & 0xffff;
597 sysMsgQueue->messages[pos].extraInfo = extraInfo;
598 if (pos < sysMsgQueue->queueSize - 1) pos++;
599 else pos = 0;
600 sysMsgQueue->nextFreeMessage = pos;
601 sysMsgQueue->msgCount++;
602 QUEUE_WakeSomeone( message );
606 /***********************************************************************
607 * QUEUE_GetQueueTask
609 HTASK16 QUEUE_GetQueueTask( HQUEUE16 hQueue )
611 MESSAGEQUEUE *queue = GlobalLock16( hQueue );
612 return (queue) ? queue->hTask : 0 ;
616 /***********************************************************************
617 * QUEUE_IncPaintCount
619 void QUEUE_IncPaintCount( HQUEUE16 hQueue )
621 MESSAGEQUEUE *queue;
623 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( hQueue ))) return;
624 queue->wPaintCount++;
625 QUEUE_SetWakeBit( queue, QS_PAINT );
629 /***********************************************************************
630 * QUEUE_DecPaintCount
632 void QUEUE_DecPaintCount( HQUEUE16 hQueue )
634 MESSAGEQUEUE *queue;
636 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( hQueue ))) return;
637 queue->wPaintCount--;
638 if (!queue->wPaintCount) queue->wakeBits &= ~QS_PAINT;
642 /***********************************************************************
643 * QUEUE_IncTimerCount
645 void QUEUE_IncTimerCount( HQUEUE16 hQueue )
647 MESSAGEQUEUE *queue;
649 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( hQueue ))) return;
650 queue->wTimerCount++;
651 QUEUE_SetWakeBit( queue, QS_TIMER );
655 /***********************************************************************
656 * QUEUE_DecTimerCount
658 void QUEUE_DecTimerCount( HQUEUE16 hQueue )
660 MESSAGEQUEUE *queue;
662 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( hQueue ))) return;
663 queue->wTimerCount--;
664 if (!queue->wTimerCount) queue->wakeBits &= ~QS_TIMER;
668 /***********************************************************************
669 * PostQuitMessage16 (USER.6)
671 void WINAPI PostQuitMessage16( INT16 exitCode )
673 PostQuitMessage32( exitCode );
677 /***********************************************************************
678 * PostQuitMessage32 (USER32.420)
680 void WINAPI PostQuitMessage32( INT32 exitCode )
682 MESSAGEQUEUE *queue;
684 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return;
685 queue->wPostQMsg = TRUE;
686 queue->wExitCode = (WORD)exitCode;
690 /***********************************************************************
691 * GetWindowTask16 (USER.224)
693 HTASK16 WINAPI GetWindowTask16( HWND16 hwnd )
695 WND *wndPtr = WIN_FindWndPtr( hwnd );
697 if (!wndPtr) return 0;
698 return QUEUE_GetQueueTask( wndPtr->hmemTaskQ );
701 /***********************************************************************
702 * GetWindowThreadProcessId (USER32.312)
704 DWORD WINAPI GetWindowThreadProcessId( HWND32 hwnd, LPDWORD process )
706 HTASK16 htask;
707 TDB *tdb;
709 WND *wndPtr = WIN_FindWndPtr( hwnd );
711 if (!wndPtr) return 0;
712 htask=QUEUE_GetQueueTask( wndPtr->hmemTaskQ );
713 tdb = (TDB*)GlobalLock16(htask);
714 if (!tdb) return 0;
715 if (tdb->thdb) {
716 if (process)
717 *process = (DWORD)tdb->thdb->process;
718 return (DWORD)tdb->thdb;
720 return 0;
725 /***********************************************************************
726 * SetMessageQueue16 (USER.266)
728 BOOL16 WINAPI SetMessageQueue16( INT16 size )
730 return SetMessageQueue32( size );
734 /***********************************************************************
735 * SetMessageQueue32 (USER32.493)
737 BOOL32 WINAPI SetMessageQueue32( INT32 size )
739 HQUEUE16 hQueue, hNewQueue;
740 MESSAGEQUEUE *queuePtr;
742 dprintf_msg(stddeb,"SetMessageQueue: task %04x size %i\n", GetCurrentTask(), size);
744 if ((size > MAX_QUEUE_SIZE) || (size <= 0)) return TRUE;
746 if( !(hNewQueue = QUEUE_CreateMsgQueue( size )))
748 dprintf_msg(stddeb,"SetMessageQueue: failed!\n");
749 return FALSE;
751 queuePtr = (MESSAGEQUEUE *)GlobalLock16( hNewQueue );
753 SIGNAL_MaskAsyncEvents( TRUE );
755 /* Copy data and free the old message queue */
756 if ((hQueue = GetTaskQueue(0)) != 0)
758 MESSAGEQUEUE *oldQ = (MESSAGEQUEUE *)GlobalLock16( hQueue );
759 memcpy( &queuePtr->wParamHigh, &oldQ->wParamHigh,
760 (int)oldQ->messages - (int)(&oldQ->wParamHigh) );
761 HOOK_ResetQueueHooks( hNewQueue );
762 if( WIN_GetDesktop()->hmemTaskQ == hQueue )
763 WIN_GetDesktop()->hmemTaskQ = hNewQueue;
764 WIN_ResetQueueWindows( WIN_GetDesktop()->child, hQueue, hNewQueue );
765 QUEUE_DeleteMsgQueue( hQueue );
768 /* Link new queue into list */
769 queuePtr->hTask = GetCurrentTask();
770 queuePtr->next = hFirstQueue;
771 hFirstQueue = hNewQueue;
773 if( !queuePtr->next ) pCursorQueue = queuePtr;
774 SetTaskQueue( 0, hNewQueue );
776 SIGNAL_MaskAsyncEvents( FALSE );
777 return TRUE;
781 /***********************************************************************
782 * GetQueueStatus16 (USER.334)
784 DWORD WINAPI GetQueueStatus16( UINT16 flags )
786 MESSAGEQUEUE *queue;
787 DWORD ret;
789 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
790 ret = MAKELONG( queue->changeBits, queue->wakeBits );
791 queue->changeBits = 0;
792 return ret & MAKELONG( flags, flags );
796 /***********************************************************************
797 * GetInputState16 (USER.335)
799 BOOL16 WINAPI GetInputState16(void)
801 return GetInputState32();
805 /***********************************************************************
806 * GetInputState32 (USER32.243)
808 BOOL32 WINAPI GetInputState32(void)
810 MESSAGEQUEUE *queue;
812 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) )))
813 return FALSE;
814 return queue->wakeBits & (QS_KEY | QS_MOUSEBUTTON);
818 /***********************************************************************
819 * GetMessagePos (USER.119) (USER32.271)
821 DWORD WINAPI GetMessagePos(void)
823 MESSAGEQUEUE *queue;
825 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
826 return queue->GetMessagePosVal;
830 /***********************************************************************
831 * GetMessageTime (USER.120) (USER32.272)
833 LONG WINAPI GetMessageTime(void)
835 MESSAGEQUEUE *queue;
837 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
838 return queue->GetMessageTimeVal;
842 /***********************************************************************
843 * GetMessageExtraInfo (USER.288) (USER32.270)
845 LONG WINAPI GetMessageExtraInfo(void)
847 MESSAGEQUEUE *queue;
849 if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
850 return queue->GetMessageExtraInfoVal;