source: trunk/dll/common.c@ 593

Last change on this file since 593 was 593, checked in by Gregg Young, 18 years ago

Changes to remove GetPString from window class names

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