source: trunk/dll/common.c@ 888

Last change on this file since 888 was 888, checked in by Gregg Young, 18 years ago

runemf2 now quotes executable strings if needed (Ticket 180); it also reports where it was called from on errors

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.5 KB
Line 
1
2/***********************************************************************
3
4 $Id: common.c 888 2007-12-22 22:02:11Z gyoung $
5
6 Common window functions
7
8 Copyright (c) 1993, 1998 M. Kimes
9 Copyright (c) 2001, 2007 Steven H. Levine
10
11 13 Aug 05 SHL Renames
12 22 Jul 06 SHL Check more run time errors
13 15 Aug 06 SHL Use Dos_Error
14 03 Nov 06 SHL Rework thread usage count logic
15 07 Jan 07 GKY Move error strings etc. to string file
16 07 Jan 07 GKY Updated Helv font to vector font Helvetica
17 22 Mar 07 GKY Use QWL_USER
18 30 Mar 07 GKY Remove GetPString for window class names
19 02 Aug 07 SHL Sync with CNRITEM mods
20 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
21 26 Aug 07 SHL Change to DosSleep(0)
22
23***********************************************************************/
24
25#define INCL_DOS
26#define INCL_DOSERRORS
27#define INCL_WIN
28#define INCL_GPI
29#define INCL_LONGLONG
30#include <os2.h>
31
32#include <stdarg.h>
33#include <stdio.h>
34#include <stdlib.h>
35#include <string.h>
36#include <ctype.h>
37#include <time.h>
38#include <direct.h>
39#include <share.h>
40#include <limits.h>
41
42#include "fm3dll.h"
43#include "fm3dlg.h"
44#include "fm3str.h"
45#include "mle.h"
46
47#pragma data_seg(DATA1)
48
49static PSZ pszSrcFile = __FILE__;
50
51MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
52 HWND hwnd,
53 ULONG msg, MPARAM mp1, MPARAM mp2)
54{
55 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
56
57 switch (msg) {
58 case UM_TIMER:
59 case UM_ACTION:
60 case UM_SHOWME:
61 case UM_OPENWINDOWFORME:
62 case UM_MINIMIZE:
63 case UM_MAXIMIZE:
64 case UM_CONTAINERDIR:
65 case UM_FILTER:
66 case UM_INITMENU:
67 case UM_COMMAND:
68 case UM_UPDATERECORD:
69 case UM_UPDATERECORDLIST:
70 case WM_COMMAND:
71 case MM_PORTHOLEINIT:
72 case WM_INITMENU:
73 case UM_CONTAINER_FILLED:
74 case UM_FILESMENU:
75 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
76
77 case UM_CONTEXTMENU:
78 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
79 return 0;
80
81 case UM_CONTAINERHWND:
82 return MRFROMLONG(WinWindowFromID(hwnd, id));
83
84 case DM_DROP:
85 case DM_DRAGOVER:
86 case DM_DRAGLEAVE:
87 case DM_DROPHELP:
88 {
89 CNRDRAGINFO cnd;
90 USHORT dcmd;
91
92 switch (msg) {
93 case DM_DROP:
94 dcmd = CN_DROP;
95 break;
96 case DM_DRAGOVER:
97 dcmd = CN_DRAGOVER;
98 break;
99 case DM_DRAGLEAVE:
100 dcmd = CN_DRAGLEAVE;
101 break;
102 case DM_DROPHELP:
103 dcmd = CN_DROPHELP;
104 break;
105 }
106 cnd.pDragInfo = (PDRAGINFO) mp1;
107 cnd.pRecord = NULL;
108 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),
109 WM_CONTROL, MPFROM2SHORT(id, dcmd), MPFROMP(&cnd));
110 }
111
112 case UM_RESCAN:
113 if (fAutoTile &&
114 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
115 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
116 return 0;
117
118 case WM_MINMAXFRAME:
119 {
120 PSWP pswp = (PSWP) mp1;
121 MRESULT rc;
122
123 rc = oldproc(hwnd, msg, mp1, mp2);
124 if (pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE))
125 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
126 return rc;
127 }
128
129 case WM_DESTROY:
130 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
131 break;
132 }
133 return oldproc(hwnd, msg, mp1, mp2);
134}
135
136MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
137{
138 switch (msg) {
139 case WM_CREATE:
140 {
141 MRESULT rc;
142
143 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
144 switch (WinQueryWindowUShort(hwnd, QWS_ID))
145 case DIR_SORT:
146 case DIR_VIEW:
147 case DIR_FILTER:
148
149 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVTEXT));
150 return rc;
151 }
152 }
153 return PFNWPStatic(hwnd, msg, mp1, mp2);
154}
155
156void CommonTextPaint(HWND hwnd, HPS hps)
157{
158 int x;
159 USHORT ids[] = { DIR_FOLDERICON, DIR_TOTALS, DIR_SELECTED, DIR_VIEW,
160 DIR_FILTER, DIR_SORT, DIR_MAX, 0
161 };
162 BOOL bools[] = { TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
163
164 for (x = 0; ids[x]; x++) {
165 if (WinWindowFromID(hwnd, ids[x]) != (HWND) 0)
166 PaintRecessedWindow(WinWindowFromID(hwnd, ids[x]), hps,
167 bools[x], FALSE);
168 }
169}
170
171void CommonCreateTextChildren(HWND hwnd, char *class, USHORT * ids)
172{
173 int x;
174 CHAR s[33];
175 ULONG attrs;
176 HWND hwndTmp;
177
178 if (!hwnd || !class || !ids) {
179 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
180 return;
181 }
182
183 for (x = 0; ids[x]; x++) {
184 *s = 0;
185 switch (ids[x]) {
186 case DIR_SORT:
187 case DIR_FILTER:
188 case DIR_VIEW:
189 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
190 break;
191 case DIR_FOLDERICON:
192 case DIR_MAX:
193 attrs = SS_BITMAP;
194 sprintf(s, "#%d", ids[x]);
195 break;
196 default:
197 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
198 break;
199 }
200 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
201 HWND_TOP, ids[x], NULL, NULL);
202 if (!hwndTmp)
203 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
204 } // for
205}
206
207void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
208{
209 char dv[CCHMAXPATH];
210
211 if (!drive || !*drive)
212 return;
213 strcpy(dv, drive);
214 MakeValidDir(dv);
215
216 switch (cmd) {
217 case IDM_MKDIR:
218 PMMkDir(hwnd, dv, FALSE);
219 break;
220 case IDM_INFO:
221 WinDlgBox(HWND_DESKTOP,
222 HWND_DESKTOP,
223 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) dv);
224 break;
225 case IDM_DRVFLAGS:
226 strcpy(dv, drive); // Must use original drive letter
227 if (WinDlgBox(HWND_DESKTOP,
228 hwnd,
229 SetDrvProc,
230 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
231 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
232 break;
233 case IDM_SIZES:
234 WinDlgBox(HWND_DESKTOP,
235 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv);
236 break;
237 case IDM_SHOWALLFILES:
238 StartSeeAll(HWND_DESKTOP, FALSE, dv);
239 break;
240 case IDM_UNDELETE:
241 WinDlgBox(HWND_DESKTOP,
242 hwnd, UndeleteDlgProc, FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
243 break;
244 case IDM_CHKDSK:
245 runemf2(SEPARATE | WINDOWED,
246 hwnd, pszSrcFile, __LINE__, NULL, NULL,
247 "PMCHKDSK.EXE %c:", toupper(*dv));
248 break;
249 case IDM_OPTIMIZE:
250 {
251 CHAR FileSystem[CCHMAXPATH];
252 ULONG type;
253
254 CheckDrive(*dv, FileSystem, &type);
255 if (*FileSystem) {
256 strcat(FileSystem, "OPT.CMD");
257 runemf2(SEPARATE | WINDOWED,
258 hwnd, pszSrcFile, __LINE__,
259 NULL,
260 NULL,
261 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
262 }
263 }
264 break;
265 case IDM_FORMAT:
266 runemf2(SEPARATE | WINDOWED,
267 hwnd, pszSrcFile, __LINE__, NULL, NULL,
268 "PMFORMAT.EXE %c:", toupper(*dv));
269 break;
270
271#if 0 // fixme to be gone?
272
273 case IDM_CLOSETRAY:
274 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
275
276 BYTE parm[4] = { "CD01" };
277 ULONGLONG dlen;
278 ULONG plen;
279 HFILE hfile;
280 APIRET rc;
281
282 dv[2] = 0;
283 rc = DosOpen(dv,
284 &hfile,
285 &dlen,
286 0,
287 0,
288 OPEN_ACTION_OPEN_IF_EXISTS |
289 OPEN_ACTION_CREATE_IF_NEW,
290 OPEN_FLAGS_DASD |
291 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE, NULL);
292 if (rc)
293 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
294 else {
295 dlen = 0;
296 plen = sizeof(parm);
297 rc = DosDevIOCtl(hfile,
298 0x80,
299 0x45, &parm, sizeof(parm), &plen, NULL, 0, &dlen);
300 DosClose(hfile);
301 if (rc)
302 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosDevIOCtl");
303 }
304 }
305 break;
306#endif // fixme to be gone?
307
308 case IDM_LOCK:
309 case IDM_UNLOCK:
310 case IDM_EJECT:
311 {
312 BYTE parm[2];
313 ULONG plen = sizeof(parm), dlen = 0L;
314
315 switch (SHORT1FROMMP(cmd)) {
316 case IDM_LOCK:
317 parm[0] = 1;
318 break;
319 case IDM_UNLOCK:
320 parm[0] = 0;
321 break;
322 case IDM_EJECT:
323 parm[0] = 2;
324 break;
325 }
326 parm[1] = (BYTE) (*dv - 'A');
327 DosError(FERR_DISABLEHARDERR);
328 DosDevIOCtl(-1L,
329 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
330 }
331 break;
332 }
333}
334
335void CommonCreateMainChildren(HWND hwnd, SWP * swp)
336{
337 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
338 HWND hwndTmp;
339 PFNWP oldproc;
340
341 // Create a children of frame window
342 hwndStatus = WinCreateWindow(hwndFrame,
343 WC_STATUS,
344 "Status",
345 WS_VISIBLE | SS_TEXT | DT_LEFT |
346 DT_VCENTER,
347 swp->x + 4 +
348 WinQuerySysValue(HWND_DESKTOP,
349 SV_CXSIZEBORDER),
350 swp->y + 4 +
351 WinQuerySysValue(HWND_DESKTOP,
352 SV_CYSIZEBORDER),
353 ((swp->cx / 2) - 8) -
354 (WinQuerySysValue(HWND_DESKTOP,
355 SV_CXSIZEBORDER) * 2),
356 20,
357 hwndFrame, HWND_TOP, MAIN_STATUS, NULL, NULL);
358 if (!hwndStatus)
359 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
360
361 hwndStatus2 = WinCreateWindow(hwndFrame,
362 WC_STATUS,
363 "Status2",
364 WS_VISIBLE | SS_TEXT | DT_LEFT |
365 DT_VCENTER,
366 ((swp->cx / 2) + 4) +
367 WinQuerySysValue(HWND_DESKTOP,
368 SV_CXSIZEBORDER),
369 ((swp->cy / 2) + 4) +
370 WinQuerySysValue(HWND_DESKTOP,
371 SV_CYSIZEBORDER),
372 ((swp->cx / 2) - 8) -
373 (WinQuerySysValue(HWND_DESKTOP,
374 SV_CXSIZEBORDER) * 2),
375 20,
376 hwndFrame,
377 HWND_TOP, MAIN_STATUS2, NULL, NULL);
378 if (!hwndStatus2)
379 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
380
381 hwndAttr = WinCreateWindow(hwndFrame,
382 WC_STATUS,
383 "Attr",
384 WS_VISIBLE | SS_TEXT | DT_CENTER |
385 DT_VCENTER,
386 swp->x + 4 +
387 WinQuerySysValue(HWND_DESKTOP,
388 SV_CXSIZEBORDER),
389 swp->y + 4 + 24 +
390 WinQuerySysValue(HWND_DESKTOP,
391 SV_CYSIZEBORDER),
392 ((swp->cx / 4) - 8) -
393 (WinQuerySysValue(HWND_DESKTOP,
394 SV_CXSIZEBORDER) * 2),
395 20, hwndFrame, HWND_TOP, IDM_ATTRS, NULL, NULL);
396 if (!hwndAttr)
397 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
398
399 hwndDate = WinCreateWindow(hwndFrame,
400 WC_STATUS,
401 "Date",
402 WS_VISIBLE | SS_TEXT | DT_CENTER |
403 DT_VCENTER,
404 ((swp->x / 4) * 2) + 4 +
405 WinQuerySysValue(HWND_DESKTOP,
406 SV_CXSIZEBORDER),
407 swp->y + 4 + 24 +
408 WinQuerySysValue(HWND_DESKTOP,
409 SV_CYSIZEBORDER),
410 ((swp->cx / 4) - 8) -
411 (WinQuerySysValue(HWND_DESKTOP,
412 SV_CXSIZEBORDER) * 2),
413 20, hwndFrame, HWND_TOP, IDM_INFO, NULL, NULL);
414 if (!hwndDate)
415 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
416
417 hwndName = WinCreateWindow(hwndFrame,
418 WC_STATUS,
419 "Name",
420 WS_VISIBLE | SS_TEXT | DT_LEFT |
421 DT_VCENTER,
422 ((swp->x / 4) * 3) + 4 +
423 WinQuerySysValue(HWND_DESKTOP,
424 SV_CXSIZEBORDER),
425 swp->y + 4 +
426 WinQuerySysValue(HWND_DESKTOP,
427 SV_CYSIZEBORDER),
428 ((swp->cx / 4) - 8) -
429 (WinQuerySysValue(HWND_DESKTOP,
430 SV_CXSIZEBORDER) * 2),
431 20, hwndFrame, HWND_TOP, IDM_RENAME, NULL, NULL);
432 if (!hwndName)
433 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
434
435 hwndTmp = WinCreateWindow(hwndFrame,
436 WC_TOOLBACK,
437 NullStr,
438 WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER,
439 swp->x +
440 WinQuerySysValue(HWND_DESKTOP,
441 SV_CXSIZEBORDER),
442 (swp->cy -
443 WinQuerySysValue(HWND_DESKTOP,
444 SV_CYSIZEBORDER)) - 30,
445 swp->cx -
446 (WinQuerySysValue(HWND_DESKTOP,
447 SV_CXSIZEBORDER) * 2),
448 30, hwndFrame, HWND_TOP, MAIN_TOOLS, NULL, NULL);
449 if (!hwndTmp)
450 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
451
452 hwndBack = WinCreateWindow(hwndFrame,
453 WC_DRIVEBACK,
454 NullStr,
455 WS_VISIBLE | SS_TEXT | DT_RIGHT | DT_BOTTOM,
456 swp->x +
457 WinQuerySysValue(HWND_DESKTOP,
458 SV_CXSIZEBORDER),
459 (swp->cy -
460 WinQuerySysValue(HWND_DESKTOP,
461 SV_CYSIZEBORDER)) - 30,
462 swp->cx -
463 (WinQuerySysValue(HWND_DESKTOP,
464 SV_CXSIZEBORDER) * 2),
465 30,
466 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
467
468 if (!hwndBack)
469 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
470
471 hwndLED = WinCreateWindow(hwndFrame,
472 WC_LED,
473 "#920",
474 WS_VISIBLE | SS_BITMAP,
475 swp->cx - 58,
476 swp->y,
477 12,
478 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
479 if (!hwndLED)
480 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
481
482 hwndLEDHdr = WinCreateWindow(hwndFrame,
483 WC_LED,
484 "0",
485 WS_VISIBLE | SS_TEXT | DT_VCENTER |
486 DT_CENTER,
487 swp->cx - 58,
488 swp->y + 12,
489 12,
490 12,
491 hwndFrame, HWND_TOP, MAIN_LEDHDR, NULL, NULL);
492 if (!hwndLEDHdr)
493 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
494
495 hwndAutoview = WinCreateWindow(hwndFrame,
496 WC_AUTOVIEW,
497 NullStr,
498 WS_VISIBLE | SS_TEXT | DT_LEFT |
499 DT_TOP | DT_WORDBREAK,
500 swp->x + 4 +
501 WinQuerySysValue(HWND_DESKTOP,
502 SV_CXSIZEBORDER),
503 swp->y + 4 +
504 WinQuerySysValue(HWND_DESKTOP,
505 SV_CYSIZEBORDER) + 16,
506 (swp->cx - 8) -
507 (WinQuerySysValue(HWND_DESKTOP,
508 SV_CXSIZEBORDER) * 2),
509 48,
510 hwndFrame,
511 HWND_TOP, MAIN_AUTOVIEW, NULL, NULL);
512 if (!hwndAutoview)
513 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
514
515 hwndAutoMLE = WinCreateWindow(hwndFrame,
516 // GetPString(IDS_WCAUTOVIEW),
517 WC_MLE,
518 NullStr,
519 WS_VISIBLE | MLS_HSCROLL |
520 MLS_VSCROLL | MLS_BORDER,
521 swp->x + 4 +
522 WinQuerySysValue(HWND_DESKTOP,
523 SV_CXSIZEBORDER),
524 swp->y + 4 +
525 WinQuerySysValue(HWND_DESKTOP,
526 SV_CYSIZEBORDER) + 16,
527 (swp->cx - 8) -
528 (WinQuerySysValue(HWND_DESKTOP,
529 SV_CXSIZEBORDER) * 2),
530 48,
531 hwndFrame,
532 HWND_TOP, MAIN_AUTOVIEWMLE, NULL, NULL);
533 if (!hwndAutoMLE)
534 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
535
536 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
537 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
538 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
539}
540
541MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
542 MPARAM mp2)
543{
544 switch (msg) {
545 case UM_THREADUSE:
546 if (hbmLEDon && hbmLEDoff) {
547 static LONG threaduse;
548 CHAR ts[33];
549
550 if (mp1) {
551 threaduse++;
552 if (threaduse == 1)
553 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
554 }
555 else {
556 threaduse--;
557 if (threaduse <= 0) {
558 threaduse = 0;
559 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDoff), MPVOID);
560 }
561 }
562 ltoa(threaduse, ts, 10);
563 WinSetWindowText(hwndLEDHdr, ts);
564 DosSleep(0);
565 }
566 return 0;
567
568 case UM_LOADFILE:
569 {
570 CHAR *s = NULL;
571 static CHAR lastfile[CCHMAXPATH] = "";
572
573 if (!fAutoView) {
574 if (*lastfile)
575 PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
576 UM_LOADFILE, MPVOID, MPVOID);
577 *lastfile = 0;
578 }
579 else {
580 if (mp1) {
581 if (!mp2 && !stricmp(lastfile, (CHAR *) mp1))
582 return 0;
583 strcpy(lastfile, (CHAR *) mp1);
584 s = xstrdup(lastfile, pszSrcFile, __LINE__);
585 }
586 else
587 *lastfile = 0;
588 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
589 UM_LOADFILE, MPFROMP(s), MPVOID)) {
590 if (s)
591 free(s);
592 }
593 }
594 }
595 return 0;
596
597 case UM_BUILDDRIVEBAR:
598 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
599 MAIN_DRIVES));
600 return 0;
601 }
602 return WinDefWindowProc(hwnd, msg, mp1, mp2);
603}
604
605MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
606 MPARAM mp2)
607{
608 static HWND hwndLast = (HWND) 0;
609 static ULONG lastclick = 0;
610
611 switch (msg) {
612 case WM_MOUSEMOVE:
613 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
614 if (!fNoFinger) {
615 WinSetPointer(HWND_DESKTOP, hptrFinger);
616 return MRFROMLONG(TRUE);
617 }
618 break;
619
620 case WM_BUTTON1DOWN:
621 case WM_BUTTON3DOWN:
622 if (hwndBubble)
623 WinDestroyWindow(hwndBubble);
624 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
625 WinSetCapture(HWND_DESKTOP, hwnd);
626 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
627 break;
628
629 case WM_BUTTON2UP:
630 case WM_BUTTON2DOWN:
631 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
632 if (msg == WM_BUTTON2UP && hwndLast) {
633 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
634 hwndLast = (HWND) 0;
635 }
636 break;
637
638 case WM_BUTTON1UP:
639 case WM_BUTTON3UP:
640 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
641 WinSetCapture(HWND_DESKTOP, (HWND) 0);
642 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
643 {
644 ULONG check;
645
646 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
647 if (check > lastclick + 500) {
648
649 RECTL rcl;
650 POINTS pts;
651
652 pts.x = SHORT1FROMMP(mp1);
653 pts.y = SHORT2FROMMP(mp1);
654 WinQueryWindowRect(hwnd, &rcl);
655 if (pts.x > 0 && pts.y > 0 && pts.x < rcl.xRight && pts.y < rcl.yTop)
656 PostMsg(hwnd, UM_CLICKED + (msg == WM_BUTTON3UP), mp1, mp2);
657 }
658 lastclick = check;
659 }
660 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
661 hwndLast = (HWND) 0;
662 break;
663
664 case WM_SETFOCUS:
665 if (mp2)
666 hwndLast = (HWND) mp1;
667 break;
668
669 case UM_FOCUSME:
670 if (mp1) {
671
672 PID pid;
673 TID tid;
674
675 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
676 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
677 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
678 return 0;
679 }
680 }
681 {
682 HWND htemp = (HWND) 0;
683
684 if (hwndMain)
685 htemp = TopWindow(hwndMain, (HWND) 0);
686 if (!htemp)
687 htemp = hwndTree;
688 if (htemp)
689 WinSetFocus(HWND_DESKTOP, htemp);
690 else
691 WinSetFocus(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
692 }
693 return 0;
694 }
695
696 return PFNWPStatic(hwnd, msg, mp1, mp2);
697}
698
699MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
700{
701 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
702
703 switch (msg) {
704 case UM_FIXCNRMLE:
705 if (dcd) {
706
707 SWP swp, swpC;
708
709 if (WinQueryWindowPos(WinWindowFromID(hwnd, CID_MLE), &swp)) {
710 if (WinQueryWindowPos(hwnd, &swpC)) {
711 swpC.cx -= (WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL) + 4);
712 swpC.cx -= swp.x;
713 WinSetWindowPos(WinWindowFromID(hwnd, CID_MLE),
714 HWND_TOP, 0, 0, swpC.cx, swp.cy + 2, SWP_SIZE);
715 }
716 }
717 if (mp1)
718 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
719 MLM_SETTEXTLIMIT, mp1, MPVOID);
720 }
721 return 0;
722
723 case UM_FIXEDITNAME:
724 if (dcd) {
725 if (mp1 && (INT) mp1 != -1) {
726
727 CHAR *p;
728
729 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
730 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
731 0, strlen((CHAR *) mp1) + 1);
732 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *) mp1);
733 p = strrchr((CHAR *) mp1, '\\');
734 if (p) {
735 p++;
736 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *) mp1));
737 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *) mp1));
738 }
739 else
740 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *) mp1));
741 }
742 else if (mp2) {
743 if ((INT) mp1 == -1) {
744 PCNRITEM pci = (PCNRITEM) mp2;
745 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
746 }
747 else {
748 Broadcast(WinQueryAnchorBlock(hwnd),
749 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
750 free(mp2);
751 }
752 }
753 }
754 return 0;
755 }
756 return PFNWPCnr(hwnd, msg, mp1, mp2);
757}
758
759HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
760 BOOL noautotile, char *directory)
761{
762 SWP swp;
763 HWND hwndDir;
764
765 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
766 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
767 else if (*(ULONG *) realappname == FM3UL) {
768 if (!fAutoTile)
769 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
770 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
771 if (hwndDir) {
772 if (!fAutoTile)
773 WinSetWindowPos(hwndDir,
774 HWND_TOP,
775 swp.x,
776 swp.y,
777 swp.cx,
778 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
779 else if (!noautotile)
780 TileChildren(hwndParent, TRUE);
781 WinSetWindowPos(hwndDir,
782 HWND_TOP,
783 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
784 }
785 }
786 else {
787
788 char s[256];
789
790 assign_ignores(s);
791 runemf2(WINDOWED | SEPARATE,
792 hwnd, pszSrcFile, __LINE__,
793 NULL,
794 NULL,
795 "VDIR.EXE %s%s\"%s%s\"",
796 (*s) ? s : NullStr, (*s) ? " " : NullStr,
797 directory,
798 (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr);
799 }
800 return hwndDir;
801}
802
803//= IncrThreadUsage() Increment thread usage counter ==
804
805VOID IncrThreadUsage(VOID)
806{
807 if (hwndMain)
808 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
809}
810
811//= DecrThreadUsage() Decrement thread usage counter ==
812
813VOID DecrThreadUsage(VOID)
814{
815 if (hwndMain)
816 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
817}
818
819#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
820#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
821#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
822#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
823#pragma alloc_text(COMMON4,CommonCnrProc)
824#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.