source: trunk/dll/common.c@ 1391

Last change on this file since 1391 was 1391, checked in by Gregg Young, 17 years ago

Move nontranslated strings to init.c and codepage.c; use those strings in place of GetPString calls. Move other strings to a StringTable; minor cleanup and code changes to codepage.c to use a string array instead of GetPString calls. Ticket 340

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