#define MEMSIZE 4096*40 #include "../lib/gui.h" #include "../lib/io.h" #include "../lib/collection.h" #include "../lib/list_box.h" #include "../lib/fs.h" #define ITEM_H 19 llist menu1; collection names; collection hotkeys; int win_x, win_y; int max_name_len; int max_hotkey_len; int selected = 0; /* dword cur_param = #param; int GetNextParam() { int result; dword next_param = strchr(cur_param, ' '); ESBYTE[next_param] = '\0'; result = atoi(cur_param); cur_param = next_param+1; return result; } */ void GetWindowPosition() { int position, rez; shared_mem = memopen(#shared_name, 20, SHM_READ); win_x = ESDWORD[shared_mem + 4]; win_y = ESDWORD[shared_mem + 8]; position = ESDWORD[shared_mem + 12]; selected = ESDWORD[shared_mem + 16]; if (position==2) win_x -= menu1.w; if (position==3) { win_x -= menu1.w; win_y -= menu1.h; } if (position==4) win_y -= menu1.h; } void GetMenuItems(dword current_name) { dword next_name = strchr(current_name, '\n'); dword hotkey = strchr(current_name, '|'); ESBYTE[next_name] = '\0'; if (hotkey) && (hotkey < next_name) { ESBYTE[hotkey] = '\0'; } else { if (hotkey) && (!next_name) { ESBYTE[hotkey] = '\0'; } else { hotkey = " "; } } hotkeys.add(hotkey+1); names.add(current_name); if (next_name) GetMenuItems(next_name+2); } void main() { proc_info Form; if (!param) die("'Menu component is for developers only' -I"); GetMenuItems(#param); max_name_len = strlen(names.get(0)) * 6; max_hotkey_len = strlen(hotkeys.get(0)) * 6; menu1.count = names.count; menu1.SetFont(6, 9, 0x80); menu1.SetSizes(2,2, max_name_len + max_hotkey_len + 23, menu1.count*ITEM_H, ITEM_H); menu1.cur_y = -1; GetWindowPosition(); SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE); loop() switch(WaitEvent()) { case evMouse: GetProcessInfo(#Form, SelfInfo); if (!CheckActiveProcess(Form.ID)) exit(); mouse.get(); if (menu1.ProcessMouse(mouse.x, mouse.y)) draw_list(); if (mouse.lkm)&&(mouse.up) click(); break; case evKey: GetKeys(); ProcessKeys(); break; case evReDraw: DefineAndDrawWindow(win_x, win_y, menu1.w+4, menu1.h+3, 0x01, 0, 0, 0x01fffFFF); system.color.get(); Draw3DPopup(0,0,menu1.w+2,menu1.h+2); draw_list(); } } void ProcessKeys() { switch(key_scancode) { case SCAN_CODE_ESC: exit(); case SCAN_CODE_ENTER: click(); case SCAN_CODE_DOWN: if (!menu1.KeyDown()) menu1.KeyHome(); draw_list(); break; case SCAN_CODE_UP: if (!menu1.KeyUp()) menu1.KeyEnd(); draw_list(); break; default: if (menu1.ProcessKey(key_scancode)) draw_list(); } } void draw_list() { int i, item_y; dword active_background_color = MixColors(system.color.work_button, system.color.work,230); dword active_top_border_color = MixColors(system.color.work_graph, system.color.work_button,240); dword inactive_text_shadow_color = MixColors(system.color.work,0xFFFfff,150); dword text_color; bool skin_dark = is_the_skin_dark(); for (i=0; i