2015-03-16 02:03:26 +00:00
|
|
|
/*
|
|
|
|
htop - ColumnsPanel.c
|
|
|
|
(C) 2004-2015 Hisham H. Muhammad
|
2020-08-19 23:35:24 +00:00
|
|
|
(C) 2020 Red Hat, Inc. All Rights Reserved.
|
2015-03-16 02:03:26 +00:00
|
|
|
Released under the GNU GPL, see the COPYING file
|
|
|
|
in the source distribution for its full text.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "MainPanel.h"
|
|
|
|
#include "Process.h"
|
|
|
|
#include "Platform.h"
|
|
|
|
#include "CRT.h"
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
2019-09-12 20:45:34 +00:00
|
|
|
static const char* const MainFunctions[] = {"Help ", "Setup ", "Search ", "Filter ", "Tree ", "SortBy ", "Nice - ", "Nice + ", "Kill ", "Quit ", NULL};
|
2015-03-23 18:26:56 +00:00
|
|
|
|
|
|
|
void MainPanel_updateTreeFunctions(MainPanel* this, bool mode) {
|
2015-03-23 20:04:53 +00:00
|
|
|
FunctionBar* bar = MainPanel_getFunctionBar(this);
|
2015-03-16 02:03:26 +00:00
|
|
|
if (mode) {
|
2015-03-23 20:04:53 +00:00
|
|
|
FunctionBar_setLabel(bar, KEY_F(5), "Sorted");
|
|
|
|
FunctionBar_setLabel(bar, KEY_F(6), "Collap");
|
2015-03-16 02:03:26 +00:00
|
|
|
} else {
|
2015-03-23 20:04:53 +00:00
|
|
|
FunctionBar_setLabel(bar, KEY_F(5), "Tree ");
|
|
|
|
FunctionBar_setLabel(bar, KEY_F(6), "SortBy");
|
2015-03-16 02:03:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainPanel_pidSearch(MainPanel* this, int ch) {
|
|
|
|
Panel* super = (Panel*) this;
|
|
|
|
pid_t pid = ch-48 + this->pidSearch;
|
|
|
|
for (int i = 0; i < Panel_size(super); i++) {
|
|
|
|
Process* p = (Process*) Panel_get(super, i);
|
|
|
|
if (p && p->pid == pid) {
|
|
|
|
Panel_setSelected(super, i);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this->pidSearch = pid * 10;
|
|
|
|
if (this->pidSearch > 10000000) {
|
|
|
|
this->pidSearch = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static HandlerResult MainPanel_eventHandler(Panel* super, int ch) {
|
|
|
|
MainPanel* this = (MainPanel*) super;
|
|
|
|
|
|
|
|
HandlerResult result = IGNORED;
|
2019-10-31 16:39:12 +00:00
|
|
|
|
2015-03-16 02:03:26 +00:00
|
|
|
Htop_Reaction reaction = HTOP_OK;
|
|
|
|
|
2015-03-25 02:12:43 +00:00
|
|
|
if (EVENT_IS_HEADER_CLICK(ch)) {
|
|
|
|
int x = EVENT_HEADER_CLICK_GET_X(ch);
|
|
|
|
ProcessList* pl = this->state->pl;
|
|
|
|
Settings* settings = this->state->settings;
|
|
|
|
int hx = super->scrollH + x + 1;
|
|
|
|
ProcessField field = ProcessList_keyAt(pl, hx);
|
|
|
|
if (field == settings->sortKey) {
|
|
|
|
Settings_invertSortOrder(settings);
|
|
|
|
settings->treeView = false;
|
|
|
|
} else {
|
|
|
|
reaction |= Action_setSortKey(settings, field);
|
|
|
|
}
|
2019-10-31 16:39:12 +00:00
|
|
|
reaction |= HTOP_RECALCULATE | HTOP_REDRAW_BAR | HTOP_SAVE_SETTINGS;
|
2015-03-25 02:12:43 +00:00
|
|
|
result = HANDLED;
|
|
|
|
} else if (ch != ERR && this->inc->active) {
|
2015-03-23 20:04:53 +00:00
|
|
|
bool filterChanged = IncSet_handleKey(this->inc, ch, super, (IncMode_GetPanelValue) MainPanel_getValue, NULL);
|
|
|
|
if (filterChanged) {
|
|
|
|
this->state->pl->incFilter = IncSet_filter(this->inc);
|
2015-03-23 01:39:33 +00:00
|
|
|
reaction = HTOP_REFRESH | HTOP_REDRAW_BAR;
|
|
|
|
}
|
2016-07-28 14:37:44 +00:00
|
|
|
if (this->inc->found) {
|
|
|
|
reaction |= Action_follow(this->state);
|
|
|
|
reaction |= HTOP_KEEP_FOLLOWING;
|
|
|
|
}
|
2015-03-23 20:04:53 +00:00
|
|
|
result = HANDLED;
|
|
|
|
} else if (ch == 27) {
|
|
|
|
return HANDLED;
|
2016-01-03 18:31:44 +00:00
|
|
|
} else if (ch != ERR && ch > 0 && ch < KEY_MAX && this->keys[ch]) {
|
2015-03-16 02:03:26 +00:00
|
|
|
reaction |= (this->keys[ch])(this->state);
|
|
|
|
result = HANDLED;
|
2020-09-11 17:27:56 +00:00
|
|
|
} else if (0 < ch && ch < 255 && isdigit((unsigned char)ch)) {
|
2015-03-16 02:03:26 +00:00
|
|
|
MainPanel_pidSearch(this, ch);
|
|
|
|
} else {
|
|
|
|
if (ch != ERR) {
|
|
|
|
this->pidSearch = 0;
|
2015-04-09 00:25:31 +00:00
|
|
|
} else {
|
|
|
|
reaction |= HTOP_KEEP_FOLLOWING;
|
2015-03-16 02:03:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (reaction & HTOP_REDRAW_BAR) {
|
2015-03-23 18:26:56 +00:00
|
|
|
MainPanel_updateTreeFunctions(this, this->state->settings->treeView);
|
2015-03-23 01:39:33 +00:00
|
|
|
IncSet_drawBar(this->inc);
|
2015-03-16 02:03:26 +00:00
|
|
|
}
|
|
|
|
if (reaction & HTOP_UPDATE_PANELHDR) {
|
|
|
|
ProcessList_printHeader(this->state->pl, Panel_getHeader(super));
|
|
|
|
}
|
|
|
|
if (reaction & HTOP_REFRESH) {
|
2015-03-22 05:50:40 +00:00
|
|
|
result |= REDRAW;
|
2019-10-31 16:39:12 +00:00
|
|
|
}
|
2015-03-16 02:03:26 +00:00
|
|
|
if (reaction & HTOP_RECALCULATE) {
|
2015-03-22 05:50:40 +00:00
|
|
|
result |= RESCAN;
|
2015-03-16 02:03:26 +00:00
|
|
|
}
|
|
|
|
if (reaction & HTOP_SAVE_SETTINGS) {
|
|
|
|
this->state->settings->changed = true;
|
|
|
|
}
|
|
|
|
if (reaction & HTOP_QUIT) {
|
|
|
|
return BREAK_LOOP;
|
|
|
|
}
|
|
|
|
if (!(reaction & HTOP_KEEP_FOLLOWING)) {
|
|
|
|
this->state->pl->following = -1;
|
2015-04-09 18:17:20 +00:00
|
|
|
Panel_setSelectionColor(super, CRT_colors[PANEL_SELECTION_FOCUS]);
|
2015-03-16 02:03:26 +00:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
int MainPanel_selectedPid(MainPanel* this) {
|
|
|
|
Process* p = (Process*) Panel_getSelected((Panel*)this);
|
|
|
|
if (p) {
|
|
|
|
return p->pid;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char* MainPanel_getValue(MainPanel* this, int i) {
|
|
|
|
Process* p = (Process*) Panel_get((Panel*)this, i);
|
|
|
|
if (p)
|
|
|
|
return p->comm;
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
2018-02-18 13:38:49 +00:00
|
|
|
bool MainPanel_foreachProcess(MainPanel* this, MainPanel_ForeachProcessFn fn, Arg arg, bool* wasAnyTagged) {
|
2015-03-16 02:03:26 +00:00
|
|
|
Panel* super = (Panel*) this;
|
|
|
|
bool ok = true;
|
|
|
|
bool anyTagged = false;
|
|
|
|
for (int i = 0; i < Panel_size(super); i++) {
|
|
|
|
Process* p = (Process*) Panel_get(super, i);
|
|
|
|
if (p->tag) {
|
|
|
|
ok = fn(p, arg) && ok;
|
|
|
|
anyTagged = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!anyTagged) {
|
|
|
|
Process* p = (Process*) Panel_getSelected(super);
|
|
|
|
if (p) ok = fn(p, arg) && ok;
|
|
|
|
}
|
|
|
|
if (wasAnyTagged)
|
|
|
|
*wasAnyTagged = anyTagged;
|
|
|
|
return ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
PanelClass MainPanel_class = {
|
|
|
|
.super = {
|
|
|
|
.extends = Class(Panel),
|
|
|
|
.delete = MainPanel_delete
|
|
|
|
},
|
|
|
|
.eventHandler = MainPanel_eventHandler
|
|
|
|
};
|
|
|
|
|
2015-03-23 18:26:56 +00:00
|
|
|
MainPanel* MainPanel_new() {
|
2015-03-16 02:03:26 +00:00
|
|
|
MainPanel* this = AllocThis(MainPanel);
|
2015-03-23 20:04:53 +00:00
|
|
|
Panel_init((Panel*) this, 1, 1, 1, 1, Class(Process), false, FunctionBar_new(MainFunctions, NULL, NULL));
|
2016-02-02 14:53:02 +00:00
|
|
|
this->keys = xCalloc(KEY_MAX, sizeof(Htop_Action));
|
2015-03-23 20:04:53 +00:00
|
|
|
this->inc = IncSet_new(MainPanel_getFunctionBar(this));
|
2015-03-16 02:03:26 +00:00
|
|
|
|
|
|
|
Action_setBindings(this->keys);
|
|
|
|
Platform_setBindings(this->keys);
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainPanel_setState(MainPanel* this, State* state) {
|
|
|
|
this->state = state;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainPanel_delete(Object* object) {
|
|
|
|
Panel* super = (Panel*) object;
|
|
|
|
MainPanel* this = (MainPanel*) object;
|
|
|
|
Panel_done(super);
|
2015-03-23 01:39:33 +00:00
|
|
|
IncSet_delete(this->inc);
|
2015-03-16 02:03:26 +00:00
|
|
|
free(this->keys);
|
|
|
|
free(this);
|
|
|
|
}
|