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

Last change on this file since 340 was 340, checked in by sandervl, 26 years ago

Point/Rectangle bug fixes

File size: 13.7 KB
Line 
1/* $Id: pmwindow.cpp,v 1.12 1999-07-19 18:40:43 sandervl 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 <stdlib.h>
17#include "win32type.h"
18#include <wprocess.h>
19#include <misc.h>
20#include <win32wnd.h>
21#include <win32dlg.h>
22#include "pmwindow.h"
23#include "oslibwin.h"
24#include "oslibutil.h"
25#include "oslibgdi.h"
26
27HMQ hmq = 0; /* Message queue handle */
28HAB hab = 0;
29
30MRESULT EXPENTRY Win32WindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
31
32//******************************************************************************
33//Initialize PM; create hab, message queue and register special Win32 window classes
34//******************************************************************************
35BOOL InitPM()
36{
37 hab = WinInitialize(0);
38 dprintf(("Winitialize returned %x", hab));
39 hmq = WinCreateMsgQueue(hab, 0);
40
41 if(!hab || !hmq)
42 {
43 UINT error;
44 //CB: only fail on real error
45 error = WinGetLastError(hab) & 0xFFFF; //error code
46 if (!hab || error != PMERR_MSG_QUEUE_ALREADY_EXISTS)
47 {
48 dprintf(("WinInitialize or WinCreateMsgQueue failed %x %x", hab, hmq));
49 dprintf((" Error = %x",error));
50 return(FALSE);
51 }
52 else
53 {
54 if(!hab) {
55 hab = WinQueryAnchorBlock(HWND_DESKTOP);
56 dprintf(("WinQueryAnchorBlock returned %x", hab));
57 }
58 if(!hmq) {
59 hmq = HMQ_CURRENT;
60 }
61 }
62 }
63 SetThreadHAB(hab);
64 dprintf(("InitPM: hmq = %x", hmq));
65 SetThreadMessageQueue(hmq);
66
67 if(!WinRegisterClass( /* Register window class */
68 hab, /* Anchor block handle */
69 (PSZ)WIN32_STDCLASS, /* Window class name */
70 (PFNWP)Win32WindowProc, /* Address of window procedure */
71 CS_SIZEREDRAW | CS_HITTEST,
72 8)) {
73 dprintf(("WinRegisterClass Win32Window failed"));
74 return(FALSE);
75 }
76
77 return(TRUE);
78} /* End of main */
79//******************************************************************************
80//Win32 window message handler
81//******************************************************************************
82MRESULT EXPENTRY Win32WindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
83{
84 POSTMSG_PACKET *postmsg;
85 OSLIBPOINT point;
86 Win32Window *win32wnd;
87 APIRET rc;
88
89 //Restore our FS selector
90 SetWin32TIB();
91
92 win32wnd = Win32Window::GetWindowFromOS2Handle(hwnd);
93
94 if(msg != WM_CREATE && win32wnd == NULL) {
95 dprintf(("Invalid win32wnd pointer for window %x!!", hwnd));
96 goto RunDefWndProc;
97 }
98 switch( msg )
99 {
100 //internal messages
101 case WM_WIN32_POSTMESSAGEA:
102 postmsg = (POSTMSG_PACKET *)mp1;
103 if(postmsg == NULL) {
104 dprintf(("WM_WIN32_POSTMESSAGEA, postmsg NULL!!"));
105 break;
106 }
107 win32wnd->SendMessageA(postmsg->Msg, postmsg->wParam, postmsg->lParam);
108 free(postmsg);
109 break;
110
111 case WM_WIN32_POSTMESSAGEW:
112 postmsg = (POSTMSG_PACKET *)mp1;
113 if(postmsg == NULL) {
114 dprintf(("WM_WIN32_POSTMESSAGEW, postmsg NULL!!"));
115 break;
116 }
117 win32wnd->SendMessageW(postmsg->Msg, postmsg->wParam, postmsg->lParam);
118 free(postmsg);
119 break;
120
121 //OS/2 msgs
122 case WM_CREATE:
123 //Processing is done in after WinCreateWindow returns
124 dprintf(("OS2: WM_CREATE %x", hwnd));
125 RestoreOS2TIB();
126 return (MRESULT)FALSE;
127
128 case WM_QUIT:
129 dprintf(("OS2: WM_QUIT %x", hwnd));
130 if(win32wnd->MsgQuit()) {
131 goto RunDefWndProc;
132 }
133 break;
134
135 case WM_CLOSE:
136 dprintf(("OS2: WM_CLOSE %x", hwnd));
137 if(win32wnd->MsgClose()) {
138 goto RunDefWndProc;
139 }
140 break;
141
142 case WM_DESTROY:
143 dprintf(("OS2: WM_DESTROY %x", hwnd));
144 if(win32wnd->MsgDestroy()) {
145 goto RunDefWndProc;
146 }
147 break;
148
149 case WM_ENABLE:
150 dprintf(("OS2: WM_ENABLE %x", hwnd));
151 if(win32wnd->MsgEnable((ULONG)mp1)) {
152 goto RunDefWndProc;
153 }
154 break;
155
156 case WM_SHOW:
157 dprintf(("OS2: WM_SHOW %x", hwnd));
158 if(win32wnd->MsgShow((ULONG)mp1)) {
159 goto RunDefWndProc;
160 }
161 break;
162
163 case WM_ADJUSTWINDOWPOS:
164 {
165 RECTLOS2 rectChild;
166 ULONG x, y;
167
168 dprintf(("OS2: WM_ADJUSTWINDOWPOS %x", hwnd));
169
170 WinQueryWindowRect(hwnd, (PRECTL)&rectChild);
171
172 //Calculate position relative to parent window (real window or desktop)
173 x = rectChild.xLeft;
174// y = MapOS2ToWin32Y(hwnd, &rectChild, rectChild.yBottom);
175
176 if(win32wnd->MsgMove(x, y)) {
177 goto RunDefWndProc;
178 }
179 break;
180 }
181
182 case WM_WINDOWPOSCHANGED:
183 {
184 dprintf(("OS2: WM_WINDOWPOSCHANGED %x", hwnd));
185 }
186
187 case WM_ERASEBACKGROUND:
188 {
189 HPS hps;
190
191 dprintf(("OS2: WM_ERASEBACKGROUND %x", hwnd));
192 hps = WinGetPS(hwnd);
193 if(!win32wnd->MsgEraseBackGround((ULONG)hps))
194 {
195 /*
196 * Return TRUE to request PM to paint the window background
197 * in SYSCLR_WINDOW.
198 */
199 WinReleasePS(hps);
200 return (MRESULT)( TRUE );
201 }
202 WinReleasePS(hps);
203 return (MRESULT) FALSE;
204 }
205 case WM_SIZE:
206 {
207 SWP swp;
208
209 dprintf(("OS2: WM_SIZE %x", hwnd));
210 rc = WinQueryWindowPos(hwnd, &swp);
211 if(rc == FALSE) {
212 dprintf(("WM_SIZE: WinQueryWindowPos failed!"));
213 break;
214 }
215 if(win32wnd->MsgSize(SHORT1FROMMP(mp2), SHORT2FROMMP(mp2),
216 (swp.fl & SWP_MINIMIZE) != 0,
217 (swp.fl & SWP_MAXIMIZE) != 0))
218 {
219 goto RunDefWndProc;
220 }
221 break;
222 }
223
224 case WM_ACTIVATE:
225 {
226 HWND hwndActivate = (HWND)mp1;
227
228 dprintf(("OS2: WM_ACTIVATE %x", hwnd));
229 if(WinQueryWindowULong(hwndActivate, OFFSET_WIN32PM_MAGIC) != WIN32PM_MAGIC) {
230 //another (non-win32) application's window
231 //set to NULL (allowed according to win32 SDK) to avoid problems
232 hwndActivate = NULL;
233 }
234 if(win32wnd->MsgActivate(1, hwndActivate)) {
235 goto RunDefWndProc;
236 }
237 break;
238 }
239 case WM_FOCUSCHANGE:
240 dprintf(("OS2: WM_FOCUSCHANGE %x", hwnd));
241 goto RunDefWndProc;
242
243 case WM_SETFOCUS:
244 {
245 HWND hwndFocus = (HWND)mp1;
246
247 dprintf(("OS2: WM_SETFOCUS %x", hwnd));
248 if(WinQueryWindowULong(hwndFocus, OFFSET_WIN32PM_MAGIC) != WIN32PM_MAGIC) {
249 //another (non-win32) application's window
250 //set to NULL (allowed according to win32 SDK) to avoid problems
251 hwndFocus = NULL;
252 }
253 if((ULONG)mp2 == TRUE) {
254 rc = win32wnd->MsgSetFocus(hwndFocus);
255 }
256 else rc = win32wnd->MsgKillFocus(hwndFocus);
257 if(rc) {
258 goto RunDefWndProc;
259 }
260 break;
261 }
262 //**************************************************************************
263 //Mouse messages (OS/2 Window coordinates -> Win32 coordinates relative to screen
264 //**************************************************************************
265 case WM_BUTTON1DOWN:
266 dprintf(("OS2: WM_BUTTON1DOWN %x", hwnd));
267 point.x = (*(POINTS *)&mp1).x;
268 point.y = (*(POINTS *)&mp1).y;
269 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
270 if(win32wnd->MsgButton(BUTTON_LEFTDOWN, point.x, point.y)) {
271 goto RunDefWndProc;
272 }
273 break;
274
275 case WM_BUTTON1UP:
276 dprintf(("OS2: WM_BUTTON1UP %x", hwnd));
277 point.x = (*(POINTS *)&mp1).x;
278 point.y = (*(POINTS *)&mp1).y;
279 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
280 if(win32wnd->MsgButton(BUTTON_LEFTUP, point.x, point.y)) {
281 goto RunDefWndProc;
282 }
283 break;
284 case WM_BUTTON1DBLCLK:
285 point.x = (*(POINTS *)&mp1).x;
286 point.y = (*(POINTS *)&mp1).y;
287 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
288 if(win32wnd->MsgButton(BUTTON_LEFTDBLCLICK, point.x, point.y)) {
289 goto RunDefWndProc;
290 }
291 break;
292 case WM_BUTTON2DOWN:
293 point.x = (*(POINTS *)&mp1).x;
294 point.y = (*(POINTS *)&mp1).y;
295 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
296 if(win32wnd->MsgButton(BUTTON_RIGHTDOWN, point.x, point.y)) {
297 goto RunDefWndProc;
298 }
299 break;
300 case WM_BUTTON2UP:
301 point.x = (*(POINTS *)&mp1).x;
302 point.y = (*(POINTS *)&mp1).y;
303 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
304 if(win32wnd->MsgButton(BUTTON_RIGHTUP, point.x, point.y)) {
305 goto RunDefWndProc;
306 }
307 break;
308 case WM_BUTTON2DBLCLK:
309 point.x = (*(POINTS *)&mp1).x;
310 point.y = (*(POINTS *)&mp1).y;
311 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
312 if(win32wnd->MsgButton(BUTTON_RIGHTDBLCLICK, point.x, point.y)) {
313 goto RunDefWndProc;
314 }
315 break;
316 case WM_BUTTON3DOWN:
317 point.x = (*(POINTS *)&mp1).x;
318 point.y = (*(POINTS *)&mp1).y;
319 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
320 if(win32wnd->MsgButton(BUTTON_MIDDLEDOWN, point.x, point.y)) {
321 goto RunDefWndProc;
322 }
323 break;
324 case WM_BUTTON3UP:
325 point.x = (*(POINTS *)&mp1).x;
326 point.y = (*(POINTS *)&mp1).y;
327 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
328 if(win32wnd->MsgButton(BUTTON_MIDDLEUP, point.x, point.y)) {
329 goto RunDefWndProc;
330 }
331 break;
332 case WM_BUTTON3DBLCLK:
333 point.x = (*(POINTS *)&mp1).x;
334 point.y = (*(POINTS *)&mp1).y;
335 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
336 if(win32wnd->MsgButton(BUTTON_MIDDLEDBLCLICK, point.x, point.y)) {
337 goto RunDefWndProc;
338 }
339 break;
340
341 case WM_BUTTON2MOTIONSTART:
342 case WM_BUTTON2MOTIONEND:
343 case WM_BUTTON2CLICK:
344 case WM_BUTTON1MOTIONSTART:
345 case WM_BUTTON1MOTIONEND:
346 case WM_BUTTON1CLICK:
347 case WM_BUTTON3MOTIONSTART:
348 case WM_BUTTON3MOTIONEND:
349 case WM_BUTTON3CLICK:
350 goto RunDefWndProc;
351
352 case WM_MOUSEMOVE:
353 {
354 ULONG keystate = 0;
355 if(WinGetKeyState(HWND_DESKTOP, VK_BUTTON1))
356 keystate |= WMMOVE_LBUTTON;
357 if(WinGetKeyState(HWND_DESKTOP, VK_BUTTON2))
358 keystate |= WMMOVE_MBUTTON;
359 if(WinGetKeyState(HWND_DESKTOP, VK_BUTTON3))
360 keystate |= WMMOVE_RBUTTON;
361 if(WinGetKeyState(HWND_DESKTOP, VK_SHIFT))
362 keystate |= WMMOVE_SHIFT;
363 if(WinGetKeyState(HWND_DESKTOP, VK_CTRL))
364 keystate |= WMMOVE_CTRL;
365
366 //OS/2 Window coordinates -> Win32 Window coordinates
367 if(!win32wnd->MsgMouseMove(keystate, SHORT1FROMMP(mp1), MapOS2ToWin32Y(win32wnd, SHORT2FROMMP(mp1)))) {
368 goto RunDefWndProc;
369 }
370 break;
371 }
372
373 //**************************************************************************
374 //Slider messages
375 //**************************************************************************
376 case WM_VSCROLL:
377 case WM_HSCROLL:
378
379 case WM_CONTROL:
380
381 case WM_COMMAND:
382 if(SHORT1FROMMP(mp2) == CMDSRC_MENU) {
383 win32wnd->MsgCommand(CMD_MENU, SHORT1FROMMP(mp1), 0);
384 }
385 //todo controls + accelerators
386 break;
387
388 case WM_SYSCOMMAND:
389
390 case WM_CHAR:
391
392 case WM_INITMENU:
393 case WM_MENUSELECT:
394 case WM_MENUEND:
395 case WM_NEXTMENU:
396
397 case WM_TIMER:
398 goto RunDefWndProc;
399
400 case WM_SETWINDOWPARAMS:
401 {
402 WNDPARAMS *wndParams = (WNDPARAMS *)mp1;
403
404 dprintf(("OS2: WM_SETWINDOWPARAMS %x", hwnd));
405 if(wndParams->fsStatus & WPM_TEXT) {
406 if(win32wnd->MsgSetText(wndParams->pszText, wndParams->cchText)) {
407 goto RunDefWndProc;
408 }
409 }
410 goto RunDefWndProc;
411 }
412
413 case WM_PAINT:
414 dprintf(("OS2: WM_PAINT %x", hwnd));
415 if(win32wnd->MsgPaint(0, 0)) {
416 goto RunDefWndProc;
417 }
418 break;
419
420 case WM_HITTEST:
421 if(win32wnd->MsgHitTest((*(POINTS *)&mp1).x, MapOS2ToWin32Y(OSLIB_HWND_DESKTOP, hwnd, (*(POINTS *)&mp1).y))) {
422 goto RunDefWndProc;
423 }
424 break;
425
426 case WM_SYSCOLORCHANGE:
427 case WM_SYSVALUECHANGED:
428 case WM_CALCVALIDRECTS:
429 case WM_QUERYWINDOWPARAMS:
430 case WM_SETSELECTION:
431 case WM_PPAINT:
432 case WM_PSETFOCUS:
433 case WM_PSYSCOLORCHANGE:
434 case WM_PSIZE:
435 case WM_PACTIVATE:
436 case WM_PCONTROL:
437 case WM_HELP:
438 case WM_APPTERMINATENOTIFY:
439 case WM_PRESPARAMCHANGED:
440 case WM_DRAWITEM:
441 case WM_MEASUREITEM:
442 case WM_CONTROLPOINTER:
443 case WM_QUERYDLGCODE:
444 case WM_SUBSTITUTESTRING:
445 case WM_MATCHMNEMONIC:
446 case WM_SAVEAPPLICATION:
447 case WM_SEMANTICEVENT:
448 default:
449 dprintf(("OS2: RunDefWndProc msg %x for %x", msg, hwnd));
450 RestoreOS2TIB();
451 return WinDefWindowProc( hwnd, msg, mp1, mp2 );
452 }
453 RestoreOS2TIB();
454 return (MRESULT)FALSE;
455
456RunDefWndProc:
457 dprintf(("OS2: RunDefWndProc msg %x for %x", msg, hwnd));
458 RestoreOS2TIB();
459 return WinDefWindowProc( hwnd, msg, mp1, mp2 );
460} /* End of Win32WindowProc */
461//******************************************************************************
462//******************************************************************************
Note: See TracBrowser for help on using the repository browser.