source: trunk/dll/common.c@ 1375

Last change on this file since 1375 was 1375, checked in by Gregg Young, 17 years ago

Updated history; comments minor code cleanup for recent changes

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