source: trunk/dll/common.c@ 751

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

Sync rest of code with CNRITEM mods
Sync code with ARCITEM mods
Get compare dialog working
Still some issues with status display
Still some issues with directory sizes tree display
Heap check diagnostic code mostly enabled

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