source: trunk/dll/common.c@ 809

Last change on this file since 809 was 809, checked in by Steven Levine, 18 years ago

Revert more to DosSleep(0)
Comments

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