source: trunk/dll/common.c@ 985

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

Update sizes dialog (ticket 44); Make max command line length user settable (ticket 199); use xfree for free in most cases (ticket 212); initial code to check for valid ini file (ticket 102); Some additional refactoring and structure rework; Some documentation updates;

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