source: trunk/dll/common.c@ 1375

Last change on this file since 1375 was 1375, checked in by Gregg Young, 17 years ago

Updated history; comments minor code cleanup for recent changes

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