blob: 10b1612369c7644749b1cebb9dcf19dfc2051d61 [file] [log] [blame]
Alexandre Julliard401710d1993-09-04 10:09:32 +00001/*
2 * Window related functions
3 *
Alexandre Julliardaca05781994-10-17 18:12:41 +00004 * Copyright 1993, 1994 Alexandre Julliard
Alexandre Julliard401710d1993-09-04 10:09:32 +00005 */
Alexandre Julliard1e9ac791996-06-06 18:38:27 +00006
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00007#include <stdlib.h>
Alexandre Julliardfb9a9191994-03-01 19:48:04 +00008#include <string.h>
Alexandre Julliard36ca1361994-06-02 22:38:20 +00009#include "options.h"
Alexandre Julliard401710d1993-09-04 10:09:32 +000010#include "class.h"
11#include "win.h"
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000012#include "heap.h"
Alexandre Julliardf0b23541993-09-29 12:21:49 +000013#include "user.h"
Alexandre Julliard5f721f81994-01-04 20:14:34 +000014#include "dce.h"
Alexandre Julliardcdd09231994-01-12 11:12:51 +000015#include "sysmetrics.h"
Alexandre Julliardaf0bae51995-10-03 17:06:08 +000016#include "cursoricon.h"
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000017#include "heap.h"
18#include "hook.h"
Alexandre Julliard1285c2f1996-05-06 16:06:24 +000019#include "menu.h"
Alexandre Julliardef702d81996-05-28 18:54:58 +000020#include "message.h"
Alexandre Julliarde2abbb11995-03-19 17:39:39 +000021#include "nonclient.h"
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000022#include "queue.h"
Alexandre Julliard234bc241994-12-10 13:02:28 +000023#include "winpos.h"
Alexandre Julliarde2991ea1995-07-29 13:09:43 +000024#include "shm_main_blk.h"
25#include "dde_proc.h"
Alexandre Julliard1e9ac791996-06-06 18:38:27 +000026#include "clipboard.h"
Alexandre Julliard2d93d001996-05-21 15:01:41 +000027#include "winproc.h"
Ulrich Weiganda8441891998-12-24 15:17:02 +000028#include "task.h"
Alexandre Julliard01d63461997-01-20 19:43:45 +000029#include "thread.h"
Alexandre Julliard85ed45e1998-08-22 19:03:56 +000030#include "process.h"
Alexandre Julliardaca05781994-10-17 18:12:41 +000031#include "debug.h"
Alexandre Julliard767e6f61998-08-09 12:47:43 +000032#include "winerror.h"
Rein Klazes5c6fc1b1998-11-01 14:50:06 +000033#include "mdi.h"
Alexandre Julliard401710d1993-09-04 10:09:32 +000034
Patrik Stridvalle35d6361998-12-07 09:13:40 +000035extern WND_DRIVER X11DRV_WND_Driver;
36
Alexandre Julliard59730ae1996-03-24 16:20:51 +000037/* Desktop window */
38static WND *pWndDesktop = NULL;
39
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +000040static HWND32 hwndSysModal = 0;
Alexandre Julliard401710d1993-09-04 10:09:32 +000041
Alexandre Julliardd4719651995-12-12 18:49:11 +000042static WORD wDragWidth = 4;
43static WORD wDragHeight= 3;
Alexandre Julliardade697e1995-11-26 13:59:11 +000044
Alexandre Julliard401710d1993-09-04 10:09:32 +000045/***********************************************************************
46 * WIN_FindWndPtr
47 *
48 * Return a pointer to the WND structure corresponding to a HWND.
Alexandre Julliard401710d1993-09-04 10:09:32 +000049 */
Alexandre Julliardac9c9b01996-07-28 18:50:11 +000050WND * WIN_FindWndPtr( HWND32 hwnd )
Alexandre Julliard401710d1993-09-04 10:09:32 +000051{
52 WND * ptr;
53
Alexandre Julliardac9c9b01996-07-28 18:50:11 +000054 if (!hwnd || HIWORD(hwnd)) return NULL;
Alexandre Julliarde2abbb11995-03-19 17:39:39 +000055 ptr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
Alexandre Julliardf0b23541993-09-29 12:21:49 +000056 if (ptr->dwMagic != WND_MAGIC) return NULL;
Alexandre Julliard59730ae1996-03-24 16:20:51 +000057 if (ptr->hwndSelf != hwnd)
58 {
Alexandre Julliarda845b881998-06-01 10:44:35 +000059 ERR( win, "Can't happen: hwnd %04x self pointer is %04x\n",
Alexandre Julliard59730ae1996-03-24 16:20:51 +000060 hwnd, ptr->hwndSelf );
61 return NULL;
62 }
Alexandre Julliard401710d1993-09-04 10:09:32 +000063 return ptr;
64}
65
66
67/***********************************************************************
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000068 * WIN_DumpWindow
69 *
70 * Dump the content of a window structure to stderr.
71 */
Alexandre Julliardac9c9b01996-07-28 18:50:11 +000072void WIN_DumpWindow( HWND32 hwnd )
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000073{
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000074 WND *ptr;
75 char className[80];
76 int i;
77
78 if (!(ptr = WIN_FindWndPtr( hwnd )))
79 {
Alexandre Julliarda845b881998-06-01 10:44:35 +000080 WARN( win, "%04x is not a window handle\n", hwnd );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000081 return;
82 }
83
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000084 if (!GetClassName32A( hwnd, className, sizeof(className ) ))
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000085 strcpy( className, "#NULL#" );
86
Alexandre Julliarda845b881998-06-01 10:44:35 +000087 TRACE( win, "Window %04x (%p):\n", hwnd, ptr );
88 DUMP( "next=%p child=%p parent=%p owner=%p class=%p '%s'\n"
Alexandre Julliard670cdc41997-08-24 16:00:30 +000089 "inst=%04x taskQ=%04x updRgn=%04x active=%04x dce=%p idmenu=%08x\n"
Alexandre Julliard1e9ac791996-06-06 18:38:27 +000090 "style=%08lx exstyle=%08lx wndproc=%08x text='%s'\n"
Alexandre Julliard23946ad1997-06-16 17:43:53 +000091 "client=%d,%d-%d,%d window=%d,%d-%d,%d"
Alexandre Julliardac9c9b01996-07-28 18:50:11 +000092 "sysmenu=%04x flags=%04x props=%p vscroll=%p hscroll=%p\n",
Alexandre Julliard59730ae1996-03-24 16:20:51 +000093 ptr->next, ptr->child, ptr->parent, ptr->owner,
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000094 ptr->class, className, ptr->hInstance, ptr->hmemTaskQ,
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +000095 ptr->hrgnUpdate, ptr->hwndLastActive, ptr->dce, ptr->wIDmenu,
Alexandre Julliard3051b641996-07-05 17:14:13 +000096 ptr->dwStyle, ptr->dwExStyle, (UINT32)ptr->winproc,
Alexandre Julliard2d93d001996-05-21 15:01:41 +000097 ptr->text ? ptr->text : "",
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000098 ptr->rectClient.left, ptr->rectClient.top, ptr->rectClient.right,
99 ptr->rectClient.bottom, ptr->rectWindow.left, ptr->rectWindow.top,
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000100 ptr->rectWindow.right, ptr->rectWindow.bottom, ptr->hSysMenu,
Alexandre Julliardac9c9b01996-07-28 18:50:11 +0000101 ptr->flags, ptr->pProp, ptr->pVScroll, ptr->pHScroll );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000102
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000103 if (ptr->class->cbWndExtra)
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000104 {
Alexandre Julliarda845b881998-06-01 10:44:35 +0000105 DUMP( "extra bytes:" );
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000106 for (i = 0; i < ptr->class->cbWndExtra; i++)
Alexandre Julliarda845b881998-06-01 10:44:35 +0000107 DUMP( " %02x", *((BYTE*)ptr->wExtra+i) );
108 DUMP( "\n" );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000109 }
Alexandre Julliarda845b881998-06-01 10:44:35 +0000110 DUMP( "\n" );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000111}
112
113
114/***********************************************************************
115 * WIN_WalkWindows
116 *
117 * Walk the windows tree and print each window on stderr.
118 */
Alexandre Julliardac9c9b01996-07-28 18:50:11 +0000119void WIN_WalkWindows( HWND32 hwnd, int indent )
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000120{
121 WND *ptr;
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000122 char className[80];
123
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000124 ptr = hwnd ? WIN_FindWndPtr( hwnd ) : pWndDesktop;
125 if (!ptr)
126 {
Alexandre Julliarda845b881998-06-01 10:44:35 +0000127 WARN( win, "Invalid window handle %04x\n", hwnd );
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000128 return;
129 }
130
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000131 if (!indent) /* first time around */
Alexandre Julliarda845b881998-06-01 10:44:35 +0000132 DUMP( "%-16.16s %-8.8s %-6.6s %-17.17s %-8.8s %s\n",
Rein Klazesd62c62b1998-10-11 14:05:34 +0000133 "hwnd", " wndPtr", "queue", "Class Name", " Style", " WndProc"
134 " Text");
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000135
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000136 while (ptr)
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000137 {
Alexandre Julliarda845b881998-06-01 10:44:35 +0000138 DUMP( "%*s%04x%*s", indent, "", ptr->hwndSelf, 13-indent,"");
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000139
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000140 GlobalGetAtomName16(ptr->class->atomName,className,sizeof(className));
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000141
Rein Klazesd62c62b1998-10-11 14:05:34 +0000142 DUMP( "%08lx %-6.4x %-17.17s %08x %08x %.14s\n",
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000143 (DWORD)ptr, ptr->hmemTaskQ, className,
Rein Klazesd62c62b1998-10-11 14:05:34 +0000144 (UINT32)ptr->dwStyle, (UINT32)ptr->winproc,
145 ptr->text?ptr->text:"<null>");
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000146
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000147 if (ptr->child) WIN_WalkWindows( ptr->child->hwndSelf, indent+1 );
148 ptr = ptr->next;
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000149 }
150}
151
Alexandre Julliardaca05781994-10-17 18:12:41 +0000152/***********************************************************************
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000153 * WIN_UnlinkWindow
154 *
155 * Remove a window from the siblings linked list.
156 */
Alexandre Julliardac9c9b01996-07-28 18:50:11 +0000157BOOL32 WIN_UnlinkWindow( HWND32 hwnd )
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000158{
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000159 WND *wndPtr, **ppWnd;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000160
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000161 if (!(wndPtr = WIN_FindWndPtr( hwnd )) || !wndPtr->parent) return FALSE;
162 ppWnd = &wndPtr->parent->child;
163 while (*ppWnd != wndPtr) ppWnd = &(*ppWnd)->next;
164 *ppWnd = wndPtr->next;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000165 return TRUE;
166}
167
168
169/***********************************************************************
170 * WIN_LinkWindow
171 *
172 * Insert a window into the siblings linked list.
173 * The window is inserted after the specified window, which can also
174 * be specified as HWND_TOP or HWND_BOTTOM.
175 */
Alexandre Julliardac9c9b01996-07-28 18:50:11 +0000176BOOL32 WIN_LinkWindow( HWND32 hwnd, HWND32 hwndInsertAfter )
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000177{
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000178 WND *wndPtr, **ppWnd;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000179
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000180 if (!(wndPtr = WIN_FindWndPtr( hwnd )) || !wndPtr->parent) return FALSE;
Alexandre Julliardfb9a9191994-03-01 19:48:04 +0000181
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000182 if ((hwndInsertAfter == HWND_TOP) || (hwndInsertAfter == HWND_BOTTOM))
183 {
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000184 ppWnd = &wndPtr->parent->child; /* Point to first sibling hwnd */
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000185 if (hwndInsertAfter == HWND_BOTTOM) /* Find last sibling hwnd */
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000186 while (*ppWnd) ppWnd = &(*ppWnd)->next;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000187 }
188 else /* Normal case */
189 {
190 WND * afterPtr = WIN_FindWndPtr( hwndInsertAfter );
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000191 if (!afterPtr) return FALSE;
192 ppWnd = &afterPtr->next;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000193 }
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000194 wndPtr->next = *ppWnd;
195 *ppWnd = wndPtr;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000196 return TRUE;
197}
198
199
200/***********************************************************************
Alexandre Julliard401710d1993-09-04 10:09:32 +0000201 * WIN_FindWinToRepaint
202 *
203 * Find a window that needs repaint.
204 */
Alexandre Julliardac9c9b01996-07-28 18:50:11 +0000205HWND32 WIN_FindWinToRepaint( HWND32 hwnd, HQUEUE16 hQueue )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000206{
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000207 HWND32 hwndRet;
Alexandre Julliardc981d0b1996-03-31 16:40:13 +0000208 WND *pWnd = pWndDesktop;
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000209
Alexandre Julliard1e37a181996-08-18 16:21:52 +0000210 /* Note: the desktop window never gets WM_PAINT messages
211 * The real reason why is because Windows DesktopWndProc
212 * does ValidateRgn inside WM_ERASEBKGND handler.
213 */
214
Alexandre Julliardc981d0b1996-03-31 16:40:13 +0000215 pWnd = hwnd ? WIN_FindWndPtr( hwnd ) : pWndDesktop->child;
216
217 for ( ; pWnd ; pWnd = pWnd->next )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000218 {
Alexandre Julliarde658d821997-11-30 17:45:40 +0000219 if (!(pWnd->dwStyle & WS_VISIBLE))
Alexandre Julliardc981d0b1996-03-31 16:40:13 +0000220 {
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000221 TRACE(win, "skipping window %04x\n",
Alexandre Julliardc981d0b1996-03-31 16:40:13 +0000222 pWnd->hwndSelf );
Alexandre Julliardaca05781994-10-17 18:12:41 +0000223 continue;
Alexandre Julliardc981d0b1996-03-31 16:40:13 +0000224 }
225 if ((pWnd->hmemTaskQ == hQueue) &&
226 (pWnd->hrgnUpdate || (pWnd->flags & WIN_INTERNAL_PAINT))) break;
227
228 if (pWnd->child )
229 if ((hwndRet = WIN_FindWinToRepaint( pWnd->child->hwndSelf, hQueue )) )
230 return hwndRet;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000231 }
Alexandre Julliardc981d0b1996-03-31 16:40:13 +0000232
233 if (!pWnd) return 0;
234
235 hwndRet = pWnd->hwndSelf;
236
237 /* look among siblings if we got a transparent window */
238 while (pWnd && ((pWnd->dwExStyle & WS_EX_TRANSPARENT) ||
239 !(pWnd->hrgnUpdate || (pWnd->flags & WIN_INTERNAL_PAINT))))
240 {
241 pWnd = pWnd->next;
242 }
243 if (pWnd) hwndRet = pWnd->hwndSelf;
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000244 TRACE(win,"found %04x\n",hwndRet);
Alexandre Julliardc981d0b1996-03-31 16:40:13 +0000245 return hwndRet;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000246}
247
248
249/***********************************************************************
Alexandre Julliardaca05781994-10-17 18:12:41 +0000250 * WIN_DestroyWindow
251 *
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000252 * Destroy storage associated to a window. "Internals" p.358
Alexandre Julliardaca05781994-10-17 18:12:41 +0000253 */
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000254static WND* WIN_DestroyWindow( WND* wndPtr )
Alexandre Julliardaca05781994-10-17 18:12:41 +0000255{
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000256 HWND32 hwnd = wndPtr->hwndSelf;
Alexandre Julliard349a9531997-02-02 19:01:52 +0000257 WND *pWnd;
Alexandre Julliardaca05781994-10-17 18:12:41 +0000258
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000259 TRACE(win, "%04x\n", wndPtr->hwndSelf );
Alexandre Julliard75d86e11996-11-17 18:59:11 +0000260
Alexandre Julliardb7258be1995-09-01 15:57:28 +0000261#ifdef CONFIG_IPC
Alexandre Julliarde2991ea1995-07-29 13:09:43 +0000262 if (main_block)
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000263 DDE_DestroyWindow(wndPtr->hwndSelf);
Alexandre Julliardb7258be1995-09-01 15:57:28 +0000264#endif /* CONFIG_IPC */
Alexandre Julliarde2991ea1995-07-29 13:09:43 +0000265
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000266 /* free child windows */
267
Alexandre Julliard349a9531997-02-02 19:01:52 +0000268 while ((pWnd = wndPtr->child))
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000269 wndPtr->child = WIN_DestroyWindow( pWnd );
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000270
271 SendMessage32A( wndPtr->hwndSelf, WM_NCDESTROY, 0, 0);
272
273 /* FIXME: do we need to fake QS_MOUSEMOVE wakebit? */
274
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000275 WINPOS_CheckInternalPos( hwnd );
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000276 if( hwnd == GetCapture32()) ReleaseCapture();
277
278 /* free resources associated with the window */
279
280 TIMER_RemoveWindowTimers( wndPtr->hwndSelf );
Alexandre Julliardac9c9b01996-07-28 18:50:11 +0000281 PROPERTY_RemoveWindowProps( wndPtr );
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000282
Alexandre Julliardaca05781994-10-17 18:12:41 +0000283 wndPtr->dwMagic = 0; /* Mark it as invalid */
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000284
Alexandre Julliardaca05781994-10-17 18:12:41 +0000285 if ((wndPtr->hrgnUpdate) || (wndPtr->flags & WIN_INTERNAL_PAINT))
286 {
Alexandre Julliard491502b1997-11-01 19:08:16 +0000287 if (wndPtr->hrgnUpdate > 1) DeleteObject32( wndPtr->hrgnUpdate );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +0000288 QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
Alexandre Julliardaca05781994-10-17 18:12:41 +0000289 }
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000290
291 /* toss stale messages from the queue */
292
293 if( wndPtr->hmemTaskQ )
Alexandre Julliardaca05781994-10-17 18:12:41 +0000294 {
Alexandre Julliard491502b1997-11-01 19:08:16 +0000295 int pos;
296 BOOL32 bPostQuit = FALSE;
297 WPARAM32 wQuitParam = 0;
298 MESSAGEQUEUE* msgQ = (MESSAGEQUEUE*) GlobalLock16(wndPtr->hmemTaskQ);
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000299
Alexandre Julliard491502b1997-11-01 19:08:16 +0000300 while( (pos = QUEUE_FindMsg(msgQ, hwnd, 0, 0)) != -1 )
301 {
302 if( msgQ->messages[pos].msg.message == WM_QUIT )
303 {
304 bPostQuit = TRUE;
305 wQuitParam = msgQ->messages[pos].msg.wParam;
306 }
307 QUEUE_RemoveMsg(msgQ, pos);
308 }
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +0000309 /* repost WM_QUIT to make sure this app exits its message loop */
Alexandre Julliard491502b1997-11-01 19:08:16 +0000310 if( bPostQuit ) PostQuitMessage32(wQuitParam);
311 wndPtr->hmemTaskQ = 0;
Alexandre Julliardaca05781994-10-17 18:12:41 +0000312 }
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000313
314 if (!(wndPtr->dwStyle & WS_CHILD))
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000315 if (wndPtr->wIDmenu) DestroyMenu32( (HMENU32)wndPtr->wIDmenu );
316 if (wndPtr->hSysMenu) DestroyMenu32( wndPtr->hSysMenu );
Patrik Stridvalle35d6361998-12-07 09:13:40 +0000317 wndPtr->pDriver->pDestroyWindow( wndPtr );
Alexandre Julliard85ed45e1998-08-22 19:03:56 +0000318 DCE_FreeWindowDCE( wndPtr ); /* Always do this to catch orphaned DCs */
Alexandre Julliarddf2673b1997-03-29 17:20:20 +0000319 WINPROC_FreeProc( wndPtr->winproc, WIN_PROC_WINDOW );
Alexandre Julliard85ed45e1998-08-22 19:03:56 +0000320 wndPtr->hwndSelf = 0;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000321 wndPtr->class->cWindows--;
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000322 wndPtr->class = NULL;
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000323 pWnd = wndPtr->next;
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000324
Patrik Stridvall151170c1998-12-26 12:00:43 +0000325 wndPtr->pDriver->pFinalize(wndPtr);
Alexandre Julliardaca05781994-10-17 18:12:41 +0000326 USER_HEAP_FREE( hwnd );
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000327 return pWnd;
Alexandre Julliardaca05781994-10-17 18:12:41 +0000328}
329
Alexandre Julliardaca05781994-10-17 18:12:41 +0000330/***********************************************************************
Alexandre Julliardda0cfb31996-12-01 17:17:47 +0000331 * WIN_ResetQueueWindows
Alexandre Julliard77b99181997-09-14 17:17:23 +0000332 *
333 * Reset the queue of all the children of a given window.
334 * Return TRUE if something was done.
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000335 */
Alexandre Julliard77b99181997-09-14 17:17:23 +0000336BOOL32 WIN_ResetQueueWindows( WND* wnd, HQUEUE16 hQueue, HQUEUE16 hNew )
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000337{
Alexandre Julliard77b99181997-09-14 17:17:23 +0000338 BOOL32 ret = FALSE;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000339
Alexandre Julliard77b99181997-09-14 17:17:23 +0000340 if (hNew) /* Set a new queue */
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000341 {
Alexandre Julliard77b99181997-09-14 17:17:23 +0000342 for (wnd = wnd->child; (wnd); wnd = wnd->next)
343 {
344 if (wnd->hmemTaskQ == hQueue)
345 {
346 wnd->hmemTaskQ = hNew;
347 ret = TRUE;
348 }
349 if (wnd->child)
Ulrich Weigand7af95ae1998-12-07 10:24:42 +0000350 ret |= WIN_ResetQueueWindows( wnd, hQueue, hNew );
Alexandre Julliard77b99181997-09-14 17:17:23 +0000351 }
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000352 }
Alexandre Julliard77b99181997-09-14 17:17:23 +0000353 else /* Queue is being destroyed */
354 {
355 while (wnd->child)
356 {
357 WND *tmp = wnd->child;
358 ret = FALSE;
359 while (tmp)
360 {
361 if (tmp->hmemTaskQ == hQueue)
362 {
363 DestroyWindow32( tmp->hwndSelf );
364 ret = TRUE;
365 break;
366 }
367 if (tmp->child && WIN_ResetQueueWindows(tmp->child,hQueue,0))
368 ret = TRUE;
369 else
370 tmp = tmp->next;
371 }
372 if (!ret) break;
373 }
374 }
375 return ret;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000376}
377
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000378/***********************************************************************
Alexandre Julliardfb9a9191994-03-01 19:48:04 +0000379 * WIN_CreateDesktopWindow
380 *
381 * Create the desktop window.
382 */
Alexandre Julliardac9c9b01996-07-28 18:50:11 +0000383BOOL32 WIN_CreateDesktopWindow(void)
Alexandre Julliardfb9a9191994-03-01 19:48:04 +0000384{
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000385 CLASS *class;
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000386 HWND32 hwndDesktop;
Alexandre Julliardfb9a9191994-03-01 19:48:04 +0000387
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000388 TRACE(win,"Creating desktop window\n");
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000389
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000390 if (!ICONTITLE_Init() ||
391 !WINPOS_CreateInternalPosAtom() ||
392 !(class = CLASS_FindClassByAtom( DESKTOP_CLASS_ATOM, 0 )))
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000393 return FALSE;
Alexandre Julliardfb9a9191994-03-01 19:48:04 +0000394
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000395 hwndDesktop = USER_HEAP_ALLOC( sizeof(WND)+class->cbWndExtra );
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000396 if (!hwndDesktop) return FALSE;
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000397 pWndDesktop = (WND *) USER_HEAP_LIN_ADDR( hwndDesktop );
Alexandre Julliardfb9a9191994-03-01 19:48:04 +0000398
Patrik Stridvall151170c1998-12-26 12:00:43 +0000399 pWndDesktop->pDriver = &X11DRV_WND_Driver;
400 pWndDesktop->pDriver->pInitialize(pWndDesktop);
401
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000402 pWndDesktop->next = NULL;
403 pWndDesktop->child = NULL;
404 pWndDesktop->parent = NULL;
405 pWndDesktop->owner = NULL;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000406 pWndDesktop->class = class;
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000407 pWndDesktop->dwMagic = WND_MAGIC;
408 pWndDesktop->hwndSelf = hwndDesktop;
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000409 pWndDesktop->hInstance = 0;
410 pWndDesktop->rectWindow.left = 0;
411 pWndDesktop->rectWindow.top = 0;
412 pWndDesktop->rectWindow.right = SYSMETRICS_CXSCREEN;
413 pWndDesktop->rectWindow.bottom = SYSMETRICS_CYSCREEN;
414 pWndDesktop->rectClient = pWndDesktop->rectWindow;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000415 pWndDesktop->text = NULL;
Ulrich Weiganda8441891998-12-24 15:17:02 +0000416 pWndDesktop->hmemTaskQ = GetFastQueue();
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000417 pWndDesktop->hrgnUpdate = 0;
418 pWndDesktop->hwndLastActive = hwndDesktop;
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000419 pWndDesktop->dwStyle = WS_VISIBLE | WS_CLIPCHILDREN |
420 WS_CLIPSIBLINGS;
421 pWndDesktop->dwExStyle = 0;
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000422 pWndDesktop->dce = NULL;
Alexandre Julliardca22b331996-07-12 19:02:39 +0000423 pWndDesktop->pVScroll = NULL;
424 pWndDesktop->pHScroll = NULL;
Alexandre Julliardac9c9b01996-07-28 18:50:11 +0000425 pWndDesktop->pProp = NULL;
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000426 pWndDesktop->wIDmenu = 0;
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000427 pWndDesktop->helpContext = 0;
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000428 pWndDesktop->flags = 0;
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000429 pWndDesktop->hSysMenu = 0;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000430 pWndDesktop->userdata = 0;
Alexandre Julliarddf2673b1997-03-29 17:20:20 +0000431 pWndDesktop->winproc = (WNDPROC16)class->winproc;
432
Patrik Stridvalle35d6361998-12-07 09:13:40 +0000433 /* FIXME: How do we know if it should be Unicode or not */
434 if(!pWndDesktop->pDriver->pCreateDesktopWindow(pWndDesktop, class, FALSE))
435 return FALSE;
436
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000437 SendMessage32A( hwndDesktop, WM_NCCREATE, 0, 0 );
Alexandre Julliard1e37a181996-08-18 16:21:52 +0000438 pWndDesktop->flags |= WIN_NEEDS_ERASEBKGND;
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000439 return TRUE;
Alexandre Julliardfb9a9191994-03-01 19:48:04 +0000440}
441
442
443/***********************************************************************
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000444 * WIN_CreateWindowEx
445 *
446 * Implementation of CreateWindowEx().
Alexandre Julliard401710d1993-09-04 10:09:32 +0000447 */
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000448static HWND32 WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
449 BOOL32 win32, BOOL32 unicode )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000450{
Alexandre Julliard401710d1993-09-04 10:09:32 +0000451 CLASS *classPtr;
Alexandre Julliardd2e1c1a1996-03-09 16:12:43 +0000452 WND *wndPtr;
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000453 HWND16 hwnd, hwndLinkAfter;
Alexandre Julliardd37eb361997-07-20 16:23:21 +0000454 POINT32 maxSize, maxPos, minTrack, maxTrack;
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000455 LRESULT (CALLBACK *localSend32)(HWND32, UINT32, WPARAM32, LPARAM);
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000456
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000457 TRACE(win, "%s %s %08lx %08lx %d,%d %dx%d %04x %04x %08x %p\n",
458 unicode ? debugres_w((LPWSTR)cs->lpszName) : debugres_a(cs->lpszName),
459 unicode ? debugres_w((LPWSTR)cs->lpszClass) : debugres_a(cs->lpszClass),
460 cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
461 cs->hwndParent, cs->hMenu, cs->hInstance, cs->lpCreateParams );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000462
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000463 /* Find the parent window */
Alexandre Julliard401710d1993-09-04 10:09:32 +0000464
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000465 if (cs->hwndParent)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000466 {
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000467 /* Make sure parent is valid */
Alexandre Julliard21979011997-03-05 08:22:35 +0000468 if (!IsWindow32( cs->hwndParent ))
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000469 {
Alexandre Julliarda845b881998-06-01 10:44:35 +0000470 WARN( win, "Bad parent %04x\n", cs->hwndParent );
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000471 return 0;
Alexandre Julliardfa68b751995-04-03 16:55:37 +0000472 }
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000473 } else if ((cs->style & WS_CHILD) && !(cs->style & WS_POPUP)) {
Alexandre Julliarda845b881998-06-01 10:44:35 +0000474 WARN( win, "No parent for child window\n" );
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000475 return 0; /* WS_CHILD needs a parent, but WS_POPUP doesn't */
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000476 }
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000477
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000478 /* Find the window class */
Alexandre Julliard77b99181997-09-14 17:17:23 +0000479 if (!(classPtr = CLASS_FindClassByAtom( classAtom, win32?cs->hInstance:GetExePtr(cs->hInstance) )))
Alexandre Julliard808cb041995-08-17 17:11:36 +0000480 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000481 char buffer[256];
482 GlobalGetAtomName32A( classAtom, buffer, sizeof(buffer) );
Alexandre Julliarda845b881998-06-01 10:44:35 +0000483 WARN( win, "Bad class '%s'\n", buffer );
Alexandre Julliardff8331e1995-09-18 11:19:54 +0000484 return 0;
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000485 }
Alexandre Julliardcdd09231994-01-12 11:12:51 +0000486
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000487 /* Fix the coordinates */
Alexandre Julliardcdd09231994-01-12 11:12:51 +0000488
Alexandre Julliard85ed45e1998-08-22 19:03:56 +0000489 if (cs->x == CW_USEDEFAULT32)
490 {
491 PDB32 *pdb = PROCESS_Current();
492 if ( !(cs->style & (WS_CHILD | WS_POPUP))
493 && (pdb->env_db->startup_info->dwFlags & STARTF_USEPOSITION) )
494 {
495 cs->x = pdb->env_db->startup_info->dwX;
496 cs->y = pdb->env_db->startup_info->dwY;
497 }
498 else
499 {
500 cs->x = 0;
501 cs->y = 0;
502 }
503 }
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000504 if (cs->cx == CW_USEDEFAULT32)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000505 {
Alexandre Julliard85ed45e1998-08-22 19:03:56 +0000506 PDB32 *pdb = PROCESS_Current();
507 if ( !(cs->style & (WS_CHILD | WS_POPUP))
508 && (pdb->env_db->startup_info->dwFlags & STARTF_USESIZE) )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000509 {
Alexandre Julliard85ed45e1998-08-22 19:03:56 +0000510 cs->cx = pdb->env_db->startup_info->dwXSize;
511 cs->cy = pdb->env_db->startup_info->dwYSize;
512 }
513 else
514 {
515 cs->cx = 600; /* FIXME */
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000516 cs->cy = 400;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000517 }
518 }
Alexandre Julliardcdd09231994-01-12 11:12:51 +0000519
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000520 /* Create the window structure */
Alexandre Julliard401710d1993-09-04 10:09:32 +0000521
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000522 if (!(hwnd = USER_HEAP_ALLOC( sizeof(*wndPtr) + classPtr->cbWndExtra
523 - sizeof(wndPtr->wExtra) )))
524 {
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000525 TRACE(win, "out of memory\n" );
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000526 return 0;
527 }
Alexandre Julliard401710d1993-09-04 10:09:32 +0000528
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000529 /* Fill the window structure */
Alexandre Julliard401710d1993-09-04 10:09:32 +0000530
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000531 wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000532 wndPtr->next = NULL;
533 wndPtr->child = NULL;
534
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000535 if ((cs->style & WS_CHILD) && cs->hwndParent)
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000536 {
537 wndPtr->parent = WIN_FindWndPtr( cs->hwndParent );
538 wndPtr->owner = NULL;
539 }
540 else
541 {
542 wndPtr->parent = pWndDesktop;
543 if (!cs->hwndParent || (cs->hwndParent == pWndDesktop->hwndSelf))
544 wndPtr->owner = NULL;
545 else
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000546 wndPtr->owner = WIN_GetTopParentPtr(WIN_FindWndPtr(cs->hwndParent));
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000547 }
548
Patrik Stridvall151170c1998-12-26 12:00:43 +0000549 wndPtr->pDriver = wndPtr->parent->pDriver;
550 wndPtr->pDriver->pInitialize(wndPtr);
551
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000552 wndPtr->class = classPtr;
Alexandre Julliarddf2673b1997-03-29 17:20:20 +0000553 wndPtr->winproc = classPtr->winproc;
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000554 wndPtr->dwMagic = WND_MAGIC;
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000555 wndPtr->hwndSelf = hwnd;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000556 wndPtr->hInstance = cs->hInstance;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000557 wndPtr->text = NULL;
Ulrich Weiganda8441891998-12-24 15:17:02 +0000558 wndPtr->hmemTaskQ = GetFastQueue();
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000559 wndPtr->hrgnUpdate = 0;
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000560 wndPtr->hwndLastActive = hwnd;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000561 wndPtr->dwStyle = cs->style & ~WS_VISIBLE;
562 wndPtr->dwExStyle = cs->dwExStyle;
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000563 wndPtr->wIDmenu = 0;
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000564 wndPtr->helpContext = 0;
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000565 wndPtr->flags = win32 ? WIN_ISWIN32 : 0;
Alexandre Julliardca22b331996-07-12 19:02:39 +0000566 wndPtr->pVScroll = NULL;
567 wndPtr->pHScroll = NULL;
Alexandre Julliardac9c9b01996-07-28 18:50:11 +0000568 wndPtr->pProp = NULL;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000569 wndPtr->userdata = 0;
Alexandre Julliard7ff1c411997-05-25 13:58:18 +0000570 wndPtr->hSysMenu = (wndPtr->dwStyle & WS_SYSMENU)
571 ? MENU_GetSysMenu( hwnd, 0 ) : 0;
Alexandre Julliardf0b23541993-09-29 12:21:49 +0000572
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000573 if (classPtr->cbWndExtra) memset( wndPtr->wExtra, 0, classPtr->cbWndExtra);
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000574
575 /* Call the WH_CBT hook */
576
NF Stevens181fa7c1998-12-14 14:37:06 +0000577 hwndLinkAfter = ((cs->style & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD)
578 ? HWND_BOTTOM : HWND_TOP;
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000579
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +0000580 if (HOOK_IsHooked( WH_CBT ))
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000581 {
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +0000582 CBT_CREATEWND32A cbtc;
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000583 LRESULT ret;
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000584
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +0000585 cbtc.lpcs = cs;
586 cbtc.hwndInsertAfter = hwndLinkAfter;
Alexandre Julliard767e6f61998-08-09 12:47:43 +0000587 ret = unicode ? HOOK_CallHooks32W(WH_CBT, HCBT_CREATEWND, hwnd, (LPARAM)&cbtc)
588 : HOOK_CallHooks32A(WH_CBT, HCBT_CREATEWND, hwnd, (LPARAM)&cbtc);
589 if (ret)
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +0000590 {
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000591 TRACE(win, "CBT-hook returned 0\n");
Patrik Stridvall151170c1998-12-26 12:00:43 +0000592 wndPtr->pDriver->pFinalize(wndPtr);
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +0000593 USER_HEAP_FREE( hwnd );
594 return 0;
595 }
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000596 }
Alexandre Julliard401710d1993-09-04 10:09:32 +0000597
Alexandre Julliarddf2673b1997-03-29 17:20:20 +0000598 /* Increment class window counter */
Alexandre Julliard3051b641996-07-05 17:14:13 +0000599
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000600 classPtr->cWindows++;
Alexandre Julliard3051b641996-07-05 17:14:13 +0000601
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000602 /* Correct the window style */
603
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000604 if (!(cs->style & (WS_POPUP | WS_CHILD))) /* Overlapped window */
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000605 {
606 wndPtr->dwStyle |= WS_CAPTION | WS_CLIPSIBLINGS;
607 wndPtr->flags |= WIN_NEED_SIZE;
608 }
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000609 if (cs->dwExStyle & WS_EX_DLGMODALFRAME) wndPtr->dwStyle &= ~WS_THICKFRAME;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000610
611 /* Get class or window DC if needed */
Alexandre Julliardaca05781994-10-17 18:12:41 +0000612
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000613 if (classPtr->style & CS_OWNDC) wndPtr->dce = DCE_AllocDCE(hwnd,DCE_WINDOW_DC);
614 else if (classPtr->style & CS_CLASSDC) wndPtr->dce = classPtr->dce;
615 else wndPtr->dce = NULL;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000616
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000617 /* Send the WM_GETMINMAXINFO message and fix the size if needed */
Alexandre Julliard988ca971994-06-21 16:15:21 +0000618
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000619 if ((cs->style & WS_THICKFRAME) || !(cs->style & (WS_POPUP | WS_CHILD)))
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000620 {
Alexandre Julliardd37eb361997-07-20 16:23:21 +0000621 WINPOS_GetMinMaxInfo( wndPtr, &maxSize, &maxPos, &minTrack, &maxTrack);
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000622 if (maxSize.x < cs->cx) cs->cx = maxSize.x;
623 if (maxSize.y < cs->cy) cs->cy = maxSize.y;
Alexandre Julliardac9c9b01996-07-28 18:50:11 +0000624 if (cs->cx < minTrack.x ) cs->cx = minTrack.x;
625 if (cs->cy < minTrack.y ) cs->cy = minTrack.y;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000626 }
Alexandre Julliard44ed71f1997-12-21 19:17:50 +0000627
628 if(cs->style & WS_CHILD)
629 {
630 if(cs->cx < 0) cs->cx = 0;
631 if(cs->cy < 0) cs->cy = 0;
632 }
633 else
634 {
635 if (cs->cx <= 0) cs->cx = 1;
636 if (cs->cy <= 0) cs->cy = 1;
637 }
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000638
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000639 wndPtr->rectWindow.left = cs->x;
640 wndPtr->rectWindow.top = cs->y;
641 wndPtr->rectWindow.right = cs->x + cs->cx;
642 wndPtr->rectWindow.bottom = cs->y + cs->cy;
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000643 wndPtr->rectClient = wndPtr->rectWindow;
Alexandre Julliard940d58c1994-09-16 09:24:37 +0000644
Patrik Stridvalle35d6361998-12-07 09:13:40 +0000645 if(!wndPtr->pDriver->pCreateWindow(wndPtr, classPtr, cs, unicode))
646 return FALSE;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000647
648 /* Set the window menu */
649
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000650 if ((wndPtr->dwStyle & (WS_CAPTION | WS_CHILD)) == WS_CAPTION )
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000651 {
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000652 if (cs->hMenu) SetMenu32(hwnd, cs->hMenu);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000653 else
654 {
655#if 0 /* FIXME: should check if classPtr->menuNameW can be used as is */
656 if (classPtr->menuNameA)
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000657 cs->hMenu = HIWORD(classPtr->menuNameA) ?
658 LoadMenu(cs->hInstance,SEGPTR_GET(classPtr->menuNameA)):
659 LoadMenu(cs->hInstance,(SEGPTR)classPtr->menuNameA);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000660#else
Alexandre Julliard77b99181997-09-14 17:17:23 +0000661 SEGPTR menuName = (SEGPTR)GetClassLong16( hwnd, GCL_MENUNAME );
Alexandre Julliard54c27111998-03-29 19:44:57 +0000662 if (menuName)
663 {
Ulrich Weigand7df1fbb1998-11-01 18:01:53 +0000664 if (HIWORD(cs->hInstance))
Alexandre Julliard54c27111998-03-29 19:44:57 +0000665 cs->hMenu = LoadMenu32A(cs->hInstance,PTR_SEG_TO_LIN(menuName));
666 else
Alexandre Julliard54c27111998-03-29 19:44:57 +0000667 cs->hMenu = LoadMenu16(cs->hInstance,menuName);
668
669 if (cs->hMenu) SetMenu32( hwnd, cs->hMenu );
670 }
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000671#endif
672 }
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000673 }
Alexandre Julliard21979011997-03-05 08:22:35 +0000674 else wndPtr->wIDmenu = (UINT32)cs->hMenu;
Alexandre Julliard490a27e1994-06-08 13:57:50 +0000675
Alexandre Julliardda0cfb31996-12-01 17:17:47 +0000676 /* Send the WM_CREATE message
677 * Perhaps we shouldn't allow width/height changes as well.
678 * See p327 in "Internals".
679 */
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000680
Alexandre Julliardda0cfb31996-12-01 17:17:47 +0000681 maxPos.x = wndPtr->rectWindow.left; maxPos.y = wndPtr->rectWindow.top;
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000682
683 localSend32 = unicode ? SendMessage32W : SendMessage32A;
684 if( (*localSend32)( hwnd, WM_NCCREATE, 0, (LPARAM)cs) )
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000685 {
Rein Klazesbf1bc511998-10-31 12:09:32 +0000686 /* Insert the window in the linked list */
687
688 WIN_LinkWindow( hwnd, hwndLinkAfter );
689
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000690 WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
691 NULL, NULL, 0, &wndPtr->rectClient );
Alexandre Julliardd37eb361997-07-20 16:23:21 +0000692 OffsetRect32(&wndPtr->rectWindow, maxPos.x - wndPtr->rectWindow.left,
693 maxPos.y - wndPtr->rectWindow.top);
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000694 if( ((*localSend32)( hwnd, WM_CREATE, 0, (LPARAM)cs )) != -1 )
695 {
696 /* Send the size messages */
697
698 if (!(wndPtr->flags & WIN_NEED_SIZE))
699 {
700 /* send it anyway */
Alexandre Julliard46ea8b31998-05-03 19:01:20 +0000701 if (((wndPtr->rectClient.right-wndPtr->rectClient.left) <0)
702 ||((wndPtr->rectClient.bottom-wndPtr->rectClient.top)<0))
703 WARN(win,"sending bogus WM_SIZE message 0x%08lx\n",
704 MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
705 wndPtr->rectClient.bottom-wndPtr->rectClient.top));
Alexandre Julliardd37eb361997-07-20 16:23:21 +0000706 SendMessage32A( hwnd, WM_SIZE, SIZE_RESTORED,
707 MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
708 wndPtr->rectClient.bottom-wndPtr->rectClient.top));
709 SendMessage32A( hwnd, WM_MOVE, 0,
710 MAKELONG( wndPtr->rectClient.left,
711 wndPtr->rectClient.top ) );
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000712 }
713
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000714 /* Show the window, maximizing or minimizing if needed */
715
Alexandre Julliard77b99181997-09-14 17:17:23 +0000716 if (wndPtr->dwStyle & (WS_MINIMIZE | WS_MAXIMIZE))
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000717 {
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000718 RECT16 newPos;
Alexandre Julliard77b99181997-09-14 17:17:23 +0000719 UINT16 swFlag = (wndPtr->dwStyle & WS_MINIMIZE) ? SW_MINIMIZE : SW_MAXIMIZE;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000720 wndPtr->dwStyle &= ~(WS_MAXIMIZE | WS_MINIMIZE);
Alexandre Julliard77b99181997-09-14 17:17:23 +0000721 WINPOS_MinMaximize( wndPtr, swFlag, &newPos );
NF Stevens181fa7c1998-12-14 14:37:06 +0000722 swFlag = ((wndPtr->dwStyle & WS_CHILD) || GetActiveWindow32())
723 ? SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED
724 : SWP_NOZORDER | SWP_FRAMECHANGED;
725 SetWindowPos32( hwnd, 0, newPos.left, newPos.top,
726 newPos.right, newPos.bottom, swFlag );
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000727 }
Alexandre Julliard77b99181997-09-14 17:17:23 +0000728
729 if( wndPtr->dwStyle & WS_CHILD && !(wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY) )
730 {
731 /* Notify the parent window only */
732
733 SendMessage32A( wndPtr->parent->hwndSelf, WM_PARENTNOTIFY,
734 MAKEWPARAM(WM_CREATE, wndPtr->wIDmenu), (LPARAM)hwnd );
735 if( !IsWindow32(hwnd) ) return 0;
736 }
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000737
738 if (cs->style & WS_VISIBLE) ShowWindow32( hwnd, SW_SHOW );
739
740 /* Call WH_SHELL hook */
741
742 if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
743 HOOK_CallHooks16( WH_SHELL, HSHELL_WINDOWCREATED, hwnd, 0 );
744
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000745 TRACE(win, "created window %04x\n", hwnd);
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000746 return hwnd;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000747 }
Rein Klazesbf1bc511998-10-31 12:09:32 +0000748 WIN_UnlinkWindow( hwnd );
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000749 }
Alexandre Julliard401710d1993-09-04 10:09:32 +0000750
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000751 /* Abort window creation */
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000752
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000753 WARN(win, "aborted by WM_xxCREATE!\n");
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000754 WIN_DestroyWindow( wndPtr );
755 return 0;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000756}
757
758
759/***********************************************************************
760 * CreateWindow16 (USER.41)
761 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000762HWND16 WINAPI CreateWindow16( LPCSTR className, LPCSTR windowName,
763 DWORD style, INT16 x, INT16 y, INT16 width,
764 INT16 height, HWND16 parent, HMENU16 menu,
765 HINSTANCE16 instance, LPVOID data )
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000766{
767 return CreateWindowEx16( 0, className, windowName, style,
768 x, y, width, height, parent, menu, instance, data );
769}
770
771
772/***********************************************************************
773 * CreateWindowEx16 (USER.452)
774 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000775HWND16 WINAPI CreateWindowEx16( DWORD exStyle, LPCSTR className,
776 LPCSTR windowName, DWORD style, INT16 x,
777 INT16 y, INT16 width, INT16 height,
778 HWND16 parent, HMENU16 menu,
779 HINSTANCE16 instance, LPVOID data )
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000780{
781 ATOM classAtom;
782 CREATESTRUCT32A cs;
783
784 /* Find the class atom */
785
786 if (!(classAtom = GlobalFindAtom32A( className )))
787 {
788 fprintf( stderr, "CreateWindowEx16: bad class name " );
789 if (!HIWORD(className)) fprintf( stderr, "%04x\n", LOWORD(className) );
790 else fprintf( stderr, "'%s'\n", className );
791 return 0;
792 }
793
794 /* Fix the coordinates */
795
796 cs.x = (x == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)x;
797 cs.y = (y == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)y;
798 cs.cx = (width == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)width;
799 cs.cy = (height == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)height;
800
801 /* Create the window */
802
803 cs.lpCreateParams = data;
804 cs.hInstance = (HINSTANCE32)instance;
805 cs.hMenu = (HMENU32)menu;
806 cs.hwndParent = (HWND32)parent;
807 cs.style = style;
808 cs.lpszName = windowName;
809 cs.lpszClass = className;
810 cs.dwExStyle = exStyle;
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000811 return WIN_CreateWindowEx( &cs, classAtom, FALSE, FALSE );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000812}
813
814
815/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +0000816 * CreateWindowEx32A (USER32.83)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000817 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000818HWND32 WINAPI CreateWindowEx32A( DWORD exStyle, LPCSTR className,
819 LPCSTR windowName, DWORD style, INT32 x,
820 INT32 y, INT32 width, INT32 height,
821 HWND32 parent, HMENU32 menu,
822 HINSTANCE32 instance, LPVOID data )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000823{
824 ATOM classAtom;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000825 CREATESTRUCT32A cs;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000826
Rein Klazes5c6fc1b1998-11-01 14:50:06 +0000827 if(exStyle & WS_EX_MDICHILD)
828 return MDI_CreateMDIWindow32A(className, windowName, style, x, y, width, height, parent, instance, data);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000829 /* Find the class atom */
830
831 if (!(classAtom = GlobalFindAtom32A( className )))
832 {
833 fprintf( stderr, "CreateWindowEx32A: bad class name " );
834 if (!HIWORD(className)) fprintf( stderr, "%04x\n", LOWORD(className) );
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000835 else fprintf( stderr, "'%s'\n", className );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000836 return 0;
837 }
838
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000839 /* Create the window */
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000840
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000841 cs.lpCreateParams = data;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000842 cs.hInstance = instance;
843 cs.hMenu = menu;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000844 cs.hwndParent = parent;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000845 cs.x = x;
846 cs.y = y;
847 cs.cx = width;
848 cs.cy = height;
849 cs.style = style;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000850 cs.lpszName = windowName;
851 cs.lpszClass = className;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000852 cs.dwExStyle = exStyle;
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000853 return WIN_CreateWindowEx( &cs, classAtom, TRUE, FALSE );
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000854}
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000855
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000856
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000857/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +0000858 * CreateWindowEx32W (USER32.84)
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000859 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000860HWND32 WINAPI CreateWindowEx32W( DWORD exStyle, LPCWSTR className,
861 LPCWSTR windowName, DWORD style, INT32 x,
862 INT32 y, INT32 width, INT32 height,
863 HWND32 parent, HMENU32 menu,
864 HINSTANCE32 instance, LPVOID data )
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000865{
866 ATOM classAtom;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000867 CREATESTRUCT32W cs;
868
Rein Klazes5c6fc1b1998-11-01 14:50:06 +0000869 if(exStyle & WS_EX_MDICHILD)
870 return MDI_CreateMDIWindow32W(className, windowName, style, x, y, width, height, parent, instance, data);
871
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000872 /* Find the class atom */
873
874 if (!(classAtom = GlobalFindAtom32W( className )))
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000875 {
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000876 if (HIWORD(className))
877 {
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000878 LPSTR cn = HEAP_strdupWtoA( GetProcessHeap(), 0, className );
Alexandre Julliarda845b881998-06-01 10:44:35 +0000879 WARN( win, "Bad class name '%s'\n",cn);
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000880 HeapFree( GetProcessHeap(), 0, cn );
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000881 }
882 else
Alexandre Julliarda845b881998-06-01 10:44:35 +0000883 WARN( win, "Bad class name %p\n", className );
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000884 return 0;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000885 }
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000886
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000887 /* Create the window */
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000888
889 cs.lpCreateParams = data;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000890 cs.hInstance = instance;
891 cs.hMenu = menu;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000892 cs.hwndParent = parent;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000893 cs.x = x;
894 cs.y = y;
895 cs.cx = width;
896 cs.cy = height;
897 cs.style = style;
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000898 cs.lpszName = windowName;
899 cs.lpszClass = className;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000900 cs.dwExStyle = exStyle;
901 /* Note: we rely on the fact that CREATESTRUCT32A and */
902 /* CREATESTRUCT32W have the same layout. */
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +0000903 return WIN_CreateWindowEx( (CREATESTRUCT32A *)&cs, classAtom, TRUE, TRUE );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000904}
905
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000906
Alexandre Julliard401710d1993-09-04 10:09:32 +0000907/***********************************************************************
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000908 * WIN_CheckFocus
909 */
910static void WIN_CheckFocus( WND* pWnd )
911{
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +0000912 if( GetFocus16() == pWnd->hwndSelf )
913 SetFocus16( (pWnd->dwStyle & WS_CHILD) ? pWnd->parent->hwndSelf : 0 );
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000914}
915
916/***********************************************************************
917 * WIN_SendDestroyMsg
918 */
919static void WIN_SendDestroyMsg( WND* pWnd )
920{
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +0000921 WIN_CheckFocus(pWnd);
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000922
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +0000923 if( CARET_GetHwnd() == pWnd->hwndSelf ) DestroyCaret32();
Patrik Stridvall151170c1998-12-26 12:00:43 +0000924 CLIPBOARD_GetDriver()->pResetOwner( pWnd, TRUE );
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000925
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +0000926 SendMessage32A( pWnd->hwndSelf, WM_DESTROY, 0, 0);
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000927
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +0000928 if( IsWindow32(pWnd->hwndSelf) )
929 {
930 WND* pChild = pWnd->child;
931 while( pChild )
932 {
933 WIN_SendDestroyMsg( pChild );
934 pChild = pChild->next;
935 }
936 WIN_CheckFocus(pWnd);
937 }
938 else
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000939 WARN(win, "\tdestroyed itself while in WM_DESTROY!\n");
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000940}
941
942
943/***********************************************************************
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000944 * DestroyWindow16 (USER.53)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000945 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000946BOOL16 WINAPI DestroyWindow16( HWND16 hwnd )
Alexandre Julliard01d63461997-01-20 19:43:45 +0000947{
948 return DestroyWindow32(hwnd);
949}
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000950
951
Alexandre Julliard01d63461997-01-20 19:43:45 +0000952/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +0000953 * DestroyWindow32 (USER32.135)
Alexandre Julliard01d63461997-01-20 19:43:45 +0000954 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000955BOOL32 WINAPI DestroyWindow32( HWND32 hwnd )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000956{
Alexandre Julliard0e607781993-11-03 19:23:37 +0000957 WND * wndPtr;
Alexandre Julliard3a405ba1994-10-30 16:25:19 +0000958
Alexandre Julliarda69b88b1998-03-15 20:29:56 +0000959 TRACE(win, "(%04x)\n", hwnd);
Alexandre Julliard401710d1993-09-04 10:09:32 +0000960
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000961 /* Initialization */
Alexandre Julliard401710d1993-09-04 10:09:32 +0000962
Alexandre Julliard0e607781993-11-03 19:23:37 +0000963 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
Alexandre Julliard1e9ac791996-06-06 18:38:27 +0000964 if (wndPtr == pWndDesktop) return FALSE; /* Can't destroy desktop */
Alexandre Julliard58199531994-04-21 01:20:00 +0000965
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000966 /* Call hooks */
967
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +0000968 if( HOOK_CallHooks16( WH_CBT, HCBT_DESTROYWND, hwnd, 0L) )
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000969 return FALSE;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000970
971 if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
972 {
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +0000973 HOOK_CallHooks16( WH_SHELL, HSHELL_WINDOWDESTROYED, hwnd, 0L );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000974 /* FIXME: clean up palette - see "Internals" p.352 */
975 }
976
Alexandre Julliard7ff1c411997-05-25 13:58:18 +0000977 if( !QUEUE_IsExitingQueue(wndPtr->hmemTaskQ) )
Alexandre Julliard77b99181997-09-14 17:17:23 +0000978 if( wndPtr->dwStyle & WS_CHILD && !(wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY) )
979 {
980 /* Notify the parent window only */
981 SendMessage32A( wndPtr->parent->hwndSelf, WM_PARENTNOTIFY,
982 MAKEWPARAM(WM_DESTROY, wndPtr->wIDmenu), (LPARAM)hwnd );
983 if( !IsWindow32(hwnd) ) return TRUE;
984 }
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000985
Patrik Stridvall151170c1998-12-26 12:00:43 +0000986 CLIPBOARD_GetDriver()->pResetOwner( wndPtr, FALSE ); /* before the window is unmapped */
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000987
Alexandre Julliard58199531994-04-21 01:20:00 +0000988 /* Hide the window */
989
990 if (wndPtr->dwStyle & WS_VISIBLE)
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000991 {
Alexandre Julliard01d63461997-01-20 19:43:45 +0000992 SetWindowPos32( hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW |
993 SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|
Alexandre Julliard7ff1c411997-05-25 13:58:18 +0000994 ((QUEUE_IsExitingQueue(wndPtr->hmemTaskQ))?SWP_DEFERERASE:0) );
Alexandre Julliard21979011997-03-05 08:22:35 +0000995 if (!IsWindow32(hwnd)) return TRUE;
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +0000996 }
Alexandre Julliard0e607781993-11-03 19:23:37 +0000997
Alexandre Julliard22945d51995-03-02 17:44:29 +0000998 /* Recursively destroy owned windows */
999
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001000 if( !(wndPtr->dwStyle & WS_CHILD) )
Alexandre Julliard22945d51995-03-02 17:44:29 +00001001 {
Alexandre Julliard7ff1c411997-05-25 13:58:18 +00001002 /* make sure top menu popup doesn't get destroyed */
Alexandre Julliard77b99181997-09-14 17:17:23 +00001003 MENU_PatchResidentPopup( (HQUEUE16)0xFFFF, wndPtr );
Alexandre Julliard7ff1c411997-05-25 13:58:18 +00001004
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001005 for (;;)
1006 {
Alexandre Julliard59730ae1996-03-24 16:20:51 +00001007 WND *siblingPtr = wndPtr->parent->child; /* First sibling */
1008 while (siblingPtr)
Alexandre Julliard22945d51995-03-02 17:44:29 +00001009 {
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001010 if (siblingPtr->owner == wndPtr)
Patrik Stridvallea584721998-11-01 16:22:07 +00001011 {
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001012 if (siblingPtr->hmemTaskQ == wndPtr->hmemTaskQ)
1013 break;
1014 else
1015 siblingPtr->owner = NULL;
Patrik Stridvallea584721998-11-01 16:22:07 +00001016 }
Alexandre Julliard59730ae1996-03-24 16:20:51 +00001017 siblingPtr = siblingPtr->next;
Alexandre Julliard22945d51995-03-02 17:44:29 +00001018 }
Alexandre Julliard01d63461997-01-20 19:43:45 +00001019 if (siblingPtr) DestroyWindow32( siblingPtr->hwndSelf );
Alexandre Julliard22945d51995-03-02 17:44:29 +00001020 else break;
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001021 }
1022
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001023 if( !Options.managed || EVENT_CheckFocus() )
1024 WINPOS_ActivateOtherWindow(wndPtr);
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001025
1026 if( wndPtr->owner &&
1027 wndPtr->owner->hwndLastActive == wndPtr->hwndSelf )
1028 wndPtr->owner->hwndLastActive = wndPtr->owner->hwndSelf;
Alexandre Julliard22945d51995-03-02 17:44:29 +00001029 }
1030
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001031 /* Send destroy messages */
Alexandre Julliard0e607781993-11-03 19:23:37 +00001032
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001033 WIN_SendDestroyMsg( wndPtr );
Alexandre Julliard21979011997-03-05 08:22:35 +00001034 if (!IsWindow32(hwnd)) return TRUE;
Alexandre Julliard401710d1993-09-04 10:09:32 +00001035
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001036 /* Unlink now so we won't bother with the children later on */
Alexandre Julliard401710d1993-09-04 10:09:32 +00001037
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001038 if( wndPtr->parent ) WIN_UnlinkWindow(hwnd);
1039
1040 /* Destroy the window storage */
1041
1042 WIN_DestroyWindow( wndPtr );
Alexandre Julliard401710d1993-09-04 10:09:32 +00001043 return TRUE;
1044}
1045
1046
1047/***********************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001048 * CloseWindow16 (USER.43)
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001049 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001050BOOL16 WINAPI CloseWindow16( HWND16 hwnd )
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001051{
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001052 return CloseWindow32( hwnd );
1053}
1054
1055
1056/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001057 * CloseWindow32 (USER32.56)
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001058 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001059BOOL32 WINAPI CloseWindow32( HWND32 hwnd )
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001060{
1061 WND * wndPtr = WIN_FindWndPtr( hwnd );
1062 if (!wndPtr || (wndPtr->dwStyle & WS_CHILD)) return FALSE;
1063 ShowWindow32( hwnd, SW_MINIMIZE );
Alexandre Julliard7e56f681996-01-31 19:02:28 +00001064 return TRUE;
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001065}
1066
1067
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001068/***********************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001069 * OpenIcon16 (USER.44)
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001070 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001071BOOL16 WINAPI OpenIcon16( HWND16 hwnd )
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001072{
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001073 return OpenIcon32( hwnd );
1074}
1075
1076
1077/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001078 * OpenIcon32 (USER32.410)
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001079 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001080BOOL32 WINAPI OpenIcon32( HWND32 hwnd )
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001081{
1082 if (!IsIconic32( hwnd )) return FALSE;
1083 ShowWindow32( hwnd, SW_SHOWNORMAL );
1084 return TRUE;
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001085}
1086
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001087
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001088/***********************************************************************
1089 * WIN_FindWindow
1090 *
1091 * Implementation of FindWindow() and FindWindowEx().
1092 */
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001093static HWND32 WIN_FindWindow( HWND32 parent, HWND32 child, ATOM className,
1094 LPCSTR title )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001095{
1096 WND *pWnd;
1097 CLASS *pClass = NULL;
1098
1099 if (child)
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001100 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001101 if (!(pWnd = WIN_FindWndPtr( child ))) return 0;
1102 if (parent)
1103 {
1104 if (!pWnd->parent || (pWnd->parent->hwndSelf != parent)) return 0;
1105 }
1106 else if (pWnd->parent != pWndDesktop) return 0;
1107 pWnd = pWnd->next;
1108 }
1109 else
1110 {
1111 if (!(pWnd = parent ? WIN_FindWndPtr(parent) : pWndDesktop)) return 0;
1112 pWnd = pWnd->child;
1113 }
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001114 if (!pWnd) return 0;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001115
1116 /* For a child window, all siblings will have the same hInstance, */
1117 /* so we can look for the class once and for all. */
1118
1119 if (className && (pWnd->dwStyle & WS_CHILD))
1120 {
1121 if (!(pClass = CLASS_FindClassByAtom( className, pWnd->hInstance )))
Alexandre Julliard2ace16a1996-04-28 15:09:19 +00001122 return 0;
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001123 }
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001124
Alexandre Julliard44ed71f1997-12-21 19:17:50 +00001125
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001126 for ( ; pWnd; pWnd = pWnd->next)
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001127 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001128 if (className && !(pWnd->dwStyle & WS_CHILD))
1129 {
Alexandre Julliard44ed71f1997-12-21 19:17:50 +00001130 if (!(pClass = CLASS_FindClassByAtom( className, GetExePtr(pWnd->hInstance))))
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001131 continue; /* Skip this window */
1132 }
Alexandre Julliard44ed71f1997-12-21 19:17:50 +00001133
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001134 if (pClass && (pWnd->class != pClass))
1135 continue; /* Not the right class */
1136
1137 /* Now check the title */
1138
1139 if (!title) return pWnd->hwndSelf;
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001140 if (pWnd->text && !strcmp( pWnd->text, title )) return pWnd->hwndSelf;
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001141 }
1142 return 0;
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001143}
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001144
1145
1146
1147/***********************************************************************
1148 * FindWindow16 (USER.50)
1149 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001150HWND16 WINAPI FindWindow16( SEGPTR className, LPCSTR title )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001151{
1152 return FindWindowEx16( 0, 0, className, title );
1153}
1154
1155
1156/***********************************************************************
1157 * FindWindowEx16 (USER.427)
1158 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001159HWND16 WINAPI FindWindowEx16( HWND16 parent, HWND16 child,
1160 SEGPTR className, LPCSTR title )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001161{
Alexandre Julliard0e270f41996-08-24 18:26:35 +00001162 ATOM atom = 0;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001163
Alexandre Julliarda69b88b1998-03-15 20:29:56 +00001164 TRACE(win, "%04x %04x '%s' '%s'\n", parent,
Alexandre Julliard641ee761997-08-04 16:34:36 +00001165 child, HIWORD(className)?(char *)PTR_SEG_TO_LIN(className):"",
1166 title ? title : "");
1167
Alexandre Julliard0e270f41996-08-24 18:26:35 +00001168 if (className)
1169 {
1170 /* If the atom doesn't exist, then no class */
1171 /* with this name exists either. */
1172 if (!(atom = GlobalFindAtom16( className ))) return 0;
1173 }
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001174 return WIN_FindWindow( parent, child, atom, title );
1175}
1176
1177
1178/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001179 * FindWindow32A (USER32.198)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001180 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001181HWND32 WINAPI FindWindow32A( LPCSTR className, LPCSTR title )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001182{
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001183 HWND32 ret = FindWindowEx32A( 0, 0, className, title );
1184 if (!ret) SetLastError (ERROR_CANNOT_FIND_WND_CLASS);
1185 return ret;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001186}
1187
1188
1189/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001190 * FindWindowEx32A (USER32.199)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001191 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001192HWND32 WINAPI FindWindowEx32A( HWND32 parent, HWND32 child,
1193 LPCSTR className, LPCSTR title )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001194{
Alexandre Julliard0e270f41996-08-24 18:26:35 +00001195 ATOM atom = 0;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001196
Alexandre Julliard0e270f41996-08-24 18:26:35 +00001197 if (className)
1198 {
1199 /* If the atom doesn't exist, then no class */
1200 /* with this name exists either. */
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001201 if (!(atom = GlobalFindAtom32A( className )))
1202 {
1203 SetLastError (ERROR_CANNOT_FIND_WND_CLASS);
1204 return 0;
1205 }
Alexandre Julliard0e270f41996-08-24 18:26:35 +00001206 }
Alexandre Julliard77b99181997-09-14 17:17:23 +00001207 return WIN_FindWindow( parent, child, atom, title );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001208}
1209
1210
1211/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001212 * FindWindowEx32W (USER32.200)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001213 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001214HWND32 WINAPI FindWindowEx32W( HWND32 parent, HWND32 child,
1215 LPCWSTR className, LPCWSTR title )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001216{
Alexandre Julliard0e270f41996-08-24 18:26:35 +00001217 ATOM atom = 0;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001218 char *buffer;
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001219 HWND32 hwnd;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001220
Alexandre Julliard0e270f41996-08-24 18:26:35 +00001221 if (className)
1222 {
1223 /* If the atom doesn't exist, then no class */
1224 /* with this name exists either. */
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001225 if (!(atom = GlobalFindAtom32W( className )))
1226 {
1227 SetLastError (ERROR_CANNOT_FIND_WND_CLASS);
1228 return 0;
1229 }
Alexandre Julliard0e270f41996-08-24 18:26:35 +00001230 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001231 buffer = HEAP_strdupWtoA( GetProcessHeap(), 0, title );
Alexandre Julliard77b99181997-09-14 17:17:23 +00001232 hwnd = WIN_FindWindow( parent, child, atom, buffer );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001233 HeapFree( GetProcessHeap(), 0, buffer );
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001234 return hwnd;
1235}
1236
1237
1238/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001239 * FindWindow32W (USER32.201)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001240 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001241HWND32 WINAPI FindWindow32W( LPCWSTR className, LPCWSTR title )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001242{
1243 return FindWindowEx32W( 0, 0, className, title );
1244}
1245
1246
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001247/**********************************************************************
Alexandre Julliard59730ae1996-03-24 16:20:51 +00001248 * WIN_GetDesktop
1249 */
1250WND *WIN_GetDesktop(void)
1251{
1252 return pWndDesktop;
1253}
1254
1255
1256/**********************************************************************
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001257 * GetDesktopWindow16 (USER.286)
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001258 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001259HWND16 WINAPI GetDesktopWindow16(void)
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001260{
1261 return (HWND16)pWndDesktop->hwndSelf;
1262}
1263
1264
1265/**********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001266 * GetDesktopWindow32 (USER32.232)
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001267 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001268HWND32 WINAPI GetDesktopWindow32(void)
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001269{
Alexandre Julliard59730ae1996-03-24 16:20:51 +00001270 return pWndDesktop->hwndSelf;
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001271}
1272
1273
Alexandre Julliard02ed4c21996-03-02 19:34:10 +00001274/**********************************************************************
1275 * GetDesktopHwnd (USER.278)
1276 *
1277 * Exactly the same thing as GetDesktopWindow(), but not documented.
1278 * Don't ask me why...
1279 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001280HWND16 WINAPI GetDesktopHwnd(void)
Alexandre Julliard02ed4c21996-03-02 19:34:10 +00001281{
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00001282 return (HWND16)pWndDesktop->hwndSelf;
Alexandre Julliard02ed4c21996-03-02 19:34:10 +00001283}
1284
1285
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001286/*******************************************************************
Alexandre Julliard01d63461997-01-20 19:43:45 +00001287 * EnableWindow16 (USER.34)
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001288 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001289BOOL16 WINAPI EnableWindow16( HWND16 hwnd, BOOL16 enable )
Alexandre Julliard01d63461997-01-20 19:43:45 +00001290{
1291 return EnableWindow32( hwnd, enable );
1292}
1293
1294
1295/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001296 * EnableWindow32 (USER32.172)
Alexandre Julliard01d63461997-01-20 19:43:45 +00001297 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001298BOOL32 WINAPI EnableWindow32( HWND32 hwnd, BOOL32 enable )
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001299{
1300 WND *wndPtr;
1301
1302 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
1303 if (enable && (wndPtr->dwStyle & WS_DISABLED))
1304 {
1305 /* Enable window */
1306 wndPtr->dwStyle &= ~WS_DISABLED;
Alexandre Julliard01d63461997-01-20 19:43:45 +00001307 SendMessage32A( hwnd, WM_ENABLE, TRUE, 0 );
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001308 return TRUE;
1309 }
1310 else if (!enable && !(wndPtr->dwStyle & WS_DISABLED))
1311 {
1312 /* Disable window */
1313 wndPtr->dwStyle |= WS_DISABLED;
Alexandre Julliard01d63461997-01-20 19:43:45 +00001314 if ((hwnd == GetFocus32()) || IsChild32( hwnd, GetFocus32() ))
Alexandre Julliard8bbf8181996-09-13 16:50:47 +00001315 SetFocus32( 0 ); /* A disabled window can't have the focus */
Alexandre Julliard01d63461997-01-20 19:43:45 +00001316 if ((hwnd == GetCapture32()) || IsChild32( hwnd, GetCapture32() ))
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001317 ReleaseCapture(); /* A disabled window can't capture the mouse */
Alexandre Julliard01d63461997-01-20 19:43:45 +00001318 SendMessage32A( hwnd, WM_ENABLE, FALSE, 0 );
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001319 return FALSE;
1320 }
1321 return ((wndPtr->dwStyle & WS_DISABLED) != 0);
1322}
1323
1324
1325/***********************************************************************
Alexandre Julliard01d63461997-01-20 19:43:45 +00001326 * IsWindowEnabled16 (USER.35)
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001327 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001328BOOL16 WINAPI IsWindowEnabled16(HWND16 hWnd)
Alexandre Julliard01d63461997-01-20 19:43:45 +00001329{
1330 return IsWindowEnabled32(hWnd);
1331}
1332
1333
1334/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001335 * IsWindowEnabled32 (USER32.349)
Alexandre Julliard01d63461997-01-20 19:43:45 +00001336 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001337BOOL32 WINAPI IsWindowEnabled32(HWND32 hWnd)
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00001338{
1339 WND * wndPtr;
1340
1341 if (!(wndPtr = WIN_FindWndPtr(hWnd))) return FALSE;
1342 return !(wndPtr->dwStyle & WS_DISABLED);
1343}
1344
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001345
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001346/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001347 * IsWindowUnicode (USER32.350)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001348 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001349BOOL32 WINAPI IsWindowUnicode( HWND32 hwnd )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001350{
1351 WND * wndPtr;
1352
1353 if (!(wndPtr = WIN_FindWndPtr(hwnd))) return FALSE;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001354 return (WINPROC_GetProcType( wndPtr->winproc ) == WIN_PROC_32W);
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001355}
1356
1357
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001358/**********************************************************************
Alexandre Julliard21979011997-03-05 08:22:35 +00001359 * GetWindowWord16 (USER.133)
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001360 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001361WORD WINAPI GetWindowWord16( HWND16 hwnd, INT16 offset )
Alexandre Julliard21979011997-03-05 08:22:35 +00001362{
1363 return GetWindowWord32( hwnd, offset );
1364}
1365
1366
1367/**********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001368 * GetWindowWord32 (USER32.314)
Alexandre Julliard21979011997-03-05 08:22:35 +00001369 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001370WORD WINAPI GetWindowWord32( HWND32 hwnd, INT32 offset )
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001371{
1372 WND * wndPtr = WIN_FindWndPtr( hwnd );
1373 if (!wndPtr) return 0;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001374 if (offset >= 0)
1375 {
1376 if (offset + sizeof(WORD) > wndPtr->class->cbWndExtra)
1377 {
Alexandre Julliarda845b881998-06-01 10:44:35 +00001378 WARN( win, "Invalid offset %d\n", offset );
Alexandre Julliard3051b641996-07-05 17:14:13 +00001379 return 0;
1380 }
1381 return *(WORD *)(((char *)wndPtr->wExtra) + offset);
1382 }
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001383 switch(offset)
1384 {
Alexandre Julliard77b99181997-09-14 17:17:23 +00001385 case GWW_ID:
1386 if (HIWORD(wndPtr->wIDmenu))
Alexandre Julliarda845b881998-06-01 10:44:35 +00001387 WARN( win,"GWW_ID: discards high bits of 0x%08x!\n",
1388 wndPtr->wIDmenu);
Alexandre Julliard77b99181997-09-14 17:17:23 +00001389 return (WORD)wndPtr->wIDmenu;
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +00001390 case GWW_HWNDPARENT:
1391 return wndPtr->parent ?
1392 wndPtr->parent->hwndSelf : (
1393 wndPtr->owner ?
1394 wndPtr->owner->hwndSelf :
1395 0);
Alexandre Julliard77b99181997-09-14 17:17:23 +00001396 case GWW_HINSTANCE:
1397 if (HIWORD(wndPtr->hInstance))
Alexandre Julliarda845b881998-06-01 10:44:35 +00001398 WARN(win,"GWW_HINSTANCE: discards high bits of 0x%08x!\n",
1399 wndPtr->hInstance);
Alexandre Julliard77b99181997-09-14 17:17:23 +00001400 return (WORD)wndPtr->hInstance;
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001401 default:
Alexandre Julliarda845b881998-06-01 10:44:35 +00001402 WARN( win, "Invalid offset %d\n", offset );
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001403 return 0;
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001404 }
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001405}
1406
1407
1408/**********************************************************************
Alexandre Julliardaf0bae51995-10-03 17:06:08 +00001409 * WIN_GetWindowInstance
1410 */
Alexandre Julliard77b99181997-09-14 17:17:23 +00001411HINSTANCE32 WIN_GetWindowInstance( HWND32 hwnd )
Alexandre Julliardaf0bae51995-10-03 17:06:08 +00001412{
1413 WND * wndPtr = WIN_FindWndPtr( hwnd );
Alexandre Julliard77b99181997-09-14 17:17:23 +00001414 if (!wndPtr) return (HINSTANCE32)0;
Alexandre Julliardaf0bae51995-10-03 17:06:08 +00001415 return wndPtr->hInstance;
1416}
1417
1418
1419/**********************************************************************
Alexandre Julliard21979011997-03-05 08:22:35 +00001420 * SetWindowWord16 (USER.134)
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001421 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001422WORD WINAPI SetWindowWord16( HWND16 hwnd, INT16 offset, WORD newval )
Alexandre Julliard21979011997-03-05 08:22:35 +00001423{
1424 return SetWindowWord32( hwnd, offset, newval );
1425}
1426
1427
1428/**********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001429 * SetWindowWord32 (USER32.524)
Alexandre Julliard21979011997-03-05 08:22:35 +00001430 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001431WORD WINAPI SetWindowWord32( HWND32 hwnd, INT32 offset, WORD newval )
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001432{
1433 WORD *ptr, retval;
1434 WND * wndPtr = WIN_FindWndPtr( hwnd );
1435 if (!wndPtr) return 0;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001436 if (offset >= 0)
1437 {
1438 if (offset + sizeof(WORD) > wndPtr->class->cbWndExtra)
1439 {
Alexandre Julliarda845b881998-06-01 10:44:35 +00001440 WARN( win, "Invalid offset %d\n", offset );
Alexandre Julliard3051b641996-07-05 17:14:13 +00001441 return 0;
1442 }
1443 ptr = (WORD *)(((char *)wndPtr->wExtra) + offset);
1444 }
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001445 else switch(offset)
1446 {
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001447 case GWW_ID: ptr = (WORD *)&wndPtr->wIDmenu; break;
1448 case GWW_HINSTANCE: ptr = (WORD *)&wndPtr->hInstance; break;
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001449 case GWW_HWNDPARENT: return SetParent32( hwnd, newval );
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001450 default:
Alexandre Julliarda845b881998-06-01 10:44:35 +00001451 WARN( win, "Invalid offset %d\n", offset );
Alexandre Julliardaf0bae51995-10-03 17:06:08 +00001452 return 0;
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001453 }
1454 retval = *ptr;
1455 *ptr = newval;
1456 return retval;
1457}
1458
1459
1460/**********************************************************************
Alexandre Julliard3051b641996-07-05 17:14:13 +00001461 * WIN_GetWindowLong
1462 *
1463 * Helper function for GetWindowLong().
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001464 */
Alexandre Julliard3051b641996-07-05 17:14:13 +00001465static LONG WIN_GetWindowLong( HWND32 hwnd, INT32 offset, WINDOWPROCTYPE type )
Alexandre Julliard1e9ac791996-06-06 18:38:27 +00001466{
Alexandre Julliard3051b641996-07-05 17:14:13 +00001467 LONG retval;
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001468 WND * wndPtr = WIN_FindWndPtr( hwnd );
1469 if (!wndPtr) return 0;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001470 if (offset >= 0)
1471 {
1472 if (offset + sizeof(LONG) > wndPtr->class->cbWndExtra)
1473 {
Alexandre Julliarda845b881998-06-01 10:44:35 +00001474 WARN( win, "Invalid offset %d\n", offset );
Alexandre Julliard3051b641996-07-05 17:14:13 +00001475 return 0;
1476 }
1477 retval = *(LONG *)(((char *)wndPtr->wExtra) + offset);
1478 /* Special case for dialog window procedure */
1479 if ((offset == DWL_DLGPROC) && (wndPtr->flags & WIN_ISDIALOG))
1480 return (LONG)WINPROC_GetProc( (HWINDOWPROC)retval, type );
1481 return retval;
1482 }
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001483 switch(offset)
1484 {
Alexandre Julliard1e9ac791996-06-06 18:38:27 +00001485 case GWL_USERDATA: return wndPtr->userdata;
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001486 case GWL_STYLE: return wndPtr->dwStyle;
1487 case GWL_EXSTYLE: return wndPtr->dwExStyle;
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001488 case GWL_ID: return (LONG)wndPtr->wIDmenu;
Alexandre Julliard3051b641996-07-05 17:14:13 +00001489 case GWL_WNDPROC: return (LONG)WINPROC_GetProc( wndPtr->winproc,
1490 type );
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001491 case GWL_HWNDPARENT: return wndPtr->parent ?
1492 (HWND32)wndPtr->parent->hwndSelf : 0;
Alexandre Julliard77b99181997-09-14 17:17:23 +00001493 case GWL_HINSTANCE: return wndPtr->hInstance;
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001494 default:
Alexandre Julliarda845b881998-06-01 10:44:35 +00001495 WARN( win, "Unknown offset %d\n", offset );
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001496 }
1497 return 0;
1498}
1499
1500
1501/**********************************************************************
Alexandre Julliard3051b641996-07-05 17:14:13 +00001502 * WIN_SetWindowLong
1503 *
1504 * Helper function for SetWindowLong().
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001505 *
1506 * 0 is the failure code. However, in the case of failure SetLastError
1507 * must be set to distinguish between a 0 return value and a failure.
1508 *
1509 * FIXME: The error values for SetLastError may not be right. Can
1510 * someone check with the real thing?
Alexandre Julliard1e9ac791996-06-06 18:38:27 +00001511 */
Alexandre Julliard3051b641996-07-05 17:14:13 +00001512static LONG WIN_SetWindowLong( HWND32 hwnd, INT32 offset, LONG newval,
1513 WINDOWPROCTYPE type )
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001514{
1515 LONG *ptr, retval;
1516 WND * wndPtr = WIN_FindWndPtr( hwnd );
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001517 STYLESTRUCT style;
1518
1519 TRACE(win,"%x=%p %x %lx %x\n",hwnd, wndPtr, offset, newval, type);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001520
1521 if (!wndPtr)
1522 {
1523 /* Is this the right error? */
1524 SetLastError( ERROR_INVALID_WINDOW_HANDLE );
1525 return 0;
1526 }
1527
Alexandre Julliard3051b641996-07-05 17:14:13 +00001528 if (offset >= 0)
1529 {
1530 if (offset + sizeof(LONG) > wndPtr->class->cbWndExtra)
1531 {
Alexandre Julliarda845b881998-06-01 10:44:35 +00001532 WARN( win, "Invalid offset %d\n", offset );
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001533
1534 /* Is this the right error? */
1535 SetLastError( ERROR_OUTOFMEMORY );
1536
Alexandre Julliard3051b641996-07-05 17:14:13 +00001537 return 0;
1538 }
1539 ptr = (LONG *)(((char *)wndPtr->wExtra) + offset);
1540 /* Special case for dialog window procedure */
1541 if ((offset == DWL_DLGPROC) && (wndPtr->flags & WIN_ISDIALOG))
1542 {
1543 retval = (LONG)WINPROC_GetProc( (HWINDOWPROC)*ptr, type );
Alexandre Julliarddf2673b1997-03-29 17:20:20 +00001544 WINPROC_SetProc( (HWINDOWPROC *)ptr, (WNDPROC16)newval,
1545 type, WIN_PROC_WINDOW );
Alexandre Julliard3051b641996-07-05 17:14:13 +00001546 return retval;
1547 }
1548 }
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001549 else switch(offset)
1550 {
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001551 case GWL_ID:
1552 ptr = (DWORD*)&wndPtr->wIDmenu;
1553 break;
1554 case GWL_HINSTANCE:
1555 return SetWindowWord32( hwnd, offset, newval );
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001556 case GWL_WNDPROC:
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001557 retval = (LONG)WINPROC_GetProc( wndPtr->winproc, type );
1558 WINPROC_SetProc( &wndPtr->winproc, (WNDPROC16)newval,
Alexandre Julliarddf2673b1997-03-29 17:20:20 +00001559 type, WIN_PROC_WINDOW );
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001560 return retval;
Alexandre Julliardca22b331996-07-12 19:02:39 +00001561 case GWL_STYLE:
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001562 style.styleOld = wndPtr->dwStyle;
1563 newval &= ~(WS_VISIBLE | WS_CHILD); /* Some bits can't be changed this way */
1564 style.styleNew = newval | (style.styleOld & (WS_VISIBLE | WS_CHILD));
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001565
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001566 if (wndPtr->flags & WIN_ISWIN32)
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001567 SendMessage32A(hwnd,WM_STYLECHANGING,GWL_STYLE,(LPARAM)&style);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001568 wndPtr->dwStyle = style.styleNew;
1569 if (wndPtr->flags & WIN_ISWIN32)
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001570 SendMessage32A(hwnd,WM_STYLECHANGED,GWL_STYLE,(LPARAM)&style);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001571 return style.styleOld;
1572
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001573 case GWL_USERDATA:
1574 ptr = &wndPtr->userdata;
1575 break;
1576 case GWL_EXSTYLE:
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001577 style.styleOld = wndPtr->dwExStyle;
1578 style.styleNew = newval;
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001579 if (wndPtr->flags & WIN_ISWIN32)
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001580 SendMessage32A(hwnd,WM_STYLECHANGING,GWL_EXSTYLE,(LPARAM)&style);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001581 wndPtr->dwExStyle = newval;
1582 if (wndPtr->flags & WIN_ISWIN32)
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001583 SendMessage32A(hwnd,WM_STYLECHANGED,GWL_EXSTYLE,(LPARAM)&style);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001584 return style.styleOld;
1585
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001586 default:
Alexandre Julliarda845b881998-06-01 10:44:35 +00001587 WARN( win, "Invalid offset %d\n", offset );
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001588
1589 /* Don't think this is right error but it should do */
1590 SetLastError( ERROR_OUTOFMEMORY );
1591
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001592 return 0;
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001593 }
1594 retval = *ptr;
1595 *ptr = newval;
1596 return retval;
1597}
1598
1599
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001600/**********************************************************************
Alexandre Julliard3051b641996-07-05 17:14:13 +00001601 * GetWindowLong16 (USER.135)
1602 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001603LONG WINAPI GetWindowLong16( HWND16 hwnd, INT16 offset )
Alexandre Julliard3051b641996-07-05 17:14:13 +00001604{
1605 return WIN_GetWindowLong( (HWND32)hwnd, offset, WIN_PROC_16 );
1606}
1607
1608
1609/**********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001610 * GetWindowLong32A (USER32.305)
Alexandre Julliard3051b641996-07-05 17:14:13 +00001611 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001612LONG WINAPI GetWindowLong32A( HWND32 hwnd, INT32 offset )
Alexandre Julliard3051b641996-07-05 17:14:13 +00001613{
1614 return WIN_GetWindowLong( hwnd, offset, WIN_PROC_32A );
1615}
1616
1617
1618/**********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001619 * GetWindowLong32W (USER32.306)
Alexandre Julliard3051b641996-07-05 17:14:13 +00001620 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001621LONG WINAPI GetWindowLong32W( HWND32 hwnd, INT32 offset )
Alexandre Julliard3051b641996-07-05 17:14:13 +00001622{
1623 return WIN_GetWindowLong( hwnd, offset, WIN_PROC_32W );
1624}
1625
1626
1627/**********************************************************************
1628 * SetWindowLong16 (USER.136)
1629 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001630LONG WINAPI SetWindowLong16( HWND16 hwnd, INT16 offset, LONG newval )
Alexandre Julliard3051b641996-07-05 17:14:13 +00001631{
1632 return WIN_SetWindowLong( hwnd, offset, newval, WIN_PROC_16 );
1633}
1634
1635
1636/**********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001637 * SetWindowLong32A (USER32.517)
Alexandre Julliard3051b641996-07-05 17:14:13 +00001638 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001639LONG WINAPI SetWindowLong32A( HWND32 hwnd, INT32 offset, LONG newval )
Alexandre Julliard3051b641996-07-05 17:14:13 +00001640{
1641 return WIN_SetWindowLong( hwnd, offset, newval, WIN_PROC_32A );
1642}
1643
1644
1645/**********************************************************************
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001646 * SetWindowLong32W (USER32.518) Set window attribute
1647 *
1648 * SetWindowLong() alters one of a window's attributes or sets a 32-bit (long)
1649 * value in a window's extra memory.
1650 *
1651 * The _hwnd_ parameter specifies the window. is the handle to a
1652 * window that has extra memory. The _newval_ parameter contains the
1653 * new attribute or extra memory value. If positive, the _offset_
1654 * parameter is the byte-addressed location in the window's extra
1655 * memory to set. If negative, _offset_ specifies the window
1656 * attribute to set, and should be one of the following values:
1657 *
1658 * GWL_EXSTYLE The window's extended window style
1659 *
1660 * GWL_STYLE The window's window style.
1661 *
1662 * GWL_WNDPROC Pointer to the window's window procedure.
1663 *
1664 * GWL_HINSTANCE The window's pplication instance handle.
1665 *
1666 * GWL_ID The window's identifier.
1667 *
1668 * GWL_USERDATA The window's user-specified data.
1669 *
1670 * If the window is a dialog box, the _offset_ parameter can be one of
1671 * the following values:
1672 *
1673 * DWL_DLGPROC The address of the window's dialog box procedure.
1674 *
1675 * DWL_MSGRESULT The return value of a message
1676 * that the dialog box procedure processed.
1677 *
1678 * DWL_USER Application specific information.
1679 *
1680 * RETURNS
1681 *
1682 * If successful, returns the previous value located at _offset_. Otherwise,
1683 * returns 0.
1684 *
1685 * NOTES
1686 *
1687 * Extra memory for a window class is specified by a nonzero cbWndExtra
1688 * parameter of the WNDCLASS structure passed to RegisterClass() at the
1689 * time of class creation.
1690 *
1691 * Using GWL_WNDPROC to set a new window procedure effectively creates
1692 * a window subclass. Use CallWindowProc() in the new windows procedure
1693 * to pass messages to the superclass's window procedure.
1694 *
1695 * The user data is reserved for use by the application which created
1696 * the window.
1697 *
1698 * Do not use GWL_STYLE to change the window's WS_DISABLE style;
1699 * instead, call the EnableWindow() function to change the window's
1700 * disabled state.
1701 *
1702 * Do not use GWL_HWNDPARENT to reset the window's parent, use
1703 * SetParent() instead.
1704 *
1705 * BUGS
1706 *
1707 * GWL_STYLE does not dispatch WM_STYLE_... messages.
1708 *
1709 * CONFORMANCE
1710 *
1711 * ECMA-234, Win32
1712 *
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001713 */
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001714LONG WINAPI SetWindowLong32W(
1715 HWND32 hwnd, /* window to alter */
1716 INT32 offset, /* offset, in bytes, of location to alter */
1717 LONG newval /* new value of location */
1718) {
Alexandre Julliard3051b641996-07-05 17:14:13 +00001719 return WIN_SetWindowLong( hwnd, offset, newval, WIN_PROC_32W );
Alexandre Julliarde2abbb11995-03-19 17:39:39 +00001720}
1721
1722
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001723/*******************************************************************
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001724 * GetWindowText16 (USER.36)
Alexandre Julliard0e607781993-11-03 19:23:37 +00001725 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001726INT16 WINAPI GetWindowText16( HWND16 hwnd, SEGPTR lpString, INT16 nMaxCount )
Alexandre Julliard0e607781993-11-03 19:23:37 +00001727{
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001728 return (INT16)SendMessage16(hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString);
Alexandre Julliard0e607781993-11-03 19:23:37 +00001729}
1730
Alexandre Julliarde2abbb11995-03-19 17:39:39 +00001731
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001732/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001733 * GetWindowText32A (USER32.309)
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001734 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001735INT32 WINAPI GetWindowText32A( HWND32 hwnd, LPSTR lpString, INT32 nMaxCount )
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001736{
1737 return (INT32)SendMessage32A( hwnd, WM_GETTEXT, nMaxCount,
1738 (LPARAM)lpString );
1739}
1740
Alexandre Julliardf90efa91998-06-14 15:24:15 +00001741/*******************************************************************
1742 * InternalGetWindowText (USER32.326)
1743 */
1744INT32 WINAPI InternalGetWindowText(HWND32 hwnd,LPWSTR lpString,INT32 nMaxCount )
1745{
Juergen Schmied982f1391998-10-28 14:58:02 +00001746 FIXME(win,"(0x%08x,%p,0x%x),stub!\n",hwnd,lpString,nMaxCount);
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001747 return GetWindowText32W(hwnd,lpString,nMaxCount);
Alexandre Julliardf90efa91998-06-14 15:24:15 +00001748}
1749
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001750
1751/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001752 * GetWindowText32W (USER32.312)
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001753 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001754INT32 WINAPI GetWindowText32W( HWND32 hwnd, LPWSTR lpString, INT32 nMaxCount )
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001755{
1756 return (INT32)SendMessage32W( hwnd, WM_GETTEXT, nMaxCount,
1757 (LPARAM)lpString );
1758}
1759
1760
1761/*******************************************************************
1762 * SetWindowText16 (USER.37)
1763 */
Paul Quinn1beaae51998-12-15 15:38:36 +00001764BOOL16 WINAPI SetWindowText16( HWND16 hwnd, SEGPTR lpString )
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001765{
Paul Quinn1beaae51998-12-15 15:38:36 +00001766 return (BOOL16)SendMessage16( hwnd, WM_SETTEXT, 0, (LPARAM)lpString );
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001767}
1768
1769
1770/*******************************************************************
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001771 * SetWindowText32A (USER32.521)
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001772 */
Paul Quinn1beaae51998-12-15 15:38:36 +00001773BOOL32 WINAPI SetWindowText32A( HWND32 hwnd, LPCSTR lpString )
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001774{
Paul Quinn1beaae51998-12-15 15:38:36 +00001775 return (BOOL32)SendMessage32A( hwnd, WM_SETTEXT, 0, (LPARAM)lpString );
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001776}
1777
1778
1779/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001780 * SetWindowText32W (USER32.523)
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001781 */
Paul Quinn1beaae51998-12-15 15:38:36 +00001782BOOL32 WINAPI SetWindowText32W( HWND32 hwnd, LPCWSTR lpString )
Alexandre Julliard2d93d001996-05-21 15:01:41 +00001783{
Paul Quinn1beaae51998-12-15 15:38:36 +00001784 return (BOOL32)SendMessage32W( hwnd, WM_SETTEXT, 0, (LPARAM)lpString );
Alexandre Julliarde2abbb11995-03-19 17:39:39 +00001785}
1786
1787
Alexandre Julliard0e607781993-11-03 19:23:37 +00001788/*******************************************************************
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001789 * GetWindowTextLength16 (USER.38)
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001790 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001791INT16 WINAPI GetWindowTextLength16( HWND16 hwnd )
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001792{
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001793 return (INT16)SendMessage16( hwnd, WM_GETTEXTLENGTH, 0, 0 );
Alexandre Julliardf0b23541993-09-29 12:21:49 +00001794}
1795
1796
Alexandre Julliard0e607781993-11-03 19:23:37 +00001797/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001798 * GetWindowTextLength32A (USER32.310)
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001799 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001800INT32 WINAPI GetWindowTextLength32A( HWND32 hwnd )
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001801{
1802 return SendMessage32A( hwnd, WM_GETTEXTLENGTH, 0, 0 );
1803}
1804
1805/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001806 * GetWindowTextLength32W (USER32.311)
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001807 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001808INT32 WINAPI GetWindowTextLength32W( HWND32 hwnd )
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001809{
1810 return SendMessage32W( hwnd, WM_GETTEXTLENGTH, 0, 0 );
1811}
1812
Alexandre Julliard21979011997-03-05 08:22:35 +00001813
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001814/*******************************************************************
Alexandre Julliard21979011997-03-05 08:22:35 +00001815 * IsWindow16 (USER.47)
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001816 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001817BOOL16 WINAPI IsWindow16( HWND16 hwnd )
Alexandre Julliard21979011997-03-05 08:22:35 +00001818{
1819 return IsWindow32( hwnd );
1820}
1821
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +00001822void WINAPI WIN16_IsWindow16( CONTEXT *context )
1823{
1824 WORD *stack = PTR_SEG_OFF_TO_LIN(SS_reg(context), SP_reg(context));
1825 HWND16 hwnd = (HWND16)stack[2];
1826
1827 AX_reg(context) = IsWindow32( hwnd );
1828 ES_reg(context) = USER_HeapSel;
1829}
1830
Alexandre Julliard21979011997-03-05 08:22:35 +00001831
1832/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001833 * IsWindow32 (USER32.348)
Alexandre Julliard21979011997-03-05 08:22:35 +00001834 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001835BOOL32 WINAPI IsWindow32( HWND32 hwnd )
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001836{
1837 WND * wndPtr = WIN_FindWndPtr( hwnd );
Alexandre Julliard5f721f81994-01-04 20:14:34 +00001838 return ((wndPtr != NULL) && (wndPtr->dwMagic == WND_MAGIC));
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001839}
1840
1841
1842/*****************************************************************
Alexandre Julliardd1ce8b21996-09-02 16:46:30 +00001843 * GetParent16 (USER.46)
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001844 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001845HWND16 WINAPI GetParent16( HWND16 hwnd )
Alexandre Julliardd1ce8b21996-09-02 16:46:30 +00001846{
1847 return (HWND16)GetParent32( hwnd );
1848}
1849
1850
1851/*****************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001852 * GetParent32 (USER32.278)
Alexandre Julliardd1ce8b21996-09-02 16:46:30 +00001853 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001854HWND32 WINAPI GetParent32( HWND32 hwnd )
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001855{
1856 WND *wndPtr = WIN_FindWndPtr(hwnd);
Alexandre Julliard54c27111998-03-29 19:44:57 +00001857 if ((!wndPtr) || (!(wndPtr->dwStyle & (WS_POPUP|WS_CHILD)))) return 0;
Alexandre Julliard59730ae1996-03-24 16:20:51 +00001858 wndPtr = (wndPtr->dwStyle & WS_CHILD) ? wndPtr->parent : wndPtr->owner;
1859 return wndPtr ? wndPtr->hwndSelf : 0;
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001860}
1861
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001862/*****************************************************************
1863 * WIN_GetTopParent
1864 *
1865 * Get the top-level parent for a child window.
1866 */
1867WND* WIN_GetTopParentPtr( WND* pWnd )
1868{
1869 while( pWnd && (pWnd->dwStyle & WS_CHILD)) pWnd = pWnd->parent;
1870 return pWnd;
1871}
Alexandre Julliarde2991ea1995-07-29 13:09:43 +00001872
1873/*****************************************************************
1874 * WIN_GetTopParent
1875 *
1876 * Get the top-level parent for a child window.
1877 */
Alexandre Julliardac9c9b01996-07-28 18:50:11 +00001878HWND32 WIN_GetTopParent( HWND32 hwnd )
Alexandre Julliarde2991ea1995-07-29 13:09:43 +00001879{
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001880 WND *wndPtr = WIN_GetTopParentPtr ( WIN_FindWndPtr( hwnd ) );
Alexandre Julliard59730ae1996-03-24 16:20:51 +00001881 return wndPtr ? wndPtr->hwndSelf : 0;
Alexandre Julliarde2991ea1995-07-29 13:09:43 +00001882}
1883
1884
Alexandre Julliard940d58c1994-09-16 09:24:37 +00001885/*****************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001886 * SetParent16 (USER.233)
Alexandre Julliard940d58c1994-09-16 09:24:37 +00001887 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001888HWND16 WINAPI SetParent16( HWND16 hwndChild, HWND16 hwndNewParent )
Alexandre Julliard940d58c1994-09-16 09:24:37 +00001889{
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001890 return SetParent32( hwndChild, hwndNewParent );
1891}
Alexandre Julliard940d58c1994-09-16 09:24:37 +00001892
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001893
1894/*****************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001895 * SetParent32 (USER32.495)
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001896 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001897HWND32 WINAPI SetParent32( HWND32 hwndChild, HWND32 hwndNewParent )
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001898{
Patrik Stridvallea584721998-11-01 16:22:07 +00001899 WND *wndPtr = WIN_FindWndPtr( hwndChild );
1900 WND *pWndNewParent =
1901 (hwndNewParent) ? WIN_FindWndPtr( hwndNewParent ) : pWndDesktop;
1902 WND *pWndOldParent =
Marcus Meissnerde12d2a1998-11-22 13:29:29 +00001903 (wndPtr)?(*wndPtr->pDriver->pSetParent)(wndPtr, pWndNewParent):NULL;
Alexandre Julliard940d58c1994-09-16 09:24:37 +00001904
Patrik Stridvallea584721998-11-01 16:22:07 +00001905 return pWndOldParent?pWndOldParent->hwndSelf:0;
Alexandre Julliard940d58c1994-09-16 09:24:37 +00001906}
1907
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001908/*******************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001909 * IsChild16 (USER.48)
Alexandre Julliard0e607781993-11-03 19:23:37 +00001910 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001911BOOL16 WINAPI IsChild16( HWND16 parent, HWND16 child )
Alexandre Julliard01d63461997-01-20 19:43:45 +00001912{
1913 return IsChild32(parent,child);
1914}
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001915
1916
Alexandre Julliard01d63461997-01-20 19:43:45 +00001917/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001918 * IsChild32 (USER32.339)
Alexandre Julliard01d63461997-01-20 19:43:45 +00001919 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001920BOOL32 WINAPI IsChild32( HWND32 parent, HWND32 child )
Alexandre Julliard0e607781993-11-03 19:23:37 +00001921{
Alexandre Julliardfb9a9191994-03-01 19:48:04 +00001922 WND * wndPtr = WIN_FindWndPtr( child );
1923 while (wndPtr && (wndPtr->dwStyle & WS_CHILD))
Alexandre Julliard0e607781993-11-03 19:23:37 +00001924 {
Alexandre Julliard59730ae1996-03-24 16:20:51 +00001925 wndPtr = wndPtr->parent;
1926 if (wndPtr->hwndSelf == parent) return TRUE;
Alexandre Julliardfb9a9191994-03-01 19:48:04 +00001927 }
Alexandre Julliard0e607781993-11-03 19:23:37 +00001928 return FALSE;
1929}
1930
1931
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001932/***********************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001933 * IsWindowVisible16 (USER.49)
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001934 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001935BOOL16 WINAPI IsWindowVisible16( HWND16 hwnd )
Alexandre Julliard01d63461997-01-20 19:43:45 +00001936{
1937 return IsWindowVisible32(hwnd);
1938}
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001939
1940
Alexandre Julliard01d63461997-01-20 19:43:45 +00001941/***********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00001942 * IsWindowVisible32 (USER32.351)
Alexandre Julliard01d63461997-01-20 19:43:45 +00001943 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001944BOOL32 WINAPI IsWindowVisible32( HWND32 hwnd )
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001945{
Alexandre Julliardded30381995-07-06 17:18:27 +00001946 WND *wndPtr = WIN_FindWndPtr( hwnd );
1947 while (wndPtr && (wndPtr->dwStyle & WS_CHILD))
1948 {
1949 if (!(wndPtr->dwStyle & WS_VISIBLE)) return FALSE;
Alexandre Julliard59730ae1996-03-24 16:20:51 +00001950 wndPtr = wndPtr->parent;
Alexandre Julliardded30381995-07-06 17:18:27 +00001951 }
1952 return (wndPtr && (wndPtr->dwStyle & WS_VISIBLE));
Alexandre Julliarde399fc31993-11-24 17:08:56 +00001953}
1954
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001955
Alexandre Julliard1e37a181996-08-18 16:21:52 +00001956/***********************************************************************
1957 * WIN_IsWindowDrawable
Alexandre Julliarddf2673b1997-03-29 17:20:20 +00001958 *
1959 * hwnd is drawable when it is visible, all parents are not
1960 * minimized, and it is itself not minimized unless we are
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001961 * trying to draw its default class icon.
Alexandre Julliard1e37a181996-08-18 16:21:52 +00001962 */
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001963BOOL32 WIN_IsWindowDrawable( WND* wnd, BOOL32 icon )
Alexandre Julliard1e37a181996-08-18 16:21:52 +00001964{
Alexandre Julliarddf2673b1997-03-29 17:20:20 +00001965 if( (wnd->dwStyle & WS_MINIMIZE &&
1966 icon && wnd->class->hIcon) ||
1967 !(wnd->dwStyle & WS_VISIBLE) ) return FALSE;
1968 for(wnd = wnd->parent; wnd; wnd = wnd->parent)
1969 if( wnd->dwStyle & WS_MINIMIZE ||
1970 !(wnd->dwStyle & WS_VISIBLE) ) break;
1971 return (wnd == NULL);
Alexandre Julliard1e37a181996-08-18 16:21:52 +00001972}
1973
Alexandre Julliarddf2673b1997-03-29 17:20:20 +00001974
Alexandre Julliard0e607781993-11-03 19:23:37 +00001975/*******************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001976 * GetTopWindow16 (USER.229)
Alexandre Julliard0e607781993-11-03 19:23:37 +00001977 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001978HWND16 WINAPI GetTopWindow16( HWND16 hwnd )
Alexandre Julliard01d63461997-01-20 19:43:45 +00001979{
1980 return GetTopWindow32(hwnd);
1981}
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001982
1983
Alexandre Julliard01d63461997-01-20 19:43:45 +00001984/*******************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001985 * GetTopWindow32 (USER.229)
Alexandre Julliard01d63461997-01-20 19:43:45 +00001986 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001987HWND32 WINAPI GetTopWindow32( HWND32 hwnd )
Alexandre Julliard0e607781993-11-03 19:23:37 +00001988{
1989 WND * wndPtr = WIN_FindWndPtr( hwnd );
Alexandre Julliard59730ae1996-03-24 16:20:51 +00001990 if (wndPtr && wndPtr->child) return wndPtr->child->hwndSelf;
Alexandre Julliard0e607781993-11-03 19:23:37 +00001991 else return 0;
1992}
1993
1994
1995/*******************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001996 * GetWindow16 (USER.262)
Alexandre Julliard0e607781993-11-03 19:23:37 +00001997 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001998HWND16 WINAPI GetWindow16( HWND16 hwnd, WORD rel )
Alexandre Julliard01d63461997-01-20 19:43:45 +00001999{
2000 return GetWindow32( hwnd,rel );
2001}
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002002
2003
Alexandre Julliard01d63461997-01-20 19:43:45 +00002004/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00002005 * GetWindow32 (USER32.302)
Alexandre Julliard01d63461997-01-20 19:43:45 +00002006 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002007HWND32 WINAPI GetWindow32( HWND32 hwnd, WORD rel )
Alexandre Julliard0e607781993-11-03 19:23:37 +00002008{
2009 WND * wndPtr = WIN_FindWndPtr( hwnd );
2010 if (!wndPtr) return 0;
2011 switch(rel)
2012 {
2013 case GW_HWNDFIRST:
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002014 if (wndPtr->parent) return wndPtr->parent->child->hwndSelf;
Alexandre Julliardfb9a9191994-03-01 19:48:04 +00002015 else return 0;
Alexandre Julliard0e607781993-11-03 19:23:37 +00002016
2017 case GW_HWNDLAST:
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002018 if (!wndPtr->parent) return 0; /* Desktop window */
2019 while (wndPtr->next) wndPtr = wndPtr->next;
2020 return wndPtr->hwndSelf;
Alexandre Julliard0e607781993-11-03 19:23:37 +00002021
2022 case GW_HWNDNEXT:
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002023 if (!wndPtr->next) return 0;
2024 return wndPtr->next->hwndSelf;
Alexandre Julliard0e607781993-11-03 19:23:37 +00002025
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002026 case GW_HWNDPREV:
2027 if (!wndPtr->parent) return 0; /* Desktop window */
2028 wndPtr = wndPtr->parent->child; /* First sibling */
2029 if (wndPtr->hwndSelf == hwnd) return 0; /* First in list */
2030 while (wndPtr->next)
2031 {
2032 if (wndPtr->next->hwndSelf == hwnd) return wndPtr->hwndSelf;
2033 wndPtr = wndPtr->next;
2034 }
2035 return 0;
Alexandre Julliard0e607781993-11-03 19:23:37 +00002036
2037 case GW_OWNER:
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002038 return wndPtr->owner ? wndPtr->owner->hwndSelf : 0;
Alexandre Julliard0e607781993-11-03 19:23:37 +00002039
2040 case GW_CHILD:
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002041 return wndPtr->child ? wndPtr->child->hwndSelf : 0;
Alexandre Julliard0e607781993-11-03 19:23:37 +00002042 }
2043 return 0;
2044}
2045
2046
2047/*******************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002048 * GetNextWindow16 (USER.230)
Alexandre Julliard0e607781993-11-03 19:23:37 +00002049 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002050HWND16 WINAPI GetNextWindow16( HWND16 hwnd, WORD flag )
Alexandre Julliard0e607781993-11-03 19:23:37 +00002051{
2052 if ((flag != GW_HWNDNEXT) && (flag != GW_HWNDPREV)) return 0;
Alexandre Julliard01d63461997-01-20 19:43:45 +00002053 return GetWindow16( hwnd, flag );
Alexandre Julliard0e607781993-11-03 19:23:37 +00002054}
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002055
Alexandre Julliarde2991ea1995-07-29 13:09:43 +00002056/*******************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002057 * ShowOwnedPopups16 (USER.265)
Alexandre Julliarde2991ea1995-07-29 13:09:43 +00002058 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002059void WINAPI ShowOwnedPopups16( HWND16 owner, BOOL16 fShow )
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002060{
2061 ShowOwnedPopups32( owner, fShow );
2062}
2063
2064
2065/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00002066 * ShowOwnedPopups32 (USER32.531)
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002067 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002068BOOL32 WINAPI ShowOwnedPopups32( HWND32 owner, BOOL32 fShow )
Alexandre Julliarde2991ea1995-07-29 13:09:43 +00002069{
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002070 WND *pWnd = pWndDesktop->child;
2071 while (pWnd)
Alexandre Julliarde2991ea1995-07-29 13:09:43 +00002072 {
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002073 if (pWnd->owner && (pWnd->owner->hwndSelf == owner) &&
2074 (pWnd->dwStyle & WS_POPUP))
Alexandre Julliard01d63461997-01-20 19:43:45 +00002075 ShowWindow32( pWnd->hwndSelf, fShow ? SW_SHOW : SW_HIDE );
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002076 pWnd = pWnd->next;
Alexandre Julliarde2991ea1995-07-29 13:09:43 +00002077 }
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002078 return TRUE;
Alexandre Julliarde2991ea1995-07-29 13:09:43 +00002079}
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002080
2081
Alexandre Julliard3a405ba1994-10-30 16:25:19 +00002082/*******************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002083 * GetLastActivePopup16 (USER.287)
Alexandre Julliard3a405ba1994-10-30 16:25:19 +00002084 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002085HWND16 WINAPI GetLastActivePopup16( HWND16 hwnd )
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002086{
2087 return GetLastActivePopup32( hwnd );
2088}
2089
2090/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00002091 * GetLastActivePopup32 (USER32.256)
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002092 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002093HWND32 WINAPI GetLastActivePopup32( HWND32 hwnd )
Alexandre Julliard3a405ba1994-10-30 16:25:19 +00002094{
2095 WND *wndPtr;
2096 wndPtr = WIN_FindWndPtr(hwnd);
2097 if (wndPtr == NULL) return hwnd;
2098 return wndPtr->hwndLastActive;
2099}
2100
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002101
2102/*******************************************************************
Alexandre Julliard3051b641996-07-05 17:14:13 +00002103 * WIN_BuildWinArray
2104 *
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002105 * Build an array of pointers to the children of a given window.
2106 * The array must be freed with HeapFree(SystemHeap). Return NULL
2107 * when no windows are found.
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002108 */
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002109WND **WIN_BuildWinArray( WND *wndPtr, UINT32 bwaFlags, UINT32* pTotal )
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002110{
Alexandre Julliard3051b641996-07-05 17:14:13 +00002111 WND **list, **ppWnd;
2112 WND *pWnd;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002113 UINT32 count, skipOwned, skipHidden;
2114 DWORD skipFlags;
2115
2116 skipHidden = bwaFlags & BWA_SKIPHIDDEN;
2117 skipOwned = bwaFlags & BWA_SKIPOWNED;
2118 skipFlags = (bwaFlags & BWA_SKIPDISABLED) ? WS_DISABLED : 0;
2119 if( bwaFlags & BWA_SKIPICONIC ) skipFlags |= WS_MINIMIZE;
Alexandre Julliard3051b641996-07-05 17:14:13 +00002120
2121 /* First count the windows */
2122
2123 if (!wndPtr) wndPtr = pWndDesktop;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002124 for (pWnd = wndPtr->child, count = 0; pWnd; pWnd = pWnd->next)
2125 {
2126 if( (pWnd->dwStyle & skipFlags) || (skipOwned && pWnd->owner) ) continue;
2127 if( !skipHidden || pWnd->dwStyle & WS_VISIBLE ) count++;
2128 }
Alexandre Julliard3051b641996-07-05 17:14:13 +00002129
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002130 if( count )
2131 {
2132 /* Now build the list of all windows */
Alexandre Julliard3051b641996-07-05 17:14:13 +00002133
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002134 if ((list = (WND **)HeapAlloc( SystemHeap, 0, sizeof(WND *) * (count + 1))))
2135 {
2136 for (pWnd = wndPtr->child, ppWnd = list, count = 0; pWnd; pWnd = pWnd->next)
2137 {
2138 if( (pWnd->dwStyle & skipFlags) || (skipOwned && pWnd->owner) ) continue;
2139 if( !skipHidden || pWnd->dwStyle & WS_VISIBLE )
2140 {
2141 *ppWnd++ = pWnd;
2142 count++;
2143 }
2144 }
2145 *ppWnd = NULL;
2146 }
2147 else count = 0;
2148 } else list = NULL;
2149
2150 if( pTotal ) *pTotal = count;
Alexandre Julliard3051b641996-07-05 17:14:13 +00002151 return list;
2152}
2153
2154
2155/*******************************************************************
2156 * EnumWindows16 (USER.54)
2157 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002158BOOL16 WINAPI EnumWindows16( WNDENUMPROC16 lpEnumFunc, LPARAM lParam )
Alexandre Julliard3051b641996-07-05 17:14:13 +00002159{
2160 WND **list, **ppWnd;
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002161
Alexandre Julliard594997c1995-04-30 10:05:20 +00002162 /* We have to build a list of all windows first, to avoid */
2163 /* unpleasant side-effects, for instance if the callback */
2164 /* function changes the Z-order of the windows. */
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002165
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002166 if (!(list = WIN_BuildWinArray( pWndDesktop, 0, NULL ))) return FALSE;
Alexandre Julliard594997c1995-04-30 10:05:20 +00002167
Alexandre Julliard3051b641996-07-05 17:14:13 +00002168 /* Now call the callback function for every window */
Alexandre Julliard594997c1995-04-30 10:05:20 +00002169
Alexandre Julliard3051b641996-07-05 17:14:13 +00002170 for (ppWnd = list; *ppWnd; ppWnd++)
Alexandre Julliard594997c1995-04-30 10:05:20 +00002171 {
Alexandre Julliard3051b641996-07-05 17:14:13 +00002172 /* Make sure that the window still exists */
Alexandre Julliard21979011997-03-05 08:22:35 +00002173 if (!IsWindow32((*ppWnd)->hwndSelf)) continue;
Alexandre Julliardf1aa3031996-08-05 17:42:43 +00002174 if (!lpEnumFunc( (*ppWnd)->hwndSelf, lParam )) break;
Alexandre Julliard594997c1995-04-30 10:05:20 +00002175 }
Alexandre Julliard3051b641996-07-05 17:14:13 +00002176 HeapFree( SystemHeap, 0, list );
2177 return TRUE;
2178}
2179
2180
2181/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00002182 * EnumWindows32 (USER32.193)
Alexandre Julliard3051b641996-07-05 17:14:13 +00002183 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002184BOOL32 WINAPI EnumWindows32( WNDENUMPROC32 lpEnumFunc, LPARAM lParam )
Alexandre Julliard3051b641996-07-05 17:14:13 +00002185{
Alexandre Julliardf1aa3031996-08-05 17:42:43 +00002186 return (BOOL32)EnumWindows16( (WNDENUMPROC16)lpEnumFunc, lParam );
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002187}
2188
Alexandre Julliard594997c1995-04-30 10:05:20 +00002189
2190/**********************************************************************
Alexandre Julliard3051b641996-07-05 17:14:13 +00002191 * EnumTaskWindows16 (USER.225)
Alexandre Julliard594997c1995-04-30 10:05:20 +00002192 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002193BOOL16 WINAPI EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func,
2194 LPARAM lParam )
Alexandre Julliard594997c1995-04-30 10:05:20 +00002195{
Alexandre Julliard3051b641996-07-05 17:14:13 +00002196 WND **list, **ppWnd;
Alexandre Julliard594997c1995-04-30 10:05:20 +00002197
2198 /* This function is the same as EnumWindows(), */
Per Ångströma47bc3a1998-11-14 17:00:37 +00002199 /* except for an added check on the window's task. */
Alexandre Julliard594997c1995-04-30 10:05:20 +00002200
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002201 if (!(list = WIN_BuildWinArray( pWndDesktop, 0, NULL ))) return FALSE;
Alexandre Julliard594997c1995-04-30 10:05:20 +00002202
Alexandre Julliard3051b641996-07-05 17:14:13 +00002203 /* Now call the callback function for every window */
Alexandre Julliard594997c1995-04-30 10:05:20 +00002204
Alexandre Julliard3051b641996-07-05 17:14:13 +00002205 for (ppWnd = list; *ppWnd; ppWnd++)
Alexandre Julliard594997c1995-04-30 10:05:20 +00002206 {
Alexandre Julliard3051b641996-07-05 17:14:13 +00002207 /* Make sure that the window still exists */
Alexandre Julliard21979011997-03-05 08:22:35 +00002208 if (!IsWindow32((*ppWnd)->hwndSelf)) continue;
Per Ångströma47bc3a1998-11-14 17:00:37 +00002209 if (QUEUE_GetQueueTask((*ppWnd)->hmemTaskQ) != hTask) continue;
Alexandre Julliardf1aa3031996-08-05 17:42:43 +00002210 if (!func( (*ppWnd)->hwndSelf, lParam )) break;
Alexandre Julliard594997c1995-04-30 10:05:20 +00002211 }
Alexandre Julliard3051b641996-07-05 17:14:13 +00002212 HeapFree( SystemHeap, 0, list );
Alexandre Julliard594997c1995-04-30 10:05:20 +00002213 return TRUE;
2214}
2215
2216
Alexandre Julliard3051b641996-07-05 17:14:13 +00002217/**********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00002218 * EnumThreadWindows (USER32.190)
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002219 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002220BOOL32 WINAPI EnumThreadWindows( DWORD id, WNDENUMPROC32 func, LPARAM lParam )
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002221{
Alexandre Julliard0623a6f1998-01-18 18:01:49 +00002222 THDB *tdb = THREAD_ID_TO_THDB(id);
Alexandre Julliard01d63461997-01-20 19:43:45 +00002223
2224 return (BOOL16)EnumTaskWindows16(tdb->teb.htask16, (WNDENUMPROC16)func, lParam);
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002225}
2226
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002227
Alexandre Julliard3051b641996-07-05 17:14:13 +00002228/**********************************************************************
Alexandre Julliardf1aa3031996-08-05 17:42:43 +00002229 * WIN_EnumChildWindows
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002230 *
Alexandre Julliardf1aa3031996-08-05 17:42:43 +00002231 * Helper function for EnumChildWindows().
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002232 */
Alexandre Julliardf1aa3031996-08-05 17:42:43 +00002233static BOOL16 WIN_EnumChildWindows( WND **ppWnd, WNDENUMPROC16 func,
2234 LPARAM lParam )
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002235{
Alexandre Julliard3051b641996-07-05 17:14:13 +00002236 WND **childList;
2237 BOOL16 ret = FALSE;
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002238
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002239 for ( ; *ppWnd; ppWnd++)
Alexandre Julliard3051b641996-07-05 17:14:13 +00002240 {
2241 /* Make sure that the window still exists */
Alexandre Julliard21979011997-03-05 08:22:35 +00002242 if (!IsWindow32((*ppWnd)->hwndSelf)) continue;
Alexandre Julliard3051b641996-07-05 17:14:13 +00002243 /* Build children list first */
Alexandre Julliard85ed45e1998-08-22 19:03:56 +00002244 childList = WIN_BuildWinArray( *ppWnd, BWA_SKIPOWNED, NULL );
2245 ret = func( (*ppWnd)->hwndSelf, lParam );
2246 if (childList)
2247 {
2248 if (ret) ret = WIN_EnumChildWindows( childList, func, lParam );
2249 HeapFree( SystemHeap, 0, childList );
2250 }
Alexandre Julliard3051b641996-07-05 17:14:13 +00002251 if (!ret) return FALSE;
Alexandre Julliard3051b641996-07-05 17:14:13 +00002252 }
2253 return TRUE;
2254}
2255
2256
2257/**********************************************************************
2258 * EnumChildWindows16 (USER.55)
2259 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002260BOOL16 WINAPI EnumChildWindows16( HWND16 parent, WNDENUMPROC16 func,
2261 LPARAM lParam )
Alexandre Julliard3051b641996-07-05 17:14:13 +00002262{
2263 WND **list, *pParent;
2264
2265 if (!(pParent = WIN_FindWndPtr( parent ))) return FALSE;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002266 if (!(list = WIN_BuildWinArray( pParent, BWA_SKIPOWNED, NULL ))) return FALSE;
Alexandre Julliardf1aa3031996-08-05 17:42:43 +00002267 WIN_EnumChildWindows( list, func, lParam );
Alexandre Julliard3051b641996-07-05 17:14:13 +00002268 HeapFree( SystemHeap, 0, list );
2269 return TRUE;
2270}
2271
2272
2273/**********************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00002274 * EnumChildWindows32 (USER32.178)
Alexandre Julliard3051b641996-07-05 17:14:13 +00002275 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002276BOOL32 WINAPI EnumChildWindows32( HWND32 parent, WNDENUMPROC32 func,
2277 LPARAM lParam )
Alexandre Julliard3051b641996-07-05 17:14:13 +00002278{
Alexandre Julliardf1aa3031996-08-05 17:42:43 +00002279 return (BOOL32)EnumChildWindows16( (HWND16)parent, (WNDENUMPROC16)func,
2280 lParam );
Alexandre Julliarddba420a1994-02-02 06:48:31 +00002281}
2282
Alexandre Julliard594997c1995-04-30 10:05:20 +00002283
Alexandre Julliard58199531994-04-21 01:20:00 +00002284/*******************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002285 * AnyPopup16 (USER.52)
Alexandre Julliardd18872d1994-05-11 12:18:19 +00002286 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002287BOOL16 WINAPI AnyPopup16(void)
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002288{
2289 return AnyPopup32();
2290}
2291
2292
2293/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00002294 * AnyPopup32 (USER32.4)
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002295 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002296BOOL32 WINAPI AnyPopup32(void)
Alexandre Julliardd18872d1994-05-11 12:18:19 +00002297{
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002298 WND *wndPtr;
2299 for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next)
2300 if (wndPtr->owner && (wndPtr->dwStyle & WS_VISIBLE)) return TRUE;
2301 return FALSE;
Alexandre Julliardd18872d1994-05-11 12:18:19 +00002302}
2303
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002304
Alexandre Julliard73450d61994-05-18 18:29:32 +00002305/*******************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002306 * FlashWindow16 (USER.105)
Alexandre Julliard73450d61994-05-18 18:29:32 +00002307 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002308BOOL16 WINAPI FlashWindow16( HWND16 hWnd, BOOL16 bInvert )
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002309{
2310 return FlashWindow32( hWnd, bInvert );
2311}
2312
2313
2314/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00002315 * FlashWindow32 (USER32.202)
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002316 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002317BOOL32 WINAPI FlashWindow32( HWND32 hWnd, BOOL32 bInvert )
Alexandre Julliard73450d61994-05-18 18:29:32 +00002318{
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00002319 WND *wndPtr = WIN_FindWndPtr(hWnd);
2320
Alexandre Julliarda69b88b1998-03-15 20:29:56 +00002321 TRACE(win,"%04x\n", hWnd);
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00002322
2323 if (!wndPtr) return FALSE;
2324
2325 if (wndPtr->dwStyle & WS_MINIMIZE)
2326 {
2327 if (bInvert && !(wndPtr->flags & WIN_NCACTIVATED))
2328 {
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00002329 HDC32 hDC = GetDC32(hWnd);
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00002330
Alexandre Julliard530ee841996-10-23 16:59:13 +00002331 if (!SendMessage16( hWnd, WM_ERASEBKGND, (WPARAM16)hDC, 0 ))
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00002332 wndPtr->flags |= WIN_NEEDS_ERASEBKGND;
2333
Alexandre Julliard2c69f6d1996-09-28 18:11:01 +00002334 ReleaseDC32( hWnd, hDC );
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00002335 wndPtr->flags |= WIN_NCACTIVATED;
2336 }
2337 else
2338 {
Alexandre Julliard1e37a181996-08-18 16:21:52 +00002339 PAINT_RedrawWindow( hWnd, 0, 0, RDW_INVALIDATE | RDW_ERASE |
2340 RDW_UPDATENOW | RDW_FRAME, 0 );
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00002341 wndPtr->flags &= ~WIN_NCACTIVATED;
2342 }
2343 return TRUE;
2344 }
2345 else
2346 {
Alexandre Julliard530ee841996-10-23 16:59:13 +00002347 WPARAM16 wparam;
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00002348 if (bInvert) wparam = !(wndPtr->flags & WIN_NCACTIVATED);
Alexandre Julliard01d63461997-01-20 19:43:45 +00002349 else wparam = (hWnd == GetActiveWindow32());
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00002350
Alexandre Julliard2d93d001996-05-21 15:01:41 +00002351 SendMessage16( hWnd, WM_NCACTIVATE, wparam, (LPARAM)0 );
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00002352 return wparam;
2353 }
Alexandre Julliard73450d61994-05-18 18:29:32 +00002354}
2355
Alexandre Julliardd18872d1994-05-11 12:18:19 +00002356
2357/*******************************************************************
Alexandre Julliard18f92e71996-07-17 20:02:21 +00002358 * SetSysModalWindow16 (USER.188)
Alexandre Julliard58199531994-04-21 01:20:00 +00002359 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002360HWND16 WINAPI SetSysModalWindow16( HWND16 hWnd )
Alexandre Julliard58199531994-04-21 01:20:00 +00002361{
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002362 HWND32 hWndOldModal = hwndSysModal;
Alexandre Julliardd4719651995-12-12 18:49:11 +00002363 hwndSysModal = hWnd;
Alexandre Julliarda69b88b1998-03-15 20:29:56 +00002364 FIXME(win, "EMPTY STUB !! SetSysModalWindow(%04x) !\n", hWnd);
Alexandre Julliardd4719651995-12-12 18:49:11 +00002365 return hWndOldModal;
Alexandre Julliard58199531994-04-21 01:20:00 +00002366}
2367
Alexandre Julliardd18872d1994-05-11 12:18:19 +00002368
Alexandre Julliard1d62f6b1994-05-04 19:15:00 +00002369/*******************************************************************
Alexandre Julliard18f92e71996-07-17 20:02:21 +00002370 * GetSysModalWindow16 (USER.52)
Alexandre Julliard1d62f6b1994-05-04 19:15:00 +00002371 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002372HWND16 WINAPI GetSysModalWindow16(void)
Alexandre Julliard1d62f6b1994-05-04 19:15:00 +00002373{
Alexandre Julliardd4719651995-12-12 18:49:11 +00002374 return hwndSysModal;
Alexandre Julliard1d62f6b1994-05-04 19:15:00 +00002375}
Alexandre Julliardade697e1995-11-26 13:59:11 +00002376
Alexandre Julliard18f92e71996-07-17 20:02:21 +00002377
Alexandre Julliardade697e1995-11-26 13:59:11 +00002378/*******************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +00002379 * GetWindowContextHelpId (USER32.303)
2380 */
2381DWORD WINAPI GetWindowContextHelpId( HWND32 hwnd )
2382{
2383 WND *wnd = WIN_FindWndPtr( hwnd );
2384 if (!wnd) return 0;
2385 return wnd->helpContext;
2386}
2387
2388
2389/*******************************************************************
2390 * SetWindowContextHelpId (USER32.515)
2391 */
2392BOOL32 WINAPI SetWindowContextHelpId( HWND32 hwnd, DWORD id )
2393{
2394 WND *wnd = WIN_FindWndPtr( hwnd );
2395 if (!wnd) return FALSE;
2396 wnd->helpContext = id;
2397 return TRUE;
2398}
2399
2400
2401/*******************************************************************
Alexandre Julliardade697e1995-11-26 13:59:11 +00002402 * DRAG_QueryUpdate
2403 *
2404 * recursively find a child that contains spDragInfo->pt point
2405 * and send WM_QUERYDROPOBJECT
2406 */
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002407BOOL16 DRAG_QueryUpdate( HWND32 hQueryWnd, SEGPTR spDragInfo, BOOL32 bNoSend )
Alexandre Julliardade697e1995-11-26 13:59:11 +00002408{
Alexandre Julliard75d86e11996-11-17 18:59:11 +00002409 BOOL16 wParam,bResult = 0;
Alexandre Julliardd37eb361997-07-20 16:23:21 +00002410 POINT32 pt;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002411 LPDRAGINFO ptrDragInfo = (LPDRAGINFO) PTR_SEG_TO_LIN(spDragInfo);
2412 WND *ptrQueryWnd = WIN_FindWndPtr(hQueryWnd),*ptrWnd;
Alexandre Julliardd37eb361997-07-20 16:23:21 +00002413 RECT32 tempRect;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002414
2415 if( !ptrQueryWnd || !ptrDragInfo ) return 0;
2416
Alexandre Julliardd37eb361997-07-20 16:23:21 +00002417 CONV_POINT16TO32( &ptrDragInfo->pt, &pt );
Alexandre Julliardade697e1995-11-26 13:59:11 +00002418
Alexandre Julliardd37eb361997-07-20 16:23:21 +00002419 GetWindowRect32(hQueryWnd,&tempRect);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002420
Alexandre Julliardd37eb361997-07-20 16:23:21 +00002421 if( !PtInRect32(&tempRect,pt) ||
Alexandre Julliardade697e1995-11-26 13:59:11 +00002422 (ptrQueryWnd->dwStyle & WS_DISABLED) )
2423 return 0;
2424
2425 if( !(ptrQueryWnd->dwStyle & WS_MINIMIZE) )
2426 {
2427 tempRect = ptrQueryWnd->rectClient;
2428 if(ptrQueryWnd->dwStyle & WS_CHILD)
Alexandre Julliardd37eb361997-07-20 16:23:21 +00002429 MapWindowPoints32( ptrQueryWnd->parent->hwndSelf, 0,
2430 (LPPOINT32)&tempRect, 2 );
Alexandre Julliardade697e1995-11-26 13:59:11 +00002431
Alexandre Julliardd37eb361997-07-20 16:23:21 +00002432 if (PtInRect32( &tempRect, pt))
Alexandre Julliardade697e1995-11-26 13:59:11 +00002433 {
2434 wParam = 0;
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002435
2436 for (ptrWnd = ptrQueryWnd->child; ptrWnd ;ptrWnd = ptrWnd->next)
2437 if( ptrWnd->dwStyle & WS_VISIBLE )
Alexandre Julliardade697e1995-11-26 13:59:11 +00002438 {
Alexandre Julliardd37eb361997-07-20 16:23:21 +00002439 GetWindowRect32( ptrWnd->hwndSelf, &tempRect );
2440 if (PtInRect32( &tempRect, pt )) break;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002441 }
2442
2443 if(ptrWnd)
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002444 {
Alexandre Julliarda69b88b1998-03-15 20:29:56 +00002445 TRACE(msg,"hwnd = %04x, %d %d - %d %d\n",
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002446 ptrWnd->hwndSelf, ptrWnd->rectWindow.left, ptrWnd->rectWindow.top,
2447 ptrWnd->rectWindow.right, ptrWnd->rectWindow.bottom );
2448 if( !(ptrWnd->dwStyle & WS_DISABLED) )
Alexandre Julliard75d86e11996-11-17 18:59:11 +00002449 bResult = DRAG_QueryUpdate(ptrWnd->hwndSelf, spDragInfo, bNoSend);
Alexandre Julliard59730ae1996-03-24 16:20:51 +00002450 }
Alexandre Julliardade697e1995-11-26 13:59:11 +00002451
2452 if(bResult) return bResult;
2453 }
2454 else wParam = 1;
2455 }
2456 else wParam = 1;
2457
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00002458 ScreenToClient16(hQueryWnd,&ptrDragInfo->pt);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002459
2460 ptrDragInfo->hScope = hQueryWnd;
2461
Alexandre Julliard75d86e11996-11-17 18:59:11 +00002462 bResult = ( bNoSend )
2463 ? ptrQueryWnd->dwExStyle & WS_EX_ACCEPTFILES
2464 : SendMessage16( hQueryWnd ,WM_QUERYDROPOBJECT ,
Alexandre Julliard530ee841996-10-23 16:59:13 +00002465 (WPARAM16)wParam ,(LPARAM) spDragInfo );
Alexandre Julliardade697e1995-11-26 13:59:11 +00002466 if( !bResult )
Alexandre Julliardd37eb361997-07-20 16:23:21 +00002467 CONV_POINT32TO16( &pt, &ptrDragInfo->pt );
Alexandre Julliardade697e1995-11-26 13:59:11 +00002468
2469 return bResult;
2470}
2471
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002472
Alexandre Julliardade697e1995-11-26 13:59:11 +00002473/*******************************************************************
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002474 * DragDetect (USER.465)
Alexandre Julliardade697e1995-11-26 13:59:11 +00002475 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002476BOOL16 WINAPI DragDetect16( HWND16 hWnd, POINT16 pt )
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002477{
2478 POINT32 pt32;
2479 CONV_POINT16TO32( &pt, &pt32 );
2480 return DragDetect32( hWnd, pt32 );
2481}
2482
2483/*******************************************************************
Alexandre Julliarda11d7b11998-03-01 20:05:02 +00002484 * DragDetect32 (USER32.151)
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002485 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002486BOOL32 WINAPI DragDetect32( HWND32 hWnd, POINT32 pt )
Alexandre Julliardade697e1995-11-26 13:59:11 +00002487{
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002488 MSG16 msg;
2489 RECT16 rect;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002490
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002491 rect.left = pt.x - wDragWidth;
2492 rect.right = pt.x + wDragWidth;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002493
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002494 rect.top = pt.y - wDragHeight;
2495 rect.bottom = pt.y + wDragHeight;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002496
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002497 SetCapture32(hWnd);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002498
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002499 while(1)
2500 {
2501 while(PeekMessage16(&msg ,0 ,WM_MOUSEFIRST ,WM_MOUSELAST ,PM_REMOVE))
2502 {
2503 if( msg.message == WM_LBUTTONUP )
2504 {
2505 ReleaseCapture();
2506 return 0;
2507 }
2508 if( msg.message == WM_MOUSEMOVE )
2509 {
2510 if( !PtInRect16( &rect, MAKEPOINT16(msg.lParam) ) )
Alexandre Julliardade697e1995-11-26 13:59:11 +00002511 {
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002512 ReleaseCapture();
2513 return 1;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002514 }
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002515 }
2516 }
2517 WaitMessage();
2518 }
2519 return 0;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002520}
2521
2522/******************************************************************************
Alexandre Julliard21979011997-03-05 08:22:35 +00002523 * DragObject16 (USER.464)
Alexandre Julliardade697e1995-11-26 13:59:11 +00002524 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00002525DWORD WINAPI DragObject16( HWND16 hwndScope, HWND16 hWnd, UINT16 wObj,
2526 HANDLE16 hOfStruct, WORD szList, HCURSOR16 hCursor )
Alexandre Julliardade697e1995-11-26 13:59:11 +00002527{
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002528 MSG16 msg;
2529 LPDRAGINFO lpDragInfo;
2530 SEGPTR spDragInfo;
2531 HCURSOR16 hDragCursor=0, hOldCursor=0, hBummer=0;
2532 HGLOBAL16 hDragInfo = GlobalAlloc16( GMEM_SHARE | GMEM_ZEROINIT, 2*sizeof(DRAGINFO));
2533 WND *wndPtr = WIN_FindWndPtr(hWnd);
2534 HCURSOR16 hCurrentCursor = 0;
2535 HWND16 hCurrentWnd = 0;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002536
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002537 lpDragInfo = (LPDRAGINFO) GlobalLock16(hDragInfo);
2538 spDragInfo = (SEGPTR) WIN16_GlobalLock16(hDragInfo);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002539
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002540 if( !lpDragInfo || !spDragInfo ) return 0L;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002541
Alexandre Julliardc7c217b1998-04-13 12:21:30 +00002542 hBummer = LoadCursor16(0, IDC_BUMMER16);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002543
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002544 if( !hBummer || !wndPtr )
2545 {
Alexandre Julliard1285c2f1996-05-06 16:06:24 +00002546 GlobalFree16(hDragInfo);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002547 return 0L;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002548 }
Alexandre Julliardade697e1995-11-26 13:59:11 +00002549
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002550 if(hCursor)
2551 {
Alexandre Julliard75d86e11996-11-17 18:59:11 +00002552 if( !(hDragCursor = CURSORICON_IconToCursor(hCursor, FALSE)) )
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002553 {
2554 GlobalFree16(hDragInfo);
2555 return 0L;
2556 }
Alexandre Julliardade697e1995-11-26 13:59:11 +00002557
2558 if( hDragCursor == hCursor ) hDragCursor = 0;
2559 else hCursor = hDragCursor;
2560
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00002561 hOldCursor = SetCursor32(hDragCursor);
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002562 }
Alexandre Julliardade697e1995-11-26 13:59:11 +00002563
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002564 lpDragInfo->hWnd = hWnd;
2565 lpDragInfo->hScope = 0;
2566 lpDragInfo->wFlags = wObj;
2567 lpDragInfo->hList = szList; /* near pointer! */
2568 lpDragInfo->hOfStruct = hOfStruct;
2569 lpDragInfo->l = 0L;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002570
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002571 SetCapture32(hWnd);
2572 ShowCursor32( TRUE );
Alexandre Julliardade697e1995-11-26 13:59:11 +00002573
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002574 do
2575 {
2576 do{ WaitMessage(); }
2577 while( !PeekMessage16(&msg,0,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE) );
Alexandre Julliardade697e1995-11-26 13:59:11 +00002578
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002579 *(lpDragInfo+1) = *lpDragInfo;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002580
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002581 lpDragInfo->pt = msg.pt;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002582
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002583 /* update DRAGINFO struct */
Alexandre Julliarda69b88b1998-03-15 20:29:56 +00002584 TRACE(msg,"lpDI->hScope = %04x\n",lpDragInfo->hScope);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002585
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002586 if( DRAG_QueryUpdate(hwndScope, spDragInfo, FALSE) > 0 )
2587 hCurrentCursor = hCursor;
2588 else
Alexandre Julliardade697e1995-11-26 13:59:11 +00002589 {
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002590 hCurrentCursor = hBummer;
2591 lpDragInfo->hScope = 0;
Alexandre Julliardade697e1995-11-26 13:59:11 +00002592 }
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002593 if( hCurrentCursor )
2594 SetCursor32(hCurrentCursor);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002595
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002596 /* send WM_DRAGLOOP */
2597 SendMessage16( hWnd, WM_DRAGLOOP, (WPARAM16)(hCurrentCursor != hBummer),
2598 (LPARAM) spDragInfo );
2599 /* send WM_DRAGSELECT or WM_DRAGMOVE */
2600 if( hCurrentWnd != lpDragInfo->hScope )
Alexandre Julliardade697e1995-11-26 13:59:11 +00002601 {
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002602 if( hCurrentWnd )
2603 SendMessage16( hCurrentWnd, WM_DRAGSELECT, 0,
Alexandre Julliardade697e1995-11-26 13:59:11 +00002604 (LPARAM)MAKELONG(LOWORD(spDragInfo)+sizeof(DRAGINFO),
2605 HIWORD(spDragInfo)) );
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002606 hCurrentWnd = lpDragInfo->hScope;
2607 if( hCurrentWnd )
2608 SendMessage16( hCurrentWnd, WM_DRAGSELECT, 1, (LPARAM)spDragInfo);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002609 }
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002610 else
2611 if( hCurrentWnd )
2612 SendMessage16( hCurrentWnd, WM_DRAGMOVE, 0, (LPARAM)spDragInfo);
2613
2614 } while( msg.message != WM_LBUTTONUP && msg.message != WM_NCLBUTTONUP );
2615
2616 ReleaseCapture();
2617 ShowCursor32( FALSE );
2618
2619 if( hCursor )
2620 {
2621 SetCursor32( hOldCursor );
2622 if (hDragCursor) DestroyCursor32( hDragCursor );
2623 }
2624
2625 if( hCurrentCursor != hBummer )
2626 msg.lParam = SendMessage16( lpDragInfo->hScope, WM_DROPOBJECT,
2627 (WPARAM16)hWnd, (LPARAM)spDragInfo );
Alexandre Julliardade697e1995-11-26 13:59:11 +00002628 else
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002629 msg.lParam = 0;
2630 GlobalFree16(hDragInfo);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002631
Alexandre Julliard23946ad1997-06-16 17:43:53 +00002632 return (DWORD)(msg.lParam);
Alexandre Julliardade697e1995-11-26 13:59:11 +00002633}