forked from KolibriOS/kolibrios
7c4990bd81
@icon: fix old issue with accedental icon click when user moved clicked mouse from active window git-svn-id: svn://kolibrios.org@7956 a494cfbc-eb01-0410-851d-a64ba20cac60
151 lines
4.3 KiB
C
151 lines
4.3 KiB
C
//===================================================//
|
|
// //
|
|
// DATA //
|
|
// //
|
|
//===================================================//
|
|
|
|
#define T_WINDOW_TITLE "Process Manager"
|
|
#define T_SHOW_SYSTEM_PROCESSES "Show system"
|
|
#define T_DETAILS "Details"
|
|
#define T_END_PROCESS "End process"
|
|
|
|
#define BOTPANEL_H 36
|
|
|
|
enum {
|
|
BTN_ID_SHOW_SYSTEM_PROCESSES=200,
|
|
BTN_ID_KILL_PROCESS,
|
|
BTN_ID_SHOW_PROCESS_INFO
|
|
};
|
|
|
|
int current_process_id = 0;
|
|
unsigned maxcpu;
|
|
int proc_list[256];
|
|
|
|
checkbox show_system = { T_SHOW_SYSTEM_PROCESSES, false };
|
|
|
|
//===================================================//
|
|
// //
|
|
// CODE //
|
|
// //
|
|
//===================================================//
|
|
|
|
void Processes__Main()
|
|
{
|
|
int btn;
|
|
maxcpu = GetCpuFrequency();
|
|
SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER);
|
|
goto _PROCESS_REDRAW_3;
|
|
loop()
|
|
{
|
|
WaitEventTimeout(50);
|
|
switch(EAX & 0xFF)
|
|
{
|
|
case evMouse:
|
|
SelectList_ProcessMouse();
|
|
break;
|
|
case evKey:
|
|
Sysmon__KeyEvent();
|
|
if (key_scancode == SCAN_CODE_DEL) EventKillCurrentProcess();
|
|
if (select_list.ProcessKey(key_scancode)) SelectList_LineChanged();
|
|
break;
|
|
case evButton:
|
|
btn = Sysmon__ButtonEvent();
|
|
|
|
if (show_system.click(btn)) {
|
|
SelectList_LineChanged();
|
|
}
|
|
if (BTN_ID_KILL_PROCESS == btn) {
|
|
EventKillCurrentProcess();
|
|
}
|
|
if (BTN_ID_SHOW_PROCESS_INFO == btn) {
|
|
io.run("/sys/tinfo", itoa(GetProcessSlot(current_process_id)));
|
|
}
|
|
break;
|
|
case evReDraw:
|
|
_PROCESS_REDRAW_3:
|
|
if (!Sysmon__DefineAndDrawWindow()) break;
|
|
|
|
SelectList_Init(WIN_PAD, WIN_CONTENT_Y,
|
|
WIN_CONTENT_W-scroll1.size_x,
|
|
WIN_CONTENT_H-BOTPANEL_H-WIN_CONTENT_Y, false);
|
|
SelectList_DrawBorder();
|
|
|
|
//DrawWideRectangle(0, 0, Form.cwidth, Form.cheight, 4, sc.work);
|
|
DrawBar(select_list.x-2, select_list.y+select_list.h+2,
|
|
select_list.w+scroll1.size_x+4, BOTPANEL_H, sc.work);
|
|
DrawCaptButton(Form.cwidth-110-WIN_PAD,
|
|
select_list.y+select_list.h+5,
|
|
110,25,BTN_ID_KILL_PROCESS,0xF38181, 0xFFFfff, T_END_PROCESS);
|
|
DrawCaptButton(Form.cwidth-230-WIN_PAD,
|
|
select_list.y+select_list.h+5,
|
|
110,25,BTN_ID_SHOW_PROCESS_INFO,
|
|
sc.button, sc.button_text, T_DETAILS);
|
|
show_system.draw(select_list.x + 3, select_list.y+select_list.h+10);
|
|
default:
|
|
SelectList_LineChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
void EventKillCurrentProcess()
|
|
{
|
|
KillProcess(current_process_id);
|
|
pause(10);
|
|
SelectList_LineChanged();
|
|
}
|
|
|
|
void Processes__GetProcessList()
|
|
{
|
|
int i, j;
|
|
proc_info Process;
|
|
|
|
select_list.count=0;
|
|
for (i=0; i<MAX_PROCESS_COUNT; i++)
|
|
{
|
|
GetProcessInfo(#Process, i);
|
|
if (Process.name)
|
|
{
|
|
for (j=0; j<11; j++) if (Process.name[j]!=' ') {
|
|
if (show_system.checked==false) {
|
|
//do not show system process
|
|
if (Process.name[0]=='@') break;
|
|
if (!strcmp(#Process.name, "IDLE")) break;
|
|
if (!strcmp(#Process.name, "OS")) break;
|
|
}
|
|
proc_list[select_list.count] = i;
|
|
select_list.count++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void SelectList_DrawLine(dword i)
|
|
{
|
|
int posy;
|
|
char cpu_use[16];
|
|
dword bg_color;
|
|
proc_info Process;
|
|
|
|
GetProcessInfo(#Process, proc_list[i+select_list.first]);
|
|
|
|
posy = i *select_list.item_h + select_list.y;
|
|
if (i % 2) bg_color = 0xFFFfff; else bg_color = 0xF0F0F0;
|
|
if (i+select_list.first == select_list.cur_y) {
|
|
current_process_id = Process.ID;
|
|
bg_color = 0x67CCEB;
|
|
}
|
|
DrawBar(select_list.x, posy, select_list.w, select_list.item_h, bg_color);
|
|
WriteText(select_list.x+005, posy+select_list.text_y, select_list.font_type, 0, #Process.name);
|
|
WriteText(select_list.w/10*5+select_list.x, posy+select_list.text_y, select_list.font_type, 0x444444, ConvertSizeToKb(Process.use_memory));
|
|
sprintf(#cpu_use, "%i %%", Process.use_cpu*100/maxcpu);
|
|
if (maxcpu) WriteText(select_list.w/10*8+select_list.x - calc(strlen(#cpu_use)-4*8),
|
|
posy+select_list.text_y, select_list.font_type, 0x444444, #cpu_use);
|
|
}
|
|
|
|
void SelectList_LineChanged()
|
|
{
|
|
Processes__GetProcessList();
|
|
SelectList_Draw();
|
|
}
|