source: trunk/src/user32/new/pmwindow.cpp@ 304

Last change on this file since 304 was 304, checked in by cbratschi, 26 years ago

several bugs fixed, RegisterClass works, CreateWindow on the way

File size: 10.9 KB
Line 
1/* $Id: pmwindow.cpp,v 1.3 1999-07-14 21:05:58 cbratschi Exp $ */
2/*
3 * Win32 Window Managment Code for OS/2
4 *
5 * Copyright 1998-1999 Sander van Leeuwen (sandervl@xs4all.nl)
6 *
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11#define INCL_WIN
12#define INCL_GPI
13
14#include <os2.h> /* PM header file */
15#include <os2wrap.h>
16#include "win32type.h"
17#include <wprocess.h>
18#include <misc.h>
19#include <win32wnd.h>
20#include <win32dlg.h>
21#include "pmwindow.h"
22#include "oslibwin.h"
23
24HMQ hmq = 0; /* Message queue handle */
25HAB hab = 0;
26
27MRESULT EXPENTRY Win32WindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
28
29//******************************************************************************
30//Initialize PM; create hab, message queue and register special Win32 window classes
31//******************************************************************************
32BOOL InitPM()
33{
34 hab = WinInitialize(0);
35 hmq = WinCreateMsgQueue(hab, 0);
36
37 if(!hab || !hmq) {
38 UINT error;
39
40 //CB: only fail on real error
41 error = WinGetLastError(hab) & 0xFFFF; //error code
42 if (!hab || error != PMERR_MSG_QUEUE_ALREADY_EXISTS)
43 {
44 dprintf(("WinInitialize or WinCreateMsgQueue failed %x %x", hab, hmq));
45 dprintf((" Error = %x",error));
46 return(FALSE);
47 } else
48 {
49 //CB: get queue handle (todo)
50 }
51 }
52
53 if(!WinRegisterClass( /* Register window class */
54 hab, /* Anchor block handle */
55 (PSZ)WIN32_STDCLASS, /* Window class name */
56 (PFNWP)Win32WindowProc, /* Address of window procedure */
57 CS_SIZEREDRAW, /* Class style */
58 8)) {
59 dprintf(("WinRegisterClass Win32Window failed"));
60 return(FALSE);
61 }
62
63 return(TRUE);
64} /* End of main */
65//******************************************************************************
66//Win32 window message handler
67//******************************************************************************
68MRESULT EXPENTRY Win32WindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
69{
70 Win32Window *win32wnd;
71 ULONG magic;
72 APIRET rc;
73
74 //Restore our FS selector
75 SetWin32TIB();
76
77 win32wnd = (Win32Window *)WinQueryWindowULong(hwnd, OFFSET_WIN32WNDPTR);
78 magic = WinQueryWindowULong(hwnd, OFFSET_WIN32PM_MAGIC);
79
80 if(msg != WM_CREATE && win32wnd == NULL && magic != WIN32PM_MAGIC) {
81 dprintf(("Invalid win32wnd pointer for window %x!!", hwnd));
82 goto RunDefWndProc;
83 }
84 switch( msg )
85 {
86 case WM_CREATE:
87 //Processing is done in after WinCreateWindow returns
88 break;
89
90 case WM_QUIT:
91 if(win32wnd->MsgQuit()) {
92 goto RunDefWndProc;
93 }
94 break;
95
96 case WM_CLOSE:
97 if(win32wnd->MsgClose()) {
98 goto RunDefWndProc;
99 }
100 break;
101
102 case WM_DESTROY:
103 if(win32wnd->MsgDestroy()) {
104 goto RunDefWndProc;
105 }
106 break;
107
108 case WM_ENABLE:
109 if(win32wnd->MsgEnable((ULONG)mp1)) {
110 goto RunDefWndProc;
111 }
112 break;
113
114 case WM_SHOW:
115 if(win32wnd->MsgShow((ULONG)mp1)) {
116 goto RunDefWndProc;
117 }
118 break;
119
120 case WM_MOVE:
121 {
122 RECTL rectl, rectl2;
123 POINTL point;
124 HWND hwndParent;
125 ULONG xScreen, yScreen, yParent, xParent;
126
127 rc = WinQueryWindowRect(hwnd, &rectl);
128 if(rc == TRUE) {
129 point.x = rectl.xLeft;
130 point.y = rectl.yBottom;
131
132 //If the window has a parent, calculate position relative to that window
133 if((hwndParent = WinQueryWindow(hwnd, QW_PARENT)) != WinQueryDesktopWindow(hab, NULLHANDLE)) {
134 rc = WinMapWindowPoints(hwnd, hwndParent, &point, 1);
135 if(rc == FALSE) {
136 dprintf(("WM_MOVE: WinMapWindowPoints (parent) failed!"));
137 break;
138 }
139 rc = WinQueryWindowRect(hwndParent, &rectl2);
140 if(rc == FALSE) {
141 dprintf(("WM_MOVE: WinQueryWindowRect(HWND_DESKTOP, &rectl) failed!"));
142 break;
143 }
144 yParent = point.x;
145 yParent = OS2TOWIN32POINT(rectl2.yTop - rectl2.yBottom, point.y);
146 }
147 else xParent = yParent = -1;
148
149 point.x = rectl.xLeft;
150 point.y = rectl.yBottom;
151
152 rc = WinMapWindowPoints(hwnd, HWND_DESKTOP, &point, 1);
153 if(rc == FALSE) {
154 dprintf(("WM_MOVE: WinMapWindowPoints (desktop) failed!"));
155 break;
156 }
157 rc = WinQueryWindowRect(HWND_DESKTOP, &rectl);
158 if(rc == FALSE) {
159 dprintf(("WM_MOVE: WinQueryWindowRect(HWND_DESKTOP, &rectl) failed!"));
160 break;
161 }
162 xScreen = point.x;
163 yScreen = OS2TOWIN32POINT(rectl.yTop - rectl.yBottom, point.y);
164
165 if(win32wnd->MsgMove(xScreen, yScreen, xParent, yParent)) {
166 goto RunDefWndProc;
167 }
168 }
169 else {
170 dprintf(("WM_MOVE: WinQueryWindowRect failed!"));
171 }
172 break;
173 }
174
175 case WM_WINDOWPOSCHANGED:
176 {
177 break;
178 }
179
180 case WM_ADJUSTWINDOWPOS:
181 {
182// if(win32wnd->MsgWindowPosChanging(0, 0)) {
183 break;
184 }
185
186 case WM_ERASEBACKGROUND:
187 {
188 HPS hps;
189
190 hps = WinGetPS(hwnd);
191 if(win32wnd->MsgEraseBackGround((ULONG)hps))
192 {
193 /*
194 * Return TRUE to request PM to paint the window background
195 * in SYSCLR_WINDOW.
196 */
197 WinReleasePS(hps);
198 return (MRESULT)( TRUE );
199 }
200 WinReleasePS(hps);
201 return (MRESULT) FALSE;
202 }
203 case WM_SIZE:
204 {
205 SWP swp;
206
207 rc = WinQueryWindowPos(hwnd, &swp);
208 if(rc == FALSE) {
209 dprintf(("WM_SIZE: WinQueryWindowPos failed!"));
210 break;
211 }
212 if(win32wnd->MsgSize(SHORT1FROMMP(mp2), SHORT2FROMMP(mp2),
213 (swp.fl & SWP_MINIMIZE) != 0,
214 (swp.fl & SWP_MAXIMIZE) != 0))
215 {
216 goto RunDefWndProc;
217 }
218
219 break;
220 }
221
222 case WM_ACTIVATE:
223 {
224 HWND hwndActivate = (HWND)mp1;
225
226 if(WinQueryWindowULong(hwndActivate, OFFSET_WIN32PM_MAGIC) != WIN32PM_MAGIC) {
227 //another (non-win32) application's window
228 //set to NULL (allowed according to win32 SDK) to avoid problems
229 hwndActivate = NULL;
230 }
231 if(win32wnd->MsgActivate(1, hwndActivate)) {
232 goto RunDefWndProc;
233 }
234 break;
235 }
236 case WM_FOCUSCHANGE:
237 break;
238
239 case WM_SETFOCUS:
240 {
241 HWND hwndFocus = (HWND)mp1;
242
243 if(WinQueryWindowULong(hwndFocus, OFFSET_WIN32PM_MAGIC) != WIN32PM_MAGIC) {
244 //another (non-win32) application's window
245 //set to NULL (allowed according to win32 SDK) to avoid problems
246 hwndFocus = NULL;
247 }
248 if((ULONG)mp2 == TRUE) {
249 rc = win32wnd->MsgSetFocus(hwndFocus);
250 }
251 else rc = win32wnd->MsgKillFocus(hwndFocus);
252 if(rc) {
253 goto RunDefWndProc;
254 }
255 break;
256 }
257 //**************************************************************************
258 //Mouse messages
259 //**************************************************************************
260 case WM_BUTTON1DOWN:
261 if(win32wnd->MsgButton(BUTTON_LEFTDOWN, (*(POINTS *)&mp1).x, (*(POINTS *)&mp1).y)) {
262 goto RunDefWndProc;
263 }
264 break;
265 case WM_BUTTON1UP:
266 if(win32wnd->MsgButton(BUTTON_LEFTUP, (*(POINTS *)&mp1).x, (*(POINTS *)&mp1).y)) {
267 goto RunDefWndProc;
268 }
269 break;
270 case WM_BUTTON1DBLCLK:
271 if(win32wnd->MsgButton(BUTTON_LEFTDBLCLICK, (*(POINTS *)&mp1).x, (*(POINTS *)&mp1).y)) {
272 goto RunDefWndProc;
273 }
274 break;
275 case WM_BUTTON2DOWN:
276 if(win32wnd->MsgButton(BUTTON_RIGHTDOWN, (*(POINTS *)&mp1).x, (*(POINTS *)&mp1).y)) {
277 goto RunDefWndProc;
278 }
279 break;
280 case WM_BUTTON2UP:
281 if(win32wnd->MsgButton(BUTTON_RIGHTUP, (*(POINTS *)&mp1).x, (*(POINTS *)&mp1).y)) {
282 goto RunDefWndProc;
283 }
284 break;
285 case WM_BUTTON2DBLCLK:
286 if(win32wnd->MsgButton(BUTTON_RIGHTDBLCLICK, (*(POINTS *)&mp1).x, (*(POINTS *)&mp1).y)) {
287 goto RunDefWndProc;
288 }
289 break;
290 case WM_BUTTON2MOTIONSTART:
291 case WM_BUTTON2MOTIONEND:
292 case WM_BUTTON2CLICK:
293 case WM_BUTTON1MOTIONSTART:
294 case WM_BUTTON1MOTIONEND:
295 case WM_BUTTON1CLICK:
296 case WM_BUTTON3DOWN:
297 case WM_BUTTON3UP:
298 case WM_BUTTON3DBLCLK:
299 case WM_BUTTON3MOTIONSTART:
300 case WM_BUTTON3MOTIONEND:
301 case WM_BUTTON3CLICK:
302 break;
303
304 case WM_MOUSEMOVE:
305 break;
306
307 //**************************************************************************
308 //Slider messages
309 //**************************************************************************
310 case WM_VSCROLL:
311 break;
312 case WM_HSCROLL:
313 break;
314
315 case WM_CONTROL:
316 break;
317
318 case WM_COMMAND:
319 case WM_SYSCOMMAND:
320 break;
321
322 case WM_CHAR:
323 break;
324
325 case WM_INITMENU:
326 case WM_MENUSELECT:
327 case WM_MENUEND:
328 case WM_NEXTMENU:
329 break;
330
331 case WM_TIMER:
332 break;
333
334 case WM_PAINT:
335 if(win32wnd->MsgPaint(0, 0)) {
336 goto RunDefWndProc;
337 }
338 break;
339
340 case WM_SYSCOLORCHANGE:
341 case WM_SYSVALUECHANGED:
342 break;
343
344 case WM_CALCVALIDRECTS:
345 case WM_SETWINDOWPARAMS:
346 case WM_QUERYWINDOWPARAMS:
347 case WM_HITTEST:
348 case WM_SETSELECTION:
349 case WM_PPAINT:
350 case WM_PSETFOCUS:
351 case WM_PSYSCOLORCHANGE:
352 case WM_PSIZE:
353 case WM_PACTIVATE:
354 case WM_PCONTROL:
355 case WM_HELP:
356 case WM_APPTERMINATENOTIFY:
357 case WM_PRESPARAMCHANGED:
358 case WM_DRAWITEM:
359 case WM_MEASUREITEM:
360 case WM_CONTROLPOINTER:
361 case WM_QUERYDLGCODE:
362 case WM_SUBSTITUTESTRING:
363 case WM_MATCHMNEMONIC:
364 case WM_SAVEAPPLICATION:
365 case WM_SEMANTICEVENT:
366 break;
367 default:
368 RestoreOS2TIB();
369 return WinDefWindowProc( hwnd, msg, mp1, mp2 );
370 }
371 RestoreOS2TIB();
372 return (MRESULT)FALSE;
373
374RunDefWndProc:
375 RestoreOS2TIB();
376 return WinDefWindowProc( hwnd, msg, mp1, mp2 );
377} /* End of Win32WindowProc */
378//******************************************************************************
379//******************************************************************************
Note: See TracBrowser for help on using the repository browser.