summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2018-04-05 19:31:18 -0300
committerHisham Muhammad <hisham@gobolinux.org>2018-04-05 19:38:13 -0300
commit0dbedf95a8fac09bcdab2be89339593973348acb (patch)
treedb2ae61fca98ea0fd4c3b413d7fadd196f38d975
parent42c3a1fcb39458b6f8f39539baef94158bacf164 (diff)
Collapse current subtree pressing Backspace
-rw-r--r--Action.c24
-rw-r--r--Process.c2
-rw-r--r--Process.h2
-rw-r--r--ProcessList.c2
4 files changed, 29 insertions, 1 deletions
diff --git a/Action.c b/Action.c
index 1cb59aa0..518d103b 100644
--- a/Action.c
+++ b/Action.c
@@ -155,6 +155,21 @@ static bool expandCollapse(Panel* panel) {
return true;
}
+static bool collapseIntoParent(Panel* panel) {
+ Process* p = (Process*) Panel_getSelected(panel);
+ if (!p) return false;
+ pid_t ppid = Process_getParentPid(p);
+ for (int i = 0; i < Panel_size(panel); i++) {
+ Process* q = (Process*) Panel_get(panel, i);
+ if (q->pid == ppid) {
+ q->showChildren = false;
+ Panel_setSelected(panel, i);
+ return true;
+ }
+ }
+ return false;
+}
+
Htop_Reaction Action_setSortKey(Settings* settings, ProcessField sortKey) {
settings->sortKey = sortKey;
settings->direction = 1;
@@ -261,6 +276,14 @@ static Htop_Reaction actionExpandOrCollapse(State* st) {
return changed ? HTOP_RECALCULATE : HTOP_OK;
}
+static Htop_Reaction actionCollapseIntoParent(State* st) {
+ if (!st->settings->treeView) {
+ return HTOP_OK;
+ }
+ bool changed = collapseIntoParent(st->panel);
+ return changed ? HTOP_RECALCULATE : HTOP_OK;
+}
+
static Htop_Reaction actionExpandCollapseOrSortColumn(State* st) {
return st->settings->treeView ? actionExpandOrCollapse(st) : actionSetSortColumn(st);
}
@@ -557,6 +580,7 @@ void Action_setBindings(Htop_Action* keys) {
keys['+'] = actionExpandOrCollapse;
keys['='] = actionExpandOrCollapse;
keys['-'] = actionExpandOrCollapse;
+ keys['\177'] = actionCollapseIntoParent;
keys['u'] = actionFilterByUser;
keys['F'] = Action_follow;
keys['S'] = actionSetup;
diff --git a/Process.c b/Process.c
index 845ca54b..471f5299 100644
--- a/Process.c
+++ b/Process.c
@@ -178,6 +178,8 @@ typedef struct ProcessClass_ {
#define As_Process(this_) ((ProcessClass*)((this_)->super.klass))
+#define Process_getParentPid(process_) (process_->tgid == process_->pid ? process_->ppid : process_->tgid)
+
#define Process_isChildOf(process_, pid_) (process_->tgid == pid_ || (process_->tgid == process_->pid && process_->ppid == pid_))
#define Process_sortState(state) ((state) == 'I' ? 0x100 : (state))
diff --git a/Process.h b/Process.h
index fda8480a..f702ca00 100644
--- a/Process.h
+++ b/Process.h
@@ -156,6 +156,8 @@ typedef struct ProcessClass_ {
#define As_Process(this_) ((ProcessClass*)((this_)->super.klass))
+#define Process_getParentPid(process_) (process_->tgid == process_->pid ? process_->ppid : process_->tgid)
+
#define Process_isChildOf(process_, pid_) (process_->tgid == pid_ || (process_->tgid == process_->pid && process_->ppid == pid_))
#define Process_sortState(state) ((state) == 'I' ? 0x100 : (state))
diff --git a/ProcessList.c b/ProcessList.c
index 48b2d955..7482b037 100644
--- a/ProcessList.c
+++ b/ProcessList.c
@@ -228,7 +228,7 @@ void ProcessList_sort(ProcessList* this) {
ProcessList_buildTree(this, process->pid, 0, 0, direction, false);
break;
}
- pid_t ppid = process->tgid == process->pid ? process->ppid : process->tgid;
+ pid_t ppid = Process_getParentPid(process);
// Bisect the process vector to find parent
int l = 0, r = size;
// If PID corresponds with PPID (e.g. "kernel_task" (PID:0, PPID:0)