source: trunk/dll/common.c@ 348

Last change on this file since 348 was 348, checked in by root, 19 years ago

Check more run time errors

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