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
RevLine 
[30]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
[162]9 Copyright (c) 2001, 2005 Steven H. Levine
[30]10
[130]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
[136]14 23 May 05 SHL Avoid delays for inaccessible drives
[162]15 25 May 05 SHL Use ULONGLONG and CommaFmtULL
[204]16 06 Jun 05 SHL Drop unused code
[30]17
18***********************************************************************/
19
[2]20#define INCL_DOS
[136]21#define INCL_DOSERRORS
[2]22#define INCL_WIN
23#define INCL_GPI
[162]24#define INCL_LONGLONG
25#include <os2.h>
[2]26
27#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30#include <ctype.h>
31#include <limits.h>
[136]32
[2]33#include "fm3dll.h"
34#include "fm3dlg.h"
35#include "fm3str.h"
36#include "procstat.h"
[136]37#include "datamin.h"
[2]38
39#pragma data_seg(DATA2)
40#pragma alloc_text(DATAMIN,DataDlgProc,MiniTimeProc)
41
[136]42APIRET16 APIENTRY16 Dos16MemAvail(PULONG pulAvailMem);
[2]43
[136]44static volatile HEV G_hevDataMin = NULLHANDLE;
45static volatile HWND G_hwndSingle = NULLHANDLE;
[2]46
[136]47static VOID dataminThread (VOID *pv);
[2]48
[136]49long MINI_X = 208, MINI_Y = 16;
[2]50
[136]51//=== MiniTimeProc - time, swap and drive status mini windows procedure ===
[2]52
[136]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;
[2]64
[136]65 case WM_BUTTON1CLICK:
66 {
67 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
68
69 if (id >= MINI_DRIVEA)
[2]70 {
[136]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;
[2]99
[136]100 case WM_BUTTON1DBLCLK:
101 {
102 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID);
[2]103
[136]104 if (id >= MINI_DRIVEA && !hwndMain)
105 {
106 CHAR s[] = " :\\";
[2]107
[136]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 }
[2]124
125#ifdef NEVER
[136]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 }
[2]136#endif
137
[136]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 {
[2]150
[136]151 char s[5];
[2]152
[136]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);
[2]162 }
[136]163 }
164 break;
[2]165
[136]166 case WM_BUTTON1MOTIONSTART:
167 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
168 UM_BUTTON1MOTIONSTART,
169 MPVOID,
170 MPVOID);
171 break;
[2]172
[136]173 case WM_CONTEXTMENU:
174 PostMsg(WinQueryWindow(hwnd, QW_PARENT),
175 UM_CONTEXTMENU,
176 MPVOID,
177 MPVOID);
178 break;
[2]179
[136]180 case WM_PAINT:
181 {
182 MRESULT mr = 0;
183 USHORT id;
184
185 id = WinQueryWindowUShort(hwnd, QWS_ID);
186 if (id >= MINI_DRIVEA)
[2]187 {
[136]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;
[2]201
[136]202 case WM_DESTROY:
203 {
204 PVOID pv = WinQueryWindowPtr(hwnd, QWL_DATAMIN_PTR);
205 if (pv)
206 free(pv);
[2]207 }
[136]208 break;
[2]209 }
[136]210 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]211
[136]212} // MiniTimeProc
[2]213
[136]214//=== DataProc - databar client window procedure ===
[2]215
[136]216MRESULT EXPENTRY DataProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
217{
218 APIRET rc;
219
[2]220 static ULONG counter;
[136]221 static BOOL NoFloat, noqproc = FALSE, Positioned;
222 static HWND hwndMenu = (HWND) 0;
[2]223
[136]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;
[2]264 }
[136]265 for (c = 0; ids[c]; c++)
[2]266 {
[136]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);
[2]281 }
[136]282 }
283 if (!hwndMain)
284 {
285 SWCNTRL swctl;
[2]286
[136]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;
[2]302
[136]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 }
[2]362 }
[136]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;
[2]426 PostMsg(hwnd,
[136]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)
[2]468 return 0;
[136]469 break;
[2]470
[136]471 case WM_BUTTON2DBLCLK:
472 if (!(SHORT2FROMMP(mp2) & KC_SHIFT))
473 {
474 PostMsg(hwnd,
475 WM_COMMAND,
476 MPFROM2SHORT(MINI_FLOAT, 0),
477 MPVOID);
[2]478 break;
[136]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;
[2]488
[136]489 case UM_BUTTON1MOTIONSTART:
490 case WM_BUTTON1MOTIONSTART:
491 {
492 TRACKINFO TrackInfo;
493 SWP Position;
[2]494
[136]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))
[2]518 {
[136]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;
[2]526
[136]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);
[2]558 }
[136]559 break;
[2]560
[136]561 case IDM_HELP:
562 if (hwndHelp)
563 WinSendMsg(hwndHelp,
564 HM_DISPLAY_HELP,
565 MPFROM2SHORT(HELP_DATABAR, 0),
566 MPFROMSHORT(HM_RESOURCEID));
[2]567 break;
568
[136]569 case MINI_CLOSE:
570 PostMsg(hwnd,
571 WM_CLOSE,
572 MPVOID,
573 MPVOID);
[2]574 break;
575
[136]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 }
[2]595 }
[136]596
[2]597 break;
598
[136]599 case MINI_INCLREMOTE:
600 case MINI_SHOW:
601 if (SHORT1FROMMP(mp1) == MINI_SHOW)
[2]602 {
[136]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;
[2]623
[136]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);
[2]632 }
[136]633 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
[2]634 break;
635
[136]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 }
[2]661 break;
[136]662 }
663 return 0;
[2]664
[136]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;
[2]674
[136]675 case WM_PAINT:
676 {
677 HPS hps;
678 POINTL ptl;
679 SWP swp;
680 RECTL rcl;
[2]681
[136]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;
[2]708
[136]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;
[2]724
[136]725 case UM_PAINT:
726 {
727 CHAR s[90];
728 CHAR szFreeQty[38];
729 CHAR szDrvLtr[] = " :";
730 CHAR *pszFSystem;
[162]731 ULONGLONG ullFreeQty;
[136]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;
[2]740
[136]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 {
[162]752 ullFreeQty = 0;
[136]753 ulPercentFree = 0;
754 }
755 else
756 {
[162]757 ullFreeQty = (ULONGLONG)pDM -> fsa.cUnitAvail *
[136]758 (pDM -> fsa.cSectorUnit * pDM -> fsa.cbSector);
[2]759
[136]760 ulPercentFree = (pDM -> fsa.cUnit && pDM -> fsa.cUnitAvail) ?
761 (pDM -> fsa.cUnitAvail * 100) / pDM -> fsa.cUnit :
762 0;
763 }
[2]764
[162]765 CommaFmtULL(szFreeQty, sizeof(szFreeQty), ullFreeQty,' ');
[136]766 *szDrvLtr = (CHAR)(id - MINI_DRIVEA) + 'A';
[2]767
[136]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,
[162]777 " %s %s (%lu%%) %s [%s]",
[136]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];
[2]894
[136]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 }
[2]944 }
[136]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;
[2]962
[136]963 case UM_SETUP2:
964 {
[204]965 CHAR s[134], szFileQty[38], szFreeQty[38];
[136]966 FILEFINDBUF3 ffb;
967 ULONG nm = 1L;
[162]968 ULONGLONG ullFreeQty;
[136]969 HDIR hdir = HDIR_CREATE;
970 FSALLOCATE fsa;
[2]971
[136]972 if (*SwapperDat)
[2]973 {
[136]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 {
[162]985 ullFreeQty = (ULONGLONG)fsa.cUnitAvail * (fsa.cSectorUnit * fsa.cbSector);
986 CommaFmtULL(szFreeQty, sizeof(szFreeQty), ullFreeQty,' ');
[136]987 }
988 else
[162]989 *szFreeQty = 0;
990
991 CommaFmtULL(szFileQty, sizeof(szFileQty), ffb.cbFile,' ');
992 sprintf(s, " %s %s%s%s",
[136]993 GetPString(IDS_SWAPTITLETEXT),
994 szFileQty,
[162]995 *szFreeQty ? "/" : NullStr,
996 szFreeQty);
997 WinSetDlgItemText(hwnd,MINI_SWAP,s);
[136]998 }
999 }
1000 }
1001 return 0;
[2]1002
[136]1003 case UM_SETUP3: // Memory utilization
1004 {
[162]1005 CHAR s[134], tm[38], szQty[38];
[136]1006 ULONG amem = 0;
[2]1007
[136]1008 if (!DosQuerySysInfo(QSV_TOTAVAILMEM, QSV_TOTAVAILMEM,
1009 (PVOID) & amem, (ULONG) sizeof(amem)))
1010 {
[162]1011 CommaFmtUL(tm, sizeof(tm), amem,'M');
1012 if (!Dos16MemAvail(&amem))
1013 CommaFmtUL(szQty, sizeof(szQty), amem,'M');
[136]1014 else
[162]1015 *szQty = 0;
1016 sprintf(s, " %s%s%s%s",
[136]1017 GetPString(IDS_MEMTITLETEXT),
1018 szQty,
1019 (*szQty) ? "/" : NullStr,
[162]1020 tm);
[136]1021 WinSetDlgItemText(hwnd,
1022 MINI_MEM,
1023 s);
[2]1024 }
[136]1025 }
1026 return 0;
[2]1027
[136]1028 case UM_SETUP5: // Process status
1029 {
1030 CHAR s[134], tm[38], szQty[38];
1031
1032 if (fUseQProcStat && !noqproc)
[2]1033 {
1034
[136]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)
[36]1047 {
[136]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);
[36]1057 }
[136]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 }
[2]1074 }
[136]1075 else
[2]1076 {
[136]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);
[2]1086 }
[136]1087 }
1088 return 0;
[2]1089
[136]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)))
[2]1099 {
[136]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);
[2]1117 }
[136]1118 }
1119 return 0;
[2]1120
[136]1121 case WM_SAVEAPPLICATION:
1122 {
1123 SWP swp;
[2]1124
[136]1125 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
1126 PrfWriteProfileData(fmprof,
1127 appname,
1128 "DataMinPos",
1129 &swp,
1130 sizeof(SWP));
1131 }
1132 break;
[2]1133
[136]1134 case WM_CLOSE:
1135 WinSendMsg(hwnd,
1136 WM_SAVEAPPLICATION,
1137 MPVOID,
1138 MPVOID);
1139 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1140 return 0;
[2]1141
[136]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 {
[2]1152
[136]1153 SWP swp;
1154 ULONG fl = SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE, ofl;
[2]1155
[136]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);
[2]1179
[136]1180} // DataProc
[2]1181
[136]1182//=== CreateDataBar - create databar windows ===
[2]1183
[136]1184HWND CreateDataBar(HWND hwndParent, ULONG fl)
1185{
1186 HWND hwndClient = (HWND) 0;
1187 ULONG FrameFlags = 0;
[2]1188
[136]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;
[2]1205
[136]1206} // CreateDataBar
[2]1207
[136]1208//=== dataminThread - drive status thread ===
[2]1209
[136]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
[179]1238 // fixme to report errors
[136]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))
[2]1259 break;
1260
[136]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;
[2]1280
[136]1281 DosError(FERR_DISABLEHARDERR);
1282 pDM -> qfsi_rc = DosQueryFSInfo(dskNum,
1283 FSIL_ALLOC,
1284 &pDM -> fsa,
1285 sizeof(FSALLOCATE));
[2]1286
[136]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);
[2]1302
[136]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 );
[2]1316 }
1317
[136]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 }
[2]1330
[136]1331 } // while
[2]1332
[136]1333 if (hmq != NULLHANDLE)
1334 WinDestroyMsgQueue(hmq);
[2]1335
[136]1336 if (hab != NULLHANDLE)
1337 WinTerminate(hab);
1338
1339} // dataminThread
Note: See TracBrowser for help on using the repository browser.