source: trunk/dll/common.c@ 1159

Last change on this file since 1159 was 1159, checked in by John Small, 17 years ago

Ticket 187: Draft 1: Functions only

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