source: trunk/dll/common.c@ 888

Last change on this file since 888 was 888, checked in by Gregg Young, 18 years ago

runemf2 now quotes executable strings if needed (Ticket 180); it also reports where it was called from on errors

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.5 KB
RevLine 
[246]1
2/***********************************************************************
3
4 $Id: common.c 888 2007-12-22 22:02:11Z gyoung $
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
[841]29#define INCL_LONGLONG
[348]30#include <os2.h>
[2]31
32#include <stdarg.h>
33#include <stdio.h>
34#include <stdlib.h>
35#include <string.h>
36#include <ctype.h>
37#include <time.h>
38#include <direct.h>
39#include <share.h>
40#include <limits.h>
[348]41
[2]42#include "fm3dll.h"
43#include "fm3dlg.h"
44#include "fm3str.h"
45#include "mle.h"
46
47#pragma data_seg(DATA1)
[348]48
49static PSZ pszSrcFile = __FILE__;
50
[551]51MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
52 HWND hwnd,
53 ULONG msg, MPARAM mp1, MPARAM mp2)
[377]54{
[574]55 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]56
[551]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);
[2]76
[551]77 case UM_CONTEXTMENU:
78 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
79 return 0;
[2]80
[551]81 case UM_CONTAINERHWND:
82 return MRFROMLONG(WinWindowFromID(hwnd, id));
[2]83
[551]84 case DM_DROP:
85 case DM_DRAGOVER:
86 case DM_DRAGLEAVE:
87 case DM_DROPHELP:
88 {
89 CNRDRAGINFO cnd;
90 USHORT dcmd;
[2]91
[551]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;
[2]105 }
[551]106 cnd.pDragInfo = (PDRAGINFO) mp1;
107 cnd.pRecord = NULL;
108 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),
109 WM_CONTROL, MPFROM2SHORT(id, dcmd), MPFROMP(&cnd));
110 }
[2]111
[551]112 case UM_RESCAN:
113 if (fAutoTile &&
114 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
115 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
116 return 0;
[2]117
[551]118 case WM_MINMAXFRAME:
119 {
120 PSWP pswp = (PSWP) mp1;
121 MRESULT rc;
[2]122
[551]123 rc = oldproc(hwnd, msg, mp1, mp2);
124 if (pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE))
125 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
126 return rc;
127 }
[2]128
[551]129 case WM_DESTROY:
130 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
131 break;
[2]132 }
[551]133 return oldproc(hwnd, msg, mp1, mp2);
[2]134}
135
[551]136MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]137{
[551]138 switch (msg) {
139 case WM_CREATE:
140 {
141 MRESULT rc;
[2]142
[551]143 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
[552]144 switch (WinQueryWindowUShort(hwnd, QWS_ID))
[551]145 case DIR_SORT:
146 case DIR_VIEW:
147 case DIR_FILTER:
[552]148
149 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVTEXT));
[551]150 return rc;
151 }
[2]152 }
[551]153 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]154}
155
[551]156void CommonTextPaint(HWND hwnd, HPS hps)
[377]157{
[2]158 int x;
[551]159 USHORT ids[] = { DIR_FOLDERICON, DIR_TOTALS, DIR_SELECTED, DIR_VIEW,
160 DIR_FILTER, DIR_SORT, DIR_MAX, 0
161 };
162 BOOL bools[] = { TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
[2]163
[551]164 for (x = 0; ids[x]; x++) {
165 if (WinWindowFromID(hwnd, ids[x]) != (HWND) 0)
166 PaintRecessedWindow(WinWindowFromID(hwnd, ids[x]), hps,
167 bools[x], FALSE);
[2]168 }
169}
170
[551]171void CommonCreateTextChildren(HWND hwnd, char *class, USHORT * ids)
[377]172{
[551]173 int x;
174 CHAR s[33];
[2]175 ULONG attrs;
[377]176 HWND hwndTmp;
[2]177
[377]178 if (!hwnd || !class || !ids) {
179 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
[2]180 return;
[377]181 }
[2]182
[551]183 for (x = 0; ids[x]; x++) {
[2]184 *s = 0;
[551]185 switch (ids[x]) {
186 case DIR_SORT:
187 case DIR_FILTER:
188 case DIR_VIEW:
189 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
190 break;
191 case DIR_FOLDERICON:
192 case DIR_MAX:
193 attrs = SS_BITMAP;
194 sprintf(s, "#%d", ids[x]);
195 break;
196 default:
197 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
198 break;
[2]199 }
[551]200 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
201 HWND_TOP, ids[x], NULL, NULL);
[377]202 if (!hwndTmp)
[551]203 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
204 } // for
[2]205}
206
[551]207void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
[377]208{
[2]209 char dv[CCHMAXPATH];
210
[551]211 if (!drive || !*drive)
[2]212 return;
[551]213 strcpy(dv, drive);
[2]214 MakeValidDir(dv);
215
[551]216 switch (cmd) {
217 case IDM_MKDIR:
218 PMMkDir(hwnd, dv, FALSE);
219 break;
220 case IDM_INFO:
221 WinDlgBox(HWND_DESKTOP,
222 HWND_DESKTOP,
223 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) dv);
224 break;
225 case IDM_DRVFLAGS:
[552]226 strcpy(dv, drive); // Must use original drive letter
[551]227 if (WinDlgBox(HWND_DESKTOP,
228 hwnd,
229 SetDrvProc,
230 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
231 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
232 break;
233 case IDM_SIZES:
234 WinDlgBox(HWND_DESKTOP,
235 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv);
236 break;
237 case IDM_SHOWALLFILES:
238 StartSeeAll(HWND_DESKTOP, FALSE, dv);
239 break;
240 case IDM_UNDELETE:
241 WinDlgBox(HWND_DESKTOP,
242 hwnd, UndeleteDlgProc, FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
243 break;
244 case IDM_CHKDSK:
245 runemf2(SEPARATE | WINDOWED,
[888]246 hwnd, pszSrcFile, __LINE__, NULL, NULL,
247 "PMCHKDSK.EXE %c:", toupper(*dv));
[551]248 break;
249 case IDM_OPTIMIZE:
250 {
251 CHAR FileSystem[CCHMAXPATH];
252 ULONG type;
[2]253
[551]254 CheckDrive(*dv, FileSystem, &type);
255 if (*FileSystem) {
256 strcat(FileSystem, "OPT.CMD");
257 runemf2(SEPARATE | WINDOWED,
[888]258 hwnd, pszSrcFile, __LINE__,
[551]259 NULL,
260 NULL,
261 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
[2]262 }
[551]263 }
264 break;
265 case IDM_FORMAT:
266 runemf2(SEPARATE | WINDOWED,
[888]267 hwnd, pszSrcFile, __LINE__, NULL, NULL,
268 "PMFORMAT.EXE %c:", toupper(*dv));
[551]269 break;
[2]270
[551]271#if 0 // fixme to be gone?
[446]272
[551]273 case IDM_CLOSETRAY:
274 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
[2]275
[551]276 BYTE parm[4] = { "CD01" };
[841]277 ULONGLONG dlen;
278 ULONG plen;
[551]279 HFILE hfile;
280 APIRET rc;
[2]281
[551]282 dv[2] = 0;
[844]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);
[551]292 if (rc)
[844]293 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
[551]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");
[2]303 }
[551]304 }
305 break;
[446]306#endif // fixme to be gone?
[2]307
[551]308 case IDM_LOCK:
309 case IDM_UNLOCK:
310 case IDM_EJECT:
311 {
312 BYTE parm[2];
313 ULONG plen = sizeof(parm), dlen = 0L;
[446]314
[551]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;
[2]325 }
[551]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;
[2]332 }
333}
334
[551]335void CommonCreateMainChildren(HWND hwnd, SWP * swp)
[377]336{
[551]337 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
[377]338 HWND hwndTmp;
339 PFNWP oldproc;
[2]340
[377]341 // Create a children of frame window
342 hwndStatus = WinCreateWindow(hwndFrame,
[593]343 WC_STATUS,
[551]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);
[377]358 if (!hwndStatus)
[551]359 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[377]360
361 hwndStatus2 = WinCreateWindow(hwndFrame,
[593]362 WC_STATUS,
[551]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);
[377]378 if (!hwndStatus2)
[551]379 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[2]380
[377]381 hwndAttr = WinCreateWindow(hwndFrame,
[593]382 WC_STATUS,
[551]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);
[377]396 if (!hwndAttr)
[551]397 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[377]398
399 hwndDate = WinCreateWindow(hwndFrame,
[593]400 WC_STATUS,
[551]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);
[377]414 if (!hwndDate)
[551]415 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[377]416
417 hwndName = WinCreateWindow(hwndFrame,
[593]418 WC_STATUS,
[551]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);
[377]432 if (!hwndName)
[551]433 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[2]434
[377]435 hwndTmp = WinCreateWindow(hwndFrame,
[593]436 WC_TOOLBACK,
[551]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);
[377]449 if (!hwndTmp)
[551]450 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[377]451
452 hwndBack = WinCreateWindow(hwndFrame,
[593]453 WC_DRIVEBACK,
[551]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);
[2]467
[377]468 if (!hwndBack)
[551]469 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[377]470
471 hwndLED = WinCreateWindow(hwndFrame,
[593]472 WC_LED,
[551]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);
[377]479 if (!hwndLED)
[551]480 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[377]481
482 hwndLEDHdr = WinCreateWindow(hwndFrame,
[593]483 WC_LED,
[551]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);
[377]492 if (!hwndLEDHdr)
[551]493 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[377]494
495 hwndAutoview = WinCreateWindow(hwndFrame,
[593]496 WC_AUTOVIEW,
[551]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);
[377]512 if (!hwndAutoview)
[551]513 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[377]514
515 hwndAutoMLE = WinCreateWindow(hwndFrame,
[551]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);
[377]533 if (!hwndAutoMLE)
[551]534 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[2]535
[551]536 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
[574]537 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
[551]538 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
[2]539}
540
[551]541MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
542 MPARAM mp2)
[377]543{
[551]544 switch (msg) {
545 case UM_THREADUSE:
546 if (hbmLEDon && hbmLEDoff) {
547 static LONG threaduse;
548 CHAR ts[33];
[2]549
[551]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);
[377]560 }
561 }
[551]562 ltoa(threaduse, ts, 10);
563 WinSetWindowText(hwndLEDHdr, ts);
[809]564 DosSleep(0);
[551]565 }
566 return 0;
[2]567
[551]568 case UM_LOADFILE:
569 {
570 CHAR *s = NULL;
571 static CHAR lastfile[CCHMAXPATH] = "";
[2]572
[551]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;
[2]596
[551]597 case UM_BUILDDRIVEBAR:
598 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
599 MAIN_DRIVES));
600 return 0;
[2]601 }
[551]602 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]603}
604
[551]605MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
606 MPARAM mp2)
[377]607{
[551]608 static HWND hwndLast = (HWND) 0;
[2]609 static ULONG lastclick = 0;
610
[551]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;
[348]619
[551]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;
[2]628
[551]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;
[2]637
[551]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;
[2]645
[551]646 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
647 if (check > lastclick + 500) {
[2]648
[551]649 RECTL rcl;
650 POINTS pts;
[2]651
[551]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);
[2]657 }
[551]658 lastclick = check;
659 }
660 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
661 hwndLast = (HWND) 0;
662 break;
[2]663
[551]664 case WM_SETFOCUS:
665 if (mp2)
666 hwndLast = (HWND) mp1;
667 break;
[2]668
[551]669 case UM_FOCUSME:
670 if (mp1) {
[2]671
[551]672 PID pid;
673 TID tid;
[2]674
[551]675 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
676 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
677 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
678 return 0;
[2]679 }
[551]680 }
681 {
682 HWND htemp = (HWND) 0;
[2]683
[551]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;
[2]694 }
695
[551]696 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]697}
698
[551]699MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]700{
[574]701 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
[2]702
[551]703 switch (msg) {
704 case UM_FIXCNRMLE:
705 if (dcd) {
[2]706
[551]707 SWP swp, swpC;
[2]708
[551]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 }
[2]716 }
[551]717 if (mp1)
718 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
719 MLM_SETTEXTLIMIT, mp1, MPVOID);
720 }
721 return 0;
[2]722
[551]723 case UM_FIXEDITNAME:
724 if (dcd) {
725 if (mp1 && (INT) mp1 != -1) {
[2]726
[551]727 CHAR *p;
[2]728
[551]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 PCNRITEM pci = (PCNRITEM) mp2;
[751]745 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
[551]746 }
747 else {
748 Broadcast(WinQueryAnchorBlock(hwnd),
749 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
750 free(mp2);
751 }
[2]752 }
[551]753 }
754 return 0;
[2]755 }
[551]756 return PFNWPCnr(hwnd, msg, mp1, mp2);
[2]757}
758
[551]759HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
760 BOOL noautotile, char *directory)
[377]761{
[551]762 SWP swp;
[2]763 HWND hwndDir;
764
[551]765 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
766 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
767 else if (*(ULONG *) realappname == FM3UL) {
768 if (!fAutoTile)
769 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
770 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
771 if (hwndDir) {
772 if (!fAutoTile)
773 WinSetWindowPos(hwndDir,
774 HWND_TOP,
775 swp.x,
776 swp.y,
777 swp.cx,
778 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
779 else if (!noautotile)
780 TileChildren(hwndParent, TRUE);
[2]781 WinSetWindowPos(hwndDir,
[551]782 HWND_TOP,
783 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
[2]784 }
785 }
786 else {
787
788 char s[256];
789
790 assign_ignores(s);
791 runemf2(WINDOWED | SEPARATE,
[888]792 hwnd, pszSrcFile, __LINE__,
[551]793 NULL,
794 NULL,
795 "VDIR.EXE %s%s\"%s%s\"",
796 (*s) ? s : NullStr, (*s) ? " " : NullStr,
797 directory,
798 (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr);
[2]799 }
800 return hwndDir;
801}
802
[536]803//= IncrThreadUsage() Increment thread usage counter ==
804
805VOID IncrThreadUsage(VOID)
806{
807 if (hwndMain)
[551]808 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
[536]809}
810
811//= DecrThreadUsage() Decrement thread usage counter ==
812
813VOID DecrThreadUsage(VOID)
814{
815 if (hwndMain)
[551]816 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
[536]817}
[793]818
819#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
820#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
821#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
822#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
823#pragma alloc_text(COMMON4,CommonCnrProc)
824#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.