source: branches/gcc-kmk/src/user32/win32wfake.cpp@ 21720

Last change on this file since 21720 was 21720, checked in by dmik, 13 years ago

Replace "\" with "/" in include statements.

File size: 9.5 KB
Line 
1/* $Id: win32wfake.cpp,v 1.5 2003-04-24 17:20:42 sandervl Exp $ */
2/*
3 * Win32 Fake Window Class for OS/2
4 *
5 *
6 * Copyright 2002 Sander van Leeuwen (sandervl@innotek.de)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#include <os2win.h>
13#include <stdlib.h>
14#include <string.h>
15#include <dbglog.h>
16#include <win/winproc.h>
17#include <win32wbase.h>
18#include <win32wfake.h>
19#include "oslibwin.h"
20#include "win32wndhandle.h"
21#include "pmwindow.h"
22
23#define DBG_LOCALLOG DBG_win32wfake
24#include "dbglocal.h"
25
26/** The Odin HWND Property - must be unique for this (custom)build. */
27char Win32FakeWindow::szPropOdinHandle[64] = "OdinFakeHWND";
28/** Flag which tells if we've inited or not. */
29BOOL Win32FakeWindow::fInited = FALSE;
30
31/**
32 * Creates a fake Odin window for an existing OS/2 window.
33 *
34 * @returns odin handle to the fake window.
35 * @returns NULL on failure.
36 * @param hwndOS2 Window handle.
37 * @param classAtom The atom of the Odin window class.
38 * @author Sander van Leeuwen <sandervl@innotek.de>
39 * @author knut st. osmundsen <bird@anduin.net>
40 */
41HWND WIN32API CreateFakeWindowEx(HWND hwndOS2, ATOM classAtom)
42{
43 Win32FakeWindow *window;
44
45 /*
46 * Check if already faked - fail.
47 */
48 window = Win32FakeWindow::GetWindowFromOS2Handle(hwndOS2);
49 if (window)
50 {
51 dprintf(("CreateFakeWindowEx: already faked!!! (hwndOS2=%x hwndOdin=%x)",
52 hwndOS2, window->getOS2WindowHandle()));
53 return NULL;
54 }
55
56 /*
57 * Now proceed.
58 */
59 window = new Win32FakeWindow(hwndOS2, classAtom);
60 if (window == NULL)
61 {
62 dprintf(("Win32FakeWindow creation failed for %x!!!", hwndOS2));
63 return 0;
64 }
65 HWND hwnd = window->getWindowHandle();
66
67 // set myself as last active popup / window
68 window->setLastActive( hwnd );
69
70 RELEASE_WNDOBJ(window);
71 dprintf(("CreateFakeWindowEx: created %x for %x", hwnd, hwndOS2));
72 return hwnd;
73}
74//******************************************************************************
75//******************************************************************************
76BOOL WIN32API DestroyFakeWindow(HWND hwnd)
77{
78 Win32BaseWindow *window;
79
80 window = Win32BaseWindow::GetWindowFromHandle(hwnd);
81 if (!window) {
82 dprintf(("DestroyFakeWindow, window %x not found", hwnd));
83 SetLastError(ERROR_INVALID_WINDOW_HANDLE);
84 return 0;
85 }
86 delete window;
87 return TRUE;
88}
89//******************************************************************************
90//******************************************************************************
91Win32FakeWindow::Win32FakeWindow(HWND hwndOS2, ATOM classAtom)
92 : Win32BaseWindow()
93{
94 if (!fInited) init();
95
96 OS2Hwnd = OS2HwndFrame = hwndOS2;
97
98 /* Find the window class */
99 windowClass = Win32WndClass::FindClass(NULL, (LPSTR)classAtom);
100 if (!windowClass)
101 {
102 char buffer[32];
103 GlobalGetAtomNameA( classAtom, buffer, sizeof(buffer) );
104 dprintf(("Bad class '%s'", buffer ));
105 DebugInt3();
106 }
107
108 //Allocate window words
109 nrUserWindowBytes = windowClass->getExtraWndBytes();
110 if(nrUserWindowBytes) {
111 userWindowBytes = (char *)_smalloc(nrUserWindowBytes);
112 memset(userWindowBytes, 0, nrUserWindowBytes);
113 }
114
115 WINPROC_SetProc((HWINDOWPROC *)&win32wndproc, windowClass->getWindowProc((isUnicode) ? WNDPROC_UNICODE : WNDPROC_ASCII), WINPROC_GetProcType(windowClass->getWindowProc((isUnicode) ? WNDPROC_UNICODE : WNDPROC_ASCII)), WIN_PROC_WINDOW);
116 hInstance = NULL;
117 dwStyle = WS_VISIBLE;
118 dwOldStyle = dwStyle;
119 dwExStyle = 0;
120
121 //We pretend this window has no parent and its position is in screen coordinates
122 OSLibWinQueryWindowClientRect(OS2Hwnd, &rectClient);
123 OSLibQueryWindowRectAbsolute (OS2Hwnd, &rectWindow);
124
125 //Store the window handle as a property of the OS/2 window.
126 if (!OSLibSetProperty(OS2Hwnd, szPropOdinHandle, (void*)getWindowHandle(), 0))
127 {
128 dprintf(("%s: f**k! WinSetProperty(%x,%s,%x,0) failed!!!", __FUNCTION__,
129 hwndOS2, szPropOdinHandle, getWindowHandle()));
130 }
131
132 //See if parent window is either odin or fake window.
133 Win32BaseWindow * pParent = NULL;
134 HWND hwndParentOS2 = OSLibWinQueryWindow(OS2Hwnd, QWOS_PARENT);
135 if (hwndParentOS2 != OSLIB_HWND_DESKTOP)
136 {
137 pParent = Win32FakeWindow::GetWindowFromOS2Handle(hwndParentOS2);
138 if (!pParent)
139 pParent = Win32BaseWindow::GetWindowFromOS2Handle(hwndParentOS2);
140 if (pParent)
141 {
142 setParent(pParent);
143 dprintf(("%s: hwndParentOS2=%x %s window, set as parent.", __FUNCTION__,
144 hwndParentOS2, pParent->isFakeWindow() ? "fake" : "odin"));
145 dwStyle |= WS_CHILD;
146 }
147 else
148 {
149 dprintf(("%s: hwndParentOS2=%x but not a fake nor odin window.", __FUNCTION__, hwndParentOS2));
150 }
151 }
152
153 //See if owner widnow is either odin or fake window.
154 HWND hwndOwnerOS2 = OSLibWinQueryWindow(OS2Hwnd, QWOS_OWNER);
155 if (hwndOwnerOS2 != OSLIB_HWND_DESKTOP)
156 {
157 Win32BaseWindow * pOwner;
158 if (hwndOwnerOS2 == hwndParentOS2)
159 pOwner = pParent;
160 else
161 {
162 pOwner = Win32FakeWindow::GetWindowFromOS2Handle(hwndOwnerOS2);
163 if (!pOwner)
164 pOwner = Win32BaseWindow::GetWindowFromOS2Handle(hwndOwnerOS2);
165 }
166 if (pOwner)
167 {
168 setOwner(pOwner);
169 dprintf(("%s: hwndOwnerOS2=%x %s window, set as owner.", __FUNCTION__,
170 hwndOwnerOS2, pOwner->isFakeWindow() ? "fake" : "odin"));
171 dwStyle |= WS_CHILD;
172 }
173 else
174 {
175 dprintf(("%s: hwndOwnerOS2=%x but not a fake nor odin window.", __FUNCTION__, hwndOwnerOS2));
176 }
177 }
178
179
180 setOldPMWindowProc(PMWinSubclassFakeWindow(OS2Hwnd));
181}
182//******************************************************************************
183//******************************************************************************
184Win32FakeWindow::~Win32FakeWindow()
185{
186 OSLibRemoveProperty(OS2Hwnd, szPropOdinHandle);
187}
188//******************************************************************************
189//******************************************************************************
190PRECT Win32FakeWindow::getWindowRect()
191{
192 //the coordinates can change without us being notified, so recheck every time
193
194 Win32BaseWindow * pParent = getParent();
195 if (pParent)
196 {
197 SWP swp;
198 if (OSLibWinQueryWindowPos(OS2Hwnd, &swp))
199 {
200 ULONG y = pParent->getWindowHeight();
201 rectWindow.left = swp.x;
202 rectWindow.right = swp.x + swp.cx;
203 rectWindow.top = y - swp.y - swp.cy;
204 rectWindow.bottom = y - swp.y;
205 }
206 }
207 else
208 OSLibQueryWindowRectAbsolute(OS2Hwnd, &rectWindow);
209
210 return &rectWindow;
211}
212//******************************************************************************
213//******************************************************************************
214BOOL Win32FakeWindow::SetWindowPos(HWND hwndInsertAfter, int x, int y, int cx,
215 int cy, UINT fuFlags, BOOL fShowWindow)
216{
217 // we don't trust input either.
218 dprintf(("Win32FakeWindow::SetWindowPos; don't change window position, just update internal position"));
219
220 OSLibWinQueryWindowClientRect(OS2Hwnd, &rectClient);
221 getWindowRect();
222 return TRUE;
223}
224//******************************************************************************
225//******************************************************************************
226BOOL Win32FakeWindow::isFakeWindow()
227{
228 return TRUE;
229}
230//******************************************************************************
231//******************************************************************************
232
233/**
234 * Locates window in linked list and increases reference count if found.
235 * The window object msut be unreferenced after usage.
236 *
237 * @returns Pointer to fake window.
238 * @returns NULL if not found.
239 * @param hwndOS2 OS/2 window handle of the fake window.
240 */
241Win32FakeWindow *Win32FakeWindow::GetWindowFromOS2Handle(HWND hwndOS2)
242{
243 if (!fInited) init();
244
245 HWND hwnd = (HWND)OSLibQueryProperty(hwndOS2, szPropOdinHandle);
246 Win32BaseWindow *pWindow = GetWindowFromHandle(hwnd);
247 if (pWindow)
248 {
249 if (pWindow->isFakeWindow())
250 return (Win32FakeWindow*)pWindow;
251 DebugInt3();
252 }
253 dprintf2(("Win32FakeWindow::GetWindowFromOS2Handle(%x) -> null", hwndOS2));
254 return NULL;
255}
256
257
258/**
259 * Init the global(s).
260 * It will make the name property unique among the odin instances.
261 *
262 * This will chagne szPropOdinHandle and fInited.
263 */
264void Win32FakeWindow::init()
265{
266 if (fInited)
267 return;
268
269 /*
270 * Get the name of this dll.
271 */
272 extern int _System DosQueryModFromEIP(HMODULE *phMod, ULONG *pObjNum, ULONG BuffLen, PCHAR pBuff, ULONG *pOffset, ULONG Address);
273 char szModName[260];
274 HMODULE hmod;
275 ULONG iObj, offObj;
276 USHORT sel = GetFS();
277
278 int rc = DosQueryModFromEIP(&hmod, &iObj, sizeof(szModName), &szModName[0], &offObj, (ULONG)Win32FakeWindow::init);
279 SetFS(sel);
280
281 if (rc)
282 {
283 dprintf(("Win32FakeWindow::init: DosQueryModFromEIP failed!!!"));
284 DebugInt3();
285 return;
286 }
287 char *psz = strrchr(szModName, '\\');
288 if (!psz)
289 psz = szModName;
290 if (strchr(szModName, '.'))
291 *strchr(szModName, '.') = '\0';
292
293 fInited = 1;
294 strcat(szPropOdinHandle, psz);
295 dprintf(("Win32FakeWindow::init: szPropOdinHandle='%s'", szPropOdinHandle));
296}
297
Note: See TracBrowser for help on using the repository browser.