source: trunk/dll/datamin.c@ 30

Last change on this file since 30 was 30, checked in by root, 23 years ago

Handle large partitions

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