source: trunk/dll/common.c@ 1400

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

Remainder of changes to rename commafmt.h/c (Ticket 28, 82); Additional strings moved to PCSZs in init.c (Ticket 6); Added WriteDetailsSwitches used it and LoadDetailsSwitches to consolidate inline code (Ticket 343, 344)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.9 KB
RevLine 
[246]1
2/***********************************************************************
3
4 $Id: common.c 1400 2009-03-08 17:50:25Z gyoung $
5
6 Common window functions
7
8 Copyright (c) 1993, 1998 M. Kimes
[907]9 Copyright (c) 2001, 2008 Steven H. Levine
[246]10
11 13 Aug 05 SHL Renames
[348]12 22 Jul 06 SHL Check more run time errors
[446]13 15 Aug 06 SHL Use Dos_Error
[536]14 03 Nov 06 SHL Rework thread usage count logic
[552]15 07 Jan 07 GKY Move error strings etc. to string file
16 07 Jan 07 GKY Updated Helv font to vector font Helvetica
[574]17 22 Mar 07 GKY Use QWL_USER
[593]18 30 Mar 07 GKY Remove GetPString for window class names
[751]19 02 Aug 07 SHL Sync with CNRITEM mods
[793]20 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[809]21 26 Aug 07 SHL Change to DosSleep(0)
[985]22 29 Feb 08 GKY Use xfree where appropriate
[1041]23 06 Jul 08 GKY Update delete/undelete to include move to and open XWP trashcan
[1375]24 01 Jan 09 GKY Add option to rescan tree container on eject of removable media
[1391]25 11 Jan 09 GKY Replace font names in the string file with global set at compile in init.c
[1395]26 07 Feb 09 GKY Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error
[1400]27 08 Mar 09 GKY Additional strings move to PCSZs in init.c
[246]28
29***********************************************************************/
30
[907]31#include <stdlib.h>
32#include <string.h>
33#include <ctype.h>
34
[2]35#define INCL_DOS
36#define INCL_DOSERRORS
37#define INCL_WIN
38#define INCL_GPI
[907]39#define INCL_LONGLONG // dircnrs.h
[2]40
[1182]41#include "fm3dll.h"
[1221]42#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1205]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)
[2]52#include "fm3dlg.h"
53#include "fm3str.h"
54#include "mle.h"
[907]55#include "filldir.h" // RemoveCnrItems
56#include "errutil.h" // Dos_Error...
57#include "strutil.h" // GetPString
[1159]58#include "autoview.h" // AutoViewProc
[1182]59#include "mainwnd.h" // BuildDriveBarButtons, GetNextWindowPos, TopWindow
[1159]60#include "common.h"
61#include "dirsize.h" // DirSizeProc
62#include "info.h" // DrvInfoProc, SetDrvProc
63#include "seeall.h" // StartSeeAll
[1182]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
[1039]71#include "fortify.h"
[2]72
[1205]73// Data definitions
[2]74#pragma data_seg(DATA1)
[348]75static PSZ pszSrcFile = __FILE__;
[1205]76static HWND hwndLED;
77static HWND hwndLEDHdr;
[348]78
[1205]79#pragma data_seg(GLOBAL1)
80HWND hwndBack;
81
[551]82MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
83 HWND hwnd,
84 ULONG msg, MPARAM mp1, MPARAM mp2)
[377]85{
[574]86 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]87
[551]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);
[2]107
[551]108 case UM_CONTEXTMENU:
109 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
110 return 0;
[2]111
[551]112 case UM_CONTAINERHWND:
113 return MRFROMLONG(WinWindowFromID(hwnd, id));
[2]114
[551]115 case DM_DROP:
116 case DM_DRAGOVER:
117 case DM_DRAGLEAVE:
118 case DM_DROPHELP:
119 {
120 CNRDRAGINFO cnd;
121 USHORT dcmd;
[2]122
[551]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;
[2]136 }
[551]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 }
[2]142
[551]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;
[2]148
[551]149 case WM_MINMAXFRAME:
150 {
151 PSWP pswp = (PSWP) mp1;
152 MRESULT rc;
[2]153
[551]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 }
[2]159
[551]160 case WM_DESTROY:
161 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
162 break;
[2]163 }
[551]164 return oldproc(hwnd, msg, mp1, mp2);
[2]165}
166
[551]167MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]168{
[551]169 switch (msg) {
170 case WM_CREATE:
171 {
172 MRESULT rc;
[2]173
[551]174 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
[552]175 switch (WinQueryWindowUShort(hwnd, QWS_ID))
[551]176 case DIR_SORT:
177 case DIR_VIEW:
178 case DIR_FILTER:
[1391]179 //fixme to allow user to change presparams 1-10-09 GKY
180 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, FNT_8HELVETICA);
[551]181 return rc;
182 }
[2]183 }
[551]184 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]185}
186
[551]187void CommonTextPaint(HWND hwnd, HPS hps)
[377]188{
[2]189 int x;
[551]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 };
[2]194
[551]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);
[2]199 }
200}
201
[1400]202void CommonCreateTextChildren(HWND hwnd, PCSZ class, USHORT * ids)
[377]203{
[551]204 int x;
205 CHAR s[33];
[2]206 ULONG attrs;
[377]207 HWND hwndTmp;
[2]208
[377]209 if (!hwnd || !class || !ids) {
[1398]210 Runtime_Error(pszSrcFile, __LINE__, NULL);
[2]211 return;
[377]212 }
[2]213
[551]214 for (x = 0; ids[x]; x++) {
[2]215 *s = 0;
[551]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;
[2]230 }
[551]231 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
232 HWND_TOP, ids[x], NULL, NULL);
[377]233 if (!hwndTmp)
[1395]234 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
235 PCSZ_WINCREATEWINDOW);
[948]236 } // for
[2]237}
238
[551]239void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
[377]240{
[2]241 char dv[CCHMAXPATH];
242
[551]243 if (!drive || !*drive)
[2]244 return;
[551]245 strcpy(dv, drive);
[2]246 MakeValidDir(dv);
247
[551]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:
[552]258 strcpy(dv, drive); // Must use original drive letter
[551]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:
[1041]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 }
[551]289 break;
290 case IDM_CHKDSK:
291 runemf2(SEPARATE | WINDOWED,
[907]292 hwnd, pszSrcFile, __LINE__, NULL, NULL,
293 "PMCHKDSK.EXE %c:", toupper(*dv));
[551]294 break;
295 case IDM_OPTIMIZE:
296 {
297 CHAR FileSystem[CCHMAXPATH];
298 ULONG type;
[2]299
[551]300 CheckDrive(*dv, FileSystem, &type);
301 if (*FileSystem) {
302 strcat(FileSystem, "OPT.CMD");
303 runemf2(SEPARATE | WINDOWED,
[888]304 hwnd, pszSrcFile, __LINE__,
[551]305 NULL,
306 NULL,
307 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
[2]308 }
[551]309 }
310 break;
311 case IDM_FORMAT:
312 runemf2(SEPARATE | WINDOWED,
[907]313 hwnd, pszSrcFile, __LINE__, NULL, NULL,
314 "PMFORMAT.EXE %c:", toupper(*dv));
[551]315 break;
[2]316
[551]317#if 0 // fixme to be gone?
[446]318
[551]319 case IDM_CLOSETRAY:
320 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
[2]321
[551]322 BYTE parm[4] = { "CD01" };
[841]323 ULONGLONG dlen;
324 ULONG plen;
[551]325 HFILE hfile;
326 APIRET rc;
[2]327
[551]328 dv[2] = 0;
[844]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);
[551]338 if (rc)
[844]339 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
[551]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");
[2]349 }
[551]350 }
351 break;
[446]352#endif // fixme to be gone?
[2]353
[551]354 case IDM_LOCK:
355 case IDM_UNLOCK:
356 case IDM_EJECT:
357 {
[1368]358 UCHAR parm[2];
[551]359 ULONG plen = sizeof(parm), dlen = 0L;
[1391]360 APIRET rc;
[446]361
[551]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;
[2]372 }
[1368]373 parm[1] = *dv - 'A';
[551]374 DosError(FERR_DISABLEHARDERR);
[1391]375 rc = DosDevIOCtl(-1L, 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
[1365]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);
[551]381 }
382 break;
[2]383 }
384}
385
[551]386void CommonCreateMainChildren(HWND hwnd, SWP * swp)
[377]387{
[551]388 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
[377]389 HWND hwndTmp;
390 PFNWP oldproc;
[2]391
[377]392 // Create a children of frame window
[948]393 // Left status window
[377]394 hwndStatus = WinCreateWindow(hwndFrame,
[593]395 WC_STATUS,
[551]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);
[377]410 if (!hwndStatus)
[1395]411 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
412 PCSZ_WINCREATEWINDOW);
[377]413
[948]414 // Right status window
[377]415 hwndStatus2 = WinCreateWindow(hwndFrame,
[593]416 WC_STATUS,
[551]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);
[377]432 if (!hwndStatus2)
[1395]433 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
434 PCSZ_WINCREATEWINDOW);
[2]435
[377]436 hwndAttr = WinCreateWindow(hwndFrame,
[593]437 WC_STATUS,
[551]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);
[377]451 if (!hwndAttr)
[1395]452 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
453 PCSZ_WINCREATEWINDOW);
[377]454
455 hwndDate = WinCreateWindow(hwndFrame,
[593]456 WC_STATUS,
[551]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);
[377]470 if (!hwndDate)
[1395]471 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
472 PCSZ_WINCREATEWINDOW);
[377]473
474 hwndName = WinCreateWindow(hwndFrame,
[593]475 WC_STATUS,
[551]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);
[377]489 if (!hwndName)
[1395]490 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
491 PCSZ_WINCREATEWINDOW);
[2]492
[377]493 hwndTmp = WinCreateWindow(hwndFrame,
[593]494 WC_TOOLBACK,
[551]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);
[377]507 if (!hwndTmp)
[1395]508 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
509 PCSZ_WINCREATEWINDOW);
[377]510
511 hwndBack = WinCreateWindow(hwndFrame,
[593]512 WC_DRIVEBACK,
[551]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)) - 30,
521 swp->cx -
522 (WinQuerySysValue(HWND_DESKTOP,
523 SV_CXSIZEBORDER) * 2),
524 30,
525 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
[2]526
[377]527 if (!hwndBack)
[1395]528 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
529 PCSZ_WINCREATEWINDOW);
[377]530
531 hwndLED = WinCreateWindow(hwndFrame,
[593]532 WC_LED,
[551]533 "#920",
534 WS_VISIBLE | SS_BITMAP,
535 swp->cx - 58,
536 swp->y,
537 12,
538 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
[377]539 if (!hwndLED)
[1395]540 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
541 PCSZ_WINCREATEWINDOW);
[377]542
543 hwndLEDHdr = WinCreateWindow(hwndFrame,
[593]544 WC_LED,
[551]545 "0",
546 WS_VISIBLE | SS_TEXT | DT_VCENTER |
547 DT_CENTER,
548 swp->cx - 58,
549 swp->y + 12,
550 12,
551 12,
552 hwndFrame, HWND_TOP, MAIN_LEDHDR, NULL, NULL);
[377]553 if (!hwndLEDHdr)
[1395]554 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
555 PCSZ_WINCREATEWINDOW);
[377]556
557 hwndAutoview = WinCreateWindow(hwndFrame,
[593]558 WC_AUTOVIEW,
[551]559 NullStr,
560 WS_VISIBLE | SS_TEXT | DT_LEFT |
561 DT_TOP | DT_WORDBREAK,
562 swp->x + 4 +
563 WinQuerySysValue(HWND_DESKTOP,
564 SV_CXSIZEBORDER),
565 swp->y + 4 +
566 WinQuerySysValue(HWND_DESKTOP,
567 SV_CYSIZEBORDER) + 16,
568 (swp->cx - 8) -
569 (WinQuerySysValue(HWND_DESKTOP,
570 SV_CXSIZEBORDER) * 2),
571 48,
572 hwndFrame,
573 HWND_TOP, MAIN_AUTOVIEW, NULL, NULL);
[377]574 if (!hwndAutoview)
[1395]575 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
576 PCSZ_WINCREATEWINDOW);
[377]577
578 hwndAutoMLE = WinCreateWindow(hwndFrame,
[551]579 // GetPString(IDS_WCAUTOVIEW),
580 WC_MLE,
581 NullStr,
582 WS_VISIBLE | MLS_HSCROLL |
583 MLS_VSCROLL | MLS_BORDER,
584 swp->x + 4 +
585 WinQuerySysValue(HWND_DESKTOP,
586 SV_CXSIZEBORDER),
587 swp->y + 4 +
588 WinQuerySysValue(HWND_DESKTOP,
589 SV_CYSIZEBORDER) + 16,
590 (swp->cx - 8) -
591 (WinQuerySysValue(HWND_DESKTOP,
592 SV_CXSIZEBORDER) * 2),
593 48,
594 hwndFrame,
595 HWND_TOP, MAIN_AUTOVIEWMLE, NULL, NULL);
[377]596 if (!hwndAutoMLE)
[1395]597 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
598 PCSZ_WINCREATEWINDOW);
[2]599
[551]600 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
[574]601 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
[551]602 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
[2]603}
604
[551]605MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
606 MPARAM mp2)
[377]607{
[551]608 switch (msg) {
609 case UM_THREADUSE:
610 if (hbmLEDon && hbmLEDoff) {
611 static LONG threaduse;
612 CHAR ts[33];
[2]613
[551]614 if (mp1) {
615 threaduse++;
616 if (threaduse == 1)
617 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
618 }
619 else {
620 threaduse--;
621 if (threaduse <= 0) {
622 threaduse = 0;
623 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDoff), MPVOID);
[377]624 }
625 }
[551]626 ltoa(threaduse, ts, 10);
627 WinSetWindowText(hwndLEDHdr, ts);
[809]628 DosSleep(0);
[551]629 }
630 return 0;
[2]631
[551]632 case UM_LOADFILE:
633 {
634 CHAR *s = NULL;
635 static CHAR lastfile[CCHMAXPATH] = "";
[2]636
[551]637 if (!fAutoView) {
638 if (*lastfile)
639 PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
640 UM_LOADFILE, MPVOID, MPVOID);
641 *lastfile = 0;
642 }
643 else {
644 if (mp1) {
[1009]645 if (!mp2 && !stricmp(lastfile, (CHAR *)mp1))
[551]646 return 0;
[1009]647 strcpy(lastfile, (CHAR *)mp1);
[551]648 s = xstrdup(lastfile, pszSrcFile, __LINE__);
649 }
650 else
651 *lastfile = 0;
652 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
653 UM_LOADFILE, MPFROMP(s), MPVOID)) {
[1009]654 xfree(s, pszSrcFile, __LINE__);
[551]655 }
656 }
657 }
658 return 0;
[2]659
[551]660 case UM_BUILDDRIVEBAR:
661 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
662 MAIN_DRIVES));
663 return 0;
[2]664 }
[551]665 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]666}
667
[551]668MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
669 MPARAM mp2)
[377]670{
[551]671 static HWND hwndLast = (HWND) 0;
[2]672 static ULONG lastclick = 0;
673
[551]674 switch (msg) {
675 case WM_MOUSEMOVE:
676 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
677 if (!fNoFinger) {
678 WinSetPointer(HWND_DESKTOP, hptrFinger);
679 return MRFROMLONG(TRUE);
680 }
681 break;
[348]682
[551]683 case WM_BUTTON1DOWN:
684 case WM_BUTTON3DOWN:
685 if (hwndBubble)
686 WinDestroyWindow(hwndBubble);
687 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
688 WinSetCapture(HWND_DESKTOP, hwnd);
689 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
690 break;
[2]691
[551]692 case WM_BUTTON2UP:
693 case WM_BUTTON2DOWN:
694 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
695 if (msg == WM_BUTTON2UP && hwndLast) {
696 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
697 hwndLast = (HWND) 0;
698 }
699 break;
[2]700
[551]701 case WM_BUTTON1UP:
702 case WM_BUTTON3UP:
703 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
704 WinSetCapture(HWND_DESKTOP, (HWND) 0);
705 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
706 {
707 ULONG check;
[2]708
[551]709 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
710 if (check > lastclick + 500) {
[2]711
[551]712 RECTL rcl;
713 POINTS pts;
[2]714
[551]715 pts.x = SHORT1FROMMP(mp1);
716 pts.y = SHORT2FROMMP(mp1);
717 WinQueryWindowRect(hwnd, &rcl);
718 if (pts.x > 0 && pts.y > 0 && pts.x < rcl.xRight && pts.y < rcl.yTop)
719 PostMsg(hwnd, UM_CLICKED + (msg == WM_BUTTON3UP), mp1, mp2);
[2]720 }
[551]721 lastclick = check;
722 }
723 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
724 hwndLast = (HWND) 0;
725 break;
[2]726
[551]727 case WM_SETFOCUS:
728 if (mp2)
729 hwndLast = (HWND) mp1;
730 break;
[2]731
[551]732 case UM_FOCUSME:
733 if (mp1) {
[2]734
[551]735 PID pid;
736 TID tid;
[2]737
[551]738 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
739 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
740 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
741 return 0;
[2]742 }
[551]743 }
744 {
745 HWND htemp = (HWND) 0;
[2]746
[551]747 if (hwndMain)
748 htemp = TopWindow(hwndMain, (HWND) 0);
749 if (!htemp)
750 htemp = hwndTree;
751 if (htemp)
752 WinSetFocus(HWND_DESKTOP, htemp);
753 else
754 WinSetFocus(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
755 }
756 return 0;
[2]757 }
758
[551]759 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]760}
761
[551]762MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]763{
[574]764 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
[2]765
[551]766 switch (msg) {
767 case UM_FIXCNRMLE:
768 if (dcd) {
[2]769
[551]770 SWP swp, swpC;
[2]771
[551]772 if (WinQueryWindowPos(WinWindowFromID(hwnd, CID_MLE), &swp)) {
773 if (WinQueryWindowPos(hwnd, &swpC)) {
774 swpC.cx -= (WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL) + 4);
775 swpC.cx -= swp.x;
776 WinSetWindowPos(WinWindowFromID(hwnd, CID_MLE),
777 HWND_TOP, 0, 0, swpC.cx, swp.cy + 2, SWP_SIZE);
778 }
[2]779 }
[551]780 if (mp1)
781 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
782 MLM_SETTEXTLIMIT, mp1, MPVOID);
783 }
784 return 0;
[2]785
[551]786 case UM_FIXEDITNAME:
787 if (dcd) {
788 if (mp1 && (INT) mp1 != -1) {
[2]789
[551]790 CHAR *p;
[2]791
[551]792 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
793 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
[1009]794 0, strlen((CHAR *)mp1) + 1);
795 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *)mp1);
796 p = strrchr((CHAR *)mp1, '\\');
[551]797 if (p) {
798 p++;
[1009]799 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *)mp1));
800 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
[551]801 }
802 else
[1009]803 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
[551]804 }
805 else if (mp2) {
806 if ((INT) mp1 == -1) {
807 PCNRITEM pci = (PCNRITEM) mp2;
[751]808 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
[551]809 }
810 else {
811 Broadcast(WinQueryAnchorBlock(hwnd),
812 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
[1039]813 free(mp2);
[551]814 }
[2]815 }
[551]816 }
817 return 0;
[2]818 }
[551]819 return PFNWPCnr(hwnd, msg, mp1, mp2);
[2]820}
821
[551]822HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
823 BOOL noautotile, char *directory)
[377]824{
[551]825 SWP swp;
[2]826 HWND hwndDir;
827
[551]828 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
829 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
830 else if (*(ULONG *) realappname == FM3UL) {
831 if (!fAutoTile)
832 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
833 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
834 if (hwndDir) {
835 if (!fAutoTile)
836 WinSetWindowPos(hwndDir,
837 HWND_TOP,
838 swp.x,
839 swp.y,
840 swp.cx,
841 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
842 else if (!noautotile)
843 TileChildren(hwndParent, TRUE);
[2]844 WinSetWindowPos(hwndDir,
[551]845 HWND_TOP,
846 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
[2]847 }
848 }
849 else {
850
851 char s[256];
852
853 assign_ignores(s);
854 runemf2(WINDOWED | SEPARATE,
[888]855 hwnd, pszSrcFile, __LINE__,
[551]856 NULL,
857 NULL,
858 "VDIR.EXE %s%s\"%s%s\"",
859 (*s) ? s : NullStr, (*s) ? " " : NullStr,
860 directory,
861 (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr);
[2]862 }
863 return hwndDir;
864}
865
[536]866//= IncrThreadUsage() Increment thread usage counter ==
867
868VOID IncrThreadUsage(VOID)
869{
870 if (hwndMain)
[551]871 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
[536]872}
873
874//= DecrThreadUsage() Decrement thread usage counter ==
875
876VOID DecrThreadUsage(VOID)
877{
878 if (hwndMain)
[551]879 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
[536]880}
[793]881
882#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
883#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
884#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
885#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
886#pragma alloc_text(COMMON4,CommonCnrProc)
887#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.