source: trunk/dll/common.c@ 907

Last change on this file since 907 was 907, checked in by Steven Levine, 18 years ago

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

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