source: trunk/dll/common.c@ 1221

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

Ticket 187: Moved typedef's and some #define's from 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 1221 2008-09-13 23:10:12Z 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 "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 BYTE 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] = (BYTE) (*dv - 'A');
368 DosError(FERR_DISABLEHARDERR);
369 DosDevIOCtl(-1L,
370 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
371 }
372 break;
373 }
374}
375
376void CommonCreateMainChildren(HWND hwnd, SWP * swp)
377{
378 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
379 HWND hwndTmp;
380 PFNWP oldproc;
381
382 // Create a children of frame window
383 // Left status window
384 hwndStatus = WinCreateWindow(hwndFrame,
385 WC_STATUS,
386 "Status",
387 WS_VISIBLE | SS_TEXT | DT_LEFT |
388 DT_VCENTER,
389 swp->x + 4 +
390 WinQuerySysValue(HWND_DESKTOP,
391 SV_CXSIZEBORDER),
392 swp->y + 4 +
393 WinQuerySysValue(HWND_DESKTOP,
394 SV_CYSIZEBORDER),
395 ((swp->cx / 2) - 8) -
396 (WinQuerySysValue(HWND_DESKTOP,
397 SV_CXSIZEBORDER) * 2),
398 20,
399 hwndFrame, HWND_TOP, MAIN_STATUS, NULL, NULL);
400 if (!hwndStatus)
401 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
402
403 // Right status window
404 hwndStatus2 = WinCreateWindow(hwndFrame,
405 WC_STATUS,
406 "Status2",
407 WS_VISIBLE | SS_TEXT | DT_LEFT |
408 DT_VCENTER,
409 ((swp->cx / 2) + 4) +
410 WinQuerySysValue(HWND_DESKTOP,
411 SV_CXSIZEBORDER),
412 ((swp->cy / 2) + 4) +
413 WinQuerySysValue(HWND_DESKTOP,
414 SV_CYSIZEBORDER),
415 ((swp->cx / 2) - 8) -
416 (WinQuerySysValue(HWND_DESKTOP,
417 SV_CXSIZEBORDER) * 2),
418 20,
419 hwndFrame,
420 HWND_TOP, MAIN_STATUS2, NULL, NULL);
421 if (!hwndStatus2)
422 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
423
424 hwndAttr = WinCreateWindow(hwndFrame,
425 WC_STATUS,
426 "Attr",
427 WS_VISIBLE | SS_TEXT | DT_CENTER |
428 DT_VCENTER,
429 swp->x + 4 +
430 WinQuerySysValue(HWND_DESKTOP,
431 SV_CXSIZEBORDER),
432 swp->y + 4 + 24 +
433 WinQuerySysValue(HWND_DESKTOP,
434 SV_CYSIZEBORDER),
435 ((swp->cx / 4) - 8) -
436 (WinQuerySysValue(HWND_DESKTOP,
437 SV_CXSIZEBORDER) * 2),
438 20, hwndFrame, HWND_TOP, IDM_ATTRS, NULL, NULL);
439 if (!hwndAttr)
440 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
441
442 hwndDate = WinCreateWindow(hwndFrame,
443 WC_STATUS,
444 "Date",
445 WS_VISIBLE | SS_TEXT | DT_CENTER |
446 DT_VCENTER,
447 ((swp->x / 4) * 2) + 4 +
448 WinQuerySysValue(HWND_DESKTOP,
449 SV_CXSIZEBORDER),
450 swp->y + 4 + 24 +
451 WinQuerySysValue(HWND_DESKTOP,
452 SV_CYSIZEBORDER),
453 ((swp->cx / 4) - 8) -
454 (WinQuerySysValue(HWND_DESKTOP,
455 SV_CXSIZEBORDER) * 2),
456 20, hwndFrame, HWND_TOP, IDM_INFO, NULL, NULL);
457 if (!hwndDate)
458 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
459
460 hwndName = WinCreateWindow(hwndFrame,
461 WC_STATUS,
462 "Name",
463 WS_VISIBLE | SS_TEXT | DT_LEFT |
464 DT_VCENTER,
465 ((swp->x / 4) * 3) + 4 +
466 WinQuerySysValue(HWND_DESKTOP,
467 SV_CXSIZEBORDER),
468 swp->y + 4 +
469 WinQuerySysValue(HWND_DESKTOP,
470 SV_CYSIZEBORDER),
471 ((swp->cx / 4) - 8) -
472 (WinQuerySysValue(HWND_DESKTOP,
473 SV_CXSIZEBORDER) * 2),
474 20, hwndFrame, HWND_TOP, IDM_RENAME, NULL, NULL);
475 if (!hwndName)
476 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
477
478 hwndTmp = WinCreateWindow(hwndFrame,
479 WC_TOOLBACK,
480 NullStr,
481 WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER,
482 swp->x +
483 WinQuerySysValue(HWND_DESKTOP,
484 SV_CXSIZEBORDER),
485 (swp->cy -
486 WinQuerySysValue(HWND_DESKTOP,
487 SV_CYSIZEBORDER)) - 30,
488 swp->cx -
489 (WinQuerySysValue(HWND_DESKTOP,
490 SV_CXSIZEBORDER) * 2),
491 30, hwndFrame, HWND_TOP, MAIN_TOOLS, NULL, NULL);
492 if (!hwndTmp)
493 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
494
495 hwndBack = WinCreateWindow(hwndFrame,
496 WC_DRIVEBACK,
497 NullStr,
498 WS_VISIBLE | SS_TEXT | DT_RIGHT | DT_BOTTOM,
499 swp->x +
500 WinQuerySysValue(HWND_DESKTOP,
501 SV_CXSIZEBORDER),
502 (swp->cy -
503 WinQuerySysValue(HWND_DESKTOP,
504 SV_CYSIZEBORDER)) - 30,
505 swp->cx -
506 (WinQuerySysValue(HWND_DESKTOP,
507 SV_CXSIZEBORDER) * 2),
508 30,
509 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
510
511 if (!hwndBack)
512 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
513
514 hwndLED = WinCreateWindow(hwndFrame,
515 WC_LED,
516 "#920",
517 WS_VISIBLE | SS_BITMAP,
518 swp->cx - 58,
519 swp->y,
520 12,
521 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
522 if (!hwndLED)
523 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
524
525 hwndLEDHdr = WinCreateWindow(hwndFrame,
526 WC_LED,
527 "0",
528 WS_VISIBLE | SS_TEXT | DT_VCENTER |
529 DT_CENTER,
530 swp->cx - 58,
531 swp->y + 12,
532 12,
533 12,
534 hwndFrame, HWND_TOP, MAIN_LEDHDR, NULL, NULL);
535 if (!hwndLEDHdr)
536 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
537
538 hwndAutoview = WinCreateWindow(hwndFrame,
539 WC_AUTOVIEW,
540 NullStr,
541 WS_VISIBLE | SS_TEXT | DT_LEFT |
542 DT_TOP | DT_WORDBREAK,
543 swp->x + 4 +
544 WinQuerySysValue(HWND_DESKTOP,
545 SV_CXSIZEBORDER),
546 swp->y + 4 +
547 WinQuerySysValue(HWND_DESKTOP,
548 SV_CYSIZEBORDER) + 16,
549 (swp->cx - 8) -
550 (WinQuerySysValue(HWND_DESKTOP,
551 SV_CXSIZEBORDER) * 2),
552 48,
553 hwndFrame,
554 HWND_TOP, MAIN_AUTOVIEW, NULL, NULL);
555 if (!hwndAutoview)
556 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
557
558 hwndAutoMLE = WinCreateWindow(hwndFrame,
559 // GetPString(IDS_WCAUTOVIEW),
560 WC_MLE,
561 NullStr,
562 WS_VISIBLE | MLS_HSCROLL |
563 MLS_VSCROLL | MLS_BORDER,
564 swp->x + 4 +
565 WinQuerySysValue(HWND_DESKTOP,
566 SV_CXSIZEBORDER),
567 swp->y + 4 +
568 WinQuerySysValue(HWND_DESKTOP,
569 SV_CYSIZEBORDER) + 16,
570 (swp->cx - 8) -
571 (WinQuerySysValue(HWND_DESKTOP,
572 SV_CXSIZEBORDER) * 2),
573 48,
574 hwndFrame,
575 HWND_TOP, MAIN_AUTOVIEWMLE, NULL, NULL);
576 if (!hwndAutoMLE)
577 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
578
579 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
580 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
581 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
582}
583
584MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
585 MPARAM mp2)
586{
587 switch (msg) {
588 case UM_THREADUSE:
589 if (hbmLEDon && hbmLEDoff) {
590 static LONG threaduse;
591 CHAR ts[33];
592
593 if (mp1) {
594 threaduse++;
595 if (threaduse == 1)
596 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
597 }
598 else {
599 threaduse--;
600 if (threaduse <= 0) {
601 threaduse = 0;
602 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDoff), MPVOID);
603 }
604 }
605 ltoa(threaduse, ts, 10);
606 WinSetWindowText(hwndLEDHdr, ts);
607 DosSleep(0);
608 }
609 return 0;
610
611 case UM_LOADFILE:
612 {
613 CHAR *s = NULL;
614 static CHAR lastfile[CCHMAXPATH] = "";
615
616 if (!fAutoView) {
617 if (*lastfile)
618 PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
619 UM_LOADFILE, MPVOID, MPVOID);
620 *lastfile = 0;
621 }
622 else {
623 if (mp1) {
624 if (!mp2 && !stricmp(lastfile, (CHAR *)mp1))
625 return 0;
626 strcpy(lastfile, (CHAR *)mp1);
627 s = xstrdup(lastfile, pszSrcFile, __LINE__);
628 }
629 else
630 *lastfile = 0;
631 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
632 UM_LOADFILE, MPFROMP(s), MPVOID)) {
633 xfree(s, pszSrcFile, __LINE__);
634 }
635 }
636 }
637 return 0;
638
639 case UM_BUILDDRIVEBAR:
640 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
641 MAIN_DRIVES));
642 return 0;
643 }
644 return WinDefWindowProc(hwnd, msg, mp1, mp2);
645}
646
647MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
648 MPARAM mp2)
649{
650 static HWND hwndLast = (HWND) 0;
651 static ULONG lastclick = 0;
652
653 switch (msg) {
654 case WM_MOUSEMOVE:
655 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
656 if (!fNoFinger) {
657 WinSetPointer(HWND_DESKTOP, hptrFinger);
658 return MRFROMLONG(TRUE);
659 }
660 break;
661
662 case WM_BUTTON1DOWN:
663 case WM_BUTTON3DOWN:
664 if (hwndBubble)
665 WinDestroyWindow(hwndBubble);
666 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
667 WinSetCapture(HWND_DESKTOP, hwnd);
668 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
669 break;
670
671 case WM_BUTTON2UP:
672 case WM_BUTTON2DOWN:
673 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
674 if (msg == WM_BUTTON2UP && hwndLast) {
675 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
676 hwndLast = (HWND) 0;
677 }
678 break;
679
680 case WM_BUTTON1UP:
681 case WM_BUTTON3UP:
682 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
683 WinSetCapture(HWND_DESKTOP, (HWND) 0);
684 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
685 {
686 ULONG check;
687
688 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
689 if (check > lastclick + 500) {
690
691 RECTL rcl;
692 POINTS pts;
693
694 pts.x = SHORT1FROMMP(mp1);
695 pts.y = SHORT2FROMMP(mp1);
696 WinQueryWindowRect(hwnd, &rcl);
697 if (pts.x > 0 && pts.y > 0 && pts.x < rcl.xRight && pts.y < rcl.yTop)
698 PostMsg(hwnd, UM_CLICKED + (msg == WM_BUTTON3UP), mp1, mp2);
699 }
700 lastclick = check;
701 }
702 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
703 hwndLast = (HWND) 0;
704 break;
705
706 case WM_SETFOCUS:
707 if (mp2)
708 hwndLast = (HWND) mp1;
709 break;
710
711 case UM_FOCUSME:
712 if (mp1) {
713
714 PID pid;
715 TID tid;
716
717 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
718 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
719 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
720 return 0;
721 }
722 }
723 {
724 HWND htemp = (HWND) 0;
725
726 if (hwndMain)
727 htemp = TopWindow(hwndMain, (HWND) 0);
728 if (!htemp)
729 htemp = hwndTree;
730 if (htemp)
731 WinSetFocus(HWND_DESKTOP, htemp);
732 else
733 WinSetFocus(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
734 }
735 return 0;
736 }
737
738 return PFNWPStatic(hwnd, msg, mp1, mp2);
739}
740
741MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
742{
743 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
744
745 switch (msg) {
746 case UM_FIXCNRMLE:
747 if (dcd) {
748
749 SWP swp, swpC;
750
751 if (WinQueryWindowPos(WinWindowFromID(hwnd, CID_MLE), &swp)) {
752 if (WinQueryWindowPos(hwnd, &swpC)) {
753 swpC.cx -= (WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL) + 4);
754 swpC.cx -= swp.x;
755 WinSetWindowPos(WinWindowFromID(hwnd, CID_MLE),
756 HWND_TOP, 0, 0, swpC.cx, swp.cy + 2, SWP_SIZE);
757 }
758 }
759 if (mp1)
760 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
761 MLM_SETTEXTLIMIT, mp1, MPVOID);
762 }
763 return 0;
764
765 case UM_FIXEDITNAME:
766 if (dcd) {
767 if (mp1 && (INT) mp1 != -1) {
768
769 CHAR *p;
770
771 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
772 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
773 0, strlen((CHAR *)mp1) + 1);
774 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *)mp1);
775 p = strrchr((CHAR *)mp1, '\\');
776 if (p) {
777 p++;
778 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *)mp1));
779 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
780 }
781 else
782 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
783 }
784 else if (mp2) {
785 if ((INT) mp1 == -1) {
786 PCNRITEM pci = (PCNRITEM) mp2;
787 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
788 }
789 else {
790 Broadcast(WinQueryAnchorBlock(hwnd),
791 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
792 free(mp2);
793 }
794 }
795 }
796 return 0;
797 }
798 return PFNWPCnr(hwnd, msg, mp1, mp2);
799}
800
801HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
802 BOOL noautotile, char *directory)
803{
804 SWP swp;
805 HWND hwndDir;
806
807 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
808 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
809 else if (*(ULONG *) realappname == FM3UL) {
810 if (!fAutoTile)
811 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
812 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
813 if (hwndDir) {
814 if (!fAutoTile)
815 WinSetWindowPos(hwndDir,
816 HWND_TOP,
817 swp.x,
818 swp.y,
819 swp.cx,
820 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
821 else if (!noautotile)
822 TileChildren(hwndParent, TRUE);
823 WinSetWindowPos(hwndDir,
824 HWND_TOP,
825 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
826 }
827 }
828 else {
829
830 char s[256];
831
832 assign_ignores(s);
833 runemf2(WINDOWED | SEPARATE,
834 hwnd, pszSrcFile, __LINE__,
835 NULL,
836 NULL,
837 "VDIR.EXE %s%s\"%s%s\"",
838 (*s) ? s : NullStr, (*s) ? " " : NullStr,
839 directory,
840 (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr);
841 }
842 return hwndDir;
843}
844
845//= IncrThreadUsage() Increment thread usage counter ==
846
847VOID IncrThreadUsage(VOID)
848{
849 if (hwndMain)
850 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
851}
852
853//= DecrThreadUsage() Decrement thread usage counter ==
854
855VOID DecrThreadUsage(VOID)
856{
857 if (hwndMain)
858 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
859}
860
861#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
862#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
863#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
864#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
865#pragma alloc_text(COMMON4,CommonCnrProc)
866#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.