source: trunk/dll/common.c@ 809

Last change on this file since 809 was 809, checked in by Steven Levine, 18 years ago

Revert more to DosSleep(0)
Comments

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