summaryrefslogtreecommitdiffstats
path: root/MainPanel.c
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2015-03-15 23:03:26 -0300
committerHisham Muhammad <hisham@gobolinux.org>2015-03-15 23:03:26 -0300
commitbc928d7f47f787514d2eb58d4f1083e0160ad167 (patch)
treecc478efa7ea7e39925e6499db1909e33748e193a /MainPanel.c
parente3fe3962cb493c0f07c3670ce60c008b8712dc8e (diff)
Add MainPanel.c
Diffstat (limited to 'MainPanel.c')
-rw-r--r--MainPanel.c183
1 files changed, 183 insertions, 0 deletions
diff --git a/MainPanel.c b/MainPanel.c
new file mode 100644
index 00000000..a63eb472
--- /dev/null
+++ b/MainPanel.c
@@ -0,0 +1,183 @@
+/*
+htop - ColumnsPanel.c
+(C) 2004-2015 Hisham H. Muhammad
+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>
+
+/*{
+#include "Panel.h"
+#include "Action.h"
+#include "Settings.h"
+
+typedef struct MainPanel_ {
+ Panel super;
+ State* state;
+ FunctionBar* fuBar;
+ Htop_Action *keys;
+ pid_t pidSearch;
+} MainPanel;
+
+typedef bool(*MainPanel_ForeachProcessFn)(Process*, size_t);
+
+}*/
+
+void MainPanel_updateTreeFunctions(FunctionBar* fuBar, bool mode) {
+ if (mode) {
+ FunctionBar_setLabel(fuBar, KEY_F(5), "Sorted");
+ FunctionBar_setLabel(fuBar, KEY_F(6), "Collap");
+ } else {
+ FunctionBar_setLabel(fuBar, KEY_F(5), "Tree ");
+ FunctionBar_setLabel(fuBar, KEY_F(6), "SortBy");
+ }
+}
+
+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;
+
+ Htop_Reaction reaction = HTOP_OK;
+
+ if (ch == 27) {
+ return HANDLED;
+ }
+ if(ch != ERR && this->keys[ch]) {
+ reaction |= (this->keys[ch])(this->state);
+ result = HANDLED;
+ } else if (isdigit(ch)) {
+ MainPanel_pidSearch(this, ch);
+ } else {
+ if (ch != ERR) {
+ this->pidSearch = 0;
+ }
+ switch (ch) {
+ case KEY_LEFT:
+ case KEY_CTRLB:
+ if (super->scrollH > 0) {
+ super->scrollH -= CRT_scrollHAmount;
+ super->needsRedraw = true;
+ }
+ return HANDLED;
+ case KEY_RIGHT:
+ case KEY_CTRLF:
+ super->scrollH += CRT_scrollHAmount;
+ super->needsRedraw = true;
+ return HANDLED;
+ }
+ }
+
+ if (reaction & HTOP_REDRAW_BAR) {
+ MainPanel_updateTreeFunctions(this->fuBar, this->state->settings->treeView);
+ IncSet_drawBar(this->state->inc);
+ }
+ if (reaction & HTOP_UPDATE_PANELHDR) {
+ ProcessList_printHeader(this->state->pl, Panel_getHeader(super));
+ }
+ if (reaction & HTOP_REFRESH) {
+ result |= REFRESH;
+ }
+ if (reaction & HTOP_RECALCULATE) {
+ result |= RECALCULATE;
+ }
+ 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;
+ }
+ 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 "";
+}
+
+bool MainPanel_foreachProcess(MainPanel* this, MainPanel_ForeachProcessFn fn, int arg, bool* wasAnyTagged) {
+ 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
+};
+
+MainPanel* MainPanel_new(FunctionBar* fuBar) {
+ MainPanel* this = AllocThis(MainPanel);
+ Panel_init((Panel*) this, 1, 1, 1, 1, Class(Process), false);
+ this->keys = calloc(KEY_MAX, sizeof(Htop_Action));
+ this->fuBar = fuBar;
+
+ 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);
+ free(this->keys);
+ free(this);
+}

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