source: trunk/dll/common.c@ 957

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

Rework collector progress reporting and improve performance (ticket #79)

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