source: trunk/dll/datamin.c@ 204

Last change on this file since 204 was 204, checked in by root, 20 years ago

Drop unused code

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 27.3 KB
Line 
1
2/***********************************************************************
3
4 $Id: datamin.c 204 2005-06-08 05:57:53Z root $
5
6 Minimized data bar
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2001, 2005 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
18***********************************************************************/
19
20#define INCL_DOS
21#define INCL_DOSERRORS
22#define INCL_WIN
23#define INCL_GPI
24#define INCL_LONGLONG
25#include <os2.h>
26
27#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30#include <ctype.h>
31#include <limits.h>
32
33#include "fm3dll.h"
34#include "fm3dlg.h"
35#include "fm3str.h"
36#include "procstat.h"
37#include "datamin.h"
38
39#pragma data_seg(DATA2)
40#pragma alloc_text(DATAMIN,DataDlgProc,MiniTimeProc)
41
42APIRET16 APIENTRY16 Dos16MemAvail(PULONG pulAvailMem);
43
44static volatile HEV G_hevDataMin = NULLHANDLE;
45static volatile HWND G_hwndSingle = NULLHANDLE;
46
47static VOID dataminThread (VOID *pv);
48
49long MINI_X = 208, MINI_Y = 16;
50
51//=== MiniTimeProc - time, swap and drive status mini windows procedure ===
52
53MRESULT EXPENTRY MiniTimeProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
54{
55 APIRET rc;
56 switch (msg)
57 {
58 case WM_CREATE:
59 {
60 PVOID pv = malloc(sizeof(tDataMin));
61 WinSetWindowPtr(hwnd, QWL_DATAMIN_PTR, pv);
62 }
63 break;
64
65 case WM_BUTTON1CLICK:
66 {
67 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
68
69 if (id >= MINI_DRIVEA)
70 {
71 if (G_hevDataMin != NULLHANDLE)
72 {
73 G_hwndSingle = hwnd;
74 rc = DosPostEventSem(G_hevDataMin);
75 if (rc)
76 {
77 Dos_Error(MB_ENTER,
78 rc,
79 HWND_DESKTOP,
80 __FILE__,
81 __LINE__,
82 "Post Semaphore failed" // GetPString(IDS_POSTSEMFAILED)
83 );
84 }
85 }
86 }
87 else if (id == MINI_TIME)
88 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
89 UM_SETUP6, // Up time
90 MPVOID,
91 MPVOID);
92 else if (id == MINI_PROC)
93 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
94 WM_SYSCOMMAND,
95 MPFROM2SHORT(SC_TASKMANAGER, 0),
96 MPVOID);
97 }
98 break;
99
100 case WM_BUTTON1DBLCLK:
101 {
102 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
103
104 if (id >= MINI_DRIVEA && !hwndMain)
105 {
106 CHAR s[] = " :\\";
107
108 *s = (CHAR) (id - MINI_DRIVEA) + 'A';
109 OpenDirCnr((HWND) 0,
110 HWND_DESKTOP,
111 (HWND) 0,
112 FALSE,
113 s);
114 return MRFROMLONG(1L);
115 }
116 else if (id == MINI_TIME)
117 {
118 OpenObject("<WP_CLOCK>",
119 (SHORT2FROMMP(mp2) & KC_SHIFT) ?
120 Default : Settings,
121 hwnd);
122 return MRFROMLONG(1L);
123 }
124
125#ifdef NEVER
126 else if (id == MINI_MEM)
127 {
128 WinDlgBox(HWND_DESKTOP,
129 HWND_DESKTOP,
130 SysInfoDlgProc,
131 FM3ModHandle,
132 SYS_FRAME,
133 NULL);
134 return MRFROMLONG(1L);
135 }
136#endif
137
138 else if (id == MINI_PROC || id == MINI_MEM)
139 {
140 WinDlgBox(HWND_DESKTOP,
141 hwnd,
142 KillDlgProc,
143 FM3ModHandle,
144 KILL_FRAME,
145 NULL);
146 return MRFROMLONG(1L);
147 }
148 else if (id == MINI_SWAP && *SwapperDat)
149 {
150
151 char s[5];
152
153 strncpy(s, SwapperDat, 4);
154 s[3] = 0;
155 WinDlgBox(HWND_DESKTOP,
156 hwndMain,
157 UndeleteDlgProc,
158 FM3ModHandle,
159 UNDEL_FRAME,
160 MPFROMP(s));
161 return MRFROMLONG(1L);
162 }
163 }
164 break;
165
166 case WM_BUTTON1MOTIONSTART:
167 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
168 UM_BUTTON1MOTIONSTART,
169 MPVOID,
170 MPVOID);
171 break;
172
173 case WM_CONTEXTMENU:
174 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
175 UM_CONTEXTMENU,
176 MPVOID,
177 MPVOID);
178 break;
179
180 case WM_PAINT:
181 {
182 MRESULT mr = 0;
183 USHORT id;
184
185 id = WinQueryWindowUShort(hwnd, QWS_ID);
186 if (id >= MINI_DRIVEA)
187 {
188 HPS hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
189 if (hps)
190 {
191 mr = WinSendMsg(WinQueryWindow(hwnd, QW_PARENT),
192 UM_PAINT,
193 MPFROM2SHORT(id, 0),
194 MPFROMLONG(hps));
195 WinEndPaint(hps);
196 return mr; // Bypass default paint
197 }
198 }
199 }
200 break;
201
202 case WM_DESTROY:
203 {
204 PVOID pv = WinQueryWindowPtr(hwnd, QWL_DATAMIN_PTR);
205 if (pv)
206 free(pv);
207 }
208 break;
209 }
210 return PFNWPStatic(hwnd, msg, mp1, mp2);
211
212} // MiniTimeProc
213
214//=== DataProc - databar client window procedure ===
215
216MRESULT EXPENTRY DataProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
217{
218 APIRET rc;
219
220 static ULONG counter;
221 static BOOL NoFloat, noqproc = FALSE, Positioned;
222 static HWND hwndMenu = (HWND) 0;
223
224 switch (msg)
225 {
226 case WM_CREATE:
227 if (DataHwnd)
228 {
229 WinSetWindowPos(DataHwnd,
230 HWND_TOP,
231 0,
232 0,
233 0,
234 0,
235 SWP_ZORDER | SWP_SHOW);
236 return MRFROMLONG(1L);
237 }
238 DataHwnd = WinQueryWindow(hwnd, QW_PARENT);
239 NoFloat = FALSE;
240 Positioned = FALSE;
241 SetPresParams(hwnd,
242 &RGBGREY,
243 &RGBBLACK,
244 &RGBBLACK,
245 GetPString(IDS_8HELVTEXT));
246 {
247 int c;
248 long x = 3;
249 USHORT ids[] = {MINI_TIME, MINI_MEM, MINI_SWAP, MINI_PROC, 0};
250 POINTL aptl[TXTBOX_COUNT];
251 HPS hps;
252
253 hps = WinGetPS(hwnd);
254 if (hps)
255 {
256 GpiQueryTextBox(hps,
257 34,
258 " -=03:08:22 SMW 1998/08/02=- ",
259 TXTBOX_COUNT,
260 aptl);
261 WinReleasePS(hps);
262 MINI_X = aptl[TXTBOX_TOPRIGHT].x + 6;
263 MINI_Y = aptl[TXTBOX_TOPRIGHT].y + 6;
264 }
265 for (c = 0; ids[c]; c++)
266 {
267 WinCreateWindow(hwnd,
268 GetPString(IDS_WCMINITIME),
269 NullStr,
270 SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE,
271 x,
272 3,
273 MINI_X,
274 MINI_Y,
275 hwnd,
276 HWND_TOP,
277 ids[c],
278 NULL,
279 NULL);
280 x += (MINI_X + 4);
281 }
282 }
283 if (!hwndMain)
284 {
285 SWCNTRL swctl;
286
287 memset(&swctl, 0, sizeof(swctl));
288 swctl.hwnd = WinQueryWindow(hwnd, QW_PARENT);
289 swctl.uchVisibility = SWL_VISIBLE;
290 swctl.fbJump = (fDataToFore) ? SWL_NOTJUMPABLE : SWL_JUMPABLE;
291 swctl.bProgType = PROG_PM;
292 strcpy(swctl.szSwtitle,
293 GetPString(IDS_DATABARTITLETEXT));
294 WinCreateSwitchEntry(WinQueryAnchorBlock(hwnd),
295 &swctl);
296 }
297 PostMsg(hwnd,
298 UM_SETUP,
299 MPVOID,
300 MPVOID);
301 return 0;
302
303 case WM_MENUEND:
304 NoFloat = FALSE;
305 if (hwndMenu == (HWND) mp2)
306 {
307 WinDestroyWindow(hwndMenu);
308 hwndMenu = (HWND) 0;
309 }
310 break;
311
312 case UM_RESTORE:
313 WinSetWindowPtr(hwnd, QWL_USER, mp1);
314 return 0;
315
316 case UM_SETUP:
317 {
318 long x, y;
319 SWP swp, swpD;
320 int c;
321 ULONG size = sizeof(SWP);
322 ULONG numdrives = 0;
323 ULONG drivestyle = (DRIVE_REMOVABLE | DRIVE_INVALID |
324 DRIVE_IGNORE | DRIVE_ZIPSTREAM);
325 ULONG ulDriveNum, ulDriveMap;
326
327 if (!fDataInclRemote)
328 drivestyle |= DRIVE_REMOTE;
329 if (fDataShowDrives)
330 {
331 DosError(FERR_DISABLEHARDERR);
332 DosQCurDisk(&ulDriveNum, &ulDriveMap);
333 x = 3;
334 y = MINI_Y + 4;
335 // Drive status windows
336 for (c = 2; c < 26; c++)
337 {
338 if ((ulDriveMap & (1L << c)) && !(driveflags[c] & drivestyle))
339 {
340 WinCreateWindow(hwnd,
341 GetPString(IDS_WCMINITIME),
342 NullStr,
343 SS_TEXT | DT_CENTER | DT_VCENTER | WS_VISIBLE,
344 x,
345 y,
346 MINI_X,
347 MINI_Y,
348 hwnd,
349 HWND_TOP,
350 MINI_DRIVEA + c,
351 NULL,
352 NULL);
353 numdrives++;
354 x += (MINI_X + 4);
355 if ((numdrives % 4) == 0)
356 {
357 y += (MINI_Y + 4);
358 x = 3;
359 }
360 }
361 }
362 }
363 x = (MINI_X * 4) + 18;
364 y = (MINI_Y + 4) + ((numdrives / 4) * (MINI_Y + 4)) +
365 (((numdrives % 4) != 0) * (MINI_Y + 4));
366 if (!Positioned)
367 {
368 if (PrfQueryProfileData(fmprof,
369 appname,
370 "DataMinPos",
371 &swp,
372 &size))
373 {
374 WinQueryWindowPos(HWND_DESKTOP, &swpD);
375 if (swp.x > swpD.cx - 16)
376 swp.x = swpD.cx - 16;
377 if (swp.y > swpD.cy - 16)
378 swp.y = swpD.cy - 16;
379 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
380 HWND_TOP,
381 swp.x,
382 swp.y,
383 x,
384 y,
385 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER);
386 }
387 else
388 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
389 HWND_TOP,
390 0,
391 0,
392 x,
393 y,
394 SWP_SHOW | SWP_SIZE | SWP_MOVE | SWP_ZORDER);
395 Positioned = TRUE;
396 }
397 else
398 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
399 HWND_TOP,
400 0,
401 0,
402 x,
403 y,
404 SWP_SHOW | SWP_SIZE | SWP_ZORDER);
405 WinShowWindow(WinQueryWindow(hwnd, QW_PARENT),
406 TRUE);
407 if (numdrives) {
408 if (_beginthread(dataminThread,
409 NULL,
410 32768,
411 (PVOID)hwnd) == -1)
412 {
413 Dos_Error(MB_ENTER,
414 _doserrno,
415 HWND_DESKTOP,
416 __FILE__,
417 __LINE__,
418 GetPString(IDS_COULDNTSTARTTHREADTEXT));
419 PostMsg(hwnd,
420 WM_CLOSE,
421 MPVOID,
422 MPVOID);
423 }
424 }
425 counter = 0;
426 PostMsg(hwnd,
427 UM_TIMER,
428 MPVOID,
429 MPVOID);
430 }
431 return 0; // UM_SETUP
432
433 case WM_BUTTON1DBLCLK:
434 if (hwndMain)
435 PostMsg(hwnd,
436 WM_CLOSE,
437 MPVOID,
438 MPVOID);
439 break;
440
441 case UM_CONTEXTMENU:
442 case WM_CONTEXTMENU:
443 if (!hwndMenu)
444 hwndMenu = WinLoadMenu(HWND_DESKTOP,
445 FM3ModHandle,
446 MINI_FRAME);
447 if (hwndMenu)
448 {
449 WinCheckMenuItem(hwndMenu,
450 MINI_FLOAT,
451 fDataToFore);
452 WinCheckMenuItem(hwndMenu,
453 MINI_SHOW,
454 fDataShowDrives);
455 WinCheckMenuItem(hwndMenu,
456 MINI_BORING,
457 fDullMin);
458 WinCheckMenuItem(hwndMenu,
459 MINI_INCLREMOTE,
460 fDataInclRemote);
461 NoFloat = TRUE;
462 if (!PopupMenu(hwnd,
463 hwnd,
464 hwndMenu))
465 NoFloat = FALSE;
466 }
467 if (msg == UM_CONTEXTMENU)
468 return 0;
469 break;
470
471 case WM_BUTTON2DBLCLK:
472 if (!(SHORT2FROMMP(mp2) & KC_SHIFT))
473 {
474 PostMsg(hwnd,
475 WM_COMMAND,
476 MPFROM2SHORT(MINI_FLOAT, 0),
477 MPVOID);
478 break;
479 }
480 /* else intentional fallthru */
481 case WM_CHORD:
482 case WM_BUTTON3DBLCLK:
483 PostMsg(hwnd,
484 WM_COMMAND,
485 MPFROM2SHORT(MINI_SHOW, 0),
486 MPVOID);
487 break;
488
489 case UM_BUTTON1MOTIONSTART:
490 case WM_BUTTON1MOTIONSTART:
491 {
492 TRACKINFO TrackInfo;
493 SWP Position;
494
495 memset(&TrackInfo, 0, sizeof(TrackInfo));
496 TrackInfo.cxBorder = 1;
497 TrackInfo.cyBorder = 1;
498 TrackInfo.cxGrid = 1;
499 TrackInfo.cyGrid = 1;
500 TrackInfo.cxKeyboard = 8;
501 TrackInfo.cyKeyboard = 8;
502 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &Position);
503 TrackInfo.rclTrack.xLeft = Position.x;
504 TrackInfo.rclTrack.xRight = Position.x + Position.cx;
505 TrackInfo.rclTrack.yBottom = Position.y;
506 TrackInfo.rclTrack.yTop = Position.y + Position.cy;
507 WinQueryWindowPos(HWND_DESKTOP, &Position);
508 TrackInfo.rclBoundary.xLeft = Position.x;
509 TrackInfo.rclBoundary.xRight = Position.x + Position.cx;
510 TrackInfo.rclBoundary.yBottom = Position.y;
511 TrackInfo.rclBoundary.yTop = Position.y + Position.cy;
512 TrackInfo.ptlMinTrackSize.x = 0;
513 TrackInfo.ptlMinTrackSize.y = 0;
514 TrackInfo.ptlMaxTrackSize.x = Position.cx;
515 TrackInfo.ptlMaxTrackSize.y = Position.cy;
516 TrackInfo.fs = TF_MOVE | TF_STANDARD | TF_ALLINBOUNDARY;
517 if (WinTrackRect(HWND_DESKTOP, (HPS) 0, &TrackInfo))
518 {
519 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
520 HWND_TOP, TrackInfo.rclTrack.xLeft,
521 TrackInfo.rclTrack.yBottom, 0, 0, SWP_MOVE);
522 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
523 }
524 }
525 break;
526
527 case WM_HELP:
528 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_HELP, 0), MPVOID);
529 break;
530
531 case WM_COMMAND:
532 switch (SHORT1FROMMP(mp1))
533 {
534 case IDM_COMMANDLINE:
535 case IDM_DOSCOMMANDLINE:
536 case IDM_WINFULLSCREEN:
537 {
538 CHAR *env = GetCmdSpec(FALSE), path[CCHMAXPATH];
539 INT type = SEPARATE | WINDOWED;
540
541 *path = 0;
542 TopWindowName(hwnd,
543 (HWND) 0,
544 path);
545 if (SHORT1FROMMP(mp1) == IDM_DOSCOMMANDLINE)
546 env = GetCmdSpec(TRUE);
547 else if (SHORT1FROMMP(mp1) != IDM_COMMANDLINE)
548 {
549 env = "WINOS2.COM";
550 type = SEPARATE | FULLSCREEN;
551 }
552 runemf2(type,
553 hwnd,
554 path,
555 NULL,
556 "%s",
557 env);
558 }
559 break;
560
561 case IDM_HELP:
562 if (hwndHelp)
563 WinSendMsg(hwndHelp,
564 HM_DISPLAY_HELP,
565 MPFROM2SHORT(HELP_DATABAR, 0),
566 MPFROMSHORT(HM_RESOURCEID));
567 break;
568
569 case MINI_CLOSE:
570 PostMsg(hwnd,
571 WM_CLOSE,
572 MPVOID,
573 MPVOID);
574 break;
575
576 case MINI_BORING:
577 fDullMin = (fDullMin) ? FALSE : TRUE;
578 PrfWriteProfileData(fmprof,
579 FM3Str,
580 "DullDatabar",
581 &fDullMin,
582 sizeof(BOOL));
583 if (G_hevDataMin != NULLHANDLE)
584 {
585 rc = DosPostEventSem(G_hevDataMin);
586 if (rc) {
587 Dos_Error(MB_ENTER,
588 rc,
589 HWND_DESKTOP,
590 __FILE__,
591 __LINE__,
592 "Post Semaphore failed" // GetPString(IDS_POSTSEMFAILED)
593 );
594 }
595 }
596
597 break;
598
599 case MINI_INCLREMOTE:
600 case MINI_SHOW:
601 if (SHORT1FROMMP(mp1) == MINI_SHOW)
602 {
603 fDataShowDrives = (fDataShowDrives) ? FALSE : TRUE;
604 PrfWriteProfileData(fmprof,
605 appname,
606 "DataShowDrives",
607 &fDataShowDrives,
608 sizeof(BOOL));
609 }
610 else
611 {
612 fDataInclRemote = (fDataInclRemote) ? FALSE : TRUE;
613 PrfWriteProfileData(fmprof,
614 appname,
615 "DataInclRemote",
616 &fDataInclRemote,
617 sizeof(BOOL));
618 }
619 {
620 HENUM henum;
621 HWND hwndChild;
622 USHORT id;
623
624 henum = WinBeginEnumWindows(hwnd);
625 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
626 {
627 id = WinQueryWindowUShort(hwndChild, QWS_ID);
628 if (id >= MINI_DRIVEA)
629 WinDestroyWindow(hwndChild);
630 }
631 WinEndEnumWindows(henum);
632 }
633 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
634 break;
635
636 case MINI_FLOAT:
637 fDataToFore = (fDataToFore) ? FALSE : TRUE;
638 PrfWriteProfileData(fmprof,
639 appname,
640 "DataToFore",
641 &fDataToFore,
642 sizeof(BOOL));
643 if (!hwndMain)
644 {
645
646 SWCNTRL swcntrl;
647 HSWITCH hswitch;
648
649 hswitch = (HSWITCH) WinQuerySwitchHandle(hwnd, (PID) 0);
650 if (hswitch)
651 {
652 memset(&swcntrl, 0, sizeof(SWCNTRL));
653 if (!WinQuerySwitchEntry(hswitch, &swcntrl))
654 {
655 swcntrl.fbJump = (fDataToFore) ? SWL_NOTJUMPABLE : SWL_JUMPABLE;
656 WinChangeSwitchEntry(hswitch,
657 &swcntrl);
658 }
659 }
660 }
661 break;
662 }
663 return 0;
664
665 case WM_SIZE:
666 WinSetWindowPos(hwnd,
667 HWND_TOP,
668 0,
669 0,
670 SHORT1FROMMP(mp2),
671 SHORT2FROMMP(mp2),
672 SWP_MOVE | SWP_SIZE);
673 break;
674
675 case WM_PAINT:
676 {
677 HPS hps;
678 POINTL ptl;
679 SWP swp;
680 RECTL rcl;
681
682 hps = WinBeginPaint(hwnd,
683 (HPS) 0,
684 &rcl);
685 if (hps)
686 {
687 WinFillRect(hps,
688 (PRECTL) & rcl,
689 CLR_PALEGRAY);
690 GpiSetMix(hps, FM_OVERPAINT);
691 GpiSetColor(hps, CLR_WHITE);
692 WinQueryWindowPos(hwnd, &swp);
693 ptl.x = 0;
694 ptl.y = 0;
695 GpiMove(hps, &ptl);
696 ptl.y = swp.cy - 1;
697 GpiLine(hps, &ptl);
698 ptl.x = swp.cx - 1;
699 GpiLine(hps, &ptl);
700 GpiSetColor(hps, CLR_DARKGRAY);
701 ptl.y = 0;
702 GpiLine(hps, &ptl);
703 ptl.x = 0;
704 GpiLine(hps, &ptl);
705 {
706 HENUM henum;
707 HWND hwndTemp;
708
709 henum = WinBeginEnumWindows(hwnd);
710 while ((hwndTemp = WinGetNextWindow(henum)) != NULLHANDLE)
711 {
712 PaintRecessedWindow(hwndTemp,
713 hps,
714 (WinQueryWindowUShort(hwndTemp, QWS_ID)
715 != MINI_TIME),
716 FALSE);
717 }
718 WinEndEnumWindows(henum);
719 }
720 WinEndPaint(hps);
721 }
722 }
723 return 0;
724
725 case UM_PAINT:
726 {
727 CHAR s[90];
728 CHAR szFreeQty[38];
729 CHAR szDrvLtr[] = " :";
730 CHAR *pszFSystem;
731 ULONGLONG ullFreeQty;
732 ULONG ulPercentFree;
733 ULONG wasx;
734 HPS hps = (HPS) mp2;
735 HWND hwndChild;
736 USHORT id;
737 SWP swp;
738 POINTL ptl;
739 tDataMin *pDM;
740
741 id = SHORT1FROMMP(mp1);
742 if (id >= MINI_DRIVEA)
743 {
744 hwndChild = WinWindowFromID(hwnd, id);
745 if (!hwndChild)
746 return 0;
747 if (!WinQueryWindowPos(hwndChild, &swp))
748 return 0;
749 pDM = WinQueryWindowPtr(hwndChild, QWL_DATAMIN_PTR);
750 if (!pDM || pDM -> qfsi_rc)
751 {
752 ullFreeQty = 0;
753 ulPercentFree = 0;
754 }
755 else
756 {
757 ullFreeQty = (ULONGLONG)pDM -> fsa.cUnitAvail *
758 (pDM -> fsa.cSectorUnit * pDM -> fsa.cbSector);
759
760 ulPercentFree = (pDM -> fsa.cUnit && pDM -> fsa.cUnitAvail) ?
761 (pDM -> fsa.cUnitAvail * 100) / pDM -> fsa.cUnit :
762 0;
763 }
764
765 CommaFmtULL(szFreeQty, sizeof(szFreeQty), ullFreeQty,' ');
766 *szDrvLtr = (CHAR)(id - MINI_DRIVEA) + 'A';
767
768 if (!pDM || pDM -> qfsi_rc || pDM -> qfsa_rc)
769 pszFSystem = "N/A";
770 else
771 {
772 pszFSystem = pDM -> fsqb2.szName +
773 pDM -> fsqb2.cbName + 1;
774 pszFSystem[15] = 0;
775 }
776 sprintf(s,
777 " %s %s (%lu%%) %s [%s]",
778 szDrvLtr,
779 szFreeQty,
780 ulPercentFree,
781 GetPString(IDS_FREETEXT),
782 pszFSystem);
783 if (!hps)
784 hps = WinGetPS(hwndChild);
785 if (hps)
786 {
787 if (!fDullMin)
788 {
789 ptl.x = 0;
790 ptl.y = 0;
791 GpiMove(hps,
792 &ptl);
793 GpiSetColor(hps,
794 CLR_BLACK);
795 ptl.x = swp.cx - 1;
796 ptl.y = swp.cy - 1;
797 GpiBox(hps,
798 DRO_OUTLINE,
799 &ptl,
800 0,
801 0);
802 ptl.x = 1;
803 ptl.y = 1;
804 if (ulPercentFree)
805 {
806 GpiMove(hps, &ptl);
807 GpiSetColor(hps,
808 (ulPercentFree < 11) ? CLR_DARKRED :
809 (ulPercentFree < 26) ? CLR_DARKBLUE :
810 CLR_DARKGREEN);
811 ptl.y = swp.cy - 2;
812 ptl.x = ((swp.cx - 2) * ulPercentFree) / 100;
813 wasx = ptl.x;
814 GpiBox(hps,
815 DRO_OUTLINEFILL,
816 &ptl,
817 0,
818 0);
819 GpiSetColor(hps,
820 (ulPercentFree < 11) ? CLR_RED :
821 (ulPercentFree < 26) ? CLR_BLUE : CLR_GREEN);
822 ptl.x = wasx;
823 ptl.y = swp.cy - 2;
824 GpiMove(hps,
825 &ptl);
826 ptl.x = 1;
827 GpiLine(hps,
828 &ptl);
829 ptl.y = 2;
830 ptl.x = 1;
831 GpiLine(hps,
832 &ptl);
833 ptl.x = wasx;
834 }
835 if (ulPercentFree < 99)
836 {
837 GpiSetColor(hps,
838 CLR_DARKGRAY);
839 wasx = ptl.x;
840 ptl.y = 2;
841 GpiMove(hps, &ptl);
842 ptl.y = swp.cy - 2;
843 ptl.x = swp.cx - 2;
844 GpiBox(hps,
845 DRO_OUTLINEFILL,
846 &ptl,
847 0,
848 0);
849 ptl.x = wasx;
850 GpiMove(hps,
851 &ptl);
852 GpiSetColor(hps,
853 CLR_PALEGRAY);
854 ptl.x = swp.cx - 3;
855 GpiLine(hps, &ptl);
856 ptl.x = wasx;
857 ptl.y = 1;
858 GpiMove(hps, &ptl);
859 GpiSetColor(hps,
860 CLR_BLACK);
861 ptl.x = swp.cx - 2;
862 GpiLine(hps, &ptl);
863 ptl.y = swp.cy - 3;
864 GpiLine(hps, &ptl);
865 }
866 GpiSetColor(hps,
867 CLR_WHITE);
868 }
869 else
870 {
871 GpiSetColor(hps,
872 CLR_PALEGRAY);
873 ptl.x = 0;
874 ptl.y = 0;
875 GpiMove(hps,
876 &ptl);
877 ptl.x = swp.cx - 1;
878 ptl.y = swp.cy - 1;
879 GpiBox(hps,
880 DRO_OUTLINEFILL,
881 &ptl,
882 0,
883 0);
884 GpiSetColor(hps,
885 (ulPercentFree < 11) ? CLR_DARKRED :
886 CLR_DARKBLUE);
887 }
888 GpiSetBackMix(hps,
889 BM_LEAVEALONE);
890 GpiSetMix(hps,
891 FM_OVERPAINT);
892 {
893 POINTL aptl[TXTBOX_COUNT];
894
895 GpiQueryTextBox(hps,
896 strlen(s),
897 s,
898 TXTBOX_COUNT,
899 aptl);
900 ptl.y = ((swp.cy / 2) -
901 ((aptl[TXTBOX_TOPRIGHT].y +
902 aptl[TXTBOX_BOTTOMLEFT].y) / 2));
903 ptl.y++;
904 ptl.x = (swp.cx / 2) - (aptl[TXTBOX_TOPRIGHT].x / 2);
905 if (ptl.x < 2)
906 ptl.x = 2;
907 GpiCharStringAt(hps,
908 &ptl,
909 strlen(s),
910 s);
911 }
912 if (!mp2)
913 WinReleasePS(hps);
914 }
915 } // if drive window
916 }
917 return 0;
918
919 case UM_TIMER:
920 {
921 CHAR s[134];
922 DATETIME dt;
923
924 if (fDataToFore && !NoFloat)
925 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT),
926 HWND_TOP, 0, 0, 0, 0, SWP_ZORDER);
927 if (counter && (counter % 19) && (counter % 20))
928 {
929 if (!DosGetDateTime(&dt))
930 {
931 sprintf(s,
932 " %02hu:%02hu:%02hu %s %04u/%02u/%02u",
933 dt.hours,
934 dt.minutes,
935 dt.seconds,
936 GetPString(IDS_SUNDAY + dt.weekday),
937 dt.year,
938 dt.month,
939 dt.day);
940 WinSetDlgItemText(hwnd,
941 MINI_TIME,
942 s);
943 }
944 }
945 else if (!counter || !(counter % 19))
946 PostMsg(hwnd, UM_SETUP6, MPVOID, MPVOID); // Uptime
947 if (!(counter % 4))
948 {
949 PostMsg(hwnd, UM_SETUP3, MPVOID, MPVOID); // Memory utilization
950 if (!(counter % 10))
951 {
952 PostMsg(hwnd, UM_SETUP5, MPVOID, MPVOID); // Process status
953 if (!(counter % 20))
954 {
955 PostMsg(hwnd, UM_SETUP2, MPVOID, MPVOID); // Swapper
956 }
957 }
958 }
959 }
960 counter++;
961 return 0;
962
963 case UM_SETUP2:
964 {
965 CHAR s[134], szFileQty[38], szFreeQty[38];
966 FILEFINDBUF3 ffb;
967 ULONG nm = 1L;
968 ULONGLONG ullFreeQty;
969 HDIR hdir = HDIR_CREATE;
970 FSALLOCATE fsa;
971
972 if (*SwapperDat)
973 {
974 DosError(FERR_DISABLEHARDERR);
975 if (!DosFindFirst(SwapperDat, &hdir, FILE_NORMAL | FILE_HIDDEN |
976 FILE_SYSTEM | FILE_ARCHIVED | FILE_READONLY,
977 &ffb, sizeof(ffb), &nm, FIL_STANDARD))
978 {
979 priority_bumped();
980 DosFindClose(hdir);
981 DosError(FERR_DISABLEHARDERR);
982 if (!DosQueryFSInfo(toupper(*SwapperDat) - '@', FSIL_ALLOC,
983 &fsa, sizeof(FSALLOCATE)))
984 {
985 ullFreeQty = (ULONGLONG)fsa.cUnitAvail * (fsa.cSectorUnit * fsa.cbSector);
986 CommaFmtULL(szFreeQty, sizeof(szFreeQty), ullFreeQty,' ');
987 }
988 else
989 *szFreeQty = 0;
990
991 CommaFmtULL(szFileQty, sizeof(szFileQty), ffb.cbFile,' ');
992 sprintf(s, " %s %s%s%s",
993 GetPString(IDS_SWAPTITLETEXT),
994 szFileQty,
995 *szFreeQty ? "/" : NullStr,
996 szFreeQty);
997 WinSetDlgItemText(hwnd,MINI_SWAP,s);
998 }
999 }
1000 }
1001 return 0;
1002
1003 case UM_SETUP3: // Memory utilization
1004 {
1005 CHAR s[134], tm[38], szQty[38];
1006 ULONG amem = 0;
1007
1008 if (!DosQuerySysInfo(QSV_TOTAVAILMEM, QSV_TOTAVAILMEM,
1009 (PVOID) & amem, (ULONG) sizeof(amem)))
1010 {
1011 CommaFmtUL(tm, sizeof(tm), amem,'M');
1012 if (!Dos16MemAvail(&amem))
1013 CommaFmtUL(szQty, sizeof(szQty), amem,'M');
1014 else
1015 *szQty = 0;
1016 sprintf(s, " %s%s%s%s",
1017 GetPString(IDS_MEMTITLETEXT),
1018 szQty,
1019 (*szQty) ? "/" : NullStr,
1020 tm);
1021 WinSetDlgItemText(hwnd,
1022 MINI_MEM,
1023 s);
1024 }
1025 }
1026 return 0;
1027
1028 case UM_SETUP5: // Process status
1029 {
1030 CHAR s[134], tm[38], szQty[38];
1031
1032 if (fUseQProcStat && !noqproc)
1033 {
1034
1035 PROCESSINFO *ppi;
1036 BUFFHEADER *pbh = NULL;
1037 MODINFO *pmi;
1038 ULONG numprocs = 0, numthreads = 0;
1039
1040 if (!DosAllocMem((PVOID) & pbh, USHRT_MAX + 4096,
1041 PAG_COMMIT | OBJ_TILE | PAG_READ | PAG_WRITE))
1042 {
1043 if (!DosQProcStatus(pbh, USHRT_MAX))
1044 {
1045 ppi = pbh -> ppi;
1046 while (ppi -> ulEndIndicator != PROCESS_END_INDICATOR)
1047 {
1048 pmi = pbh -> pmi;
1049 while (pmi && ppi -> hModRef != pmi -> hMod)
1050 pmi = pmi -> pNext;
1051 if (pmi)
1052 {
1053 numprocs++;
1054 numthreads += ppi -> usThreadCount;
1055 }
1056 ppi = (PPROCESSINFO) (ppi -> ptiFirst + ppi -> usThreadCount);
1057 }
1058 commafmt(szQty, sizeof(szQty), numprocs);
1059 commafmt(tm, sizeof(tm), numthreads);
1060 sprintf(s,
1061 " %s%s %s%s",
1062 GetPString(IDS_PROCSTITLETEXT),
1063 szQty,
1064 GetPString(IDS_THRDSTITLETEXT),
1065 tm);
1066 WinSetDlgItemText(hwnd,
1067 MINI_PROC,
1068 s);
1069 }
1070 else
1071 noqproc = TRUE;
1072 DosFreeMem(pbh);
1073 }
1074 }
1075 else
1076 {
1077 commafmt(szQty, sizeof(szQty),
1078 WinQuerySwitchList(WinQueryAnchorBlock(hwnd), (PSWBLOCK) 0, 0));
1079 sprintf(s,
1080 " %s%s",
1081 GetPString(IDS_TASKSTITLETEXT),
1082 szQty);
1083 WinSetDlgItemText(hwnd,
1084 MINI_PROC,
1085 s);
1086 }
1087 }
1088 return 0;
1089
1090 case UM_SETUP6: // Uptime
1091 {
1092 ULONG val = 0, numdays, nummins;
1093 CHAR s[128];
1094
1095 if (!DosQuerySysInfo(QSV_MS_COUNT,
1096 QSV_MS_COUNT,
1097 (PVOID) & val,
1098 (ULONG) sizeof(val)))
1099 {
1100 val /= 60000L;
1101 numdays = val / (60L * 24L);
1102 strcpy(s, GetPString(IDS_ELAPSEDTITLETEXT));
1103 if (numdays)
1104 sprintf(s + strlen(s),
1105 " %lu %s%s, ",
1106 numdays,
1107 GetPString(IDS_DAYTEXT),
1108 &"s"[numdays == 1L]);
1109 nummins = val % (60L * 24L);
1110 sprintf(s + strlen(s),
1111 " %lu:%02lu",
1112 nummins / 60,
1113 nummins % 60);
1114 WinSetDlgItemText(hwnd,
1115 MINI_TIME,
1116 s);
1117 }
1118 }
1119 return 0;
1120
1121 case WM_SAVEAPPLICATION:
1122 {
1123 SWP swp;
1124
1125 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
1126 PrfWriteProfileData(fmprof,
1127 appname,
1128 "DataMinPos",
1129 &swp,
1130 sizeof(SWP));
1131 }
1132 break;
1133
1134 case WM_CLOSE:
1135 WinSendMsg(hwnd,
1136 WM_SAVEAPPLICATION,
1137 MPVOID,
1138 MPVOID);
1139 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1140 return 0;
1141
1142 case WM_DESTROY:
1143 if (DataHwnd == WinQueryWindow(hwnd, QW_PARENT))
1144 {
1145 DataHwnd = (HWND)0;
1146 if (hwndMenu)
1147 WinDestroyWindow(hwndMenu);
1148 hwndMenu = (HWND)0;
1149 }
1150 if (hwndMain)
1151 {
1152
1153 SWP swp;
1154 ULONG fl = SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE, ofl;
1155
1156 ofl = WinQueryWindowULong(hwnd, QWL_USER);
1157 WinQueryWindowPos(WinQueryWindow(hwndMain, QW_PARENT), &swp);
1158 if (swp.fl & SWP_MINIMIZE)
1159 fl |= ((ofl & SWP_MAXIMIZE) ? SWP_MAXIMIZE : SWP_RESTORE);
1160 WinSetWindowPos(WinQueryWindow(hwndMain, QW_PARENT),
1161 HWND_TOP,
1162 0,
1163 0,
1164 0,
1165 0,
1166 fl);
1167 }
1168 else if (!PostMsg((HWND)0,
1169 WM_QUIT,
1170 MPVOID,
1171 MPVOID))
1172 WinSendMsg((HWND)0,
1173 WM_QUIT,
1174 MPVOID,
1175 MPVOID);
1176 break;
1177 }
1178 return WinDefWindowProc(hwnd, msg, mp1, mp2);
1179
1180} // DataProc
1181
1182//=== CreateDataBar - create databar windows ===
1183
1184HWND CreateDataBar(HWND hwndParent, ULONG fl)
1185{
1186 HWND hwndClient = (HWND) 0;
1187 ULONG FrameFlags = 0;
1188
1189 if (WinCreateStdWindow(hwndParent,
1190 WS_VISIBLE,
1191 &FrameFlags,
1192 GetPString(IDS_WCDATABAR),
1193 NULL,
1194 WS_VISIBLE,
1195 0,
1196 MINI_FRAME,
1197 &hwndClient))
1198 {
1199 WinSendMsg(hwndClient,
1200 UM_RESTORE,
1201 MPFROMLONG(fl),
1202 MPVOID);
1203 }
1204 return hwndClient;
1205
1206} // CreateDataBar
1207
1208//=== dataminThread - drive status thread ===
1209
1210static VOID dataminThread (VOID *pv)
1211{
1212 HAB hab = NULLHANDLE;
1213 HMQ hmq = NULLHANDLE;
1214 HWND hwndParent = (HWND)pv;
1215 HWND hwnd;
1216 HENUM henum;
1217 BOOL busy = TRUE;
1218 APIRET rc;
1219 USHORT id;
1220
1221 if (G_hevDataMin == NULLHANDLE)
1222 {
1223 // Create just once for any thread that might use it
1224 // Kernel will clean up on exit
1225 rc = DosCreateEventSem(NULL,(PHEV)&G_hevDataMin,0L,FALSE);
1226 if (rc) {
1227 Dos_Error(MB_ENTER,
1228 rc,
1229 HWND_DESKTOP,
1230 __FILE__,
1231 __LINE__,
1232 "Create Semaphore failed" // GetPString(IDS_CREATESEMFAILED)
1233 );
1234 busy = FALSE;
1235 }
1236 }
1237
1238 // fixme to report errors
1239 hab = WinInitialize(0);
1240 if (hab == NULLHANDLE)
1241 busy = FALSE;
1242 else
1243 {
1244 hmq = WinCreateMsgQueue(hab,0);
1245 if (hmq == NULLHANDLE)
1246 busy = FALSE;
1247 else
1248 WinCancelShutdown(hmq,TRUE);
1249 }
1250
1251 while (busy)
1252 {
1253 HWND hwndSingle = G_hwndSingle;
1254 G_hwndSingle = NULLHANDLE;
1255
1256 busy = FALSE;
1257
1258 if (!WinIsWindow(hab,hwndParent))
1259 break;
1260
1261 henum = WinBeginEnumWindows(hwndParent);
1262 while(henum && (hwnd = WinGetNextWindow(henum)) != NULLHANDLE)
1263 {
1264 if (!WinIsWindow(hab,hwnd))
1265 continue;
1266 if (hwndSingle && hwndSingle != hwnd)
1267 continue;
1268 id = WinQueryWindowUShort(hwnd,QWS_ID);
1269 if (id > MINI_DRIVEA )
1270 {
1271 ULONG dskNum = id - MINI_DRIVEA + 1;
1272 tDataMin *pDM = WinQueryWindowPtr(hwnd, QWL_DATAMIN_PTR);
1273 SWP swp;
1274 CHAR szPath[] = " :";
1275 if (!pDM)
1276 continue;
1277 busy = TRUE;
1278 if (!WinQueryWindowPos(hwnd, &swp))
1279 continue;
1280
1281 DosError(FERR_DISABLEHARDERR);
1282 pDM -> qfsi_rc = DosQueryFSInfo(dskNum,
1283 FSIL_ALLOC,
1284 &pDM -> fsa,
1285 sizeof(FSALLOCATE));
1286
1287 if (!pDM -> qfsi_rc)
1288 {
1289 *szPath = (CHAR) dskNum + 'A' - 1;
1290 pDM -> qfsa_cb = sizeof(FSQBUFFER2) + 256; // se tDataMin
1291 DosError(FERR_DISABLEHARDERR);
1292 pDM -> qfsa_rc = DosQueryFSAttach(szPath,
1293 0, /* Ordinal */
1294 FSAIL_QUERYNAME,
1295 &pDM -> fsqb2,
1296 &pDM -> qfsa_cb);
1297 }
1298 WinInvalidateRect(hwnd, NULL, FALSE);
1299 } // if drive window
1300 } // while henum
1301 WinEndEnumWindows(henum);
1302
1303 if (busy)
1304 {
1305 ULONG clPosted;
1306 rc = DosWaitEventSem(G_hevDataMin,20000L);
1307 if (rc && rc != ERROR_TIMEOUT)
1308 {
1309 Dos_Error(MB_ENTER,
1310 rc,
1311 HWND_DESKTOP,
1312 __FILE__,
1313 __LINE__,
1314 "Wait Semaphore failed" // GetPString(IDS_POSTSEMFAILED)
1315 );
1316 }
1317
1318 rc = DosResetEventSem(G_hevDataMin,&clPosted);
1319 if (rc && rc != ERROR_ALREADY_RESET)
1320 {
1321 Dos_Error(MB_ENTER,
1322 rc,
1323 HWND_DESKTOP,
1324 __FILE__,
1325 __LINE__,
1326 "Reset Semaphore failed" // GetPString(IDS_POSTSEMFAILED)
1327 );
1328 }
1329 }
1330
1331 } // while
1332
1333 if (hmq != NULLHANDLE)
1334 WinDestroyMsgQueue(hmq);
1335
1336 if (hab != NULLHANDLE)
1337 WinTerminate(hab);
1338
1339} // dataminThread
Note: See TracBrowser for help on using the repository browser.