Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Window position related functions. |
| 3 | * |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 4 | * Copyright 1993, 1994, 1995 Alexandre Julliard |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 5 | * 1995, 1996, 1999 Alex Korobka |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 6 | */ |
| 7 | |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 8 | #include <string.h> |
Jeremy White | d3e22d9 | 2000-02-10 19:03:02 +0000 | [diff] [blame] | 9 | #include "windef.h" |
| 10 | #include "wingdi.h" |
Michael Veksler | 9d14a00 | 1999-05-08 12:40:24 +0000 | [diff] [blame] | 11 | #include "wine/winuser16.h" |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 12 | #include "heap.h" |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 13 | #include "module.h" |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 14 | #include "user.h" |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 15 | #include "region.h" |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 16 | #include "win.h" |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 17 | #include "hook.h" |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 18 | #include "message.h" |
Alexandre Julliard | b817f4f | 1996-03-14 18:08:34 +0000 | [diff] [blame] | 19 | #include "queue.h" |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 20 | #include "options.h" |
Ulrich Weigand | 1babe5b | 1998-12-24 15:16:08 +0000 | [diff] [blame] | 21 | #include "task.h" |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 22 | #include "winpos.h" |
Alexandre Julliard | 1e9ac79 | 1996-06-06 18:38:27 +0000 | [diff] [blame] | 23 | #include "dce.h" |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 24 | #include "nonclient.h" |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 25 | #include "debugtools.h" |
Patrik Stridvall | 8d8703c | 1999-02-04 14:05:38 +0000 | [diff] [blame] | 26 | #include "local.h" |
| 27 | #include "ldt.h" |
Lionel Ulmer | acc7467 | 1999-11-07 21:25:57 +0000 | [diff] [blame] | 28 | #include "input.h" |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 29 | |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 30 | DEFAULT_DEBUG_CHANNEL(win) |
| 31 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 32 | #define HAS_DLGFRAME(style,exStyle) \ |
| 33 | (((exStyle) & WS_EX_DLGMODALFRAME) || \ |
| 34 | (((style) & WS_DLGFRAME) && !((style) & WS_BORDER))) |
| 35 | |
| 36 | #define HAS_THICKFRAME(style) \ |
| 37 | (((style) & WS_THICKFRAME) && \ |
| 38 | !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME)) |
| 39 | |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 40 | #define SWP_AGG_NOGEOMETRYCHANGE \ |
| 41 | (SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE) |
| 42 | #define SWP_AGG_NOPOSCHANGE \ |
| 43 | (SWP_AGG_NOGEOMETRYCHANGE | SWP_NOZORDER) |
| 44 | #define SWP_AGG_STATUSFLAGS \ |
| 45 | (SWP_AGG_NOPOSCHANGE | SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_SHOWWINDOW) |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 46 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 47 | #define EMPTYPOINT(pt) ((*(LONG*)&(pt)) == -1) |
| 48 | |
| 49 | #define PLACE_MIN 0x0001 |
| 50 | #define PLACE_MAX 0x0002 |
| 51 | #define PLACE_RECT 0x0004 |
| 52 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 53 | #define SWP_EX_NOCOPY 0x0001 |
| 54 | #define SWP_EX_PAINTSELF 0x0002 |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 55 | #define SWP_EX_NONCLIENT 0x0004 |
Alexandre Julliard | 1e37a18 | 1996-08-18 16:21:52 +0000 | [diff] [blame] | 56 | |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 57 | #define MINMAX_NOSWP 0x00010000 |
| 58 | |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 59 | /* ----- internal variables ----- */ |
| 60 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 61 | static HWND hwndPrevActive = 0; /* Previously active window */ |
| 62 | static HWND hGlobalShellWindow=0; /*the shell*/ |
Juergen Schmied | ddb2e29 | 1999-05-02 09:19:19 +0000 | [diff] [blame] | 63 | static HWND hGlobalTaskmanWindow=0; |
| 64 | static HWND hGlobalProgmanWindow=0; |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 65 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 66 | static LPCSTR atomInternalPos; |
| 67 | |
Stephane Lussier | 1c4786f | 1999-01-28 10:54:11 +0000 | [diff] [blame] | 68 | extern HQUEUE16 hActiveQueue; |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 69 | |
| 70 | /*********************************************************************** |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 71 | * WINPOS_CreateInternalPosAtom |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 72 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 73 | BOOL WINPOS_CreateInternalPosAtom() |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 74 | { |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 75 | LPSTR str = "SysIP"; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 76 | atomInternalPos = (LPCSTR)(DWORD)GlobalAddAtomA(str); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 77 | return (atomInternalPos) ? TRUE : FALSE; |
| 78 | } |
| 79 | |
| 80 | /*********************************************************************** |
| 81 | * WINPOS_CheckInternalPos |
| 82 | * |
| 83 | * Called when a window is destroyed. |
| 84 | */ |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 85 | void WINPOS_CheckInternalPos( WND* wndPtr ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 86 | { |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 87 | LPINTERNALPOS lpPos; |
| 88 | MESSAGEQUEUE *pMsgQ = 0; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 89 | HWND hwnd = wndPtr->hwndSelf; |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 90 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 91 | lpPos = (LPINTERNALPOS) GetPropA( hwnd, atomInternalPos ); |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 92 | |
| 93 | /* Retrieve the message queue associated with this window */ |
| 94 | pMsgQ = (MESSAGEQUEUE *)QUEUE_Lock( wndPtr->hmemTaskQ ); |
| 95 | if ( !pMsgQ ) |
| 96 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 97 | WARN("\tMessage queue not found. Exiting!\n" ); |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 98 | return; |
| 99 | } |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 100 | |
| 101 | if( hwnd == hwndPrevActive ) hwndPrevActive = 0; |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 102 | |
| 103 | if( hwnd == PERQDATA_GetActiveWnd( pMsgQ->pQData ) ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 104 | { |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 105 | PERQDATA_SetActiveWnd( pMsgQ->pQData, 0 ); |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 106 | WARN("\tattempt to activate destroyed window!\n"); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 107 | } |
| 108 | |
| 109 | if( lpPos ) |
| 110 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 111 | if( IsWindow(lpPos->hwndIconTitle) ) |
| 112 | DestroyWindow( lpPos->hwndIconTitle ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 113 | HeapFree( SystemHeap, 0, lpPos ); |
| 114 | } |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 115 | |
| 116 | QUEUE_Unlock( pMsgQ ); |
| 117 | return; |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 118 | } |
| 119 | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 120 | /*********************************************************************** |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 121 | * WINPOS_FindIconPos |
| 122 | * |
| 123 | * Find a suitable place for an iconic window. |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 124 | */ |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 125 | static POINT16 WINPOS_FindIconPos( WND* wndPtr, POINT16 pt ) |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 126 | { |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 127 | RECT16 rectParent; |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 128 | short x, y, xspacing, yspacing; |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 129 | |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 130 | GetClientRect16( wndPtr->parent->hwndSelf, &rectParent ); |
Marcus Meissner | ddca315 | 1999-05-22 11:33:23 +0000 | [diff] [blame] | 131 | if ((pt.x >= rectParent.left) && (pt.x + GetSystemMetrics(SM_CXICON) < rectParent.right) && |
| 132 | (pt.y >= rectParent.top) && (pt.y + GetSystemMetrics(SM_CYICON) < rectParent.bottom)) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 133 | return pt; /* The icon already has a suitable position */ |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 134 | |
Marcus Meissner | ddca315 | 1999-05-22 11:33:23 +0000 | [diff] [blame] | 135 | xspacing = GetSystemMetrics(SM_CXICONSPACING); |
| 136 | yspacing = GetSystemMetrics(SM_CYICONSPACING); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 137 | |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 138 | y = rectParent.bottom; |
| 139 | for (;;) |
| 140 | { |
Huw D M Davies | be89816 | 1999-12-25 22:51:19 +0000 | [diff] [blame] | 141 | x = rectParent.left; |
| 142 | do |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 143 | { |
| 144 | /* Check if another icon already occupies this spot */ |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 145 | WND *childPtr = WIN_LockWndPtr(wndPtr->parent->child); |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 146 | while (childPtr) |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 147 | { |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 148 | if ((childPtr->dwStyle & WS_MINIMIZE) && (childPtr != wndPtr)) |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 149 | { |
| 150 | if ((childPtr->rectWindow.left < x + xspacing) && |
| 151 | (childPtr->rectWindow.right >= x) && |
| 152 | (childPtr->rectWindow.top <= y) && |
| 153 | (childPtr->rectWindow.bottom > y - yspacing)) |
| 154 | break; /* There's a window in there */ |
| 155 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 156 | WIN_UpdateWndPtr(&childPtr,childPtr->next); |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 157 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 158 | WIN_ReleaseWndPtr(childPtr); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 159 | if (!childPtr) /* No window was found, so it's OK for us */ |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 160 | { |
Marcus Meissner | ddca315 | 1999-05-22 11:33:23 +0000 | [diff] [blame] | 161 | pt.x = x + (xspacing - GetSystemMetrics(SM_CXICON)) / 2; |
| 162 | pt.y = y - (yspacing + GetSystemMetrics(SM_CYICON)) / 2; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 163 | return pt; |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 164 | } |
Huw D M Davies | be89816 | 1999-12-25 22:51:19 +0000 | [diff] [blame] | 165 | x += xspacing; |
| 166 | } while(x <= rectParent.right-xspacing); |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 167 | y -= yspacing; |
| 168 | } |
| 169 | } |
| 170 | |
| 171 | |
| 172 | /*********************************************************************** |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 173 | * ArrangeIconicWindows16 (USER.170) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 174 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 175 | UINT16 WINAPI ArrangeIconicWindows16( HWND16 parent) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 176 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 177 | return ArrangeIconicWindows(parent); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 178 | } |
| 179 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 180 | * ArrangeIconicWindows (USER32.7) |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 181 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 182 | UINT WINAPI ArrangeIconicWindows( HWND parent ) |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 183 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 184 | RECT rectParent; |
| 185 | HWND hwndChild; |
| 186 | INT x, y, xspacing, yspacing; |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 187 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 188 | GetClientRect( parent, &rectParent ); |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 189 | x = rectParent.left; |
| 190 | y = rectParent.bottom; |
Marcus Meissner | ddca315 | 1999-05-22 11:33:23 +0000 | [diff] [blame] | 191 | xspacing = GetSystemMetrics(SM_CXICONSPACING); |
| 192 | yspacing = GetSystemMetrics(SM_CYICONSPACING); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 193 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 194 | hwndChild = GetWindow( parent, GW_CHILD ); |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 195 | while (hwndChild) |
| 196 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 197 | if( IsIconic( hwndChild ) ) |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 198 | { |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 199 | WND *wndPtr = WIN_FindWndPtr(hwndChild); |
| 200 | |
| 201 | WINPOS_ShowIconTitle( wndPtr, FALSE ); |
| 202 | |
Marcus Meissner | ddca315 | 1999-05-22 11:33:23 +0000 | [diff] [blame] | 203 | SetWindowPos( hwndChild, 0, x + (xspacing - GetSystemMetrics(SM_CXICON)) / 2, |
| 204 | y - yspacing - GetSystemMetrics(SM_CYICON)/2, 0, 0, |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 205 | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 206 | if( IsWindow(hwndChild) ) |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 207 | WINPOS_ShowIconTitle(wndPtr , TRUE ); |
| 208 | WIN_ReleaseWndPtr(wndPtr); |
| 209 | |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 210 | if (x <= rectParent.right - xspacing) x += xspacing; |
| 211 | else |
| 212 | { |
| 213 | x = rectParent.left; |
| 214 | y -= yspacing; |
| 215 | } |
| 216 | } |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 217 | hwndChild = GetWindow( hwndChild, GW_HWNDNEXT ); |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 218 | } |
| 219 | return yspacing; |
| 220 | } |
| 221 | |
| 222 | |
| 223 | /*********************************************************************** |
Alexandre Julliard | df2673b | 1997-03-29 17:20:20 +0000 | [diff] [blame] | 224 | * SwitchToThisWindow16 (USER.172) |
| 225 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 226 | void WINAPI SwitchToThisWindow16( HWND16 hwnd, BOOL16 restore ) |
Alexandre Julliard | df2673b | 1997-03-29 17:20:20 +0000 | [diff] [blame] | 227 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 228 | SwitchToThisWindow( hwnd, restore ); |
Alexandre Julliard | df2673b | 1997-03-29 17:20:20 +0000 | [diff] [blame] | 229 | } |
| 230 | |
| 231 | |
| 232 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 233 | * SwitchToThisWindow (USER32.539) |
Alexandre Julliard | df2673b | 1997-03-29 17:20:20 +0000 | [diff] [blame] | 234 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 235 | void WINAPI SwitchToThisWindow( HWND hwnd, BOOL restore ) |
Alexandre Julliard | df2673b | 1997-03-29 17:20:20 +0000 | [diff] [blame] | 236 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 237 | ShowWindow( hwnd, restore ? SW_RESTORE : SW_SHOWMINIMIZED ); |
Alexandre Julliard | df2673b | 1997-03-29 17:20:20 +0000 | [diff] [blame] | 238 | } |
| 239 | |
| 240 | |
| 241 | /*********************************************************************** |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 242 | * GetWindowRect16 (USER.32) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 243 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 244 | void WINAPI GetWindowRect16( HWND16 hwnd, LPRECT16 rect ) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 245 | { |
| 246 | WND * wndPtr = WIN_FindWndPtr( hwnd ); |
| 247 | if (!wndPtr) return; |
| 248 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 249 | CONV_RECT32TO16( &wndPtr->rectWindow, rect ); |
Alexandre Julliard | fb9a919 | 1994-03-01 19:48:04 +0000 | [diff] [blame] | 250 | if (wndPtr->dwStyle & WS_CHILD) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 251 | MapWindowPoints16( wndPtr->parent->hwndSelf, 0, (POINT16 *)rect, 2 ); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 252 | WIN_ReleaseWndPtr(wndPtr); |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 253 | } |
| 254 | |
| 255 | |
| 256 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 257 | * GetWindowRect (USER32.308) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 258 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 259 | BOOL WINAPI GetWindowRect( HWND hwnd, LPRECT rect ) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 260 | { |
| 261 | WND * wndPtr = WIN_FindWndPtr( hwnd ); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 262 | if (!wndPtr) return FALSE; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 263 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 264 | *rect = wndPtr->rectWindow; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 265 | if (wndPtr->dwStyle & WS_CHILD) |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 266 | MapWindowPoints( wndPtr->parent->hwndSelf, 0, (POINT *)rect, 2 ); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 267 | WIN_ReleaseWndPtr(wndPtr); |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 268 | return TRUE; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 269 | } |
| 270 | |
| 271 | |
| 272 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 273 | * GetWindowRgn |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 274 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 275 | BOOL WINAPI GetWindowRgn ( HWND hwnd, HRGN hrgn ) |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 276 | |
| 277 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 278 | RECT rect; |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 279 | WND * wndPtr = WIN_FindWndPtr( hwnd ); |
| 280 | if (!wndPtr) return (ERROR); |
| 281 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 282 | FIXME("GetWindowRgn: doesn't really do regions\n"); |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 283 | |
| 284 | memset (&rect, 0, sizeof(rect)); |
| 285 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 286 | GetWindowRect ( hwnd, &rect ); |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 287 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 288 | FIXME("Check whether a valid region here\n"); |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 289 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 290 | SetRectRgn ( hrgn, rect.left, rect.top, rect.right, rect.bottom ); |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 291 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 292 | WIN_ReleaseWndPtr(wndPtr); |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 293 | return (SIMPLEREGION); |
| 294 | } |
| 295 | |
| 296 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 297 | * SetWindowRgn |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 298 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 299 | INT WINAPI SetWindowRgn( HWND hwnd, HRGN hrgn,BOOL bRedraw) |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 300 | |
| 301 | { |
| 302 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 303 | FIXME("SetWindowRgn: stub\n"); |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 304 | return TRUE; |
| 305 | } |
| 306 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 307 | /*********************************************************************** |
| 308 | * SetWindowRgn16 |
| 309 | */ |
| 310 | INT16 WINAPI SetWindowRgn16( HWND16 hwnd, HRGN16 hrgn,BOOL16 bRedraw) |
| 311 | |
| 312 | { |
| 313 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 314 | FIXME("SetWindowRgn16: stub\n"); |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 315 | return TRUE; |
| 316 | } |
| 317 | |
Alexandre Julliard | 46ea8b3 | 1998-05-03 19:01:20 +0000 | [diff] [blame] | 318 | |
| 319 | /*********************************************************************** |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 320 | * GetClientRect16 (USER.33) |
| 321 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 322 | void WINAPI GetClientRect16( HWND16 hwnd, LPRECT16 rect ) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 323 | { |
| 324 | WND * wndPtr = WIN_FindWndPtr( hwnd ); |
| 325 | |
| 326 | rect->left = rect->top = rect->right = rect->bottom = 0; |
| 327 | if (wndPtr) |
| 328 | { |
| 329 | rect->right = wndPtr->rectClient.right - wndPtr->rectClient.left; |
| 330 | rect->bottom = wndPtr->rectClient.bottom - wndPtr->rectClient.top; |
| 331 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 332 | WIN_ReleaseWndPtr(wndPtr); |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 333 | } |
| 334 | |
| 335 | |
| 336 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 337 | * GetClientRect (USER.220) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 338 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 339 | BOOL WINAPI GetClientRect( HWND hwnd, LPRECT rect ) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 340 | { |
| 341 | WND * wndPtr = WIN_FindWndPtr( hwnd ); |
| 342 | |
| 343 | rect->left = rect->top = rect->right = rect->bottom = 0; |
Eric Pouech | b9544f1 | 1999-02-14 14:09:42 +0000 | [diff] [blame] | 344 | if (!wndPtr) return FALSE; |
| 345 | rect->right = wndPtr->rectClient.right - wndPtr->rectClient.left; |
| 346 | rect->bottom = wndPtr->rectClient.bottom - wndPtr->rectClient.top; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 347 | |
| 348 | WIN_ReleaseWndPtr(wndPtr); |
Eric Pouech | b9544f1 | 1999-02-14 14:09:42 +0000 | [diff] [blame] | 349 | return TRUE; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 350 | } |
| 351 | |
| 352 | |
| 353 | /******************************************************************* |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 354 | * ClientToScreen16 (USER.28) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 355 | */ |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 356 | void WINAPI ClientToScreen16( HWND16 hwnd, LPPOINT16 lppnt ) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 357 | { |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 358 | MapWindowPoints16( hwnd, 0, lppnt, 1 ); |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 359 | } |
| 360 | |
| 361 | |
| 362 | /******************************************************************* |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 363 | * ClientToScreen (USER32.52) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 364 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 365 | BOOL WINAPI ClientToScreen( HWND hwnd, LPPOINT lppnt ) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 366 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 367 | MapWindowPoints( hwnd, 0, lppnt, 1 ); |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 368 | return TRUE; |
| 369 | } |
| 370 | |
| 371 | |
| 372 | /******************************************************************* |
| 373 | * ScreenToClient16 (USER.29) |
| 374 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 375 | void WINAPI ScreenToClient16( HWND16 hwnd, LPPOINT16 lppnt ) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 376 | { |
| 377 | MapWindowPoints16( 0, hwnd, lppnt, 1 ); |
| 378 | } |
| 379 | |
| 380 | |
| 381 | /******************************************************************* |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 382 | * ScreenToClient (USER32.447) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 383 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 384 | BOOL WINAPI ScreenToClient( HWND hwnd, LPPOINT lppnt ) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 385 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 386 | MapWindowPoints( 0, hwnd, lppnt, 1 ); |
Eric Pouech | b9544f1 | 1999-02-14 14:09:42 +0000 | [diff] [blame] | 387 | return TRUE; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 388 | } |
| 389 | |
| 390 | |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 391 | /*********************************************************************** |
| 392 | * WINPOS_WindowFromPoint |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 393 | * |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 394 | * Find the window and hittest for a given point. |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 395 | */ |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 396 | INT16 WINPOS_WindowFromPoint( WND* wndScope, POINT16 pt, WND **ppWnd ) |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 397 | { |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 398 | WND *wndPtr; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 399 | INT16 hittest = HTERROR; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 400 | INT16 retvalue; |
Alexandre Julliard | 84c70f5 | 1997-05-09 08:40:27 +0000 | [diff] [blame] | 401 | POINT16 xy = pt; |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 402 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 403 | *ppWnd = NULL; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 404 | wndPtr = WIN_LockWndPtr(wndScope->child); |
| 405 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 406 | if( wndScope->flags & WIN_MANAGED ) |
| 407 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 408 | /* In managed mode we have to check wndScope first as it is also |
| 409 | * a window which received the mouse event. */ |
| 410 | |
| 411 | if( wndScope->dwStyle & WS_DISABLED ) |
| 412 | { |
| 413 | retvalue = HTERROR; |
| 414 | goto end; |
| 415 | } |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 416 | if( pt.x < wndScope->rectClient.left || pt.x >= wndScope->rectClient.right || |
| 417 | pt.y < wndScope->rectClient.top || pt.y >= wndScope->rectClient.bottom ) |
| 418 | goto hittest; |
| 419 | } |
Alexandre Julliard | 84c70f5 | 1997-05-09 08:40:27 +0000 | [diff] [blame] | 420 | MapWindowPoints16( GetDesktopWindow16(), wndScope->hwndSelf, &xy, 1 ); |
| 421 | |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 422 | for (;;) |
| 423 | { |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 424 | while (wndPtr) |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 425 | { |
| 426 | /* If point is in window, and window is visible, and it */ |
| 427 | /* is enabled (or it's a top-level window), then explore */ |
| 428 | /* its children. Otherwise, go to the next window. */ |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 429 | |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 430 | if ((wndPtr->dwStyle & WS_VISIBLE) && |
| 431 | (!(wndPtr->dwStyle & WS_DISABLED) || |
| 432 | ((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) != WS_CHILD)) && |
Alexandre Julliard | 84c70f5 | 1997-05-09 08:40:27 +0000 | [diff] [blame] | 433 | (xy.x >= wndPtr->rectWindow.left) && |
| 434 | (xy.x < wndPtr->rectWindow.right) && |
| 435 | (xy.y >= wndPtr->rectWindow.top) && |
| 436 | (xy.y < wndPtr->rectWindow.bottom)) |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 437 | { |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 438 | *ppWnd = wndPtr; /* Got a suitable window */ |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 439 | |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 440 | /* If window is minimized or disabled, return at once */ |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 441 | if (wndPtr->dwStyle & WS_MINIMIZE) |
| 442 | { |
| 443 | retvalue = HTCAPTION; |
| 444 | goto end; |
| 445 | } |
| 446 | if (wndPtr->dwStyle & WS_DISABLED) |
| 447 | { |
| 448 | retvalue = HTERROR; |
| 449 | goto end; |
| 450 | } |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 451 | |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 452 | /* If point is not in client area, ignore the children */ |
Alexandre Julliard | 84c70f5 | 1997-05-09 08:40:27 +0000 | [diff] [blame] | 453 | if ((xy.x < wndPtr->rectClient.left) || |
| 454 | (xy.x >= wndPtr->rectClient.right) || |
| 455 | (xy.y < wndPtr->rectClient.top) || |
| 456 | (xy.y >= wndPtr->rectClient.bottom)) break; |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 457 | |
Alexandre Julliard | 84c70f5 | 1997-05-09 08:40:27 +0000 | [diff] [blame] | 458 | xy.x -= wndPtr->rectClient.left; |
| 459 | xy.y -= wndPtr->rectClient.top; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 460 | WIN_UpdateWndPtr(&wndPtr,wndPtr->child); |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 461 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 462 | else |
| 463 | { |
| 464 | WIN_UpdateWndPtr(&wndPtr,wndPtr->next); |
| 465 | } |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 466 | } |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 467 | |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 468 | hittest: |
Alexandre Julliard | 84c70f5 | 1997-05-09 08:40:27 +0000 | [diff] [blame] | 469 | /* If nothing found, try the scope window */ |
| 470 | if (!*ppWnd) *ppWnd = wndScope; |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 471 | |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 472 | /* Send the WM_NCHITTEST message (only if to the same task) */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 473 | if ((*ppWnd)->hmemTaskQ == GetFastQueue16()) |
Alexandre Julliard | 84c70f5 | 1997-05-09 08:40:27 +0000 | [diff] [blame] | 474 | { |
| 475 | hittest = (INT16)SendMessage16( (*ppWnd)->hwndSelf, WM_NCHITTEST, |
| 476 | 0, MAKELONG( pt.x, pt.y ) ); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 477 | if (hittest != HTTRANSPARENT) |
| 478 | { |
| 479 | retvalue = hittest; /* Found the window */ |
| 480 | goto end; |
Alexandre Julliard | 84c70f5 | 1997-05-09 08:40:27 +0000 | [diff] [blame] | 481 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 482 | } |
| 483 | else |
| 484 | { |
| 485 | retvalue = HTCLIENT; |
| 486 | goto end; |
| 487 | } |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 488 | |
Alexandre Julliard | 84c70f5 | 1997-05-09 08:40:27 +0000 | [diff] [blame] | 489 | /* If no children found in last search, make point relative to parent */ |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 490 | if (!wndPtr) |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 491 | { |
Alexandre Julliard | 84c70f5 | 1997-05-09 08:40:27 +0000 | [diff] [blame] | 492 | xy.x += (*ppWnd)->rectClient.left; |
| 493 | xy.y += (*ppWnd)->rectClient.top; |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 494 | } |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 495 | |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 496 | /* Restart the search from the next sibling */ |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 497 | WIN_UpdateWndPtr(&wndPtr,(*ppWnd)->next); |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 498 | *ppWnd = (*ppWnd)->parent; |
Alexandre Julliard | 0c126c7 | 1996-02-18 18:44:41 +0000 | [diff] [blame] | 499 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 500 | |
| 501 | end: |
| 502 | WIN_ReleaseWndPtr(wndPtr); |
| 503 | return retvalue; |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 504 | } |
| 505 | |
| 506 | |
| 507 | /******************************************************************* |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 508 | * WindowFromPoint16 (USER.30) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 509 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 510 | HWND16 WINAPI WindowFromPoint16( POINT16 pt ) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 511 | { |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 512 | WND *pWnd; |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 513 | WINPOS_WindowFromPoint( WIN_GetDesktop(), pt, &pWnd ); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 514 | WIN_ReleaseDesktop(); |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 515 | return pWnd->hwndSelf; |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 516 | } |
| 517 | |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 518 | |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 519 | /******************************************************************* |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 520 | * WindowFromPoint (USER32.582) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 521 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 522 | HWND WINAPI WindowFromPoint( POINT pt ) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 523 | { |
| 524 | WND *pWnd; |
| 525 | POINT16 pt16; |
| 526 | CONV_POINT32TO16( &pt, &pt16 ); |
Alexandre Julliard | 75d86e1 | 1996-11-17 18:59:11 +0000 | [diff] [blame] | 527 | WINPOS_WindowFromPoint( WIN_GetDesktop(), pt16, &pWnd ); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 528 | WIN_ReleaseDesktop(); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 529 | return (HWND)pWnd->hwndSelf; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 530 | } |
| 531 | |
| 532 | |
| 533 | /******************************************************************* |
| 534 | * ChildWindowFromPoint16 (USER.191) |
| 535 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 536 | HWND16 WINAPI ChildWindowFromPoint16( HWND16 hwndParent, POINT16 pt ) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 537 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 538 | POINT pt32; |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 539 | CONV_POINT16TO32( &pt, &pt32 ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 540 | return (HWND16)ChildWindowFromPoint( hwndParent, pt32 ); |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 541 | } |
| 542 | |
| 543 | |
| 544 | /******************************************************************* |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 545 | * ChildWindowFromPoint (USER32.49) |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 546 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 547 | HWND WINAPI ChildWindowFromPoint( HWND hwndParent, POINT pt ) |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 548 | { |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 549 | /* pt is in the client coordinates */ |
| 550 | |
| 551 | WND* wnd = WIN_FindWndPtr(hwndParent); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 552 | RECT rect; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 553 | HWND retvalue; |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 554 | |
| 555 | if( !wnd ) return 0; |
| 556 | |
| 557 | /* get client rect fast */ |
| 558 | rect.top = rect.left = 0; |
| 559 | rect.right = wnd->rectClient.right - wnd->rectClient.left; |
| 560 | rect.bottom = wnd->rectClient.bottom - wnd->rectClient.top; |
| 561 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 562 | if (!PtInRect( &rect, pt )) |
| 563 | { |
| 564 | retvalue = 0; |
| 565 | goto end; |
| 566 | } |
| 567 | WIN_UpdateWndPtr(&wnd,wnd->child); |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 568 | while ( wnd ) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 569 | { |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 570 | if (PtInRect( &wnd->rectWindow, pt )) |
| 571 | { |
| 572 | retvalue = wnd->hwndSelf; |
| 573 | goto end; |
| 574 | } |
| 575 | WIN_UpdateWndPtr(&wnd,wnd->next); |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 576 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 577 | retvalue = hwndParent; |
| 578 | end: |
| 579 | WIN_ReleaseWndPtr(wnd); |
| 580 | return retvalue; |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 581 | } |
| 582 | |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 583 | /******************************************************************* |
| 584 | * ChildWindowFromPointEx16 (USER.50) |
| 585 | */ |
| 586 | HWND16 WINAPI ChildWindowFromPointEx16( HWND16 hwndParent, POINT16 pt, UINT16 uFlags) |
| 587 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 588 | POINT pt32; |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 589 | CONV_POINT16TO32( &pt, &pt32 ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 590 | return (HWND16)ChildWindowFromPointEx( hwndParent, pt32, uFlags ); |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 591 | } |
| 592 | |
| 593 | |
| 594 | /******************************************************************* |
| 595 | * ChildWindowFromPointEx32 (USER32.50) |
| 596 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 597 | HWND WINAPI ChildWindowFromPointEx( HWND hwndParent, POINT pt, |
| 598 | UINT uFlags) |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 599 | { |
| 600 | /* pt is in the client coordinates */ |
| 601 | |
| 602 | WND* wnd = WIN_FindWndPtr(hwndParent); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 603 | RECT rect; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 604 | HWND retvalue; |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 605 | |
| 606 | if( !wnd ) return 0; |
| 607 | |
| 608 | /* get client rect fast */ |
| 609 | rect.top = rect.left = 0; |
| 610 | rect.right = wnd->rectClient.right - wnd->rectClient.left; |
| 611 | rect.bottom = wnd->rectClient.bottom - wnd->rectClient.top; |
| 612 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 613 | if (!PtInRect( &rect, pt )) |
| 614 | { |
| 615 | retvalue = 0; |
| 616 | goto end; |
| 617 | } |
| 618 | WIN_UpdateWndPtr(&wnd,wnd->child); |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 619 | |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 620 | while ( wnd ) |
| 621 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 622 | if (PtInRect( &wnd->rectWindow, pt )) { |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 623 | if ( (uFlags & CWP_SKIPINVISIBLE) && |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 624 | !(wnd->dwStyle & WS_VISIBLE) ); |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 625 | else if ( (uFlags & CWP_SKIPDISABLED) && |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 626 | (wnd->dwStyle & WS_DISABLED) ); |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 627 | else if ( (uFlags & CWP_SKIPTRANSPARENT) && |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 628 | (wnd->dwExStyle & WS_EX_TRANSPARENT) ); |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 629 | else |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 630 | { |
| 631 | retvalue = wnd->hwndSelf; |
| 632 | goto end; |
| 633 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 634 | |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 635 | } |
Francis Beaudet | d9a3d70 | 1999-05-13 18:43:15 +0000 | [diff] [blame] | 636 | WIN_UpdateWndPtr(&wnd,wnd->next); |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 637 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 638 | retvalue = hwndParent; |
| 639 | end: |
| 640 | WIN_ReleaseWndPtr(wnd); |
| 641 | return retvalue; |
Paul Quinn | eede6b0 | 1998-11-30 13:15:36 +0000 | [diff] [blame] | 642 | } |
| 643 | |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 644 | |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 645 | /******************************************************************* |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 646 | * WINPOS_GetWinOffset |
| 647 | * |
| 648 | * Calculate the offset between the origin of the two windows. Used |
| 649 | * to implement MapWindowPoints. |
| 650 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 651 | static void WINPOS_GetWinOffset( HWND hwndFrom, HWND hwndTo, |
| 652 | POINT *offset ) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 653 | { |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 654 | WND * wndPtr = 0; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 655 | |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 656 | offset->x = offset->y = 0; |
| 657 | if (hwndFrom == hwndTo ) return; |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 658 | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 659 | /* Translate source window origin to screen coords */ |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 660 | if (hwndFrom) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 661 | { |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 662 | if (!(wndPtr = WIN_FindWndPtr( hwndFrom ))) |
| 663 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 664 | ERR("bad hwndFrom = %04x\n",hwndFrom); |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 665 | return; |
| 666 | } |
| 667 | while (wndPtr->parent) |
| 668 | { |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 669 | offset->x += wndPtr->rectClient.left; |
| 670 | offset->y += wndPtr->rectClient.top; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 671 | WIN_UpdateWndPtr(&wndPtr,wndPtr->parent); |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 672 | } |
Francois Boisvert | 3a3cd9f | 1999-03-28 12:42:52 +0000 | [diff] [blame] | 673 | WIN_ReleaseWndPtr(wndPtr); |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 674 | } |
| 675 | |
| 676 | /* Translate origin to destination window coords */ |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 677 | if (hwndTo) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 678 | { |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 679 | if (!(wndPtr = WIN_FindWndPtr( hwndTo ))) |
| 680 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 681 | ERR("bad hwndTo = %04x\n", hwndTo ); |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 682 | return; |
| 683 | } |
| 684 | while (wndPtr->parent) |
| 685 | { |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 686 | offset->x -= wndPtr->rectClient.left; |
| 687 | offset->y -= wndPtr->rectClient.top; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 688 | WIN_UpdateWndPtr(&wndPtr,wndPtr->parent); |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 689 | } |
Francois Boisvert | 3a3cd9f | 1999-03-28 12:42:52 +0000 | [diff] [blame] | 690 | WIN_ReleaseWndPtr(wndPtr); |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 691 | } |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 692 | } |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 693 | |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 694 | |
| 695 | /******************************************************************* |
| 696 | * MapWindowPoints16 (USER.258) |
| 697 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 698 | void WINAPI MapWindowPoints16( HWND16 hwndFrom, HWND16 hwndTo, |
| 699 | LPPOINT16 lppt, UINT16 count ) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 700 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 701 | POINT offset; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 702 | |
| 703 | WINPOS_GetWinOffset( hwndFrom, hwndTo, &offset ); |
| 704 | while (count--) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 705 | { |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 706 | lppt->x += offset.x; |
| 707 | lppt->y += offset.y; |
| 708 | lppt++; |
| 709 | } |
| 710 | } |
| 711 | |
| 712 | |
| 713 | /******************************************************************* |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 714 | * MapWindowPoints (USER32.386) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 715 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 716 | INT WINAPI MapWindowPoints( HWND hwndFrom, HWND hwndTo, |
| 717 | LPPOINT lppt, UINT count ) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 718 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 719 | POINT offset; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 720 | |
| 721 | WINPOS_GetWinOffset( hwndFrom, hwndTo, &offset ); |
| 722 | while (count--) |
| 723 | { |
| 724 | lppt->x += offset.x; |
| 725 | lppt->y += offset.y; |
| 726 | lppt++; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 727 | } |
Eric Pouech | b9544f1 | 1999-02-14 14:09:42 +0000 | [diff] [blame] | 728 | return MAKELONG( LOWORD(offset.x), LOWORD(offset.y) ); |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 729 | } |
| 730 | |
| 731 | |
| 732 | /*********************************************************************** |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 733 | * IsIconic16 (USER.31) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 734 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 735 | BOOL16 WINAPI IsIconic16(HWND16 hWnd) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 736 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 737 | return IsIconic(hWnd); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 738 | } |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 739 | |
| 740 | |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 741 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 742 | * IsIconic (USER32.345) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 743 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 744 | BOOL WINAPI IsIconic(HWND hWnd) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 745 | { |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 746 | BOOL retvalue; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 747 | WND * wndPtr = WIN_FindWndPtr(hWnd); |
| 748 | if (wndPtr == NULL) return FALSE; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 749 | retvalue = (wndPtr->dwStyle & WS_MINIMIZE) != 0; |
| 750 | WIN_ReleaseWndPtr(wndPtr); |
| 751 | return retvalue; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 752 | } |
| 753 | |
| 754 | |
| 755 | /*********************************************************************** |
| 756 | * IsZoomed (USER.272) |
| 757 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 758 | BOOL16 WINAPI IsZoomed16(HWND16 hWnd) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 759 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 760 | return IsZoomed(hWnd); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 761 | } |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 762 | |
| 763 | |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 764 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 765 | * IsZoomed (USER.352) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 766 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 767 | BOOL WINAPI IsZoomed(HWND hWnd) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 768 | { |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 769 | BOOL retvalue; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 770 | WND * wndPtr = WIN_FindWndPtr(hWnd); |
| 771 | if (wndPtr == NULL) return FALSE; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 772 | retvalue = (wndPtr->dwStyle & WS_MAXIMIZE) != 0; |
| 773 | WIN_ReleaseWndPtr(wndPtr); |
| 774 | return retvalue; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 775 | } |
| 776 | |
| 777 | |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 778 | /******************************************************************* |
| 779 | * GetActiveWindow (USER.60) |
| 780 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 781 | HWND16 WINAPI GetActiveWindow16(void) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 782 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 783 | return (HWND16)GetActiveWindow(); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 784 | } |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 785 | |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 786 | /******************************************************************* |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 787 | * GetActiveWindow (USER32.205) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 788 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 789 | HWND WINAPI GetActiveWindow(void) |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 790 | { |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 791 | MESSAGEQUEUE *pCurMsgQ = 0; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 792 | HWND hwndActive = 0; |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 793 | |
| 794 | /* Get the messageQ for the current thread */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 795 | if (!(pCurMsgQ = (MESSAGEQUEUE *)QUEUE_Lock( GetFastQueue16() ))) |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 796 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 797 | WARN("\tCurrent message queue not found. Exiting!\n" ); |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 798 | return 0; |
| 799 | } |
| 800 | |
| 801 | /* Return the current active window from the perQ data of the current message Q */ |
| 802 | hwndActive = PERQDATA_GetActiveWnd( pCurMsgQ->pQData ); |
| 803 | |
| 804 | QUEUE_Unlock( pCurMsgQ ); |
| 805 | return hwndActive; |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 806 | } |
| 807 | |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 808 | |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 809 | /******************************************************************* |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 810 | * WINPOS_CanActivate |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 811 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 812 | static BOOL WINPOS_CanActivate(WND* pWnd) |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 813 | { |
Abey George | 983f90a | 1999-10-13 15:43:45 +0000 | [diff] [blame] | 814 | if( pWnd && !(pWnd->dwStyle & (WS_DISABLED | WS_CHILD)) ) return TRUE; |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 815 | return FALSE; |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 816 | } |
| 817 | |
| 818 | |
| 819 | /******************************************************************* |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 820 | * SetActiveWindow16 (USER.59) |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 821 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 822 | HWND16 WINAPI SetActiveWindow16( HWND16 hwnd ) |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 823 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 824 | return SetActiveWindow(hwnd); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 825 | } |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 826 | |
| 827 | |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 828 | /******************************************************************* |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 829 | * SetActiveWindow (USER32.463) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 830 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 831 | HWND WINAPI SetActiveWindow( HWND hwnd ) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 832 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 833 | HWND prev = 0; |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 834 | WND *wndPtr = WIN_FindWndPtr( hwnd ); |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 835 | MESSAGEQUEUE *pMsgQ = 0, *pCurMsgQ = 0; |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 836 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 837 | if ( !WINPOS_CanActivate(wndPtr) ) |
| 838 | { |
| 839 | prev = 0; |
| 840 | goto end; |
| 841 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 842 | |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 843 | /* Get the messageQ for the current thread */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 844 | if (!(pCurMsgQ = (MESSAGEQUEUE *)QUEUE_Lock( GetFastQueue16() ))) |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 845 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 846 | WARN("\tCurrent message queue not found. Exiting!\n" ); |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 847 | goto CLEANUP; |
| 848 | } |
| 849 | |
| 850 | /* Retrieve the message queue associated with this window */ |
| 851 | pMsgQ = (MESSAGEQUEUE *)QUEUE_Lock( wndPtr->hmemTaskQ ); |
| 852 | if ( !pMsgQ ) |
| 853 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 854 | WARN("\tWindow message queue not found. Exiting!\n" ); |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 855 | goto CLEANUP; |
| 856 | } |
| 857 | |
| 858 | /* Make sure that the window is associated with the calling threads |
| 859 | * message queue. It must share the same perQ data. |
| 860 | */ |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 861 | |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 862 | if ( pCurMsgQ->pQData != pMsgQ->pQData ) |
| 863 | goto CLEANUP; |
| 864 | |
| 865 | /* Save current active window */ |
| 866 | prev = PERQDATA_GetActiveWnd( pMsgQ->pQData ); |
| 867 | |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 868 | WINPOS_SetActiveWindow( hwnd, 0, 0 ); |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 869 | |
| 870 | CLEANUP: |
| 871 | /* Unlock the queues before returning */ |
| 872 | if ( pMsgQ ) |
| 873 | QUEUE_Unlock( pMsgQ ); |
| 874 | if ( pCurMsgQ ) |
| 875 | QUEUE_Unlock( pCurMsgQ ); |
| 876 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 877 | end: |
| 878 | WIN_ReleaseWndPtr(wndPtr); |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 879 | return prev; |
| 880 | } |
| 881 | |
| 882 | |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 883 | /******************************************************************* |
| 884 | * GetForegroundWindow16 (USER.608) |
| 885 | */ |
| 886 | HWND16 WINAPI GetForegroundWindow16(void) |
| 887 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 888 | return (HWND16)GetForegroundWindow(); |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 889 | } |
| 890 | |
| 891 | |
| 892 | /******************************************************************* |
| 893 | * SetForegroundWindow16 (USER.609) |
| 894 | */ |
| 895 | BOOL16 WINAPI SetForegroundWindow16( HWND16 hwnd ) |
| 896 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 897 | return SetForegroundWindow( hwnd ); |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 898 | } |
| 899 | |
| 900 | |
| 901 | /******************************************************************* |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 902 | * GetForegroundWindow (USER32.241) |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 903 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 904 | HWND WINAPI GetForegroundWindow(void) |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 905 | { |
Ulrich Weigand | b38e1de | 1999-06-12 06:42:20 +0000 | [diff] [blame] | 906 | HWND hwndActive = 0; |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 907 | |
Ulrich Weigand | b38e1de | 1999-06-12 06:42:20 +0000 | [diff] [blame] | 908 | /* Get the foreground window (active window of hActiveQueue) */ |
| 909 | if ( hActiveQueue ) |
| 910 | { |
| 911 | MESSAGEQUEUE *pActiveQueue = QUEUE_Lock( hActiveQueue ); |
| 912 | if ( pActiveQueue ) |
| 913 | hwndActive = PERQDATA_GetActiveWnd( pActiveQueue->pQData ); |
| 914 | |
| 915 | QUEUE_Unlock( pActiveQueue ); |
| 916 | } |
| 917 | |
| 918 | return hwndActive; |
| 919 | } |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 920 | |
| 921 | /******************************************************************* |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 922 | * SetForegroundWindow (USER32.482) |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 923 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 924 | BOOL WINAPI SetForegroundWindow( HWND hwnd ) |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 925 | { |
Ulrich Weigand | b38e1de | 1999-06-12 06:42:20 +0000 | [diff] [blame] | 926 | return WINPOS_ChangeActiveWindow( hwnd, FALSE ); |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 927 | } |
| 928 | |
| 929 | |
| 930 | /******************************************************************* |
| 931 | * GetShellWindow16 (USER.600) |
| 932 | */ |
| 933 | HWND16 WINAPI GetShellWindow16(void) |
| 934 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 935 | return GetShellWindow(); |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 936 | } |
| 937 | |
Alexandre Julliard | e658d82 | 1997-11-30 17:45:40 +0000 | [diff] [blame] | 938 | /******************************************************************* |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 939 | * SetShellWindow (USER32.504) |
Alexandre Julliard | e658d82 | 1997-11-30 17:45:40 +0000 | [diff] [blame] | 940 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 941 | HWND WINAPI SetShellWindow(HWND hwndshell) |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 942 | { WARN("(hWnd=%08x) semi stub\n",hwndshell ); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 943 | |
| 944 | hGlobalShellWindow = hwndshell; |
| 945 | return hGlobalShellWindow; |
Alexandre Julliard | e658d82 | 1997-11-30 17:45:40 +0000 | [diff] [blame] | 946 | } |
| 947 | |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 948 | |
| 949 | /******************************************************************* |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 950 | * GetShellWindow (USER32.287) |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 951 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 952 | HWND WINAPI GetShellWindow(void) |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 953 | { WARN("(hWnd=%x) semi stub\n",hGlobalShellWindow ); |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 954 | |
| 955 | return hGlobalShellWindow; |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 956 | } |
| 957 | |
| 958 | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 959 | /*********************************************************************** |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 960 | * BringWindowToTop16 (USER.45) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 961 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 962 | BOOL16 WINAPI BringWindowToTop16( HWND16 hwnd ) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 963 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 964 | return BringWindowToTop(hwnd); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 965 | } |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 966 | |
| 967 | |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 968 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 969 | * BringWindowToTop (USER32.11) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 970 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 971 | BOOL WINAPI BringWindowToTop( HWND hwnd ) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 972 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 973 | return SetWindowPos( hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE ); |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 974 | } |
| 975 | |
| 976 | |
| 977 | /*********************************************************************** |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 978 | * MoveWindow16 (USER.56) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 979 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 980 | BOOL16 WINAPI MoveWindow16( HWND16 hwnd, INT16 x, INT16 y, INT16 cx, INT16 cy, |
| 981 | BOOL16 repaint ) |
| 982 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 983 | return MoveWindow(hwnd,x,y,cx,cy,repaint); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 984 | } |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 985 | |
| 986 | |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 987 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 988 | * MoveWindow (USER32.399) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 989 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 990 | BOOL WINAPI MoveWindow( HWND hwnd, INT x, INT y, INT cx, INT cy, |
| 991 | BOOL repaint ) |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 992 | { |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 993 | int flags = SWP_NOZORDER | SWP_NOACTIVATE; |
| 994 | if (!repaint) flags |= SWP_NOREDRAW; |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 995 | TRACE("%04x %d,%d %dx%d %d\n", |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 996 | hwnd, x, y, cx, cy, repaint ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 997 | return SetWindowPos( hwnd, 0, x, y, cx, cy, flags ); |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 998 | } |
| 999 | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1000 | /*********************************************************************** |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1001 | * WINPOS_InitInternalPos |
| 1002 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1003 | static LPINTERNALPOS WINPOS_InitInternalPos( WND* wnd, POINT pt, |
| 1004 | LPRECT restoreRect ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1005 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1006 | LPINTERNALPOS lpPos = (LPINTERNALPOS) GetPropA( wnd->hwndSelf, |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1007 | atomInternalPos ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1008 | if( !lpPos ) |
| 1009 | { |
| 1010 | /* this happens when the window is minimized/maximized |
| 1011 | * for the first time (rectWindow is not adjusted yet) */ |
| 1012 | |
| 1013 | lpPos = HeapAlloc( SystemHeap, 0, sizeof(INTERNALPOS) ); |
| 1014 | if( !lpPos ) return NULL; |
| 1015 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1016 | SetPropA( wnd->hwndSelf, atomInternalPos, (HANDLE)lpPos ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1017 | lpPos->hwndIconTitle = 0; /* defer until needs to be shown */ |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1018 | CONV_RECT32TO16( &wnd->rectWindow, &lpPos->rectNormal ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1019 | *(UINT*)&lpPos->ptIconPos = *(UINT*)&lpPos->ptMaxPos = 0xFFFFFFFF; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1020 | } |
| 1021 | |
| 1022 | if( wnd->dwStyle & WS_MINIMIZE ) |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1023 | CONV_POINT32TO16( &pt, &lpPos->ptIconPos ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1024 | else if( wnd->dwStyle & WS_MAXIMIZE ) |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1025 | CONV_POINT32TO16( &pt, &lpPos->ptMaxPos ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1026 | else if( restoreRect ) |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1027 | CONV_RECT32TO16( restoreRect, &lpPos->rectNormal ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1028 | |
| 1029 | return lpPos; |
| 1030 | } |
| 1031 | |
| 1032 | /*********************************************************************** |
| 1033 | * WINPOS_RedrawIconTitle |
| 1034 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1035 | BOOL WINPOS_RedrawIconTitle( HWND hWnd ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1036 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1037 | LPINTERNALPOS lpPos = (LPINTERNALPOS)GetPropA( hWnd, atomInternalPos ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1038 | if( lpPos ) |
| 1039 | { |
| 1040 | if( lpPos->hwndIconTitle ) |
| 1041 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1042 | SendMessageA( lpPos->hwndIconTitle, WM_SHOWWINDOW, TRUE, 0); |
| 1043 | InvalidateRect( lpPos->hwndIconTitle, NULL, TRUE ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1044 | return TRUE; |
| 1045 | } |
| 1046 | } |
| 1047 | return FALSE; |
| 1048 | } |
| 1049 | |
| 1050 | /*********************************************************************** |
| 1051 | * WINPOS_ShowIconTitle |
| 1052 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1053 | BOOL WINPOS_ShowIconTitle( WND* pWnd, BOOL bShow ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1054 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1055 | LPINTERNALPOS lpPos = (LPINTERNALPOS)GetPropA( pWnd->hwndSelf, atomInternalPos ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1056 | |
| 1057 | if( lpPos && !(pWnd->flags & WIN_MANAGED)) |
| 1058 | { |
| 1059 | HWND16 hWnd = lpPos->hwndIconTitle; |
| 1060 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 1061 | TRACE("0x%04x %i\n", pWnd->hwndSelf, (bShow != 0) ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1062 | |
| 1063 | if( !hWnd ) |
| 1064 | lpPos->hwndIconTitle = hWnd = ICONTITLE_Create( pWnd ); |
| 1065 | if( bShow ) |
| 1066 | { |
Eric Pouech | 6cf348d | 1999-05-22 19:20:02 +0000 | [diff] [blame] | 1067 | if( ( pWnd = WIN_FindWndPtr(hWnd) ) != NULL) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1068 | { |
Eric Pouech | 6cf348d | 1999-05-22 19:20:02 +0000 | [diff] [blame] | 1069 | if( !(pWnd->dwStyle & WS_VISIBLE) ) |
| 1070 | { |
| 1071 | SendMessageA( hWnd, WM_SHOWWINDOW, TRUE, 0 ); |
| 1072 | SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | |
| 1073 | SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW ); |
| 1074 | } |
| 1075 | WIN_ReleaseWndPtr(pWnd); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1076 | } |
| 1077 | } |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1078 | else ShowWindow( hWnd, SW_HIDE ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1079 | } |
| 1080 | return FALSE; |
| 1081 | } |
| 1082 | |
| 1083 | /******************************************************************* |
| 1084 | * WINPOS_GetMinMaxInfo |
| 1085 | * |
| 1086 | * Get the minimized and maximized information for a window. |
| 1087 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1088 | void WINPOS_GetMinMaxInfo( WND *wndPtr, POINT *maxSize, POINT *maxPos, |
| 1089 | POINT *minTrack, POINT *maxTrack ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1090 | { |
| 1091 | LPINTERNALPOS lpPos; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1092 | MINMAXINFO MinMax; |
| 1093 | INT xinc, yinc; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1094 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1095 | /* Compute default values */ |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1096 | |
Marcus Meissner | ddca315 | 1999-05-22 11:33:23 +0000 | [diff] [blame] | 1097 | MinMax.ptMaxSize.x = GetSystemMetrics(SM_CXSCREEN); |
| 1098 | MinMax.ptMaxSize.y = GetSystemMetrics(SM_CYSCREEN); |
| 1099 | MinMax.ptMinTrackSize.x = GetSystemMetrics(SM_CXMINTRACK); |
| 1100 | MinMax.ptMinTrackSize.y = GetSystemMetrics(SM_CYMINTRACK); |
| 1101 | MinMax.ptMaxTrackSize.x = GetSystemMetrics(SM_CXSCREEN); |
| 1102 | MinMax.ptMaxTrackSize.y = GetSystemMetrics(SM_CYSCREEN); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1103 | |
| 1104 | if (wndPtr->flags & WIN_MANAGED) xinc = yinc = 0; |
| 1105 | else if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) |
| 1106 | { |
Marcus Meissner | ddca315 | 1999-05-22 11:33:23 +0000 | [diff] [blame] | 1107 | xinc = GetSystemMetrics(SM_CXDLGFRAME); |
| 1108 | yinc = GetSystemMetrics(SM_CYDLGFRAME); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1109 | } |
| 1110 | else |
| 1111 | { |
| 1112 | xinc = yinc = 0; |
| 1113 | if (HAS_THICKFRAME(wndPtr->dwStyle)) |
| 1114 | { |
Marcus Meissner | ddca315 | 1999-05-22 11:33:23 +0000 | [diff] [blame] | 1115 | xinc += GetSystemMetrics(SM_CXFRAME); |
| 1116 | yinc += GetSystemMetrics(SM_CYFRAME); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1117 | } |
| 1118 | if (wndPtr->dwStyle & WS_BORDER) |
| 1119 | { |
Marcus Meissner | ddca315 | 1999-05-22 11:33:23 +0000 | [diff] [blame] | 1120 | xinc += GetSystemMetrics(SM_CXBORDER); |
| 1121 | yinc += GetSystemMetrics(SM_CYBORDER); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1122 | } |
| 1123 | } |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1124 | MinMax.ptMaxSize.x += 2 * xinc; |
| 1125 | MinMax.ptMaxSize.y += 2 * yinc; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1126 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1127 | lpPos = (LPINTERNALPOS)GetPropA( wndPtr->hwndSelf, atomInternalPos ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1128 | if( lpPos && !EMPTYPOINT(lpPos->ptMaxPos) ) |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1129 | CONV_POINT16TO32( &lpPos->ptMaxPos, &MinMax.ptMaxPosition ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1130 | else |
| 1131 | { |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1132 | MinMax.ptMaxPosition.x = -xinc; |
| 1133 | MinMax.ptMaxPosition.y = -yinc; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1134 | } |
| 1135 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1136 | SendMessageA( wndPtr->hwndSelf, WM_GETMINMAXINFO, 0, (LPARAM)&MinMax ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1137 | |
| 1138 | /* Some sanity checks */ |
| 1139 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 1140 | TRACE("%ld %ld / %ld %ld / %ld %ld / %ld %ld\n", |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1141 | MinMax.ptMaxSize.x, MinMax.ptMaxSize.y, |
| 1142 | MinMax.ptMaxPosition.x, MinMax.ptMaxPosition.y, |
| 1143 | MinMax.ptMaxTrackSize.x, MinMax.ptMaxTrackSize.y, |
| 1144 | MinMax.ptMinTrackSize.x, MinMax.ptMinTrackSize.y); |
| 1145 | MinMax.ptMaxTrackSize.x = MAX( MinMax.ptMaxTrackSize.x, |
| 1146 | MinMax.ptMinTrackSize.x ); |
| 1147 | MinMax.ptMaxTrackSize.y = MAX( MinMax.ptMaxTrackSize.y, |
| 1148 | MinMax.ptMinTrackSize.y ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1149 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1150 | if (maxSize) *maxSize = MinMax.ptMaxSize; |
| 1151 | if (maxPos) *maxPos = MinMax.ptMaxPosition; |
| 1152 | if (minTrack) *minTrack = MinMax.ptMinTrackSize; |
| 1153 | if (maxTrack) *maxTrack = MinMax.ptMaxTrackSize; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1154 | } |
| 1155 | |
| 1156 | /*********************************************************************** |
| 1157 | * WINPOS_MinMaximize |
| 1158 | * |
| 1159 | * Fill in lpRect and return additional flags to be used with SetWindowPos(). |
| 1160 | * This function assumes that 'cmd' is different from the current window |
| 1161 | * state. |
| 1162 | */ |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1163 | UINT WINPOS_MinMaximize( WND* wndPtr, UINT16 cmd, LPRECT16 lpRect ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1164 | { |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1165 | UINT swpFlags = 0; |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 1166 | POINT pt, size; |
Patrik Stridvall | a9a671d | 1999-04-25 19:01:52 +0000 | [diff] [blame] | 1167 | LPINTERNALPOS lpPos; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1168 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 1169 | TRACE("0x%04x %u\n", wndPtr->hwndSelf, cmd ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1170 | |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 1171 | size.x = wndPtr->rectWindow.left; size.y = wndPtr->rectWindow.top; |
Patrik Stridvall | a9a671d | 1999-04-25 19:01:52 +0000 | [diff] [blame] | 1172 | lpPos = WINPOS_InitInternalPos( wndPtr, size, &wndPtr->rectWindow ); |
| 1173 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1174 | if (lpPos && !HOOK_CallHooks16(WH_CBT, HCBT_MINMAX, wndPtr->hwndSelf, cmd)) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1175 | { |
| 1176 | if( wndPtr->dwStyle & WS_MINIMIZE ) |
| 1177 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1178 | if( !SendMessageA( wndPtr->hwndSelf, WM_QUERYOPEN, 0, 0L ) ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1179 | return (SWP_NOSIZE | SWP_NOMOVE); |
| 1180 | swpFlags |= SWP_NOCOPYBITS; |
| 1181 | } |
| 1182 | switch( cmd ) |
| 1183 | { |
| 1184 | case SW_MINIMIZE: |
| 1185 | if( wndPtr->dwStyle & WS_MAXIMIZE) |
| 1186 | { |
| 1187 | wndPtr->flags |= WIN_RESTORE_MAX; |
| 1188 | wndPtr->dwStyle &= ~WS_MAXIMIZE; |
| 1189 | } |
| 1190 | else |
| 1191 | wndPtr->flags &= ~WIN_RESTORE_MAX; |
| 1192 | wndPtr->dwStyle |= WS_MINIMIZE; |
| 1193 | |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1194 | if( wndPtr->flags & WIN_NATIVE ) |
| 1195 | if( wndPtr->pDriver->pSetHostAttr( wndPtr, HAK_ICONICSTATE, TRUE ) ) |
| 1196 | swpFlags |= MINMAX_NOSWP; |
| 1197 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1198 | lpPos->ptIconPos = WINPOS_FindIconPos( wndPtr, lpPos->ptIconPos ); |
| 1199 | |
| 1200 | SetRect16( lpRect, lpPos->ptIconPos.x, lpPos->ptIconPos.y, |
Marcus Meissner | ddca315 | 1999-05-22 11:33:23 +0000 | [diff] [blame] | 1201 | GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON) ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1202 | swpFlags |= SWP_NOCOPYBITS; |
| 1203 | break; |
| 1204 | |
| 1205 | case SW_MAXIMIZE: |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1206 | CONV_POINT16TO32( &lpPos->ptMaxPos, &pt ); |
| 1207 | WINPOS_GetMinMaxInfo( wndPtr, &size, &pt, NULL, NULL ); |
| 1208 | CONV_POINT32TO16( &pt, &lpPos->ptMaxPos ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1209 | |
| 1210 | if( wndPtr->dwStyle & WS_MINIMIZE ) |
| 1211 | { |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1212 | if( wndPtr->flags & WIN_NATIVE ) |
| 1213 | if( wndPtr->pDriver->pSetHostAttr( wndPtr, HAK_ICONICSTATE, FALSE ) ) |
| 1214 | swpFlags |= MINMAX_NOSWP; |
| 1215 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1216 | WINPOS_ShowIconTitle( wndPtr, FALSE ); |
| 1217 | wndPtr->dwStyle &= ~WS_MINIMIZE; |
| 1218 | } |
| 1219 | wndPtr->dwStyle |= WS_MAXIMIZE; |
| 1220 | |
| 1221 | SetRect16( lpRect, lpPos->ptMaxPos.x, lpPos->ptMaxPos.y, |
| 1222 | size.x, size.y ); |
| 1223 | break; |
| 1224 | |
| 1225 | case SW_RESTORE: |
| 1226 | if( wndPtr->dwStyle & WS_MINIMIZE ) |
| 1227 | { |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1228 | if( wndPtr->flags & WIN_NATIVE ) |
| 1229 | if( wndPtr->pDriver->pSetHostAttr( wndPtr, HAK_ICONICSTATE, FALSE ) ) |
| 1230 | swpFlags |= MINMAX_NOSWP; |
| 1231 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1232 | wndPtr->dwStyle &= ~WS_MINIMIZE; |
| 1233 | WINPOS_ShowIconTitle( wndPtr, FALSE ); |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1234 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1235 | if( wndPtr->flags & WIN_RESTORE_MAX) |
| 1236 | { |
| 1237 | /* Restore to maximized position */ |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 1238 | CONV_POINT16TO32( &lpPos->ptMaxPos, &pt ); |
| 1239 | WINPOS_GetMinMaxInfo( wndPtr, &size, &pt, NULL, NULL); |
| 1240 | CONV_POINT32TO16( &pt, &lpPos->ptMaxPos ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1241 | wndPtr->dwStyle |= WS_MAXIMIZE; |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 1242 | SetRect16( lpRect, lpPos->ptMaxPos.x, lpPos->ptMaxPos.y, size.x, size.y ); |
| 1243 | break; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1244 | } |
| 1245 | } |
| 1246 | else |
| 1247 | if( !(wndPtr->dwStyle & WS_MAXIMIZE) ) return (UINT16)(-1); |
| 1248 | else wndPtr->dwStyle &= ~WS_MAXIMIZE; |
| 1249 | |
| 1250 | /* Restore to normal position */ |
| 1251 | |
| 1252 | *lpRect = lpPos->rectNormal; |
| 1253 | lpRect->right -= lpRect->left; |
| 1254 | lpRect->bottom -= lpRect->top; |
| 1255 | |
| 1256 | break; |
| 1257 | } |
| 1258 | } else swpFlags |= SWP_NOSIZE | SWP_NOMOVE; |
| 1259 | return swpFlags; |
| 1260 | } |
| 1261 | |
| 1262 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1263 | * ShowWindowAsync (USER32.535) |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 1264 | * |
| 1265 | * doesn't wait; returns immediately. |
| 1266 | * used by threads to toggle windows in other (possibly hanging) threads |
| 1267 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1268 | BOOL WINAPI ShowWindowAsync( HWND hwnd, INT cmd ) |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 1269 | { |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1270 | /* FIXME: does ShowWindow() return immediately ? */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1271 | return ShowWindow(hwnd, cmd); |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 1272 | } |
| 1273 | |
| 1274 | |
| 1275 | /*********************************************************************** |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1276 | * ShowWindow16 (USER.42) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1277 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1278 | BOOL16 WINAPI ShowWindow16( HWND16 hwnd, INT16 cmd ) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 1279 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1280 | return ShowWindow(hwnd,cmd); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 1281 | } |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1282 | |
| 1283 | |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 1284 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1285 | * ShowWindow (USER32.534) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 1286 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1287 | BOOL WINAPI ShowWindow( HWND hwnd, INT cmd ) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1288 | { |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1289 | WND* wndPtr = WIN_FindWndPtr( hwnd ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1290 | BOOL wasVisible, showFlag; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1291 | RECT16 newPos = {0, 0, 0, 0}; |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1292 | UINT swp = 0; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1293 | |
Alexandre Julliard | 940d58c | 1994-09-16 09:24:37 +0000 | [diff] [blame] | 1294 | if (!wndPtr) return FALSE; |
| 1295 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 1296 | TRACE("hwnd=%04x, cmd=%d\n", hwnd, cmd); |
Alexandre Julliard | 940d58c | 1994-09-16 09:24:37 +0000 | [diff] [blame] | 1297 | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1298 | wasVisible = (wndPtr->dwStyle & WS_VISIBLE) != 0; |
Alexandre Julliard | 940d58c | 1994-09-16 09:24:37 +0000 | [diff] [blame] | 1299 | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1300 | switch(cmd) |
| 1301 | { |
| 1302 | case SW_HIDE: |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1303 | if (!wasVisible) goto END;; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1304 | swp |= SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1305 | SWP_NOACTIVATE | SWP_NOZORDER; |
| 1306 | break; |
| 1307 | |
| 1308 | case SW_SHOWMINNOACTIVE: |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1309 | swp |= SWP_NOACTIVATE | SWP_NOZORDER; |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 1310 | /* fall through */ |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1311 | case SW_SHOWMINIMIZED: |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1312 | swp |= SWP_SHOWWINDOW; |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 1313 | /* fall through */ |
| 1314 | case SW_MINIMIZE: |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1315 | swp |= SWP_FRAMECHANGED; |
| 1316 | if( !(wndPtr->dwStyle & WS_MINIMIZE) ) |
| 1317 | swp |= WINPOS_MinMaximize( wndPtr, SW_MINIMIZE, &newPos ); |
| 1318 | else swp |= SWP_NOSIZE | SWP_NOMOVE; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1319 | break; |
| 1320 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1321 | case SW_SHOWMAXIMIZED: /* same as SW_MAXIMIZE */ |
| 1322 | swp |= SWP_SHOWWINDOW | SWP_FRAMECHANGED; |
| 1323 | if( !(wndPtr->dwStyle & WS_MAXIMIZE) ) |
| 1324 | swp |= WINPOS_MinMaximize( wndPtr, SW_MAXIMIZE, &newPos ); |
| 1325 | else swp |= SWP_NOSIZE | SWP_NOMOVE; |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 1326 | break; |
| 1327 | |
| 1328 | case SW_SHOWNA: |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1329 | swp |= SWP_NOACTIVATE | SWP_NOZORDER; |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 1330 | /* fall through */ |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1331 | case SW_SHOW: |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1332 | swp |= SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE; |
Francis Beaudet | 8623fdc | 1999-08-07 14:14:06 +0000 | [diff] [blame] | 1333 | |
| 1334 | /* |
| 1335 | * ShowWindow has a little peculiar behavior that if the |
| 1336 | * window is already the topmost window, it will not |
| 1337 | * activate it. |
| 1338 | */ |
Abey George | 983f90a | 1999-10-13 15:43:45 +0000 | [diff] [blame] | 1339 | if (GetTopWindow((HWND)0)==hwnd && (wasVisible || GetActiveWindow() == hwnd)) |
Francis Beaudet | 8623fdc | 1999-08-07 14:14:06 +0000 | [diff] [blame] | 1340 | swp |= SWP_NOACTIVATE; |
| 1341 | |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 1342 | break; |
| 1343 | |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 1344 | case SW_SHOWNOACTIVATE: |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1345 | swp |= SWP_NOZORDER; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1346 | if (GetActiveWindow()) swp |= SWP_NOACTIVATE; |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 1347 | /* fall through */ |
| 1348 | case SW_SHOWNORMAL: /* same as SW_NORMAL: */ |
Alexandre Julliard | 4f8c37b | 1996-01-14 18:12:01 +0000 | [diff] [blame] | 1349 | case SW_SHOWDEFAULT: /* FIXME: should have its own handler */ |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 1350 | case SW_RESTORE: |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1351 | swp |= SWP_SHOWWINDOW | SWP_FRAMECHANGED; |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1352 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1353 | if( wndPtr->dwStyle & (WS_MINIMIZE | WS_MAXIMIZE) ) |
| 1354 | swp |= WINPOS_MinMaximize( wndPtr, SW_RESTORE, &newPos ); |
| 1355 | else swp |= SWP_NOSIZE | SWP_NOMOVE; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1356 | break; |
| 1357 | } |
Alexandre Julliard | 940d58c | 1994-09-16 09:24:37 +0000 | [diff] [blame] | 1358 | |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 1359 | showFlag = (cmd != SW_HIDE); |
| 1360 | if (showFlag != wasVisible) |
| 1361 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1362 | SendMessageA( hwnd, WM_SHOWWINDOW, showFlag, 0 ); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1363 | if (!IsWindow( hwnd )) goto END; |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 1364 | } |
| 1365 | |
Alexandre Julliard | ac9c9b0 | 1996-07-28 18:50:11 +0000 | [diff] [blame] | 1366 | if ((wndPtr->dwStyle & WS_CHILD) && |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1367 | !IsWindowVisible( wndPtr->parent->hwndSelf ) && |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1368 | (swp & (SWP_NOSIZE | SWP_NOMOVE)) == (SWP_NOSIZE | SWP_NOMOVE) ) |
Alexandre Julliard | ac9c9b0 | 1996-07-28 18:50:11 +0000 | [diff] [blame] | 1369 | { |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1370 | /* Don't call SetWindowPos() on invisible child windows */ |
Alexandre Julliard | ac9c9b0 | 1996-07-28 18:50:11 +0000 | [diff] [blame] | 1371 | if (cmd == SW_HIDE) wndPtr->dwStyle &= ~WS_VISIBLE; |
| 1372 | else wndPtr->dwStyle |= WS_VISIBLE; |
| 1373 | } |
| 1374 | else |
| 1375 | { |
| 1376 | /* We can't activate a child window */ |
Thuy Nguyen | 22614a3 | 1999-10-13 13:53:10 +0000 | [diff] [blame] | 1377 | if ((wndPtr->dwStyle & WS_CHILD) && |
| 1378 | !(wndPtr->dwExStyle & WS_EX_MDICHILD)) |
| 1379 | swp |= SWP_NOACTIVATE | SWP_NOZORDER; |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1380 | if (!(swp & MINMAX_NOSWP)) |
Abey George | 983f90a | 1999-10-13 15:43:45 +0000 | [diff] [blame] | 1381 | { |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1382 | SetWindowPos( hwnd, HWND_TOP, newPos.left, newPos.top, |
| 1383 | newPos.right, newPos.bottom, LOWORD(swp) ); |
Abey George | 983f90a | 1999-10-13 15:43:45 +0000 | [diff] [blame] | 1384 | if (cmd == SW_HIDE) |
| 1385 | { |
| 1386 | /* FIXME: This will cause the window to be activated irrespective |
| 1387 | * of whether it is owned by the same thread. Has to be done |
| 1388 | * asynchronously. |
| 1389 | */ |
| 1390 | |
| 1391 | if (hwnd == GetActiveWindow()) |
| 1392 | WINPOS_ActivateOtherWindow(wndPtr); |
| 1393 | |
| 1394 | /* Revert focus to parent */ |
| 1395 | if (hwnd == GetFocus() || IsChild(hwnd, GetFocus())) |
| 1396 | SetFocus( GetParent(hwnd) ); |
| 1397 | } |
| 1398 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1399 | if (!IsWindow( hwnd )) goto END; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1400 | else if( wndPtr->dwStyle & WS_MINIMIZE ) WINPOS_ShowIconTitle( wndPtr, TRUE ); |
Alexandre Julliard | ac9c9b0 | 1996-07-28 18:50:11 +0000 | [diff] [blame] | 1401 | } |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1402 | |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1403 | if (wndPtr->flags & WIN_NEED_SIZE) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1404 | { |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 1405 | /* should happen only in CreateWindowEx() */ |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1406 | int wParam = SIZE_RESTORED; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1407 | |
| 1408 | wndPtr->flags &= ~WIN_NEED_SIZE; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1409 | if (wndPtr->dwStyle & WS_MAXIMIZE) wParam = SIZE_MAXIMIZED; |
| 1410 | else if (wndPtr->dwStyle & WS_MINIMIZE) wParam = SIZE_MINIMIZED; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1411 | SendMessageA( hwnd, WM_SIZE, wParam, |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1412 | MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left, |
| 1413 | wndPtr->rectClient.bottom-wndPtr->rectClient.top)); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1414 | SendMessageA( hwnd, WM_MOVE, 0, |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1415 | MAKELONG(wndPtr->rectClient.left, wndPtr->rectClient.top) ); |
| 1416 | } |
Alexandre Julliard | 940d58c | 1994-09-16 09:24:37 +0000 | [diff] [blame] | 1417 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1418 | END: |
| 1419 | WIN_ReleaseWndPtr(wndPtr); |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 1420 | return wasVisible; |
| 1421 | } |
| 1422 | |
| 1423 | |
| 1424 | /*********************************************************************** |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1425 | * GetInternalWindowPos16 (USER.460) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 1426 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1427 | UINT16 WINAPI GetInternalWindowPos16( HWND16 hwnd, LPRECT16 rectWnd, |
| 1428 | LPPOINT16 ptIcon ) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 1429 | { |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1430 | WINDOWPLACEMENT16 wndpl; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1431 | if (GetWindowPlacement16( hwnd, &wndpl )) |
| 1432 | { |
| 1433 | if (rectWnd) *rectWnd = wndpl.rcNormalPosition; |
| 1434 | if (ptIcon) *ptIcon = wndpl.ptMinPosition; |
| 1435 | return wndpl.showCmd; |
| 1436 | } |
| 1437 | return 0; |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 1438 | } |
| 1439 | |
| 1440 | |
| 1441 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1442 | * GetInternalWindowPos (USER32.245) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 1443 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1444 | UINT WINAPI GetInternalWindowPos( HWND hwnd, LPRECT rectWnd, |
| 1445 | LPPOINT ptIcon ) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 1446 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1447 | WINDOWPLACEMENT wndpl; |
| 1448 | if (GetWindowPlacement( hwnd, &wndpl )) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1449 | { |
| 1450 | if (rectWnd) *rectWnd = wndpl.rcNormalPosition; |
| 1451 | if (ptIcon) *ptIcon = wndpl.ptMinPosition; |
| 1452 | return wndpl.showCmd; |
| 1453 | } |
| 1454 | return 0; |
| 1455 | } |
| 1456 | |
| 1457 | /*********************************************************************** |
| 1458 | * GetWindowPlacement16 (USER.370) |
| 1459 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1460 | BOOL16 WINAPI GetWindowPlacement16( HWND16 hwnd, WINDOWPLACEMENT16 *wndpl ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1461 | { |
| 1462 | WND *pWnd = WIN_FindWndPtr( hwnd ); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1463 | LPINTERNALPOS lpPos; |
| 1464 | |
| 1465 | if(!pWnd ) return FALSE; |
| 1466 | |
| 1467 | lpPos = (LPINTERNALPOS)WINPOS_InitInternalPos( pWnd, |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1468 | *(LPPOINT)&pWnd->rectWindow.left, &pWnd->rectWindow ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1469 | wndpl->length = sizeof(*wndpl); |
| 1470 | if( pWnd->dwStyle & WS_MINIMIZE ) |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 1471 | wndpl->showCmd = SW_SHOWMINIMIZED; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1472 | else |
| 1473 | wndpl->showCmd = ( pWnd->dwStyle & WS_MAXIMIZE ) |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 1474 | ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL ; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1475 | if( pWnd->flags & WIN_RESTORE_MAX ) |
| 1476 | wndpl->flags = WPF_RESTORETOMAXIMIZED; |
| 1477 | else |
| 1478 | wndpl->flags = 0; |
| 1479 | wndpl->ptMinPosition = lpPos->ptIconPos; |
| 1480 | wndpl->ptMaxPosition = lpPos->ptMaxPos; |
| 1481 | wndpl->rcNormalPosition = lpPos->rectNormal; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1482 | |
| 1483 | WIN_ReleaseWndPtr(pWnd); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1484 | return TRUE; |
| 1485 | } |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1486 | |
| 1487 | |
| 1488 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1489 | * GetWindowPlacement (USER32.307) |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 1490 | * |
| 1491 | * Win95: |
| 1492 | * Fails if wndpl->length of Win95 (!) apps is invalid. |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1493 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1494 | BOOL WINAPI GetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *pwpl32 ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1495 | { |
| 1496 | if( pwpl32 ) |
| 1497 | { |
| 1498 | WINDOWPLACEMENT16 wpl; |
| 1499 | wpl.length = sizeof(wpl); |
| 1500 | if( GetWindowPlacement16( hwnd, &wpl ) ) |
| 1501 | { |
| 1502 | pwpl32->length = sizeof(*pwpl32); |
| 1503 | pwpl32->flags = wpl.flags; |
| 1504 | pwpl32->showCmd = wpl.showCmd; |
| 1505 | CONV_POINT16TO32( &wpl.ptMinPosition, &pwpl32->ptMinPosition ); |
| 1506 | CONV_POINT16TO32( &wpl.ptMaxPosition, &pwpl32->ptMaxPosition ); |
| 1507 | CONV_RECT16TO32( &wpl.rcNormalPosition, &pwpl32->rcNormalPosition ); |
| 1508 | return TRUE; |
| 1509 | } |
| 1510 | } |
| 1511 | return FALSE; |
| 1512 | } |
| 1513 | |
| 1514 | |
| 1515 | /*********************************************************************** |
| 1516 | * WINPOS_SetPlacement |
| 1517 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1518 | static BOOL WINPOS_SetPlacement( HWND hwnd, const WINDOWPLACEMENT16 *wndpl, |
| 1519 | UINT flags ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1520 | { |
| 1521 | WND *pWnd = WIN_FindWndPtr( hwnd ); |
| 1522 | if( pWnd ) |
| 1523 | { |
| 1524 | LPINTERNALPOS lpPos = (LPINTERNALPOS)WINPOS_InitInternalPos( pWnd, |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1525 | *(LPPOINT)&pWnd->rectWindow.left, &pWnd->rectWindow ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1526 | |
| 1527 | if( flags & PLACE_MIN ) lpPos->ptIconPos = wndpl->ptMinPosition; |
| 1528 | if( flags & PLACE_MAX ) lpPos->ptMaxPos = wndpl->ptMaxPosition; |
| 1529 | if( flags & PLACE_RECT) lpPos->rectNormal = wndpl->rcNormalPosition; |
| 1530 | |
| 1531 | if( pWnd->dwStyle & WS_MINIMIZE ) |
| 1532 | { |
| 1533 | WINPOS_ShowIconTitle( pWnd, FALSE ); |
| 1534 | if( wndpl->flags & WPF_SETMINPOSITION && !EMPTYPOINT(lpPos->ptIconPos)) |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1535 | SetWindowPos( hwnd, 0, lpPos->ptIconPos.x, lpPos->ptIconPos.y, |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1536 | 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE ); |
| 1537 | } |
| 1538 | else if( pWnd->dwStyle & WS_MAXIMIZE ) |
| 1539 | { |
| 1540 | if( !EMPTYPOINT(lpPos->ptMaxPos) ) |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1541 | SetWindowPos( hwnd, 0, lpPos->ptMaxPos.x, lpPos->ptMaxPos.y, |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1542 | 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE ); |
| 1543 | } |
| 1544 | else if( flags & PLACE_RECT ) |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1545 | SetWindowPos( hwnd, 0, lpPos->rectNormal.left, lpPos->rectNormal.top, |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1546 | lpPos->rectNormal.right - lpPos->rectNormal.left, |
| 1547 | lpPos->rectNormal.bottom - lpPos->rectNormal.top, |
| 1548 | SWP_NOZORDER | SWP_NOACTIVATE ); |
| 1549 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1550 | ShowWindow( hwnd, wndpl->showCmd ); |
| 1551 | if( IsWindow(hwnd) && pWnd->dwStyle & WS_MINIMIZE ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1552 | { |
| 1553 | if( pWnd->dwStyle & WS_VISIBLE ) WINPOS_ShowIconTitle( pWnd, TRUE ); |
| 1554 | |
| 1555 | /* SDK: ...valid only the next time... */ |
| 1556 | if( wndpl->flags & WPF_RESTORETOMAXIMIZED ) pWnd->flags |= WIN_RESTORE_MAX; |
| 1557 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1558 | WIN_ReleaseWndPtr(pWnd); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1559 | return TRUE; |
| 1560 | } |
| 1561 | return FALSE; |
| 1562 | } |
| 1563 | |
| 1564 | |
| 1565 | /*********************************************************************** |
| 1566 | * SetWindowPlacement16 (USER.371) |
| 1567 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1568 | BOOL16 WINAPI SetWindowPlacement16(HWND16 hwnd, const WINDOWPLACEMENT16 *wndpl) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1569 | { |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1570 | return WINPOS_SetPlacement( hwnd, wndpl, |
| 1571 | PLACE_MIN | PLACE_MAX | PLACE_RECT ); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1572 | } |
| 1573 | |
| 1574 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1575 | * SetWindowPlacement (USER32.519) |
Alexandre Julliard | 638f169 | 1999-01-17 16:32:32 +0000 | [diff] [blame] | 1576 | * |
| 1577 | * Win95: |
| 1578 | * Fails if wndpl->length of Win95 (!) apps is invalid. |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1579 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1580 | BOOL WINAPI SetWindowPlacement( HWND hwnd, const WINDOWPLACEMENT *pwpl32 ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1581 | { |
| 1582 | if( pwpl32 ) |
| 1583 | { |
Patrik Stridvall | a9a671d | 1999-04-25 19:01:52 +0000 | [diff] [blame] | 1584 | WINDOWPLACEMENT16 wpl; |
| 1585 | |
| 1586 | wpl.length = sizeof(WINDOWPLACEMENT16); |
| 1587 | wpl.flags = pwpl32->flags; |
| 1588 | wpl.showCmd = pwpl32->showCmd; |
| 1589 | wpl.ptMinPosition.x = pwpl32->ptMinPosition.x; |
| 1590 | wpl.ptMinPosition.y = pwpl32->ptMinPosition.y; |
| 1591 | wpl.ptMaxPosition.x = pwpl32->ptMaxPosition.x; |
| 1592 | wpl.ptMaxPosition.y = pwpl32->ptMaxPosition.y; |
| 1593 | wpl.rcNormalPosition.left = pwpl32->rcNormalPosition.left; |
| 1594 | wpl.rcNormalPosition.top = pwpl32->rcNormalPosition.top; |
| 1595 | wpl.rcNormalPosition.right = pwpl32->rcNormalPosition.right; |
| 1596 | wpl.rcNormalPosition.bottom = pwpl32->rcNormalPosition.bottom; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1597 | |
| 1598 | return WINPOS_SetPlacement( hwnd, &wpl, PLACE_MIN | PLACE_MAX | PLACE_RECT ); |
| 1599 | } |
| 1600 | return FALSE; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1601 | } |
| 1602 | |
| 1603 | |
| 1604 | /*********************************************************************** |
| 1605 | * SetInternalWindowPos16 (USER.461) |
| 1606 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1607 | void WINAPI SetInternalWindowPos16( HWND16 hwnd, UINT16 showCmd, |
| 1608 | LPRECT16 rect, LPPOINT16 pt ) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1609 | { |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1610 | if( IsWindow16(hwnd) ) |
| 1611 | { |
| 1612 | WINDOWPLACEMENT16 wndpl; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1613 | UINT flags; |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 1614 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1615 | wndpl.length = sizeof(wndpl); |
| 1616 | wndpl.showCmd = showCmd; |
| 1617 | wndpl.flags = flags = 0; |
| 1618 | |
| 1619 | if( pt ) |
| 1620 | { |
| 1621 | flags |= PLACE_MIN; |
| 1622 | wndpl.flags |= WPF_SETMINPOSITION; |
| 1623 | wndpl.ptMinPosition = *pt; |
| 1624 | } |
| 1625 | if( rect ) |
| 1626 | { |
| 1627 | flags |= PLACE_RECT; |
| 1628 | wndpl.rcNormalPosition = *rect; |
| 1629 | } |
| 1630 | WINPOS_SetPlacement( hwnd, &wndpl, flags ); |
| 1631 | } |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 1632 | } |
| 1633 | |
| 1634 | |
| 1635 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1636 | * SetInternalWindowPos (USER32.483) |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 1637 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1638 | void WINAPI SetInternalWindowPos( HWND hwnd, UINT showCmd, |
| 1639 | LPRECT rect, LPPOINT pt ) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1640 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1641 | if( IsWindow(hwnd) ) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1642 | { |
| 1643 | WINDOWPLACEMENT16 wndpl; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1644 | UINT flags; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1645 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1646 | wndpl.length = sizeof(wndpl); |
| 1647 | wndpl.showCmd = showCmd; |
| 1648 | wndpl.flags = flags = 0; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1649 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1650 | if( pt ) |
| 1651 | { |
| 1652 | flags |= PLACE_MIN; |
| 1653 | wndpl.flags |= WPF_SETMINPOSITION; |
| 1654 | CONV_POINT32TO16( pt, &wndpl.ptMinPosition ); |
| 1655 | } |
| 1656 | if( rect ) |
| 1657 | { |
| 1658 | flags |= PLACE_RECT; |
| 1659 | CONV_RECT32TO16( rect, &wndpl.rcNormalPosition ); |
| 1660 | } |
| 1661 | WINPOS_SetPlacement( hwnd, &wndpl, flags ); |
| 1662 | } |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1663 | } |
| 1664 | |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1665 | /******************************************************************* |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1666 | * WINPOS_SetActiveWindow |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 1667 | * |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1668 | * SetActiveWindow() back-end. This is the only function that |
| 1669 | * can assign active status to a window. It must be called only |
| 1670 | * for the top level windows. |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 1671 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1672 | BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus) |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 1673 | { |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1674 | CBTACTIVATESTRUCT16* cbtStruct; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1675 | WND* wndPtr=0, *wndTemp; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1676 | HQUEUE16 hOldActiveQueue, hNewActiveQueue; |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1677 | MESSAGEQUEUE *pOldActiveQueue = 0, *pNewActiveQueue = 0; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1678 | WORD wIconized = 0; |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1679 | HWND hwndActive = 0; |
| 1680 | BOOL bRet = 0; |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1681 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 1682 | TRACE("(%04x, %d, %d)\n", hWnd, fMouse, fChangeFocus ); |
Ulrich Weigand | b38e1de | 1999-06-12 06:42:20 +0000 | [diff] [blame] | 1683 | |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1684 | /* Get current active window from the active queue */ |
| 1685 | if ( hActiveQueue ) |
| 1686 | { |
| 1687 | pOldActiveQueue = QUEUE_Lock( hActiveQueue ); |
| 1688 | if ( pOldActiveQueue ) |
| 1689 | hwndActive = PERQDATA_GetActiveWnd( pOldActiveQueue->pQData ); |
| 1690 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1691 | |
| 1692 | /* paranoid checks */ |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1693 | if( hWnd == GetDesktopWindow() || (bRet = (hWnd == hwndActive)) ) |
| 1694 | goto CLEANUP_END; |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1695 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1696 | /* if (wndPtr && (GetFastQueue16() != wndPtr->hmemTaskQ)) |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1697 | * return 0; |
| 1698 | */ |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1699 | wndPtr = WIN_FindWndPtr(hWnd); |
Stephane Lussier | 1c4786f | 1999-01-28 10:54:11 +0000 | [diff] [blame] | 1700 | hOldActiveQueue = hActiveQueue; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1701 | |
| 1702 | if( (wndTemp = WIN_FindWndPtr(hwndActive)) ) |
Francois Boisvert | 3a3cd9f | 1999-03-28 12:42:52 +0000 | [diff] [blame] | 1703 | { |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1704 | wIconized = HIWORD(wndTemp->dwStyle & WS_MINIMIZE); |
Francois Boisvert | 3a3cd9f | 1999-03-28 12:42:52 +0000 | [diff] [blame] | 1705 | WIN_ReleaseWndPtr(wndTemp); |
| 1706 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1707 | else |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 1708 | TRACE("no current active window.\n"); |
Francois Boisvert | 3a3cd9f | 1999-03-28 12:42:52 +0000 | [diff] [blame] | 1709 | |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1710 | /* call CBT hook chain */ |
Alexandre Julliard | d90840e | 1996-06-11 16:02:08 +0000 | [diff] [blame] | 1711 | if ((cbtStruct = SEGPTR_NEW(CBTACTIVATESTRUCT16))) |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1712 | { |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1713 | cbtStruct->fMouse = fMouse; |
| 1714 | cbtStruct->hWndActive = hwndActive; |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1715 | bRet = (BOOL)HOOK_CallHooks16( WH_CBT, HCBT_ACTIVATE, (WPARAM16)hWnd, |
| 1716 | (LPARAM)SEGPTR_GET(cbtStruct) ); |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1717 | SEGPTR_FREE(cbtStruct); |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1718 | if (bRet) goto CLEANUP_END; |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1719 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1720 | |
| 1721 | /* set prev active wnd to current active wnd and send notification */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1722 | if ((hwndPrevActive = hwndActive) && IsWindow(hwndPrevActive)) |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 1723 | { |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1724 | MESSAGEQUEUE *pTempActiveQueue = 0; |
| 1725 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1726 | if (!SendMessageA( hwndPrevActive, WM_NCACTIVATE, FALSE, 0 )) |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1727 | { |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1728 | if (GetSysModalWindow16() != hWnd) |
| 1729 | goto CLEANUP_END; |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1730 | /* disregard refusal if hWnd is sysmodal */ |
| 1731 | } |
| 1732 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1733 | SendMessageA( hwndPrevActive, WM_ACTIVATE, |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 1734 | MAKEWPARAM( WA_INACTIVE, wIconized ), |
| 1735 | (LPARAM)hWnd ); |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1736 | |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1737 | /* check if something happened during message processing |
| 1738 | * (global active queue may have changed) |
| 1739 | */ |
| 1740 | pTempActiveQueue = QUEUE_Lock( hActiveQueue ); |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 1741 | if(!pTempActiveQueue) |
| 1742 | goto CLEANUP_END; |
Francois Boisvert | 71bdc7c | 1999-04-11 11:59:25 +0000 | [diff] [blame] | 1743 | |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1744 | hwndActive = PERQDATA_GetActiveWnd( pTempActiveQueue->pQData ); |
| 1745 | QUEUE_Unlock( pTempActiveQueue ); |
| 1746 | if( hwndPrevActive != hwndActive ) |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1747 | goto CLEANUP_END; |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 1748 | } |
| 1749 | |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1750 | /* Set new active window in the message queue */ |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1751 | hwndActive = hWnd; |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1752 | if ( wndPtr ) |
| 1753 | { |
| 1754 | pNewActiveQueue = QUEUE_Lock( wndPtr->hmemTaskQ ); |
| 1755 | if ( pNewActiveQueue ) |
| 1756 | PERQDATA_SetActiveWnd( pNewActiveQueue->pQData, hwndActive ); |
| 1757 | } |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 1758 | else /* have to do this or MDI frame activation goes to hell */ |
| 1759 | if( pOldActiveQueue ) |
| 1760 | PERQDATA_SetActiveWnd( pOldActiveQueue->pQData, 0 ); |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1761 | |
| 1762 | /* send palette messages */ |
Alexandre Julliard | 8cc3a5e | 1996-08-11 15:49:51 +0000 | [diff] [blame] | 1763 | if (hWnd && SendMessage16( hWnd, WM_QUERYNEWPALETTE, 0, 0L)) |
Alexandre Julliard | 530ee84 | 1996-10-23 16:59:13 +0000 | [diff] [blame] | 1764 | SendMessage16((HWND16)-1, WM_PALETTEISCHANGING, (WPARAM16)hWnd, 0L ); |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1765 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1766 | /* if prev wnd is minimized redraw icon title */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1767 | if( IsIconic( hwndPrevActive ) ) WINPOS_RedrawIconTitle(hwndPrevActive); |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1768 | |
| 1769 | /* managed windows will get ConfigureNotify event */ |
Alexandre Julliard | 8cc3a5e | 1996-08-11 15:49:51 +0000 | [diff] [blame] | 1770 | if (wndPtr && !(wndPtr->dwStyle & WS_CHILD) && !(wndPtr->flags & WIN_MANAGED)) |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1771 | { |
| 1772 | /* check Z-order and bring hWnd to the top */ |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1773 | for (wndTemp = WIN_LockWndPtr(WIN_GetDesktop()->child); wndTemp; WIN_UpdateWndPtr(&wndTemp,wndTemp->next)) |
| 1774 | { |
Alexandre Julliard | 59730ae | 1996-03-24 16:20:51 +0000 | [diff] [blame] | 1775 | if (wndTemp->dwStyle & WS_VISIBLE) break; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1776 | } |
| 1777 | WIN_ReleaseDesktop(); |
| 1778 | WIN_ReleaseWndPtr(wndTemp); |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1779 | |
| 1780 | if( wndTemp != wndPtr ) |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1781 | SetWindowPos(hWnd, HWND_TOP, 0,0,0,0, |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 1782 | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE ); |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1783 | if (!IsWindow(hWnd)) |
| 1784 | goto CLEANUP; |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 1785 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1786 | |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1787 | /* Get a handle to the new active queue */ |
Alexandre Julliard | 8cc3a5e | 1996-08-11 15:49:51 +0000 | [diff] [blame] | 1788 | hNewActiveQueue = wndPtr ? wndPtr->hmemTaskQ : 0; |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 1789 | |
| 1790 | /* send WM_ACTIVATEAPP if necessary */ |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1791 | if (hOldActiveQueue != hNewActiveQueue) |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 1792 | { |
Alexandre Julliard | 3051b64 | 1996-07-05 17:14:13 +0000 | [diff] [blame] | 1793 | WND **list, **ppWnd; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1794 | WND *pDesktop = WIN_GetDesktop(); |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1795 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1796 | if ((list = WIN_BuildWinArray( pDesktop, 0, NULL ))) |
Alexandre Julliard | 3051b64 | 1996-07-05 17:14:13 +0000 | [diff] [blame] | 1797 | { |
| 1798 | for (ppWnd = list; *ppWnd; ppWnd++) |
| 1799 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1800 | if (!IsWindow( (*ppWnd)->hwndSelf )) continue; |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1801 | |
| 1802 | if ((*ppWnd)->hmemTaskQ == hOldActiveQueue) |
| 1803 | SendMessage16( (*ppWnd)->hwndSelf, WM_ACTIVATEAPP, |
| 1804 | 0, QUEUE_GetQueueTask(hNewActiveQueue) ); |
Alexandre Julliard | 3051b64 | 1996-07-05 17:14:13 +0000 | [diff] [blame] | 1805 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1806 | WIN_ReleaseWinArray(list); |
Alexandre Julliard | 3051b64 | 1996-07-05 17:14:13 +0000 | [diff] [blame] | 1807 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1808 | |
Stephane Lussier | 1c4786f | 1999-01-28 10:54:11 +0000 | [diff] [blame] | 1809 | hActiveQueue = hNewActiveQueue; |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1810 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1811 | if ((list = WIN_BuildWinArray(pDesktop, 0, NULL ))) |
Alexandre Julliard | 3051b64 | 1996-07-05 17:14:13 +0000 | [diff] [blame] | 1812 | { |
| 1813 | for (ppWnd = list; *ppWnd; ppWnd++) |
| 1814 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1815 | if (!IsWindow( (*ppWnd)->hwndSelf )) continue; |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1816 | |
| 1817 | if ((*ppWnd)->hmemTaskQ == hNewActiveQueue) |
| 1818 | SendMessage16( (*ppWnd)->hwndSelf, WM_ACTIVATEAPP, |
| 1819 | 1, QUEUE_GetQueueTask( hOldActiveQueue ) ); |
Alexandre Julliard | 3051b64 | 1996-07-05 17:14:13 +0000 | [diff] [blame] | 1820 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1821 | WIN_ReleaseWinArray(list); |
Alexandre Julliard | 3051b64 | 1996-07-05 17:14:13 +0000 | [diff] [blame] | 1822 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1823 | WIN_ReleaseDesktop(); |
Stephane Lussier | 1c4786f | 1999-01-28 10:54:11 +0000 | [diff] [blame] | 1824 | |
Ulrich Weigand | b38e1de | 1999-06-12 06:42:20 +0000 | [diff] [blame] | 1825 | if (hWnd && !IsWindow(hWnd)) goto CLEANUP; |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1826 | } |
| 1827 | |
Alexandre Julliard | 8cc3a5e | 1996-08-11 15:49:51 +0000 | [diff] [blame] | 1828 | if (hWnd) |
| 1829 | { |
| 1830 | /* walk up to the first unowned window */ |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1831 | wndTemp = WIN_LockWndPtr(wndPtr); |
| 1832 | while (wndTemp->owner) |
| 1833 | { |
| 1834 | WIN_UpdateWndPtr(&wndTemp,wndTemp->owner); |
| 1835 | } |
Alexandre Julliard | 8cc3a5e | 1996-08-11 15:49:51 +0000 | [diff] [blame] | 1836 | /* and set last active owned popup */ |
| 1837 | wndTemp->hwndLastActive = hWnd; |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1838 | |
Alexandre Julliard | 8cc3a5e | 1996-08-11 15:49:51 +0000 | [diff] [blame] | 1839 | wIconized = HIWORD(wndTemp->dwStyle & WS_MINIMIZE); |
Francois Boisvert | 3a3cd9f | 1999-03-28 12:42:52 +0000 | [diff] [blame] | 1840 | WIN_ReleaseWndPtr(wndTemp); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1841 | SendMessageA( hWnd, WM_NCACTIVATE, TRUE, 0 ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1842 | SendMessageA( hWnd, WM_ACTIVATE, |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 1843 | MAKEWPARAM( (fMouse) ? WA_CLICKACTIVE : WA_ACTIVE, wIconized), |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1844 | (LPARAM)hwndPrevActive ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1845 | if( !IsWindow(hWnd) ) goto CLEANUP; |
Alexandre Julliard | 8cc3a5e | 1996-08-11 15:49:51 +0000 | [diff] [blame] | 1846 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1847 | |
| 1848 | /* change focus if possible */ |
Ulrich Weigand | b38e1de | 1999-06-12 06:42:20 +0000 | [diff] [blame] | 1849 | if ( fChangeFocus ) |
| 1850 | { |
| 1851 | if ( pNewActiveQueue ) |
| 1852 | { |
| 1853 | HWND hOldFocus = PERQDATA_GetFocusWnd( pNewActiveQueue->pQData ); |
| 1854 | |
| 1855 | if ( WIN_GetTopParent( hOldFocus ) != hwndActive ) |
| 1856 | FOCUS_SwitchFocus( pNewActiveQueue, hOldFocus, |
| 1857 | (wndPtr && (wndPtr->dwStyle & WS_MINIMIZE))? |
| 1858 | 0 : hwndActive ); |
| 1859 | } |
| 1860 | |
| 1861 | if ( pOldActiveQueue && |
| 1862 | ( !pNewActiveQueue || |
| 1863 | pNewActiveQueue->pQData != pOldActiveQueue->pQData ) ) |
| 1864 | { |
| 1865 | HWND hOldFocus = PERQDATA_GetFocusWnd( pOldActiveQueue->pQData ); |
| 1866 | if ( hOldFocus ) |
| 1867 | FOCUS_SwitchFocus( pOldActiveQueue, hOldFocus, 0 ); |
| 1868 | } |
| 1869 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1870 | |
Patrik Stridvall | e35d636 | 1998-12-07 09:13:40 +0000 | [diff] [blame] | 1871 | if( !hwndPrevActive && wndPtr ) |
| 1872 | (*wndPtr->pDriver->pForceWindowRaise)(wndPtr); |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1873 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1874 | /* if active wnd is minimized redraw icon title */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1875 | if( IsIconic(hwndActive) ) WINPOS_RedrawIconTitle(hwndActive); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 1876 | |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1877 | bRet = (hWnd == hwndActive); /* Success? */ |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1878 | |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1879 | CLEANUP: /* Unlock the message queues before returning */ |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1880 | |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1881 | if ( pNewActiveQueue ) |
| 1882 | QUEUE_Unlock( pNewActiveQueue ); |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1883 | |
| 1884 | CLEANUP_END: |
| 1885 | |
| 1886 | if ( pOldActiveQueue ) |
| 1887 | QUEUE_Unlock( pOldActiveQueue ); |
| 1888 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1889 | WIN_ReleaseWndPtr(wndPtr); |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 1890 | return bRet; |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1891 | } |
| 1892 | |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1893 | /******************************************************************* |
| 1894 | * WINPOS_ActivateOtherWindow |
| 1895 | * |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1896 | * Activates window other than pWnd. |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1897 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1898 | BOOL WINPOS_ActivateOtherWindow(WND* pWnd) |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1899 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1900 | BOOL bRet = 0; |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1901 | WND* pWndTo = NULL; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1902 | HWND hwndActive = 0; |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1903 | |
| 1904 | /* Get current active window from the active queue */ |
| 1905 | if ( hActiveQueue ) |
| 1906 | { |
| 1907 | MESSAGEQUEUE *pActiveQueue = QUEUE_Lock( hActiveQueue ); |
| 1908 | if ( pActiveQueue ) |
| 1909 | { |
| 1910 | hwndActive = PERQDATA_GetActiveWnd( pActiveQueue->pQData ); |
| 1911 | QUEUE_Unlock( pActiveQueue ); |
| 1912 | } |
| 1913 | } |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1914 | |
| 1915 | if( pWnd->hwndSelf == hwndPrevActive ) |
| 1916 | hwndPrevActive = 0; |
| 1917 | |
| 1918 | if( hwndActive != pWnd->hwndSelf && |
Alexandre Julliard | 7ff1c41 | 1997-05-25 13:58:18 +0000 | [diff] [blame] | 1919 | ( hwndActive || QUEUE_IsExitingQueue(pWnd->hmemTaskQ)) ) |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1920 | return 0; |
| 1921 | |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1922 | if( !(pWnd->dwStyle & WS_POPUP) || !(pWnd->owner) || |
| 1923 | !WINPOS_CanActivate((pWndTo = WIN_GetTopParentPtr(pWnd->owner))) ) |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1924 | { |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1925 | WND* pWndPtr = WIN_GetTopParentPtr(pWnd); |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1926 | |
Noel Borthwick | 10619e9 | 1999-05-02 11:20:00 +0000 | [diff] [blame] | 1927 | WIN_ReleaseWndPtr(pWndTo); |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1928 | pWndTo = WIN_FindWndPtr(hwndPrevActive); |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1929 | |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1930 | while( !WINPOS_CanActivate(pWndTo) ) |
| 1931 | { |
| 1932 | /* by now owned windows should've been taken care of */ |
Francois Boisvert | 3a3cd9f | 1999-03-28 12:42:52 +0000 | [diff] [blame] | 1933 | WIN_UpdateWndPtr(&pWndTo,pWndPtr->next); |
| 1934 | WIN_UpdateWndPtr(&pWndPtr,pWndTo); |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1935 | if( !pWndTo ) break; |
| 1936 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1937 | WIN_ReleaseWndPtr(pWndPtr); |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1938 | } |
| 1939 | |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 1940 | bRet = WINPOS_SetActiveWindow( pWndTo ? pWndTo->hwndSelf : 0, FALSE, TRUE ); |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1941 | |
| 1942 | /* switch desktop queue to current active */ |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1943 | if( pWndTo ) |
| 1944 | { |
| 1945 | WIN_GetDesktop()->hmemTaskQ = pWndTo->hmemTaskQ; |
| 1946 | WIN_ReleaseWndPtr(pWndTo); |
| 1947 | WIN_ReleaseDesktop(); |
| 1948 | } |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 1949 | |
| 1950 | hwndPrevActive = 0; |
| 1951 | return bRet; |
| 1952 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1953 | |
| 1954 | /******************************************************************* |
| 1955 | * WINPOS_ChangeActiveWindow |
| 1956 | * |
| 1957 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1958 | BOOL WINPOS_ChangeActiveWindow( HWND hWnd, BOOL mouseMsg ) |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1959 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 1960 | WND *wndPtr, *wndTemp; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1961 | BOOL retvalue; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 1962 | HWND hwndActive = 0; |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 1963 | |
| 1964 | /* Get current active window from the active queue */ |
| 1965 | if ( hActiveQueue ) |
| 1966 | { |
| 1967 | MESSAGEQUEUE *pActiveQueue = QUEUE_Lock( hActiveQueue ); |
| 1968 | if ( pActiveQueue ) |
| 1969 | { |
| 1970 | hwndActive = PERQDATA_GetActiveWnd( pActiveQueue->pQData ); |
| 1971 | QUEUE_Unlock( pActiveQueue ); |
| 1972 | } |
| 1973 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1974 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1975 | if (!hWnd) |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 1976 | return WINPOS_SetActiveWindow( 0, mouseMsg, TRUE ); |
Alexandre Julliard | 8cc3a5e | 1996-08-11 15:49:51 +0000 | [diff] [blame] | 1977 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 1978 | wndPtr = WIN_FindWndPtr(hWnd); |
| 1979 | if( !wndPtr ) return FALSE; |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1980 | |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 1981 | /* child windows get WM_CHILDACTIVATE message */ |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 1982 | if( (wndPtr->dwStyle & (WS_CHILD | WS_POPUP)) == WS_CHILD ) |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1983 | { |
| 1984 | retvalue = SendMessageA(hWnd, WM_CHILDACTIVATE, 0, 0L); |
| 1985 | goto end; |
| 1986 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1987 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1988 | if( hWnd == hwndActive ) |
| 1989 | { |
| 1990 | retvalue = FALSE; |
| 1991 | goto end; |
| 1992 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1993 | |
| 1994 | if( !WINPOS_SetActiveWindow(hWnd ,mouseMsg ,TRUE) ) |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 1995 | { |
| 1996 | retvalue = FALSE; |
| 1997 | goto end; |
| 1998 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 1999 | |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 2000 | /* switch desktop queue to current active */ |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2001 | wndTemp = WIN_GetDesktop(); |
| 2002 | if( wndPtr->parent == wndTemp) |
| 2003 | wndTemp->hmemTaskQ = wndPtr->hmemTaskQ; |
| 2004 | WIN_ReleaseDesktop(); |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 2005 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2006 | retvalue = TRUE; |
| 2007 | end: |
| 2008 | WIN_ReleaseWndPtr(wndPtr); |
| 2009 | return retvalue; |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 2010 | } |
| 2011 | |
| 2012 | |
Alexandre Julliard | 86a8d0f | 1994-01-18 23:04:40 +0000 | [diff] [blame] | 2013 | /*********************************************************************** |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2014 | * WINPOS_SendNCCalcSize |
| 2015 | * |
| 2016 | * Send a WM_NCCALCSIZE message to a window. |
| 2017 | * All parameters are read-only except newClientRect. |
| 2018 | * oldWindowRect, oldClientRect and winpos must be non-NULL only |
| 2019 | * when calcValidRect is TRUE. |
| 2020 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2021 | LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect, |
| 2022 | RECT *newWindowRect, RECT *oldWindowRect, |
| 2023 | RECT *oldClientRect, WINDOWPOS *winpos, |
| 2024 | RECT *newClientRect ) |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2025 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2026 | NCCALCSIZE_PARAMS params; |
| 2027 | WINDOWPOS winposCopy; |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2028 | LONG result; |
| 2029 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 2030 | params.rgrc[0] = *newWindowRect; |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2031 | if (calcValidRect) |
| 2032 | { |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 2033 | winposCopy = *winpos; |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 2034 | params.rgrc[1] = *oldWindowRect; |
| 2035 | params.rgrc[2] = *oldClientRect; |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 2036 | params.lppos = &winposCopy; |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2037 | } |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2038 | result = SendMessageA( hwnd, WM_NCCALCSIZE, calcValidRect, |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 2039 | (LPARAM)¶ms ); |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 2040 | TRACE("%d,%d-%d,%d\n", |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 2041 | params.rgrc[0].left, params.rgrc[0].top, |
| 2042 | params.rgrc[0].right, params.rgrc[0].bottom ); |
Abey George | c684d8e | 1999-09-03 15:09:57 +0000 | [diff] [blame] | 2043 | |
| 2044 | /* If the application send back garbage, ignore it */ |
| 2045 | if (params.rgrc[0].left <= params.rgrc[0].right && params.rgrc[0].top <= params.rgrc[0].bottom) |
| 2046 | *newClientRect = params.rgrc[0]; |
| 2047 | |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2048 | return result; |
| 2049 | } |
| 2050 | |
| 2051 | |
| 2052 | /*********************************************************************** |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 2053 | * WINPOS_HandleWindowPosChanging16 |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2054 | * |
| 2055 | * Default handling for a WM_WINDOWPOSCHANGING. Called from DefWindowProc(). |
| 2056 | */ |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 2057 | LONG WINPOS_HandleWindowPosChanging16( WND *wndPtr, WINDOWPOS16 *winpos ) |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2058 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2059 | POINT maxSize, minTrack; |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 2060 | if (winpos->flags & SWP_NOSIZE) return 0; |
| 2061 | if ((wndPtr->dwStyle & WS_THICKFRAME) || |
| 2062 | ((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) == 0)) |
| 2063 | { |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 2064 | WINPOS_GetMinMaxInfo( wndPtr, &maxSize, NULL, &minTrack, NULL ); |
| 2065 | if (maxSize.x < winpos->cx) winpos->cx = maxSize.x; |
| 2066 | if (maxSize.y < winpos->cy) winpos->cy = maxSize.y; |
| 2067 | if (!(wndPtr->dwStyle & WS_MINIMIZE)) |
| 2068 | { |
| 2069 | if (winpos->cx < minTrack.x ) winpos->cx = minTrack.x; |
| 2070 | if (winpos->cy < minTrack.y ) winpos->cy = minTrack.y; |
| 2071 | } |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 2072 | } |
| 2073 | return 0; |
| 2074 | } |
| 2075 | |
| 2076 | |
| 2077 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2078 | * WINPOS_HandleWindowPosChanging |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 2079 | * |
| 2080 | * Default handling for a WM_WINDOWPOSCHANGING. Called from DefWindowProc(). |
| 2081 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2082 | LONG WINPOS_HandleWindowPosChanging( WND *wndPtr, WINDOWPOS *winpos ) |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 2083 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2084 | POINT maxSize; |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 2085 | if (winpos->flags & SWP_NOSIZE) return 0; |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2086 | if ((wndPtr->dwStyle & WS_THICKFRAME) || |
Alexandre Julliard | ade697e | 1995-11-26 13:59:11 +0000 | [diff] [blame] | 2087 | ((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) == 0)) |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2088 | { |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 2089 | WINPOS_GetMinMaxInfo( wndPtr, &maxSize, NULL, NULL, NULL ); |
Alexandre Julliard | 902da69 | 1995-11-05 14:39:02 +0000 | [diff] [blame] | 2090 | winpos->cx = MIN( winpos->cx, maxSize.x ); |
| 2091 | winpos->cy = MIN( winpos->cy, maxSize.y ); |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2092 | } |
| 2093 | return 0; |
| 2094 | } |
| 2095 | |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2096 | /*********************************************************************** |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2097 | * SWP_DoOwnedPopups |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 2098 | * |
| 2099 | * fix Z order taking into account owned popups - |
Alexandre Julliard | a0d7731 | 1998-09-13 16:32:00 +0000 | [diff] [blame] | 2100 | * basically we need to maintain them above the window that owns them |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2101 | * |
| 2102 | * FIXME: hide/show owned popups when owner visibility changes. |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 2103 | */ |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2104 | static HWND SWP_DoOwnedPopups(WND* pDesktop, WND* wndPtr, HWND hwndInsertAfter, WORD flags) |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 2105 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2106 | WND* w = WIN_LockWndPtr(pDesktop->child); |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 2107 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 2108 | WARN("(%04x) hInsertAfter = %04x\n", wndPtr->hwndSelf, hwndInsertAfter ); |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 2109 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2110 | if( (wndPtr->dwStyle & WS_POPUP) && wndPtr->owner ) |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 2111 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2112 | /* make sure this popup stays above the owner */ |
| 2113 | |
| 2114 | HWND hwndLocalPrev = HWND_TOP; |
| 2115 | |
| 2116 | if( hwndInsertAfter != HWND_TOP ) |
| 2117 | { |
| 2118 | while( w != wndPtr->owner ) |
| 2119 | { |
| 2120 | if (w != wndPtr) hwndLocalPrev = w->hwndSelf; |
| 2121 | if( hwndLocalPrev == hwndInsertAfter ) break; |
| 2122 | WIN_UpdateWndPtr(&w,w->next); |
| 2123 | } |
| 2124 | hwndInsertAfter = hwndLocalPrev; |
| 2125 | } |
Alexandre Julliard | 2c69f6d | 1996-09-28 18:11:01 +0000 | [diff] [blame] | 2126 | } |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2127 | else if( wndPtr->dwStyle & WS_CHILD ) |
| 2128 | goto END; |
| 2129 | |
| 2130 | WIN_UpdateWndPtr(&w, pDesktop->child); |
| 2131 | |
| 2132 | while( w ) |
| 2133 | { |
| 2134 | if( w == wndPtr ) break; |
| 2135 | |
| 2136 | if( (w->dwStyle & WS_POPUP) && w->owner == wndPtr ) |
| 2137 | { |
| 2138 | SetWindowPos(w->hwndSelf, hwndInsertAfter, 0, 0, 0, 0, |
| 2139 | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOSENDCHANGING | SWP_DEFERERASE); |
| 2140 | hwndInsertAfter = w->hwndSelf; |
| 2141 | } |
| 2142 | WIN_UpdateWndPtr(&w, w->next); |
| 2143 | } |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 2144 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2145 | END: |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2146 | WIN_ReleaseWndPtr(w); |
| 2147 | return hwndInsertAfter; |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 2148 | } |
| 2149 | |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2150 | /*********************************************************************** |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2151 | * SWP_CopyValidBits |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2152 | * |
| 2153 | * Make window look nice without excessive repainting |
| 2154 | * |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2155 | * visible and update regions are in window coordinates |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2156 | * client and window rectangles are in parent client coordinates |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 2157 | * |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2158 | * FIXME: SWP_EX_PAINTSELF in uFlags works only if both old and new |
| 2159 | * window rects have the same origin. |
| 2160 | * |
| 2161 | * Returns: uFlags and a dirty region in *pVisRgn. |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2162 | */ |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2163 | static UINT SWP_CopyValidBits( WND* Wnd, HRGN* pVisRgn, |
| 2164 | LPRECT lpOldWndRect, |
| 2165 | LPRECT lpOldClientRect, UINT uFlags ) |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2166 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2167 | RECT r; |
| 2168 | HRGN newVisRgn, dirtyRgn; |
| 2169 | INT my = COMPLEXREGION; |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2170 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 2171 | TRACE("\tnew wnd=(%i %i-%i %i) old wnd=(%i %i-%i %i), %04x\n", |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 2172 | Wnd->rectWindow.left, Wnd->rectWindow.top, |
| 2173 | Wnd->rectWindow.right, Wnd->rectWindow.bottom, |
| 2174 | lpOldWndRect->left, lpOldWndRect->top, |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2175 | lpOldWndRect->right, lpOldWndRect->bottom, *pVisRgn); |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 2176 | TRACE("\tnew client=(%i %i-%i %i) old client=(%i %i-%i %i)\n", |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 2177 | Wnd->rectClient.left, Wnd->rectClient.top, |
| 2178 | Wnd->rectClient.right, Wnd->rectClient.bottom, |
| 2179 | lpOldClientRect->left, lpOldClientRect->top, |
| 2180 | lpOldClientRect->right,lpOldClientRect->bottom ); |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2181 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2182 | if( Wnd->hrgnUpdate == 1 ) |
| 2183 | uFlags |= SWP_EX_NOCOPY; /* whole window is invalid, nothing to copy */ |
Alexandre Julliard | 1e37a18 | 1996-08-18 16:21:52 +0000 | [diff] [blame] | 2184 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2185 | newVisRgn = DCE_GetVisRgn( Wnd->hwndSelf, DCX_WINDOW | DCX_CLIPSIBLINGS, 0, 0); |
| 2186 | dirtyRgn = CreateRectRgn( 0, 0, 0, 0 ); |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2187 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2188 | if( !(uFlags & SWP_EX_NOCOPY) ) /* make sure dst region covers only valid bits */ |
| 2189 | my = CombineRgn( dirtyRgn, newVisRgn, *pVisRgn, RGN_AND ); |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2190 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2191 | if( (my == NULLREGION) || (uFlags & SWP_EX_NOCOPY) ) |
| 2192 | { |
| 2193 | nocopy: |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2194 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 2195 | TRACE("\twon't copy anything!\n"); |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2196 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2197 | /* set dirtyRgn to the sum of old and new visible regions |
| 2198 | * in parent client coordinates */ |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2199 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2200 | OffsetRgn( newVisRgn, Wnd->rectWindow.left, Wnd->rectWindow.top ); |
| 2201 | OffsetRgn( *pVisRgn, lpOldWndRect->left, lpOldWndRect->top ); |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2202 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2203 | CombineRgn(*pVisRgn, *pVisRgn, newVisRgn, RGN_OR ); |
| 2204 | } |
| 2205 | else /* copy valid bits to a new location */ |
| 2206 | { |
| 2207 | INT dx, dy, ow, oh, nw, nh, ocw, ncw, och, nch; |
| 2208 | HRGN hrgnValid = dirtyRgn; /* non-empty intersection of old and new visible rgns */ |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2209 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2210 | /* subtract already invalid region inside Wnd from the dst region */ |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2211 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2212 | if( Wnd->hrgnUpdate ) |
| 2213 | if( CombineRgn( hrgnValid, hrgnValid, Wnd->hrgnUpdate, RGN_DIFF) == NULLREGION ) |
| 2214 | goto nocopy; |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2215 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2216 | /* check if entire window can be copied */ |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2217 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2218 | ow = lpOldWndRect->right - lpOldWndRect->left; |
| 2219 | oh = lpOldWndRect->bottom - lpOldWndRect->top; |
| 2220 | nw = Wnd->rectWindow.right - Wnd->rectWindow.left; |
| 2221 | nh = Wnd->rectWindow.bottom - Wnd->rectWindow.top; |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2222 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2223 | ocw = lpOldClientRect->right - lpOldClientRect->left; |
| 2224 | och = lpOldClientRect->bottom - lpOldClientRect->top; |
| 2225 | ncw = Wnd->rectClient.right - Wnd->rectClient.left; |
| 2226 | nch = Wnd->rectClient.bottom - Wnd->rectClient.top; |
| 2227 | |
| 2228 | if( (ocw != ncw) || (och != nch) || |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2229 | ( ow != nw) || ( oh != nh) || |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2230 | ((lpOldClientRect->top - lpOldWndRect->top) != |
| 2231 | (Wnd->rectClient.top - Wnd->rectWindow.top)) || |
| 2232 | ((lpOldClientRect->left - lpOldWndRect->left) != |
| 2233 | (Wnd->rectClient.left - Wnd->rectWindow.left)) ) |
| 2234 | { |
| 2235 | dx = Wnd->rectClient.left - lpOldClientRect->left; |
| 2236 | dy = Wnd->rectClient.top - lpOldClientRect->top; |
| 2237 | |
| 2238 | /* restrict valid bits to the common client rect */ |
| 2239 | |
| 2240 | r.left = Wnd->rectClient.left - Wnd->rectWindow.left; |
| 2241 | r.top = Wnd->rectClient.top - Wnd->rectWindow.top; |
| 2242 | r.right = r.left + MIN( ocw, ncw ); |
| 2243 | r.bottom = r.top + MIN( och, nch ); |
| 2244 | |
| 2245 | REGION_CropRgn( hrgnValid, hrgnValid, &r, |
| 2246 | (uFlags & SWP_EX_PAINTSELF) ? NULL : (POINT*)&(Wnd->rectWindow)); |
| 2247 | GetRgnBox( hrgnValid, &r ); |
| 2248 | if( IsRectEmpty( &r ) ) |
| 2249 | goto nocopy; |
| 2250 | r = *lpOldClientRect; |
| 2251 | } |
Alexandre Julliard | 1e37a18 | 1996-08-18 16:21:52 +0000 | [diff] [blame] | 2252 | else |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2253 | { |
| 2254 | dx = Wnd->rectWindow.left - lpOldWndRect->left; |
| 2255 | dy = Wnd->rectWindow.top - lpOldWndRect->top; |
| 2256 | if( !(uFlags & SWP_EX_PAINTSELF) ) |
| 2257 | OffsetRgn( hrgnValid, Wnd->rectWindow.left, Wnd->rectWindow.top ); |
| 2258 | r = *lpOldWndRect; |
| 2259 | } |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2260 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2261 | if( !(uFlags & SWP_EX_PAINTSELF) ) |
| 2262 | { |
| 2263 | /* Move remaining regions to parent coordinates */ |
| 2264 | OffsetRgn( newVisRgn, Wnd->rectWindow.left, Wnd->rectWindow.top ); |
| 2265 | OffsetRgn( *pVisRgn, lpOldWndRect->left, lpOldWndRect->top ); |
| 2266 | } |
| 2267 | else |
| 2268 | OffsetRect( &r, -lpOldWndRect->left, -lpOldWndRect->top ); |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2269 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 2270 | TRACE("\tcomputing dirty region!\n"); |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2271 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2272 | /* Compute combined dirty region (old + new - valid) */ |
| 2273 | CombineRgn( *pVisRgn, *pVisRgn, newVisRgn, RGN_OR); |
| 2274 | CombineRgn( *pVisRgn, *pVisRgn, hrgnValid, RGN_DIFF); |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2275 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2276 | /* Blt valid bits, r is the rect to copy */ |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2277 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2278 | if( dx || dy ) |
| 2279 | { |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2280 | RECT rClip; |
| 2281 | HDC hDC; |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2282 | DC* dc; |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2283 | |
| 2284 | /* get DC and clip rect with drawable rect to avoid superfluous expose events |
| 2285 | from copying clipped areas */ |
| 2286 | |
| 2287 | if( uFlags & SWP_EX_PAINTSELF ) |
| 2288 | { |
| 2289 | hDC = GetDCEx( Wnd->hwndSelf, hrgnValid, DCX_WINDOW | DCX_CACHE | |
| 2290 | DCX_KEEPCLIPRGN | DCX_INTERSECTRGN | DCX_CLIPSIBLINGS ); |
| 2291 | rClip.right = nw; rClip.bottom = nh; |
| 2292 | } |
| 2293 | else |
| 2294 | { |
| 2295 | hDC = GetDCEx( Wnd->parent->hwndSelf, hrgnValid, DCX_CACHE | |
| 2296 | DCX_KEEPCLIPRGN | DCX_INTERSECTRGN | DCX_CLIPSIBLINGS ); |
| 2297 | rClip.right = Wnd->parent->rectClient.right - Wnd->parent->rectClient.left; |
| 2298 | rClip.bottom = Wnd->parent->rectClient.bottom - Wnd->parent->rectClient.top; |
| 2299 | } |
| 2300 | rClip.left = rClip.top = 0; |
| 2301 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2302 | if( (dc = (DC *)GDI_GetObjPtr(hDC, DC_MAGIC)) ) |
| 2303 | { |
| 2304 | if( oh > nh ) r.bottom = r.top + nh; |
| 2305 | if( ow < nw ) r.right = r.left + nw; |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2306 | |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2307 | if( IntersectRect( &r, &r, &rClip ) ) |
Abey George | 8beefb5 | 1999-07-18 15:40:03 +0000 | [diff] [blame] | 2308 | { |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2309 | Wnd->pDriver->pSurfaceCopy( Wnd->parent, dc, dx, dy, &r, TRUE ); |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2310 | |
Abey George | 8beefb5 | 1999-07-18 15:40:03 +0000 | [diff] [blame] | 2311 | /* When you copy the bits without repainting, parent doesn't |
| 2312 | get validated appropriately. Therefore, we have to validate |
| 2313 | the parent with the windows' updated region when the |
| 2314 | parent's update region is not empty. */ |
| 2315 | |
| 2316 | if (Wnd->parent->hrgnUpdate != 0 && !(Wnd->parent->dwStyle & WS_CLIPCHILDREN)) |
| 2317 | { |
| 2318 | OffsetRect(&r, dx, dy); |
| 2319 | ValidateRect(Wnd->parent->hwndSelf, &r); |
| 2320 | } |
| 2321 | } |
| 2322 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2323 | GDI_HEAP_UNLOCK( hDC ); |
| 2324 | } |
| 2325 | ReleaseDC( (uFlags & SWP_EX_PAINTSELF) ? |
| 2326 | Wnd->hwndSelf : Wnd->parent->hwndSelf, hDC); |
| 2327 | } |
| 2328 | } |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2329 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2330 | /* *pVisRgn now points to the invalidated region */ |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2331 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2332 | DeleteObject(newVisRgn); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2333 | DeleteObject(dirtyRgn); |
Alexandre Julliard | 1e37a18 | 1996-08-18 16:21:52 +0000 | [diff] [blame] | 2334 | return uFlags; |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2335 | } |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2336 | |
Alexandre Julliard | 22945d5 | 1995-03-02 17:44:29 +0000 | [diff] [blame] | 2337 | /*********************************************************************** |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2338 | * SWP_DoSimpleFrameChanged |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2339 | * |
| 2340 | * NOTE: old and new client rect origins are identical, only |
| 2341 | * extents may have changed. Window extents are the same. |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2342 | */ |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2343 | static void SWP_DoSimpleFrameChanged( WND* wndPtr, RECT* pOldClientRect, WORD swpFlags, UINT uFlags ) |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2344 | { |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2345 | INT i = 0; |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2346 | RECT rect; |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2347 | HRGN hrgn = 0; |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2348 | |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2349 | if( !(swpFlags & SWP_NOCLIENTSIZE) ) |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2350 | { |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2351 | /* Client rect changed its position/size, most likely a scrollar |
| 2352 | * was added/removed. |
| 2353 | * |
| 2354 | * FIXME: WVR alignment flags |
| 2355 | */ |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2356 | |
| 2357 | if( wndPtr->rectClient.right > pOldClientRect->right ) /* right edge */ |
| 2358 | { |
| 2359 | i++; |
| 2360 | rect.top = 0; |
| 2361 | rect.bottom = wndPtr->rectClient.bottom - wndPtr->rectClient.top; |
| 2362 | rect.right = wndPtr->rectClient.right - wndPtr->rectClient.left; |
| 2363 | if(!(uFlags & SWP_EX_NOCOPY)) |
| 2364 | rect.left = pOldClientRect->right - wndPtr->rectClient.left; |
| 2365 | else |
| 2366 | { |
| 2367 | rect.left = 0; |
| 2368 | goto redraw; |
| 2369 | } |
| 2370 | } |
| 2371 | |
| 2372 | if( wndPtr->rectClient.bottom > pOldClientRect->bottom ) /* bottom edge */ |
| 2373 | { |
| 2374 | if( i ) |
| 2375 | hrgn = CreateRectRgnIndirect( &rect ); |
| 2376 | rect.left = 0; |
| 2377 | rect.right = wndPtr->rectClient.right - wndPtr->rectClient.left; |
| 2378 | rect.bottom = wndPtr->rectClient.bottom - wndPtr->rectClient.top; |
| 2379 | if(!(uFlags & SWP_EX_NOCOPY)) |
| 2380 | rect.top = pOldClientRect->bottom - wndPtr->rectClient.top; |
| 2381 | else |
| 2382 | rect.top = 0; |
| 2383 | if( i++ ) |
| 2384 | REGION_UnionRectWithRgn( hrgn, &rect ); |
| 2385 | } |
| 2386 | |
| 2387 | if( i == 0 && (uFlags & SWP_EX_NOCOPY) ) /* force redraw anyway */ |
| 2388 | { |
| 2389 | rect = wndPtr->rectWindow; |
| 2390 | OffsetRect( &rect, wndPtr->rectWindow.left - wndPtr->rectClient.left, |
| 2391 | wndPtr->rectWindow.top - wndPtr->rectClient.top ); |
| 2392 | i++; |
| 2393 | } |
| 2394 | } |
| 2395 | |
| 2396 | if( i ) |
| 2397 | { |
| 2398 | redraw: |
| 2399 | PAINT_RedrawWindow( wndPtr->hwndSelf, &rect, hrgn, RDW_INVALIDATE | RDW_FRAME | RDW_ERASE | |
| 2400 | RDW_ERASENOW | RDW_ALLCHILDREN, RDW_EX_TOPFRAME | RDW_EX_USEHRGN ); |
| 2401 | } |
| 2402 | else |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2403 | { |
| 2404 | WIN_UpdateNCRgn(wndPtr, 0, UNC_UPDATE | UNC_ENTIRE); |
| 2405 | } |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2406 | |
| 2407 | if( hrgn > 1 ) |
| 2408 | DeleteObject( hrgn ); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2409 | } |
| 2410 | |
| 2411 | /*********************************************************************** |
| 2412 | * SWP_DoWinPosChanging |
| 2413 | */ |
| 2414 | static BOOL SWP_DoWinPosChanging( WND* wndPtr, WINDOWPOS* pWinpos, |
| 2415 | RECT* pNewWindowRect, RECT* pNewClientRect ) |
| 2416 | { |
| 2417 | /* Send WM_WINDOWPOSCHANGING message */ |
| 2418 | |
| 2419 | if (!(pWinpos->flags & SWP_NOSENDCHANGING)) |
| 2420 | SendMessageA( wndPtr->hwndSelf, WM_WINDOWPOSCHANGING, 0, (LPARAM)pWinpos ); |
| 2421 | |
| 2422 | /* Calculate new position and size */ |
| 2423 | |
| 2424 | *pNewWindowRect = wndPtr->rectWindow; |
| 2425 | *pNewClientRect = (wndPtr->dwStyle & WS_MINIMIZE) ? wndPtr->rectWindow |
| 2426 | : wndPtr->rectClient; |
| 2427 | |
| 2428 | if (!(pWinpos->flags & SWP_NOSIZE)) |
| 2429 | { |
| 2430 | pNewWindowRect->right = pNewWindowRect->left + pWinpos->cx; |
| 2431 | pNewWindowRect->bottom = pNewWindowRect->top + pWinpos->cy; |
| 2432 | } |
| 2433 | if (!(pWinpos->flags & SWP_NOMOVE)) |
| 2434 | { |
| 2435 | pNewWindowRect->left = pWinpos->x; |
| 2436 | pNewWindowRect->top = pWinpos->y; |
| 2437 | pNewWindowRect->right += pWinpos->x - wndPtr->rectWindow.left; |
| 2438 | pNewWindowRect->bottom += pWinpos->y - wndPtr->rectWindow.top; |
| 2439 | |
| 2440 | OffsetRect( pNewClientRect, pWinpos->x - wndPtr->rectWindow.left, |
| 2441 | pWinpos->y - wndPtr->rectWindow.top ); |
| 2442 | } |
| 2443 | |
| 2444 | pWinpos->flags |= SWP_NOCLIENTMOVE | SWP_NOCLIENTSIZE; |
| 2445 | return TRUE; |
| 2446 | } |
| 2447 | |
| 2448 | /*********************************************************************** |
| 2449 | * SWP_DoNCCalcSize |
| 2450 | */ |
| 2451 | static UINT SWP_DoNCCalcSize( WND* wndPtr, WINDOWPOS* pWinpos, |
| 2452 | RECT* pNewWindowRect, RECT* pNewClientRect, WORD f) |
| 2453 | { |
| 2454 | UINT wvrFlags = 0; |
| 2455 | |
| 2456 | /* Send WM_NCCALCSIZE message to get new client area */ |
| 2457 | if( (pWinpos->flags & (SWP_FRAMECHANGED | SWP_NOSIZE)) != SWP_NOSIZE ) |
| 2458 | { |
| 2459 | wvrFlags = WINPOS_SendNCCalcSize( pWinpos->hwnd, TRUE, pNewWindowRect, |
| 2460 | &wndPtr->rectWindow, &wndPtr->rectClient, |
| 2461 | pWinpos, pNewClientRect ); |
| 2462 | |
| 2463 | /* FIXME: WVR_ALIGNxxx */ |
| 2464 | |
| 2465 | if( pNewClientRect->left != wndPtr->rectClient.left || |
| 2466 | pNewClientRect->top != wndPtr->rectClient.top ) |
| 2467 | pWinpos->flags &= ~SWP_NOCLIENTMOVE; |
| 2468 | |
| 2469 | if( (pNewClientRect->right - pNewClientRect->left != |
| 2470 | wndPtr->rectClient.right - wndPtr->rectClient.left) || |
| 2471 | (pNewClientRect->bottom - pNewClientRect->top != |
| 2472 | wndPtr->rectClient.bottom - wndPtr->rectClient.top) ) |
| 2473 | pWinpos->flags &= ~SWP_NOCLIENTSIZE; |
| 2474 | } |
| 2475 | else |
| 2476 | if( !(f & SWP_NOMOVE) && (pNewClientRect->left != wndPtr->rectClient.left || |
| 2477 | pNewClientRect->top != wndPtr->rectClient.top) ) |
| 2478 | pWinpos->flags &= ~SWP_NOCLIENTMOVE; |
| 2479 | return wvrFlags; |
| 2480 | } |
| 2481 | |
| 2482 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2483 | * SetWindowPos (USER.2) |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2484 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 2485 | BOOL16 WINAPI SetWindowPos16( HWND16 hwnd, HWND16 hwndInsertAfter, |
| 2486 | INT16 x, INT16 y, INT16 cx, INT16 cy, WORD flags) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2487 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2488 | return SetWindowPos(hwnd,(INT)(INT16)hwndInsertAfter,x,y,cx,cy,flags); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2489 | } |
| 2490 | |
| 2491 | /*********************************************************************** |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 2492 | * SetWindowPos (USER32.520) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2493 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2494 | BOOL WINAPI SetWindowPos( HWND hwnd, HWND hwndInsertAfter, |
Ulrich Weigand | 7f53c57 | 1999-06-18 17:03:13 +0000 | [diff] [blame] | 2495 | INT x, INT y, INT cx, INT cy, UINT flags ) |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2496 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2497 | WINDOWPOS winpos; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2498 | WND * wndPtr,*wndTemp; |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2499 | RECT newWindowRect, newClientRect; |
| 2500 | RECT oldWindowRect, oldClientRect; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2501 | HRGN visRgn = 0; |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2502 | UINT wvrFlags = 0, uFlags = 0; |
Ulrich Weigand | 7f53c57 | 1999-06-18 17:03:13 +0000 | [diff] [blame] | 2503 | BOOL retvalue, resync = FALSE, bChangePos; |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2504 | HWND hwndActive = 0; |
Noel Borthwick | b427856 | 1999-02-05 10:37:53 +0000 | [diff] [blame] | 2505 | |
| 2506 | /* Get current active window from the active queue */ |
| 2507 | if ( hActiveQueue ) |
| 2508 | { |
| 2509 | MESSAGEQUEUE *pActiveQueue = QUEUE_Lock( hActiveQueue ); |
| 2510 | if ( pActiveQueue ) |
| 2511 | { |
| 2512 | hwndActive = PERQDATA_GetActiveWnd( pActiveQueue->pQData ); |
| 2513 | QUEUE_Unlock( pActiveQueue ); |
| 2514 | } |
| 2515 | } |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2516 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 2517 | TRACE("hwnd %04x, swp (%i,%i)-(%i,%i) flags %08x\n", |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 2518 | hwnd, x, y, x+cx, y+cy, flags); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2519 | |
Ulrich Weigand | 7f53c57 | 1999-06-18 17:03:13 +0000 | [diff] [blame] | 2520 | bChangePos = !(flags & SWP_WINE_NOHOSTMOVE); |
| 2521 | flags &= ~SWP_WINE_NOHOSTMOVE; |
| 2522 | |
| 2523 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2524 | /* ------------------------------------------------------------------------ CHECKS */ |
| 2525 | |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2526 | /* Check window handle */ |
| 2527 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2528 | if (hwnd == GetDesktopWindow()) return FALSE; |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2529 | if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE; |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2530 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 2531 | TRACE("\tcurrent (%i,%i)-(%i,%i), style %08x\n", wndPtr->rectWindow.left, wndPtr->rectWindow.top, |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2532 | wndPtr->rectWindow.right, wndPtr->rectWindow.bottom, (unsigned)wndPtr->dwStyle ); |
| 2533 | |
| 2534 | /* Fix redundant flags */ |
| 2535 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 2536 | if(wndPtr->dwStyle & WS_VISIBLE) |
Alexandre Julliard | e658d82 | 1997-11-30 17:45:40 +0000 | [diff] [blame] | 2537 | flags &= ~SWP_SHOWWINDOW; |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 2538 | else |
| 2539 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2540 | if (!(flags & SWP_SHOWWINDOW)) |
| 2541 | flags |= SWP_NOREDRAW; |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 2542 | flags &= ~SWP_HIDEWINDOW; |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 2543 | } |
| 2544 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2545 | if ( cx < 0 ) cx = 0; if( cy < 0 ) cy = 0; |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2546 | |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2547 | if ((wndPtr->rectWindow.right - wndPtr->rectWindow.left == cx) && |
| 2548 | (wndPtr->rectWindow.bottom - wndPtr->rectWindow.top == cy)) |
| 2549 | flags |= SWP_NOSIZE; /* Already the right size */ |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2550 | |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2551 | if ((wndPtr->rectWindow.left == x) && (wndPtr->rectWindow.top == y)) |
| 2552 | flags |= SWP_NOMOVE; /* Already the right position */ |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2553 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2554 | if (hwnd == hwndActive) |
| 2555 | flags |= SWP_NOACTIVATE; /* Already active */ |
Ulrich Weigand | c758201 | 1999-05-22 18:54:41 +0000 | [diff] [blame] | 2556 | else if ( (wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) != WS_CHILD ) |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2557 | { |
| 2558 | if(!(flags & SWP_NOACTIVATE)) /* Bring to the top when activating */ |
| 2559 | { |
| 2560 | flags &= ~SWP_NOZORDER; |
| 2561 | hwndInsertAfter = HWND_TOP; |
| 2562 | goto Pos; |
| 2563 | } |
| 2564 | } |
| 2565 | |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2566 | /* Check hwndInsertAfter */ |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2567 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2568 | /* FIXME: TOPMOST not supported yet */ |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2569 | if ((hwndInsertAfter == HWND_TOPMOST) || |
| 2570 | (hwndInsertAfter == HWND_NOTOPMOST)) hwndInsertAfter = HWND_TOP; |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2571 | |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2572 | /* hwndInsertAfter must be a sibling of the window */ |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2573 | if ((hwndInsertAfter != HWND_TOP) && (hwndInsertAfter != HWND_BOTTOM)) |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2574 | { |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2575 | WND* wnd = WIN_FindWndPtr(hwndInsertAfter); |
Alexandre Julliard | 642d313 | 1998-07-12 19:29:36 +0000 | [diff] [blame] | 2576 | |
Huw D M Davies | 1b45020 | 1999-01-31 09:17:38 +0000 | [diff] [blame] | 2577 | if( wnd ) { |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2578 | if( wnd->parent != wndPtr->parent ) |
| 2579 | { |
| 2580 | retvalue = FALSE; |
| 2581 | WIN_ReleaseWndPtr(wnd); |
| 2582 | goto END; |
| 2583 | } |
Alexandre Julliard | 642d313 | 1998-07-12 19:29:36 +0000 | [diff] [blame] | 2584 | if( wnd->next == wndPtr ) flags |= SWP_NOZORDER; |
| 2585 | } |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2586 | WIN_ReleaseWndPtr(wnd); |
Jesper Skov | 5c3e457 | 1998-11-01 19:27:22 +0000 | [diff] [blame] | 2587 | } |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2588 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2589 | Pos: /* ------------------------------------------------------------------------ MAIN part */ |
| 2590 | |
Alexandre Julliard | 2787be8 | 1995-05-22 18:23:01 +0000 | [diff] [blame] | 2591 | /* Fill the WINDOWPOS structure */ |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2592 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 2593 | winpos.hwnd = hwnd; |
| 2594 | winpos.hwndInsertAfter = hwndInsertAfter; |
| 2595 | winpos.x = x; |
| 2596 | winpos.y = y; |
| 2597 | winpos.cx = cx; |
| 2598 | winpos.cy = cy; |
| 2599 | winpos.flags = flags; |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2600 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2601 | SWP_DoWinPosChanging( wndPtr, &winpos, &newWindowRect, &newClientRect ); |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2602 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2603 | if((winpos.flags & (SWP_NOZORDER | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) != SWP_NOZORDER) |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2604 | { |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 2605 | if( wndPtr->parent == WIN_GetDesktop() ) |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2606 | hwndInsertAfter = SWP_DoOwnedPopups( wndPtr->parent, wndPtr, |
| 2607 | hwndInsertAfter, winpos.flags ); |
| 2608 | WIN_ReleaseDesktop(); |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2609 | } |
| 2610 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2611 | if(!(wndPtr->flags & WIN_NATIVE) ) |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 2612 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2613 | if( hwndInsertAfter == HWND_TOP ) |
| 2614 | winpos.flags |= ( wndPtr->parent->child == wndPtr)? SWP_NOZORDER: 0; |
| 2615 | else |
| 2616 | if( hwndInsertAfter == HWND_BOTTOM ) |
| 2617 | winpos.flags |= ( wndPtr->next )? 0: SWP_NOZORDER; |
| 2618 | else |
| 2619 | if( !(winpos.flags & SWP_NOZORDER) ) |
| 2620 | if( GetWindow(hwndInsertAfter, GW_HWNDNEXT) == wndPtr->hwndSelf ) |
| 2621 | winpos.flags |= SWP_NOZORDER; |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2622 | |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2623 | if( !(winpos.flags & (SWP_NOREDRAW | SWP_SHOWWINDOW)) && |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2624 | ((winpos.flags & (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_HIDEWINDOW | SWP_FRAMECHANGED)) |
| 2625 | != (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER)) ) |
| 2626 | { |
| 2627 | /* get a previous visible region for SWP_CopyValidBits() */ |
Thuy Nguyen | f18e7c3 | 1999-07-27 17:03:16 +0000 | [diff] [blame] | 2628 | DWORD flags = DCX_WINDOW; |
| 2629 | |
| 2630 | if (wndPtr->dwStyle & WS_CLIPSIBLINGS) |
| 2631 | flags |= DCX_CLIPSIBLINGS; |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2632 | |
Thuy Nguyen | f18e7c3 | 1999-07-27 17:03:16 +0000 | [diff] [blame] | 2633 | visRgn = DCE_GetVisRgn(hwnd, flags, 0, 0); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2634 | } |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 2635 | } |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2636 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2637 | /* Common operations */ |
| 2638 | |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2639 | wvrFlags = SWP_DoNCCalcSize( wndPtr, &winpos, &newWindowRect, &newClientRect, flags ); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2640 | |
Rein Klazes | d38f600 | 2000-01-08 22:22:28 +0000 | [diff] [blame] | 2641 | if(!(winpos.flags & SWP_NOZORDER) && winpos.hwnd != hwndInsertAfter) |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2642 | { |
Eric Pouech | 6cf348d | 1999-05-22 19:20:02 +0000 | [diff] [blame] | 2643 | if ( WIN_UnlinkWindow( winpos.hwnd ) ) |
| 2644 | WIN_LinkWindow( winpos.hwnd, hwndInsertAfter ); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2645 | } |
| 2646 | |
| 2647 | /* Reset active DCEs */ |
Alexandre Julliard | 1e9ac79 | 1996-06-06 18:38:27 +0000 | [diff] [blame] | 2648 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 2649 | if( (((winpos.flags & SWP_AGG_NOPOSCHANGE) != SWP_AGG_NOPOSCHANGE) && |
| 2650 | wndPtr->dwStyle & WS_VISIBLE) || |
| 2651 | (flags & (SWP_HIDEWINDOW | SWP_SHOWWINDOW)) ) |
| 2652 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2653 | RECT rect; |
Alexandre Julliard | 1e9ac79 | 1996-06-06 18:38:27 +0000 | [diff] [blame] | 2654 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2655 | UnionRect(&rect, &newWindowRect, &wndPtr->rectWindow); |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 2656 | DCE_InvalidateDCE(wndPtr, &rect); |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 2657 | } |
Alexandre Julliard | 1e9ac79 | 1996-06-06 18:38:27 +0000 | [diff] [blame] | 2658 | |
Alexandre Julliard | 1e37a18 | 1996-08-18 16:21:52 +0000 | [diff] [blame] | 2659 | oldWindowRect = wndPtr->rectWindow; |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2660 | oldClientRect = wndPtr->rectClient; |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2661 | |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2662 | /* Find out if we have to redraw the whole client rect */ |
| 2663 | |
| 2664 | if( oldClientRect.bottom - oldClientRect.top == |
| 2665 | newClientRect.bottom - newClientRect.top ) wvrFlags &= ~WVR_VREDRAW; |
| 2666 | |
| 2667 | if( oldClientRect.right - oldClientRect.left == |
| 2668 | newClientRect.right - newClientRect.left ) wvrFlags &= ~WVR_HREDRAW; |
| 2669 | |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2670 | if( (winpos.flags & SWP_NOCOPYBITS) || (!(winpos.flags & SWP_NOCLIENTSIZE) && |
| 2671 | (wvrFlags >= WVR_HREDRAW) && (wvrFlags < WVR_VALIDRECTS)) ) |
| 2672 | { |
| 2673 | uFlags |= SWP_EX_NOCOPY; |
| 2674 | } |
| 2675 | /* |
| 2676 | * Use this later in CopyValidBits() |
| 2677 | * |
| 2678 | else if( 0 ) |
| 2679 | uFlags |= SWP_EX_NONCLIENT; |
| 2680 | */ |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2681 | |
| 2682 | /* FIXME: actually do something with WVR_VALIDRECTS */ |
| 2683 | |
| 2684 | wndPtr->rectWindow = newWindowRect; |
| 2685 | wndPtr->rectClient = newClientRect; |
| 2686 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2687 | if (wndPtr->flags & WIN_NATIVE) /* -------------------------------------------- hosted window */ |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2688 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2689 | BOOL bCallDriver = TRUE; |
| 2690 | HWND tempInsertAfter = winpos.hwndInsertAfter; |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 2691 | |
Alexandre Julliard | d37eb36 | 1997-07-20 16:23:21 +0000 | [diff] [blame] | 2692 | winpos.hwndInsertAfter = hwndInsertAfter; |
Alexandre Julliard | 1e37a18 | 1996-08-18 16:21:52 +0000 | [diff] [blame] | 2693 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2694 | if( !(winpos.flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW | SWP_NOREDRAW)) ) |
Jesper Skov | 5c3e457 | 1998-11-01 19:27:22 +0000 | [diff] [blame] | 2695 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2696 | /* This is the only place where we need to force repainting of the contents |
| 2697 | of windows created by the host window system, all other cases go through the |
| 2698 | expose event handling */ |
| 2699 | |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2700 | if( (winpos.flags & (SWP_NOSIZE | SWP_FRAMECHANGED)) == (SWP_NOSIZE | SWP_FRAMECHANGED) ) |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2701 | { |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2702 | cx = newWindowRect.right - newWindowRect.left; |
| 2703 | cy = newWindowRect.bottom - newWindowRect.top; |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2704 | |
Ulrich Weigand | 7f53c57 | 1999-06-18 17:03:13 +0000 | [diff] [blame] | 2705 | wndPtr->pDriver->pSetWindowPos(wndPtr, &winpos, bChangePos); |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2706 | winpos.hwndInsertAfter = tempInsertAfter; |
| 2707 | bCallDriver = FALSE; |
| 2708 | |
| 2709 | if( winpos.flags & SWP_NOCLIENTMOVE ) |
| 2710 | SWP_DoSimpleFrameChanged(wndPtr, &oldClientRect, winpos.flags, uFlags ); |
| 2711 | else |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2712 | { |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2713 | /* client area moved but window extents remained the same, copy valid bits */ |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2714 | |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2715 | visRgn = CreateRectRgn( 0, 0, cx, cy ); |
| 2716 | uFlags = SWP_CopyValidBits( wndPtr, &visRgn, &oldWindowRect, &oldClientRect, |
| 2717 | uFlags | SWP_EX_PAINTSELF ); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2718 | } |
| 2719 | } |
| 2720 | } |
| 2721 | |
| 2722 | if( bCallDriver ) |
| 2723 | { |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2724 | if( !(winpos.flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW | SWP_NOREDRAW)) ) |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2725 | { |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2726 | if( (oldClientRect.left - oldWindowRect.left == newClientRect.left - newWindowRect.left) && |
| 2727 | (oldClientRect.top - oldWindowRect.top == newClientRect.top - newWindowRect.top) && |
| 2728 | !(uFlags & SWP_EX_NOCOPY) ) |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2729 | { |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2730 | /* The origin of the client rect didn't move so we can try to repaint |
| 2731 | * only the nonclient area by setting bit gravity hint for the host window system. |
| 2732 | */ |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2733 | |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2734 | if( !(wndPtr->flags & WIN_MANAGED) ) |
| 2735 | { |
| 2736 | HRGN hrgn = CreateRectRgn( 0, 0, newWindowRect.right - newWindowRect.left, |
| 2737 | newWindowRect.bottom - newWindowRect.top); |
| 2738 | RECT rcn = newClientRect; |
| 2739 | RECT rco = oldClientRect; |
| 2740 | |
| 2741 | OffsetRect( &rcn, -newWindowRect.left, -newWindowRect.top ); |
| 2742 | OffsetRect( &rco, -oldWindowRect.left, -oldWindowRect.top ); |
| 2743 | IntersectRect( &rcn, &rcn, &rco ); |
| 2744 | visRgn = CreateRectRgnIndirect( &rcn ); |
| 2745 | CombineRgn( visRgn, hrgn, visRgn, RGN_DIFF ); |
| 2746 | DeleteObject( hrgn ); |
| 2747 | uFlags = SWP_EX_PAINTSELF; |
| 2748 | } |
| 2749 | wndPtr->pDriver->pSetHostAttr(wndPtr, HAK_BITGRAVITY, BGNorthWest ); |
| 2750 | } |
| 2751 | else |
| 2752 | wndPtr->pDriver->pSetHostAttr(wndPtr, HAK_BITGRAVITY, BGForget ); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2753 | } |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2754 | |
Ulrich Weigand | 7f53c57 | 1999-06-18 17:03:13 +0000 | [diff] [blame] | 2755 | wndPtr->pDriver->pSetWindowPos(wndPtr, &winpos, bChangePos); |
Alex Korobka | 9844749 | 1999-05-08 17:57:09 +0000 | [diff] [blame] | 2756 | winpos.hwndInsertAfter = tempInsertAfter; |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2757 | } |
Alexandre Julliard | cdcdede | 1996-04-21 14:57:41 +0000 | [diff] [blame] | 2758 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2759 | if( winpos.flags & SWP_SHOWWINDOW ) |
| 2760 | { |
| 2761 | HWND focus, curr; |
| 2762 | |
| 2763 | wndPtr->dwStyle |= WS_VISIBLE; |
| 2764 | |
| 2765 | if (wndPtr->flags & WIN_MANAGED) resync = TRUE; |
| 2766 | |
| 2767 | /* focus was set to unmapped window, reset host focus |
| 2768 | * since the window is now visible */ |
| 2769 | |
| 2770 | focus = curr = GetFocus(); |
| 2771 | while (curr) |
| 2772 | { |
| 2773 | if (curr == hwnd) |
| 2774 | { |
| 2775 | WND *pFocus = WIN_FindWndPtr( focus ); |
| 2776 | if (pFocus) |
| 2777 | pFocus->pDriver->pSetFocus(pFocus); |
| 2778 | WIN_ReleaseWndPtr(pFocus); |
| 2779 | break; |
| 2780 | } |
| 2781 | curr = GetParent(curr); |
Alexandre Julliard | e2bfa4c | 1996-05-16 18:21:06 +0000 | [diff] [blame] | 2782 | } |
Jesper Skov | 5c3e457 | 1998-11-01 19:27:22 +0000 | [diff] [blame] | 2783 | } |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2784 | } |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2785 | else /* -------------------------------------------- emulated window */ |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2786 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2787 | if( winpos.flags & SWP_SHOWWINDOW ) |
Alexandre Julliard | 1e37a18 | 1996-08-18 16:21:52 +0000 | [diff] [blame] | 2788 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2789 | wndPtr->dwStyle |= WS_VISIBLE; |
| 2790 | uFlags |= SWP_EX_PAINTSELF; |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2791 | visRgn = 1; /* redraw the whole window */ |
Alexandre Julliard | 1e37a18 | 1996-08-18 16:21:52 +0000 | [diff] [blame] | 2792 | } |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2793 | else if( !(winpos.flags & SWP_NOREDRAW) ) |
| 2794 | { |
| 2795 | if( winpos.flags & SWP_HIDEWINDOW ) |
| 2796 | { |
| 2797 | if( visRgn > 1 ) /* map to parent */ |
| 2798 | OffsetRgn( visRgn, oldWindowRect.left, oldWindowRect.top ); |
| 2799 | else |
| 2800 | visRgn = 0; |
Alexandre Julliard | e658d82 | 1997-11-30 17:45:40 +0000 | [diff] [blame] | 2801 | } |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2802 | else |
| 2803 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2804 | if( (winpos.flags & SWP_AGG_NOPOSCHANGE) != SWP_AGG_NOPOSCHANGE ) |
| 2805 | uFlags = SWP_CopyValidBits(wndPtr, &visRgn, &oldWindowRect, |
| 2806 | &oldClientRect, uFlags); |
| 2807 | else |
| 2808 | { |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2809 | /* nothing moved, redraw frame if needed */ |
| 2810 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2811 | if( winpos.flags & SWP_FRAMECHANGED ) |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2812 | SWP_DoSimpleFrameChanged( wndPtr, &oldClientRect, winpos.flags, uFlags ); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2813 | if( visRgn ) |
| 2814 | { |
| 2815 | DeleteObject( visRgn ); |
| 2816 | visRgn = 0; |
| 2817 | } |
| 2818 | } |
| 2819 | } |
Alexandre Julliard | e658d82 | 1997-11-30 17:45:40 +0000 | [diff] [blame] | 2820 | } |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2821 | } |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2822 | |
| 2823 | if( winpos.flags & SWP_HIDEWINDOW ) |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2824 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2825 | wndPtr->dwStyle &= ~WS_VISIBLE; |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 2826 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2827 | if (hwnd == CARET_GetHwnd()) DestroyCaret(); |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2828 | } |
| 2829 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2830 | /* ------------------------------------------------------------------------ FINAL */ |
| 2831 | |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2832 | if (wndPtr->flags & WIN_NATIVE) |
Ulrich Weigand | 203780e | 1999-07-10 10:24:31 +0000 | [diff] [blame] | 2833 | EVENT_Synchronize(); /* Synchronize with the host window system */ |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 2834 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2835 | if (!GetCapture() && ((wndPtr->dwStyle & WS_VISIBLE) || (flags & SWP_HIDEWINDOW))) |
Ulrich Weigand | 153334e | 1999-06-05 09:02:11 +0000 | [diff] [blame] | 2836 | { |
| 2837 | /* Simulate a mouse event to set the cursor */ |
Lionel Ulmer | acc7467 | 1999-11-07 21:25:57 +0000 | [diff] [blame] | 2838 | int iWndsLocks = WIN_SuspendWndsLock(); |
| 2839 | |
| 2840 | hardware_event( WM_MOUSEMOVE, GET_KEYSTATE(), 0, |
| 2841 | PosX, PosY, GetTickCount(), 0 ); |
| 2842 | |
| 2843 | WIN_RestoreWndsLock(iWndsLocks); |
Ulrich Weigand | 153334e | 1999-06-05 09:02:11 +0000 | [diff] [blame] | 2844 | } |
Alexandre Julliard | d471965 | 1995-12-12 18:49:11 +0000 | [diff] [blame] | 2845 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2846 | wndTemp = WIN_GetDesktop(); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2847 | |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2848 | /* repaint invalidated region (if any) |
| 2849 | * |
| 2850 | * FIXME: if SWP_NOACTIVATE is not set then set invalid regions here without any painting |
| 2851 | * and force update after ChangeActiveWindow() to avoid painting frames twice. |
| 2852 | */ |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2853 | |
| 2854 | if( visRgn ) |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2855 | { |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2856 | if( !(winpos.flags & SWP_NOREDRAW) ) |
| 2857 | { |
Yuxi Zhang | 8e35d65 | 1999-07-04 10:53:43 +0000 | [diff] [blame] | 2858 | |
Yuxi Zhang | a961c44 | 1999-07-31 11:09:33 +0000 | [diff] [blame] | 2859 | /* Use PAINT_RedrawWindow to explicitly force an invalidation of the window, |
| 2860 | its parent and sibling and so on, and then erase the parent window |
| 2861 | back ground if the parent is either a top-level window or its parent's parent |
| 2862 | is top-level window. Rely on the system to repaint other affected |
| 2863 | windows later on. */ |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2864 | if( uFlags & SWP_EX_PAINTSELF ) |
| 2865 | { |
Yuxi Zhang | a961c44 | 1999-07-31 11:09:33 +0000 | [diff] [blame] | 2866 | PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, (visRgn == 1) ? 0 : visRgn, |
| 2867 | RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN, |
| 2868 | RDW_EX_XYWINDOW | RDW_EX_USEHRGN ); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2869 | } |
| 2870 | else |
| 2871 | { |
Yuxi Zhang | 8e35d65 | 1999-07-04 10:53:43 +0000 | [diff] [blame] | 2872 | PAINT_RedrawWindow( wndPtr->parent->hwndSelf, NULL, (visRgn == 1) ? 0 : visRgn, |
Yuxi Zhang | a961c44 | 1999-07-31 11:09:33 +0000 | [diff] [blame] | 2873 | RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN, |
| 2874 | RDW_EX_USEHRGN ); |
Yuxi Zhang | 8e35d65 | 1999-07-04 10:53:43 +0000 | [diff] [blame] | 2875 | } |
Yuxi Zhang | 8e35d65 | 1999-07-04 10:53:43 +0000 | [diff] [blame] | 2876 | |
Yuxi Zhang | a961c44 | 1999-07-31 11:09:33 +0000 | [diff] [blame] | 2877 | if(wndPtr -> parent == wndTemp || wndPtr->parent->parent == wndTemp ) |
Yuxi Zhang | 8e35d65 | 1999-07-04 10:53:43 +0000 | [diff] [blame] | 2878 | { |
Yuxi Zhang | a961c44 | 1999-07-31 11:09:33 +0000 | [diff] [blame] | 2879 | PAINT_RedrawWindow( wndPtr->parent->hwndSelf, NULL, 0, |
| 2880 | RDW_ERASENOW | RDW_NOCHILDREN, 0 ); |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2881 | } |
| 2882 | } |
| 2883 | if( visRgn != 1 ) |
| 2884 | DeleteObject( visRgn ); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2885 | } |
Alex Korobka | 4f1ac05 | 1999-03-28 09:37:57 +0000 | [diff] [blame] | 2886 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2887 | WIN_ReleaseDesktop(); |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2888 | |
Alex Korobka | 44a1b59 | 1999-04-01 12:03:52 +0000 | [diff] [blame] | 2889 | if (!(flags & SWP_NOACTIVATE)) |
| 2890 | WINPOS_ChangeActiveWindow( winpos.hwnd, FALSE ); |
| 2891 | |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2892 | /* And last, send the WM_WINDOWPOSCHANGED message */ |
| 2893 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 2894 | TRACE("\tstatus flags = %04x\n", winpos.flags & SWP_AGG_STATUSFLAGS); |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 2895 | |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 2896 | if ( resync || |
| 2897 | (((winpos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE) && |
| 2898 | !(winpos.flags & SWP_NOSENDCHANGING)) ) |
| 2899 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2900 | SendMessageA( winpos.hwnd, WM_WINDOWPOSCHANGED, 0, (LPARAM)&winpos ); |
Ulrich Weigand | 203780e | 1999-07-10 10:24:31 +0000 | [diff] [blame] | 2901 | if (resync) EVENT_Synchronize(); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 2902 | } |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2903 | |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2904 | retvalue = TRUE; |
| 2905 | END: |
| 2906 | WIN_ReleaseWndPtr(wndPtr); |
| 2907 | return retvalue; |
Alexandre Julliard | 2d159fb | 1994-07-15 16:04:31 +0000 | [diff] [blame] | 2908 | } |
| 2909 | |
| 2910 | |
| 2911 | /*********************************************************************** |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2912 | * BeginDeferWindowPos16 (USER.259) |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2913 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 2914 | HDWP16 WINAPI BeginDeferWindowPos16( INT16 count ) |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2915 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2916 | return BeginDeferWindowPos( count ); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2917 | } |
| 2918 | |
| 2919 | |
| 2920 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2921 | * BeginDeferWindowPos (USER32.9) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2922 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2923 | HDWP WINAPI BeginDeferWindowPos( INT count ) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2924 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2925 | HDWP handle; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2926 | DWP *pDWP; |
| 2927 | |
| 2928 | if (count <= 0) return 0; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2929 | handle = USER_HEAP_ALLOC( sizeof(DWP) + (count-1)*sizeof(WINDOWPOS) ); |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2930 | if (!handle) return 0; |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2931 | pDWP = (DWP *) USER_HEAP_LIN_ADDR( handle ); |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2932 | pDWP->actualCount = 0; |
| 2933 | pDWP->suggestedCount = count; |
| 2934 | pDWP->valid = TRUE; |
| 2935 | pDWP->wMagic = DWP_MAGIC; |
Alexandre Julliard | 3a405ba | 1994-10-30 16:25:19 +0000 | [diff] [blame] | 2936 | pDWP->hwndParent = 0; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2937 | return handle; |
| 2938 | } |
| 2939 | |
| 2940 | |
| 2941 | /*********************************************************************** |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2942 | * DeferWindowPos16 (USER.260) |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2943 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 2944 | HDWP16 WINAPI DeferWindowPos16( HDWP16 hdwp, HWND16 hwnd, HWND16 hwndAfter, |
| 2945 | INT16 x, INT16 y, INT16 cx, INT16 cy, |
| 2946 | UINT16 flags ) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2947 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2948 | return DeferWindowPos( hdwp, hwnd, (INT)(INT16)hwndAfter, |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2949 | x, y, cx, cy, flags ); |
| 2950 | } |
| 2951 | |
| 2952 | |
| 2953 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2954 | * DeferWindowPos (USER32.128) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 2955 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2956 | HDWP WINAPI DeferWindowPos( HDWP hdwp, HWND hwnd, HWND hwndAfter, |
| 2957 | INT x, INT y, INT cx, INT cy, |
| 2958 | UINT flags ) |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2959 | { |
| 2960 | DWP *pDWP; |
| 2961 | int i; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2962 | HDWP newhdwp = hdwp,retvalue; |
| 2963 | /* HWND parent; */ |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 2964 | WND *pWnd; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2965 | |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 2966 | pDWP = (DWP *) USER_HEAP_LIN_ADDR( hdwp ); |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2967 | if (!pDWP) return 0; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 2968 | if (hwnd == GetDesktopWindow()) return 0; |
Alexandre Julliard | 3a405ba | 1994-10-30 16:25:19 +0000 | [diff] [blame] | 2969 | |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 2970 | if (!(pWnd=WIN_FindWndPtr( hwnd ))) { |
| 2971 | USER_HEAP_FREE( hdwp ); |
| 2972 | return 0; |
| 2973 | } |
| 2974 | |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 2975 | /* Numega Bounds Checker Demo dislikes the following code. |
| 2976 | In fact, I've not been able to find any "same parent" requirement in any docu |
| 2977 | [AM 980509] |
| 2978 | */ |
| 2979 | #if 0 |
| 2980 | /* All the windows of a DeferWindowPos() must have the same parent */ |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 2981 | parent = pWnd->parent->hwndSelf; |
Alexandre Julliard | e2991ea | 1995-07-29 13:09:43 +0000 | [diff] [blame] | 2982 | if (pDWP->actualCount == 0) pDWP->hwndParent = parent; |
| 2983 | else if (parent != pDWP->hwndParent) |
Alexandre Julliard | 3a405ba | 1994-10-30 16:25:19 +0000 | [diff] [blame] | 2984 | { |
| 2985 | USER_HEAP_FREE( hdwp ); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 2986 | retvalue = 0; |
| 2987 | goto END; |
Alexandre Julliard | 3a405ba | 1994-10-30 16:25:19 +0000 | [diff] [blame] | 2988 | } |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 2989 | #endif |
Alexandre Julliard | 3a405ba | 1994-10-30 16:25:19 +0000 | [diff] [blame] | 2990 | |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 2991 | for (i = 0; i < pDWP->actualCount; i++) |
| 2992 | { |
| 2993 | if (pDWP->winPos[i].hwnd == hwnd) |
| 2994 | { |
| 2995 | /* Merge with the other changes */ |
| 2996 | if (!(flags & SWP_NOZORDER)) |
| 2997 | { |
| 2998 | pDWP->winPos[i].hwndInsertAfter = hwndAfter; |
| 2999 | } |
| 3000 | if (!(flags & SWP_NOMOVE)) |
| 3001 | { |
| 3002 | pDWP->winPos[i].x = x; |
| 3003 | pDWP->winPos[i].y = y; |
| 3004 | } |
| 3005 | if (!(flags & SWP_NOSIZE)) |
| 3006 | { |
| 3007 | pDWP->winPos[i].cx = cx; |
| 3008 | pDWP->winPos[i].cy = cy; |
| 3009 | } |
Alexandre Julliard | 17216f5 | 1997-10-12 16:30:17 +0000 | [diff] [blame] | 3010 | pDWP->winPos[i].flags &= flags | ~(SWP_NOSIZE | SWP_NOMOVE | |
| 3011 | SWP_NOZORDER | SWP_NOREDRAW | |
| 3012 | SWP_NOACTIVATE | SWP_NOCOPYBITS| |
| 3013 | SWP_NOOWNERZORDER); |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 3014 | pDWP->winPos[i].flags |= flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW | |
| 3015 | SWP_FRAMECHANGED); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 3016 | retvalue = hdwp; |
| 3017 | goto END; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 3018 | } |
| 3019 | } |
| 3020 | if (pDWP->actualCount >= pDWP->suggestedCount) |
| 3021 | { |
| 3022 | newhdwp = USER_HEAP_REALLOC( hdwp, |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 3023 | sizeof(DWP) + pDWP->suggestedCount*sizeof(WINDOWPOS) ); |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 3024 | if (!newhdwp) |
| 3025 | { |
| 3026 | retvalue = 0; |
| 3027 | goto END; |
| 3028 | } |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 3029 | pDWP = (DWP *) USER_HEAP_LIN_ADDR( newhdwp ); |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 3030 | pDWP->suggestedCount++; |
| 3031 | } |
| 3032 | pDWP->winPos[pDWP->actualCount].hwnd = hwnd; |
| 3033 | pDWP->winPos[pDWP->actualCount].hwndInsertAfter = hwndAfter; |
| 3034 | pDWP->winPos[pDWP->actualCount].x = x; |
| 3035 | pDWP->winPos[pDWP->actualCount].y = y; |
| 3036 | pDWP->winPos[pDWP->actualCount].cx = cx; |
| 3037 | pDWP->winPos[pDWP->actualCount].cy = cy; |
| 3038 | pDWP->winPos[pDWP->actualCount].flags = flags; |
| 3039 | pDWP->actualCount++; |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 3040 | retvalue = newhdwp; |
| 3041 | END: |
| 3042 | WIN_ReleaseWndPtr(pWnd); |
| 3043 | return retvalue; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 3044 | } |
| 3045 | |
| 3046 | |
| 3047 | /*********************************************************************** |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 3048 | * EndDeferWindowPos16 (USER.261) |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 3049 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 3050 | BOOL16 WINAPI EndDeferWindowPos16( HDWP16 hdwp ) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 3051 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 3052 | return EndDeferWindowPos( hdwp ); |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 3053 | } |
| 3054 | |
| 3055 | |
| 3056 | /*********************************************************************** |
Francois Boisvert | 6b1b41c | 1999-03-14 17:25:32 +0000 | [diff] [blame] | 3057 | * EndDeferWindowPos (USER32.173) |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 3058 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 3059 | BOOL WINAPI EndDeferWindowPos( HDWP hdwp ) |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 3060 | { |
| 3061 | DWP *pDWP; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 3062 | WINDOWPOS *winpos; |
| 3063 | BOOL res = TRUE; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 3064 | int i; |
| 3065 | |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 3066 | pDWP = (DWP *) USER_HEAP_LIN_ADDR( hdwp ); |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 3067 | if (!pDWP) return FALSE; |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 3068 | for (i = 0, winpos = pDWP->winPos; i < pDWP->actualCount; i++, winpos++) |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 3069 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 3070 | if (!(res = SetWindowPos( winpos->hwnd, winpos->hwndInsertAfter, |
Alexandre Julliard | 01d6346 | 1997-01-20 19:43:45 +0000 | [diff] [blame] | 3071 | winpos->x, winpos->y, winpos->cx, |
| 3072 | winpos->cy, winpos->flags ))) break; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 3073 | } |
| 3074 | USER_HEAP_FREE( hdwp ); |
| 3075 | return res; |
| 3076 | } |
| 3077 | |
| 3078 | |
| 3079 | /*********************************************************************** |
Alexandre Julliard | 3a405ba | 1994-10-30 16:25:19 +0000 | [diff] [blame] | 3080 | * TileChildWindows (USER.199) |
| 3081 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 3082 | void WINAPI TileChildWindows16( HWND16 parent, WORD action ) |
Alexandre Julliard | 3a405ba | 1994-10-30 16:25:19 +0000 | [diff] [blame] | 3083 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 3084 | FIXME("(%04x, %d): stub\n", parent, action); |
Alexandre Julliard | 3a405ba | 1994-10-30 16:25:19 +0000 | [diff] [blame] | 3085 | } |
| 3086 | |
| 3087 | /*********************************************************************** |
| 3088 | * CascageChildWindows (USER.198) |
| 3089 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 3090 | void WINAPI CascadeChildWindows16( HWND16 parent, WORD action ) |
Alexandre Julliard | 3a405ba | 1994-10-30 16:25:19 +0000 | [diff] [blame] | 3091 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 3092 | FIXME("(%04x, %d): stub\n", parent, action); |
Alexandre Julliard | 3a405ba | 1994-10-30 16:25:19 +0000 | [diff] [blame] | 3093 | } |
Juergen Schmied | ddb2e29 | 1999-05-02 09:19:19 +0000 | [diff] [blame] | 3094 | |
| 3095 | /*********************************************************************** |
| 3096 | * SetProgmanWindow [USER32.522] |
| 3097 | */ |
| 3098 | HRESULT WINAPI SetProgmanWindow ( HWND hwnd ) |
| 3099 | { |
| 3100 | hGlobalProgmanWindow = hwnd; |
| 3101 | return hGlobalProgmanWindow; |
| 3102 | } |
| 3103 | |
Juergen Schmied | 2c20591 | 1998-10-15 12:35:41 +0000 | [diff] [blame] | 3104 | /*********************************************************************** |
| 3105 | * GetProgmanWindow [USER32.289] |
| 3106 | */ |
| 3107 | HRESULT WINAPI GetProgmanWindow ( ) |
Juergen Schmied | ddb2e29 | 1999-05-02 09:19:19 +0000 | [diff] [blame] | 3108 | { |
| 3109 | return hGlobalProgmanWindow; |
Juergen Schmied | 2c20591 | 1998-10-15 12:35:41 +0000 | [diff] [blame] | 3110 | } |
Juergen Schmied | ddb2e29 | 1999-05-02 09:19:19 +0000 | [diff] [blame] | 3111 | |
| 3112 | /*********************************************************************** |
| 3113 | * SetShellWindowEx [USER32.531] |
| 3114 | * hwndProgman = Progman[Program Manager] |
| 3115 | * |-> SHELLDLL_DefView |
| 3116 | * hwndListView = | |-> SysListView32 |
| 3117 | * | | |-> tooltips_class32 |
| 3118 | * | | |
| 3119 | * | |-> SysHeader32 |
| 3120 | * | |
| 3121 | * |-> ProxyTarget |
| 3122 | */ |
| 3123 | HRESULT WINAPI SetShellWindowEx ( HWND hwndProgman, HWND hwndListView ) |
| 3124 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 3125 | FIXME("0x%08x 0x%08x stub\n",hwndProgman ,hwndListView ); |
Juergen Schmied | ddb2e29 | 1999-05-02 09:19:19 +0000 | [diff] [blame] | 3126 | hGlobalShellWindow = hwndProgman; |
| 3127 | return hGlobalShellWindow; |
| 3128 | |
| 3129 | } |
| 3130 | |
| 3131 | /*********************************************************************** |
| 3132 | * SetTaskmanWindow [USER32.537] |
| 3133 | * NOTES |
| 3134 | * hwnd = MSTaskSwWClass |
| 3135 | * |-> SysTabControl32 |
| 3136 | */ |
| 3137 | HRESULT WINAPI SetTaskmanWindow ( HWND hwnd ) |
| 3138 | { |
| 3139 | hGlobalTaskmanWindow = hwnd; |
| 3140 | return hGlobalTaskmanWindow; |
| 3141 | } |
| 3142 | |
Juergen Schmied | 2c20591 | 1998-10-15 12:35:41 +0000 | [diff] [blame] | 3143 | /*********************************************************************** |
| 3144 | * GetTaskmanWindow [USER32.304] |
| 3145 | */ |
| 3146 | HRESULT WINAPI GetTaskmanWindow ( ) |
Juergen Schmied | ddb2e29 | 1999-05-02 09:19:19 +0000 | [diff] [blame] | 3147 | { |
| 3148 | return hGlobalTaskmanWindow; |
Juergen Schmied | 2c20591 | 1998-10-15 12:35:41 +0000 | [diff] [blame] | 3149 | } |