source: trunk/dll/common.c@ 1182

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

Ticket 187: Draft 2: Move remaining function declarations

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