source: trunk/dll/common.c@ 1368

Last change on this file since 1368 was 1368, checked in by Steven Levine, 17 years ago

Avoid v1.7a compile warning

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