source: trunk/dll/common.c@ 1182

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

Ticket 187: Draft 2: Move remaining function declarations

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