source: trunk/dll/common.c@ 377

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

Validate WinCreateWindow

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.0 KB
Line 
1
2/***********************************************************************
3
4 $Id: common.c 377 2006-07-27 06:28:31Z 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 HWND hwndTmp;
195
196 if (!hwnd || !class || !ids) {
197 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
198 return;
199 }
200
201 for(x = 0;ids[x];x++) {
202 *s = 0;
203 switch(ids[x]) {
204 case DIR_SORT:
205 case DIR_FILTER:
206 case DIR_VIEW:
207 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
208 break;
209 case DIR_FOLDERICON:
210 case DIR_MAX:
211 attrs = SS_BITMAP;
212 sprintf(s,"#%d",ids[x]);
213 break;
214 default:
215 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
216 break;
217 }
218 hwndTmp = WinCreateWindow(hwnd,class,s,attrs,0,0,0,0,hwnd,
219 HWND_TOP,ids[x],NULL,NULL);
220 if (!hwndTmp)
221 Win_Error2(hwnd,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
222 } // for
223}
224
225
226void CommonDriveCmd (HWND hwnd,char *drive,USHORT cmd)
227{
228 char dv[CCHMAXPATH];
229
230 if(!drive || !*drive)
231 return;
232 strcpy(dv,drive);
233 MakeValidDir(dv);
234
235 switch(cmd) {
236 case IDM_MKDIR:
237 PMMkDir(hwnd,
238 dv,
239 FALSE);
240 break;
241 case IDM_INFO:
242 WinDlgBox(HWND_DESKTOP,
243 HWND_DESKTOP,
244 DrvInfoProc,
245 FM3ModHandle,
246 INFO_FRAME,
247 (PVOID)dv);
248 break;
249 case IDM_DRVFLAGS:
250 if(WinDlgBox(HWND_DESKTOP,
251 hwnd,
252 SetDrvProc,
253 FM3ModHandle,
254 DVS_FRAME,
255 MPFROMP(dv)) &&
256 hwndTree)
257 PostMsg(hwndTree,
258 WM_COMMAND,
259 MPFROM2SHORT(IDM_UPDATE,0),
260 MPVOID);
261 break;
262 case IDM_SIZES:
263 WinDlgBox(HWND_DESKTOP,
264 HWND_DESKTOP,
265 DirSizeProc,
266 FM3ModHandle,
267 DSZ_FRAME,
268 dv);
269 break;
270 case IDM_SHOWALLFILES:
271 StartSeeAll(HWND_DESKTOP,
272 FALSE,
273 dv);
274 break;
275 case IDM_UNDELETE:
276 WinDlgBox(HWND_DESKTOP,
277 hwnd,
278 UndeleteDlgProc,
279 FM3ModHandle,
280 UNDEL_FRAME,
281 MPFROMP(dv));
282 break;
283 case IDM_CHKDSK:
284 runemf2(SEPARATE | WINDOWED,
285 hwnd,
286 NULL,
287 NULL,
288 "PMCHKDSK.EXE %c:",
289 toupper(*dv));
290 break;
291 case IDM_OPTIMIZE:
292 {
293 CHAR FileSystem[CCHMAXPATH];
294 ULONG type;
295
296 CheckDrive(*dv,FileSystem,&type);
297 if(*FileSystem) {
298 strcat(FileSystem,"OPT.CMD");
299 runemf2(SEPARATE | WINDOWED,
300 hwnd,
301 NULL,
302 NULL,
303 "%s /C %s %c:",
304 GetCmdSpec(FALSE),
305 FileSystem,
306 toupper(*dv));
307 }
308 }
309 break;
310 case IDM_FORMAT:
311 runemf2(SEPARATE | WINDOWED,
312 hwnd,
313 NULL,
314 NULL,
315 "PMFORMAT.EXE %c:",
316 toupper(*dv));
317 break;
318
319/*
320 case IDM_CLOSETRAY:
321 if(driveflags[*dv - 'A'] & DRIVE_CDROM) {
322
323 BYTE parm[4] = {"CD01"};
324 ULONG dlen,plen;
325 HFILE hfile;
326 APIRET rc;
327
328 dv[2] = 0;
329 rc = DosOpen(dv,
330 &hfile,
331 &dlen,
332 0,
333 0,
334 OPEN_ACTION_OPEN_IF_EXISTS |
335 OPEN_ACTION_CREATE_IF_NEW,
336 OPEN_FLAGS_DASD |
337 OPEN_FLAGS_FAIL_ON_ERROR |
338 OPEN_SHARE_DENYNONE,
339 NULL);
340 if(!rc) {
341 dlen = 0;
342 plen = sizeof(parm);
343 rc = DosDevIOCtl(hfile,
344 0x80,
345 0x45,
346 &parm,
347 sizeof(parm),
348 &plen,
349 NULL,
350 0,
351 &dlen);
352 DosClose(hfile);
353 if(rc)
354 saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"rc2 = %lu",rc);
355 }
356 else
357 saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"rc = %lu",rc);
358 }
359 break;
360*/
361
362 case IDM_LOCK:
363 case IDM_UNLOCK:
364 case IDM_EJECT:
365 {
366 BYTE parm[2];
367 ULONG plen = sizeof(parm),dlen = 0L;
368
369 switch(SHORT1FROMMP(cmd)) {
370 case IDM_LOCK:
371 parm[0] = 1;
372 break;
373 case IDM_UNLOCK:
374 parm[0] = 0;
375 break;
376 case IDM_EJECT:
377 parm[0] = 2;
378 break;
379 }
380 parm[1] = (BYTE)(*dv - 'A');
381 DosError(FERR_DISABLEHARDERR);
382 DosDevIOCtl(-1L,
383 8L,
384 0x40L,
385 &parm,
386 sizeof(parm),
387 &plen,
388 NULL,
389 0L,
390 &dlen);
391 }
392 break;
393 }
394}
395
396
397void CommonCreateMainChildren (HWND hwnd,SWP *swp)
398{
399 HWND hwndFrame = WinQueryWindow(hwnd,QW_PARENT);
400 HWND hwndTmp;
401 PFNWP oldproc;
402
403 // Create a children of frame window
404 hwndStatus = WinCreateWindow(hwndFrame,
405 GetPString(IDS_WCSTATUS),
406 "Status",
407 WS_VISIBLE | SS_TEXT | DT_LEFT |
408 DT_VCENTER,
409 swp->x + 4 +
410 WinQuerySysValue(HWND_DESKTOP,
411 SV_CXSIZEBORDER),
412 swp->y + 4 +
413 WinQuerySysValue(HWND_DESKTOP,
414 SV_CYSIZEBORDER),
415 ((swp->cx / 2) - 8) -
416 (WinQuerySysValue(HWND_DESKTOP,
417 SV_CXSIZEBORDER) * 2),
418 20,
419 hwndFrame,
420 HWND_TOP,
421 MAIN_STATUS,
422 NULL,
423 NULL);
424 if (!hwndStatus)
425 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
426
427 hwndStatus2 = WinCreateWindow(hwndFrame,
428 GetPString(IDS_WCSTATUS),
429 "Status2",
430 WS_VISIBLE | SS_TEXT | DT_LEFT |
431 DT_VCENTER,
432 ((swp->cx / 2) + 4) +
433 WinQuerySysValue(HWND_DESKTOP,
434 SV_CXSIZEBORDER),
435 ((swp->cy / 2) + 4) +
436 WinQuerySysValue(HWND_DESKTOP,
437 SV_CYSIZEBORDER),
438 ((swp->cx / 2) - 8) -
439 (WinQuerySysValue(HWND_DESKTOP,
440 SV_CXSIZEBORDER) * 2),
441 20,
442 hwndFrame,
443 HWND_TOP,
444 MAIN_STATUS2,
445 NULL,
446 NULL);
447 if (!hwndStatus2)
448 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
449
450 hwndAttr = WinCreateWindow(hwndFrame,
451 GetPString(IDS_WCSTATUS),
452 "Attr",
453 WS_VISIBLE | SS_TEXT | DT_CENTER |
454 DT_VCENTER,
455 swp->x + 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,
465 hwndFrame,
466 HWND_TOP,
467 IDM_ATTRS,
468 NULL,
469 NULL);
470 if (!hwndAttr)
471 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
472
473 hwndDate = WinCreateWindow(hwndFrame,
474 GetPString(IDS_WCSTATUS),
475 "Date",
476 WS_VISIBLE | SS_TEXT | DT_CENTER |
477 DT_VCENTER,
478 ((swp->x / 4) * 2) + 4 +
479 WinQuerySysValue(HWND_DESKTOP,
480 SV_CXSIZEBORDER),
481 swp->y + 4 + 24 +
482 WinQuerySysValue(HWND_DESKTOP,
483 SV_CYSIZEBORDER),
484 ((swp->cx / 4) - 8) -
485 (WinQuerySysValue(HWND_DESKTOP,
486 SV_CXSIZEBORDER) * 2),
487 20,
488 hwndFrame,
489 HWND_TOP,
490 IDM_INFO,
491 NULL,
492 NULL);
493 if (!hwndDate)
494 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
495
496 hwndName = WinCreateWindow(hwndFrame,
497 GetPString(IDS_WCSTATUS),
498 "Name",
499 WS_VISIBLE | SS_TEXT | DT_LEFT |
500 DT_VCENTER,
501 ((swp->x / 4) * 3) + 4 +
502 WinQuerySysValue(HWND_DESKTOP,
503 SV_CXSIZEBORDER),
504 swp->y + 4 +
505 WinQuerySysValue(HWND_DESKTOP,
506 SV_CYSIZEBORDER),
507 ((swp->cx / 4) - 8) -
508 (WinQuerySysValue(HWND_DESKTOP,
509 SV_CXSIZEBORDER) * 2),
510 20,
511 hwndFrame,
512 HWND_TOP,
513 IDM_RENAME,
514 NULL,
515 NULL);
516 if (!hwndName)
517 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
518
519 hwndTmp = WinCreateWindow(hwndFrame,
520 GetPString(IDS_WCTOOLBACK),
521 NullStr,
522 WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER,
523 swp->x +
524 WinQuerySysValue(HWND_DESKTOP,
525 SV_CXSIZEBORDER),
526 (swp->cy -
527 WinQuerySysValue(HWND_DESKTOP,
528 SV_CYSIZEBORDER)) - 30,
529 swp->cx -
530 (WinQuerySysValue(HWND_DESKTOP,
531 SV_CXSIZEBORDER) * 2),
532 30,
533 hwndFrame,
534 HWND_TOP,
535 MAIN_TOOLS,
536 NULL,
537 NULL);
538 if (!hwndTmp)
539 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
540
541 hwndBack = WinCreateWindow(hwndFrame,
542 GetPString(IDS_WCDRIVEBACK),
543 NullStr,
544 WS_VISIBLE | SS_TEXT | DT_RIGHT | DT_BOTTOM,
545 swp->x +
546 WinQuerySysValue(HWND_DESKTOP,
547 SV_CXSIZEBORDER),
548 (swp->cy -
549 WinQuerySysValue(HWND_DESKTOP,
550 SV_CYSIZEBORDER)) - 30,
551 swp->cx -
552 (WinQuerySysValue(HWND_DESKTOP,
553 SV_CXSIZEBORDER) * 2),
554 30,
555 hwndFrame,
556 HWND_TOP,
557 MAIN_DRIVES,
558 NULL,
559 NULL);
560
561 if (!hwndBack)
562 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
563
564 hwndLED = WinCreateWindow(hwndFrame,
565 GetPString(IDS_WCLED),
566 "#920",
567 WS_VISIBLE | SS_BITMAP,
568 swp->cx - 58,
569 swp->y,
570 12,
571 12,
572 hwndFrame,
573 HWND_TOP,
574 MAIN_LED,
575 NULL,
576 NULL);
577 if (!hwndLED)
578 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
579
580 hwndLEDHdr = WinCreateWindow(hwndFrame,
581 GetPString(IDS_WCLED),
582 "0",
583 WS_VISIBLE | SS_TEXT | DT_VCENTER |
584 DT_CENTER,
585 swp->cx - 58,
586 swp->y + 12,
587 12,
588 12,
589 hwndFrame,
590 HWND_TOP,
591 MAIN_LEDHDR,
592 NULL,
593 NULL);
594 if (!hwndLEDHdr)
595 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
596
597 hwndAutoview = WinCreateWindow(hwndFrame,
598 GetPString(IDS_WCAUTOVIEW),
599 NullStr,
600 WS_VISIBLE | SS_TEXT | DT_LEFT |
601 DT_TOP | DT_WORDBREAK,
602 swp->x + 4 +
603 WinQuerySysValue(HWND_DESKTOP,
604 SV_CXSIZEBORDER),
605 swp->y + 4 +
606 WinQuerySysValue(HWND_DESKTOP,
607 SV_CYSIZEBORDER) + 16,
608 (swp->cx - 8) -
609 (WinQuerySysValue(HWND_DESKTOP,
610 SV_CXSIZEBORDER) * 2),
611 48,
612 hwndFrame,
613 HWND_TOP,
614 MAIN_AUTOVIEW,
615 NULL,
616 NULL);
617 if (!hwndAutoview)
618 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
619
620 hwndAutoMLE = WinCreateWindow(hwndFrame,
621 // GetPString(IDS_WCAUTOVIEW),
622 WC_MLE,
623 NullStr,
624 WS_VISIBLE | MLS_HSCROLL |
625 MLS_VSCROLL | MLS_BORDER,
626 swp->x + 4 +
627 WinQuerySysValue(HWND_DESKTOP,
628 SV_CXSIZEBORDER),
629 swp->y + 4 +
630 WinQuerySysValue(HWND_DESKTOP,
631 SV_CYSIZEBORDER) + 16,
632 (swp->cx - 8) -
633 (WinQuerySysValue(HWND_DESKTOP,
634 SV_CXSIZEBORDER) * 2),
635 48,
636 hwndFrame,
637 HWND_TOP,
638 MAIN_AUTOVIEWMLE,
639 NULL,
640 NULL);
641 if (!hwndAutoMLE)
642 Win_Error2(hwndFrame,hwnd,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW);
643
644 oldproc = WinSubclassWindow(hwndAutoMLE,AutoViewProc);
645 WinSetWindowPtr(hwndAutoMLE,0,(PVOID)oldproc);
646 PostMsg(hwndAutoMLE,UM_SETUP,MPVOID,MPVOID);
647}
648
649MRESULT EXPENTRY CommonMainWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
650{
651 switch(msg) {
652 case UM_THREADUSE:
653 if (hbmLEDon && hbmLEDoff) {
654 static LONG threaduse = 0;
655 CHAR ts[33];
656
657 if(mp1) {
658 threaduse++;
659 if (threaduse == 1)
660 WinSendMsg(hwndLED,
661 SM_SETHANDLE,
662 MPFROMLONG(hbmLEDon),
663 MPVOID);
664 }
665 else {
666 threaduse--;
667 if(threaduse <= 0) {
668 threaduse = 0;
669 WinSendMsg(hwndLED,
670 SM_SETHANDLE,
671 MPFROMLONG(hbmLEDoff),
672 MPVOID);
673 }
674 }
675 ltoa(threaduse,
676 ts,
677 10);
678 WinSetWindowText(hwndLEDHdr,
679 ts);
680 }
681 return 0;
682
683 case UM_LOADFILE:
684 {
685 CHAR *s = NULL;
686 static CHAR lastfile[CCHMAXPATH] = "";
687
688 if(!fAutoView) {
689 if(*lastfile)
690 PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
691 UM_LOADFILE,
692 MPVOID,
693 MPVOID);
694 *lastfile = 0;
695 }
696 else {
697 if(mp1) {
698 if(!mp2 && !stricmp(lastfile,(CHAR *)mp1))
699 return 0;
700 strcpy(lastfile,(CHAR *)mp1);
701 s = xstrdup(lastfile,pszSrcFile,__LINE__);
702 }
703 else
704 *lastfile = 0;
705 if(!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
706 UM_LOADFILE,
707 MPFROMP(s),
708 MPVOID)) {
709 if(s)
710 free(s);
711 }
712 }
713 }
714 return 0;
715
716 case UM_BUILDDRIVEBAR:
717 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
718 MAIN_DRIVES));
719 return 0;
720 }
721 return WinDefWindowProc(hwnd,msg,mp1,mp2);
722}
723
724
725MRESULT EXPENTRY CommonTextButton (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
726{
727 static HWND hwndLast = (HWND)0;
728 static ULONG lastclick = 0;
729
730 switch(msg) {
731 case WM_MOUSEMOVE:
732 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
733 if(!fNoFinger) {
734 WinSetPointer(HWND_DESKTOP,hptrFinger);
735 return MRFROMLONG(TRUE);
736 }
737 break;
738
739 case WM_BUTTON1DOWN:
740 case WM_BUTTON3DOWN:
741 if(hwndBubble)
742 WinDestroyWindow(hwndBubble);
743 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
744 WinSetCapture(HWND_DESKTOP,hwnd);
745 PaintRecessedWindow(hwnd,(HPS)0,FALSE,FALSE);
746 break;
747
748 case WM_BUTTON2UP:
749 case WM_BUTTON2DOWN:
750 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
751 if(msg == WM_BUTTON2UP && hwndLast) {
752 PostMsg(hwnd,
753 UM_FOCUSME,
754 MPFROMP(hwndLast),
755 MPVOID);
756 hwndLast = (HWND)0;
757 }
758 break;
759
760 case WM_BUTTON1UP:
761 case WM_BUTTON3UP:
762 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
763 WinSetCapture(HWND_DESKTOP,
764 (HWND)0);
765 PaintRecessedWindow(hwnd,
766 (HPS)0,
767 TRUE,
768 FALSE);
769 {
770 ULONG check;
771
772 DosQuerySysInfo(QSV_MS_COUNT,
773 QSV_MS_COUNT,
774 &check,
775 sizeof(check));
776 if(check > lastclick + 500) {
777
778 RECTL rcl;
779 POINTS pts;
780
781 pts.x = SHORT1FROMMP(mp1);
782 pts.y = SHORT2FROMMP(mp1);
783 WinQueryWindowRect(hwnd,&rcl);
784 if(pts.x > 0 &&
785 pts.y > 0 &&
786 pts.x < rcl.xRight &&
787 pts.y < rcl.yTop)
788 PostMsg(hwnd,
789 UM_CLICKED + (msg == WM_BUTTON3UP),
790 mp1,
791 mp2);
792 }
793 lastclick = check;
794 }
795 PostMsg(hwnd,
796 UM_FOCUSME,
797 MPFROMP(hwndLast),
798 MPVOID);
799 hwndLast = (HWND)0;
800 break;
801
802 case WM_SETFOCUS:
803 if(mp2)
804 hwndLast = (HWND)mp1;
805 break;
806
807 case UM_FOCUSME:
808 if(mp1) {
809
810 PID pid;
811 TID tid;
812
813 if(WinIsWindow(WinQueryAnchorBlock(hwnd),(HWND)mp1) &&
814 WinQueryWindowProcess((HWND)mp1,&pid,&tid) &&
815 pid == mypid) {
816 WinSetFocus(HWND_DESKTOP,
817 (HWND)mp1);
818 return 0;
819 }
820 }
821 {
822 HWND htemp = (HWND)0;
823
824 if(hwndMain)
825 htemp = TopWindow(hwndMain,(HWND)0);
826 if(!htemp)
827 htemp = hwndTree;
828 if(htemp)
829 WinSetFocus(HWND_DESKTOP,htemp);
830 else
831 WinSetFocus(HWND_DESKTOP,WinQueryWindow(hwnd,QW_PARENT));
832 }
833 return 0;
834 }
835
836 return PFNWPStatic(hwnd,msg,mp1,mp2);
837}
838
839
840MRESULT EXPENTRY CommonCnrProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
841{
842 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd,0);
843
844 switch(msg) {
845 case UM_FIXCNRMLE:
846 if(dcd) {
847
848 SWP swp,swpC;
849
850 if(WinQueryWindowPos(WinWindowFromID(hwnd,CID_MLE),&swp)) {
851 if(WinQueryWindowPos(hwnd,&swpC)) {
852 swpC.cx -= (WinQuerySysValue(HWND_DESKTOP,SV_CXVSCROLL) + 4);
853 swpC.cx -= swp.x;
854 WinSetWindowPos(WinWindowFromID(hwnd,CID_MLE),
855 HWND_TOP,
856 0,
857 0,
858 swpC.cx,
859 swp.cy + 2,
860 SWP_SIZE);
861 }
862 }
863 if(mp1)
864 WinSendMsg(WinWindowFromID(hwnd,CID_MLE),
865 MLM_SETTEXTLIMIT,
866 mp1,
867 MPVOID);
868 }
869 return 0;
870
871 case UM_FIXEDITNAME:
872 if(dcd) {
873 if(mp1 &&
874 (INT)mp1 != -1) {
875
876 CHAR *p;
877
878 WinSendMsg(hwnd,
879 UM_FIXCNRMLE,
880 MPFROMLONG(CCHMAXPATH),
881 MPVOID);
882 MLEdelete(WinWindowFromID(hwnd,CID_MLE),
883 0,
884 strlen((CHAR *)mp1) + 1);
885 WinSetDlgItemText(hwnd,
886 CID_MLE,
887 (CHAR *)mp1);
888 p = strrchr((CHAR *)mp1,'\\');
889 if(p) {
890 p++;
891 MLEsetcurposa(WinWindowFromID(hwnd,CID_MLE),
892 (p - (CHAR *)mp1));
893 MLEsetcurposc(WinWindowFromID(hwnd,CID_MLE),
894 strlen((CHAR *)mp1));
895 }
896 else
897 MLEsetcurpos(WinWindowFromID(hwnd,CID_MLE),
898 strlen((CHAR *)mp1));
899 }
900 else if(mp2) {
901 if((INT)mp1 == -1) {
902
903 PCNRITEM pci = (PCNRITEM)mp2;
904
905 WinSendMsg(hwnd,
906 CM_REMOVERECORD,
907 MPFROMP(&pci),
908 MPFROM2SHORT(1,CMA_FREE | CMA_INVALIDATE));
909 }
910 else {
911 Broadcast(WinQueryAnchorBlock(hwnd),
912 dcd->hwndParent,
913 UM_UPDATERECORD,
914 mp2,
915 MPVOID);
916 free(mp2);
917 }
918 }
919 }
920 return 0;
921 }
922 return PFNWPCnr(hwnd,msg,mp1,mp2);
923}
924
925
926HWND OpenDirCnr (HWND hwnd,HWND hwndParent,HWND hwndRestore,
927 BOOL noautotile,char *directory)
928{
929 SWP swp;
930 HWND hwndDir;
931
932 if(ParentIsDesktop(hwnd,hwndParent) ||
933 *(ULONG *)realappname != FM3UL)
934 StartDirCnr(HWND_DESKTOP,
935 directory,
936 hwndRestore,
937 1);
938 else if(*(ULONG *)realappname == FM3UL) {
939 if(!fAutoTile)
940 GetNextWindowPos(hwndParent,
941 &swp,
942 NULL,
943 NULL);
944 hwndDir = StartDirCnr(hwndParent,
945 directory,
946 hwndRestore,
947 1);
948 if(hwndDir) {
949 if(!fAutoTile)
950 WinSetWindowPos(hwndDir,
951 HWND_TOP,
952 swp.x,
953 swp.y,
954 swp.cx,
955 swp.cy,
956 SWP_MOVE | SWP_SIZE |
957 SWP_SHOW | SWP_ZORDER);
958 else if(!noautotile)
959 TileChildren(hwndParent,
960 TRUE);
961 WinSetWindowPos(hwndDir,
962 HWND_TOP,
963 0,
964 0,
965 0,
966 0,
967 SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
968 }
969 }
970 else {
971
972 char s[256];
973
974 assign_ignores(s);
975 runemf2(WINDOWED | SEPARATE,
976 hwnd,
977 NULL,
978 NULL,
979 "VDIR.EXE %s%s\"%s%s\"",
980 (*s) ? s : NullStr,(*s) ? " " : NullStr,
981 directory,
982 (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr);
983 }
984 return hwndDir;
985}
986
Note: See TracBrowser for help on using the repository browser.