source: trunk/dll/common.c@ 1438

Last change on this file since 1438 was 1438, checked in by Gregg Young, 16 years ago

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

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