source: trunk/dll/common.c@ 1395

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

Allow user to turn off alert and/or error beeps in settings notebook. Ticket 341 Move repeated strings to PCSZs. Ticket 6 Add *DateFormat functions to format dates based on locale Ticket 28 Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error Ticket 6

  • 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 1395 2009-02-08 01:48:16Z 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
[246]27
28***********************************************************************/
29
[907]30#include <stdlib.h>
31#include <string.h>
32#include <ctype.h>
33
[2]34#define INCL_DOS
35#define INCL_DOSERRORS
36#define INCL_WIN
37#define INCL_GPI
[907]38#define INCL_LONGLONG // dircnrs.h
[2]39
[1182]40#include "fm3dll.h"
[1221]41#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1205]42#include "mainwnd2.h" // Data declaration(s)
43#include "killproc.h" // Data declaration(s)
44#include "collect.h" // Data declaration(s)
45#include "grep.h" // Data declaration(s)
46#include "dircnrs.h" // Data declaration(s)
47#include "notebook.h" // Data declaration(s)
48#include "inis.h" // Data declaration(s)
49#include "init.h" // Data declaration(s)
50#include "treecnr.h" // Data declaration(s)
[2]51#include "fm3dlg.h"
52#include "fm3str.h"
53#include "mle.h"
[907]54#include "filldir.h" // RemoveCnrItems
55#include "errutil.h" // Dos_Error...
56#include "strutil.h" // GetPString
[1159]57#include "autoview.h" // AutoViewProc
[1182]58#include "mainwnd.h" // BuildDriveBarButtons, GetNextWindowPos, TopWindow
[1159]59#include "common.h"
60#include "dirsize.h" // DirSizeProc
61#include "info.h" // DrvInfoProc, SetDrvProc
62#include "seeall.h" // StartSeeAll
[1182]63#include "misc.h" // Broadcast
64#include "valid.h" // CheckDrive
65#include "mkdir.h" // PMMkDir
66#include "presparm.h" // SetPresParams
67#include "undel.h" // UndeleteDlgProc
68#include "systemf.h" // runemf2
69#include "wrappers.h" // xfree
[1039]70#include "fortify.h"
[2]71
[1205]72// Data definitions
[2]73#pragma data_seg(DATA1)
[348]74static PSZ pszSrcFile = __FILE__;
[1205]75static HWND hwndLED;
76static HWND hwndLEDHdr;
[348]77
[1205]78#pragma data_seg(GLOBAL1)
79HWND hwndBack;
80
[551]81MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
82 HWND hwnd,
83 ULONG msg, MPARAM mp1, MPARAM mp2)
[377]84{
[574]85 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]86
[551]87 switch (msg) {
88 case UM_TIMER:
89 case UM_ACTION:
90 case UM_SHOWME:
91 case UM_OPENWINDOWFORME:
92 case UM_MINIMIZE:
93 case UM_MAXIMIZE:
94 case UM_CONTAINERDIR:
95 case UM_FILTER:
96 case UM_INITMENU:
97 case UM_COMMAND:
98 case UM_UPDATERECORD:
99 case UM_UPDATERECORDLIST:
100 case WM_COMMAND:
101 case MM_PORTHOLEINIT:
102 case WM_INITMENU:
103 case UM_CONTAINER_FILLED:
104 case UM_FILESMENU:
105 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
[2]106
[551]107 case UM_CONTEXTMENU:
108 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
109 return 0;
[2]110
[551]111 case UM_CONTAINERHWND:
112 return MRFROMLONG(WinWindowFromID(hwnd, id));
[2]113
[551]114 case DM_DROP:
115 case DM_DRAGOVER:
116 case DM_DRAGLEAVE:
117 case DM_DROPHELP:
118 {
119 CNRDRAGINFO cnd;
120 USHORT dcmd;
[2]121
[551]122 switch (msg) {
123 case DM_DROP:
124 dcmd = CN_DROP;
125 break;
126 case DM_DRAGOVER:
127 dcmd = CN_DRAGOVER;
128 break;
129 case DM_DRAGLEAVE:
130 dcmd = CN_DRAGLEAVE;
131 break;
132 case DM_DROPHELP:
133 dcmd = CN_DROPHELP;
134 break;
[2]135 }
[551]136 cnd.pDragInfo = (PDRAGINFO) mp1;
137 cnd.pRecord = NULL;
138 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),
139 WM_CONTROL, MPFROM2SHORT(id, dcmd), MPFROMP(&cnd));
140 }
[2]141
[551]142 case UM_RESCAN:
143 if (fAutoTile &&
144 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
145 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
146 return 0;
[2]147
[551]148 case WM_MINMAXFRAME:
149 {
150 PSWP pswp = (PSWP) mp1;
151 MRESULT rc;
[2]152
[551]153 rc = oldproc(hwnd, msg, mp1, mp2);
154 if (pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE))
155 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
156 return rc;
157 }
[2]158
[551]159 case WM_DESTROY:
160 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
161 break;
[2]162 }
[551]163 return oldproc(hwnd, msg, mp1, mp2);
[2]164}
165
[551]166MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]167{
[551]168 switch (msg) {
169 case WM_CREATE:
170 {
171 MRESULT rc;
[2]172
[551]173 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
[552]174 switch (WinQueryWindowUShort(hwnd, QWS_ID))
[551]175 case DIR_SORT:
176 case DIR_VIEW:
177 case DIR_FILTER:
[1391]178 //fixme to allow user to change presparams 1-10-09 GKY
179 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, FNT_8HELVETICA);
[551]180 return rc;
181 }
[2]182 }
[551]183 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]184}
185
[551]186void CommonTextPaint(HWND hwnd, HPS hps)
[377]187{
[2]188 int x;
[551]189 USHORT ids[] = { DIR_FOLDERICON, DIR_TOTALS, DIR_SELECTED, DIR_VIEW,
190 DIR_FILTER, DIR_SORT, DIR_MAX, 0
191 };
192 BOOL bools[] = { TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
[2]193
[551]194 for (x = 0; ids[x]; x++) {
195 if (WinWindowFromID(hwnd, ids[x]) != (HWND) 0)
196 PaintRecessedWindow(WinWindowFromID(hwnd, ids[x]), hps,
197 bools[x], FALSE);
[2]198 }
199}
200
[551]201void CommonCreateTextChildren(HWND hwnd, char *class, USHORT * ids)
[377]202{
[551]203 int x;
204 CHAR s[33];
[2]205 ULONG attrs;
[377]206 HWND hwndTmp;
[2]207
[377]208 if (!hwnd || !class || !ids) {
209 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
[2]210 return;
[377]211 }
[2]212
[551]213 for (x = 0; ids[x]; x++) {
[2]214 *s = 0;
[551]215 switch (ids[x]) {
216 case DIR_SORT:
217 case DIR_FILTER:
218 case DIR_VIEW:
219 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
220 break;
221 case DIR_FOLDERICON:
222 case DIR_MAX:
223 attrs = SS_BITMAP;
224 sprintf(s, "#%d", ids[x]);
225 break;
226 default:
227 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
228 break;
[2]229 }
[551]230 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
231 HWND_TOP, ids[x], NULL, NULL);
[377]232 if (!hwndTmp)
[1395]233 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
234 PCSZ_WINCREATEWINDOW);
[948]235 } // for
[2]236}
237
[551]238void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
[377]239{
[2]240 char dv[CCHMAXPATH];
241
[551]242 if (!drive || !*drive)
[2]243 return;
[551]244 strcpy(dv, drive);
[2]245 MakeValidDir(dv);
246
[551]247 switch (cmd) {
248 case IDM_MKDIR:
249 PMMkDir(hwnd, dv, FALSE);
250 break;
251 case IDM_INFO:
252 WinDlgBox(HWND_DESKTOP,
253 HWND_DESKTOP,
254 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) dv);
255 break;
256 case IDM_DRVFLAGS:
[552]257 strcpy(dv, drive); // Must use original drive letter
[551]258 if (WinDlgBox(HWND_DESKTOP,
259 hwnd,
260 SetDrvProc,
261 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
262 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
263 break;
264 case IDM_SIZES:
265 WinDlgBox(HWND_DESKTOP,
266 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv);
267 break;
268 case IDM_SHOWALLFILES:
269 StartSeeAll(HWND_DESKTOP, FALSE, dv);
270 break;
271 case IDM_UNDELETE:
[1041]272 {
273 HOBJECT hObject;
274 HWND hwndDesktop;
275
276 hObject = WinQueryObject("<XWP_TRASHCAN>");
277 if (hObject != NULLHANDLE && fTrashCan) {
278 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
279 WinSetFocus(HWND_DESKTOP, hwndDesktop);
280 WinOpenObject(hObject, 0, TRUE);
281 }
282 else
283 WinDlgBox(HWND_DESKTOP,
284 hwnd,
285 UndeleteDlgProc,
286 FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
287 }
[551]288 break;
289 case IDM_CHKDSK:
290 runemf2(SEPARATE | WINDOWED,
[907]291 hwnd, pszSrcFile, __LINE__, NULL, NULL,
292 "PMCHKDSK.EXE %c:", toupper(*dv));
[551]293 break;
294 case IDM_OPTIMIZE:
295 {
296 CHAR FileSystem[CCHMAXPATH];
297 ULONG type;
[2]298
[551]299 CheckDrive(*dv, FileSystem, &type);
300 if (*FileSystem) {
301 strcat(FileSystem, "OPT.CMD");
302 runemf2(SEPARATE | WINDOWED,
[888]303 hwnd, pszSrcFile, __LINE__,
[551]304 NULL,
305 NULL,
306 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
[2]307 }
[551]308 }
309 break;
310 case IDM_FORMAT:
311 runemf2(SEPARATE | WINDOWED,
[907]312 hwnd, pszSrcFile, __LINE__, NULL, NULL,
313 "PMFORMAT.EXE %c:", toupper(*dv));
[551]314 break;
[2]315
[551]316#if 0 // fixme to be gone?
[446]317
[551]318 case IDM_CLOSETRAY:
319 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
[2]320
[551]321 BYTE parm[4] = { "CD01" };
[841]322 ULONGLONG dlen;
323 ULONG plen;
[551]324 HFILE hfile;
325 APIRET rc;
[2]326
[551]327 dv[2] = 0;
[844]328 rc = DosOpen(dv,
329 &hfile,
330 &dlen,
331 0,
332 0,
333 OPEN_ACTION_OPEN_IF_EXISTS |
334 OPEN_ACTION_CREATE_IF_NEW,
335 OPEN_FLAGS_DASD |
336 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE, NULL);
[551]337 if (rc)
[844]338 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
[551]339 else {
340 dlen = 0;
341 plen = sizeof(parm);
342 rc = DosDevIOCtl(hfile,
343 0x80,
344 0x45, &parm, sizeof(parm), &plen, NULL, 0, &dlen);
345 DosClose(hfile);
346 if (rc)
347 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosDevIOCtl");
[2]348 }
[551]349 }
350 break;
[446]351#endif // fixme to be gone?
[2]352
[551]353 case IDM_LOCK:
354 case IDM_UNLOCK:
355 case IDM_EJECT:
356 {
[1368]357 UCHAR parm[2];
[551]358 ULONG plen = sizeof(parm), dlen = 0L;
[1391]359 APIRET rc;
[446]360
[551]361 switch (SHORT1FROMMP(cmd)) {
362 case IDM_LOCK:
363 parm[0] = 1;
364 break;
365 case IDM_UNLOCK:
366 parm[0] = 0;
367 break;
368 case IDM_EJECT:
369 parm[0] = 2;
370 break;
[2]371 }
[1368]372 parm[1] = *dv - 'A';
[551]373 DosError(FERR_DISABLEHARDERR);
[1391]374 rc = DosDevIOCtl(-1L, 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
375 DbgMsg(pszSrcFile, __LINE__, "Eject parm %i %i rc %i", parm[0], parm[1], rc);
[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.