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

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

Erase background changes

File size: 17.9 KB
Line 
1/* $Id: pmwindow.cpp,v 1.19 1999-08-22 08:30:52 sandervl Exp $ */
2/*
3 * Win32 Window Managment Code for OS/2
4 *
5 * Copyright 1998-1999 Sander van Leeuwen (sandervl@xs4all.nl)
6 * Copyright 1999 Daniela Engert (dani@ngrt.de)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#define INCL_WIN
13#define INCL_GPI
14
15#include <os2.h> /* PM header file */
16#include <os2wrap.h>
17#include <stdlib.h>
18#include "win32type.h"
19#include <wprocess.h>
20#include <misc.h>
21#include <win32wnd.h>
22#include <win32dlg.h>
23#include "pmwindow.h"
24#include "oslibwin.h"
25#include "oslibutil.h"
26#include "oslibgdi.h"
27#include "oslibmsg.h"
28
29HMQ hmq = 0; /* Message queue handle */
30HAB hab = 0;
31
32RECTL desktopRectl = {0};
33
34MRESULT EXPENTRY Win32WindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
35
36//******************************************************************************
37//Initialize PM; create hab, message queue and register special Win32 window classes
38//******************************************************************************
39BOOL InitPM()
40{
41 hab = WinInitialize(0);
42 dprintf(("Winitialize returned %x", hab));
43 hmq = WinCreateMsgQueue(hab, 0);
44
45 if(!hab || !hmq)
46 {
47 UINT error;
48 //CB: only fail on real error
49 error = WinGetLastError(hab) & 0xFFFF; //error code
50 if (!hab || error != PMERR_MSG_QUEUE_ALREADY_EXISTS)
51 {
52 dprintf(("WinInitialize or WinCreateMsgQueue failed %x %x", hab, hmq));
53 dprintf((" Error = %x",error));
54 return(FALSE);
55 }
56 else
57 {
58 if(!hab) {
59 hab = WinQueryAnchorBlock(HWND_DESKTOP);
60 dprintf(("WinQueryAnchorBlock returned %x", hab));
61 }
62 if(!hmq) {
63 hmq = HMQ_CURRENT;
64 }
65 }
66 }
67 SetThreadHAB(hab);
68 dprintf(("InitPM: hmq = %x", hmq));
69 SetThreadMessageQueue(hmq);
70
71 if(!WinRegisterClass( /* Register window class */
72 hab, /* Anchor block handle */
73 (PSZ)WIN32_STDCLASS, /* Window class name */
74 (PFNWP)Win32WindowProc, /* Address of window procedure */
75 CS_SIZEREDRAW | CS_HITTEST,
76 8)) {
77 dprintf(("WinRegisterClass Win32Window failed"));
78 return(FALSE);
79 }
80
81 WinQueryWindowRect(HWND_DESKTOP, &desktopRectl);
82 dprintf(("InitPM: Desktop (%d,%d)", desktopRectl.xRight, desktopRectl.yTop));
83 return OSLibInitMsgQueue();
84} /* End of main */
85//******************************************************************************
86//Win32 window message handler
87//******************************************************************************
88MRESULT EXPENTRY Win32WindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
89{
90 POSTMSG_PACKET *postmsg;
91 OSLIBPOINT point, ClientPoint;
92 Win32Window *win32wnd;
93 APIRET rc;
94
95 //Restore our FS selector
96 SetWin32TIB();
97
98 win32wnd = Win32Window::GetWindowFromOS2Handle(hwnd);
99
100 if(msg != WM_CREATE && win32wnd == NULL) {
101 dprintf(("Invalid win32wnd pointer for window %x!!", hwnd));
102 goto RunDefWndProc;
103 }
104 switch( msg )
105 {
106 //internal messages
107 case WM_WIN32_POSTMESSAGEA:
108 postmsg = (POSTMSG_PACKET *)mp1;
109 if(postmsg == NULL) {
110 dprintf(("WM_WIN32_POSTMESSAGEA, postmsg NULL!!"));
111 break;
112 }
113 win32wnd->SendMessageA(postmsg->Msg, postmsg->wParam, postmsg->lParam);
114 free(postmsg);
115 break;
116
117 case WM_WIN32_POSTMESSAGEW:
118 postmsg = (POSTMSG_PACKET *)mp1;
119 if(postmsg == NULL) {
120 dprintf(("WM_WIN32_POSTMESSAGEW, postmsg NULL!!"));
121 break;
122 }
123 win32wnd->SendMessageW(postmsg->Msg, postmsg->wParam, postmsg->lParam);
124 free(postmsg);
125 break;
126
127 //OS/2 msgs
128 case WM_CREATE:
129 //Processing is done in after WinCreateWindow returns
130 dprintf(("OS2: WM_CREATE %x", hwnd));
131 RestoreOS2TIB();
132 return (MRESULT)FALSE;
133
134 case WM_QUIT:
135 dprintf(("OS2: WM_QUIT %x", hwnd));
136 if(win32wnd->MsgQuit()) {
137 goto RunDefWndProc;
138 }
139 break;
140
141 case WM_CLOSE:
142 dprintf(("OS2: WM_CLOSE %x", hwnd));
143 if(win32wnd->MsgClose()) {
144 goto RunDefWndProc;
145 }
146 break;
147
148 case WM_DESTROY:
149 dprintf(("OS2: WM_DESTROY %x", hwnd));
150 if(win32wnd->MsgDestroy()) {
151 goto RunDefWndProc;
152 }
153 break;
154
155 case WM_ENABLE:
156 dprintf(("OS2: WM_ENABLE %x", hwnd));
157 if(win32wnd->MsgEnable((ULONG)mp1)) {
158 goto RunDefWndProc;
159 }
160 break;
161
162 case WM_SHOW:
163 dprintf(("OS2: WM_SHOW %x", hwnd));
164 if(win32wnd->MsgShow((ULONG)mp1)) {
165 goto RunDefWndProc;
166 }
167 break;
168
169 case WM_ADJUSTWINDOWPOS:
170 {
171 ULONG x, y;
172 PSWP pswp = (PSWP)mp1;
173
174 dprintf(("OS2: WM_ADJUSTWINDOWPOS %x", hwnd));
175
176 if(pswp->fl & SWP_MOVE) {
177 if(win32wnd->isChild()) {
178 x = pswp->x;
179 y = pswp->cy - y - 1;
180 }
181 else {
182 OSLIBPOINT point;
183
184 point.x = pswp->x;
185 point.y = pswp->y;
186
187 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
188 x = point.x;
189 y = point.y;
190 }
191 if(win32wnd->MsgMove(x, y)) {
192 goto RunDefWndProc;
193 }
194 break;
195 }
196 goto RunDefWndProc;
197 }
198
199 case WM_WINDOWPOSCHANGED:
200 {
201 PSWP pswp = (PSWP)mp1;
202
203 dprintf(("OS2: WM_WINDOWPOSCHANGED %x %x (%d,%d) (%d,%d)", hwnd, pswp->fl, pswp->x, pswp->y, pswp->cx, pswp->cy));
204 goto RunDefWndProc;
205 }
206
207 case WM_ERASEBACKGROUND:
208 {
209 HPS hps;
210
211 dprintf(("OS2: WM_ERASEBACKGROUND %x", hwnd));
212 if(!win32wnd->MsgEraseBackGround())
213 {
214 /*
215 * Return TRUE to request PM to paint the window background
216 * in SYSCLR_WINDOW.
217 */
218 return (MRESULT)( TRUE );
219 }
220 return (MRESULT) FALSE;
221 }
222 case WM_SIZE:
223 {
224 SWP swp;
225
226 rc = WinQueryWindowPos(hwnd, &swp);
227 if(rc == FALSE) {
228 dprintf(("WM_SIZE: WinQueryWindowPos failed!"));
229 break;
230 }
231 dprintf(("OS2: WM_SIZE %x %x (%d,%d) (%d,%d) (%d,%d)", hwnd, swp.fl, swp.x, swp.y, swp.cx, swp.cy, SHORT1FROMMP(mp2), SHORT2FROMMP(mp2)));
232 if(win32wnd->MsgSize(SHORT1FROMMP(mp2), SHORT2FROMMP(mp2),
233 (swp.fl & SWP_MINIMIZE) != 0,
234 (swp.fl & SWP_MAXIMIZE) != 0))
235 {
236 goto RunDefWndProc;
237 }
238 break;
239 }
240
241 case WM_ACTIVATE:
242 {
243 HWND hwndActivate = (HWND)mp1;
244
245 dprintf(("OS2: WM_ACTIVATE %x", hwnd));
246 if(WinQueryWindowULong(hwndActivate, OFFSET_WIN32PM_MAGIC) != WIN32PM_MAGIC) {
247 //another (non-win32) application's window
248 //set to NULL (allowed according to win32 SDK) to avoid problems
249 hwndActivate = NULL;
250 }
251 if(win32wnd->MsgActivate(1, hwndActivate)) {
252 goto RunDefWndProc;
253 }
254 break;
255 }
256 case WM_FOCUSCHANGE:
257 dprintf(("OS2: WM_FOCUSCHANGE %x", hwnd));
258 goto RunDefWndProc;
259
260 case WM_SETFOCUS:
261 {
262 HWND hwndFocus = (HWND)mp1;
263
264 dprintf(("OS2: WM_SETFOCUS %x %d", hwnd, mp2));
265 if(WinQueryWindowULong(hwndFocus, OFFSET_WIN32PM_MAGIC) != WIN32PM_MAGIC) {
266 //another (non-win32) application's window
267 //set to NULL (allowed according to win32 SDK) to avoid problems
268 hwndFocus = NULL;
269 }
270 if((ULONG)mp2 == TRUE) {
271 rc = win32wnd->MsgSetFocus(hwndFocus);
272 }
273 else rc = win32wnd->MsgKillFocus(hwndFocus);
274 if(rc) {
275 goto RunDefWndProc;
276 }
277 break;
278 }
279 //**************************************************************************
280 //Mouse messages (OS/2 Window coordinates -> Win32 coordinates relative to screen
281 //**************************************************************************
282 case WM_BUTTON1DOWN:
283 dprintf(("OS2: WM_BUTTON1DOWN %x", hwnd));
284 point.x = (*(POINTS *)&mp1).x;
285 point.y = (*(POINTS *)&mp1).y;
286 ClientPoint.x = point.x;
287 ClientPoint.y = MapOS2ToWin32Y(hwnd, 1, point.y);
288 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
289 if(win32wnd->MsgButton(BUTTON_LEFTDOWN, point.x, point.y, ClientPoint.x, ClientPoint.y)) {
290 goto RunDefWndProc;
291 }
292 break;
293
294 case WM_BUTTON1UP:
295 dprintf(("OS2: WM_BUTTON1UP %x", hwnd));
296 point.x = (*(POINTS *)&mp1).x;
297 point.y = (*(POINTS *)&mp1).y;
298 ClientPoint.x = point.x;
299 ClientPoint.y = MapOS2ToWin32Y(hwnd, 1, point.y);
300 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
301 if(win32wnd->MsgButton(BUTTON_LEFTUP, point.x, point.y, ClientPoint.x, ClientPoint.y)) {
302 goto RunDefWndProc;
303 }
304 break;
305 case WM_BUTTON1DBLCLK:
306 point.x = (*(POINTS *)&mp1).x;
307 point.y = (*(POINTS *)&mp1).y;
308 ClientPoint.x = point.x;
309 ClientPoint.y = MapOS2ToWin32Y(hwnd, 1, point.y);
310 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
311 if(win32wnd->MsgButton(BUTTON_LEFTDBLCLICK, point.x, point.y, ClientPoint.x, ClientPoint.y)) {
312 goto RunDefWndProc;
313 }
314 break;
315 case WM_BUTTON2DOWN:
316 point.x = (*(POINTS *)&mp1).x;
317 point.y = (*(POINTS *)&mp1).y;
318 ClientPoint.x = point.x;
319 ClientPoint.y = MapOS2ToWin32Y(hwnd, 1, point.y);
320 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
321 if(win32wnd->MsgButton(BUTTON_RIGHTDOWN, point.x, point.y, ClientPoint.x, ClientPoint.y)) {
322 goto RunDefWndProc;
323 }
324 break;
325 case WM_BUTTON2UP:
326 point.x = (*(POINTS *)&mp1).x;
327 point.y = (*(POINTS *)&mp1).y;
328 ClientPoint.x = point.x;
329 ClientPoint.y = MapOS2ToWin32Y(hwnd, 1, point.y);
330 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
331 if(win32wnd->MsgButton(BUTTON_RIGHTUP, point.x, point.y, ClientPoint.x, ClientPoint.y)) {
332 goto RunDefWndProc;
333 }
334 break;
335 case WM_BUTTON2DBLCLK:
336 point.x = (*(POINTS *)&mp1).x;
337 point.y = (*(POINTS *)&mp1).y;
338 ClientPoint.x = point.x;
339 ClientPoint.y = MapOS2ToWin32Y(hwnd, 1, point.y);
340 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
341 if(win32wnd->MsgButton(BUTTON_RIGHTDBLCLICK, point.x, point.y, ClientPoint.x, ClientPoint.y)) {
342 goto RunDefWndProc;
343 }
344 break;
345 case WM_BUTTON3DOWN:
346 point.x = (*(POINTS *)&mp1).x;
347 point.y = (*(POINTS *)&mp1).y;
348 ClientPoint.x = point.x;
349 ClientPoint.y = MapOS2ToWin32Y(hwnd, 1, point.y);
350 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
351 if(win32wnd->MsgButton(BUTTON_MIDDLEDOWN, point.x, point.y, ClientPoint.x, ClientPoint.y)) {
352 goto RunDefWndProc;
353 }
354 break;
355 case WM_BUTTON3UP:
356 point.x = (*(POINTS *)&mp1).x;
357 point.y = (*(POINTS *)&mp1).y;
358 ClientPoint.x = point.x;
359 ClientPoint.y = MapOS2ToWin32Y(hwnd, 1, point.y);
360 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
361 if(win32wnd->MsgButton(BUTTON_MIDDLEUP, point.x, point.y, ClientPoint.x, ClientPoint.y)) {
362 goto RunDefWndProc;
363 }
364 break;
365 case WM_BUTTON3DBLCLK:
366 point.x = (*(POINTS *)&mp1).x;
367 point.y = (*(POINTS *)&mp1).y;
368 ClientPoint.x = point.x;
369 ClientPoint.y = MapOS2ToWin32Y(hwnd, 1, point.y);
370 MapOS2ToWin32Point(OSLIB_HWND_DESKTOP, hwnd, &point);
371 if(win32wnd->MsgButton(BUTTON_MIDDLEDBLCLICK, point.x, point.y, ClientPoint.x, ClientPoint.y)) {
372 goto RunDefWndProc;
373 }
374 break;
375
376 case WM_BUTTON2MOTIONSTART:
377 case WM_BUTTON2MOTIONEND:
378 case WM_BUTTON2CLICK:
379 case WM_BUTTON1MOTIONSTART:
380 case WM_BUTTON1MOTIONEND:
381 case WM_BUTTON1CLICK:
382 case WM_BUTTON3MOTIONSTART:
383 case WM_BUTTON3MOTIONEND:
384 case WM_BUTTON3CLICK:
385 goto RunDefWndProc;
386
387 case WM_MOUSEMOVE:
388 {
389 ULONG keystate = 0;
390 if(WinGetKeyState(HWND_DESKTOP, VK_BUTTON1))
391 keystate |= WMMOVE_LBUTTON;
392 if(WinGetKeyState(HWND_DESKTOP, VK_BUTTON2))
393 keystate |= WMMOVE_MBUTTON;
394 if(WinGetKeyState(HWND_DESKTOP, VK_BUTTON3))
395 keystate |= WMMOVE_RBUTTON;
396 if(WinGetKeyState(HWND_DESKTOP, VK_SHIFT))
397 keystate |= WMMOVE_SHIFT;
398 if(WinGetKeyState(HWND_DESKTOP, VK_CTRL))
399 keystate |= WMMOVE_CTRL;
400
401 //OS/2 Window coordinates -> Win32 Window coordinates
402 //TODO: What do windows apps that handle this messages return?
403 if(!win32wnd->MsgMouseMove(keystate, SHORT1FROMMP(mp1), MapOS2ToWin32Y(win32wnd, SHORT2FROMMP(mp1)))) {
404 goto RunDefWndProc;
405 }
406 break;
407 }
408
409 //**************************************************************************
410 //Slider messages
411 //**************************************************************************
412 case WM_VSCROLL:
413 case WM_HSCROLL:
414
415 case WM_CONTROL:
416
417 case WM_COMMAND:
418 if(SHORT1FROMMP(mp2) == CMDSRC_MENU) {
419 win32wnd->MsgCommand(CMD_MENU, SHORT1FROMMP(mp1), 0);
420 }
421 if(SHORT1FROMMP(mp2) == CMDSRC_ACCELERATOR) {
422 win32wnd->MsgCommand(CMD_ACCELERATOR, SHORT1FROMMP(mp1), 0);
423 }
424 //todo controls + accelerators
425 break;
426
427 case WM_SYSCOMMAND:
428 {
429 ULONG x = 0, y = 0;
430 ULONG win32sc;
431
432 if(SHORT2FROMMP(mp2) == TRUE) {//syscommand caused by mouse action
433 POINTL pointl;
434 WinQueryPointerPos(HWND_DESKTOP, &pointl);
435 x = pointl.x;
436 y = desktopRectl.yTop - y;
437 }
438 switch(SHORT1FROMMP(mp1)) {
439 case SC_MOVE:
440 win32sc = WIN32SC_MOVE;
441 break;
442 case SC_CLOSE:
443 win32sc = WIN32SC_CLOSE;
444 break;
445 case SC_MAXIMIZE:
446 win32sc = WIN32SC_MAXIMIZE;
447 break;
448 case SC_MINIMIZE:
449 win32sc = WIN32SC_MINIMIZE;
450 break;
451 case SC_NEXTFRAME:
452 case SC_NEXTWINDOW:
453 win32sc = WIN32SC_NEXTWINDOW;
454 break;
455 case SC_RESTORE:
456 win32sc = WIN32SC_RESTORE;
457 break;
458 case SC_TASKMANAGER:
459 win32sc = WIN32SC_TASKLIST;
460 break;
461 default:
462 goto RunDefWndProc;
463 }
464 dprintf(("WM_SYSCOMMAND %x %x (%d,%d)", hwnd, win32sc, x, y));
465 if(win32wnd->MsgSysCommand(win32sc, x, y)) {
466 goto RunDefWndProc;
467 }
468 break;
469 }
470 case WM_CHAR:
471 {
472 ULONG keyflags = 0, vkey = 0;
473 ULONG fl = SHORT1FROMMP(mp1);
474
475 if(!(fl & KC_CHAR)) {
476 dprintf(("WM_CHAR: no valid character code"));
477 goto RunDefWndProc;
478 }
479 if(fl & KC_VIRTUALKEY) {
480 vkey = SHORT2FROMMP(mp2);
481 }
482 if(fl & KC_KEYUP) {
483 keyflags |= KEY_UP;
484 }
485 if(fl & KC_ALT) {
486 keyflags |= KEY_ALTDOWN;
487 }
488 if(fl & KC_PREVDOWN) {
489 keyflags |= KEY_PREVDOWN;
490 }
491 if(fl & KC_DEADKEY) {
492 keyflags |= KEY_DEADKEY;
493 }
494 if(win32wnd->MsgChar(SHORT1FROMMP(mp2), CHAR3FROMMP(mp1), CHAR4FROMMP(mp1), vkey, keyflags)) {
495 goto RunDefWndProc;
496 }
497 break;
498 }
499 case WM_INITMENU:
500 case WM_MENUSELECT:
501 case WM_MENUEND:
502 case WM_NEXTMENU:
503
504 case WM_TIMER:
505 goto RunDefWndProc;
506
507 case WM_SETWINDOWPARAMS:
508 {
509 WNDPARAMS *wndParams = (WNDPARAMS *)mp1;
510
511 dprintf(("OS2: WM_SETWINDOWPARAMS %x", hwnd));
512 if(wndParams->fsStatus & WPM_TEXT) {
513 if(win32wnd->MsgSetText(wndParams->pszText, wndParams->cchText)) {
514 goto RunDefWndProc;
515 }
516 }
517 goto RunDefWndProc;
518 }
519
520 case WM_QUERYWINDOWPARAMS:
521 {
522 PWNDPARAMS wndpars = (PWNDPARAMS)mp1;
523 ULONG textlen;
524 PSZ wintext;
525
526 if(wndpars->fsStatus & (WPM_CCHTEXT | WPM_TEXT)) {
527 if(wndpars->fsStatus & WPM_CCHTEXT)
528 wndpars->cchText = win32wnd->MsgGetTextLength();
529 if(wndpars->fsStatus & WPM_TEXT)
530 wndpars->pszText = win32wnd->MsgGetText();
531 return (MRESULT)TRUE;
532 }
533 goto RunDefWndProc;
534 }
535
536 case WM_PAINT:
537 dprintf(("OS2: WM_PAINT %x", hwnd));
538 if(win32wnd->MsgPaint(0, 0)) {
539 goto RunDefWndProc;
540 }
541 break;
542
543 case WM_HITTEST:
544 if(win32wnd->MsgHitTest((*(POINTS *)&mp1).x, MapOS2ToWin32Y(OSLIB_HWND_DESKTOP, hwnd, (*(POINTS *)&mp1).y))) {
545 goto RunDefWndProc;
546 }
547 break;
548
549 case WM_SYSCOLORCHANGE:
550 case WM_SYSVALUECHANGED:
551 case WM_CALCVALIDRECTS:
552 case WM_SETSELECTION:
553 case WM_PPAINT:
554 case WM_PSETFOCUS:
555 case WM_PSYSCOLORCHANGE:
556 case WM_PSIZE:
557 case WM_PACTIVATE:
558 case WM_PCONTROL:
559 case WM_HELP:
560 case WM_APPTERMINATENOTIFY:
561 case WM_PRESPARAMCHANGED:
562 case WM_DRAWITEM:
563 case WM_MEASUREITEM:
564 case WM_CONTROLPOINTER:
565 case WM_QUERYDLGCODE:
566 case WM_SUBSTITUTESTRING:
567 case WM_MATCHMNEMONIC:
568 case WM_SAVEAPPLICATION:
569 case WM_SEMANTICEVENT:
570 default:
571// dprintf(("OS2: RunDefWndProc msg %x for %x", msg, hwnd));
572 RestoreOS2TIB();
573 return WinDefWindowProc( hwnd, msg, mp1, mp2 );
574 }
575 RestoreOS2TIB();
576 return (MRESULT)FALSE;
577
578RunDefWndProc:
579// dprintf(("OS2: RunDefWndProc msg %x for %x", msg, hwnd));
580 RestoreOS2TIB();
581 return WinDefWindowProc( hwnd, msg, mp1, mp2 );
582} /* End of Win32WindowProc */
583//******************************************************************************
584//******************************************************************************
Note: See TracBrowser for help on using the repository browser.