source: trunk/dll/common.c@ 1205

Last change on this file since 1205 was 1205, checked in by John Small, 17 years ago

Ticket 187: Move datadevlarations/definitions out of fm3dll.h

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