summaryrefslogtreecommitdiffstats
path: root/htop.c
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2011-11-05 04:19:47 +0000
committerHisham Muhammad <hisham@gobolinux.org>2011-11-05 04:19:47 +0000
commite204861de57b18b889ff7147e64ed64434a81947 (patch)
treeb426fb57fd395ea64ec151e52a4eec12155657cd /htop.c
parent4c4cceee5d691e4ac99fc6730b6bb7655dbba7cd (diff)
Allow typing to select items in various panels (sort, user, signal).
Factored code from the SignalsPanel to apply to all selections from main screen. Closes feature request #3425304.
Diffstat (limited to 'htop.c')
-rw-r--r--htop.c38
1 files changed, 33 insertions, 5 deletions
diff --git a/htop.c b/htop.c
index b71198a6..d5921cb5 100644
--- a/htop.c
+++ b/htop.c
@@ -195,15 +195,41 @@ static bool changePriority(Panel* panel, int delta) {
}
static HandlerResult pickWithEnter(Panel* panel, int ch) {
- (void) panel;
- if (ch == 13)
+ int size = Panel_size(panel);
+
+ if (isalnum(ch)) {
+ int len = strlen(panel->eventHandlerBuffer);
+ if (len < 99) {
+ panel->eventHandlerBuffer[len] = ch;
+ panel->eventHandlerBuffer[len+1] = '\0';
+ }
+ for (int try = 0; try < 2; try++) {
+ len = strlen(panel->eventHandlerBuffer);
+ for (int i = 0; i < size; i++) {
+ char* cur = ((ListItem*) Panel_get(panel, i))->value;
+ while (*cur == ' ') cur++;
+ if (strncasecmp(cur, panel->eventHandlerBuffer, len) == 0) {
+ Panel_setSelected(panel, i);
+ return HANDLED;
+ }
+ }
+ panel->eventHandlerBuffer[0] = ch;
+ panel->eventHandlerBuffer[1] = '\0';
+ }
+ return HANDLED;
+ } else if (ch != ERR) {
+ panel->eventHandlerBuffer[0] = '\0';
+ }
+ if (ch == 13) {
return BREAK_LOOP;
+ }
return IGNORED;
}
static Object* pickFromVector(Panel* panel, Panel* list, int x, int y, const char** keyLabels, FunctionBar* prevBar, Header* header) {
const char* fuKeys[] = {"Enter", "Esc", NULL};
int fuEvents[] = {13, 27};
+ list->eventHandlerBuffer = calloc(100, 1);
if (!list->eventHandler)
Panel_setEventHandler(list, pickWithEnter);
ScreenManager* scr = ScreenManager_new(0, y, 0, -1, HORIZONTAL, header, false);
@@ -213,6 +239,8 @@ static Object* pickFromVector(Panel* panel, Panel* list, int x, int y, const cha
int ch;
ScreenManager_run(scr, &panelFocus, &ch);
ScreenManager_delete(scr);
+ free(list->eventHandlerBuffer);
+ list->eventHandlerBuffer = NULL;
Panel_move(panel, 0, y);
Panel_resize(panel, COLS, LINES-y-1);
FunctionBar_draw(prevBar, NULL);
@@ -758,7 +786,7 @@ int main(int argc, char** argv) {
const char* fuFunctions[] = {"Send ", "Cancel ", NULL};
Signal* sgn = (Signal*) pickFromVector(panel, killPanel, 15, headerHeight, fuFunctions, defaultBar, header);
if (sgn) {
- if (sgn->number != 0) {
+ if (sgn->super.key != 0) {
Panel_setHeader(panel, "Sending...");
Panel_draw(panel, true);
refresh();
@@ -766,13 +794,13 @@ int main(int argc, char** argv) {
for (int i = 0; i < Panel_size(panel); i++) {
Process* p = (Process*) Panel_get(panel, i);
if (p->tag) {
- Process_sendSignal(p, sgn->number);
+ Process_sendSignal(p, sgn->super.key);
anyTagged = true;
}
}
if (!anyTagged) {
Process* p = (Process*) Panel_getSelected(panel);
- Process_sendSignal(p, sgn->number);
+ Process_sendSignal(p, sgn->super.key);
}
napms(500);
}