diff --git a/Action.c b/Action.c index 23f0c840..499422e0 100644 --- a/Action.c +++ b/Action.c @@ -8,6 +8,7 @@ in the source distribution for its full text. #include "Process.h" #include "Panel.h" #include "Action.h" +#include "ScreenManager.h" /*{ @@ -38,6 +39,14 @@ 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; @@ -57,3 +66,35 @@ bool Action_foreachProcess(Panel* panel, Action_ForeachProcessFn fn, int arg, bo 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; +} diff --git a/Action.h b/Action.h index 5a2ce1ce..7571ba41 100644 --- a/Action.h +++ b/Action.h @@ -36,7 +36,10 @@ typedef struct State_ { typedef bool(*Action_ForeachProcessFn)(Process*, size_t); +int Action_selectedPid(Panel* panel); + bool Action_foreachProcess(Panel* panel, Action_ForeachProcessFn fn, int arg, bool* wasAnyTagged); +Object* Action_pickFromVector(Panel* panel, Panel* list, int x, const char** keyLabels, Header* header); #endif diff --git a/Makefile.am b/Makefile.am index 9eb31a79..d3b68662 100644 --- a/Makefile.am +++ b/Makefile.am @@ -35,10 +35,10 @@ HostnameMeter.h OpenFilesScreen.h Affinity.h IncSet.h Action.h if HTOP_LINUX myhtopplatsources = linux/Platform.c linux/IOPriorityPanel.c linux/IOPriority.c \ -linux/LinuxProcessList.c linux/LinuxCRT.c +linux/LinuxProcess.c linux/LinuxProcessList.c linux/LinuxCRT.c myhtopplatheaders = linux/Platform.h linux/IOPriorityPanel.h linux/IOPriority.h \ -linux/LinuxProcessList.h linux/LinuxCRT.h +linux/LinuxProcess.h linux/LinuxProcessList.h linux/LinuxCRT.h endif if HTOP_UNSUPPORTED diff --git a/Process.c b/Process.c index dd08521b..7fc36a1a 100644 --- a/Process.c +++ b/Process.c @@ -26,7 +26,6 @@ in the source distribution for its full text. #include #include #include -#include #ifdef HAVE_LIBHWLOC #include diff --git a/ProcessList.c b/ProcessList.c index 16a52a59..ed9dbca2 100644 --- a/ProcessList.c +++ b/ProcessList.c @@ -10,23 +10,8 @@ in the source distribution for its full text. #include "CRT.h" #include "String.h" -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include /*{ #include "Vector.h" diff --git a/htop.c b/htop.c index e4b4ddf2..e70c270d 100644 --- a/htop.c +++ b/htop.c @@ -195,47 +195,6 @@ static bool changePriority(Panel* panel, int delta) { return anyTagged; } -static int selectedPid(Panel* panel) { - Process* p = (Process*) Panel_getSelected(panel); - if (p) { - return p->pid; - } - return -1; -} - -static Object* 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 = 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; -} - static void addUserToVector(int key, void* userCast, void* panelCast) { char* user = (char*) userCast; Panel* panel = (Panel*) panelCast; @@ -297,7 +256,7 @@ static Htop_Reaction sortBy(Panel* panel, ProcessList* pl, Header* header) { Panel_setSelected(sortPanel, i); free(name); } - ListItem* field = (ListItem*) pickFromVector(panel, sortPanel, 15, fuFunctions, header); + ListItem* field = (ListItem*) Action_pickFromVector(panel, sortPanel, 15, fuFunctions, header); if (field) { reaction |= setSortKey(pl, field->key); } @@ -415,7 +374,7 @@ static Htop_Reaction actionSetAffinity(Panel* panel, ProcessList* pl, Header* he Affinity_delete(affinity); const char* fuFunctions[] = {"Set ", "Cancel ", NULL}; - void* set = pickFromVector(panel, affinityPanel, 15, fuFunctions, header); + void* set = Action_pickFromVector(panel, affinityPanel, 15, fuFunctions, header); if (set) { Affinity* affinity = AffinityPanel_getAffinity(affinityPanel); bool ok = Action_foreachProcess(panel, (Action_ForeachProcessFn) Process_setAffinity, (size_t) affinity, NULL); @@ -434,7 +393,7 @@ static Htop_Reaction actionKill(Panel* panel, ProcessList* pl, Header* header) { (void) pl; Panel* signalsPanel = (Panel*) SignalsPanel_new(); const char* fuFunctions[] = {"Send ", "Cancel ", NULL}; - ListItem* sgn = (ListItem*) pickFromVector(panel, signalsPanel, 15, fuFunctions, header); + ListItem* sgn = (ListItem*) Action_pickFromVector(panel, signalsPanel, 15, fuFunctions, header); if (sgn) { if (sgn->key != 0) { Panel_setHeader(panel, "Sending..."); @@ -456,7 +415,7 @@ static Htop_Reaction actionFilterByUser(Panel* panel, ProcessList* pl, Header* h ListItem* allUsers = ListItem_new("All users", -1); Panel_insert(usersPanel, 0, (Object*) allUsers); const char* fuFunctions[] = {"Show ", "Cancel ", NULL}; - ListItem* picked = (ListItem*) pickFromVector(panel, usersPanel, 20, fuFunctions, header); + ListItem* picked = (ListItem*) Action_pickFromVector(panel, usersPanel, 20, fuFunctions, header); if (picked) { if (picked == allUsers) { pl->userOnly = false; @@ -790,7 +749,7 @@ int main(int argc, char** argv) { double newTime = ((double)tv.tv_sec * 10) + ((double)tv.tv_usec / 100000); bool timeToRecalculate = (newTime - oldTime > settings->delay); if (newTime < oldTime) timeToRecalculate = true; // clock was adjusted? - int following = follow ? selectedPid(panel) : -1; + int following = follow ? Action_selectedPid(panel) : -1; if (timeToRecalculate) { Header_draw(header); oldTime = newTime; diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c index 9b509a98..be4e627a 100644 --- a/linux/LinuxProcess.c +++ b/linux/LinuxProcess.c @@ -6,9 +6,17 @@ in the source distribution for its full text. */ #include "Process.h" +#include "ProcessList.h" +#include "LinuxProcess.h" +#include "CRT.h" + +#include +#include /*{ +#include "IOPriority.h" + typedef struct LinuxProcess_ { Process super; IOPriority ioPriority; @@ -24,26 +32,29 @@ effort class. The priority within the best effort class will be dynamically derived from the cpu nice level of the process: io_priority = (cpu_nice + 20) / 5. -- From ionice(1) man page */ -#define LinuxProcess_effectiveIOPriority(p_) (IOPriority_class(p_->ioPriority) == IOPRIO_CLASS_NONE ? IOPriority_tuple(IOPRIO_CLASS_BE, (p_->nice + 20) / 5) : p_->ioPriority) +#define LinuxProcess_effectiveIOPriority(p_) (IOPriority_class(p_->ioPriority) == IOPRIO_CLASS_NONE ? IOPriority_tuple(IOPRIO_CLASS_BE, (p_->super.nice + 20) / 5) : p_->ioPriority) -IOPriority LinuxProcess_updateIOPriority(Process* this) { - IOPriority ioprio = syscall(SYS_ioprio_get, IOPRIO_WHO_PROCESS, this->pid); +IOPriority LinuxProcess_updateIOPriority(LinuxProcess* this) { + IOPriority ioprio = syscall(SYS_ioprio_get, IOPRIO_WHO_PROCESS, this->super.pid); this->ioPriority = ioprio; return ioprio; } -bool LinuxProcess_setIOPriority(Process* this, IOPriority ioprio) { - syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, this->pid, ioprio); - return (Process_updateIOPriority(this) == ioprio); +bool LinuxProcess_setIOPriority(LinuxProcess* this, IOPriority ioprio) { + syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, this->super.pid, ioprio); + return (LinuxProcess_updateIOPriority(this) == ioprio); } -void LinuxProcess_writeField(Process* this, RichString* str, ProcessField field) { +void LinuxProcess_writeField(LinuxProcess* this, RichString* str, ProcessField field) { + char buffer[256]; buffer[255] = '\0'; + int attr = CRT_colors[DEFAULT_COLOR]; + int n = sizeof(buffer) - 1; switch (field) { case IO_PRIORITY: { int klass = IOPriority_class(this->ioPriority); if (klass == IOPRIO_CLASS_NONE) { // see note [1] above - snprintf(buffer, n, "B%1d ", (int) (this->nice + 20) / 5); + snprintf(buffer, n, "B%1d ", (int) (this->super.nice + 20) / 5); } else if (klass == IOPRIO_CLASS_BE) { snprintf(buffer, n, "B%1d ", IOPriority_data(this->ioPriority)); } else if (klass == IOPRIO_CLASS_RT) { @@ -61,7 +72,6 @@ void LinuxProcess_writeField(Process* this, RichString* str, ProcessField field) snprintf(buffer, n, "- "); } RichString_append(str, attr, buffer); - } } long LinuxProcess_compare(const void* v1, const void* v2) { @@ -76,10 +86,8 @@ long LinuxProcess_compare(const void* v1, const void* v2) { } switch (pl->sortKey) { case IO_PRIORITY: - return Process_effectiveIOPriority(p1) - Process_effectiveIOPriority(p2); + return LinuxProcess_effectiveIOPriority(p1) - LinuxProcess_effectiveIOPriority(p2); default: - return (p1->pid - p2->pid); + return (p1->super.pid - p2->super.pid); } - test_diff: - return (diff > 0) ? 1 : (diff < 0 ? -1 : 0); } diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index ff85a2c7..7bad637d 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -5,10 +5,32 @@ Released under the GNU GPL, see the COPYING file in the source distribution for its full text. */ -#include "ProcessList.h" +#include "LinuxProcessList.h" +#include "LinuxProcess.h" +#include "CRT.h" +#include "String.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /*{ +#include "ProcessList.h" + #ifndef PROCDIR #define PROCDIR "/proc" #endif @@ -463,7 +485,7 @@ static bool LinuxProcessList_processEntries(ProcessList* this, const char* dirna if (! LinuxProcessList_readStatFile(process, dirname, name, command)) goto errorReadingProcess; if (this->flags & PROCESS_FLAG_IOPRIO) - Process_updateIOPriority(process); + LinuxProcess_updateIOPriority((LinuxProcess*)process); float percent_cpu = (process->utime + process->stime - lasttimes) / period * 100.0; process->percent_cpu = MAX(MIN(percent_cpu, cpus*100.0), 0.0); if (isnan(process->percent_cpu)) process->percent_cpu = 0.0; diff --git a/linux/Platform.c b/linux/Platform.c index 496343df..5e62dc05 100644 --- a/linux/Platform.c +++ b/linux/Platform.c @@ -5,20 +5,26 @@ Released under the GNU GPL, see the COPYING file in the source distribution for its full text. */ +#include "Platform.h" #include "IOPriority.h" #include "IOPriorityPanel.h" +#include "LinuxProcess.h" + +/*{ +#include "Action.h" +}*/ static Htop_Reaction Platform_actionSetIOPriority(Panel* panel, ProcessList* pl, Header* header) { (void) panel, (void) pl; - Process* p = (Process*) Panel_getSelected(panel); + LinuxProcess* p = (LinuxProcess*) Panel_getSelected(panel); if (!p) return HTOP_OK; IOPriority ioprio = p->ioPriority; Panel* ioprioPanel = IOPriorityPanel_new(ioprio); const char* fuFunctions[] = {"Set ", "Cancel ", NULL}; - void* set = pickFromVector(panel, ioprioPanel, 21, fuFunctions, header); + void* set = Action_pickFromVector(panel, ioprioPanel, 21, fuFunctions, header); if (set) { IOPriority ioprio = IOPriorityPanel_getIOPriority(ioprioPanel); - bool ok = Action_foreachProcess(panel, (Action_ForeachProcessFn) Process_setIOPriority, (size_t) ioprio, NULL); + bool ok = Action_foreachProcess(panel, (Action_ForeachProcessFn) LinuxProcess_setIOPriority, (size_t) ioprio, NULL); if (!ok) beep(); }