source: trunk/dll/common.c @ 593

Last change on this file since 593 was 593, checked in by Gregg Young, 14 years ago

Changes to remove GetPString from window class names

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