source: trunk/dll/common.c @ 751

Last change on this file since 751 was 751, checked in by Steven Levine, 13 years ago

Sync rest of code with CNRITEM mods
Sync code with ARCITEM mods
Get compare dialog working
Still some issues with status display
Still some issues with directory sizes tree display
Heap check diagnostic code mostly enabled

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