summaryrefslogtreecommitdiffstats
path: root/htop.c
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2011-09-08 01:17:26 +0000
committerHisham Muhammad <hisham@gobolinux.org>2011-09-08 01:17:26 +0000
commit11092662eea7bb9fe2230cd2c0e6beb664c520c9 (patch)
tree90a3ed812c730b5df9f4c51ea9011c6cd1505764 /htop.c
parent3f3213b2e215ba947e1155cd591f6f73e1ffce76 (diff)
incremental filtering
plus some fixes
Diffstat (limited to 'htop.c')
-rw-r--r--htop.c131
1 files changed, 91 insertions, 40 deletions
diff --git a/htop.c b/htop.c
index d737ff35..2540b3de 100644
--- a/htop.c
+++ b/htop.c
@@ -118,7 +118,7 @@ static void showHelp(ProcessList* pl) {
mvaddstr( 9, 0, " Arrows: scroll process list F5 t: tree view");
mvaddstr(10, 0, " Digits: incremental PID search u: show processes of a single user");
mvaddstr(11, 0, " F3 /: incremental name search H: hide/show user threads");
- mvaddstr(12, 0, " K: hide/show kernel threads");
+ mvaddstr(12, 0, " F4 \\: incremental name filtering K: hide/show kernel threads");
mvaddstr(13, 0, " Space: tag processes F: cursor follows process");
mvaddstr(14, 0, " U: untag all processes + -: expand/collapse tree");
mvaddstr(15, 0, " F9 k: kill process/tagged processes P: sort by CPU%");
@@ -126,10 +126,10 @@ static void showHelp(ProcessList* pl) {
mvaddstr(17, 0, " [ F8: lower priority (+ nice) T: sort by TIME");
#ifdef HAVE_PLPA
if (pl->cpuCount > 1)
- mvaddstr(18, 0, " a: set CPU affinity F4 I: invert sort order");
+ mvaddstr(18, 0, " a: set CPU affinity I: invert sort order");
else
#endif
- mvaddstr(18, 0, " F4 I: invert sort order");
+ mvaddstr(18, 0, " I: invert sort order");
mvaddstr(19, 0, " F2 S: setup F6 >: select sort column");
mvaddstr(20, 0, " F1 h: show this help screen l: list open files with lsof");
mvaddstr(21, 0, " F10 q: quit s: trace syscalls with strace");
@@ -138,7 +138,7 @@ static void showHelp(ProcessList* pl) {
mvaddstr( 9, 0, " Arrows"); mvaddstr( 9,40, " F5 t");
mvaddstr(10, 0, " Digits"); mvaddstr(10,40, " u");
mvaddstr(11, 0, " F3 /"); mvaddstr(11,40, " H");
- mvaddstr(12,40, " K");
+ mvaddstr(12, 0, " F4 \\"); mvaddstr(12,40, " K");
mvaddstr(13, 0, " Space"); mvaddstr(13,40, " F");
mvaddstr(14, 0, " U"); mvaddstr(14,40, " + -");
mvaddstr(15, 0, " F9 k"); mvaddstr(15,40, " P");
@@ -246,6 +246,17 @@ static inline void setSortKey(ProcessList* pl, ProcessField sortKey, Panel* pane
ProcessList_printHeader(pl, Panel_getHeader(panel));
}
+typedef struct IncBuffer_ {
+ char buffer[INCSEARCH_MAX];
+ int index;
+ FunctionBar* bar;
+} IncBuffer;
+
+static void IncBuffer_reset(IncBuffer* inc) {
+ inc->index = 0;
+ inc->buffer[0] = 0;
+}
+
int main(int argc, char** argv) {
int delay = -1;
@@ -334,12 +345,7 @@ int main(int argc, char** argv) {
Settings* settings;
Panel* killPanel = NULL;
-
- char incSearchBuffer[INCSEARCH_MAX];
- int incSearchIndex = 0;
- incSearchBuffer[0] = 0;
- bool incSearchMode = false;
-
+
ProcessList* pl = NULL;
UsersTable* ut = UsersTable_new();
@@ -364,13 +370,25 @@ int main(int argc, char** argv) {
pl->direction = 1;
}
ProcessList_printHeader(pl, Panel_getHeader(panel));
-
- const char* searchFunctions[] = {"Next ", "Exit ", " Search: ", NULL};
+
+ IncBuffer incSearch, incFilter;
+ bool filtering = false;
+
+ memset(&incSearch, 0, sizeof(IncBuffer));
+ const char* searchFunctions[] = {"Next ", "Cancel ", " Search: ", NULL};
const char* searchKeys[] = {"F3", "Esc", " "};
int searchEvents[] = {KEY_F(3), 27, ERR};
- FunctionBar* searchBar = FunctionBar_new(searchFunctions, searchKeys, searchEvents);
+ incSearch.bar = FunctionBar_new(searchFunctions, searchKeys, searchEvents);
+
+ memset(&incFilter, 0, sizeof(IncBuffer));
+ const char* filterFunctions[] = {"Done ", "Clear ", " Filter: ", NULL};
+ const char* filterKeys[] = {"Enter", "Esc", " "};
+ int filterEvents[] = {13, 27, ERR};
+ incFilter.bar = FunctionBar_new(filterFunctions, filterKeys, filterEvents);
- const char* defaultFunctions[] = {"Help ", "Setup ", "Search", "Invert", "Tree ",
+ IncBuffer* incMode = NULL;
+
+ const char* defaultFunctions[] = {"Help ", "Setup ", "Search", "Filter", "Tree ",
"SortBy", "Nice -", "Nice +", "Kill ", "Quit ", NULL};
FunctionBar* defaultBar = FunctionBar_new(defaultFunctions, NULL, NULL);
@@ -397,6 +415,7 @@ int main(int argc, char** argv) {
if (recalculate)
oldTime = newTime;
if (doRefresh) {
+
int currPos = Panel_getSelectedIndex(panel);
pid_t currPid = 0;
int currScrollV = panel->scrollV;
@@ -414,8 +433,15 @@ int main(int argc, char** argv) {
int size = ProcessList_size(pl);
int idx = 0;
for (int i = 0; i < size; i++) {
+ bool hidden = false;
Process* p = ProcessList_get(pl, i);
- if (p->show && (!userOnly || (p->st_uid == userId))) {
+
+ if ( (!p->show)
+ || (userOnly && (p->st_uid != userId))
+ || (filtering && !(String_contains_i(p->comm, incFilter.buffer))) )
+ hidden = true;
+
+ if (!hidden) {
Panel_set(panel, idx, (Object*)p);
if ((!follow && idx == currPos) || (follow && p->pid == currPid)) {
Panel_setSelected(panel, idx);
@@ -431,10 +457,11 @@ int main(int argc, char** argv) {
Panel_draw(panel, true);
int prev = ch;
+ move(LINES-1, CRT_cursorX);
ch = getch();
if (ch == ERR) {
- if (!incSearchMode)
+ if (!incMode)
refreshTimeout--;
if (prev == ch && !recalculate) {
closeTimeout++;
@@ -446,7 +473,7 @@ int main(int argc, char** argv) {
continue;
}
- if (incSearchMode) {
+ if (incMode) {
doRefresh = false;
int size = Panel_size(panel);
if (ch == KEY_F(3)) {
@@ -456,22 +483,40 @@ int main(int argc, char** argv) {
if (i == size)
i = 0;
Process* p = (Process*) Panel_get(panel, i);
- if (String_contains_i(p->comm, incSearchBuffer)) {
+ if (String_contains_i(p->comm, incMode->buffer)) {
Panel_setSelected(panel, i);
break;
}
i++;
}
continue;
- } else if (isprint((char)ch) && (incSearchIndex < INCSEARCH_MAX)) {
- incSearchBuffer[incSearchIndex] = ch;
- incSearchIndex++;
- incSearchBuffer[incSearchIndex] = 0;
- } else if ((ch == KEY_BACKSPACE || ch == 127) && (incSearchIndex > 0)) {
- incSearchIndex--;
- incSearchBuffer[incSearchIndex] = 0;
+ } else if (isprint((char)ch) && (incMode->index < INCSEARCH_MAX)) {
+ incMode->buffer[incMode->index] = ch;
+ incMode->index++;
+ incMode->buffer[incMode->index] = 0;
+ if (incMode == &incFilter) {
+ doRefresh = true;
+ if (incFilter.index == 1) filtering = true;
+ }
+ } else if ((ch == KEY_BACKSPACE || ch == 127) && (incMode->index > 0)) {
+ incMode->index--;
+ incMode->buffer[incMode->index] = 0;
+ if (incMode == &incFilter) {
+ doRefresh = true;
+ if (incFilter.index == 0) {
+ filtering = false;
+ IncBuffer_reset(incMode);
+ }
+ }
} else {
- incSearchMode = false;
+ if (incMode == &incFilter) {
+ doRefresh = true;
+ if (ch == 27) {
+ filtering = false;
+ IncBuffer_reset(incMode);
+ }
+ }
+ incMode = NULL;
FunctionBar_draw(defaultBar, NULL);
continue;
}
@@ -479,16 +524,16 @@ int main(int argc, char** argv) {
bool found = false;
for (int i = 0; i < size; i++) {
Process* p = (Process*) Panel_get(panel, i);
- if (String_contains_i(p->comm, incSearchBuffer)) {
+ if (String_contains_i(p->comm, incSearch.buffer)) {
Panel_setSelected(panel, i);
found = true;
break;
}
}
if (found)
- FunctionBar_draw(searchBar, incSearchBuffer);
+ FunctionBar_draw(incMode->bar, incMode->buffer);
else
- FunctionBar_drawAttr(searchBar, incSearchBuffer, CRT_colors[FAILED_SEARCH]);
+ FunctionBar_drawAttr(incMode->bar, incMode->buffer, CRT_colors[FAILED_SEARCH]);
continue;
}
if (isdigit((char)ch)) {
@@ -527,7 +572,7 @@ int main(int argc, char** argv) {
continue;
} if (mevent.y == LINES - 1) {
FunctionBar* bar;
- if (incSearchMode) bar = searchBar;
+ if (incMode) bar = incMode->bar;
else bar = defaultBar;
ch = FunctionBar_synthesizeEvent(bar, mevent.x);
}
@@ -544,8 +589,8 @@ int main(int argc, char** argv) {
switch (ch) {
case KEY_RESIZE:
Panel_resize(panel, COLS, LINES-headerHeight-1);
- if (incSearchMode)
- FunctionBar_draw(searchBar, incSearchBuffer);
+ if (incMode)
+ FunctionBar_draw(incMode->bar, incMode->buffer);
else
FunctionBar_draw(defaultBar, NULL);
break;
@@ -653,11 +698,11 @@ int main(int argc, char** argv) {
if (picked) {
if (picked == allUsers) {
userOnly = false;
- break;
} else {
setUserOnly(ListItem_getRef(picked), &userOnly, &userId);
}
}
+ Panel_delete((Object*)usersPanel);
break;
}
case '+':
@@ -773,7 +818,6 @@ int main(int argc, char** argv) {
break;
}
case 'I':
- case KEY_F(4):
{
refreshTimeout = 0;
settings->changed = true;
@@ -794,11 +838,17 @@ int main(int argc, char** argv) {
}
case KEY_F(3):
case '/':
- incSearchIndex = 0;
- incSearchBuffer[0] = 0;
- incSearchMode = true;
- FunctionBar_draw(searchBar, incSearchBuffer);
+ incMode = &incSearch;
+ IncBuffer_reset(incMode);
+ FunctionBar_draw(incSearch.bar, incSearch.buffer);
break;
+ case KEY_F(4):
+ case '\\':
+ incMode = &incFilter;
+ refreshTimeout = 0;
+ doRefresh = true;
+ FunctionBar_draw(incFilter.bar, incFilter.buffer);
+ continue;
case 't':
case KEY_F(5):
refreshTimeout = 0;
@@ -837,9 +887,10 @@ int main(int argc, char** argv) {
Settings_write(settings);
Header_delete(header);
ProcessList_delete(pl);
- FunctionBar_delete((Object*)searchBar);
+ FunctionBar_delete((Object*)incFilter.bar);
+ FunctionBar_delete((Object*)incSearch.bar);
FunctionBar_delete((Object*)defaultBar);
- ((Object*)panel)->delete((Object*)panel);
+ Panel_delete((Object*)panel);
if (killPanel)
((Object*)killPanel)->delete((Object*)killPanel);
UsersTable_delete(ut);

© 2014-2024 Faster IT GmbH | imprint | privacy policy