source: trunk/dll/common.c@ 1368

Last change on this file since 1368 was 1368, checked in by Steven Levine, 17 years ago

Avoid v1.7a compile warning

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