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
Line 
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
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 30 Mar 07 GKY Remove GetPString for window class names
19
20***********************************************************************/
21
22#define INCL_DOS
23#define INCL_DOSERRORS
24#define INCL_WIN
25#define INCL_GPI
26#include <os2.h>
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>
37
38#include "fm3dll.h"
39#include "fm3dlg.h"
40#include "fm3str.h"
41#include "mle.h"
42
43#pragma data_seg(DATA1)
44
45static PSZ pszSrcFile = __FILE__;
46
47#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
48#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
49#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
50#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
51#pragma alloc_text(COMMON4,CommonCnrProc)
52#pragma alloc_text(COMMON5,OpenDirCnr)
53
54MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
55 HWND hwnd,
56 ULONG msg, MPARAM mp1, MPARAM mp2)
57{
58 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
59
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);
79
80 case UM_CONTEXTMENU:
81 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
82 return 0;
83
84 case UM_CONTAINERHWND:
85 return MRFROMLONG(WinWindowFromID(hwnd, id));
86
87 case DM_DROP:
88 case DM_DRAGOVER:
89 case DM_DRAGLEAVE:
90 case DM_DROPHELP:
91 {
92 CNRDRAGINFO cnd;
93 USHORT dcmd;
94
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;
108 }
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 }
114
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;
120
121 case WM_MINMAXFRAME:
122 {
123 PSWP pswp = (PSWP) mp1;
124 MRESULT rc;
125
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 }
131
132 case WM_DESTROY:
133 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
134 break;
135 }
136 return oldproc(hwnd, msg, mp1, mp2);
137}
138
139MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
140{
141 switch (msg) {
142 case WM_CREATE:
143 {
144 MRESULT rc;
145
146 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
147 switch (WinQueryWindowUShort(hwnd, QWS_ID))
148 case DIR_SORT:
149 case DIR_VIEW:
150 case DIR_FILTER:
151
152 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVTEXT));
153 return rc;
154 }
155 }
156 return PFNWPStatic(hwnd, msg, mp1, mp2);
157}
158
159void CommonTextPaint(HWND hwnd, HPS hps)
160{
161 int x;
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 };
166
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);
171 }
172}
173
174void CommonCreateTextChildren(HWND hwnd, char *class, USHORT * ids)
175{
176 int x;
177 CHAR s[33];
178 ULONG attrs;
179 HWND hwndTmp;
180
181 if (!hwnd || !class || !ids) {
182 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
183 return;
184 }
185
186 for (x = 0; ids[x]; x++) {
187 *s = 0;
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;
202 }
203 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
204 HWND_TOP, ids[x], NULL, NULL);
205 if (!hwndTmp)
206 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
207 } // for
208}
209
210void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
211{
212 char dv[CCHMAXPATH];
213
214 if (!drive || !*drive)
215 return;
216 strcpy(dv, drive);
217 MakeValidDir(dv);
218
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:
229 strcpy(dv, drive); // Must use original drive letter
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;
255
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));
264 }
265 }
266 break;
267 case IDM_FORMAT:
268 runemf2(SEPARATE | WINDOWED,
269 hwnd, NULL, NULL, "PMFORMAT.EXE %c:", toupper(*dv));
270 break;
271
272#if 0 // fixme to be gone?
273
274 case IDM_CLOSETRAY:
275 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
276
277 BYTE parm[4] = { "CD01" };
278 ULONG dlen, plen;
279 HFILE hfile;
280 APIRET rc;
281
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");
303 }
304 }
305 break;
306#endif // fixme to be gone?
307
308 case IDM_LOCK:
309 case IDM_UNLOCK:
310 case IDM_EJECT:
311 {
312 BYTE parm[2];
313 ULONG plen = sizeof(parm), dlen = 0L;
314
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;
325 }
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;
332 }
333}
334
335void CommonCreateMainChildren(HWND hwnd, SWP * swp)
336{
337 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
338 HWND hwndTmp;
339 PFNWP oldproc;
340
341 // Create a children of frame window
342 hwndStatus = WinCreateWindow(hwndFrame,
343 WC_STATUS,
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);
358 if (!hwndStatus)
359 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
360
361 hwndStatus2 = WinCreateWindow(hwndFrame,
362 WC_STATUS,
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);
378 if (!hwndStatus2)
379 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
380
381 hwndAttr = WinCreateWindow(hwndFrame,
382 WC_STATUS,
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);
396 if (!hwndAttr)
397 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
398
399 hwndDate = WinCreateWindow(hwndFrame,
400 WC_STATUS,
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);
414 if (!hwndDate)
415 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
416
417 hwndName = WinCreateWindow(hwndFrame,
418 WC_STATUS,
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);
432 if (!hwndName)
433 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
434
435 hwndTmp = WinCreateWindow(hwndFrame,
436 WC_TOOLBACK,
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);
449 if (!hwndTmp)
450 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
451
452 hwndBack = WinCreateWindow(hwndFrame,
453 WC_DRIVEBACK,
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);
467
468 if (!hwndBack)
469 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
470
471 hwndLED = WinCreateWindow(hwndFrame,
472 WC_LED,
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);
479 if (!hwndLED)
480 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
481
482 hwndLEDHdr = WinCreateWindow(hwndFrame,
483 WC_LED,
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);
492 if (!hwndLEDHdr)
493 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
494
495 hwndAutoview = WinCreateWindow(hwndFrame,
496 WC_AUTOVIEW,
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);
512 if (!hwndAutoview)
513 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
514
515 hwndAutoMLE = WinCreateWindow(hwndFrame,
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);
533 if (!hwndAutoMLE)
534 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
535
536 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
537 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
538 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
539}
540
541MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
542 MPARAM mp2)
543{
544 switch (msg) {
545 case UM_THREADUSE:
546 if (hbmLEDon && hbmLEDoff) {
547 static LONG threaduse;
548 CHAR ts[33];
549
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);
560 }
561 }
562 ltoa(threaduse, ts, 10);
563 WinSetWindowText(hwndLEDHdr, ts);
564 DosSleep(0);
565 }
566 return 0;
567
568 case UM_LOADFILE:
569 {
570 CHAR *s = NULL;
571 static CHAR lastfile[CCHMAXPATH] = "";
572
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;
596
597 case UM_BUILDDRIVEBAR:
598 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
599 MAIN_DRIVES));
600 return 0;
601 }
602 return WinDefWindowProc(hwnd, msg, mp1, mp2);
603}
604
605MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
606 MPARAM mp2)
607{
608 static HWND hwndLast = (HWND) 0;
609 static ULONG lastclick = 0;
610
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;
619
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;
628
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;
637
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;
645
646 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
647 if (check > lastclick + 500) {
648
649 RECTL rcl;
650 POINTS pts;
651
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);
657 }
658 lastclick = check;
659 }
660 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
661 hwndLast = (HWND) 0;
662 break;
663
664 case WM_SETFOCUS:
665 if (mp2)
666 hwndLast = (HWND) mp1;
667 break;
668
669 case UM_FOCUSME:
670 if (mp1) {
671
672 PID pid;
673 TID tid;
674
675 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
676 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
677 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
678 return 0;
679 }
680 }
681 {
682 HWND htemp = (HWND) 0;
683
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;
694 }
695
696 return PFNWPStatic(hwnd, msg, mp1, mp2);
697}
698
699MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
700{
701 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
702
703 switch (msg) {
704 case UM_FIXCNRMLE:
705 if (dcd) {
706
707 SWP swp, swpC;
708
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 }
716 }
717 if (mp1)
718 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
719 MLM_SETTEXTLIMIT, mp1, MPVOID);
720 }
721 return 0;
722
723 case UM_FIXEDITNAME:
724 if (dcd) {
725 if (mp1 && (INT) mp1 != -1) {
726
727 CHAR *p;
728
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) {
744
745 PCNRITEM pci = (PCNRITEM) mp2;
746
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 }
757 }
758 }
759 return 0;
760 }
761 return PFNWPCnr(hwnd, msg, mp1, mp2);
762}
763
764HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
765 BOOL noautotile, char *directory)
766{
767 SWP swp;
768 HWND hwndDir;
769
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);
786 WinSetWindowPos(hwndDir,
787 HWND_TOP,
788 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
789 }
790 }
791 else {
792
793 char s[256];
794
795 assign_ignores(s);
796 runemf2(WINDOWED | SEPARATE,
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);
804 }
805 return hwndDir;
806}
807
808//= IncrThreadUsage() Increment thread usage counter ==
809
810VOID IncrThreadUsage(VOID)
811{
812 if (hwndMain)
813 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
814}
815
816//= DecrThreadUsage() Decrement thread usage counter ==
817
818VOID DecrThreadUsage(VOID)
819{
820 if (hwndMain)
821 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
822}
Note: See TracBrowser for help on using the repository browser.