allow switching between the pages using the cursor keys after activating using tab.
[AROS.git] / workbench / system / SysMon / main.c
blob72feb36b85984832cedb18755cbecfa2364b3d98
1 /*
2 Copyright 2010-2019, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define DEBUG 0
7 #include <aros/debug.h>
9 #include <proto/alib.h>
10 #include <proto/muimaster.h>
12 #include <dos/dos.h>
14 #include <zune/graph.h>
16 #include <stdio.h>
18 #include "sysmon_intern.h"
20 #include "locale.h"
22 #define VERSION "$VER: SysMon 1.10 (19.04.2019) ©2011-2019 The AROS Development Team"
24 CONST_STRPTR CPU_DEFSTR = "CPU --\n--.- %";
26 //#define NOTYET_USED
28 AROS_UFH3(VOID, tasklistrefreshfunction,
29 AROS_UFHA(struct Hook *, h, A0),
30 AROS_UFHA(Object *, object, A2),
31 AROS_UFHA(APTR, msg, A1))
33 AROS_USERFUNC_INIT
35 struct SysMonData * smdata = h->h_Data;
36 IPTR taskReady = 0, taskWait = 0;
38 D(bug("[SysMon] %s(0x%p)\n", __func__, object));
40 GET(smdata->tasklist, MUIA_Tasklist_ReadyCount, &taskReady);
41 GET(smdata->tasklist, MUIA_Tasklist_WaitingCount, &taskWait);
43 __sprintf(smdata->tasklistinfobuf, smdata->msg_taskreadywait, taskReady, taskWait);
45 set(smdata->tasklistinfo, MUIA_Text_Contents, smdata->tasklistinfobuf);
47 AROS_USERFUNC_EXIT
50 #ifdef NOTYET_USED
51 AROS_UFH3(VOID, pageactivefunction,
52 AROS_UFHA(struct Hook *, h, A0),
53 AROS_UFHA(Object *, object, A2),
54 AROS_UFHA(APTR, msg, A1))
56 AROS_USERFUNC_INIT
58 IPTR thisPage = 0;
60 D(bug("[SysMon] %s(0x%p)\n", __func__, object));
62 // get the selected page
63 get(object, MUIA_Group_ActivePage, &thisPage);
65 D(bug("[SysMon] page #%d\n", thisPage));
67 // TODO: change the menu for the active page.
69 AROS_USERFUNC_EXIT
71 #endif
73 BOOL CreateApplication(struct SysMonData * smdata)
75 Object * menuitemfast,
76 * menuitemnormal,
77 * menuitemslow,
78 * cmenucpugauge,
79 * cmenucpugraph,
80 * cmenucpugraphpcpu = NULL;
82 Object * cpufreqgroup,
83 * cpufreqcntnr;
84 char videowinstr[100];
85 ULONG processorcount;
86 IPTR i;
88 processorcount = GetProcessorCount();
90 smdata->tabs[0] = _(MSG_TAB_TASKS);
91 smdata->tabs[1] = _(MSG_TAB_CPU);
92 smdata->tabs[2] = _(MSG_TAB_SYSTEM);
93 smdata->tabs[3] = NULL;
95 smdata->tasklistinfobuf = AllocVec(30, MEMF_PUBLIC);
96 smdata->tasklistrefreshhook.h_Entry = (APTR)tasklistrefreshfunction;
97 smdata->tasklistrefreshhook.h_Data = (APTR)smdata;
99 #ifdef NOTYET_USED
100 smdata->pageactivehook.h_Entry = (APTR)pageactivefunction;
101 smdata->pageactivehook.h_Data = (APTR)smdata;
102 #endif
104 smdata->msg_taskreadywait = (STRPTR)_(MSG_TASK_READY_WAIT);
105 smdata->msg_project = (STRPTR)_(MSG_PROJECT);
106 smdata->msg_refresh_speed = (STRPTR)_(MSG_REFRESH_SPEED);
107 smdata->msg_fast = (STRPTR)_(MSG_FAST);
108 smdata->msg_normal = (STRPTR)_(MSG_NORMAL);
109 smdata->msg_slow = (STRPTR)_(MSG_SLOW);
111 smdata->tasklist = (Object *)NewObject(Tasklist_CLASS->mcc_Class, NULL, MUIA_Tasklist_RefreshMSecs, MUIV_Tasklist_Refresh_Normal, TAG_DONE);
113 /* prepare the cpu frequency group */
114 cpufreqgroup = ColGroup(4),
115 End;
117 /* If we have more than 3 processors,
118 use a scrollgroup */
119 if (processorcount <= 4)
121 cpufreqcntnr = GroupObject,
122 GroupFrameT(_(MSG_FREQUENCY)),
123 Child, cpufreqgroup,
124 End;
126 else
128 cpufreqcntnr = ScrollgroupObject,
129 GroupFrameT(_(MSG_FREQUENCY)),
130 MUIA_Scrollgroup_FreeHoriz, FALSE,
131 MUIA_Scrollgroup_Contents, VirtgroupObject,
132 Child, cpufreqgroup,
133 End,
134 End;
137 sprintf(videowinstr, _(MSG_VIDEO_WINDOW_TMPL), _(MSG_WINDOW_GART));
139 smdata->application = ApplicationObject,
140 MUIA_Application_Title, __(MSG_APP_NAME),
141 MUIA_Application_Version, (IPTR) VERSION,
142 MUIA_Application_Author, (IPTR) "Krzysztof Smiechowicz",
143 MUIA_Application_Copyright, (IPTR)"©2011-2019, The AROS Development Team",
144 MUIA_Application_Base, (IPTR)"SYSMON",
145 MUIA_Application_Description, __(MSG_APP_TITLE),
146 SubWindow,
147 smdata->mainwindow = WindowObject,
148 MUIA_Window_Title, __(MSG_WINDOW_TITLE),
149 MUIA_Window_ID, MAKE_ID('S','Y','S','M'),
150 MUIA_Window_Height, MUIV_Window_Height_Visible(45),
151 MUIA_Window_Width, MUIV_Window_Width_Visible(35),
152 MUIA_Window_Menustrip, (MenustripObject,
153 MUIA_Family_Child, (MenuObject,
154 MUIA_Menu_Title, (IPTR)smdata->msg_project,
155 MUIA_Family_Child, (MenuitemObject,
156 MUIA_Menuitem_Title, (IPTR)smdata->msg_refresh_speed,
157 MUIA_Family_Child, (menuitemfast = MenuitemObject, MUIA_Menuitem_Title, (IPTR)smdata->msg_fast, MUIA_Menuitem_Shortcut, (IPTR)"F",End),
158 MUIA_Family_Child, (menuitemnormal = MenuitemObject, MUIA_Menuitem_Title, (IPTR)smdata->msg_normal, MUIA_Menuitem_Shortcut, (IPTR)"N",End),
159 MUIA_Family_Child, (menuitemslow = MenuitemObject, MUIA_Menuitem_Title, (IPTR)smdata->msg_slow, MUIA_Menuitem_Shortcut, (IPTR)"S",End),
160 End),
161 End),
162 End),
163 WindowContents,
164 smdata->pages = RegisterGroup(smdata->tabs),
165 MUIA_CycleChain, 1,
166 Child, (VGroup,
167 Child, ListviewObject,
168 MUIA_Listview_List, (IPTR)smdata->tasklist,
169 End,
170 Child, VGroup,
171 Child, smdata->tasklistinfo = TextObject,
172 NoFrame,
173 MUIA_Font, MUIV_Font_Tiny,
174 MUIA_Text_PreParse, (IPTR)"\33r",
175 MUIA_Text_Contents, (IPTR)_(MSG_TASK_READY_WAIT_INIT),
176 End,
177 End,
178 End),
179 Child, (VGroup,
180 Child, (smdata->cpuusagegroup = HGroup,
181 GroupFrameT(_(MSG_USAGE)),
182 MUIA_ContextMenu, (MenustripObject,
183 MUIA_Family_Child, (MenuObject,
184 MUIA_Menu_Title, __(MSG_LOAD),
185 MUIA_Family_Child, (MenuitemObject,
186 MUIA_Menuitem_Title, __(MSG_DISPLAY_MODE),
187 MUIA_Family_Child, (cmenucpugauge = MenuitemObject, MUIA_Menuitem_Title, __(MSG_GUAGE), MUIA_Menuitem_Shortcut, (IPTR)"G",End),
188 MUIA_Family_Child, (cmenucpugraph = MenuitemObject, MUIA_Menuitem_Title, __(MSG_GRAPH), MUIA_Menuitem_Shortcut, (IPTR)"S",End),
189 (processorcount > 1) ? MUIA_Family_Child : TAG_IGNORE,
190 (cmenucpugraphpcpu = MenuitemObject, MUIA_Menuitem_Title, __(MSG_GRAPH_PER_PROC), MUIA_Menuitem_Shortcut, (IPTR)"P",End),
191 End),
192 End),
193 End),
194 Child, (IPTR)(smdata->cpuusageobj = ProcessorGroupObject(smdata, processorcount)),
195 End),
196 Child, BalanceObject, End,
197 Child, cpufreqcntnr,
198 End),
199 Child, (VGroup,
200 Child, ColGroup(2),
201 Child, VGroup, GroupFrameT(_(MSG_MEMORY_SIZE)),
202 Child, ColGroup(2),
203 Child, Label(_(MSG_TOTAL_RAM)),
204 Child, smdata->memorysize[MEMORY_RAM] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
205 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"---- Kb",
206 End,
207 Child, Label(_(MSG_CHIP_RAM)),
208 Child, smdata->memorysize[MEMORY_CHIP] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
209 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
210 End,
211 Child, Label(_(MSG_FAST_RAM)),
212 Child, smdata->memorysize[MEMORY_FAST] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
213 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
214 End,
215 End,
216 End,
217 Child, VGroup, GroupFrameT(_(MSG_MEMORY_FREE)),
218 Child, ColGroup(2),
219 Child, Label(_(MSG_TOTAL_RAM)),
220 Child, smdata->memoryfree[MEMORY_RAM] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
221 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"---- Kb",
222 End,
223 Child, Label(_(MSG_CHIP_RAM)),
224 Child, smdata->memoryfree[MEMORY_CHIP] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
225 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
226 End,
227 Child, Label(_(MSG_FAST_RAM)),
228 Child, smdata->memoryfree[MEMORY_FAST] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
229 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
230 End,
231 End,
232 End,
233 End,
234 Child, ColGroup(2),
235 Child, VGroup, GroupFrameT(_(MSG_VIDEO_SIZE)),
236 Child, ColGroup(2),
237 Child, Label(_(MSG_VIDEO_RAM)),
238 Child, smdata->memorysize[MEMORY_VMEM] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
239 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
240 End,
241 Child, Label(videowinstr),
242 Child, smdata->memorysize[MEMORY_VMEMWINDOW] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
243 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
244 End,
245 End,
246 End,
247 Child, VGroup, GroupFrameT(_(MSG_VIDEO_FREE)),
248 Child, ColGroup(2),
249 Child, Label(_(MSG_VIDEO_RAM)),
250 Child, smdata->memoryfree[MEMORY_VMEM] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
251 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
252 End,
253 Child, Label(videowinstr),
254 Child, smdata->memoryfree[MEMORY_VMEMWINDOW] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
255 MUIA_Text_PreParse, (IPTR)"\33r", MUIA_Text_Contents, (IPTR)"",
256 End,
257 End,
258 End,
259 End,
260 Child, HVSpace,
261 End),
262 End,
263 End,
264 End;
266 if (!smdata->application)
267 return FALSE;
269 DoMethod(smdata->mainwindow, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
270 smdata->application, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
272 DoMethod(menuitemfast, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
273 smdata->tasklist, 3, MUIM_Set, MUIA_Tasklist_RefreshMSecs, MUIV_Tasklist_Refresh_Fast);
274 DoMethod(menuitemnormal, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
275 smdata->tasklist, 3, MUIM_Set, MUIA_Tasklist_RefreshMSecs, MUIV_Tasklist_Refresh_Normal);
276 DoMethod(menuitemslow, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
277 smdata->tasklist, 3, MUIM_Set, MUIA_Tasklist_RefreshMSecs, MUIV_Tasklist_Refresh_Slow);
279 DoMethod(smdata->tasklist, MUIM_Notify, MUIA_Tasklist_Refreshed, TRUE,
280 smdata->application, 2, MUIM_CallHook, (IPTR)&smdata->tasklistrefreshhook);
282 #ifdef NOTYET_USED
283 DoMethod(smdata->pages, MUIM_Notify, MUIA_Group_ActivePage, MUIV_EveryTime,
284 smdata->pages, 2, MUIM_CallHook, (IPTR)&smdata->pageactivehook);
285 #endif
287 smdata->cpuusagecmhooks[0].h_Entry = (APTR)processorgaugehookfunc;
288 smdata->cpuusagecmhooks[0].h_Data = (APTR)smdata;
289 smdata->cpuusagecmhooks[1].h_Entry = (APTR)processorgraphhookfunc;
290 smdata->cpuusagecmhooks[1].h_Data = (APTR)smdata;
292 DoMethod(cmenucpugauge, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
293 smdata->application, 5, MUIM_Application_PushMethod,
294 smdata->application, 2, MUIM_CallHook, (IPTR)&smdata->cpuusagecmhooks[0]);
295 DoMethod(cmenucpugraph, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
296 smdata->application, 5, MUIM_Application_PushMethod,
297 smdata->application, 2, MUIM_CallHook, (IPTR)&smdata->cpuusagecmhooks[1]);
298 if (cmenucpugraphpcpu)
300 smdata->cpuusagecmhooks[2].h_Entry = (APTR)processorgraphpercpuhookfunc;
301 smdata->cpuusagecmhooks[2].h_Data = (APTR)smdata;
303 DoMethod(cmenucpugraphpcpu, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
304 smdata->application, 5, MUIM_Application_PushMethod,
305 smdata->application, 2, MUIM_CallHook, (IPTR)&smdata->cpuusagecmhooks[2]);
308 /* Adding cpu frequency labels */
309 smdata->cpufreqlabels = AllocVec(sizeof(Object *) * processorcount, MEMF_ANY | MEMF_CLEAR);
310 smdata->cpufreqvalues = AllocVec(sizeof(Object *) * processorcount, MEMF_ANY | MEMF_CLEAR);
312 for (i = 0; i < processorcount; i++)
314 smdata->cpufreqlabels[i] = TextObject, MUIA_Text_PreParse, "\33l",
315 MUIA_Text_Contents, (IPTR)"", End;
316 smdata->cpufreqvalues[i] = TextObject, TextFrame, MUIA_Background, MUII_TextBack,
317 MUIA_Text_PreParse, (IPTR)"\33l",
318 MUIA_Text_Contents, (IPTR)"", End;
320 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
321 DoMethod(cpufreqgroup, OM_ADDMEMBER, smdata->cpufreqlabels[i]);
322 DoMethod(cpufreqgroup, OM_ADDMEMBER, smdata->cpufreqvalues[i]);
323 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
325 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
326 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
327 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
328 DoMethod(cpufreqgroup, OM_ADDMEMBER, (IPTR)HVSpace);
330 return TRUE;
333 VOID DisposeApplication(struct SysMonData * smdata)
335 MUI_DisposeObject(smdata->application);
337 FreeVec(smdata->tasklistinfobuf);
338 FreeVec(smdata->cpufreqlabels);
339 FreeVec(smdata->cpufreqvalues);
342 VOID DeInitModules(struct SysMonModule ** modules, struct SysMonData *smdata, LONG lastinitedmodule)
344 LONG i;
346 for (i = lastinitedmodule; i >= 0; i--)
347 modules[i]->DeInit(smdata);
350 LONG InitModules(struct SysMonModule ** modules, struct SysMonData *smdata)
352 LONG lastinitedmodule = -1;
354 /* Make sure we initialize values ..*/
355 smdata->cpuusageclass = NULL;
357 while(modules[lastinitedmodule + 1] != NULL)
359 if (modules[lastinitedmodule + 1]->Init(smdata))
360 lastinitedmodule++;
361 else
363 DeInitModules(modules, smdata, lastinitedmodule);
364 return -1;
368 return lastinitedmodule;
371 int main()
373 ULONG signals = 0;
374 ULONG itercounter = 0;
375 struct SysMonData smdata;
376 struct SysMonModule * modules [] = {&memorymodule, &videomodule, &processormodule, &timermodule, NULL};
377 LONG lastinitedmodule = -1;
379 if ((lastinitedmodule = InitModules(modules, &smdata)) == -1)
380 return 1;
382 if (!CreateApplication(&smdata))
383 return 1;
385 /* Increase our priority! */
386 SetTaskPri(FindTask(NULL), 19);
388 UpdateProcessorStaticInformation(&smdata);
389 UpdateProcessorInformation(&smdata);
390 UpdateMemoryStaticInformation(&smdata);
391 UpdateMemoryInformation(&smdata);
392 UpdateVideoStaticInformation(&smdata);
393 UpdateVideoInformation(&smdata);
395 set(smdata.mainwindow, MUIA_Window_Open, TRUE);
396 set(smdata.pages, MUIA_Group_ActivePage, 0);
397 SignalMeAfter(250);
399 while (DoMethod(smdata.application, MUIM_Application_NewInput, &signals) != MUIV_Application_ReturnID_Quit)
401 if (signals)
403 signals = Wait(signals | SIGBREAKF_CTRL_C | GetSIG_TIMER());
404 if (signals & SIGBREAKF_CTRL_C)
405 break;
407 if (signals & GetSIG_TIMER())
409 IPTR currentPage = 0;
411 get(smdata.pages, MUIA_Group_ActivePage, &currentPage);
412 switch (currentPage)
414 case 1:
415 UpdateProcessorInformation(&smdata);
416 break;
417 case 2:
418 if ((itercounter % 8) == 0)
420 UpdateMemoryInformation(&smdata);
421 UpdateVideoInformation(&smdata);
423 break;
424 default:
425 break;
428 itercounter++;
430 SignalMeAfter(250);
435 set(smdata.mainwindow, MUIA_Window_Open, FALSE);
437 DisposeApplication(&smdata);
439 DeInitModules(modules, &smdata, lastinitedmodule);
441 return 0;