/**************/ /* resmeter.c */ /**************************************************************************** PROGRAM: ResMeter.c Windows: Vain WIn 3.1, koska GetFreeSystemResources ei ole WIN32:ssa. PURPOSE: Näyttää jäljellä olevat resurssit Editor: Vesa Lappalainen 20.10.1993 Project: resmeter.c, resmeter.rc, resmeter.def ALI\tabhand.c, ALI\mdialog.c, ALI\savepos.c ****************************************************************************/ #include "tabhand.h" #include "SavePos.h" #include "ResMeter.h" #define UPDATE_TIME 1000 /* ms */ #define CALC_RES 2002 #define IDM_ALLWAYSONTOP 2003 /****************************************************************************/ TblClassDlgMAIN("ResMeterClass","ikoni","pika","ResMeter",MsgTbl); /****************************************************************************/ /***************************************************************************/ void ShowLong(HWND hWnd,UINT id,long l) { char s[20]; if ( ( l >= 0 ? l : -l ) > 1000000L ) wsprintf(s,"%ld K",l/1024); else wsprintf(s,"%ld",l); SetDlgItemText(hWnd,id,s); } /***************************************************************************/ /* Resurssien näyttö ja käsittely */ /***************************************************************************/ typedef struct { UINT id; /* Tunnus dialogissa */ UINT fuSys; /* Tunnus mitä resurssia kysytään */ long now; /* Resurssien määrä nyt */ long show; /* Näyttöön näytettyjen res määrä, jottei turh. päiv. */ long trip; /* Tripattu resurssilukema */ } tRes; static tRes Res[] = { { ID_MEM ,-1 }, /*{ ID_RES ,GFSR_SYSTEMRESOURCES }, Sama kuin min(GDI,USER) */ { ID_GDI ,GFSR_GDIRESOURCES }, { ID_USER ,GFSR_USERRESOURCES }, { NULL ,NULL } }; #define FOR_ALL(r) { tRes *r; for (r=Res; r->id; r++) { #define NEXT(r) }} /***************************************************************************/ int GetRes(void) { FOR_ALL(r) if ( r->id == ID_MEM ) r->now = GetFreeSpace(NULL); else r->now = GetFreeSystemResources(r->fuSys); NEXT(r) return 0; } /***************************************************************************/ int TripRes(void) { GetRes(); FOR_ALL(r) r->trip = r->now; r->show = r->now+1; NEXT(r) return 0; } /***************************************************************************/ int ShowRes(HWND hWnd) { FOR_ALL(r) if ( r->now == r->show ) continue; ShowLong(hWnd,r->id,r->now); r->show = r->now; ShowLong(hWnd, r->id+1, r->now - r->trip); NEXT(r) return 0; } #undef NEXT_R #undef FOR_ALL_R /***************************************************************************/ /* Resurssien näyttö ja käsittely loppu */ /***************************************************************************/ /***************************************************************************/ int AllWaysOnTop(HWND hWnd,int NewTop) { static int Top=1; HMENU hMenu = GetSystemMenu(hWnd, FALSE) ; if ( NewTop == -1 ) Top = (Top == 0); else Top = NewTop; CheckMenuItem(hMenu,IDM_ALLWAYSONTOP,MF_BYCOMMAND | ( Top ? MF_CHECKED : MF_UNCHECKED ) ); SetWindowPos(hWnd,Top ? HWND_TOPMOST : HWND_NOTOPMOST, 0,0,0,0,SWP_NOMOVE | SWP_NOSIZE); return 0; } /***************************************************************************/ int InitMenu(HWND hWnd) { HMENU hMenu = GetSystemMenu(hWnd, FALSE) ; // append own items to systemmenu AppendMenu(hMenu, MF_SEPARATOR, 0, NULL) ; AppendMenu(hMenu, MF_STRING, IDM_ALLWAYSONTOP, "Allways on top") ; return AllWaysOnTop(hWnd,1); } /***************************************************************************/ static EVENT WM_command_ID_TRIP_DIFF(tMSGParam *msg) { (void)msg; // if ( hMem ) { GlobalFree(hMem); hMem = NULL; } return TripRes(); } static EVENT WM_initdialog(tMSGParam *msg) { RestorePos(msg->hWnd,NULL,"ResMeter",0); InitMenu(msg->hWnd); WM_command_ID_TRIP_DIFF(msg); SetTimer(msg->hWnd,1,UPDATE_TIME,NULL); return 0; } static EVENT WM_command_CALC_RES(tMSGParam *msg) { GetRes(); return ShowRes(msg->hWnd); } static EVENT WM_command_ID_COMPACT(tMSGParam *msg) { //HGLOBAL hMem = NULL; GetRes(); (void)msg; GlobalCompact(30000000L); //hMem = GlobalAlloc(0,Res[0].now*60/100); return 0; } static EVENT WM_syscommand_IDM_ALLWAYSONTOP(tMSGParam *msg) { return AllWaysOnTop(msg->hWnd,-1); } static EVENT WM_close(tMSGParam *msg) { KillTimer(msg->hWnd,1); SavePos(msg->hWnd,NULL,"ResMeter",1); PostQuitMessage(0); return 0; } /****************************************************************************/ /* Viestien käsittelytaulukko */ /****************************************************************************/ tMSGEntry MsgTbl[] = { { WM_TIMER , 1 , DoC , WM_command_CALC_RES }, { WM_COMMAND , ID_TRIP_DIFF , DoC , WM_command_ID_TRIP_DIFF }, /*a*/ { WM_INITDIALOG , DoC , DoC , WM_initdialog }, /*a*/ { WM_COMMAND , CALC_RES , DoC , WM_command_CALC_RES }, /*a*/ { WM_COMMAND , ID_COMPACT , DoC , WM_command_ID_COMPACT }, /*a*/ { WM_SYSCOMMAND , IDM_ALLWAYSONTOP , DoC , WM_syscommand_IDM_ALLWAYSONTOP }, /*a*/ { WM_CLOSE , DoC , DoC , WM_close }, /*a*/ { 0 } }; /****************************************************************************/