source: trunk/dll/common.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

  • 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 1039 2008-07-05 22:16:21Z gyoung $
5
6 Common window functions
7
8 Copyright (c) 1993, 1998 M. Kimes
[907]9 Copyright (c) 2001, 2008 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)
[985]22 29 Feb 08 GKY Use xfree where appropriate
[246]23
24***********************************************************************/
25
[907]26#include <stdlib.h>
27#include <string.h>
28#include <ctype.h>
29
[2]30#define INCL_DOS
31#define INCL_DOSERRORS
32#define INCL_WIN
33#define INCL_GPI
[907]34#define INCL_LONGLONG // dircnrs.h
[2]35
36#include "fm3dlg.h"
37#include "fm3str.h"
38#include "mle.h"
[907]39#include "filldir.h" // RemoveCnrItems
40#include "errutil.h" // Dos_Error...
41#include "strutil.h" // GetPString
42#include "fm3dll.h"
[1039]43#include "fortify.h"
[2]44
45#pragma data_seg(DATA1)
[348]46
47static PSZ pszSrcFile = __FILE__;
48
[551]49MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
50 HWND hwnd,
51 ULONG msg, MPARAM mp1, MPARAM mp2)
[377]52{
[574]53 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]54
[551]55 switch (msg) {
56 case UM_TIMER:
57 case UM_ACTION:
58 case UM_SHOWME:
59 case UM_OPENWINDOWFORME:
60 case UM_MINIMIZE:
61 case UM_MAXIMIZE:
62 case UM_CONTAINERDIR:
63 case UM_FILTER:
64 case UM_INITMENU:
65 case UM_COMMAND:
66 case UM_UPDATERECORD:
67 case UM_UPDATERECORDLIST:
68 case WM_COMMAND:
69 case MM_PORTHOLEINIT:
70 case WM_INITMENU:
71 case UM_CONTAINER_FILLED:
72 case UM_FILESMENU:
73 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
[2]74
[551]75 case UM_CONTEXTMENU:
76 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
77 return 0;
[2]78
[551]79 case UM_CONTAINERHWND:
80 return MRFROMLONG(WinWindowFromID(hwnd, id));
[2]81
[551]82 case DM_DROP:
83 case DM_DRAGOVER:
84 case DM_DRAGLEAVE:
85 case DM_DROPHELP:
86 {
87 CNRDRAGINFO cnd;
88 USHORT dcmd;
[2]89
[551]90 switch (msg) {
91 case DM_DROP:
92 dcmd = CN_DROP;
93 break;
94 case DM_DRAGOVER:
95 dcmd = CN_DRAGOVER;
96 break;
97 case DM_DRAGLEAVE:
98 dcmd = CN_DRAGLEAVE;
99 break;
100 case DM_DROPHELP:
101 dcmd = CN_DROPHELP;
102 break;
[2]103 }
[551]104 cnd.pDragInfo = (PDRAGINFO) mp1;
105 cnd.pRecord = NULL;
106 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),
107 WM_CONTROL, MPFROM2SHORT(id, dcmd), MPFROMP(&cnd));
108 }
[2]109
[551]110 case UM_RESCAN:
111 if (fAutoTile &&
112 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
113 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
114 return 0;
[2]115
[551]116 case WM_MINMAXFRAME:
117 {
118 PSWP pswp = (PSWP) mp1;
119 MRESULT rc;
[2]120
[551]121 rc = oldproc(hwnd, msg, mp1, mp2);
122 if (pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE))
123 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
124 return rc;
125 }
[2]126
[551]127 case WM_DESTROY:
128 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
129 break;
[2]130 }
[551]131 return oldproc(hwnd, msg, mp1, mp2);
[2]132}
133
[551]134MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]135{
[551]136 switch (msg) {
137 case WM_CREATE:
138 {
139 MRESULT rc;
[2]140
[551]141 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
[552]142 switch (WinQueryWindowUShort(hwnd, QWS_ID))
[551]143 case DIR_SORT:
144 case DIR_VIEW:
145 case DIR_FILTER:
[552]146
147 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVTEXT));
[551]148 return rc;
149 }
[2]150 }
[551]151 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]152}
153
[551]154void CommonTextPaint(HWND hwnd, HPS hps)
[377]155{
[2]156 int x;
[551]157 USHORT ids[] = { DIR_FOLDERICON, DIR_TOTALS, DIR_SELECTED, DIR_VIEW,
158 DIR_FILTER, DIR_SORT, DIR_MAX, 0
159 };
160 BOOL bools[] = { TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
[2]161
[551]162 for (x = 0; ids[x]; x++) {
163 if (WinWindowFromID(hwnd, ids[x]) != (HWND) 0)
164 PaintRecessedWindow(WinWindowFromID(hwnd, ids[x]), hps,
165 bools[x], FALSE);
[2]166 }
167}
168
[551]169void CommonCreateTextChildren(HWND hwnd, char *class, USHORT * ids)
[377]170{
[551]171 int x;
172 CHAR s[33];
[2]173 ULONG attrs;
[377]174 HWND hwndTmp;
[2]175
[377]176 if (!hwnd || !class || !ids) {
177 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
[2]178 return;
[377]179 }
[2]180
[551]181 for (x = 0; ids[x]; x++) {
[2]182 *s = 0;
[551]183 switch (ids[x]) {
184 case DIR_SORT:
185 case DIR_FILTER:
186 case DIR_VIEW:
187 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
188 break;
189 case DIR_FOLDERICON:
190 case DIR_MAX:
191 attrs = SS_BITMAP;
192 sprintf(s, "#%d", ids[x]);
193 break;
194 default:
195 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
196 break;
[2]197 }
[551]198 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
199 HWND_TOP, ids[x], NULL, NULL);
[377]200 if (!hwndTmp)
[551]201 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[948]202 } // for
[2]203}
204
[551]205void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
[377]206{
[2]207 char dv[CCHMAXPATH];
208
[551]209 if (!drive || !*drive)
[2]210 return;
[551]211 strcpy(dv, drive);
[2]212 MakeValidDir(dv);
213
[551]214 switch (cmd) {
215 case IDM_MKDIR:
216 PMMkDir(hwnd, dv, FALSE);
217 break;
218 case IDM_INFO:
219 WinDlgBox(HWND_DESKTOP,
220 HWND_DESKTOP,
221 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) dv);
222 break;
223 case IDM_DRVFLAGS:
[552]224 strcpy(dv, drive); // Must use original drive letter
[551]225 if (WinDlgBox(HWND_DESKTOP,
226 hwnd,
227 SetDrvProc,
228 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
229 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
230 break;
231 case IDM_SIZES:
232 WinDlgBox(HWND_DESKTOP,
233 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv);
234 break;
235 case IDM_SHOWALLFILES:
236 StartSeeAll(HWND_DESKTOP, FALSE, dv);
237 break;
238 case IDM_UNDELETE:
239 WinDlgBox(HWND_DESKTOP,
240 hwnd, UndeleteDlgProc, FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
241 break;
242 case IDM_CHKDSK:
243 runemf2(SEPARATE | WINDOWED,
[907]244 hwnd, pszSrcFile, __LINE__, NULL, NULL,
245 "PMCHKDSK.EXE %c:", toupper(*dv));
[551]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,
[888]256 hwnd, pszSrcFile, __LINE__,
[551]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,
[907]265 hwnd, pszSrcFile, __LINE__, NULL, NULL,
266 "PMFORMAT.EXE %c:", toupper(*dv));
[551]267 break;
[2]268
[551]269#if 0 // fixme to be gone?
[446]270
[551]271 case IDM_CLOSETRAY:
272 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
[2]273
[551]274 BYTE parm[4] = { "CD01" };
[841]275 ULONGLONG dlen;
276 ULONG plen;
[551]277 HFILE hfile;
278 APIRET rc;
[2]279
[551]280 dv[2] = 0;
[844]281 rc = DosOpen(dv,
282 &hfile,
283 &dlen,
284 0,
285 0,
286 OPEN_ACTION_OPEN_IF_EXISTS |
287 OPEN_ACTION_CREATE_IF_NEW,
288 OPEN_FLAGS_DASD |
289 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE, NULL);
[551]290 if (rc)
[844]291 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
[551]292 else {
293 dlen = 0;
294 plen = sizeof(parm);
295 rc = DosDevIOCtl(hfile,
296 0x80,
297 0x45, &parm, sizeof(parm), &plen, NULL, 0, &dlen);
298 DosClose(hfile);
299 if (rc)
300 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosDevIOCtl");
[2]301 }
[551]302 }
303 break;
[446]304#endif // fixme to be gone?
[2]305
[551]306 case IDM_LOCK:
307 case IDM_UNLOCK:
308 case IDM_EJECT:
309 {
310 BYTE parm[2];
311 ULONG plen = sizeof(parm), dlen = 0L;
[446]312
[551]313 switch (SHORT1FROMMP(cmd)) {
314 case IDM_LOCK:
315 parm[0] = 1;
316 break;
317 case IDM_UNLOCK:
318 parm[0] = 0;
319 break;
320 case IDM_EJECT:
321 parm[0] = 2;
322 break;
[2]323 }
[551]324 parm[1] = (BYTE) (*dv - 'A');
325 DosError(FERR_DISABLEHARDERR);
326 DosDevIOCtl(-1L,
327 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
328 }
329 break;
[2]330 }
331}
332
[551]333void CommonCreateMainChildren(HWND hwnd, SWP * swp)
[377]334{
[551]335 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
[377]336 HWND hwndTmp;
337 PFNWP oldproc;
[2]338
[377]339 // Create a children of frame window
[948]340 // Left status window
[377]341 hwndStatus = WinCreateWindow(hwndFrame,
[593]342 WC_STATUS,
[551]343 "Status",
344 WS_VISIBLE | SS_TEXT | DT_LEFT |
345 DT_VCENTER,
346 swp->x + 4 +
347 WinQuerySysValue(HWND_DESKTOP,
348 SV_CXSIZEBORDER),
349 swp->y + 4 +
350 WinQuerySysValue(HWND_DESKTOP,
351 SV_CYSIZEBORDER),
352 ((swp->cx / 2) - 8) -
353 (WinQuerySysValue(HWND_DESKTOP,
354 SV_CXSIZEBORDER) * 2),
355 20,
356 hwndFrame, HWND_TOP, MAIN_STATUS, NULL, NULL);
[377]357 if (!hwndStatus)
[551]358 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
[377]359
[948]360 // Right status window
[377]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) {
[1009]581 if (!mp2 && !stricmp(lastfile, (CHAR *)mp1))
[551]582 return 0;
[1009]583 strcpy(lastfile, (CHAR *)mp1);
[551]584 s = xstrdup(lastfile, pszSrcFile, __LINE__);
585 }
586 else
587 *lastfile = 0;
588 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
589 UM_LOADFILE, MPFROMP(s), MPVOID)) {
[1009]590 xfree(s, pszSrcFile, __LINE__);
[551]591 }
592 }
593 }
594 return 0;
[2]595
[551]596 case UM_BUILDDRIVEBAR:
597 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
598 MAIN_DRIVES));
599 return 0;
[2]600 }
[551]601 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]602}
603
[551]604MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
605 MPARAM mp2)
[377]606{
[551]607 static HWND hwndLast = (HWND) 0;
[2]608 static ULONG lastclick = 0;
609
[551]610 switch (msg) {
611 case WM_MOUSEMOVE:
612 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
613 if (!fNoFinger) {
614 WinSetPointer(HWND_DESKTOP, hptrFinger);
615 return MRFROMLONG(TRUE);
616 }
617 break;
[348]618
[551]619 case WM_BUTTON1DOWN:
620 case WM_BUTTON3DOWN:
621 if (hwndBubble)
622 WinDestroyWindow(hwndBubble);
623 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
624 WinSetCapture(HWND_DESKTOP, hwnd);
625 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
626 break;
[2]627
[551]628 case WM_BUTTON2UP:
629 case WM_BUTTON2DOWN:
630 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
631 if (msg == WM_BUTTON2UP && hwndLast) {
632 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
633 hwndLast = (HWND) 0;
634 }
635 break;
[2]636
[551]637 case WM_BUTTON1UP:
638 case WM_BUTTON3UP:
639 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
640 WinSetCapture(HWND_DESKTOP, (HWND) 0);
641 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
642 {
643 ULONG check;
[2]644
[551]645 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
646 if (check > lastclick + 500) {
[2]647
[551]648 RECTL rcl;
649 POINTS pts;
[2]650
[551]651 pts.x = SHORT1FROMMP(mp1);
652 pts.y = SHORT2FROMMP(mp1);
653 WinQueryWindowRect(hwnd, &rcl);
654 if (pts.x > 0 && pts.y > 0 && pts.x < rcl.xRight && pts.y < rcl.yTop)
655 PostMsg(hwnd, UM_CLICKED + (msg == WM_BUTTON3UP), mp1, mp2);
[2]656 }
[551]657 lastclick = check;
658 }
659 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
660 hwndLast = (HWND) 0;
661 break;
[2]662
[551]663 case WM_SETFOCUS:
664 if (mp2)
665 hwndLast = (HWND) mp1;
666 break;
[2]667
[551]668 case UM_FOCUSME:
669 if (mp1) {
[2]670
[551]671 PID pid;
672 TID tid;
[2]673
[551]674 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
675 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
676 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
677 return 0;
[2]678 }
[551]679 }
680 {
681 HWND htemp = (HWND) 0;
[2]682
[551]683 if (hwndMain)
684 htemp = TopWindow(hwndMain, (HWND) 0);
685 if (!htemp)
686 htemp = hwndTree;
687 if (htemp)
688 WinSetFocus(HWND_DESKTOP, htemp);
689 else
690 WinSetFocus(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
691 }
692 return 0;
[2]693 }
694
[551]695 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]696}
697
[551]698MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]699{
[574]700 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
[2]701
[551]702 switch (msg) {
703 case UM_FIXCNRMLE:
704 if (dcd) {
[2]705
[551]706 SWP swp, swpC;
[2]707
[551]708 if (WinQueryWindowPos(WinWindowFromID(hwnd, CID_MLE), &swp)) {
709 if (WinQueryWindowPos(hwnd, &swpC)) {
710 swpC.cx -= (WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL) + 4);
711 swpC.cx -= swp.x;
712 WinSetWindowPos(WinWindowFromID(hwnd, CID_MLE),
713 HWND_TOP, 0, 0, swpC.cx, swp.cy + 2, SWP_SIZE);
714 }
[2]715 }
[551]716 if (mp1)
717 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
718 MLM_SETTEXTLIMIT, mp1, MPVOID);
719 }
720 return 0;
[2]721
[551]722 case UM_FIXEDITNAME:
723 if (dcd) {
724 if (mp1 && (INT) mp1 != -1) {
[2]725
[551]726 CHAR *p;
[2]727
[551]728 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
729 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
[1009]730 0, strlen((CHAR *)mp1) + 1);
731 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *)mp1);
732 p = strrchr((CHAR *)mp1, '\\');
[551]733 if (p) {
734 p++;
[1009]735 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *)mp1));
736 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
[551]737 }
738 else
[1009]739 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
[551]740 }
741 else if (mp2) {
742 if ((INT) mp1 == -1) {
743 PCNRITEM pci = (PCNRITEM) mp2;
[751]744 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
[551]745 }
746 else {
747 Broadcast(WinQueryAnchorBlock(hwnd),
748 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
[1039]749 free(mp2);
[551]750 }
[2]751 }
[551]752 }
753 return 0;
[2]754 }
[551]755 return PFNWPCnr(hwnd, msg, mp1, mp2);
[2]756}
757
[551]758HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
759 BOOL noautotile, char *directory)
[377]760{
[551]761 SWP swp;
[2]762 HWND hwndDir;
763
[551]764 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
765 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
766 else if (*(ULONG *) realappname == FM3UL) {
767 if (!fAutoTile)
768 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
769 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
770 if (hwndDir) {
771 if (!fAutoTile)
772 WinSetWindowPos(hwndDir,
773 HWND_TOP,
774 swp.x,
775 swp.y,
776 swp.cx,
777 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
778 else if (!noautotile)
779 TileChildren(hwndParent, TRUE);
[2]780 WinSetWindowPos(hwndDir,
[551]781 HWND_TOP,
782 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
[2]783 }
784 }
785 else {
786
787 char s[256];
788
789 assign_ignores(s);
790 runemf2(WINDOWED | SEPARATE,
[888]791 hwnd, pszSrcFile, __LINE__,
[551]792 NULL,
793 NULL,
794 "VDIR.EXE %s%s\"%s%s\"",
795 (*s) ? s : NullStr, (*s) ? " " : NullStr,
796 directory,
797 (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr);
[2]798 }
799 return hwndDir;
800}
801
[536]802//= IncrThreadUsage() Increment thread usage counter ==
803
804VOID IncrThreadUsage(VOID)
805{
806 if (hwndMain)
[551]807 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
[536]808}
809
810//= DecrThreadUsage() Decrement thread usage counter ==
811
812VOID DecrThreadUsage(VOID)
813{
814 if (hwndMain)
[551]815 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
[536]816}
[793]817
818#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
819#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
820#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
821#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
822#pragma alloc_text(COMMON4,CommonCnrProc)
823#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.