source: trunk/dll/datamin.c@ 1480

Last change on this file since 1480 was 1480, checked in by Gregg Young, 16 years ago

Fix failure to correctly check for large file support in FindSwapperDat fall back code minor streamling. Add LVM.EXE to partition submenu. Stop using xDosQueryAppType where the file name it is passed is already a local stack variable. Correct a typo in several file header comments.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.5 KB
Line 
1
2/***********************************************************************
3
4 $Id: datamin.c 1480 2009-11-22 22:58:49Z gyoung $
5
6 Minimized data bar
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2001, 2008 Steven H. Levine
10
11 14 Sep 02 SHL Handle large partitions
12 16 Oct 02 SHL Handle large partitions better
13 23 May 05 SHL Use QWL_USER
14 23 May 05 SHL Avoid delays for inaccessible drives
15 25 May 05 SHL Use ULONGLONG and CommaFmtULL
16 06 Jun 05 SHL Drop unused code
17 22 Jul 06 SHL Check more run time errors
18 02 Jan 07 GKY Changed drive information string formating to accomodate 6 char FS names
19 07 Jan 07 GKY Move error strings etc. to string file
20 30 Mar 07 GKY Remove GetPString for window class names
21 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
22 02 Sep 07 GKY Replaced DosQProcStatus with DosQuerySysState to fix trap in thunk code
23 10 Dec 08 SHL Integrate exception handler support
24 03 Jan 09 GKY Check for system that is protectonly to gray out Dos/Win command lines and prevent
25 Dos/Win programs from being inserted into the execute dialog with message why.
26 11 Jan 09 GKY Replace font names in the string file with global set at compile in init.c
27 07 Feb 09 GKY Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error
28 07 Feb 09 GKY Add *DateFormat functions to format dates based on locale
29 08 Mar 09 GKY Renamed commafmt.h i18nutil.h
30 12 Jul 09 GKY Add xDosQueryAppType and xDosAlloc... to allow FM/2 to load in high memory
31
32***********************************************************************/
33
34#include <string.h>
35#include <ctype.h>
36#include <limits.h>
37// #include <process.h> // _beginthread
38
39#define INCL_DOS
40#define INCL_DOSERRORS
41#define INCL_WIN
42#define INCL_GPI
43#define INCL_LONGLONG
44
45#include "fm3dll.h"
46#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
47#include "info.h" // Data declaration(s)
48#include "notebook.h" // Data declaration(s)
49#include "inis.h" // Data declaration(s)
50#include "init.h" // Data declaration(s)
51#include "defview.h" // Data declaration(s)
52#include "fm3dlg.h"
53#include "fm3str.h"
54#include "procstat.h"
55#include "datamin.h"
56#include "errutil.h" // Dos_Error...
57#include "strutil.h" // GetPString
58#include "i18nutil.h" // CommaFmtUL
59#include "killproc.h" // KillDlgProc
60#include "sysinfo.h" // SysInfoDlgProc
61#include "mainwnd.h" // TopWindowName
62#include "common.h" // OpenDirCnr
63#include "shadow.h" // OpenObject
64#include "chklist.h" // PopupMenu
65#include "presparm.h" // SetPresParams
66#include "undel.h" // UndeleteDlgProc
67#include "misc.h" // GetCmdSpec
68#include "wrappers.h" // xDosFindFirst
69#include "systemf.h" // runemf2
70#include "fortify.h"
71#include "excputil.h" // 06 May 08 SHL added
72
73APIRET16 APIENTRY16 Dos16MemAvail(PULONG pulAvailMem);
74
75static volatile HEV G_hevDataMin = NULLHANDLE;
76static volatile HWND G_hwndSingle = NULLHANDLE;
77
78static VOID dataminThread(VOID * pv);
79
80// Data definitions
81#pragma data_seg(GLOBAL1)
82HWND DataHwnd;
83BOOL fDataInclRemote;
84BOOL fDataShowDrives;
85BOOL fDataToFore;
86BOOL fDullMin;
87
88#pragma data_seg(DATA2)
89
90static PSZ pszSrcFile = __FILE__;
91
92long MINI_X = 208, MINI_Y = 16;
93
94//=== MiniTimeProc - time, swap and drive status mini windows procedure ===
95
96MRESULT EXPENTRY MiniTimeProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
97{
98 APIRET rc;
99
100 switch (msg) {
101 case WM_CREATE:
102 {
103 PVOID pv = xmalloc(sizeof(tDataMin), pszSrcFile, __LINE__);
104 if (pv)
105 WinSetWindowPtr(hwnd, QWL_DATAMIN_PTR, pv);
106 }
107 break;
108
109 case WM_BUTTON1CLICK:
110 {
111 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
112
113 if (id >= MINI_DRIVEA) {
114 if (G_hevDataMin != NULLHANDLE) {
115 G_hwndSingle = hwnd;
116 rc = DosPostEventSem(G_hevDataMin);
117 if (rc) {
118 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
119 GetPString(IDS_POSTSEMFAILED));
120 }
121 }
122 }
123 else if (id == MINI_TIME)
124 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_SETUP6, // Up time
125 MPVOID, MPVOID);
126 else if (id == MINI_PROC)
127 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
128 WM_SYSCOMMAND, MPFROM2SHORT(SC_TASKMANAGER, 0), MPVOID);
129 }
130 break;
131
132 case WM_BUTTON1DBLCLK:
133 {
134 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
135
136 if (id >= MINI_DRIVEA && !hwndMain) {
137 CHAR s[] = " :\\";
138
139 *s = (CHAR) (id - MINI_DRIVEA) + 'A';
140 OpenDirCnr((HWND) 0, HWND_DESKTOP, (HWND) 0, FALSE, s);
141 return MRFROMLONG(1L);
142 }
143 else if (id == MINI_TIME) {
144 OpenObject("<WP_CLOCK>",
145 (SHORT2FROMMP(mp2) & KC_SHIFT) ? Default : Settings, hwnd);
146 return MRFROMLONG(1L);
147 }
148
149#ifdef NEVER
150 else if (id == MINI_MEM) {
151 WinDlgBox(HWND_DESKTOP,
152 HWND_DESKTOP,
153 SysInfoDlgProc, FM3ModHandle, SYS_FRAME, NULL);
154 return MRFROMLONG(1L);
155 }
156#endif
157
158 else if (id == MINI_PROC || id == MINI_MEM) {
159 WinDlgBox(HWND_DESKTOP,
160 hwnd, KillDlgProc, FM3ModHandle, KILL_FRAME, NULL);
161 return MRFROMLONG(1L);
162 }
163 else if (id == MINI_SWAP && *SwapperDat) {
164
165 char s[5];
166
167 strncpy(s, SwapperDat, 4);
168 s[3] = 0;
169 WinDlgBox(HWND_DESKTOP,
170 hwndMain,
171 UndeleteDlgProc, FM3ModHandle, UNDEL_FRAME, MPFROMP(s));
172 return MRFROMLONG(1L);
173 }
174 }
175 break;
176
177 case WM_BUTTON1MOTIONSTART:
178 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
179 UM_BUTTON1MOTIONSTART, MPVOID, MPVOID);
180 break;
181
182 case WM_CONTEXTMENU:
183 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_CONTEXTMENU, MPVOID, MPVOID);
184 break;
185
186 case WM_PAINT:
187 {
188 MRESULT mr = 0;
189 USHORT id;
190
191 id = WinQueryWindowUShort(hwnd, QWS_ID);
192 if (id >= MINI_DRIVEA) {
193 HPS hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
194
195 if (hps) {
196 mr = WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
197 UM_PAINT, MPFROM2SHORT(id, 0), MPFROMLONG(hps));
198 WinEndPaint(hps);
199 return mr; // Bypass default paint
200 }
201 }
202 }
203 break;
204
205 case WM_DESTROY:
206 {
207 PVOID pv = WinQueryWindowPtr(hwnd, QWL_DATAMIN_PTR);
208
209 xfree(pv, pszSrcFile, __LINE__);
210 }
211 break;
212 }
213 return PFNWPStatic(hwnd, msg, mp1, mp2);
214
215} // MiniTimeProc
216
217//=== DataProc - databar client window procedure ===
218
219MRESULT EXPENTRY DataProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
220{
221 APIRET rc;
222
223 static ULONG counter;
224 static BOOL NoFloat, noqproc = FALSE, Positioned;
225 static HWND hwndMenu = (HWND) 0;
226
227 switch (msg) {
228 case WM_CREATE:
229 if (DataHwnd) {
230 WinSetWindowPos(DataHwnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_SHOW);
231 return MRFROMLONG(1L);
232 }
233 DataHwnd = WinQueryWindow(hwnd, QW_PARENT);
234 NoFloat = FALSE;
235 Positioned = FALSE;
236 //fixme to allow user to change presparams 1-10-09 GKY
237 SetPresParams(hwnd,
238 &RGBGREY, &RGBBLACK, &RGBBLACK, FNT_8HELVETICA);
239 {
240 int c;
241 long x = 3;
242 USHORT ids[] = { MINI_TIME, MINI_MEM, MINI_SWAP, MINI_PROC, 0 };
243 POINTL aptl[TXTBOX_COUNT];
244 HPS hps;
245
246 hps = WinGetPS(hwnd);
247 if (hps) {
248 GpiQueryTextBox(hps,
249 34,
250 " -=03:08:22 SMW 1998/08/02=- ",
251 TXTBOX_COUNT, aptl);
252 WinReleasePS(hps);
253 MINI_X = aptl[TXTBOX_TOPRIGHT].x + 6;
254 MINI_Y = aptl[TXTBOX_TOPRIGHT].y + 6;
255 }
256 for (c = 0; ids[c]; c++) {
257 if (!WinCreateWindow(hwnd,
258 WC_MINITIME,
259 NullStr,
260 SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE,
261 x,
262 3,
263 MINI_X,
264 MINI_Y, hwnd, HWND_TOP, ids[c], NULL, NULL)) {
265 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
266 PCSZ_WINCREATEWINDOW);
267 }
268 x += (MINI_X + 4);
269 }
270 }
271 if (!hwndMain) {
272 SWCNTRL swctl;
273
274 memset(&swctl, 0, sizeof(swctl));
275 swctl.hwnd = WinQueryWindow(hwnd, QW_PARENT);
276 swctl.uchVisibility = SWL_VISIBLE;
277 swctl.fbJump = (fDataToFore) ? SWL_NOTJUMPABLE : SWL_JUMPABLE;
278 swctl.bProgType = PROG_PM;
279 strcpy(swctl.szSwtitle, GetPString(IDS_DATABARTITLETEXT));
280 WinCreateSwitchEntry(WinQueryAnchorBlock(hwnd), &swctl);
281 }
282 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
283 return 0;
284
285 case WM_MENUEND:
286 NoFloat = FALSE;
287 if (hwndMenu == (HWND) mp2) {
288 WinDestroyWindow(hwndMenu);
289 hwndMenu = (HWND) 0;
290 }
291 break;
292
293 case UM_RESTORE:
294 WinSetWindowPtr(hwnd, QWL_USER, mp1);
295 return 0;
296
297 case UM_SETUP:
298 {
299 long x, y;
300 SWP swp, swpD;
301 int c;
302 ULONG size = sizeof(SWP);
303 ULONG numdrives = 0;
304 ULONG drivestyle = (DRIVE_REMOVABLE | DRIVE_INVALID |
305 DRIVE_IGNORE | DRIVE_ZIPSTREAM | DRIVE_NOSTATS);
306 ULONG ulDriveNum, ulDriveMap;
307
308 if (!fDataInclRemote)
309 drivestyle |= DRIVE_REMOTE || DRIVE_VIRTUAL || DRIVE_RAMDISK;
310 if (fDataShowDrives) {
311 DosError(FERR_DISABLEHARDERR);
312 DosQCurDisk(&ulDriveNum, &ulDriveMap);
313 x = 3;
314 y = MINI_Y + 4;
315 // Drive status windows
316 for (c = 2; c < 26; c++) {
317 if ((ulDriveMap & (1L << c)) && !(driveflags[c] & drivestyle)) {
318 if (!WinCreateWindow(hwnd,
319 WC_MINITIME,
320 NullStr,
321 SS_TEXT | DT_CENTER | DT_VCENTER |
322 WS_VISIBLE, x, y, MINI_X, MINI_Y, hwnd,
323 HWND_TOP, MINI_DRIVEA + c, NULL, NULL)) {
324 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
325 PCSZ_WINCREATEWINDOW);
326 }
327 numdrives++;
328 x += (MINI_X + 4);
329 if ((numdrives % 4) == 0) {
330 y += (MINI_Y + 4);
331 x = 3;
332 }
333 }
334 }
335 }
336 x = (MINI_X * 4) + 18;
337 y = (MINI_Y + 4) + ((numdrives / 4) * (MINI_Y + 4)) +
338 (((numdrives % 4) != 0) * (MINI_Y + 4));
339 if (!Positioned) {
340 if (PrfQueryProfileData(fmprof, appname, "DataMinPos", &swp, &size)) {
341 WinQueryWindowPos(HWND_DESKTOP, &swpD);
342 if (swp.x > swpD.cx - 16)
343 swp.x = swpD.cx - 16;
344 if (swp.y > swpD.cy - 16)
345 swp.y = swpD.cy - 16;
346 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
347 HWND_TOP,
348 swp.x,
349 swp.y,
350 x, y, SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER);
351 }
352 else
353 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
354 HWND_TOP,
355 0,
356 0,
357 x, y, SWP_SHOW | SWP_SIZE | SWP_MOVE | SWP_ZORDER);
358 Positioned = TRUE;
359 }
360 else
361 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
362 HWND_TOP,
363 0, 0, x, y, SWP_SHOW | SWP_SIZE | SWP_ZORDER);
364 WinShowWindow(WinQueryWindow(hwnd, QW_PARENT), TRUE);
365 if (numdrives) {
366 if (xbeginthread(dataminThread,
367 32768,
368 (PVOID)hwnd,
369 pszSrcFile,
370 __LINE__) == -1)
371 {
372 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
373 }
374 }
375 counter = 0;
376 PostMsg(hwnd, UM_TIMER, MPVOID, MPVOID);
377 }
378 return 0; // UM_SETUP
379
380 case WM_BUTTON1DBLCLK:
381 if (hwndMain)
382 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
383 break;
384
385 case UM_CONTEXTMENU:
386 case WM_CONTEXTMENU:
387 if (!hwndMenu)
388 hwndMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, MINI_FRAME);
389 if (hwndMenu) {
390 WinCheckMenuItem(hwndMenu, MINI_FLOAT, fDataToFore);
391 WinCheckMenuItem(hwndMenu, MINI_SHOW, fDataShowDrives);
392 WinCheckMenuItem(hwndMenu, MINI_BORING, fDullMin);
393 WinCheckMenuItem(hwndMenu, MINI_INCLREMOTE, fDataInclRemote);
394 if (fProtectOnly) {
395 WinEnableMenuItem(hwndMenu, IDM_DOSCOMMANDLINE, FALSE);
396 WinEnableMenuItem(hwndMenu, IDM_WINFULLSCREEN, FALSE);
397 }
398 NoFloat = TRUE;
399 if (!PopupMenu(hwnd, hwnd, hwndMenu))
400 NoFloat = FALSE;
401 }
402 if (msg == UM_CONTEXTMENU)
403 return 0;
404 break;
405
406 case WM_BUTTON2DBLCLK:
407 if (!(SHORT2FROMMP(mp2) & KC_SHIFT)) {
408 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(MINI_FLOAT, 0), MPVOID);
409 break;
410 }
411 /* else intentional fallthru */
412 case WM_CHORD:
413 case WM_BUTTON3DBLCLK:
414 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(MINI_SHOW, 0), MPVOID);
415 break;
416
417 case UM_BUTTON1MOTIONSTART:
418 case WM_BUTTON1MOTIONSTART:
419 {
420 TRACKINFO TrackInfo;
421 SWP Position;
422
423 memset(&TrackInfo, 0, sizeof(TrackInfo));
424 TrackInfo.cxBorder = 1;
425 TrackInfo.cyBorder = 1;
426 TrackInfo.cxGrid = 1;
427 TrackInfo.cyGrid = 1;
428 TrackInfo.cxKeyboard = 8;
429 TrackInfo.cyKeyboard = 8;
430 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &Position);
431 TrackInfo.rclTrack.xLeft = Position.x;
432 TrackInfo.rclTrack.xRight = Position.x + Position.cx;
433 TrackInfo.rclTrack.yBottom = Position.y;
434 TrackInfo.rclTrack.yTop = Position.y + Position.cy;
435 WinQueryWindowPos(HWND_DESKTOP, &Position);
436 TrackInfo.rclBoundary.xLeft = Position.x;
437 TrackInfo.rclBoundary.xRight = Position.x + Position.cx;
438 TrackInfo.rclBoundary.yBottom = Position.y;
439 TrackInfo.rclBoundary.yTop = Position.y + Position.cy;
440 TrackInfo.ptlMinTrackSize.x = 0;
441 TrackInfo.ptlMinTrackSize.y = 0;
442 TrackInfo.ptlMaxTrackSize.x = Position.cx;
443 TrackInfo.ptlMaxTrackSize.y = Position.cy;
444 TrackInfo.fs = TF_MOVE | TF_STANDARD | TF_ALLINBOUNDARY;
445 if (WinTrackRect(HWND_DESKTOP, (HPS) 0, &TrackInfo)) {
446 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
447 HWND_TOP, TrackInfo.rclTrack.xLeft,
448 TrackInfo.rclTrack.yBottom, 0, 0, SWP_MOVE);
449 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
450 }
451 }
452 break;
453
454 case WM_HELP:
455 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_HELP, 0), MPVOID);
456 break;
457
458 case WM_COMMAND:
459 switch (SHORT1FROMMP(mp1)) {
460 case IDM_COMMANDLINE:
461 case IDM_DOSCOMMANDLINE:
462 case IDM_WINFULLSCREEN:
463 {
464 CHAR *env = GetCmdSpec(FALSE), path[CCHMAXPATH];
465 INT type = SEPARATE | WINDOWED;
466
467 *path = 0;
468 TopWindowName(hwnd, (HWND) 0, path);
469 if (SHORT1FROMMP(mp1) == IDM_DOSCOMMANDLINE)
470 env = GetCmdSpec(TRUE);
471 else if (SHORT1FROMMP(mp1) != IDM_COMMANDLINE) {
472 env = "WINOS2.COM";
473 type = SEPARATE | FULLSCREEN;
474 }
475 runemf2(type, hwnd, pszSrcFile, __LINE__,
476 path, NULL, "%s", env);
477 }
478 break;
479
480 case IDM_HELP:
481 if (hwndHelp)
482 WinSendMsg(hwndHelp,
483 HM_DISPLAY_HELP,
484 MPFROM2SHORT(HELP_DATABAR, 0), MPFROMSHORT(HM_RESOURCEID));
485 break;
486
487 case MINI_CLOSE:
488 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
489 break;
490
491 case MINI_BORING:
492 fDullMin = (fDullMin) ? FALSE : TRUE;
493 PrfWriteProfileData(fmprof,
494 FM3Str, "DullDatabar", &fDullMin, sizeof(BOOL));
495 if (G_hevDataMin != NULLHANDLE) {
496 rc = DosPostEventSem(G_hevDataMin);
497 if (rc) {
498 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
499 GetPString(IDS_POSTSEMFAILED));
500 }
501 }
502
503 break;
504
505 case MINI_INCLREMOTE:
506 case MINI_SHOW:
507 if (SHORT1FROMMP(mp1) == MINI_SHOW) {
508 fDataShowDrives = (fDataShowDrives) ? FALSE : TRUE;
509 PrfWriteProfileData(fmprof,
510 appname,
511 "DataShowDrives", &fDataShowDrives, sizeof(BOOL));
512 }
513 else {
514 fDataInclRemote = (fDataInclRemote) ? FALSE : TRUE;
515 PrfWriteProfileData(fmprof,
516 appname,
517 "DataInclRemote", &fDataInclRemote, sizeof(BOOL));
518 }
519 {
520 HENUM henum;
521 HWND hwndChild;
522 USHORT id;
523
524 henum = WinBeginEnumWindows(hwnd);
525 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
526 id = WinQueryWindowUShort(hwndChild, QWS_ID);
527 if (id >= MINI_DRIVEA)
528 WinDestroyWindow(hwndChild);
529 }
530 WinEndEnumWindows(henum);
531 }
532 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
533 break;
534
535 case MINI_FLOAT:
536 fDataToFore = (fDataToFore) ? FALSE : TRUE;
537 PrfWriteProfileData(fmprof,
538 appname, "DataToFore", &fDataToFore, sizeof(BOOL));
539 if (!hwndMain) {
540
541 SWCNTRL swcntrl;
542 HSWITCH hswitch;
543
544 hswitch = (HSWITCH) WinQuerySwitchHandle(hwnd, (PID) 0);
545 if (hswitch) {
546 memset(&swcntrl, 0, sizeof(SWCNTRL));
547 if (!WinQuerySwitchEntry(hswitch, &swcntrl)) {
548 swcntrl.fbJump = (fDataToFore) ? SWL_NOTJUMPABLE : SWL_JUMPABLE;
549 WinChangeSwitchEntry(hswitch, &swcntrl);
550 }
551 }
552 }
553 break;
554 }
555 return 0;
556
557 case WM_SIZE:
558 WinSetWindowPos(hwnd,
559 HWND_TOP,
560 0,
561 0,
562 SHORT1FROMMP(mp2),
563 SHORT2FROMMP(mp2), SWP_MOVE | SWP_SIZE);
564 break;
565
566 case WM_PAINT:
567 {
568 HPS hps;
569 POINTL ptl;
570 SWP swp;
571 RECTL rcl;
572
573 hps = WinBeginPaint(hwnd, (HPS) 0, &rcl);
574 if (hps) {
575 WinFillRect(hps, (PRECTL) & rcl, CLR_PALEGRAY);
576 GpiSetMix(hps, FM_OVERPAINT);
577 GpiSetColor(hps, CLR_WHITE);
578 WinQueryWindowPos(hwnd, &swp);
579 ptl.x = 0;
580 ptl.y = 0;
581 GpiMove(hps, &ptl);
582 ptl.y = swp.cy - 1;
583 GpiLine(hps, &ptl);
584 ptl.x = swp.cx - 1;
585 GpiLine(hps, &ptl);
586 GpiSetColor(hps, CLR_DARKGRAY);
587 ptl.y = 0;
588 GpiLine(hps, &ptl);
589 ptl.x = 0;
590 GpiLine(hps, &ptl);
591 {
592 HENUM henum;
593 HWND hwndTemp;
594
595 henum = WinBeginEnumWindows(hwnd);
596 while ((hwndTemp = WinGetNextWindow(henum)) != NULLHANDLE) {
597 PaintRecessedWindow(hwndTemp,
598 hps, (WinQueryWindowUShort(hwndTemp, QWS_ID)
599 != MINI_TIME), FALSE);
600 }
601 WinEndEnumWindows(henum);
602 }
603 WinEndPaint(hps);
604 }
605 }
606 return 0;
607
608 case UM_PAINT:
609 {
610 CHAR s[90];
611 CHAR szFreeQty[38];
612 CHAR szDrvLtr[] = " :";
613 CHAR *pszFSystem;
614 ULONGLONG ullFreeQty;
615 ULONG ulPercentFree;
616 ULONG wasx;
617 HPS hps = (HPS) mp2;
618 HWND hwndChild;
619 USHORT id;
620 SWP swp;
621 POINTL ptl;
622 tDataMin *pDM;
623
624 id = SHORT1FROMMP(mp1);
625 if (id >= MINI_DRIVEA) {
626 hwndChild = WinWindowFromID(hwnd, id);
627 if (!hwndChild)
628 return 0;
629 if (!WinQueryWindowPos(hwndChild, &swp))
630 return 0;
631 pDM = WinQueryWindowPtr(hwndChild, QWL_DATAMIN_PTR);
632 if (!pDM || pDM->qfsi_rc) {
633 ullFreeQty = 0;
634 ulPercentFree = 0;
635 }
636 else {
637 ullFreeQty = (ULONGLONG) pDM->fsa.cUnitAvail *
638 (pDM->fsa.cSectorUnit * pDM->fsa.cbSector);
639
640 ulPercentFree = (pDM->fsa.cUnit && pDM->fsa.cUnitAvail) ?
641 (pDM->fsa.cUnitAvail * 100) / pDM->fsa.cUnit : 0;
642 }
643
644 CommaFmtULL(szFreeQty, sizeof(szFreeQty), ullFreeQty, ' ');
645 *szDrvLtr = (CHAR) (id - MINI_DRIVEA) + 'A';
646
647 if (!pDM || pDM->qfsi_rc || pDM->qfsa_rc)
648 pszFSystem = "N/A";
649 else {
650 pszFSystem = (PCHAR)(pDM->fsqb2.szName) + pDM->fsqb2.cbName + 1;
651 pszFSystem[15] = 0;
652 }
653 sprintf(s,
654 "%s %13s %lu%%-%s %6s ",
655 szDrvLtr,
656 szFreeQty,
657 ulPercentFree, GetPString(IDS_FREETEXT), pszFSystem);
658 if (!hps)
659 hps = WinGetPS(hwndChild);
660 if (hps) {
661 if (!fDullMin) {
662 ptl.x = 0;
663 ptl.y = 0;
664 GpiMove(hps, &ptl);
665 GpiSetColor(hps, CLR_BLACK);
666 ptl.x = swp.cx - 1;
667 ptl.y = swp.cy - 1;
668 GpiBox(hps, DRO_OUTLINE, &ptl, 0, 0);
669 ptl.x = 1;
670 ptl.y = 1;
671 if (ulPercentFree) {
672 GpiMove(hps, &ptl);
673 GpiSetColor(hps,
674 (ulPercentFree < 11) ? CLR_DARKRED :
675 (ulPercentFree < 26) ? CLR_DARKBLUE :
676 CLR_DARKGREEN);
677 ptl.y = swp.cy - 2;
678 ptl.x = ((swp.cx - 2) * ulPercentFree) / 100;
679 wasx = ptl.x;
680 GpiBox(hps, DRO_OUTLINEFILL, &ptl, 0, 0);
681 GpiSetColor(hps,
682 (ulPercentFree < 11) ? CLR_RED :
683 (ulPercentFree < 26) ? CLR_BLUE : CLR_GREEN);
684 ptl.x = wasx;
685 ptl.y = swp.cy - 2;
686 GpiMove(hps, &ptl);
687 ptl.x = 1;
688 GpiLine(hps, &ptl);
689 ptl.y = 2;
690 ptl.x = 1;
691 GpiLine(hps, &ptl);
692 ptl.x = wasx;
693 }
694 if (ulPercentFree < 99) {
695 GpiSetColor(hps, CLR_DARKGRAY);
696 wasx = ptl.x;
697 ptl.y = 2;
698 GpiMove(hps, &ptl);
699 ptl.y = swp.cy - 2;
700 ptl.x = swp.cx - 2;
701 GpiBox(hps, DRO_OUTLINEFILL, &ptl, 0, 0);
702 ptl.x = wasx;
703 GpiMove(hps, &ptl);
704 GpiSetColor(hps, CLR_PALEGRAY);
705 ptl.x = swp.cx - 3;
706 GpiLine(hps, &ptl);
707 ptl.x = wasx;
708 ptl.y = 1;
709 GpiMove(hps, &ptl);
710 GpiSetColor(hps, CLR_BLACK);
711 ptl.x = swp.cx - 2;
712 GpiLine(hps, &ptl);
713 ptl.y = swp.cy - 3;
714 GpiLine(hps, &ptl);
715 }
716 GpiSetColor(hps, CLR_WHITE);
717 }
718 else {
719 GpiSetColor(hps, CLR_PALEGRAY);
720 ptl.x = 0;
721 ptl.y = 0;
722 GpiMove(hps, &ptl);
723 ptl.x = swp.cx - 1;
724 ptl.y = swp.cy - 1;
725 GpiBox(hps, DRO_OUTLINEFILL, &ptl, 0, 0);
726 GpiSetColor(hps,
727 (ulPercentFree < 11) ? CLR_DARKRED : CLR_DARKBLUE);
728 }
729 GpiSetBackMix(hps, BM_LEAVEALONE);
730 GpiSetMix(hps, FM_OVERPAINT);
731 {
732 POINTL aptl[TXTBOX_COUNT];
733
734 GpiQueryTextBox(hps, strlen(s), s, TXTBOX_COUNT, aptl);
735 ptl.y = ((swp.cy / 2) -
736 ((aptl[TXTBOX_TOPRIGHT].y +
737 aptl[TXTBOX_BOTTOMLEFT].y) / 2));
738 ptl.y++;
739 ptl.x = (swp.cx / 2) - (aptl[TXTBOX_TOPRIGHT].x / 2);
740 if (ptl.x < 2)
741 ptl.x = 2;
742 GpiCharStringAt(hps, &ptl, strlen(s), s);
743 }
744 if (!mp2)
745 WinReleasePS(hps);
746 }
747 } // if drive window
748 }
749 return 0;
750
751 case UM_TIMER:
752 {
753 CHAR s[134], szDate[DATE_BUF_BYTES];
754 DATETIME dt;
755
756 if (fDataToFore && !NoFloat)
757 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
758 HWND_TOP, 0, 0, 0, 0, SWP_ZORDER);
759 if (counter && (counter % 19) && (counter % 20)) {
760 if (!DosGetDateTime(&dt)) {
761 DTDateFormat(szDate, dt);
762 sprintf(s,
763 " %02hu%s%02hu%s%02hu %s %s",
764 dt.hours, TimeSeparator,
765 dt.minutes, TimeSeparator,
766 dt.seconds,
767 GetPString(IDS_SUNDAY + dt.weekday),
768 szDate);
769 WinSetDlgItemText(hwnd, MINI_TIME, s);
770 }
771 }
772 else if (!counter || !(counter % 19))
773 PostMsg(hwnd, UM_SETUP6, MPVOID, MPVOID); // Uptime
774 if (!(counter % 4)) {
775 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID); // Memory utilization
776 if (!(counter % 10)) {
777 PostMsg(hwnd, UM_SETUP5, MPVOID, MPVOID); // Process status
778 if (!(counter % 20)) {
779 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID); // Swapper
780 }
781 }
782 }
783 }
784 counter++;
785 return 0;
786
787 case UM_SETUP2:
788 {
789 CHAR s[134], szFileQty[38], szFreeQty[38];
790 FILEFINDBUF3L ffb;
791 ULONG nm = 1;
792 ULONGLONG ullFreeQty;
793 HDIR hdir = HDIR_CREATE;
794 FSALLOCATE fsa;
795
796 if (*SwapperDat) {
797 DosError(FERR_DISABLEHARDERR);
798 if (!xDosFindFirst(SwapperDat, &hdir, FILE_NORMAL | FILE_HIDDEN |
799 FILE_SYSTEM | FILE_ARCHIVED | FILE_READONLY,
800 &ffb, sizeof(ffb), &nm, FIL_STANDARDL)) {
801 priority_bumped();
802 DosFindClose(hdir);
803 DosError(FERR_DISABLEHARDERR);
804 if (!DosQueryFSInfo(toupper(*SwapperDat) - '@', FSIL_ALLOC,
805 &fsa, sizeof(FSALLOCATE))) {
806 ullFreeQty =
807 (ULONGLONG) fsa.cUnitAvail * (fsa.cSectorUnit * fsa.cbSector);
808 CommaFmtULL(szFreeQty, sizeof(szFreeQty), ullFreeQty, ' ');
809 }
810 else
811 *szFreeQty = 0;
812
813 CommaFmtULL(szFileQty, sizeof(szFileQty), ffb.cbFile, ' ');
814 sprintf(s, " %s %s%s%s",
815 GetPString(IDS_SWAPTITLETEXT),
816 szFileQty, *szFreeQty ? "/" : NullStr, szFreeQty);
817 WinSetDlgItemText(hwnd, MINI_SWAP, s);
818 }
819 }
820 }
821 return 0;
822
823 case UM_SETUP3: // Memory utilization
824 {
825 CHAR s[134], tm[38], szQty[38];
826 ULONG amem = 0;
827
828 if (!DosQuerySysInfo(QSV_TOTAVAILMEM, QSV_TOTAVAILMEM,
829 (PVOID) & amem, (ULONG) sizeof(amem))) {
830 CommaFmtUL(tm, sizeof(tm), amem, 'M');
831 if (!Dos16MemAvail(&amem))
832 CommaFmtUL(szQty, sizeof(szQty), amem, 'M');
833 else
834 *szQty = 0;
835 sprintf(s, " %s%s%s%s",
836 GetPString(IDS_MEMTITLETEXT),
837 szQty, (*szQty) ? "/" : NullStr, tm);
838 WinSetDlgItemText(hwnd, MINI_MEM, s);
839 }
840 }
841 return 0;
842
843 case UM_SETUP5: // Process status
844 {
845 CHAR s[134], tm[38], szQty[38];
846
847 if (fUseQProcStat && !noqproc) {
848
849 PROCESSINFO *ppi;
850 BUFFHEADER *pbh = NULL;
851 MODINFO *pmi;
852 ULONG numprocs = 0, numthreads = 0;
853 APIRET rc;
854
855 rc = xDosAllocMem((PVOID)&pbh, USHRT_MAX + 4096,
856 PAG_COMMIT | PAG_READ | PAG_WRITE,
857 pszSrcFile, __LINE__);
858 if (rc)
859 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
860 GetPString(IDS_OUTOFMEMORY));
861 else {
862 if (DosQProcStatus((ULONG *)pbh, USHRT_MAX))
863 noqproc = TRUE;
864 else {
865 ppi = pbh->ppi;
866 while (ppi->ulEndIndicator != PROCESS_END_INDICATOR) {
867 pmi = pbh->pmi;
868 while (pmi && ppi->hModRef != pmi->hMod)
869 pmi = pmi->pNext;
870 if (pmi) {
871 numprocs++;
872 numthreads += ppi->usThreadCount;
873 }
874 ppi = (PPROCESSINFO) (ppi->ptiFirst + ppi->usThreadCount);
875 }
876 commafmt(szQty, sizeof(szQty), numprocs);
877 commafmt(tm, sizeof(tm), numthreads);
878 sprintf(s,
879 " %s%s %s%s",
880 GetPString(IDS_PROCSTITLETEXT),
881 szQty, GetPString(IDS_THRDSTITLETEXT), tm);
882 WinSetDlgItemText(hwnd, MINI_PROC, s);
883 }
884 DosFreeMem(pbh);
885 }
886 }
887 else if (fUseQSysState && !noqproc) {
888
889 QSPREC *ppi;
890 QSPTRREC *pbh = NULL;
891 QSLREC *pmi;
892 ULONG numprocs = 0, numthreads = 0;
893 APIRET rc;
894
895 rc = xDosAllocMem((PVOID) & pbh, USHRT_MAX + 4096,
896 PAG_COMMIT | PAG_READ | PAG_WRITE,
897 pszSrcFile, __LINE__);
898 if (rc)
899 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
900 GetPString(IDS_OUTOFMEMORY));
901 else { //2 Sep 07 GKY 0x05 = process & Mod data only
902 if (DosQuerySysState(QS_PROCESS | QS_MTE, 0, 0, 0, pbh, USHRT_MAX))
903 noqproc = TRUE;
904 else {
905 ppi = pbh->pProcRec;
906 while (ppi->RecType == 1) {
907 pmi = pbh->pLibRec;
908 while (pmi && ppi->hMte != pmi->hmte)
909 pmi = pmi->pNextRec;
910 if (pmi) {
911 numprocs++;
912 numthreads += ppi->cTCB;
913 }
914 ppi = (QSPREC *) (ppi->pThrdRec + ppi->cTCB);
915 }
916 commafmt(szQty, sizeof(szQty), numprocs);
917 commafmt(tm, sizeof(tm), numthreads);
918 sprintf(s,
919 " %s%s %s%s",
920 GetPString(IDS_PROCSTITLETEXT),
921 szQty, GetPString(IDS_THRDSTITLETEXT), tm);
922 WinSetDlgItemText(hwnd, MINI_PROC, s);
923 }
924 DosFreeMem(pbh);
925 }
926 }
927 else {
928 commafmt(szQty, sizeof(szQty),
929 WinQuerySwitchList(WinQueryAnchorBlock(hwnd), (PSWBLOCK) 0,
930 0));
931 sprintf(s, " %s%s", GetPString(IDS_TASKSTITLETEXT), szQty);
932 WinSetDlgItemText(hwnd, MINI_PROC, s);
933 }
934 }
935 return 0;
936
937 case UM_SETUP6: // Uptime
938 {
939 ULONG val = 0, numdays, nummins;
940 CHAR s[128];
941
942 if (!DosQuerySysInfo(QSV_MS_COUNT,
943 QSV_MS_COUNT,
944 (PVOID) & val, (ULONG) sizeof(val))) {
945 val /= 60000L;
946 numdays = val / (60L * 24L);
947 strcpy(s, GetPString(IDS_ELAPSEDTITLETEXT));
948 if (numdays)
949 sprintf(s + strlen(s),
950 " %lu %s%s, ",
951 numdays, GetPString(IDS_DAYTEXT), &"s"[numdays == 1L]);
952 nummins = val % (60L * 24L);
953 sprintf(s + strlen(s), " %lu%s%02lu", nummins / 60, TimeSeparator, nummins % 60);
954 WinSetDlgItemText(hwnd, MINI_TIME, s);
955 }
956 }
957 return 0;
958
959 case WM_SAVEAPPLICATION:
960 {
961 SWP swp;
962
963 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
964 PrfWriteProfileData(fmprof, appname, "DataMinPos", &swp, sizeof(SWP));
965 }
966 break;
967
968 case WM_CLOSE:
969 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
970 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
971 return 0;
972
973 case WM_DESTROY:
974 if (DataHwnd == WinQueryWindow(hwnd, QW_PARENT)) {
975 DataHwnd = (HWND) 0;
976 if (hwndMenu)
977 WinDestroyWindow(hwndMenu);
978 hwndMenu = (HWND) 0;
979 }
980 if (hwndMain) {
981
982 SWP swp;
983 ULONG fl = SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE, ofl;
984
985 ofl = WinQueryWindowULong(hwnd, QWL_USER);
986 WinQueryWindowPos(WinQueryWindow(hwndMain, QW_PARENT), &swp);
987 if (swp.fl & SWP_MINIMIZE)
988 fl |= ((ofl & SWP_MAXIMIZE) ? SWP_MAXIMIZE : SWP_RESTORE);
989 WinSetWindowPos(WinQueryWindow(hwndMain, QW_PARENT),
990 HWND_TOP, 0, 0, 0, 0, fl);
991 }
992 else if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
993 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
994 break;
995 }
996 return WinDefWindowProc(hwnd, msg, mp1, mp2);
997
998} // DataProc
999
1000//=== CreateDataBar - create databar windows ===
1001
1002HWND CreateDataBar(HWND hwndParent, ULONG fl)
1003{
1004 HWND hwndClient = (HWND) 0;
1005 ULONG FrameFlags = 0;
1006
1007 if (WinCreateStdWindow(hwndParent,
1008 WS_VISIBLE,
1009 &FrameFlags,
1010 WC_DATABAR,
1011 NULL, WS_VISIBLE, 0, MINI_FRAME, &hwndClient)) {
1012 WinSendMsg(hwndClient, UM_RESTORE, MPFROMLONG(fl), MPVOID);
1013 }
1014 return hwndClient;
1015
1016} // CreateDataBar
1017
1018//=== dataminThread - drive status thread ===
1019
1020static VOID dataminThread(VOID * pv)
1021{
1022 HAB hab = NULLHANDLE;
1023 HMQ hmq = NULLHANDLE;
1024 HWND hwndParent = (HWND) pv;
1025 HWND hwnd;
1026 HENUM henum;
1027 BOOL busy = TRUE;
1028 APIRET rc;
1029 USHORT id;
1030
1031# ifdef FORTIFY
1032 Fortify_EnterScope();
1033# endif
1034 if (G_hevDataMin == NULLHANDLE) {
1035 // Create just once for any thread that might use it
1036 // Kernel will clean up on exit
1037 rc = DosCreateEventSem(NULL, (PHEV) & G_hevDataMin, 0L, FALSE);
1038 if (rc) {
1039 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
1040 GetPString(IDS_CREATESEMFAILED));
1041 busy = FALSE;
1042 }
1043 }
1044
1045 // fixme to report errors
1046 hab = WinInitialize(0);
1047 if (hab == NULLHANDLE)
1048 busy = FALSE;
1049 else {
1050 hmq = WinCreateMsgQueue(hab, 0);
1051 if (hmq == NULLHANDLE)
1052 busy = FALSE;
1053 else
1054 WinCancelShutdown(hmq, TRUE);
1055 }
1056
1057 while (busy) {
1058 HWND hwndSingle = G_hwndSingle;
1059
1060 G_hwndSingle = NULLHANDLE;
1061
1062 busy = FALSE;
1063
1064 if (!WinIsWindow(hab, hwndParent))
1065 break;
1066
1067 henum = WinBeginEnumWindows(hwndParent);
1068 while (henum && (hwnd = WinGetNextWindow(henum)) != NULLHANDLE) {
1069 if (!WinIsWindow(hab, hwnd))
1070 continue;
1071 if (hwndSingle && hwndSingle != hwnd)
1072 continue;
1073 id = WinQueryWindowUShort(hwnd, QWS_ID);
1074 if (id > MINI_DRIVEA) {
1075 ULONG dskNum = id - MINI_DRIVEA + 1;
1076 tDataMin *pDM = WinQueryWindowPtr(hwnd, QWL_DATAMIN_PTR);
1077 SWP swp;
1078 CHAR szPath[] = " :";
1079
1080 if (!pDM)
1081 continue;
1082 busy = TRUE;
1083 if (!WinQueryWindowPos(hwnd, &swp))
1084 continue;
1085
1086 DosError(FERR_DISABLEHARDERR);
1087 pDM->qfsi_rc = DosQueryFSInfo(dskNum,
1088 FSIL_ALLOC,
1089 &pDM->fsa, sizeof(FSALLOCATE));
1090
1091 if (!pDM->qfsi_rc) {
1092 *szPath = (CHAR) dskNum + 'A' - 1;
1093 pDM->qfsa_cb = sizeof(FSQBUFFER2) + 256; // se tDataMin
1094 DosError(FERR_DISABLEHARDERR);
1095 pDM->qfsa_rc = DosQueryFSAttach(szPath, 0, /* Ordinal */
1096 FSAIL_QUERYNAME,
1097 &pDM->fsqb2, &pDM->qfsa_cb);
1098 }
1099 WinInvalidateRect(hwnd, NULL, FALSE);
1100 } // if drive window
1101 } // while henum
1102 WinEndEnumWindows(henum);
1103
1104 if (busy) {
1105 ULONG clPosted;
1106
1107 rc = DosWaitEventSem(G_hevDataMin, 20000L);
1108 if (rc && rc != ERROR_TIMEOUT) {
1109 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
1110 GetPString(IDS_POSTSEMFAILED));
1111 }
1112
1113 rc = DosResetEventSem(G_hevDataMin, &clPosted);
1114 if (rc && rc != ERROR_ALREADY_RESET) {
1115 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
1116 GetPString(IDS_POSTSEMFAILED));
1117 }
1118 }
1119
1120 } // while
1121
1122 if (hmq != NULLHANDLE)
1123 WinDestroyMsgQueue(hmq);
1124
1125 if (hab != NULLHANDLE)
1126 WinTerminate(hab);
1127# ifdef FORTIFY
1128 Fortify_LeaveScope();
1129# endif
1130} // dataminThread
1131
1132#pragma alloc_text(DATAMIN,DataDlgProc,MiniTimeProc)
Note: See TracBrowser for help on using the repository browser.