source: trunk/dll/common.c@ 1211

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

Ticket 187: Move datadevlarations/definitions out of fm3dll.h

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