source: trunk/dll/datamin.c@ 1178

Last change on this file since 1178 was 1178, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

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