diff --git a/programs/cmm/process/Tupfile.lua b/programs/cmm/process/Tupfile.lua new file mode 100644 index 000000000..5bb9f2809 --- /dev/null +++ b/programs/cmm/process/Tupfile.lua @@ -0,0 +1,6 @@ +if tup.getconfig("NO_CMM") ~= "" then return end +if tup.getconfig("LANG") == "ru" +then C_LANG = "LANG_RUS" +else C_LANG = "LANG_ENG" -- this includes default case without config +end +tup.rule("process.c", "c-- /D=AUTOBUILD /D=$(C_LANG) %f" .. tup.getconfig("KPACK_CMD"), "process.com") diff --git a/programs/cmm/process/compile.bat b/programs/cmm/process/compile.bat new file mode 100644 index 000000000..d37e52e7c --- /dev/null +++ b/programs/cmm/process/compile.bat @@ -0,0 +1,9 @@ +@del lang.h-- +@echo #define LANG_RUS 1 >lang.h-- + +C-- process.c +@del process +@rename process.com process +@pause +@del lang.h-- +@del warning.txt \ No newline at end of file diff --git a/programs/cmm/process/process.c b/programs/cmm/process/process.c new file mode 100644 index 000000000..6b209086c --- /dev/null +++ b/programs/cmm/process/process.c @@ -0,0 +1,187 @@ +#define MEMSIZE 4096*20 + +//===================================================// +// // +// LIB // +// // +//===================================================// + +#include "../lib/gui.h" +#include "../lib/list_box.h" +#include "../lib/obj/box_lib.h" +#include "../lib/io.h" +#include "../lib/patterns/select_list.h" + +//===================================================// +// // +// 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 34 +proc_info Form; +proc_info Process; + +enum { + BTN_ID_SHOW_SYSTEM_PROCESSES=20, + BTN_ID_KILL_PROCESS, + BTN_ID_SHOW_PROCESS_INFO +}; + +int current_process_id = 0; +int show_system; +unsigned maxcpu; +int proc_list[256]; + +//===================================================// +// // +// CODE // +// // +//===================================================// + +void GetCpuFrequency() { + EAX = 18; + EBX = 5; + $int 0x40 + maxcpu = EAX; +} + +void main() +{ + byte btn; + load_dll(boxlib, #box_lib_init,0); + SetEventMask(10000000000000000000000001100111b); + debugi(3); + GetCpuFrequency(); + debugi(4); + loop() + { + WaitEventTimeout(50); + switch(EAX & 0xFF) + { + case evMouse: + if (!CheckActiveProcess(Form.ID)) break; + SelectList_ProcessMouse(); + break; + case evKey: + GetKeys(); + if (select_list.ProcessKey(key_scancode)) SelectList_LineChanged(); + break; + case evButton: + btn = GetButtonID(); + if (1 == btn) + { + ExitProcess(); + } + if (BTN_ID_SHOW_SYSTEM_PROCESSES == btn) + { + show_system ^= 1; + Draw_ShowSystemProcessesCheckbox(); + SelectList_LineChanged(); + } + if (BTN_ID_KILL_PROCESS == btn) + { + KillProcess(current_process_id); + pause(10); + SelectList_LineChanged(); + } + if (BTN_ID_SHOW_PROCESS_INFO == btn) + { + io.run("/sys/tinfo", itoa(GetProcessSlot(current_process_id))); + } + break; + case evReDraw: + system.color.get(); + DefineAndDrawWindow(screen.width-400/2,screen.height-450/2,400,454,0x73,0,T_WINDOW_TITLE); + GetProcessInfo(#Form, SelfInfo); + if (Form.status_window>2) break; + if (Form.width < 300) { MoveSize(OLD,OLD,300,OLD); break; } + if (Form.height < 200) { MoveSize(OLD,OLD,OLD,200); break; } + SelectList_Init(6, 6, Form.cwidth-12 - scroll1.size_x, Form.cheight-12-BOTPANEL_H, false); + SelectList_DrawBorder(); + DrawWideRectangle(0, 0, Form.cwidth, Form.cheight, 4, system.color.work); + DrawBar(select_list.x-2, select_list.y+select_list.h+2, + select_list.w+scroll1.size_x+4, BOTPANEL_H, system.color.work); + DrawCaptButton(Form.cwidth-116, + select_list.y+select_list.h+5, + 110,25,BTN_ID_KILL_PROCESS,0xF38181, 0xFFFfff, T_END_PROCESS); + DrawCaptButton(Form.cwidth-236, + select_list.y+select_list.h+5, + 110,25,BTN_ID_SHOW_PROCESS_INFO, + system.color.work_button, system.color.work_button_text, T_DETAILS); + Draw_ShowSystemProcessesCheckbox(); + default: + SelectList_LineChanged(); + } + } +} + +void SelectList_LineChanged() +{ + GetProcessList(); + SelectList_Draw(); +} + + +void GetProcessList() +{ + int i, j; + select_list.count=0; + for (i=0; i<65535; i++) + { + GetProcessInfo(#Process, i); + if (Process.name) + { + for (j=0; j<11; j++) if (Process.name[j]!=' ') { + if (show_system==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; + 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 Draw_ShowSystemProcessesCheckbox() { + CheckBox(select_list.x + 3, select_list.y+select_list.h+10, 20, + T_SHOW_SYSTEM_PROCESSES, show_system); +} + + + + + +stop: \ No newline at end of file