source: trunk/dll/common.c@ 1391

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

Move nontranslated strings to init.c and codepage.c; use those strings in place of GetPString calls. Move other strings to a StringTable; minor cleanup and code changes to codepage.c to use a string array instead of GetPString calls. Ticket 340

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