summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci.yml29
-rw-r--r--Action.c44
-rw-r--r--Action.h10
-rw-r--r--Affinity.c7
-rw-r--r--Affinity.h15
-rw-r--r--AffinityPanel.h4
-rw-r--r--AvailableColumnsPanel.h2
-rw-r--r--AvailableMetersPanel.c2
-rw-r--r--AvailableMetersPanel.h2
-rw-r--r--CPUMeter.c6
-rw-r--r--CRT.c39
-rw-r--r--CRT.h33
-rw-r--r--CategoriesPanel.h4
-rw-r--r--CheckItem.h8
-rw-r--r--ColorsPanel.h2
-rw-r--r--ColumnsPanel.h6
-rw-r--r--DisplayOptionsPanel.h2
-rw-r--r--EnvScreen.h8
-rw-r--r--FunctionBar.h14
-rw-r--r--Hashtable.h12
-rw-r--r--Header.c2
-rw-r--r--Header.h26
-rw-r--r--IncSet.c44
-rw-r--r--IncSet.h20
-rw-r--r--InfoScreen.c5
-rw-r--r--InfoScreen.h12
-rw-r--r--ListItem.h8
-rw-r--r--MainPanel.c6
-rw-r--r--MainPanel.h22
-rw-r--r--Makefile.am6
-rw-r--r--Meter.c3
-rw-r--r--Meter.h12
-rw-r--r--MetersPanel.h4
-rw-r--r--Object.c6
-rw-r--r--Object.h8
-rw-r--r--OpenFilesScreen.c1
-rw-r--r--OpenFilesScreen.h8
-rw-r--r--Panel.h46
-rw-r--r--Process.c41
-rw-r--r--Process.h36
-rw-r--r--ProcessList.h28
-rw-r--r--README54
-rw-r--r--RichString.h16
-rw-r--r--ScreenManager.h12
-rw-r--r--Settings.h8
-rw-r--r--SignalsPanel.h2
-rw-r--r--StringUtils.c5
-rw-r--r--StringUtils.h12
-rw-r--r--TasksMeter.c2
-rw-r--r--TraceScreen.c2
-rw-r--r--TraceScreen.h12
-rw-r--r--UsersTable.h6
-rw-r--r--Vector.h26
-rw-r--r--XAlloc.h10
-rw-r--r--configure.ac9
-rw-r--r--darwin/Platform.c2
-rw-r--r--dragonflybsd/DragonFlyBSDProcess.c4
-rw-r--r--freebsd/FreeBSDProcess.c4
-rw-r--r--freebsd/FreeBSDProcessList.c51
-rw-r--r--htop.1.in84
-rw-r--r--htop.c16
-rw-r--r--htop.desktop2
-rw-r--r--htop.h2
-rw-r--r--linux/Battery.c12
-rw-r--r--linux/Battery.h2
-rw-r--r--linux/IOPriorityPanel.h4
-rw-r--r--linux/LinuxCRT.h2
-rw-r--r--linux/LinuxProcess.c33
-rw-r--r--linux/LinuxProcess.h29
-rw-r--r--linux/LinuxProcessList.c86
-rw-r--r--linux/LinuxProcessList.h10
-rw-r--r--linux/Platform.c26
-rw-r--r--linux/Platform.h20
-rw-r--r--linux/PressureStallMeter.c133
-rw-r--r--linux/PressureStallMeter.h25
-rw-r--r--openbsd/Battery.c1
-rw-r--r--openbsd/Battery.h1
-rw-r--r--openbsd/OpenBSDProcess.c2
-rw-r--r--openbsd/OpenBSDProcessList.c142
-rw-r--r--openbsd/OpenBSDProcessList.h18
-rw-r--r--openbsd/Platform.c106
-rw-r--r--openbsd/Platform.h15
-rwxr-xr-xscripts/MakeHeader.py4
-rw-r--r--solaris/SolarisProcess.c2
-rw-r--r--solaris/SolarisProcessList.c8
-rw-r--r--solaris/SolarisProcessList.h2
-rw-r--r--unsupported/Platform.c2
87 files changed, 1063 insertions, 556 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..74d0ece8
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,29 @@
+name: CI
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ build-ubuntu-latest:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Build
+ run: |
+ sudo apt-get install libncursesw5-dev
+ ./autogen.sh
+ ./configure
+ make
+
+# build-macos-latest:
+# runs-on: macos-latest
+# steps:
+# - uses: actions/checkout@v2
+# - name: make
+# run: |
+# ./autogen.sh
+# ./configure
+# make
diff --git a/Action.c b/Action.c
index dba77563..825e743d 100644
--- a/Action.c
+++ b/Action.c
@@ -62,7 +62,7 @@ typedef struct State_ {
}*/
-Object* Action_pickFromVector(State* st, Panel* list, int x) {
+Object* Action_pickFromVector(State* st, Panel* list, int x, bool followProcess) {
Panel* panel = st->panel;
Header* header = st->header;
Settings* settings = st->settings;
@@ -75,8 +75,8 @@ Object* Action_pickFromVector(State* st, Panel* list, int x) {
Panel* panelFocus;
int ch;
bool unfollow = false;
- int pid = MainPanel_selectedPid((MainPanel*)panel);
- if (header->pl->following == -1) {
+ int pid = followProcess ? MainPanel_selectedPid((MainPanel*)panel) : -1;
+ if (followProcess && header->pl->following == -1) {
header->pl->following = pid;
unfollow = true;
}
@@ -88,11 +88,16 @@ Object* Action_pickFromVector(State* st, Panel* list, int x) {
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)
+ if (followProcess) {
+ Process* selected = (Process*)Panel_getSelected(panel);
+ if (selected && selected->pid == pid)
+ return Panel_getSelected(list);
+ else
+ beep();
+ } else {
return Panel_getSelected(list);
- else
- beep();
+ }
+
}
return NULL;
}
@@ -189,7 +194,7 @@ static Htop_Reaction sortBy(State* st) {
Panel_setSelected(sortPanel, i);
free(name);
}
- ListItem* field = (ListItem*) Action_pickFromVector(st, sortPanel, 15);
+ ListItem* field = (ListItem*) Action_pickFromVector(st, sortPanel, 15, false);
if (field) {
reaction |= Action_setSortKey(st->settings, field->key);
}
@@ -248,10 +253,21 @@ static Htop_Reaction actionIncFilter(State* st) {
}
static Htop_Reaction actionIncSearch(State* st) {
+ IncSet_reset(((MainPanel*)st->panel)->inc, INC_SEARCH);
IncSet_activate(((MainPanel*)st->panel)->inc, INC_SEARCH, st->panel);
return HTOP_REFRESH | HTOP_KEEP_FOLLOWING;
}
+static Htop_Reaction actionIncNext(State* st) {
+ IncSet_next(((MainPanel*)st->panel)->inc, INC_SEARCH, st->panel, (IncMode_GetPanelValue) MainPanel_getValue);
+ return HTOP_REFRESH | HTOP_KEEP_FOLLOWING;
+}
+
+static Htop_Reaction actionIncPrev(State* st) {
+ IncSet_prev(((MainPanel*)st->panel)->inc, INC_SEARCH, st->panel, (IncMode_GetPanelValue) MainPanel_getValue);
+ return HTOP_REFRESH | HTOP_KEEP_FOLLOWING;
+}
+
static Htop_Reaction actionHigherPriority(State* st) {
bool changed = changePriority((MainPanel*)st->panel, -1);
return changed ? HTOP_REFRESH : HTOP_OK;
@@ -305,7 +321,7 @@ static Htop_Reaction actionSetAffinity(State* st) {
Panel* affinityPanel = AffinityPanel_new(st->pl, affinity);
Affinity_delete(affinity);
- void* set = Action_pickFromVector(st, affinityPanel, 15);
+ void* set = Action_pickFromVector(st, affinityPanel, 15, true);
if (set) {
Affinity* affinity = AffinityPanel_getAffinity(affinityPanel, st->pl);
bool ok = MainPanel_foreachProcess((MainPanel*)panel, (MainPanel_ForeachProcessFn) Affinity_set, (Arg){ .v = affinity }, NULL);
@@ -319,7 +335,7 @@ static Htop_Reaction actionSetAffinity(State* st) {
static Htop_Reaction actionKill(State* st) {
Panel* signalsPanel = (Panel*) SignalsPanel_new();
- ListItem* sgn = (ListItem*) Action_pickFromVector(st, signalsPanel, 15);
+ ListItem* sgn = (ListItem*) Action_pickFromVector(st, signalsPanel, 15, true);
if (sgn) {
if (sgn->key != 0) {
Panel_setHeader(st->panel, "Sending...");
@@ -340,7 +356,7 @@ static Htop_Reaction actionFilterByUser(State* st) {
Vector_insertionSort(usersPanel->items);
ListItem* allUsers = ListItem_new("All users", -1);
Panel_insert(usersPanel, 0, (Object*) allUsers);
- ListItem* picked = (ListItem*) Action_pickFromVector(st, usersPanel, 20);
+ ListItem* picked = (ListItem*) Action_pickFromVector(st, usersPanel, 20, false);
if (picked) {
if (picked == allUsers) {
st->pl->userId = -1;
@@ -463,7 +479,7 @@ static Htop_Reaction actionHelp(State* st) {
if (settings->detailedCPUTime) {
addattrstr(CRT_colors[CPU_NICE_TEXT], "low"); addstr("/");
addattrstr(CRT_colors[CPU_NORMAL], "normal"); addstr("/");
- addattrstr(CRT_colors[CPU_KERNEL], "kernel"); addstr("/");
+ addattrstr(CRT_colors[CPU_SYSTEM], "kernel"); addstr("/");
addattrstr(CRT_colors[CPU_IRQ], "irq"); addstr("/");
addattrstr(CRT_colors[CPU_SOFTIRQ], "soft-irq"); addstr("/");
addattrstr(CRT_colors[CPU_STEAL], "steal"); addstr("/");
@@ -473,7 +489,7 @@ static Htop_Reaction actionHelp(State* st) {
} else {
addattrstr(CRT_colors[CPU_NICE_TEXT], "low-priority"); addstr("/");
addattrstr(CRT_colors[CPU_NORMAL], "normal"); addstr("/");
- addattrstr(CRT_colors[CPU_KERNEL], "kernel"); addstr("/");
+ addattrstr(CRT_colors[CPU_SYSTEM], "kernel"); addstr("/");
addattrstr(CRT_colors[CPU_GUEST], "virtualiz");
addattrstr(CRT_colors[BAR_SHADOW], " used%");
}
@@ -559,6 +575,8 @@ void Action_setBindings(Htop_Action* keys) {
keys['\\'] = actionIncFilter;
keys[KEY_F(3)] = actionIncSearch;
keys['/'] = actionIncSearch;
+ keys['n'] = actionIncNext;
+ keys['N'] = actionIncPrev;
keys[']'] = actionHigherPriority;
keys[KEY_F(7)] = actionHigherPriority;
diff --git a/Action.h b/Action.h
index 1dfdcb47..c49e9dac 100644
--- a/Action.h
+++ b/Action.h
@@ -39,20 +39,20 @@ typedef struct State_ {
} State;
-Object* Action_pickFromVector(State* st, Panel* list, int x);
+extern Object* Action_pickFromVector(State* st, Panel* list, int x, bool followProcess);
// ----------------------------------------
-bool Action_setUserOnly(const char* userName, uid_t* userId);
+extern bool Action_setUserOnly(const char* userName, uid_t* userId);
-Htop_Reaction Action_setSortKey(Settings* settings, ProcessField sortKey);
+extern Htop_Reaction Action_setSortKey(Settings* settings, ProcessField sortKey);
// ----------------------------------------
-Htop_Reaction Action_follow(State* st);
+extern Htop_Reaction Action_follow(State* st);
-void Action_setBindings(Htop_Action* keys);
+extern void Action_setBindings(Htop_Action* keys);
#endif
diff --git a/Affinity.c b/Affinity.c
index c928fec1..b6eafcee 100644
--- a/Affinity.c
+++ b/Affinity.c
@@ -1,6 +1,7 @@
/*
htop - Affinity.c
(C) 2004-2011 Hisham H. Muhammad
+(C) 2020 Red Hat, Inc. All Rights Reserved.
Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
@@ -79,7 +80,8 @@ Affinity* Affinity_get(Process* proc, ProcessList* pl) {
return affinity;
}
-bool Affinity_set(Process* proc, Affinity* this) {
+bool Affinity_set(Process* proc, Arg arg) {
+ Affinity *this = arg.v;
hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
for (int i = 0; i < this->used; i++) {
hwloc_bitmap_set(cpuset, this->cpus[i]);
@@ -103,7 +105,8 @@ Affinity* Affinity_get(Process* proc, ProcessList* pl) {
return affinity;
}
-bool Affinity_set(Process* proc, Affinity* this) {
+bool Affinity_set(Process* proc, Arg arg) {
+ Affinity *this = arg.v;
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
for (int i = 0; i < this->used; i++) {
diff --git a/Affinity.h b/Affinity.h
index fd2c599e..3c716034 100644
--- a/Affinity.h
+++ b/Affinity.h
@@ -5,6 +5,7 @@
/*
htop - Affinity.h
(C) 2004-2011 Hisham H. Muhammad
+(C) 2020 Red Hat, Inc. All Rights Reserved.
Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
@@ -29,23 +30,23 @@ typedef struct Affinity_ {
} Affinity;
-Affinity* Affinity_new(ProcessList* pl);
+extern Affinity* Affinity_new(ProcessList* pl);
-void Affinity_delete(Affinity* this);
+extern void Affinity_delete(Affinity* this);
-void Affinity_add(Affinity* this, int id);
+extern void Affinity_add(Affinity* this, int id);
#ifdef HAVE_LIBHWLOC
-Affinity* Affinity_get(Process* proc, ProcessList* pl);
+extern Affinity* Affinity_get(Process* proc, ProcessList* pl);
-bool Affinity_set(Process* proc, Affinity* this);
+extern bool Affinity_set(Process* proc, Arg arg);
#elif HAVE_LINUX_AFFINITY
-Affinity* Affinity_get(Process* proc, ProcessList* pl);
+extern Affinity* Affinity_get(Process* proc, ProcessList* pl);
-bool Affinity_set(Process* proc, Affinity* this);
+extern bool Affinity_set(Process* proc, Arg arg);
#endif
diff --git a/AffinityPanel.h b/AffinityPanel.h
index 2b6059b0..3a9c7807 100644
--- a/AffinityPanel.h
+++ b/AffinityPanel.h
@@ -16,8 +16,8 @@ in the source distribution for its full text.
extern PanelClass AffinityPanel_class;
-Panel* AffinityPanel_new(ProcessList* pl, Affinity* affinity);
+extern Panel* AffinityPanel_new(ProcessList* pl, Affinity* affinity);
-Affinity* AffinityPanel_getAffinity(Panel* this, ProcessList* pl);
+extern Affinity* AffinityPanel_getAffinity(Panel* this, ProcessList* pl);
#endif
diff --git a/AvailableColumnsPanel.h b/AvailableColumnsPanel.h
index 5a8371dd..2d6daf4b 100644
--- a/AvailableColumnsPanel.h
+++ b/AvailableColumnsPanel.h
@@ -19,6 +19,6 @@ typedef struct AvailableColumnsPanel_ {
extern PanelClass AvailableColumnsPanel_class;
-AvailableColumnsPanel* AvailableColumnsPanel_new(Panel* columns);
+extern AvailableColumnsPanel* AvailableColumnsPanel_new(Panel* columns);
#endif
diff --git a/AvailableMetersPanel.c b/AvailableMetersPanel.c
index f670f6b7..5dac10b9 100644
--- a/AvailableMetersPanel.c
+++ b/AvailableMetersPanel.c
@@ -127,7 +127,7 @@ AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Header* heade
Panel_add(super, (Object*) ListItem_new("CPU average", 0));
for (int i = 1; i <= cpus; i++) {
char buffer[50];
- xSnprintf(buffer, 50, "%s %d", type->uiName, i);
+ xSnprintf(buffer, 50, "%s %d", type->uiName, Settings_cpuId(this->settings, i - 1));
Panel_add(super, (Object*) ListItem_new(buffer, i));
}
} else {
diff --git a/AvailableMetersPanel.h b/AvailableMetersPanel.h
index e9b949b0..00e0f596 100644
--- a/AvailableMetersPanel.h
+++ b/AvailableMetersPanel.h
@@ -27,6 +27,6 @@ typedef struct AvailableMetersPanel_ {
extern PanelClass AvailableMetersPanel_class;
-AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Header* header, Panel* leftMeters, Panel* rightMeters, ScreenManager* scr, ProcessList* pl);
+extern AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Header* header, Panel* leftMeters, Panel* rightMeters, ScreenManager* scr, ProcessList* pl);
#endif
diff --git a/CPUMeter.c b/CPUMeter.c
index 8fbd1d45..8a23c487 100644
--- a/CPUMeter.c
+++ b/CPUMeter.c
@@ -34,7 +34,7 @@ typedef enum {
}*/
int CPUMeter_attributes[] = {
- CPU_NICE, CPU_NORMAL, CPU_KERNEL, CPU_IRQ, CPU_SOFTIRQ, CPU_STEAL, CPU_GUEST, CPU_IOWAIT
+ CPU_NICE, CPU_NORMAL, CPU_SYSTEM, CPU_IRQ, CPU_SOFTIRQ, CPU_STEAL, CPU_GUEST, CPU_IOWAIT
};
#ifndef MIN
@@ -80,7 +80,7 @@ static void CPUMeter_display(Object* cast, RichString* out) {
if (this->pl->settings->detailedCPUTime) {
xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_KERNEL]);
RichString_append(out, CRT_colors[METER_TEXT], "sy:");
- RichString_append(out, CRT_colors[CPU_KERNEL], buffer);
+ RichString_append(out, CRT_colors[CPU_SYSTEM], buffer);
xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_NICE]);
RichString_append(out, CRT_colors[METER