source: trunk/dll/common.c@ 1041

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

Adds optional support for delete being move to X/Eworkplace trashcan (ticket 43)

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