| /* |
| htop - Action.c |
| (C) 2014 Hisham H. Muhammad |
| Released under the GNU GPL, see the COPYING file |
| in the source distribution for its full text. |
| */ |
| |
| #include "Process.h" |
| #include "Panel.h" |
| #include "Action.h" |
| #include "ScreenManager.h" |
| |
| /*{ |
| |
| #include "IncSet.h" |
| #include "Settings.h" |
| #include "UsersTable.h" |
| |
| typedef enum { |
| HTOP_OK = 0x00, |
| HTOP_REFRESH = 0x01, |
| HTOP_RECALCULATE = 0x03, // implies HTOP_REFRESH |
| HTOP_SAVE_SETTINGS = 0x04, |
| HTOP_KEEP_FOLLOWING = 0x08, |
| HTOP_QUIT = 0x10, |
| HTOP_REDRAW_BAR = 0x20, |
| HTOP_UPDATE_PANELHDR = 0x41, // implies HTOP_REFRESH |
| } Htop_Reaction; |
| |
| typedef Htop_Reaction (*Htop_Action)(); |
| |
| typedef struct State_ { |
| IncSet* inc; |
| Settings* settings; |
| UsersTable* ut; |
| } State; |
| |
| typedef bool(*Action_ForeachProcessFn)(Process*, size_t); |
| |
| }*/ |
| |
| int Action_selectedPid(Panel* panel) { |
| Process* p = (Process*) Panel_getSelected(panel); |
| if (p) { |
| return p->pid; |
| } |
| return -1; |
| } |
| |
| bool Action_foreachProcess(Panel* panel, Action_ForeachProcessFn fn, int arg, bool* wasAnyTagged) { |
| bool ok = true; |
| bool anyTagged = false; |
| for (int i = 0; i < Panel_size(panel); i++) { |
| Process* p = (Process*) Panel_get(panel, i); |
| if (p->tag) { |
| ok = fn(p, arg) && ok; |
| anyTagged = true; |
| } |
| } |
| if (!anyTagged) { |
| Process* p = (Process*) Panel_getSelected(panel); |
| if (p) ok = fn(p, arg) && ok; |
| } |
| if (wasAnyTagged) |
| *wasAnyTagged = anyTagged; |
| return ok; |
| } |
| |
| Object* Action_pickFromVector(Panel* panel, Panel* list, int x, const char** keyLabels, Header* header) { |
| int y = panel->y; |
| const char* fuKeys[] = {"Enter", "Esc", NULL}; |
| int fuEvents[] = {13, 27}; |
| ScreenManager* scr = ScreenManager_new(0, y, 0, -1, HORIZONTAL, header, false); |
| scr->allowFocusChange = false; |
| ScreenManager_add(scr, list, FunctionBar_new(keyLabels, fuKeys, fuEvents), x - 1); |
| ScreenManager_add(scr, panel, NULL, -1); |
| Panel* panelFocus; |
| int ch; |
| bool unfollow = false; |
| int pid = Action_selectedPid(panel); |
| if (header->pl->following == -1) { |
| header->pl->following = pid; |
| unfollow = true; |
| } |
| ScreenManager_run(scr, &panelFocus, &ch); |
| if (unfollow) { |
| header->pl->following = -1; |
| } |
| ScreenManager_delete(scr); |
| Panel_move(panel, 0, y); |
| Panel_resize(panel, COLS, LINES-y-1); |
| if (panelFocus == list && ch == 13) { |
| Process* selected = (Process*)Panel_getSelected(panel); |
| if (selected && selected->pid == pid) |
| return Panel_getSelected(list); |
| else |
| beep(); |
| } |
| return NULL; |
| } |