source: trunk/dll/common.c@ 574

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

Use QWL_USER; Replace doesn't move the command and Okay on cmd dialog removed error on unchanged command

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