source: trunk/dll/common.c@ 1159

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

Ticket 187: Draft 1: Functions only

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