source: trunk/dll/common.c@ 959

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

Use xfree where appropriate. Check that buffer exists following all xmallocs. Stopped at eas.c with xfree checking. One remaining xmalloc without test in dirsize.c

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