2 Copyright 2010-2019, The AROS Development Team. All rights reserved.
7 #include <aros/debug.h>
9 #include <proto/alib.h>
10 #include <proto/muimaster.h>
14 #include <zune/graph.h>
18 #include "sysmon_intern.h"
22 #define VERSION "$VER: SysMon 1.10 (19.04.2019) ©2011-2019 The AROS Development Team"
24 CONST_STRPTR CPU_DEFSTR
= "CPU --\n--.- %";
28 AROS_UFH3(VOID
, tasklistrefreshfunction
,
29 AROS_UFHA(struct Hook
*, h
, A0
),
30 AROS_UFHA(Object
*, object
, A2
),
31 AROS_UFHA(APTR
, msg
, A1
))
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
);
51 AROS_UFH3(VOID
, pageactivefunction
,
52 AROS_UFHA(struct Hook
*, h
, A0
),
53 AROS_UFHA(Object
*, object
, A2
),
54 AROS_UFHA(APTR
, msg
, A1
))
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.
73 BOOL
CreateApplication(struct SysMonData
* smdata
)
75 Object
* menuitemfast
,
80 * cmenucpugraphpcpu
= NULL
;
82 Object
* cpufreqgroup
,
84 char videowinstr
[100];
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
;
100 smdata
->pageactivehook
.h_Entry
= (APTR
)pageactivefunction
;
101 smdata
->pageactivehook
.h_Data
= (APTR
)smdata
;
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),
117 /* If we have more than 3 processors,
119 if (processorcount
<= 4)
121 cpufreqcntnr
= GroupObject
,
122 GroupFrameT(_(MSG_FREQUENCY
)),
128 cpufreqcntnr
= ScrollgroupObject
,
129 GroupFrameT(_(MSG_FREQUENCY
)),
130 MUIA_Scrollgroup_FreeHoriz
, FALSE
,
131 MUIA_Scrollgroup_Contents
, VirtgroupObject
,
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
),
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
),
164 smdata
->pages
= RegisterGroup(smdata
->tabs
),
167 Child
, ListviewObject
,
168 MUIA_Listview_List
, (IPTR
)smdata
->tasklist
,
171 Child
, smdata
->tasklistinfo
= TextObject
,
173 MUIA_Font
, MUIV_Font_Tiny
,
174 MUIA_Text_PreParse
, (IPTR
)"\33r",
175 MUIA_Text_Contents
, (IPTR
)_(MSG_TASK_READY_WAIT_INIT
),
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
),
194 Child
, (IPTR
)(smdata
->cpuusageobj
= ProcessorGroupObject(smdata
, processorcount
)),
196 Child
, BalanceObject
, End
,
201 Child
, VGroup
, GroupFrameT(_(MSG_MEMORY_SIZE
)),
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",
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
)"",
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
)"",
217 Child
, VGroup
, GroupFrameT(_(MSG_MEMORY_FREE
)),
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",
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
)"",
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
)"",
235 Child
, VGroup
, GroupFrameT(_(MSG_VIDEO_SIZE
)),
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
)"",
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
)"",
247 Child
, VGroup
, GroupFrameT(_(MSG_VIDEO_FREE
)),
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
)"",
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
)"",
266 if (!smdata
->application
)
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
);
283 DoMethod(smdata
->pages
, MUIM_Notify
, MUIA_Group_ActivePage
, MUIV_EveryTime
,
284 smdata
->pages
, 2, MUIM_CallHook
, (IPTR
)&smdata
->pageactivehook
);
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
);
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
)
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
))
363 DeInitModules(modules
, smdata
, lastinitedmodule
);
368 return lastinitedmodule
;
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)
382 if (!CreateApplication(&smdata
))
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);
399 while (DoMethod(smdata
.application
, MUIM_Application_NewInput
, &signals
) != MUIV_Application_ReturnID_Quit
)
403 signals
= Wait(signals
| SIGBREAKF_CTRL_C
| GetSIG_TIMER());
404 if (signals
& SIGBREAKF_CTRL_C
)
407 if (signals
& GetSIG_TIMER())
409 IPTR currentPage
= 0;
411 get(smdata
.pages
, MUIA_Group_ActivePage
, ¤tPage
);
415 UpdateProcessorInformation(&smdata
);
418 if ((itercounter
% 8) == 0)
420 UpdateMemoryInformation(&smdata
);
421 UpdateVideoInformation(&smdata
);
435 set(smdata
.mainwindow
, MUIA_Window_Open
, FALSE
);
437 DisposeApplication(&smdata
);
439 DeInitModules(modules
, &smdata
, lastinitedmodule
);