blob: 278d220044c6799e888d911b909d2e8bdc2f2c67 [file] [log] [blame] [raw]
/*
htop - CategoriesPanel.c
(C) 2004-2011 Hisham H. Muhammad
Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
#include "config.h"
#include "CategoriesPanel.h"
#include "AvailableMetersPanel.h"
#include "MetersPanel.h"
#include "DisplayOptionsPanel.h"
#include "ColumnsPanel.h"
#include "ColorsPanel.h"
#include "AvailableColumnsPanel.h"
#include "ControlOptionsPanel.h"
#include "CRT.h"
#include <stdlib.h>
#include <assert.h>
/*{
#include "Panel.h"
#include "ScreenManager.h"
#include "Settings.h"
#include "Header.h"
#include "ProcessList.h"
typedef struct CategoriesPanel_ {
Panel super;
ScreenManager* scr;
Settings* settings;
Header* header;
const ProcessList *pl;
} CategoriesPanel;
}*/
static const char* const CategoriesFunctions[] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", "Done ", NULL};
static void CategoriesPanel_delete(Object* object) {
Panel* super = (Panel*) object;
CategoriesPanel* this = (CategoriesPanel*) object;
Panel_done(super);
free(this);
}
void CategoriesPanel_makeMetersPage(CategoriesPanel* this) {
MetersPanel* leftMeters = MetersPanel_new(this->settings, "Left column", this->header->columns[0], this->scr);
MetersPanel* rightMeters = MetersPanel_new(this->settings, "Right column", this->header->columns[1], this->scr);
leftMeters->rightNeighbor = rightMeters;
rightMeters->leftNeighbor = leftMeters;
Panel* availableMeters = (Panel*) AvailableMetersPanel_new(this->settings, this->header, (Panel*) leftMeters, (Panel*) rightMeters, this->scr, this->pl);
ScreenManager_add(this->scr, (Panel*) leftMeters, 20);
ScreenManager_add(this->scr, (Panel*) rightMeters, 20);
ScreenManager_add(this->scr, availableMeters, -1);
}
static void CategoriesPanel_makeDisplayOptionsPage(CategoriesPanel* this) {
Panel* displayOptions = (Panel*) DisplayOptionsPanel_new(this->settings, this->scr);
ScreenManager_add(this->scr, displayOptions, -1);
}
static void CategoriesPanel_makeControlOptionsPage(CategoriesPanel *this) {
Panel *panel = (Panel *)ControlOptionsPanel_new(this->settings, this->scr);
ScreenManager_add(this->scr, panel, -1);
}
static void CategoriesPanel_makeColorsPage(CategoriesPanel* this) {
Panel* colors = (Panel*) ColorsPanel_new(this->settings, this->scr);
ScreenManager_add(this->scr, colors, -1);
}
static void CategoriesPanel_makeColumnsPage(CategoriesPanel* this) {
Panel* columns = (Panel*) ColumnsPanel_new(this->settings);
Panel* availableColumns = (Panel *)AvailableColumnsPanel_new(columns,
#ifdef DISK_STATS
this->settings->disk_mode
#else
false
#endif
);
ScreenManager_add(this->scr, columns, 20);
ScreenManager_add(this->scr, availableColumns, -1);
}
static void (*const make_panel_functions[])(CategoriesPanel *) = {
CategoriesPanel_makeMetersPage,
CategoriesPanel_makeDisplayOptionsPage,
CategoriesPanel_makeColorsPage,
CategoriesPanel_makeColumnsPage,
CategoriesPanel_makeControlOptionsPage,
};
static HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch, int repeat) {
CategoriesPanel* this = (CategoriesPanel*) super;
HandlerResult result = IGNORED;
int selected = Panel_getSelectedIndex(super);
switch (ch) {
int previous;
case EVENT_SET_SELECTED:
result = HANDLED;
break;
case KEY_UP:
case KEY_CTRL('P'):
case KEY_DOWN:
case KEY_CTRL('N'):
case KEY_NPAGE:
case KEY_PPAGE:
case KEY_HOME:
case KEY_END:
previous = selected;
Panel_onKey(super, ch, repeat);
selected = Panel_getSelectedIndex(super);
if (previous != selected) result = HANDLED;
break;
default:
if (ch < 255 && isalpha(ch)) result = Panel_selectByTyping(super, ch);
if (result == BREAK_LOOP) result = IGNORED;
break;
}
if (result == HANDLED) {
int size = ScreenManager_size(this->scr);
for (int i = 1; i < size; i++) {
ScreenManager_remove(this->scr, 1);
}
assert(selected >= 0);
assert((unsigned int)selected < sizeof make_panel_functions / sizeof *make_panel_functions);
make_panel_functions[selected](this);
}
return result;
}
PanelClass CategoriesPanel_class = {
.super = {
.extends = Class(Panel),
.delete = CategoriesPanel_delete
},
.eventHandler = CategoriesPanel_eventHandler
};
CategoriesPanel* CategoriesPanel_new(ScreenManager* scr, Settings* settings, Header* header, const ProcessList *pl) {
CategoriesPanel* this = AllocThis(CategoriesPanel);
Panel* super = (Panel*) this;
FunctionBar* fuBar = FunctionBar_new(CategoriesFunctions, NULL, NULL);
Panel_init(super, 1, 1, 1, 1, Class(ListItem), true, fuBar);
#ifdef DISK_STATS
assert(!pl == settings->disk_mode);
#endif
this->scr = scr;
this->settings = settings;
this->header = header;
this->pl = pl;
if(settings->terminal_type) {
char title[17];
snprintf(title, sizeof title, "Setup (%s)", settings->terminal_type);
Panel_setHeader(super, title);
} else {
Panel_setHeader(super, "Setup");
}
Panel_add(super, (Object *)ListItem_new("Meters", HTOP_DEFAULT_COLOR, 0, settings));
Panel_add(super, (Object *)ListItem_new("Display options", HTOP_DEFAULT_COLOR, 0, settings));
Panel_add(super, (Object *)ListItem_new("Colors", HTOP_DEFAULT_COLOR, 0, settings));
Panel_add(super, (Object *)ListItem_new("Columns", HTOP_DEFAULT_COLOR, 0, settings));
Panel_add(super, (Object *)ListItem_new("Control options", HTOP_DEFAULT_COLOR, 0, settings));
return this;
}