From 85bb4ad9cb820ac3b8e935a930084a06cbfd2847 Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Mon, 11 Apr 2016 13:00:20 +0200 Subject: Imported Upstream version 0.6.3 --- AvailableColumnsListBox.c | 72 --------- AvailableColumnsListBox.h | 31 ---- AvailableColumnsPanel.c | 72 +++++++++ AvailableColumnsPanel.h | 32 ++++ AvailableMetersListBox.c | 106 -------------- AvailableMetersListBox.h | 33 ----- AvailableMetersPanel.c | 106 ++++++++++++++ AvailableMetersPanel.h | 33 +++++ CPUMeter.c | 9 +- CPUMeter.h | 5 +- CRT.c | 21 +-- CRT.h | 34 ++++- CategoriesListBox.c | 134 ----------------- CategoriesListBox.h | 40 ----- CategoriesPanel.c | 128 ++++++++++++++++ CategoriesPanel.h | 41 ++++++ ChangeLog | 21 ++- CheckItem.c | 8 +- CheckItem.h | 8 +- ClockMeter.c | 6 +- ClockMeter.h | 3 + ColorsListBox.c | 99 ------------- ColorsListBox.h | 32 ---- ColorsPanel.c | 98 +++++++++++++ ColorsPanel.h | 39 +++++ ColumnsListBox.c | 104 ------------- ColumnsListBox.h | 32 ---- ColumnsPanel.c | 104 +++++++++++++ ColumnsPanel.h | 31 ++++ DebugMemory.c | 66 +++++++-- DebugMemory.h | 23 ++- DisplayOptionsListBox.c | 75 ---------- DisplayOptionsListBox.h | 31 ---- DisplayOptionsPanel.c | 75 ++++++++++ DisplayOptionsPanel.h | 31 ++++ FunctionBar.c | 12 +- FunctionBar.h | 15 +- Hashtable.c | 20 +-- Hashtable.h | 8 +- Header.c | 64 ++++---- Header.h | 6 +- ListBox.c | 353 --------------------------------------------- ListBox.h | 101 ------------- ListItem.c | 11 +- ListItem.h | 17 ++- LoadAverageMeter.c | 15 +- LoadAverageMeter.h | 5 +- Makefile.am | 35 +++-- Makefile.in | 112 +++++++------- MemoryMeter.c | 8 +- MemoryMeter.h | 2 + Meter.c | 67 ++++----- Meter.h | 39 ++--- MetersListBox.c | 105 -------------- MetersListBox.h | 30 ---- MetersPanel.c | 105 ++++++++++++++ MetersPanel.h | 30 ++++ Object.c | 35 ++--- Object.h | 24 ++- Panel.c | 361 ++++++++++++++++++++++++++++++++++++++++++++++ Panel.h | 113 +++++++++++++++ Process.c | 104 +++++++------ Process.h | 23 ++- ProcessList.c | 317 +++++++++++++++++++++------------------- ProcessList.h | 63 ++++---- README | 6 +- RichString.c | 52 +++---- RichString.h | 15 +- ScreenManager.c | 94 ++++++------ ScreenManager.h | 16 +- Settings.c | 6 +- Settings.h | 4 +- SignalItem.c | 8 +- SignalItem.h | 14 +- SignalsListBox.c | 77 ---------- SignalsListBox.h | 32 ---- SignalsPanel.c | 77 ++++++++++ SignalsPanel.h | 32 ++++ String.c | 8 +- String.h | 6 +- SwapMeter.c | 8 +- SwapMeter.h | 2 + TODO | 18 +++ TasksMeter.c | 8 +- TasksMeter.h | 2 + TraceScreen.c | 39 +++-- TraceScreen.h | 19 ++- TypedVector.c | 257 --------------------------------- TypedVector.h | 69 --------- UptimeMeter.c | 6 +- UptimeMeter.h | 4 +- UsersTable.h | 10 +- Vector.c | 250 ++++++++++++++++++++++++++++++++ Vector.h | 74 ++++++++++ autogen.sh | 8 + config.h | 8 +- configure | 40 +++-- configure.ac | 18 ++- debug.h | 34 +++-- htop.1 | 4 +- htop.c | 180 +++++++++++------------ htop.desktop | 2 +- htop.h | 29 ++-- scripts/MakeHeader.py | 37 +++-- 104 files changed, 2892 insertions(+), 2664 deletions(-) delete mode 100644 AvailableColumnsListBox.c delete mode 100644 AvailableColumnsListBox.h create mode 100644 AvailableColumnsPanel.c create mode 100644 AvailableColumnsPanel.h delete mode 100644 AvailableMetersListBox.c delete mode 100644 AvailableMetersListBox.h create mode 100644 AvailableMetersPanel.c create mode 100644 AvailableMetersPanel.h delete mode 100644 CategoriesListBox.c delete mode 100644 CategoriesListBox.h create mode 100644 CategoriesPanel.c create mode 100644 CategoriesPanel.h delete mode 100644 ColorsListBox.c delete mode 100644 ColorsListBox.h create mode 100644 ColorsPanel.c create mode 100644 ColorsPanel.h delete mode 100644 ColumnsListBox.c delete mode 100644 ColumnsListBox.h create mode 100644 ColumnsPanel.c create mode 100644 ColumnsPanel.h delete mode 100644 DisplayOptionsListBox.c delete mode 100644 DisplayOptionsListBox.h create mode 100644 DisplayOptionsPanel.c create mode 100644 DisplayOptionsPanel.h delete mode 100644 ListBox.c delete mode 100644 ListBox.h delete mode 100644 MetersListBox.c delete mode 100644 MetersListBox.h create mode 100644 MetersPanel.c create mode 100644 MetersPanel.h create mode 100644 Panel.c create mode 100644 Panel.h delete mode 100644 SignalsListBox.c delete mode 100644 SignalsListBox.h create mode 100644 SignalsPanel.c create mode 100644 SignalsPanel.h create mode 100644 TODO delete mode 100644 TypedVector.c delete mode 100644 TypedVector.h create mode 100644 Vector.c create mode 100644 Vector.h create mode 100755 autogen.sh diff --git a/AvailableColumnsListBox.c b/AvailableColumnsListBox.c deleted file mode 100644 index f4f9137..0000000 --- a/AvailableColumnsListBox.c +++ /dev/null @@ -1,72 +0,0 @@ - -#include "AvailableColumnsListBox.h" -#include "Settings.h" -#include "Header.h" -#include "ScreenManager.h" -#include "ColumnsListBox.h" - -#include "ListBox.h" - -#include "debug.h" -#include - -/*{ - -typedef struct AvailableColumnsListBox_ { - ListBox super; - ListBox* columns; - - Settings* settings; - ScreenManager* scr; -} AvailableColumnsListBox; - -}*/ - -AvailableColumnsListBox* AvailableColumnsListBox_new(Settings* settings, ListBox* columns, ScreenManager* scr) { - AvailableColumnsListBox* this = (AvailableColumnsListBox*) malloc(sizeof(AvailableColumnsListBox)); - ListBox* super = (ListBox*) this; - ListBox_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); - ((Object*)this)->delete = AvailableColumnsListBox_delete; - - this->settings = settings; - this->scr = scr; - super->eventHandler = AvailableColumnsListBox_eventHandler; - - ListBox_setHeader(super, "Available Columns"); - - for (int i = 1; i < LAST_PROCESSFIELD; i++) { - if (i != COMM) - ListBox_add(super, (Object*) ListItem_new(Process_fieldNames[i], 0)); - } - this->columns = columns; - return this; -} - -void AvailableColumnsListBox_delete(Object* object) { - ListBox* super = (ListBox*) object; - AvailableColumnsListBox* this = (AvailableColumnsListBox*) object; - ListBox_done(super); - free(this); -} - -HandlerResult AvailableColumnsListBox_eventHandler(ListBox* super, int ch) { - AvailableColumnsListBox* this = (AvailableColumnsListBox*) super; - char* text = ((ListItem*) ListBox_getSelected(super))->value; - HandlerResult result = IGNORED; - - switch(ch) { - case 13: - case KEY_ENTER: - case KEY_F(5): - { - int at = ListBox_getSelectedIndex(this->columns) + 1; - if (at == ListBox_getSize(this->columns)) - at--; - ListBox_insert(this->columns, at, (Object*) ListItem_new(text, 0)); - ColumnsListBox_update(this->columns); - result = HANDLED; - break; - } - } - return result; -} diff --git a/AvailableColumnsListBox.h b/AvailableColumnsListBox.h deleted file mode 100644 index d771e20..0000000 --- a/AvailableColumnsListBox.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Do not edit this file. It was automatically genarated. */ - -#ifndef HEADER_AvailableColumnsListBox -#define HEADER_AvailableColumnsListBox - -#include "Settings.h" -#include "Header.h" -#include "ScreenManager.h" - -#include "ListBox.h" - -#include "debug.h" -#include - - -typedef struct AvailableColumnsListBox_ { - ListBox super; - - Settings* settings; - ScreenManager* scr; - ListBox* columns; -} AvailableColumnsListBox; - - -AvailableColumnsListBox* AvailableColumnsListBox_new(Settings* settings, ListBox* columns, ScreenManager* scr); - -void AvailableColumnsListBox_delete(Object* object); - -HandlerResult AvailableColumnsListBox_eventHandler(ListBox* super, int ch); - -#endif diff --git a/AvailableColumnsPanel.c b/AvailableColumnsPanel.c new file mode 100644 index 0000000..237be69 --- /dev/null +++ b/AvailableColumnsPanel.c @@ -0,0 +1,72 @@ + +#include "AvailableColumnsPanel.h" +#include "Settings.h" +#include "Header.h" +#include "ScreenManager.h" +#include "ColumnsPanel.h" + +#include "Panel.h" + +#include "debug.h" +#include + +/*{ + +typedef struct AvailableColumnsPanel_ { + Panel super; + Panel* columns; + + Settings* settings; + ScreenManager* scr; +} AvailableColumnsPanel; + +}*/ + +AvailableColumnsPanel* AvailableColumnsPanel_new(Settings* settings, Panel* columns, ScreenManager* scr) { + AvailableColumnsPanel* this = (AvailableColumnsPanel*) malloc(sizeof(AvailableColumnsPanel)); + Panel* super = (Panel*) this; + Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); + ((Object*)this)->delete = AvailableColumnsPanel_delete; + + this->settings = settings; + this->scr = scr; + super->eventHandler = AvailableColumnsPanel_eventHandler; + + Panel_setHeader(super, "Available Columns"); + + for (int i = 1; i < LAST_PROCESSFIELD; i++) { + if (i != COMM) + Panel_add(super, (Object*) ListItem_new(Process_fieldNames[i], 0)); + } + this->columns = columns; + return this; +} + +void AvailableColumnsPanel_delete(Object* object) { + Panel* super = (Panel*) object; + AvailableColumnsPanel* this = (AvailableColumnsPanel*) object; + Panel_done(super); + free(this); +} + +HandlerResult AvailableColumnsPanel_eventHandler(Panel* super, int ch) { + AvailableColumnsPanel* this = (AvailableColumnsPanel*) super; + char* text = ((ListItem*) Panel_getSelected(super))->value; + HandlerResult result = IGNORED; + + switch(ch) { + case 13: + case KEY_ENTER: + case KEY_F(5): + { + int at = Panel_getSelectedIndex(this->columns) + 1; + if (at == Panel_getSize(this->columns)) + at--; + Panel_insert(this->columns, at, (Object*) ListItem_new(text, 0)); + ColumnsPanel_update(this->columns); + result = HANDLED; + break; + } + } + return result; +} diff --git a/AvailableColumnsPanel.h b/AvailableColumnsPanel.h new file mode 100644 index 0000000..d7bed26 --- /dev/null +++ b/AvailableColumnsPanel.h @@ -0,0 +1,32 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_AvailableColumnsPanel +#define HEADER_AvailableColumnsPanel + +#include "Settings.h" +#include "Header.h" +#include "ScreenManager.h" +#include "ColumnsPanel.h" + +#include "Panel.h" + +#include "debug.h" +#include + + +typedef struct AvailableColumnsPanel_ { + Panel super; + Panel* columns; + + Settings* settings; + ScreenManager* scr; +} AvailableColumnsPanel; + + +AvailableColumnsPanel* AvailableColumnsPanel_new(Settings* settings, Panel* columns, ScreenManager* scr); + +void AvailableColumnsPanel_delete(Object* object); + +HandlerResult AvailableColumnsPanel_eventHandler(Panel* super, int ch); + +#endif diff --git a/AvailableMetersListBox.c b/AvailableMetersListBox.c deleted file mode 100644 index 88011ba..0000000 --- a/AvailableMetersListBox.c +++ /dev/null @@ -1,106 +0,0 @@ - -#include "AvailableMetersListBox.h" -#include "Settings.h" -#include "Header.h" -#include "ScreenManager.h" - -#include "ListBox.h" - -#include "debug.h" -#include - -/*{ - -typedef struct AvailableMetersListBox_ { - ListBox super; - - Settings* settings; - ListBox* leftBox; - ListBox* rightBox; - ScreenManager* scr; -} AvailableMetersListBox; - -}*/ - -AvailableMetersListBox* AvailableMetersListBox_new(Settings* settings, ListBox* leftMeters, ListBox* rightMeters, ScreenManager* scr) { - AvailableMetersListBox* this = (AvailableMetersListBox*) malloc(sizeof(AvailableMetersListBox)); - ListBox* super = (ListBox*) this; - ListBox_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); - ((Object*)this)->delete = AvailableMetersListBox_delete; - - this->settings = settings; - this->leftBox = leftMeters; - this->rightBox = rightMeters; - this->scr = scr; - super->eventHandler = AvailableMetersListBox_EventHandler; - - ListBox_setHeader(super, "Available meters"); - for (int i = 1; Meter_types[i]; i++) { - MeterType* type = Meter_types[i]; - if (type != &CPUMeter) { - ListBox_add(super, (Object*) ListItem_new(type->uiName, i << 16)); - } - } - MeterType* type = &CPUMeter; - int processors = settings->pl->processorCount; - if (processors > 1) { - ListBox_add(super, (Object*) ListItem_new("CPU average", 0)); - for (int i = 1; i <= processors; i++) { - char buffer[50]; - sprintf(buffer, "%s %d", type->uiName, i); - ListBox_add(super, (Object*) ListItem_new(buffer, i)); - } - } else { - ListBox_add(super, (Object*) ListItem_new("CPU", 1)); - } - return this; -} - -void AvailableMetersListBox_delete(Object* object) { - ListBox* super = (ListBox*) object; - AvailableMetersListBox* this = (AvailableMetersListBox*) object; - ListBox_done(super); - free(this); -} - -/* private */ -inline void AvailableMetersListBox_addHeader(Header* header, ListBox* lb, MeterType* type, int param, HeaderSide side) { - Meter* meter = (Meter*) Header_addMeter(header, type, param, side); - ListBox_add(lb, (Object*) Meter_toListItem(meter)); -} - -HandlerResult AvailableMetersListBox_EventHandler(ListBox* super, int ch) { - AvailableMetersListBox* this = (AvailableMetersListBox*) super; - Header* header = this->settings->header; - - ListItem* selected = (ListItem*) ListBox_getSelected(super); - int param = selected->key & 0xff; - int type = selected->key >> 16; - HandlerResult result = IGNORED; - - switch(ch) { - case KEY_F(5): - case 'l': - case 'L': - { - AvailableMetersListBox_addHeader(header, this->leftBox, Meter_types[type], param, LEFT_HEADER); - result = HANDLED; - break; - } - case KEY_F(6): - case 'r': - case 'R': - { - AvailableMetersListBox_addHeader(header, this->rightBox, Meter_types[type], param, RIGHT_HEADER); - result = HANDLED; - break; - } - } - if (result == HANDLED) { - this->settings->changed = true; - Header_calculateHeight(header); - Header_draw(header); - ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2); - } - return result; -} diff --git a/AvailableMetersListBox.h b/AvailableMetersListBox.h deleted file mode 100644 index be6da95..0000000 --- a/AvailableMetersListBox.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Do not edit this file. It was automatically genarated. */ - -#ifndef HEADER_AvailableMetersListBox -#define HEADER_AvailableMetersListBox - -#include "Settings.h" -#include "Header.h" -#include "ScreenManager.h" - -#include "ListBox.h" - -#include "debug.h" -#include - - -typedef struct AvailableMetersListBox_ { - ListBox super; - - Settings* settings; - ListBox* leftBox; - ListBox* rightBox; - ScreenManager* scr; -} AvailableMetersListBox; - - -AvailableMetersListBox* AvailableMetersListBox_new(Settings* settings, ListBox* leftMeters, ListBox* rightMeters, ScreenManager* scr); - -void AvailableMetersListBox_delete(Object* object); - - -HandlerResult AvailableMetersListBox_EventHandler(ListBox* super, int ch); - -#endif diff --git a/AvailableMetersPanel.c b/AvailableMetersPanel.c new file mode 100644 index 0000000..cb87802 --- /dev/null +++ b/AvailableMetersPanel.c @@ -0,0 +1,106 @@ + +#include "AvailableMetersPanel.h" +#include "Settings.h" +#include "Header.h" +#include "ScreenManager.h" +#include "CPUMeter.h" + +#include "Panel.h" + +#include "debug.h" +#include + +/*{ + +typedef struct AvailableMetersPanel_ { + Panel super; + + Settings* settings; + Panel* leftPanel; + Panel* rightPanel; + ScreenManager* scr; +} AvailableMetersPanel; + +}*/ + +AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Panel* leftMeters, Panel* rightMeters, ScreenManager* scr) { + AvailableMetersPanel* this = (AvailableMetersPanel*) malloc(sizeof(AvailableMetersPanel)); + Panel* super = (Panel*) this; + Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); + ((Object*)this)->delete = AvailableMetersPanel_delete; + + this->settings = settings; + this->leftPanel = leftMeters; + this->rightPanel = rightMeters; + this->scr = scr; + super->eventHandler = AvailableMetersPanel_EventHandler; + + Panel_setHeader(super, "Available meters"); + for (int i = 1; Meter_types[i]; i++) { + MeterType* type = Meter_types[i]; + if (type != &CPUMeter) { + Panel_add(super, (Object*) ListItem_new(type->uiName, i << 16)); + } + } + MeterType* type = &CPUMeter; + int processors = settings->pl->processorCount; + if (processors > 1) { + Panel_add(super, (Object*) ListItem_new("CPU average", 0)); + for (int i = 1; i <= processors; i++) { + char buffer[50]; + sprintf(buffer, "%s %d", type->uiName, i); + Panel_add(super, (Object*) ListItem_new(buffer, i)); + } + } else { + Panel_add(super, (Object*) ListItem_new("CPU", 1)); + } + return this; +} + +void AvailableMetersPanel_delete(Object* object) { + Panel* super = (Panel*) object; + AvailableMetersPanel* this = (AvailableMetersPanel*) object; + Panel_done(super); + free(this); +} + +static inline void AvailableMetersPanel_addHeader(Header* header, Panel* panel, MeterType* type, int param, HeaderSide side) { + Meter* meter = (Meter*) Header_addMeter(header, type, param, side); + Panel_add(panel, (Object*) Meter_toListItem(meter)); +} + +HandlerResult AvailableMetersPanel_EventHandler(Panel* super, int ch) { + AvailableMetersPanel* this = (AvailableMetersPanel*) super; + Header* header = this->settings->header; + + ListItem* selected = (ListItem*) Panel_getSelected(super); + int param = selected->key & 0xff; + int type = selected->key >> 16; + HandlerResult result = IGNORED; + + switch(ch) { + case KEY_F(5): + case 'l': + case 'L': + { + AvailableMetersPanel_addHeader(header, this->leftPanel, Meter_types[type], param, LEFT_HEADER); + result = HANDLED; + break; + } + case KEY_F(6): + case 'r': + case 'R': + { + AvailableMetersPanel_addHeader(header, this->rightPanel, Meter_types[type], param, RIGHT_HEADER); + result = HANDLED; + break; + } + } + if (result == HANDLED) { + this->settings->changed = true; + Header_calculateHeight(header); + Header_draw(header); + ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2); + } + return result; +} diff --git a/AvailableMetersPanel.h b/AvailableMetersPanel.h new file mode 100644 index 0000000..89d9517 --- /dev/null +++ b/AvailableMetersPanel.h @@ -0,0 +1,33 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_AvailableMetersPanel +#define HEADER_AvailableMetersPanel + +#include "Settings.h" +#include "Header.h" +#include "ScreenManager.h" +#include "CPUMeter.h" + +#include "Panel.h" + +#include "debug.h" +#include + + +typedef struct AvailableMetersPanel_ { + Panel super; + + Settings* settings; + Panel* leftPanel; + Panel* rightPanel; + ScreenManager* scr; +} AvailableMetersPanel; + + +AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Panel* leftMeters, Panel* rightMeters, ScreenManager* scr); + +void AvailableMetersPanel_delete(Object* object); + +HandlerResult AvailableMetersPanel_EventHandler(Panel* super, int ch); + +#endif diff --git a/CPUMeter.c b/CPUMeter.c index 07c6a00..363da6a 100644 --- a/CPUMeter.c +++ b/CPUMeter.c @@ -18,10 +18,10 @@ in the source distribution for its full text. #include "debug.h" #include -/* private property */ -static int CPUMeter_attributes[] = { CPU_NICE, CPU_NORMAL, CPU_KERNEL }; +int CPUMeter_attributes[] = { + CPU_NICE, CPU_NORMAL, CPU_KERNEL +}; -/* private */ MeterType CPUMeter = { .setValues = CPUMeter_setValues, .display = CPUMeter_display, @@ -35,7 +35,6 @@ MeterType CPUMeter = { .init = CPUMeter_init }; -/* private */ MeterType AllCPUsMeter = { .mode = 0, .items = 1, @@ -82,7 +81,7 @@ void CPUMeter_setValues(Meter* this, char* buffer, int size) { void CPUMeter_display(Object* cast, RichString* out) { char buffer[50]; Meter* this = (Meter*)cast; - RichString_prune(out); + RichString_init(out); sprintf(buffer, "%5.1f%% ", this->values[1]); RichString_append(out, CRT_colors[METER_TEXT], ":"); RichString_append(out, CRT_colors[CPU_NORMAL], buffer); diff --git a/CPUMeter.h b/CPUMeter.h index f9f389a..bd46a39 100644 --- a/CPUMeter.h +++ b/CPUMeter.h @@ -3,7 +3,7 @@ #ifndef HEADER_CPUMeter #define HEADER_CPUMeter /* -htop - CPUMeter.c +htop - CPUMeter.h (C) 2004-2006 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. @@ -21,8 +21,11 @@ in the source distribution for its full text. #include "debug.h" #include +extern int CPUMeter_attributes[]; +extern MeterType CPUMeter; +extern MeterType AllCPUsMeter; #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) diff --git a/CRT.c b/CRT.c index 6b1d120..9c283c9 100644 --- a/CRT.c +++ b/CRT.c @@ -96,24 +96,17 @@ typedef enum ColorElements_ { LAST_COLORELEMENT } ColorElements; -extern int CRT_delay; - -extern int CRT_colors[LAST_COLORELEMENT]; - -extern int CRT_colorScheme; - }*/ // TODO: centralize these in Settings. -/* private property */ -int CRT_delay; +int CRT_delay = 0; + +int CRT_colorScheme = 0; -/* private property */ -int CRT_colorScheme; +int CRT_colors[LAST_COLORELEMENT] = { 0 }; -/* private property */ -int CRT_colors[LAST_COLORELEMENT]; +char* CRT_termType; // TODO: pass an instance of Settings instead. @@ -133,8 +126,8 @@ void CRT_init(int delay, int colorScheme) { } else { CRT_hasColors = false; } - char* termType = getenv("TERM"); - if (String_eq(termType, "xterm") || String_eq(termType, "xterm-color") || String_eq(termType, "vt220")) { + CRT_termType = getenv("TERM"); + if (String_eq(CRT_termType, "xterm") || String_eq(CRT_termType, "xterm-color") || String_eq(CRT_termType, "vt220")) { define_key("\033[H", KEY_HOME); define_key("\033[F", KEY_END); define_key("\033OP", KEY_F(1)); diff --git a/CRT.h b/CRT.h index 32a9481..1f6020b 100644 --- a/CRT.h +++ b/CRT.h @@ -1,4 +1,4 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_CRT #define HEADER_CRT @@ -19,6 +19,8 @@ in the source distribution for its full text. #include "debug.h" +#define ColorPair(i,j) COLOR_PAIR((7-i)*8+j) + #define COLORSCHEME_DEFAULT 0 #define COLORSCHEME_MONOCHROME 1 #define COLORSCHEME_BLACKONWHITE 2 @@ -26,6 +28,15 @@ in the source distribution for its full text. #define COLORSCHEME_MIDNIGHT 4 #define COLORSCHEME_BLACKNIGHT 5 +#define Black COLOR_BLACK +#define Red COLOR_RED +#define Green COLOR_GREEN +#define Yellow COLOR_YELLOW +#define Blue COLOR_BLUE +#define Magenta COLOR_MAGENTA +#define Cyan COLOR_CYAN +#define White COLOR_WHITE + //#link curses bool CRT_hasColors; @@ -87,26 +98,33 @@ typedef enum ColorElements_ { LAST_COLORELEMENT } ColorElements; -extern int CRT_colors[LAST_COLORELEMENT]; -extern int CRT_colorScheme; +// TODO: centralize these in Settings. extern int CRT_delay; -void CRT_init(); +extern int CRT_colorScheme; + +extern int CRT_colors[LAST_COLORELEMENT]; + +char* CRT_termType; + +// TODO: pass an instance of Settings instead. + +void CRT_init(int delay, int colorScheme); void CRT_done(); int CRT_readKey(); +void CRT_disableDelay(); + +void CRT_enableDelay(); + void CRT_handleSIGSEGV(int signal); void CRT_handleSIGTERM(int signal); void CRT_setColors(int colorScheme); -void CRT_enableDelay(); - -void CRT_disableDelay(); - #endif diff --git a/CategoriesListBox.c b/CategoriesListBox.c deleted file mode 100644 index e846a57..0000000 --- a/CategoriesListBox.c +++ /dev/null @@ -1,134 +0,0 @@ - -#include "CategoriesListBox.h" -#include "AvailableMetersListBox.h" -#include "MetersListBox.h" -#include "DisplayOptionsListBox.h" -#include "ColumnsListBox.h" -#include "ColorsListBox.h" -#include "AvailableColumnsListBox.h" - -#include "ListBox.h" - -#include "debug.h" -#include - -/*{ - -typedef struct CategoriesListBox_ { - ListBox super; - - Settings* settings; - ScreenManager* scr; -} CategoriesListBox; - -}*/ - -/* private property */ -char* MetersFunctions[10] = {" ", " ", " ", "Type ", " ", " ", "MoveUp", "MoveDn", "Remove", "Done "}; - -/* private property */ -char* AvailableMetersFunctions[10] = {" ", " ", " ", " ", "Add L ", "Add R ", " ", " ", " ", "Done "}; - -/* private property */ -char* DisplayOptionsFunctions[10] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", "Done "}; - -/* private property */ -char* ColumnsFunctions[10] = {" ", " ", " ", " ", " ", " ", "MoveUp", "MoveDn", "Remove", "Done "}; - -/* private property */ -char* ColorsFunctions[10] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", "Done "}; - -/* private property */ -char* AvailableColumnsFunctions[10] = {" ", " ", " ", " ", "Add ", " ", " ", " ", " ", "Done "}; - -CategoriesListBox* CategoriesListBox_new(Settings* settings, ScreenManager* scr) { - CategoriesListBox* this = (CategoriesListBox*) malloc(sizeof(CategoriesListBox)); - ListBox* super = (ListBox*) this; - ListBox_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); - ((Object*)this)->delete = CategoriesListBox_delete; - - this->settings = settings; - this->scr = scr; - super->eventHandler = CategoriesListBox_eventHandler; - ListBox_setHeader(super, "Setup"); - ListBox_add(super, (Object*) ListItem_new("Meters", 0)); - ListBox_add(super, (Object*) ListItem_new("Display options", 0)); - ListBox_add(super, (Object*) ListItem_new("Colors", 0)); - ListBox_add(super, (Object*) ListItem_new("Columns", 0)); - return this; -} - -void CategoriesListBox_delete(Object* object) { - ListBox* super = (ListBox*) object; - CategoriesListBox* this = (CategoriesListBox*) object; - ListBox_done(super); - free(this); -} - -HandlerResult CategoriesListBox_eventHandler(ListBox* super, int ch) { - CategoriesListBox* this = (CategoriesListBox*) super; - - HandlerResult result = IGNORED; - - int previous = ListBox_getSelectedIndex(super); - - switch (ch) { - case KEY_UP: - case KEY_DOWN: - case KEY_NPAGE: - case KEY_PPAGE: - case KEY_HOME: - case KEY_END: { - ListBox_onKey(super, ch); - int selected = ListBox_getSelectedIndex(super); - if (previous != selected) { - int size = ScreenManager_size(this->scr); - for (int i = 1; i < size; i++) - ScreenManager_remove(this->scr, 1); - switch (selected) { - case 0: - CategoriesListBox_makeMetersPage(this); - break; - case 1: - CategoriesListBox_makeDisplayOptionsPage(this); - break; - case 2: - CategoriesListBox_makeColorsPage(this); - break; - case 3: - CategoriesListBox_makeColumnsPage(this); - break; - } - } - result = HANDLED; - } - } - - return result; -} - -void CategoriesListBox_makeMetersPage(CategoriesListBox* this) { - ListBox* lbLeftMeters = (ListBox*) MetersListBox_new(this->settings, "Left column", this->settings->header->leftMeters, this->scr); - ListBox* lbRightMeters = (ListBox*) MetersListBox_new(this->settings, "Right column", this->settings->header->rightMeters, this->scr); - ListBox* lbAvailableMeters = (ListBox*) AvailableMetersListBox_new(this->settings, lbLeftMeters, lbRightMeters, this->scr); - ScreenManager_add(this->scr, lbLeftMeters, FunctionBar_new(10, MetersFunctions, NULL, NULL), 20); - ScreenManager_add(this->scr, lbRightMeters, FunctionBar_new(10, MetersFunctions, NULL, NULL), 20); - ScreenManager_add(this->scr, lbAvailableMeters, FunctionBar_new(10, AvailableMetersFunctions, NULL, NULL), -1); -} - -void CategoriesListBox_makeDisplayOptionsPage(CategoriesListBox* this) { - ListBox* lbDisplayOptions = (ListBox*) DisplayOptionsListBox_new(this->settings, this->scr); - ScreenManager_add(this->scr, lbDisplayOptions, FunctionBar_new(10, DisplayOptionsFunctions, NULL, NULL), -1); -} - -void CategoriesListBox_makeColorsPage(CategoriesListBox* this) { - ListBox* lbColors = (ListBox*) ColorsListBox_new(this->settings, this->scr); - ScreenManager_add(this->scr, lbColors, FunctionBar_new(10, ColorsFunctions, NULL, NULL), -1); -} - -void CategoriesListBox_makeColumnsPage(CategoriesListBox* this) { - ListBox* lbColumns = (ListBox*) ColumnsListBox_new(this->settings, this->scr); - ListBox* lbAvailableColumns = (ListBox*) AvailableColumnsListBox_new(this->settings, lbColumns, this->scr); - ScreenManager_add(this->scr, lbColumns, FunctionBar_new(10, ColumnsFunctions, NULL, NULL), 20); - ScreenManager_add(this->scr, lbAvailableColumns, FunctionBar_new(10, AvailableColumnsFunctions, NULL, NULL), -1); -} diff --git a/CategoriesListBox.h b/CategoriesListBox.h deleted file mode 100644 index 60b13b4..0000000 --- a/CategoriesListBox.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Do not edit this file. It was automatically genarated. */ - -#ifndef HEADER_CategoriesListBox -#define HEADER_CategoriesListBox - -#include "AvailableMetersListBox.h" -#include "MetersListBox.h" -#include "DisplayOptionsListBox.h" - -#include "ListBox.h" - -#include "debug.h" -#include - - -typedef struct CategoriesListBox_ { - ListBox super; - - Settings* settings; - ScreenManager* scr; -} CategoriesListBox; - - - - -CategoriesListBox* CategoriesListBox_new(Settings* settings, ScreenManager* scr); - -void CategoriesListBox_delete(Object* object); - -HandlerResult CategoriesListBox_eventHandler(ListBox* super, int ch); - -void CategoriesListBox_makeMetersPage(CategoriesListBox* this); - -void CategoriesListBox_makeDisplayOptionsPage(CategoriesListBox* this); - -void CategoriesListBox_makeColorsPage(CategoriesListBox* this); - -void CategoriesListBox_makeColumnsPage(CategoriesListBox* this); - -#endif diff --git a/CategoriesPanel.c b/CategoriesPanel.c new file mode 100644 index 0000000..89e9338 --- /dev/null +++ b/CategoriesPanel.c @@ -0,0 +1,128 @@ + +#include "CategoriesPanel.h" +#include "AvailableMetersPanel.h" +#include "MetersPanel.h" +#include "DisplayOptionsPanel.h" +#include "ColumnsPanel.h" +#include "ColorsPanel.h" +#include "AvailableColumnsPanel.h" + +#include "Panel.h" + +#include "debug.h" +#include + +/*{ + +typedef struct CategoriesPanel_ { + Panel super; + + Settings* settings; + ScreenManager* scr; +} CategoriesPanel; + +}*/ + +static char* MetersFunctions[10] = {" ", " ", " ", "Type ", " ", " ", "MoveUp", "MoveDn", "Remove", "Done "}; + +static char* AvailableMetersFunctions[10] = {" ", " ", " ", " ", "Add L ", "Add R ", " ", " ", " ", "Done "}; + +static char* DisplayOptionsFunctions[10] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", "Done "}; + +static char* ColumnsFunctions[10] = {" ", " ", " ", " ", " ", " ", "MoveUp", "MoveDn", "Remove", "Done "}; + +static char* ColorsFunctions[10] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", "Done "}; + +static char* AvailableColumnsFunctions[10] = {" ", " ", " ", " ", "Add ", " ", " ", " ", " ", "Done "}; + +CategoriesPanel* CategoriesPanel_new(Settings* settings, ScreenManager* scr) { + CategoriesPanel* this = (CategoriesPanel*) malloc(sizeof(CategoriesPanel)); + Panel* super = (Panel*) this; + Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); + ((Object*)this)->delete = CategoriesPanel_delete; + + this->settings = settings; + this->scr = scr; + super->eventHandler = CategoriesPanel_eventHandler; + Panel_setHeader(super, "Setup"); + Panel_add(super, (Object*) ListItem_new("Meters", 0)); + Panel_add(super, (Object*) ListItem_new("Display options", 0)); + Panel_add(super, (Object*) ListItem_new("Colors", 0)); + Panel_add(super, (Object*) ListItem_new("Columns", 0)); + return this; +} + +void CategoriesPanel_delete(Object* object) { + Panel* super = (Panel*) object; + CategoriesPanel* this = (CategoriesPanel*) object; + Panel_done(super); + free(this); +} + +HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch) { + CategoriesPanel* this = (CategoriesPanel*) super; + + HandlerResult result = IGNORED; + + int previous = Panel_getSelectedIndex(super); + + switch (ch) { + case KEY_UP: + case KEY_DOWN: + case KEY_NPAGE: + case KEY_PPAGE: + case KEY_HOME: + case KEY_END: { + Panel_onKey(super, ch); + int selected = Panel_getSelectedIndex(super); + if (previous != selected) { + int size = ScreenManager_size(this->scr); + for (int i = 1; i < size; i++) + ScreenManager_remove(this->scr, 1); + switch (selected) { + case 0: + CategoriesPanel_makeMetersPage(this); + break; + case 1: + CategoriesPanel_makeDisplayOptionsPage(this); + break; + case 2: + CategoriesPanel_makeColorsPage(this); + break; + case 3: + CategoriesPanel_makeColumnsPage(this); + break; + } + } + result = HANDLED; + } + } + + return result; +} + +void CategoriesPanel_makeMetersPage(CategoriesPanel* this) { + Panel* leftMeters = (Panel*) MetersPanel_new(this->settings, "Left column", this->settings->header->leftMeters, this->scr); + Panel* rightMeters = (Panel*) MetersPanel_new(this->settings, "Right column", this->settings->header->rightMeters, this->scr); + Panel* availableMeters = (Panel*) AvailableMetersPanel_new(this->settings, leftMeters, rightMeters, this->scr); + ScreenManager_add(this->scr, leftMeters, FunctionBar_new(10, MetersFunctions, NULL, NULL), 20); + ScreenManager_add(this->scr, rightMeters, FunctionBar_new(10, MetersFunctions, NULL, NULL), 20); + ScreenManager_add(this->scr, availableMeters, FunctionBar_new(10, AvailableMetersFunctions, NULL, NULL), -1); +} + +void CategoriesPanel_makeDisplayOptionsPage(CategoriesPanel* this) { + Panel* displayOptions = (Panel*) DisplayOptionsPanel_new(this->settings, this->scr); + ScreenManager_add(this->scr, displayOptions, FunctionBar_new(10, DisplayOptionsFunctions, NULL, NULL), -1); +} + +void CategoriesPanel_makeColorsPage(CategoriesPanel* this) { + Panel* colors = (Panel*) ColorsPanel_new(this->settings, this->scr); + ScreenManager_add(this->scr, colors, FunctionBar_new(10, ColorsFunctions, NULL, NULL), -1); +} + +void CategoriesPanel_makeColumnsPage(CategoriesPanel* this) { + Panel* columns = (Panel*) ColumnsPanel_new(this->settings, this->scr); + Panel* availableColumns = (Panel*) AvailableColumnsPanel_new(this->settings, columns, this->scr); + ScreenManager_add(this->scr, columns, FunctionBar_new(10, ColumnsFunctions, NULL, NULL), 20); + ScreenManager_add(this->scr, availableColumns, FunctionBar_new(10, AvailableColumnsFunctions, NULL, NULL), -1); +} diff --git a/CategoriesPanel.h b/CategoriesPanel.h new file mode 100644 index 0000000..e0162be --- /dev/null +++ b/CategoriesPanel.h @@ -0,0 +1,41 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_CategoriesPanel +#define HEADER_CategoriesPanel + +#include "AvailableMetersPanel.h" +#include "MetersPanel.h" +#include "DisplayOptionsPanel.h" +#include "ColumnsPanel.h" +#include "ColorsPanel.h" +#include "AvailableColumnsPanel.h" + +#include "Panel.h" + +#include "debug.h" +#include + + +typedef struct CategoriesPanel_ { + Panel super; + + Settings* settings; + ScreenManager* scr; +} CategoriesPanel; + + +CategoriesPanel* CategoriesPanel_new(Settings* settings, ScreenManager* scr); + +void CategoriesPanel_delete(Object* object); + +HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch); + +void CategoriesPanel_makeMetersPage(CategoriesPanel* this); + +void CategoriesPanel_makeDisplayOptionsPage(CategoriesPanel* this); + +void CategoriesPanel_makeColorsPage(CategoriesPanel* this); + +void CategoriesPanel_makeColumnsPage(CategoriesPanel* this); + +#endif diff --git a/ChangeLog b/ChangeLog index b217c70..f8f3c12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,23 @@ +What's new in version 0.6.3 + +* Performance improvements: uses much less CPU than the + previous release with the default setup. +* Use 64-bit values when storing processor times to + avoid overflow. +* Memory consumption improvements, compensating storage + of 64-bit values. +* Internal change: rename TypedVector to Vector and + ListBox (and related classes) to Panel. +* Have configure actually fail when needed libraries or + headers are not found. +* Horizontally scroll in larger increments when on the + Linux console because of slow update of unaccelerated fb +* No longer untag processes after sending a signal + (useful for when SIGTERM fails and one wants to try again + with SIGKILL). All processes can be untagged at once with 'U'. + (thanks to A. Costa for the suggestion) + What's new in version 0.6.2 * BUGFIX: Fixed crash when using some .htoprc files from 0.6 @@ -137,7 +156,7 @@ What's new in version 0.4 * Clock and load average meters (thanks to Marc Calahan) * BUGFIX: numeric swap indicator was printing bogus value -* BUGFIX: internal fixes on ListBox widget +* BUGFIX: internal fixes on Panel widget * Clear the bottom line when exiting * Press "F3" during search to walk through the results * Improved navigation on column configuration screen diff --git a/CheckItem.c b/CheckItem.c index ba5bd20..8326123 100644 --- a/CheckItem.c +++ b/CheckItem.c @@ -19,15 +19,17 @@ typedef struct CheckItem_ { bool* value; } CheckItem; -extern char* CHECKITEM_CLASS; }*/ -/* private property */ +#ifdef DEBUG char* CHECKITEM_CLASS = "CheckItem"; +#else +#define CHECKITEM_CLASS NULL +#endif CheckItem* CheckItem_new(char* text, bool* value) { CheckItem* this = malloc(sizeof(CheckItem)); - ((Object*)this)->class = CHECKITEM_CLASS; + Object_setClass(this, CHECKITEM_CLASS); ((Object*)this)->display = CheckItem_display; ((Object*)this)->delete = CheckItem_delete; this->text = text; diff --git a/CheckItem.h b/CheckItem.h index 6cba3e2..e1ad4c9 100644 --- a/CheckItem.h +++ b/CheckItem.h @@ -1,4 +1,4 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_CheckItem #define HEADER_CheckItem @@ -21,8 +21,12 @@ typedef struct CheckItem_ { bool* value; } CheckItem; -extern char* CHECKITEM_CLASS; +#ifdef DEBUG +extern char* CHECKITEM_CLASS; +#else +#define CHECKITEM_CLASS NULL +#endif CheckItem* CheckItem_new(char* text, bool* value); diff --git a/ClockMeter.c b/ClockMeter.c index 9e48c29..847a09b 100644 --- a/ClockMeter.c +++ b/ClockMeter.c @@ -12,10 +12,10 @@ in the source distribution for its full text. #include "debug.h" -/* private */ -static int ClockMeter_attributes[] = { CLOCK }; +int ClockMeter_attributes[] = { + CLOCK +}; -/* private */ MeterType ClockMeter = { .setValues = ClockMeter_setValues, .display = NULL, diff --git a/ClockMeter.h b/ClockMeter.h index 7ca276e..7744e23 100644 --- a/ClockMeter.h +++ b/ClockMeter.h @@ -15,6 +15,9 @@ in the source distribution for its full text. #include "debug.h" +extern int ClockMeter_attributes[]; + +extern MeterType ClockMeter; void ClockMeter_setValues(Meter* this, char* buffer, int size); diff --git a/ColorsListBox.c b/ColorsListBox.c deleted file mode 100644 index b47a398..0000000 --- a/ColorsListBox.c +++ /dev/null @@ -1,99 +0,0 @@ - -#include "CRT.h" -#include "ColorsListBox.h" - -#include "ListBox.h" -#include "CheckItem.h" -#include "Settings.h" -#include "ScreenManager.h" - -#include "debug.h" -#include - -// TO ADD A NEW SCHEME: -// * Increment the size of bool check in ColorsListBox.h -// * Add the entry in the ColorSchemes array below in the file -// * Add a define in CRT.h that matches the order of the array -// * Add the colors in CRT_setColors - -/*{ - -typedef struct ColorsListBox_ { - ListBox super; - - Settings* settings; - ScreenManager* scr; - bool check[5]; -} ColorsListBox; - -}*/ - -/* private */ -static char* ColorSchemes[] = { - "Default", - "Monochromatic", - "Black on White", - "Light Terminal", - "MC", - "Black Night", - NULL -}; - -ColorsListBox* ColorsListBox_new(Settings* settings, ScreenManager* scr) { - ColorsListBox* this = (ColorsListBox*) malloc(sizeof(ColorsListBox)); - ListBox* super = (ListBox*) this; - ListBox_init(super, 1, 1, 1, 1, CHECKITEM_CLASS, true); - ((Object*)this)->delete = ColorsListBox_delete; - - this->settings = settings; - this->scr = scr; - super->eventHandler = ColorsListBox_EventHandler; - - ListBox_setHeader(super, "Colors"); - for (int i = 0; ColorSchemes[i] != NULL; i++) { - ListBox_add(super, (Object*) CheckItem_new(String_copy(ColorSchemes[i]), &(this->check[i]))); - this->check[i] = false; - } - this->check[settings->colorScheme] = true; - return this; -} - -void ColorsListBox_delete(Object* object) { - ListBox* super = (ListBox*) object; - ColorsListBox* this = (ColorsListBox*) object; - ListBox_done(super); - free(this); -} - -HandlerResult ColorsListBox_EventHandler(ListBox* super, int ch) { - ColorsListBox* this = (ColorsListBox*) super; - - HandlerResult result = IGNORED; - int mark = ListBox_getSelectedIndex(super); - - switch(ch) { - case 0x0a: - case 0x0d: - case KEY_ENTER: - case ' ': - for (int i = 0; ColorSchemes[i] != NULL; i++) { - this->check[i] = false; - } - this->check[mark] = true; - this->settings->colorScheme = mark; - result = HANDLED; - } - - if (result == HANDLED) { - this->settings->changed = true; - Header* header = this->settings->header; - CRT_setColors(mark); - ListBox* lbMenu = (ListBox*) TypedVector_get(this->scr->items, 0); - Header_draw(header); - RichString_setAttr(&(super->header), CRT_colors[PANEL_HEADER_FOCUS]); - RichString_setAttr(&(lbMenu->header), CRT_colors[PANEL_HEADER_UNFOCUS]); - ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2); - } - return result; -} - diff --git a/ColorsListBox.h b/ColorsListBox.h deleted file mode 100644 index 25b5653..0000000 --- a/ColorsListBox.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Do not edit this file. It was automatically genarated. */ - -#ifndef HEADER_ColorsListBox -#define HEADER_ColorsListBox - - -#include "ListBox.h" -#include "CheckItem.h" -#include "Settings.h" -#include "ScreenManager.h" - -#include "debug.h" -#include - - -typedef struct ColorsListBox_ { - ListBox super; - - Settings* settings; - ScreenManager* scr; - bool check[5]; -} ColorsListBox; - - -ColorsListBox* ColorsListBox_new(Settings* settings, ScreenManager* scr); - -void ColorsListBox_delete(Object* object); - -HandlerResult ColorsListBox_EventHandler(ListBox* super, int ch); - - -#endif diff --git a/ColorsPanel.c b/ColorsPanel.c new file mode 100644 index 0000000..e62583c --- /dev/null +++ b/ColorsPanel.c @@ -0,0 +1,98 @@ + +#include "CRT.h" +#include "ColorsPanel.h" + +#include "Panel.h" +#include "CheckItem.h" +#include "Settings.h" +#include "ScreenManager.h" + +#include "debug.h" +#include + +// TO ADD A NEW SCHEME: +// * Increment the size of bool check in ColorsPanel.h +// * Add the entry in the ColorSchemes array below in the file +// * Add a define in CRT.h that matches the order of the array +// * Add the colors in CRT_setColors + +/*{ + +typedef struct ColorsPanel_ { + Panel super; + + Settings* settings; + ScreenManager* scr; + bool check[5]; +} ColorsPanel; + +}*/ + +static char* ColorSchemes[] = { + "Default", + "Monochromatic", + "Black on White", + "Light Terminal", + "MC", + "Black Night", + NULL +}; + +ColorsPanel* ColorsPanel_new(Settings* settings, ScreenManager* scr) { + ColorsPanel* this = (ColorsPanel*) malloc(sizeof(ColorsPanel)); + Panel* super = (Panel*) this; + Panel_init(super, 1, 1, 1, 1, CHECKITEM_CLASS, true); + ((Object*)this)->delete = ColorsPanel_delete; + + this->settings = settings; + this->scr = scr; + super->eventHandler = ColorsPanel_EventHandler; + + Panel_setHeader(super, "Colors"); + for (int i = 0; ColorSchemes[i] != NULL; i++) { + Panel_add(super, (Object*) CheckItem_new(String_copy(ColorSchemes[i]), &(this->check[i]))); + this->check[i] = false; + } + this->check[settings->colorScheme] = true; + return this; +} + +void ColorsPanel_delete(Object* object) { + Panel* super = (Panel*) object; + ColorsPanel* this = (ColorsPanel*) object; + Panel_done(super); + free(this); +} + +HandlerResult ColorsPanel_EventHandler(Panel* super, int ch) { + ColorsPanel* this = (ColorsPanel*) super; + + HandlerResult result = IGNORED; + int mark = Panel_getSelectedIndex(super); + + switch(ch) { + case 0x0a: + case 0x0d: + case KEY_ENTER: + case ' ': + for (int i = 0; ColorSchemes[i] != NULL; i++) { + this->check[i] = false; + } + this->check[mark] = true; + this->settings->colorScheme = mark; + result = HANDLED; + } + + if (result == HANDLED) { + this->settings->changed = true; + Header* header = this->settings->header; + CRT_setColors(mark); + Panel* menu = (Panel*) Vector_get(this->scr->items, 0); + Header_draw(header); + RichString_setAttr(&(super->header), CRT_colors[PANEL_HEADER_FOCUS]); + RichString_setAttr(&(menu->header), CRT_colors[PANEL_HEADER_UNFOCUS]); + ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2); + } + return result; +} + diff --git a/ColorsPanel.h b/ColorsPanel.h new file mode 100644 index 0000000..2cf2947 --- /dev/null +++ b/ColorsPanel.h @@ -0,0 +1,39 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_ColorsPanel +#define HEADER_ColorsPanel + +#include "CRT.h" + +#include "Panel.h" +#include "CheckItem.h" +#include "Settings.h" +#include "ScreenManager.h" + +#include "debug.h" +#include + +// TO ADD A NEW SCHEME: +// * Increment the size of bool check in ColorsPanel.h +// * Add the entry in the ColorSchemes array below in the file +// * Add a define in CRT.h that matches the order of the array +// * Add the colors in CRT_setColors + + +typedef struct ColorsPanel_ { + Panel super; + + Settings* settings; + ScreenManager* scr; + bool check[5]; +} ColorsPanel; + + +ColorsPanel* ColorsPanel_new(Settings* settings, ScreenManager* scr); + +void ColorsPanel_delete(Object* object); + +HandlerResult ColorsPanel_EventHandler(Panel* super, int ch); + + +#endif diff --git a/ColumnsListBox.c b/ColumnsListBox.c deleted file mode 100644 index d3d02ee..0000000 --- a/ColumnsListBox.c +++ /dev/null @@ -1,104 +0,0 @@ - -#include "ColumnsListBox.h" - -#include "ListBox.h" -#include "Settings.h" -#include "ScreenManager.h" - -#include "debug.h" -#include - -/*{ - -typedef struct ColumnsListBox_ { - ListBox super; - - Settings* settings; - ScreenManager* scr; -} ColumnsListBox; - -}*/ - -ColumnsListBox* ColumnsListBox_new(Settings* settings, ScreenManager* scr) { - ColumnsListBox* this = (ColumnsListBox*) malloc(sizeof(ColumnsListBox)); - ListBox* super = (ListBox*) this; - ListBox_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); - ((Object*)this)->delete = ColumnsListBox_delete; - - this->settings = settings; - this->scr = scr; - super->eventHandler = ColumnsListBox_eventHandler; - ListBox_setHeader(super, "Active Columns"); - - ProcessField* fields = this->settings->pl->fields; - for (; *fields; fields++) { - ListBox_add(super, (Object*) ListItem_new(Process_fieldNames[*fields], 0)); - } - return this; -} - -void ColumnsListBox_delete(Object* object) { - ListBox* super = (ListBox*) object; - ColumnsListBox* this = (ColumnsListBox*) object; - ListBox_done(super); - free(this); -} - -void ColumnsListBox_update(ListBox* super) { - ColumnsListBox* this = (ColumnsListBox*) super; - int size = ListBox_getSize(super); - this->settings->changed = true; - // FIXME: this is crappily inefficient - free(this->settings->pl->fields); - this->settings->pl->fields = (ProcessField*) malloc(sizeof(ProcessField) * (size+1)); - for (int i = 0; i < size; i++) { - char* text = ((ListItem*) ListBox_get(super, i))->value; - for (int j = 1; j <= LAST_PROCESSFIELD; j++) { - if (String_eq(text, Process_fieldNames[j])) { - this->settings->pl->fields[i] = j; - break; - } - } - } - this->settings->pl->fields[size] = 0; -} - -HandlerResult ColumnsListBox_eventHandler(ListBox* super, int ch) { - - int selected = ListBox_getSelectedIndex(super); - HandlerResult result = IGNORED; - int size = ListBox_getSize(super); - - switch(ch) { - case KEY_F(7): - case '[': - case '-': - { - if (selected < size - 1) - ListBox_moveSelectedUp(super); - result = HANDLED; - break; - } - case KEY_F(8): - case ']': - case '+': - { - if (selected < size - 2) - ListBox_moveSelectedDown(super); - result = HANDLED; - break; - } - case KEY_F(9): - case KEY_DC: - { - if (selected < size - 1) { - ListBox_remove(super, selected); - } - result = HANDLED; - break; - } - } - if (result == HANDLED) - ColumnsListBox_update(super); - return result; -} diff --git a/ColumnsListBox.h b/ColumnsListBox.h deleted file mode 100644 index f9e455e..0000000 --- a/ColumnsListBox.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Do not edit this file. It was automatically genarated. */ - -#ifndef HEADER_ColumnsListBox -#define HEADER_ColumnsListBox - - -#include "ListBox.h" -#include "Settings.h" -#include "ScreenManager.h" - -#include "debug.h" -#include - - -typedef struct ColumnsListBox_ { - ListBox super; - - Settings* settings; - TypedVector* columns; - ScreenManager* scr; -} ColumnsListBox; - - -ColumnsListBox* ColumnsListBox_new(Settings* settings, ScreenManager* scr); - -void ColumnsListBox_delete(Object* object); - -void ColumnsListBox_update(ListBox* super); - -HandlerResult ColumnsListBox_eventHandler(ListBox* super, int ch); - -#endif diff --git a/ColumnsPanel.c b/ColumnsPanel.c new file mode 100644 index 0000000..8d3dd45 --- /dev/null +++ b/ColumnsPanel.c @@ -0,0 +1,104 @@ + +#include "ColumnsPanel.h" + +#include "Panel.h" +#include "Settings.h" +#include "ScreenManager.h" + +#include "debug.h" +#include + +/*{ + +typedef struct ColumnsPanel_ { + Panel super; + + Settings* settings; + ScreenManager* scr; +} ColumnsPanel; + +}*/ + +ColumnsPanel* ColumnsPanel_new(Settings* settings, ScreenManager* scr) { + ColumnsPanel* this = (ColumnsPanel*) malloc(sizeof(ColumnsPanel)); + Panel* super = (Panel*) this; + Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); + ((Object*)this)->delete = ColumnsPanel_delete; + + this->settings = settings; + this->scr = scr; + super->eventHandler = ColumnsPanel_eventHandler; + Panel_setHeader(super, "Active Columns"); + + ProcessField* fields = this->settings->pl->fields; + for (; *fields; fields++) { + Panel_add(super, (Object*) ListItem_new(Process_fieldNames[*fields], 0)); + } + return this; +} + +void ColumnsPanel_delete(Object* object) { + Panel* super = (Panel*) object; + ColumnsPanel* this = (ColumnsPanel*) object; + Panel_done(super); + free(this); +} + +void ColumnsPanel_update(Panel* super) { + ColumnsPanel* this = (ColumnsPanel*) super; + int size = Panel_getSize(super); + this->settings->changed = true; + // FIXME: this is crappily inefficient + free(this->settings->pl->fields); + this->settings->pl->fields = (ProcessField*) malloc(sizeof(ProcessField) * (size+1)); + for (int i = 0; i < size; i++) { + char* text = ((ListItem*) Panel_get(super, i))->value; + for (int j = 1; j <= LAST_PROCESSFIELD; j++) { + if (String_eq(text, Process_fieldNames[j])) { + this->settings->pl->fields[i] = j; + break; + } + } + } + this->settings->pl->fields[size] = 0; +} + +HandlerResult ColumnsPanel_eventHandler(Panel* super, int ch) { + + int selected = Panel_getSelectedIndex(super); + HandlerResult result = IGNORED; + int size = Panel_getSize(super); + + switch(ch) { + case KEY_F(7): + case '[': + case '-': + { + if (selected < size - 1) + Panel_moveSelectedUp(super); + result = HANDLED; + break; + } + case KEY_F(8): + case ']': + case '+': + { + if (selected < size - 2) + Panel_moveSelectedDown(super); + result = HANDLED; + break; + } + case KEY_F(9): + case KEY_DC: + { + if (selected < size - 1) { + Panel_remove(super, selected); + } + result = HANDLED; + break; + } + } + if (result == HANDLED) + ColumnsPanel_update(super); + return result; +} diff --git a/ColumnsPanel.h b/ColumnsPanel.h new file mode 100644 index 0000000..8eb8cd6 --- /dev/null +++ b/ColumnsPanel.h @@ -0,0 +1,31 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_ColumnsPanel +#define HEADER_ColumnsPanel + + +#include "Panel.h" +#include "Settings.h" +#include "ScreenManager.h" + +#include "debug.h" +#include + + +typedef struct ColumnsPanel_ { + Panel super; + + Settings* settings; + ScreenManager* scr; +} ColumnsPanel; + + +ColumnsPanel* ColumnsPanel_new(Settings* settings, ScreenManager* scr); + +void ColumnsPanel_delete(Object* object); + +void ColumnsPanel_update(Panel* super); + +HandlerResult ColumnsPanel_eventHandler(Panel* super, int ch); + +#endif diff --git a/DebugMemory.c b/DebugMemory.c index 6e5156d..1ef740d 100644 --- a/DebugMemory.c +++ b/DebugMemory.c @@ -1,25 +1,25 @@ #define _GNU_SOURCE - +#include #include #include -#include #include - #include -#include "DebugMemory.h" - #undef strdup #undef malloc #undef realloc #undef calloc #undef free +#include "DebugMemory.h" + /*{ + typedef struct DebugMemoryItem_ DebugMemoryItem; struct DebugMemoryItem_ { + int magic; void* data; char* file; int line; @@ -31,12 +31,15 @@ typedef struct DebugMemory_ { int allocations; int deallocations; int size; + bool totals; FILE* file; } DebugMemory; + }*/ -/* private property */ -DebugMemory* singleton = NULL; +#if defined(DEBUG) + +static DebugMemory* singleton = NULL; void DebugMemory_new() { if (singleton) @@ -47,40 +50,60 @@ void DebugMemory_new() { singleton->deallocations = 0; singleton->size = 0; singleton->file = fopen("/tmp/htop-debug-alloc.txt", "w"); + singleton->totals = true; + //singleton->file = NULL; } -void* DebugMemory_malloc(int size, char* file, int line) { +void* DebugMemory_malloc(int size, char* file, int line, char* str) { void* data = malloc(size); DebugMemory_registerAllocation(data, file, line); - fprintf(singleton->file, "%d\t%s:%d\n", size, file, line); + if (singleton->file) { + if (singleton->totals) fprintf(singleton->file, "%d\t", singleton->size); + fprintf(singleton->file, "%d\t%s:%d (%s)\n", size, file, line, str); + } return data; } void* DebugMemory_calloc(int a, int b, char* file, int line) { void* data = calloc(a, b); DebugMemory_registerAllocation(data, file, line); - fprintf(singleton->file, "%d\t%s:%d\n", a*b, file, line); + if (singleton->file) { + if (singleton->totals) fprintf(singleton->file, "%d\t", singleton->size); + fprintf(singleton->file, "%d\t%s:%d\n", a*b, file, line); + } return data; } -void* DebugMemory_realloc(void* ptr, int size, char* file, int line) { +void* DebugMemory_realloc(void* ptr, int size, char* file, int line, char* str) { if (ptr != NULL) DebugMemory_registerDeallocation(ptr, file, line); void* data = realloc(ptr, size); DebugMemory_registerAllocation(data, file, line); - fprintf(singleton->file, "%d\t%s:%d\n", size, file, line); + if (singleton->file) { + if (singleton->totals) fprintf(singleton->file, "%d\t", singleton->size); + fprintf(singleton->file, "%d\t%s:%d (%s)\n", size, file, line, str); + } return data; } void* DebugMemory_strdup(char* str, char* file, int line) { + assert(str); char* data = strdup(str); DebugMemory_registerAllocation(data, file, line); - fprintf(singleton->file, "%d\t%s:%d\n", (int) strlen(str), file, line); + if (singleton->file) { + if (singleton->totals) fprintf(singleton->file, "%d\t", singleton->size); + fprintf(singleton->file, "%d\t%s:%d\n", (int) strlen(str), file, line); + } return data; } void DebugMemory_free(void* data, char* file, int line) { + assert(data); DebugMemory_registerDeallocation(data, file, line); + if (singleton->file) { + if (singleton->totals) fprintf(singleton->file, "%d\t", singleton->size); + fprintf(singleton->file, "free\t%s:%d\n", file, line); + } free(data); } @@ -91,6 +114,7 @@ void DebugMemory_assertSize() { DebugMemoryItem* walk = singleton->first; int i = 0; while (walk != NULL) { + assert(walk->magic == 11061980); i++; walk = walk->next; } @@ -104,6 +128,7 @@ int DebugMemory_getBlockCount() { DebugMemoryItem* walk = singleton->first; int i = 0; while (walk != NULL) { + assert(walk->magic == 11061980); i++; walk = walk->next; } @@ -115,6 +140,7 @@ void DebugMemory_registerAllocation(void* data, char* file, int line) { DebugMemory_new(); DebugMemory_assertSize(); DebugMemoryItem* item = (DebugMemoryItem*) malloc(sizeof(DebugMemoryItem)); + item->magic = 11061980; item->data = data; item->file = file; item->line = line; @@ -130,6 +156,7 @@ void DebugMemory_registerAllocation(void* data, char* file, int line) { walk->next = item; break; } + assert(walk->magic == 11061980); walk = walk->next; } } @@ -141,14 +168,13 @@ void DebugMemory_registerAllocation(void* data, char* file, int line) { } void DebugMemory_registerDeallocation(void* data, char* file, int line) { - if (!data) - return; assert(singleton); assert(singleton->first); DebugMemoryItem* walk = singleton->first; DebugMemoryItem* prev = NULL; int val = DebugMemory_getBlockCount(); while (walk != NULL) { + assert(walk->magic == 11061980); if (walk->data == data) { if (prev == NULL) { singleton->first = walk->next; @@ -176,6 +202,7 @@ void DebugMemory_report() { DebugMemoryItem* walk = singleton->first; int i = 0; while (walk != NULL) { + assert(walk->magic == 11061980); i++; fprintf(stderr, "%p %s:%d\n", walk->data, walk->file, walk->line); walk = walk->next; @@ -185,5 +212,12 @@ void DebugMemory_report() { fprintf(stderr, "%d deallocations\n", singleton->deallocations); fprintf(stderr, "%d size\n", singleton->size); fprintf(stderr, "%d non-freed blocks\n", i); - fclose(singleton->file); + if (singleton->file) + fclose(singleton->file); } + +#elif defined(DEBUGLITE) + +//#include "efence.h" + +#endif diff --git a/DebugMemory.h b/DebugMemory.h index 8261fee..16f4248 100644 --- a/DebugMemory.h +++ b/DebugMemory.h @@ -1,27 +1,27 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_DebugMemory #define HEADER_DebugMemory #define _GNU_SOURCE - +#include #include #include -#include #include - #include - #undef strdup #undef malloc #undef realloc #undef calloc #undef free + + typedef struct DebugMemoryItem_ DebugMemoryItem; struct DebugMemoryItem_ { + int magic; void* data; char* file; int line; @@ -33,17 +33,20 @@ typedef struct DebugMemory_ { int allocations; int deallocations; int size; + bool totals; FILE* file; } DebugMemory; +#if defined(DEBUG) + void DebugMemory_new(); -void* DebugMemory_malloc(int size, char* file, int line); +void* DebugMemory_malloc(int size, char* file, int line, char* str); void* DebugMemory_calloc(int a, int b, char* file, int line); -void* DebugMemory_realloc(void* ptr, int size, char* file, int line); +void* DebugMemory_realloc(void* ptr, int size, char* file, int line, char* str); void* DebugMemory_strdup(char* str, char* file, int line); @@ -59,4 +62,10 @@ void DebugMemory_registerDeallocation(void* data, char* file, int line); void DebugMemory_report(); +#elif defined(DEBUGLITE) + +//#include "efence.h" + +#endif + #endif diff --git a/DisplayOptionsListBox.c b/DisplayOptionsListBox.c deleted file mode 100644 index dcf0a8a..0000000 --- a/DisplayOptionsListBox.c +++ /dev/null @@ -1,75 +0,0 @@ - -#include "DisplayOptionsListBox.h" - -#include "ListBox.h" -#include "CheckItem.h" -#include "Settings.h" -#include "ScreenManager.h" - -#include "debug.h" -#include - -/*{ - -typedef struct DisplayOptionsListBox_ { - ListBox super; - - Settings* settings; - ScreenManager* scr; -} DisplayOptionsListBox; - -}*/ - -DisplayOptionsListBox* DisplayOptionsListBox_new(Settings* settings, ScreenManager* scr) { - DisplayOptionsListBox* this = (DisplayOptionsListBox*) malloc(sizeof(DisplayOptionsListBox)); - ListBox* super = (ListBox*) this; - ListBox_init(super, 1, 1, 1, 1, CHECKITEM_CLASS, true); - ((Object*)this)->delete = DisplayOptionsListBox_delete; - - this->settings = settings; - this->scr = scr; - super->eventHandler = DisplayOptionsListBox_EventHandler; - - ListBox_setHeader(super, "Display options"); - ListBox_add(super, (Object*) CheckItem_new(String_copy("Tree view"), &(settings->pl->treeView))); - ListBox_add(super, (Object*) CheckItem_new(String_copy("Shadow other users' processes"), &(settings->pl->shadowOtherUsers))); - ListBox_add(super, (Object*) CheckItem_new(String_copy("Hide kernel threads"), &(settings->pl->hideKernelThreads))); - ListBox_add(super, (Object*) CheckItem_new(String_copy("Hide userland threads"), &(settings->pl->hideUserlandThreads))); - ListBox_add(super, (Object*) CheckItem_new(String_copy("Highlight program \"basename\""), &(settings->pl->highlightBaseName))); - ListBox_add(super, (Object*) CheckItem_new(String_copy("Highlight megabytes in memory counters"), &(settings->pl->highlightMegabytes))); - ListBox_add(super, (Object*) CheckItem_new(String_copy("Leave a margin around header"), &(settings->header->margin))); - return this; -} - -void DisplayOptionsListBox_delete(Object* object) { - ListBox* super = (ListBox*) object; - DisplayOptionsListBox* this = (DisplayOptionsListBox*) object; - ListBox_done(super); - free(this); -} - -HandlerResult DisplayOptionsListBox_EventHandler(ListBox* super, int ch) { - DisplayOptionsListBox* this = (DisplayOptionsListBox*) super; - - HandlerResult result = IGNORED; - CheckItem* selected = (CheckItem*) ListBox_getSelected(super); - - switch(ch) { - case 0x0a: - case 0x0d: - case KEY_ENTER: - case ' ': - *(selected->value) = ! *(selected->value); - result = HANDLED; - } - - if (result == HANDLED) { - this->settings->changed = true; - Header* header = this->settings->header; - Header_calculateHeight(header); - Header_draw(header); - ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2); - } - return result; -} - diff --git a/DisplayOptionsListBox.h b/DisplayOptionsListBox.h deleted file mode 100644 index 13f5fd3..0000000 --- a/DisplayOptionsListBox.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Do not edit this file. It was automatically genarated. */ - -#ifndef HEADER_DisplayOptionsListBox -#define HEADER_DisplayOptionsListBox - - -#include "ListBox.h" -#include "CheckItem.h" -#include "Settings.h" -#include "ScreenManager.h" - -#include "debug.h" -#include - - -typedef struct DisplayOptionsListBox_ { - ListBox super; - - Settings* settings; - ScreenManager* scr; -} DisplayOptionsListBox; - - -DisplayOptionsListBox* DisplayOptionsListBox_new(Settings* settings, ScreenManager* scr); - -void DisplayOptionsListBox_delete(Object* object); - -HandlerResult DisplayOptionsListBox_EventHandler(ListBox* super, int ch); - - -#endif diff --git a/DisplayOptionsPanel.c b/DisplayOptionsPanel.c new file mode 100644 index 0000000..c2b7f5e --- /dev/null +++ b/DisplayOptionsPanel.c @@ -0,0 +1,75 @@ + +#include "DisplayOptionsPanel.h" + +#include "Panel.h" +#include "CheckItem.h" +#include "Settings.h" +#include "ScreenManager.h" + +#include "debug.h" +#include + +/*{ + +typedef struct DisplayOptionsPanel_ { + Panel super; + + Settings* settings; + ScreenManager* scr; +} DisplayOptionsPanel; + +}*/ + +DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* scr) { + DisplayOptionsPanel* this = (DisplayOptionsPanel*) malloc(sizeof(DisplayOptionsPanel)); + Panel* super = (Panel*) this; + Panel_init(super, 1, 1, 1, 1, CHECKITEM_CLASS, true); + ((Object*)this)->delete = DisplayOptionsPanel_delete; + + this->settings = settings; + this->scr = scr; + super->eventHandler = DisplayOptionsPanel_EventHandler; + + Panel_setHeader(super, "Display options"); + Panel_add(super, (Object*) CheckItem_new(String_copy("Tree view"), &(settings->pl->treeView))); + Panel_add(super, (Object*) CheckItem_new(String_copy("Shadow other users' processes"), &(settings->pl->shadowOtherUsers))); + Panel_add(super, (Object*) CheckItem_new(String_copy("Hide kernel threads"), &(settings->pl->hideKernelThreads))); + Panel_add(super, (Object*) CheckItem_new(String_copy("Hide userland threads"), &(settings->pl->hideUserlandThreads))); + Panel_add(super, (Object*) CheckItem_new(String_copy("Highlight program \"basename\""), &(settings->pl->highlightBaseName))); + Panel_add(super, (Object*) CheckItem_new(String_copy("Highlight megabytes in memory counters"), &(settings->pl->highlightMegabytes))); + Panel_add(super, (Object*) CheckItem_new(String_copy("Leave a margin around header"), &(settings->header->margin))); + return this; +} + +void DisplayOptionsPanel_delete(Object* object) { + Panel* super = (Panel*) object; + DisplayOptionsPanel* this = (DisplayOptionsPanel*) object; + Panel_done(super); + free(this); +} + +HandlerResult DisplayOptionsPanel_EventHandler(Panel* super, int ch) { + DisplayOptionsPanel* this = (DisplayOptionsPanel*) super; + + HandlerResult result = IGNORED; + CheckItem* selected = (CheckItem*) Panel_getSelected(super); + + switch(ch) { + case 0x0a: + case 0x0d: + case KEY_ENTER: + case ' ': + *(selected->value) = ! *(selected->value); + result = HANDLED; + } + + if (result == HANDLED) { + this->settings->changed = true; + Header* header = this->settings->header; + Header_calculateHeight(header); + Header_draw(header); + ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2); + } + return result; +} + diff --git a/DisplayOptionsPanel.h b/DisplayOptionsPanel.h new file mode 100644 index 0000000..87faaad --- /dev/null +++ b/DisplayOptionsPanel.h @@ -0,0 +1,31 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_DisplayOptionsPanel +#define HEADER_DisplayOptionsPanel + + +#include "Panel.h" +#include "CheckItem.h" +#include "Settings.h" +#include "ScreenManager.h" + +#include "debug.h" +#include + + +typedef struct DisplayOptionsPanel_ { + Panel super; + + Settings* settings; + ScreenManager* scr; +} DisplayOptionsPanel; + + +DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* scr); + +void DisplayOptionsPanel_delete(Object* object); + +HandlerResult DisplayOptionsPanel_EventHandler(Panel* super, int ch); + + +#endif diff --git a/FunctionBar.c b/FunctionBar.c index 7f04d8e..1140267 100644 --- a/FunctionBar.c +++ b/FunctionBar.c @@ -28,25 +28,23 @@ typedef struct FunctionBar_ { bool staticData; } FunctionBar; -extern char* FUNCTIONBAR_CLASS; - }*/ -/* private property */ +#ifdef DEBUG char* FUNCTIONBAR_CLASS = "FunctionBar"; +#else +#define FUNCTIONBAR_CLASS NULL +#endif -/* private property */ static char* FunctionBar_FKeys[10] = {"F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10"}; -/* private property */ static char* FunctionBar_FLabels[10] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; -/* private property */ static int FunctionBar_FEvents[10] = {KEY_F(1), KEY_F(2), KEY_F(3), KEY_F(4), KEY_F(5), KEY_F(6), KEY_F(7), KEY_F(8), KEY_F(9), KEY_F(10)}; FunctionBar* FunctionBar_new(int size, char** functions, char** keys, int* events) { FunctionBar* this = malloc(sizeof(FunctionBar)); - ((Object*) this)->class = FUNCTIONBAR_CLASS; + Object_setClass(this, FUNCTIONBAR_CLASS); ((Object*) this)->delete = FunctionBar_delete; this->functions = functions; this->size = size; diff --git a/FunctionBar.h b/FunctionBar.h index 05c8260..dfdef60 100644 --- a/FunctionBar.h +++ b/FunctionBar.h @@ -1,9 +1,9 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_FunctionBar #define HEADER_FunctionBar /* -htop +htop - FunctionBar.h (C) 2004-2006 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. @@ -30,16 +30,21 @@ typedef struct FunctionBar_ { bool staticData; } FunctionBar; + +#ifdef DEBUG extern char* FUNCTIONBAR_CLASS; +#else +#define FUNCTIONBAR_CLASS NULL +#endif FunctionBar* FunctionBar_new(int size, char** functions, char** keys, int* events); -void FunctionBar_delete(Object* this); - -void FunctionBar_draw(FunctionBar* this, char* buffer); +void FunctionBar_delete(Object* cast); void FunctionBar_setLabel(FunctionBar* this, int event, char* text); +void FunctionBar_draw(FunctionBar* this, char* buffer); + void FunctionBar_drawAttr(FunctionBar* this, char* buffer, int attr); int FunctionBar_synthesizeEvent(FunctionBar* this, int pos); diff --git a/Hashtable.c b/Hashtable.c index 759cbef..30218a5 100644 --- a/Hashtable.c +++ b/Hashtable.c @@ -16,7 +16,6 @@ in the source distribution for its full text. typedef struct Hashtable_ Hashtable; typedef void(*Hashtable_PairFunction)(int, void*, void*); -typedef int(*Hashtable_HashAlgorithm)(Hashtable*, int); typedef struct HashtableItem { int key; @@ -28,7 +27,6 @@ struct Hashtable_ { int size; HashtableItem** buckets; int items; - Hashtable_HashAlgorithm hashAlgorithm; bool owner; }; }*/ @@ -49,15 +47,10 @@ Hashtable* Hashtable_new(int size, bool owner) { this = (Hashtable*) malloc(sizeof(Hashtable)); this->size = size; this->buckets = (HashtableItem**) calloc(sizeof(HashtableItem*), size); - this->hashAlgorithm = Hashtable_hashAlgorithm; this->owner = owner; return this; } -int Hashtable_hashAlgorithm(Hashtable* this, int key) { - return (key % this->size); -} - void Hashtable_delete(Hashtable* this) { for (int i = 0; i < this->size; i++) { HashtableItem* walk = this->buckets[i]; @@ -78,7 +71,7 @@ inline int Hashtable_size(Hashtable* this) { } void Hashtable_put(Hashtable* this, int key, void* value) { - int index = this->hashAlgorithm(this, key); + int index = key % this->size; HashtableItem** bucketPtr = &(this->buckets[index]); while (true) if (*bucketPtr == NULL) { @@ -95,7 +88,7 @@ void Hashtable_put(Hashtable* this, int key, void* value) { } void* Hashtable_remove(Hashtable* this, int key) { - int index = this->hashAlgorithm(this, key); + int index = key % this->size; HashtableItem** bucketPtr = &(this->buckets[index]); while (true) if (*bucketPtr == NULL) { @@ -116,17 +109,20 @@ void* Hashtable_remove(Hashtable* this, int key) { } else bucketPtr = &((*bucketPtr)->next); } - +//#include inline void* Hashtable_get(Hashtable* this, int key) { - int index = this->hashAlgorithm(this, key); + int index = key % this->size; HashtableItem* bucketPtr = this->buckets[index]; - while (true) + // fprintf(stderr, "%d -> %d\n", key, index); + while (true) { if (bucketPtr == NULL) { return NULL; } else if (bucketPtr->key == key) { return bucketPtr->value; } else bucketPtr = bucketPtr->next; + // fprintf(stderr, "*\n"); + } } void Hashtable_foreach(Hashtable* this, Hashtable_PairFunction f, void* userData) { diff --git a/Hashtable.h b/Hashtable.h index 51d8704..df481f2 100644 --- a/Hashtable.h +++ b/Hashtable.h @@ -1,4 +1,4 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_Hashtable #define HEADER_Hashtable @@ -18,7 +18,6 @@ in the source distribution for its full text. typedef struct Hashtable_ Hashtable; typedef void(*Hashtable_PairFunction)(int, void*, void*); -typedef int(*Hashtable_HashAlgorithm)(Hashtable*, int); typedef struct HashtableItem { int key; @@ -30,7 +29,6 @@ struct Hashtable_ { int size; HashtableItem** buckets; int items; - Hashtable_HashAlgorithm hashAlgorithm; bool owner; }; @@ -38,8 +36,6 @@ HashtableItem* HashtableItem_new(int key, void* value); Hashtable* Hashtable_new(int size, bool owner); -int Hashtable_hashAlgorithm(Hashtable* this, int key); - void Hashtable_delete(Hashtable* this); inline int Hashtable_size(Hashtable* this); @@ -47,7 +43,7 @@ inline int Hashtable_size(Hashtable* this); void Hashtable_put(Hashtable* this, int key, void* value); void* Hashtable_remove(Hashtable* this, int key); - +//#include inline void* Hashtable_get(Hashtable* this, int key); void Hashtable_foreach(Hashtable* this, Hashtable_PairFunction f, void* userData); diff --git a/Header.c b/Header.c index 766dc75..b55b557 100644 --- a/Header.c +++ b/Header.c @@ -19,8 +19,8 @@ typedef enum HeaderSide_ { } HeaderSide; typedef struct Header_ { - TypedVector* leftMeters; - TypedVector* rightMeters; + Vector* leftMeters; + Vector* rightMeters; ProcessList* pl; bool margin; int height; @@ -35,21 +35,21 @@ typedef struct Header_ { Header* Header_new(ProcessList* pl) { Header* this = malloc(sizeof(Header)); - this->leftMeters = TypedVector_new(METER_CLASS, true, DEFAULT_SIZE); - this->rightMeters = TypedVector_new(METER_CLASS, true, DEFAULT_SIZE); + this->leftMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL); + this->rightMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL); this->margin = true; this->pl = pl; return this; } void Header_delete(Header* this) { - TypedVector_delete(this->leftMeters); - TypedVector_delete(this->rightMeters); + Vector_delete(this->leftMeters); + Vector_delete(this->rightMeters); free(this); } void Header_createMeter(Header* this, char* name, HeaderSide side) { - TypedVector* meters = side == LEFT_HEADER + Vector* meters = side == LEFT_HEADER ? this->leftMeters : this->rightMeters; @@ -62,44 +62,44 @@ void Header_createMeter(Header* this, char* name, HeaderSide side) { } for (MeterType** type = Meter_types; *type; type++) { if (String_eq(name, (*type)->name)) { - TypedVector_add(meters, Meter_new(this->pl, param, *type)); + Vector_add(meters, Meter_new(this->pl, param, *type)); break; } } } void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side) { - TypedVector* meters = side == LEFT_HEADER + Vector* meters = side == LEFT_HEADER ? this->leftMeters : this->rightMeters; - Meter* meter = (Meter*) TypedVector_get(meters, i); + Meter* meter = (Meter*) Vector_get(meters, i); Meter_setMode(meter, mode); } Meter* Header_addMeter(Header* this, MeterType* type, int param, HeaderSide side) { - TypedVector* meters = side == LEFT_HEADER + Vector* meters = side == LEFT_HEADER ? this->leftMeters : this->rightMeters; Meter* meter = Meter_new(this->pl, param, type); - TypedVector_add(meters, meter); + Vector_add(meters, meter); return meter; } int Header_size(Header* this, HeaderSide side) { - TypedVector* meters = side == LEFT_HEADER + Vector* meters = side == LEFT_HEADER ? this->leftMeters : this->rightMeters; - return TypedVector_size(meters); + return Vector_size(meters); } char* Header_readMeterName(Header* this, int i, HeaderSide side) { - TypedVector* meters = side == LEFT_HEADER + Vector* meters = side == LEFT_HEADER ? this->leftMeters : this->rightMeters; - Meter* meter = (Meter*) TypedVector_get(meters, i); + Meter* meter = (Meter*) Vector_get(meters, i); int nameLen = strlen(meter->type->name); int len = nameLen + 100; @@ -113,21 +113,21 @@ char* Header_readMeterName(Header* this, int i, HeaderSide side) { } MeterModeId Header_readMeterMode(Header* this, int i, HeaderSide side) { - TypedVector* meters = side == LEFT_HEADER + Vector* meters = side == LEFT_HEADER ? this->leftMeters : this->rightMeters; - Meter* meter = (Meter*) TypedVector_get(meters, i); + Meter* meter = (Meter*) Vector_get(meters, i); return meter->mode; } void Header_defaultMeters(Header* this) { - TypedVector_add(this->leftMeters, Meter_new(this->pl, 0, &AllCPUsMeter)); - TypedVector_add(this->leftMeters, Meter_new(this->pl, 0, &MemoryMeter)); - TypedVector_add(this->leftMeters, Meter_new(this->pl, 0, &SwapMeter)); - TypedVector_add(this->rightMeters, Meter_new(this->pl, 0, &TasksMeter)); - TypedVector_add(this->rightMeters, Meter_new(this->pl, 0, &LoadAverageMeter)); - TypedVector_add(this->rightMeters, Meter_new(this->pl, 0, &UptimeMeter)); + Vector_add(this->leftMeters, Meter_new(this->pl, 0, &AllCPUsMeter)); + Vector_add(this->leftMeters, Meter_new(this->pl, 0, &MemoryMeter)); + Vector_add(this->leftMeters, Meter_new(this->pl, 0, &SwapMeter)); + Vector_add(this->rightMeters, Meter_new(this->pl, 0, &TasksMeter)); + Vector_add(this->rightMeters, Meter_new(this->pl, 0, &LoadAverageMeter)); + Vector_add(this->rightMeters, Meter_new(this->pl, 0, &UptimeMeter)); } void Header_draw(Header* this) { @@ -138,13 +138,13 @@ void Header_draw(Header* this) { for (int y = 0; y < height; y++) { mvhline(y, 0, ' ', COLS); } - for (int y = (pad / 2), i = 0; i < TypedVector_size(this->leftMeters); i++) { - Meter* meter = (Meter*) TypedVector_get(this->leftMeters, i); + for (int y = (pad / 2), i = 0; i < Vector_size(this->leftMeters); i++) { + Meter* meter = (Meter*) Vector_get(this->leftMeters, i); meter->draw(meter, pad, y, COLS / 2 - (pad * 2 - 1) - 1); y += meter->h; } - for (int y = (pad / 2), i = 0; i < TypedVector_size(this->rightMeters); i++) { - Meter* meter = (Meter*) TypedVector_get(this->rightMeters, i); + for (int y = (pad / 2), i = 0; i < Vector_size(this->rightMeters); i++) { + Meter* meter = (Meter*) Vector_get(this->rightMeters, i); meter->draw(meter, COLS / 2 + pad, y, COLS / 2 - (pad * 2 - 1) - 1); y += meter->h; } @@ -155,12 +155,12 @@ int Header_calculateHeight(Header* this) { int leftHeight = pad; int rightHeight = pad; - for (int i = 0; i < TypedVector_size(this->leftMeters); i++) { - Meter* meter = (Meter*) TypedVector_get(this->leftMeters, i); + for (int i = 0; i < Vector_size(this->leftMeters); i++) { + Meter* meter = (Meter*) Vector_get(this->leftMeters, i); leftHeight += meter->h; } - for (int i = 0; i < TypedVector_size(this->rightMeters); i++) { - Meter* meter = (Meter*) TypedVector_get(this->rightMeters, i); + for (int i = 0; i < Vector_size(this->rightMeters); i++) { + Meter* meter = (Meter*) Vector_get(this->rightMeters, i); rightHeight += meter->h; } this->pad = pad; diff --git a/Header.h b/Header.h index 96cedb6..c87d4d0 100644 --- a/Header.h +++ b/Header.h @@ -3,7 +3,7 @@ #ifndef HEADER_Header #define HEADER_Header /* -htop - Header.c +htop - Header.h (C) 2004-2006 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. @@ -21,8 +21,8 @@ typedef enum HeaderSide_ { } HeaderSide; typedef struct Header_ { - TypedVector* leftMeters; - TypedVector* rightMeters; + Vector* leftMeters; + Vector* rightMeters; ProcessList* pl; bool margin; int height; diff --git a/ListBox.c b/ListBox.c deleted file mode 100644 index 4a4b4f7..0000000 --- a/ListBox.c +++ /dev/null @@ -1,353 +0,0 @@ -/* -htop - ListBox.c -(C) 2004-2006 Hisham H. Muhammad -Released under the GNU GPL, see the COPYING file -in the source distribution for its full text. -*/ - -#include "Object.h" -#include "ListBox.h" -#include "TypedVector.h" -#include "CRT.h" -#include "RichString.h" - -#include -#include - -#include "debug.h" -#include - -#include -//#link curses - -/*{ - -typedef struct ListBox_ ListBox; - -typedef enum HandlerResult_ { - HANDLED, - IGNORED, - BREAK_LOOP -} HandlerResult; - -typedef HandlerResult(*ListBox_EventHandler)(ListBox*, int); - -struct ListBox_ { - Object super; - int x, y, w, h; - WINDOW* window; - TypedVector* items; - int selected; - int scrollV, scrollH; - int oldSelected; - bool needsRedraw; - RichString header; - ListBox_EventHandler eventHandler; -}; - -extern char* LISTBOX_CLASS; - -}*/ - -#ifndef MIN -#define MIN(a,b) ((a)<(b)?(a):(b)) -#endif -#ifndef MAX -#define MAX(a,b) ((a)>(b)?(a):(b)) -#endif - -/* private property */ -char* LISTBOX_CLASS = "ListBox"; - -ListBox* ListBox_new(int x, int y, int w, int h, char* type, bool owner) { - ListBox* this; - this = malloc(sizeof(ListBox)); - ListBox_init(this, x, y, w, h, type, owner); - return this; -} - -void ListBox_delete(Object* cast) { - ListBox* this = (ListBox*)cast; - ListBox_done(this); - free(this); -} - -void ListBox_init(ListBox* this, int x, int y, int w, int h, char* type, bool owner) { - Object* super = (Object*) this; - super->class = LISTBOX_CLASS; - super->delete = ListBox_delete; - this->x = x; - this->y = y; - this->w = w; - this->h = h; - this->eventHandler = NULL; - this->items = TypedVector_new(type, owner, DEFAULT_SIZE); - this->scrollV = 0; - this->scrollH = 0; - this->selected = 0; - this->oldSelected = 0; - this->needsRedraw = true; - this->header.len = 0; -} - -void ListBox_done(ListBox* this) { - assert (this != NULL); - RichString_delete(this->header); - TypedVector_delete(this->items); -} - -inline void ListBox_setRichHeader(ListBox* this, RichString header) { - assert (this != NULL); - - if (this->header.len > 0) { - RichString_delete(this->header); - } - this->header = header; - this->needsRedraw = true; -} - -inline void ListBox_setHeader(ListBox* this, char* header) { - ListBox_setRichHeader(this, RichString_quickString(CRT_colors[PANEL_HEADER_FOCUS], header)); -} - -void ListBox_setEventHandler(ListBox* this, ListBox_EventHandler eh) { - this->eventHandler = eh; -} - -void ListBox_move(ListBox* this, int x, int y) { - assert (this != NULL); - - this->x = x; - this->y = y; - this->needsRedraw = true; -} - -void ListBox_resize(ListBox* this, int w, int h) { - assert (this != NULL); - - if (this->header.len > 0) - h--; - this->w = w; - this->h = h; - this->needsRedraw = true; -} - -void ListBox_prune(ListBox* this) { - assert (this != NULL); - - TypedVector_prune(this->items); - this->scrollV = 0; - this->selected = 0; - this->oldSelected = 0; - this->needsRedraw = true; -} - -void ListBox_add(ListBox* this, Object* o) { - assert (this != NULL); - - TypedVector_add(this->items, o); - this->needsRedraw = true; -} - -void ListBox_insert(ListBox* this, int i, Object* o) { - assert (this != NULL); - - TypedVector_insert(this->items, i, o); - this->needsRedraw = true; -} - -void ListBox_set(ListBox* this, int i, Object* o) { - assert (this != NULL); - - TypedVector_set(this->items, i, o); -} - -Object* ListBox_get(ListBox* this, int i) { - assert (this != NULL); - - return TypedVector_get(this->items, i); -} - -Object* ListBox_remove(ListBox* this, int i) { - assert (this != NULL); - - this->needsRedraw = true; - Object* removed = TypedVector_remove(this->items, i); - if (this->selected > 0 && this->selected >= TypedVector_size(this->items)) - this->selected--; - return removed; -} - -Object* ListBox_getSelected(ListBox* this) { - assert (this != NULL); - - return TypedVector_get(this->items, this->selected); -} - -void ListBox_moveSelectedUp(ListBox* this) { - assert (this != NULL); - - TypedVector_moveUp(this->items, this->selected); - if (this->selected > 0) - this->selected--; -} - -void ListBox_moveSelectedDown(ListBox* this) { - assert (this != NULL); - - TypedVector_moveDown(this->items, this->selected); - if (this->selected + 1 < TypedVector_size(this->items)) - this->selected++; -} - -int ListBox_getSelectedIndex(ListBox* this) { - assert (this != NULL); - - return this->selected; -} - -int ListBox_getSize(ListBox* this) { - assert (this != NULL); - - return TypedVector_size(this->items); -} - -void ListBox_setSelected(ListBox* this, int selected) { - assert (this != NULL); - - selected = MAX(0, MIN(TypedVector_size(this->items) - 1, selected)); - this->selected = selected; -} - -void ListBox_draw(ListBox* this, bool focus) { - assert (this != NULL); - - int first, last; - int itemCount = TypedVector_size(this->items); - int scrollH = this->scrollH; - int y = this->y; int x = this->x; - first = this->scrollV; - - if (this->h > itemCount) { - last = this->scrollV + itemCount; - move(y + last, x + 0); - } else { - last = MIN(itemCount, this->scrollV + this->h); - } - if (this->selected < first) { - first = this->selected; - this->scrollV = first; - this->needsRedraw = true; - } - if (this->selected >= last) { - last = MIN(itemCount, this->selected + 1); - first = MAX(0, last - this->h); - this->scrollV = first; - this->needsRedraw = true; - } - assert(first >= 0); - assert(last <= itemCount); - - if (this->header.len > 0) { - int attr = focus - ? CRT_colors[PANEL_HEADER_FOCUS] - : CRT_colors[PANEL_HEADER_UNFOCUS]; - attrset(attr); - mvhline(y, x, ' ', this->w); - if (scrollH < this->header.len) { - mvaddchnstr(y, x, this->header.chstr + scrollH, - MIN(this->header.len - scrollH, this->w)); - } - attrset(CRT_colors[RESET_COLOR]); - y++; - } - - int highlight = focus - ? CRT_colors[PANEL_HIGHLIGHT_FOCUS] - : CRT_colors[PANEL_HIGHLIGHT_UNFOCUS]; - - if (this->needsRedraw) { - - for(int i = first, j = 0; j < this->h && i < last; i++, j++) { - Object* itemObj = TypedVector_get(this->items, i); - RichString itemRef = RichString_new(); - itemObj->display(itemObj, &itemRef); - int amt = MIN(itemRef.len - scrollH, this->w); - if (i == this->selected) { - attrset(highlight); - RichString_setAttr(&itemRef, highlight); - mvhline(y + j, x+0, ' ', this->w); - if (amt > 0) - mvaddchnstr(y+j, x+0, itemRef.chstr + scrollH, amt); - attrset(CRT_colors[RESET_COLOR]); - } else { - mvhline(y+j, x+0, ' ', this->w); - if (amt > 0) - mvaddchnstr(y+j, x+0, itemRef.chstr + scrollH, amt); - } - } - for (int i = y + (last - first); i < y + this->h; i++) - mvhline(i, x+0, ' ', this->w); - this->needsRedraw = false; - - } else { - Object* oldObj = TypedVector_get(this->items, this->oldSelected); - RichString oldRef = RichString_new(); - oldObj->display(oldObj, &oldRef); - Object* newObj = TypedVector_get(this->items, this->selected); - RichString newRef = RichString_new(); - newObj->display(newObj, &newRef); - mvhline(y+ this->oldSelected - this->scrollV, x+0, ' ', this->w); - if (scrollH < oldRef.len) - mvaddchnstr(y+ this->oldSelected - this->scrollV, x+0, oldRef.chstr + this->scrollH, MIN(oldRef.len - scrollH, this->w)); - attrset(highlight); - mvhline(y+this->selected - this->scrollV, x+0, ' ', this->w); - RichString_setAttr(&newRef, highlight); - if (scrollH < newRef.len) - mvaddchnstr(y+this->selected - this->scrollV, x+0, newRef.chstr + this->scrollH, MIN(newRef.len - scrollH, this->w)); - attrset(CRT_colors[RESET_COLOR]); - } - this->oldSelected = this->selected; - move(0, 0); -} - -void ListBox_onKey(ListBox* this, int key) { - assert (this != NULL); - switch (key) { - case KEY_DOWN: - if (this->selected + 1 < TypedVector_size(this->items)) - this->selected++; - break; - case KEY_UP: - if (this->selected > 0) - this->selected--; - break; - case KEY_LEFT: - if (this->scrollH > 0) { - this->scrollH -= 5; - this->needsRedraw = true; - } - break; - case KEY_RIGHT: - this->scrollH += 5; - this->needsRedraw = true; - break; - case KEY_PPAGE: - this->selected -= this->h; - if (this->selected < 0) - this->selected = 0; - break; - case KEY_NPAGE: - this->selected += this->h; - int size = TypedVector_size(this->items); - if (this->selected >= size) - this->selected = size - 1; - break; - case KEY_HOME: - this->selected = 0; - break; - case KEY_END: - this->selected = TypedVector_size(this->items) - 1; - break; - } -} diff --git a/ListBox.h b/ListBox.h deleted file mode 100644 index e89ec06..0000000 --- a/ListBox.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Do not edit this file. It was automatically genarated. */ - -#ifndef HEADER_ListBox -#define HEADER_ListBox -/* -htop -(C) 2004-2006 Hisham H. Muhammad -Released under the GNU GPL, see the COPYING file -in the source distribution for its full text. -*/ - -#include "Object.h" -#include "TypedVector.h" -#include "CRT.h" -#include "RichString.h" - -#include -#include -#include - -#include "debug.h" -#include - -#include -//#link curses - - -typedef struct ListBox_ ListBox; - -typedef enum HandlerResult_ { - HANDLED, - IGNORED, - BREAK_LOOP -} HandlerResult; - -typedef HandlerResult(*ListBox_EventHandler)(ListBox*, int); - -struct ListBox_ { - Object super; - int x, y, w, h; - WINDOW* window; - TypedVector* items; - int selected; - int scrollV, scrollH; - int oldSelected; - bool needsRedraw; - RichString header; - ListBox_EventHandler eventHandler; -}; - -extern char* LISTBOX_CLASS; - - - -ListBox* ListBox_new(int x, int y, int w, int h, char* type, bool owner); - -void ListBox_delete(Object* cast); - -void ListBox_init(ListBox* this, int x, int y, int w, int h, char* type, bool owner); - -void ListBox_done(ListBox* this); - -void ListBox_setEventHandler(ListBox* this, ListBox_EventHandler eh); - -void ListBox_setRichHeader(ListBox* this, RichString header); - -void ListBox_setHeader(ListBox* this, char* header); - -void ListBox_move(ListBox* this, int x, int y); - -void ListBox_resize(ListBox* this, int w, int h); - -void ListBox_prune(ListBox* this); - -void ListBox_add(ListBox* this, Object* o); - -void ListBox_insert(ListBox* this, int i, Object* o); - -void ListBox_set(ListBox* this, int i, Object* o); - -Object* ListBox_get(ListBox* this, int i); - -Object* ListBox_remove(ListBox* this, int i); - -Object* ListBox_getSelected(ListBox* this); - -void ListBox_moveSelectedUp(ListBox* this); - -void ListBox_moveSelectedDown(ListBox* this); - -int ListBox_getSelectedIndex(ListBox* this); - -int ListBox_getSize(ListBox* this); - -void ListBox_setSelected(ListBox* this, int selected); - -void ListBox_draw(ListBox* this, bool focus); - -void ListBox_onKey(ListBox* this, int key); - -#endif diff --git a/ListItem.c b/ListItem.c index 1889a35..90107e4 100644 --- a/ListItem.c +++ b/ListItem.c @@ -21,18 +21,19 @@ typedef struct ListItem_ { int key; } ListItem; -extern char* LISTITEM_CLASS; }*/ -/* private property */ +#ifdef DEBUG char* LISTITEM_CLASS = "ListItem"; +#else +#define LISTITEM_CLASS NULL +#endif ListItem* ListItem_new(char* value, int key) { ListItem* this = malloc(sizeof(ListItem)); - ((Object*)this)->class = LISTITEM_CLASS; + Object_setClass(this, LISTITEM_CLASS); ((Object*)this)->display = ListItem_display; ((Object*)this)->delete = ListItem_delete; - ((Object*)this)->compare = ListItem_compare; this->value = String_copy(value); this->key = key; return this; @@ -64,7 +65,7 @@ const char* ListItem_getRef(ListItem* this) { return this->value; } -int ListItem_compare(const Object* cast1, const Object* cast2) { +int ListItem_compare(const void* cast1, const void* cast2) { ListItem* obj1 = (ListItem*) cast1; ListItem* obj2 = (ListItem*) cast2; return strcmp(obj1->value, obj2->value); diff --git a/ListItem.h b/ListItem.h index 17b2fcf..a58db3a 100644 --- a/ListItem.h +++ b/ListItem.h @@ -1,9 +1,9 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_ListItem #define HEADER_ListItem /* -htop +htop - ListItem.h (C) 2004-2006 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. @@ -16,24 +16,31 @@ in the source distribution for its full text. #include "debug.h" + typedef struct ListItem_ { Object super; char* value; int key; } ListItem; + +#ifdef DEBUG extern char* LISTITEM_CLASS; +#else +#define LISTITEM_CLASS NULL +#endif ListItem* ListItem_new(char* value, int key); +void ListItem_append(ListItem* this, char* text); + void ListItem_delete(Object* cast); void ListItem_display(Object* cast, RichString* out); -void ListItem_append(ListItem* this, char* text); - const char* ListItem_getRef(ListItem* this); -int ListItem_compare(const Object*, const Object*); +int ListItem_compare(const void* cast1, const void* cast2); + #endif diff --git a/LoadAverageMeter.c b/LoadAverageMeter.c index 4f62260..ab06beb 100644 --- a/LoadAverageMeter.c +++ b/LoadAverageMeter.c @@ -12,10 +12,10 @@ in the source distribution for its full text. #include "debug.h" -/* private property */ -int LoadAverageMeter_attributes[] = { LOAD_AVERAGE_FIFTEEN, LOAD_AVERAGE_FIVE, LOAD_AVERAGE_ONE }; +int LoadAverageMeter_attributes[] = { + LOAD_AVERAGE_FIFTEEN, LOAD_AVERAGE_FIVE, LOAD_AVERAGE_ONE +}; -/* private */ MeterType LoadAverageMeter = { .setValues = LoadAverageMeter_setValues, .display = LoadAverageMeter_display, @@ -28,10 +28,8 @@ MeterType LoadAverageMeter = { .caption = "Load average: " }; -/* private property */ int LoadMeter_attributes[] = { LOAD }; -/* private */ MeterType LoadMeter = { .setValues = LoadMeter_setValues, .display = LoadMeter_display, @@ -44,8 +42,7 @@ MeterType LoadMeter = { .caption = "Load: " }; -/* private */ -inline static void LoadAverageMeter_scan(double* one, double* five, double* fifteen) { +static inline void LoadAverageMeter_scan(double* one, double* five, double* fifteen) { int activeProcs, totalProcs, lastProc; FILE *fd = fopen(PROCDIR "/loadavg", "r"); int read = fscanf(fd, "%lf %lf %lf %d/%d %d", one, five, fifteen, @@ -63,7 +60,7 @@ void LoadAverageMeter_setValues(Meter* this, char* buffer, int size) { void LoadAverageMeter_display(Object* cast, RichString* out) { Meter* this = (Meter*)cast; char buffer[20]; - RichString_prune(out); + RichString_init(out); sprintf(buffer, "%.2f ", this->values[2]); RichString_append(out, CRT_colors[LOAD_AVERAGE_FIFTEEN], buffer); sprintf(buffer, "%.2f ", this->values[1]); @@ -84,7 +81,7 @@ void LoadMeter_setValues(Meter* this, char* buffer, int size) { void LoadMeter_display(Object* cast, RichString* out) { Meter* this = (Meter*)cast; char buffer[20]; - RichString_prune(out); + RichString_init(out); sprintf(buffer, "%.2f ", ((Meter*)this)->values[0]); RichString_append(out, CRT_colors[LOAD], buffer); } diff --git a/LoadAverageMeter.h b/LoadAverageMeter.h index 27e33a1..31b0d59 100644 --- a/LoadAverageMeter.h +++ b/LoadAverageMeter.h @@ -15,10 +15,13 @@ in the source distribution for its full text. #include "debug.h" +extern int LoadAverageMeter_attributes[]; +extern MeterType LoadAverageMeter; +extern int LoadMeter_attributes[]; - +extern MeterType LoadMeter; void LoadAverageMeter_setValues(Meter* this, char* buffer, int size); diff --git a/Makefile.am b/Makefile.am index 1a568f2..6fa2f91 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,8 @@ bin_PROGRAMS = htop dist_man_MANS = htop.1 -EXTRA_DIST = $(dist_man_MANS) htop.desktop htop.png scripts/MakeHeader.py +EXTRA_DIST = $(dist_man_MANS) htop.desktop htop.png scripts/MakeHeader.py \ +install-sh autogen.sh missing applicationsdir = $(datadir)/applications applications_DATA = htop.desktop pixmapdir = $(datadir)/pixmaps @@ -10,22 +11,28 @@ pixmap_DATA = htop.png AM_CFLAGS = -pedantic -Wall -std=c99 AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\" -htop_SOURCES = AvailableMetersListBox.c CategoriesListBox.c ClockMeter.c \ -CPUMeter.c CRT.c DebugMemory.c DisplayOptionsListBox.c FunctionBar.c \ -Hashtable.c Header.c htop.c ListBox.c ListItem.c LoadAverageMeter.c \ -MemoryMeter.c Meter.c MetersListBox.c Object.c Process.c \ +htop_SOURCES = AvailableMetersPanel.c CategoriesPanel.c ClockMeter.c \ +CPUMeter.c CRT.c DebugMemory.c DisplayOptionsPanel.c FunctionBar.c \ +Hashtable.c Header.c htop.c Panel.c ListItem.c LoadAverageMeter.c \ +MemoryMeter.c Meter.c MetersPanel.c Object.c Process.c \ ProcessList.c RichString.c ScreenManager.c Settings.c SignalItem.c \ -SignalsListBox.c String.c SwapMeter.c TasksMeter.c TypedVector.c \ -UptimeMeter.c UsersTable.c AvailableMetersListBox.h CategoriesListBox.h \ +SignalsPanel.c String.c SwapMeter.c TasksMeter.c Vector.c \ +UptimeMeter.c UsersTable.c AvailableMetersPanel.h CategoriesPanel.h \ ClockMeter.h config.h CPUMeter.h CRT.h debug.h DebugMemory.h \ -DisplayOptionsListBox.h FunctionBar.h Hashtable.h Header.h htop.h ListBox.h \ +DisplayOptionsPanel.h FunctionBar.h Hashtable.h Header.h htop.h Panel.h \ ListItem.h LoadAverageMeter.h MemoryMeter.h Meter.h \ -MetersListBox.h Object.h Process.h ProcessList.h RichString.h ScreenManager.h \ -Settings.h SignalItem.h SignalsListBox.h String.h SwapMeter.h TasksMeter.h \ -TypedVector.h UptimeMeter.h UsersTable.h CheckItem.c CheckItem.h \ -ColorsListBox.c ColorsListBox.h TraceScreen.c TraceScreen.h \ -AvailableColumnsListBox.c AvailableColumnsListBox.h ColumnsListBox.c \ -ColumnsListBox.h +MetersPanel.h Object.h Process.h ProcessList.h RichString.h ScreenManager.h \ +Settings.h SignalItem.h SignalsPanel.h String.h SwapMeter.h TasksMeter.h \ +Vector.h UptimeMeter.h UsersTable.h CheckItem.c CheckItem.h \ +ColorsPanel.c ColorsPanel.h TraceScreen.c TraceScreen.h \ +AvailableColumnsPanel.c AvailableColumnsPanel.h ColumnsPanel.c \ +ColumnsPanel.h + +profile: + $(MAKE) all CFLAGS="-pg -O2" debug: $(MAKE) all CFLAGS="-g -DDEBUG" + +debuglite: + $(MAKE) all CFLAGS="-g -DDEBUGLITE" diff --git a/Makefile.in b/Makefile.in index 29db495..80f4eee 100644 --- a/Makefile.in +++ b/Makefile.in @@ -42,7 +42,7 @@ subdir = . DIST_COMMON = README $(am__configure_deps) $(dist_man_MANS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in $(top_srcdir)/configure AUTHORS COPYING \ - ChangeLog INSTALL NEWS depcomp install-sh missing + ChangeLog INSTALL NEWS TODO depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ @@ -55,52 +55,52 @@ CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(applicationsdir)" "$(DESTDIR)$(pixmapdir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) -am_htop_OBJECTS = AvailableMetersListBox.$(OBJEXT) \ - CategoriesListBox.$(OBJEXT) ClockMeter.$(OBJEXT) \ +am_htop_OBJECTS = AvailableMetersPanel.$(OBJEXT) \ + CategoriesPanel.$(OBJEXT) ClockMeter.$(OBJEXT) \ CPUMeter.$(OBJEXT) CRT.$(OBJEXT) DebugMemory.$(OBJEXT) \ - DisplayOptionsListBox.$(OBJEXT) FunctionBar.$(OBJEXT) \ + DisplayOptionsPanel.$(OBJEXT) FunctionBar.$(OBJEXT) \ Hashtable.$(OBJEXT) Header.$(OBJEXT) htop.$(OBJEXT) \ - ListBox.$(OBJEXT) ListItem.$(OBJEXT) \ - LoadAverageMeter.$(OBJEXT) MemoryMeter.$(OBJEXT) \ - Meter.$(OBJEXT) MetersListBox.$(OBJEXT) Object.$(OBJEXT) \ - Process.$(OBJEXT) ProcessList.$(OBJEXT) RichString.$(OBJEXT) \ - ScreenManager.$(OBJEXT) Settings.$(OBJEXT) \ - SignalItem.$(OBJEXT) SignalsListBox.$(OBJEXT) String.$(OBJEXT) \ - SwapMeter.$(OBJEXT) TasksMeter.$(OBJEXT) TypedVector.$(OBJEXT) \ - UptimeMeter.$(OBJEXT) UsersTable.$(OBJEXT) CheckItem.$(OBJEXT) \ - ColorsListBox.$(OBJEXT) TraceScreen.$(OBJEXT) \ - AvailableColumnsListBox.$(OBJEXT) ColumnsListBox.$(OBJEXT) + Panel.$(OBJEXT) ListItem.$(OBJEXT) LoadAverageMeter.$(OBJEXT) \ + MemoryMeter.$(OBJEXT) Meter.$(OBJEXT) MetersPanel.$(OBJEXT) \ + Object.$(OBJEXT) Process.$(OBJEXT) ProcessList.$(OBJEXT) \ + RichString.$(OBJEXT) ScreenManager.$(OBJEXT) \ + Settings.$(OBJEXT) SignalItem.$(OBJEXT) SignalsPanel.$(OBJEXT) \ + String.$(OBJEXT) SwapMeter.$(OBJEXT) TasksMeter.$(OBJEXT) \ + Vector.$(OBJEXT) UptimeMeter.$(OBJEXT) UsersTable.$(OBJEXT) \ + CheckItem.$(OBJEXT) ColorsPanel.$(OBJEXT) \ + TraceScreen.$(OBJEXT) AvailableColumnsPanel.$(OBJEXT) \ + ColumnsPanel.$(OBJEXT) htop_OBJECTS = $(am_htop_OBJECTS) htop_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(srcdir) -I. depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles -@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/AvailableColumnsListBox.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/AvailableMetersListBox.Po \ +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/AvailableColumnsPanel.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/AvailableMetersPanel.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/CPUMeter.Po ./$(DEPDIR)/CRT.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/CategoriesListBox.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/CategoriesPanel.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/CheckItem.Po ./$(DEPDIR)/ClockMeter.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/ColorsListBox.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/ColumnsListBox.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/ColorsPanel.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/ColumnsPanel.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/DebugMemory.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/DisplayOptionsListBox.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/DisplayOptionsPanel.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/FunctionBar.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/Hashtable.Po ./$(DEPDIR)/Header.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/ListBox.Po ./$(DEPDIR)/ListItem.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/ListItem.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/LoadAverageMeter.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/MemoryMeter.Po ./$(DEPDIR)/Meter.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/MetersListBox.Po ./$(DEPDIR)/Object.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/Process.Po ./$(DEPDIR)/ProcessList.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/MetersPanel.Po ./$(DEPDIR)/Object.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/Panel.Po ./$(DEPDIR)/Process.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/ProcessList.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/RichString.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/ScreenManager.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/Settings.Po ./$(DEPDIR)/SignalItem.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/SignalsListBox.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/String.Po ./$(DEPDIR)/SwapMeter.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/TasksMeter.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/SignalsPanel.Po ./$(DEPDIR)/String.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/SwapMeter.Po ./$(DEPDIR)/TasksMeter.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/TraceScreen.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/TypedVector.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/UptimeMeter.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/UsersTable.Po ./$(DEPDIR)/htop.Po +@AMDEP_TRUE@ ./$(DEPDIR)/UsersTable.Po ./$(DEPDIR)/Vector.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/htop.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) @@ -196,29 +196,31 @@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ dist_man_MANS = htop.1 -EXTRA_DIST = $(dist_man_MANS) htop.desktop htop.png scripts/MakeHeader.py +EXTRA_DIST = $(dist_man_MANS) htop.desktop htop.png scripts/MakeHeader.py \ +install-sh autogen.sh missing + applicationsdir = $(datadir)/applications applications_DATA = htop.desktop pixmapdir = $(datadir)/pixmaps pixmap_DATA = htop.png AM_CFLAGS = -pedantic -Wall -std=c99 AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)\" -htop_SOURCES = AvailableMetersListBox.c CategoriesListBox.c ClockMeter.c \ -CPUMeter.c CRT.c DebugMemory.c DisplayOptionsListBox.c FunctionBar.c \ -Hashtable.c Header.c htop.c ListBox.c ListItem.c LoadAverageMeter.c \ -MemoryMeter.c Meter.c MetersListBox.c Object.c Process.c \ +htop_SOURCES = AvailableMetersPanel.c CategoriesPanel.c ClockMeter.c \ +CPUMeter.c CRT.c DebugMemory.c DisplayOptionsPanel.c FunctionBar.c \ +Hashtable.c Header.c htop.c Panel.c ListItem.c LoadAverageMeter.c \ +MemoryMeter.c Meter.c MetersPanel.c Object.c Process.c \ ProcessList.c RichString.c ScreenManager.c Settings.c SignalItem.c \ -SignalsListBox.c String.c SwapMeter.c TasksMeter.c TypedVector.c \ -UptimeMeter.c UsersTable.c AvailableMetersListBox.h CategoriesListBox.h \ +SignalsPanel.c String.c SwapMeter.c TasksMeter.c Vector.c \ +UptimeMeter.c UsersTable.c AvailableMetersPanel.h CategoriesPanel.h \ ClockMeter.h config.h CPUMeter.h CRT.h debug.h DebugMemory.h \ -DisplayOptionsListBox.h FunctionBar.h Hashtable.h Header.h htop.h ListBox.h \ +DisplayOptionsPanel.h FunctionBar.h Hashtable.h Header.h htop.h Panel.h \ ListItem.h LoadAverageMeter.h MemoryMeter.h Meter.h \ -MetersListBox.h Object.h Process.h ProcessList.h RichString.h ScreenManager.h \ -Settings.h SignalItem.h SignalsListBox.h String.h SwapMeter.h TasksMeter.h \ -TypedVector.h UptimeMeter.h UsersTable.h CheckItem.c CheckItem.h \ -ColorsListBox.c ColorsListBox.h TraceScreen.c TraceScreen.h \ -AvailableColumnsListBox.c AvailableColumnsListBox.h ColumnsListBox.c \ -ColumnsListBox.h +MetersPanel.h Object.h Process.h ProcessList.h RichString.h ScreenManager.h \ +Settings.h SignalItem.h SignalsPanel.h String.h SwapMeter.h TasksMeter.h \ +Vector.h UptimeMeter.h UsersTable.h CheckItem.c CheckItem.h \ +ColorsPanel.c ColorsPanel.h TraceScreen.c TraceScreen.h \ +AvailableColumnsPanel.c AvailableColumnsPanel.h ColumnsPanel.c \ +ColumnsPanel.h all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am @@ -308,41 +310,41 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AvailableColumnsListBox.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AvailableMetersListBox.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AvailableColumnsPanel.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AvailableMetersPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CPUMeter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CRT.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CategoriesListBox.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CategoriesPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CheckItem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ClockMeter.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ColorsListBox.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ColumnsListBox.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ColorsPanel.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ColumnsPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DebugMemory.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DisplayOptionsListBox.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DisplayOptionsPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FunctionBar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Hashtable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Header.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ListBox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ListItem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoadAverageMeter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MemoryMeter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Meter.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetersListBox.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetersPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Object.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Panel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Process.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ProcessList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RichString.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ScreenManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Settings.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SignalItem.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SignalsListBox.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SignalsPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/String.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SwapMeter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TasksMeter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TraceScreen.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TypedVector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UptimeMeter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UsersTable.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Vector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htop.Po@am__quote@ .c.o: @@ -720,8 +722,14 @@ uninstall-man: uninstall-man1 uninstall-man1 uninstall-pixmapDATA +profile: + $(MAKE) all CFLAGS="-pg -O2" + debug: $(MAKE) all CFLAGS="-g -DDEBUG" + +debuglite: + $(MAKE) all CFLAGS="-g -DDEBUGLITE" # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/MemoryMeter.c b/MemoryMeter.c index d4f6722..617fc52 100644 --- a/MemoryMeter.c +++ b/MemoryMeter.c @@ -19,10 +19,10 @@ in the source distribution for its full text. #include "debug.h" #include -/* private property */ -static int MemoryMeter_attributes[] = { MEMORY_USED, MEMORY_BUFFERS, MEMORY_CACHE }; +int MemoryMeter_attributes[] = { + MEMORY_USED, MEMORY_BUFFERS, MEMORY_CACHE +}; -/* private */ MeterType MemoryMeter = { .setValues = MemoryMeter_setValues, .display = MemoryMeter_display, @@ -55,7 +55,7 @@ void MemoryMeter_display(Object* cast, RichString* out) { long int usedMem = this->values[0] / div; long int buffersMem = this->values[1] / div; long int cachedMem = this->values[2] / div; - RichString_prune(out); + RichString_init(out); RichString_append(out, CRT_colors[METER_TEXT], ":"); sprintf(buffer, format, totalMem); RichString_append(out, CRT_colors[METER_VALUE], buffer); diff --git a/MemoryMeter.h b/MemoryMeter.h index e2f42e0..4a48526 100644 --- a/MemoryMeter.h +++ b/MemoryMeter.h @@ -22,7 +22,9 @@ in the source distribution for its full text. #include "debug.h" #include +extern int MemoryMeter_attributes[]; +extern MeterType MemoryMeter; void MemoryMeter_setValues(Meter* this, char* buffer, int size); diff --git a/Meter.c b/Meter.c index 973a63e..0e9ef05 100644 --- a/Meter.c +++ b/Meter.c @@ -76,18 +76,6 @@ struct Meter_ { double total; }; -extern char* METER_CLASS; - -extern MeterType CPUMeter; -extern MeterType ClockMeter; -extern MeterType LoadAverageMeter; -extern MeterType LoadMeter; -extern MeterType MemoryMeter; -extern MeterType SwapMeter; -extern MeterType TasksMeter; -extern MeterType UptimeMeter; -extern MeterType AllCPUsMeter; - typedef enum { CUSTOM_METERMODE = 0, BAR_METERMODE, @@ -99,11 +87,16 @@ typedef enum { LAST_METERMODE } MeterModeId; -extern MeterType* Meter_types[]; -extern MeterMode* Meter_modes[]; - }*/ +#include "CPUMeter.h" +#include "MemoryMeter.h" +#include "SwapMeter.h" +#include "TasksMeter.h" +#include "LoadAverageMeter.h" +#include "UptimeMeter.h" +#include "ClockMeter.h" + #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif @@ -111,10 +104,12 @@ extern MeterMode* Meter_modes[]; #define MAX(a,b) ((a)>(b)?(a):(b)) #endif -/* private property */ +#ifdef DEBUG char* METER_CLASS = "Meter"; +#else +#define METER_CLASS NULL +#endif -/* private */ MeterType* Meter_types[] = { &CPUMeter, &ClockMeter, @@ -128,14 +123,12 @@ MeterType* Meter_types[] = { NULL }; -/* private */ static MeterMode BarMeterMode = { .uiName = "Bar", .h = 1, .draw = BarMeterMode_draw, }; -/* private */ static MeterMode TextMeterMode = { .uiName = "Text", .h = 1, @@ -143,22 +136,21 @@ static MeterMode TextMeterMode = { }; #ifdef USE_FUNKY_MODES -/* private */ + static MeterMode GraphMeterMode = { .uiName = "Graph", .h = 3, .draw = GraphMeterMode_draw, }; -/* private */ static MeterMode LEDMeterMode = { .uiName = "LED", .h = 3, .draw = LEDMeterMode_draw, }; + #endif -/* private */ MeterMode* Meter_modes[] = { NULL, &BarMeterMode, @@ -170,11 +162,13 @@ MeterMode* Meter_modes[] = { NULL }; -/* private property */ static RichString Meter_stringBuffer; Meter* Meter_new(ProcessList* pl, int param, MeterType* type) { Meter* this = calloc(sizeof(Meter), 1); + Object_setClass(this, METER_CLASS); + ((Object*)this)->delete = Meter_delete; + ((Object*)this)->display = type->display; this->h = 1; this->type = type; this->param = param; @@ -182,9 +176,6 @@ Meter* Meter_new(ProcessList* pl, int param, MeterType* type) { this->values = calloc(sizeof(double), type->items); this->total = type->total; this->caption = strdup(type->caption); - ((Object*)this)->delete = Meter_delete; - ((Object*)this)->class = METER_CLASS; - ((Object*)this)->display = type->display; Meter_setMode(this, type->mode); if (this->type->init) this->type->init(this); @@ -209,14 +200,13 @@ void Meter_setCaption(Meter* this, char* caption) { this->caption = strdup(caption); } -/* private */ -inline static void Meter_displayToStringBuffer(Meter* this, char* buffer) { +static inline void Meter_displayToStringBuffer(Meter* this, char* buffer) { MeterType* type = this->type; Object_Display display = ((Object*)this)->display; if (display) { display((Object*)this, &Meter_stringBuffer); } else { - RichString_prune(&Meter_stringBuffer); + RichString_initVal(Meter_stringBuffer); RichString_append(&Meter_stringBuffer, CRT_colors[type->attributes[0]], buffer); } } @@ -281,8 +271,7 @@ void TextMeterMode_draw(Meter* this, int x, int y, int w) { /* ---------- BarMeterMode ---------- */ -/* private property */ -char BarMeterMode_characters[] = "|#*@$%&"; +static char BarMeterMode_characters[] = "|#*@$%&"; void BarMeterMode_draw(Meter* this, int x, int y, int w) { MeterType* type = this->type; @@ -360,14 +349,16 @@ void BarMeterMode_draw(Meter* this, int x, int y, int w) { #define DrawDot(a,y,c) do { attrset(a); mvaddch(y, x+k, c); } while(0) -/* private */ -static int GraphMeterMode_colors[21] = {GRAPH_1, GRAPH_1, GRAPH_1, - GRAPH_2, GRAPH_2, GRAPH_2, GRAPH_3, GRAPH_3, GRAPH_3, - GRAPH_4, GRAPH_4, GRAPH_4, GRAPH_5, GRAPH_5, GRAPH_6, - GRAPH_7, GRAPH_7, GRAPH_7, GRAPH_8, GRAPH_8, GRAPH_9 +static int GraphMeterMode_colors[21] = { + GRAPH_1, GRAPH_1, GRAPH_1, + GRAPH_2, GRAPH_2, GRAPH_2, + GRAPH_3, GRAPH_3, GRAPH_3, + GRAPH_4, GRAPH_4, GRAPH_4, + GRAPH_5, GRAPH_5, GRAPH_6, + GRAPH_7, GRAPH_7, GRAPH_7, + GRAPH_8, GRAPH_8, GRAPH_9 }; -/* private property */ static char* GraphMeterMode_characters = "^`'-.,_~'`-.,_~'`-.,_"; void GraphMeterMode_draw(Meter* this, int x, int y, int w) { @@ -405,14 +396,12 @@ void GraphMeterMode_draw(Meter* this, int x, int y, int w) { /* ---------- LEDMeterMode ---------- */ -/* private */ static char* LEDMeterMode_digits[3][10] = { { " __ "," "," __ "," __ "," "," __ "," __ "," __ "," __ "," __ "}, { "| |"," |"," __|"," __|","|__|","|__ ","|__ "," |","|__|","|__|"}, { "|__|"," |","|__ "," __|"," |"," __|","|__|"," |","|__|"," __|"}, }; -/* private */ static void LEDMeterMode_drawDigit(int x, int y, int n) { for (int i = 0; i < 3; i++) mvaddstr(y+i, x, LEDMeterMode_digits[i][n]); diff --git a/Meter.h b/Meter.h index 73fa657..e564d3c 100644 --- a/Meter.h +++ b/Meter.h @@ -3,7 +3,7 @@ #ifndef HEADER_Meter #define HEADER_Meter /* -htop - Meter.c +htop - Meter.h (C) 2004-2006 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. @@ -78,18 +78,6 @@ struct Meter_ { double total; }; -extern char* METER_CLASS; - -extern MeterType CPUMeter; -extern MeterType ClockMeter; -extern MeterType LoadAverageMeter; -extern MeterType LoadMeter; -extern MeterType MemoryMeter; -extern MeterType SwapMeter; -extern MeterType TasksMeter; -extern MeterType UptimeMeter; -extern MeterType AllCPUsMeter; - typedef enum { CUSTOM_METERMODE = 0, BAR_METERMODE, @@ -101,9 +89,14 @@ typedef enum { LAST_METERMODE } MeterModeId; -extern MeterType* Meter_types[]; -extern MeterMode* Meter_modes[]; +#include "CPUMeter.h" +#include "MemoryMeter.h" +#include "SwapMeter.h" +#include "TasksMeter.h" +#include "LoadAverageMeter.h" +#include "UptimeMeter.h" +#include "ClockMeter.h" #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) @@ -112,15 +105,19 @@ extern MeterMode* Meter_modes[]; #define MAX(a,b) ((a)>(b)?(a):(b)) #endif +#ifdef DEBUG +extern char* METER_CLASS; +#else +#define METER_CLASS NULL +#endif - - +extern MeterType* Meter_types[]; #ifdef USE_FUNKY_MODES #endif - +extern MeterMode* Meter_modes[]; Meter* Meter_new(ProcessList* pl, int param, MeterType* type); @@ -128,7 +125,6 @@ void Meter_delete(Object* cast); void Meter_setCaption(Meter* this, char* caption); - void Meter_setMode(Meter* this, int modeIndex); ListItem* Meter_toListItem(Meter* this); @@ -139,7 +135,6 @@ void TextMeterMode_draw(Meter* this, int x, int y, int w); /* ---------- BarMeterMode ---------- */ - void BarMeterMode_draw(Meter* this, int x, int y, int w); #ifdef USE_FUNKY_MODES @@ -148,14 +143,10 @@ void BarMeterMode_draw(Meter* this, int x, int y, int w); #define DrawDot(a,y,c) do { attrset(a); mvaddch(y, x+k, c); } while(0) - - void GraphMeterMode_draw(Meter* this, int x, int y, int w); /* ---------- LEDMeterMode ---------- */ - - void LEDMeterMode_draw(Meter* this, int x, int y, int w); #endif diff --git a/MetersListBox.c b/MetersListBox.c deleted file mode 100644 index 15f4a27..0000000 --- a/MetersListBox.c +++ /dev/null @@ -1,105 +0,0 @@ - -#include "MetersListBox.h" - -#include "ListBox.h" -#include "Settings.h" -#include "ScreenManager.h" - -#include "debug.h" -#include - -/*{ - -typedef struct MetersListBox_ { - ListBox super; - - Settings* settings; - TypedVector* meters; - ScreenManager* scr; -} MetersListBox; - -}*/ - -MetersListBox* MetersListBox_new(Settings* settings, char* header, TypedVector* meters, ScreenManager* scr) { - MetersListBox* this = (MetersListBox*) malloc(sizeof(MetersListBox)); - ListBox* super = (ListBox*) this; - ListBox_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); - ((Object*)this)->delete = MetersListBox_delete; - - this->settings = settings; - this->meters = meters; - this->scr = scr; - super->eventHandler = MetersListBox_EventHandler; - ListBox_setHeader(super, header); - for (int i = 0; i < TypedVector_size(meters); i++) { - Meter* meter = (Meter*) TypedVector_get(meters, i); - ListBox_add(super, (Object*) Meter_toListItem(meter)); - } - return this; -} - -void MetersListBox_delete(Object* object) { - ListBox* super = (ListBox*) object; - MetersListBox* this = (MetersListBox*) object; - ListBox_done(super); - free(this); -} - -HandlerResult MetersListBox_EventHandler(ListBox* super, int ch) { - MetersListBox* this = (MetersListBox*) super; - - int selected = ListBox_getSelectedIndex(super); - HandlerResult result = IGNORED; - - switch(ch) { - case 0x0a: - case 0x0d: - case KEY_ENTER: - case KEY_F(4): - case 't': - { - Meter* meter = (Meter*) TypedVector_get(this->meters, selected); - int mode = meter->mode + 1; - if (mode == LAST_METERMODE) mode = 1; - Meter_setMode(meter, mode); - ListBox_set(super, selected, (Object*) Meter_toListItem(meter)); - result = HANDLED; - break; - } - case KEY_F(7): - case '[': - case '-': - { - TypedVector_moveUp(this->meters, selected); - ListBox_moveSelectedUp(super); - result = HANDLED; - break; - } - case KEY_F(8): - case ']': - case '+': - { - TypedVector_moveDown(this->meters, selected); - ListBox_moveSelectedDown(super); - result = HANDLED; - break; - } - case KEY_F(9): - case KEY_DC: - { - if (selected < TypedVector_size(this->meters)) { - TypedVector_remove(this->meters, selected); - ListBox_remove(super, selected); - } - result = HANDLED; - break; - } - } - if (result == HANDLED) { - Header* header = this->settings->header; - Header_calculateHeight(header); - Header_draw(header); - ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2); - } - return result; -} diff --git a/MetersListBox.h b/MetersListBox.h deleted file mode 100644 index 92f96f9..0000000 --- a/MetersListBox.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Do not edit this file. It was automatically genarated. */ - -#ifndef HEADER_MetersListBox -#define HEADER_MetersListBox - - -#include "ListBox.h" -#include "Settings.h" -#include "ScreenManager.h" - -#include "debug.h" -#include - - -typedef struct MetersListBox_ { - ListBox super; - - Settings* settings; - TypedVector* meters; - ScreenManager* scr; -} MetersListBox; - - -MetersListBox* MetersListBox_new(Settings* settings, char* header, TypedVector* meters, ScreenManager* scr); - -void MetersListBox_delete(Object* object); - -HandlerResult MetersListBox_EventHandler(ListBox* super, int ch); - -#endif diff --git a/MetersPanel.c b/MetersPanel.c new file mode 100644 index 0000000..b87f510 --- /dev/null +++ b/MetersPanel.c @@ -0,0 +1,105 @@ + +#include "MetersPanel.h" + +#include "Panel.h" +#include "Settings.h" +#include "ScreenManager.h" + +#include "debug.h" +#include + +/*{ + +typedef struct MetersPanel_ { + Panel super; + + Settings* settings; + Vector* meters; + ScreenManager* scr; +} MetersPanel; + +}*/ + +MetersPanel* MetersPanel_new(Settings* settings, char* header, Vector* meters, ScreenManager* scr) { + MetersPanel* this = (MetersPanel*) malloc(sizeof(MetersPanel)); + Panel* super = (Panel*) this; + Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true); + ((Object*)this)->delete = MetersPanel_delete; + + this->settings = settings; + this->meters = meters; + this->scr = scr; + super->eventHandler = MetersPanel_EventHandler; + Panel_setHeader(super, header); + for (int i = 0; i < Vector_size(meters); i++) { + Meter* meter = (Meter*) Vector_get(meters, i); + Panel_add(super, (Object*) Meter_toListItem(meter)); + } + return this; +} + +void MetersPanel_delete(Object* object) { + Panel* super = (Panel*) object; + MetersPanel* this = (MetersPanel*) object; + Panel_done(super); + free(this); +} + +HandlerResult MetersPanel_EventHandler(Panel* super, int ch) { + MetersPanel* this = (MetersPanel*) super; + + int selected = Panel_getSelectedIndex(super); + HandlerResult result = IGNORED; + + switch(ch) { + case 0x0a: + case 0x0d: + case KEY_ENTER: + case KEY_F(4): + case 't': + { + Meter* meter = (Meter*) Vector_get(this->meters, selected); + int mode = meter->mode + 1; + if (mode == LAST_METERMODE) mode = 1; + Meter_setMode(meter, mode); + Panel_set(super, selected, (Object*) Meter_toListItem(meter)); + result = HANDLED; + break; + } + case KEY_F(7): + case '[': + case '-': + { + Vector_moveUp(this->meters, selected); + Panel_moveSelectedUp(super); + result = HANDLED; + break; + } + case KEY_F(8): + case ']': + case '+': + { + Vector_moveDown(this->meters, selected); + Panel_moveSelectedDown(super); + result = HANDLED; + break; + } + case KEY_F(9): + case KEY_DC: + { + if (selected < Vector_size(this->meters)) { + Vector_remove(this->meters, selected); + Panel_remove(super, selected); + } + result = HANDLED; + break; + } + } + if (result == HANDLED) { + Header* header = this->settings->header; + Header_calculateHeight(header); + Header_draw(header); + ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2); + } + return result; +} diff --git a/MetersPanel.h b/MetersPanel.h new file mode 100644 index 0000000..8f14e25 --- /dev/null +++ b/MetersPanel.h @@ -0,0 +1,30 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_MetersPanel +#define HEADER_MetersPanel + + +#include "Panel.h" +#include "Settings.h" +#include "ScreenManager.h" + +#include "debug.h" +#include + + +typedef struct MetersPanel_ { + Panel super; + + Settings* settings; + Vector* meters; + ScreenManager* scr; +} MetersPanel; + + +MetersPanel* MetersPanel_new(Settings* settings, char* header, Vector* meters, ScreenManager* scr); + +void MetersPanel_delete(Object* object); + +HandlerResult MetersPanel_EventHandler(Panel* super, int ch); + +#endif diff --git a/Object.c b/Object.c index c368b9c..15b9a6e 100644 --- a/Object.c +++ b/Object.c @@ -15,38 +15,37 @@ in the source distribution for its full text. #include "debug.h" /*{ + +#ifndef DEBUG +#define Object_setClass(obj, class) +#endif + typedef struct Object_ Object; typedef void(*Object_Display)(Object*, RichString*); -typedef int(*Object_Compare)(const Object*, const Object*); +typedef int(*Object_Compare)(const void*, const void*); typedef void(*Object_Delete)(Object*); struct Object_ { + #ifdef DEBUG char* class; + #endif Object_Display display; - Object_Compare compare; Object_Delete delete; }; }*/ -/* private property */ +#ifdef DEBUG char* OBJECT_CLASS = "Object"; -void Object_new() { - Object* this; - this = malloc(sizeof(Object)); - this->class = OBJECT_CLASS; - this->display = Object_display; - this->compare = Object_compare; - this->delete = Object_delete; -} +#else +#define OBJECT_CLASS NULL +#endif -bool Object_instanceOf(Object* this, char* class) { - return this->class == class; -} +#ifdef DEBUG -void Object_delete(Object* this) { - free(this); +void Object_setClass(void* this, char* class) { + ((Object*)this)->class = class; } void Object_display(Object* this, RichString* out) { @@ -55,6 +54,4 @@ void Object_display(Object* this, RichString* out) { RichString_write(out, CRT_colors[DEFAULT_COLOR], objAddress); } -int Object_compare(const Object* this, const Object* o) { - return (this - o); -} +#endif diff --git a/Object.h b/Object.h index 78886c2..f8a8c6d 100644 --- a/Object.h +++ b/Object.h @@ -1,4 +1,4 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_Object #define HEADER_Object @@ -17,28 +17,38 @@ in the source distribution for its full text. #include "debug.h" + +#ifndef DEBUG +#define Object_setClass(obj, class) +#endif + typedef struct Object_ Object; typedef void(*Object_Display)(Object*, RichString*); -typedef int(*Object_Compare)(const Object*, const Object*); +typedef int(*Object_Compare)(const void*, const void*); typedef void(*Object_Delete)(Object*); struct Object_ { + #ifdef DEBUG char* class; + #endif Object_Display display; - Object_Compare compare; Object_Delete delete; }; +#ifdef DEBUG +extern char* OBJECT_CLASS; -void Object_new(); +#else +#define OBJECT_CLASS NULL +#endif -bool Object_instanceOf(Object* this, char* class); +#ifdef DEBUG -void Object_delete(Object* this); +void Object_setClass(void* this, char* class); void Object_display(Object* this, RichString* out); -int Object_compare(const Object* this, const Object* o); +#endif #endif diff --git a/Panel.c b/Panel.c new file mode 100644 index 0000000..8c1bf56 --- /dev/null +++ b/Panel.c @@ -0,0 +1,361 @@ +/* +htop - Panel.c +(C) 2004-2006 Hisham H. Muhammad +Released under the GNU GPL, see the COPYING file +in the source distribution for its full text. +*/ + +#include "Object.h" +#include "Panel.h" +#include "Vector.h" +#include "CRT.h" +#include "RichString.h" +#include "ListItem.h" + +#include +#include + +#include "debug.h" +#include + +#include +//#link curses + +/*{ + +typedef struct Panel_ Panel; + +typedef enum HandlerResult_ { + HANDLED, + IGNORED, + BREAK_LOOP +} HandlerResult; + +typedef HandlerResult(*Panel_EventHandler)(Panel*, int); + +struct Panel_ { + Object super; + int x, y, w, h; + WINDOW* window; + Vector* items; + int selected; + int scrollV, scrollH; + int scrollHAmount; + int oldSelected; + bool needsRedraw; + RichString header; + Panel_EventHandler eventHandler; +}; + +}*/ + +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif +#ifndef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) +#endif + +#ifdef DEBUG +char* PANEL_CLASS = "Panel"; +#else +#define PANEL_CLASS NULL +#endif + + +Panel* Panel_new(int x, int y, int w, int h, char* type, bool owner, Object_Compare compare) { + Panel* this; + this = malloc(sizeof(Panel)); + Panel_init(this, x, y, w, h, type, owner); + this->items->compare = compare; + return this; +} + +void Panel_delete(Object* cast) { + Panel* this = (Panel*)cast; + Panel_done(this); + free(this); +} + +void Panel_init(Panel* this, int x, int y, int w, int h, char* type, bool owner) { + Object* super = (Object*) this; + Object_setClass(this, PANEL_CLASS); + super->delete = Panel_delete; + this->x = x; + this->y = y; + this->w = w; + this->h = h; + this->eventHandler = NULL; + this->items = Vector_new(type, owner, DEFAULT_SIZE, ListItem_compare); + this->scrollV = 0; + this->scrollH = 0; + this->selected = 0; + this->oldSelected = 0; + this->needsRedraw = true; + this->header.len = 0; + if (String_eq(CRT_termType, "linux")) + this->scrollHAmount = 40; + else + this->scrollHAmount = 5; +} + +void Panel_done(Panel* this) { + assert (this != NULL); + Vector_delete(this->items); +} + +inline void Panel_setRichHeader(Panel* this, RichString header) { + assert (this != NULL); + + this->header = header; + this->needsRedraw = true; +} + +inline void Panel_setHeader(Panel* this, char* header) { + Panel_setRichHeader(this, RichString_quickString(CRT_colors[PANEL_HEADER_FOCUS], header)); +} + +void Panel_setEventHandler(Panel* this, Panel_EventHandler eh) { + this->eventHandler = eh; +} + +void Panel_move(Panel* this, int x, int y) { + assert (this != NULL); + + this->x = x; + this->y = y; + this->needsRedraw = true; +} + +void Panel_resize(Panel* this, int w, int h) { + assert (this != NULL); + + if (this->header.len > 0) + h--; + this->w = w; + this->h = h; + this->needsRedraw = true; +} + +void Panel_prune(Panel* this) { + assert (this != NULL); + + Vector_prune(this->items); + this->scrollV = 0; + this->selected = 0; + this->oldSelected = 0; + this->needsRedraw = true; +} + +void Panel_add(Panel* this, Object* o) { + assert (this != NULL); + + Vector_add(this->items, o); + this->needsRedraw = true; +} + +void Panel_insert(Panel* this, int i, Object* o) { + assert (this != NULL); + + Vector_insert(this->items, i, o); + this->needsRedraw = true; +} + +void Panel_set(Panel* this, int i, Object* o) { + assert (this != NULL); + + Vector_set(this->items, i, o); +} + +Object* Panel_get(Panel* this, int i) { + assert (this != NULL); + + return Vector_get(this->items, i); +} + +Object* Panel_remove(Panel* this, int i) { + assert (this != NULL); + + this->needsRedraw = true; + Object* removed = Vector_remove(this->items, i); + if (this->selected > 0 && this->selected >= Vector_size(this->items)) + this->selected--; + return removed; +} + +Object* Panel_getSelected(Panel* this) { + assert (this != NULL); + + return Vector_get(this->items, this->selected); +} + +void Panel_moveSelectedUp(Panel* this) { + assert (this != NULL); + + Vector_moveUp(this->items, this->selected); + if (this->selected > 0) + this->selected--; +} + +void Panel_moveSelectedDown(Panel* this) { + assert (this != NULL); + + Vector_moveDown(this->items, this->selected); + if (this->selected + 1 < Vector_size(this->items)) + this->selected++; +} + +int Panel_getSelectedIndex(Panel* this) { + assert (this != NULL); + + return this->selected; +} + +int Panel_getSize(Panel* this) { + assert (this != NULL); + + return Vector_size(this->items); +} + +void Panel_setSelected(Panel* this, int selected) { + assert (this != NULL); + + selected = MAX(0, MIN(Vector_size(this->items) - 1, selected)); + this->selected = selected; +} + +void Panel_draw(Panel* this, bool focus) { + assert (this != NULL); + + int first, last; + int itemCount = Vector_size(this->items); + int scrollH = this->scrollH; + int y = this->y; int x = this->x; + first = this->scrollV; + + if (this->h > itemCount) { + last = this->scrollV + itemCount; + move(y + last, x + 0); + } else { + last = MIN(itemCount, this->scrollV + this->h); + } + if (this->selected < first) { + first = this->selected; + this->scrollV = first; + this->needsRedraw = true; + } + if (this->selected >= last) { + last = MIN(itemCount, this->selected + 1); + first = MAX(0, last - this->h); + this->scrollV = first; + this->needsRedraw = true; + } + assert(first >= 0); + assert(last <= itemCount); + + if (this->header.len > 0) { + int attr = focus + ? CRT_colors[PANEL_HEADER_FOCUS] + : CRT_colors[PANEL_HEADER_UNFOCUS]; + attrset(attr); + mvhline(y, x, ' ', this->w); + if (scrollH < this->header.len) { + mvaddchnstr(y, x, this->header.chstr + scrollH, + MIN(this->header.len - scrollH, this->w)); + } + attrset(CRT_colors[RESET_COLOR]); + y++; + } + + int highlight = focus + ? CRT_colors[PANEL_HIGHLIGHT_FOCUS] + : CRT_colors[PANEL_HIGHLIGHT_UNFOCUS]; + + if (this->needsRedraw) { + + for(int i = first, j = 0; j < this->h && i < last; i++, j++) { + Object* itemObj = Vector_get(this->items, i); + RichString itemRef; + RichString_initVal(itemRef); + itemObj->display(itemObj, &itemRef); + int amt = MIN(itemRef.len - scrollH, this->w); + if (i == this->selected) { + attrset(highlight); + RichString_setAttr(&itemRef, highlight); + mvhline(y + j, x+0, ' ', this->w); + if (amt > 0) + mvaddchnstr(y+j, x+0, itemRef.chstr + scrollH, amt); + attrset(CRT_colors[RESET_COLOR]); + } else { + mvhline(y+j, x+0, ' ', this->w); + if (amt > 0) + mvaddchnstr(y+j, x+0, itemRef.chstr + scrollH, amt); + } + } + for (int i = y + (last - first); i < y + this->h; i++) + mvhline(i, x+0, ' ', this->w); + this->needsRedraw = false; + + } else { + Object* oldObj = Vector_get(this->items, this->oldSelected); + RichString oldRef; + RichString_initVal(oldRef); + oldObj->display(oldObj, &oldRef); + Object* newObj = Vector_get(this->items, this->selected); + RichString newRef; + RichString_initVal(newRef); + newObj->display(newObj, &newRef); + mvhline(y+ this->oldSelected - this->scrollV, x+0, ' ', this->w); + if (scrollH < oldRef.len) + mvaddchnstr(y+ this->oldSelected - this->scrollV, x+0, oldRef.chstr + this->scrollH, MIN(oldRef.len - scrollH, this->w)); + attrset(highlight); + mvhline(y+this->selected - this->scrollV, x+0, ' ', this->w); + RichString_setAttr(&newRef, highlight); + if (scrollH < newRef.len) + mvaddchnstr(y+this->selected - this->scrollV, x+0, newRef.chstr + this->scrollH, MIN(newRef.len - scrollH, this->w)); + attrset(CRT_colors[RESET_COLOR]); + } + this->oldSelected = this->selected; + move(0, 0); +} + +void Panel_onKey(Panel* this, int key) { + assert (this != NULL); + switch (key) { + case KEY_DOWN: + if (this->selected + 1 < Vector_size(this->items)) + this->selected++; + break; + case KEY_UP: + if (this->selected > 0) + this->selected--; + break; + case KEY_LEFT: + if (this->scrollH > 0) { + this->scrollH -= this->scrollHAmount; + this->needsRedraw = true; + } + break; + case KEY_RIGHT: + this->scrollH += this->scrollHAmount; + this->needsRedraw = true; + break; + case KEY_PPAGE: + this->selected -= this->h; + if (this->selected < 0) + this->selected = 0; + break; + case KEY_NPAGE: + this->selected += this->h; + int size = Vector_size(this->items); + if (this->selected >= size) + this->selected = size - 1; + break; + case KEY_HOME: + this->selected = 0; + break; + case KEY_END: + this->selected = Vector_size(this->items) - 1; + break; + } +} diff --git a/Panel.h b/Panel.h new file mode 100644 index 0000000..512545b --- /dev/null +++ b/Panel.h @@ -0,0 +1,113 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_Panel +#define HEADER_Panel +/* +htop - Panel.h +(C) 2004-2006 Hisham H. Muhammad +Released under the GNU GPL, see the COPYING file +in the source distribution for its full text. +*/ + +#include "Object.h" +#include "Vector.h" +#include "CRT.h" +#include "RichString.h" +#include "ListItem.h" + +#include +#include + +#include "debug.h" +#include + +#include +//#link curses + + +typedef struct Panel_ Panel; + +typedef enum HandlerResult_ { + HANDLED, + IGNORED, + BREAK_LOOP +} HandlerResult; + +typedef HandlerResult(*Panel_EventHandler)(Panel*, int); + +struct Panel_ { + Object super; + int x, y, w, h; + WINDOW* window; + Vector* items; + int selected; + int scrollV, scrollH; + int scrollHAmount; + int oldSelected; + bool needsRedraw; + RichString header; + Panel_EventHandler eventHandler; +}; + + +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif +#ifndef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) +#endif + +#ifdef DEBUG +extern char* PANEL_CLASS; +#else +#define PANEL_CLASS NULL +#endif + + +Panel* Panel_new(int x, int y, int w, int h, char* type, bool owner, Object_Compare compare); + +void Panel_delete(Object* cast); + +void Panel_init(Panel* this, int x, int y, int w, int h, char* type, bool owner); + +void Panel_done(Panel* this); + +inline void Panel_setRichHeader(Panel* this, RichString header); + +inline void Panel_setHeader(Panel* this, char* header); + +void Panel_setEventHandler(Panel* this, Panel_EventHandler eh); + +void Panel_move(Panel* this, int x, int y); + +void Panel_resize(Panel* this, int w, int h); + +void Panel_prune(Panel* this); + +void Panel_add(Panel* this, Object* o); + +void Panel_insert(Panel* this, int i, Object* o); + +void Panel_set(Panel* this, int i, Object* o); + +Object* Panel_get(Panel* this, int i); + +Object* Panel_remove(Panel* this, int i); + +Object* Panel_getSelected(Panel* this); + +void Panel_moveSelectedUp(Panel* this); + +void Panel_moveSelectedDown(Panel* this); + +int Panel_getSelectedIndex(Panel* this); + +int Panel_getSize(Panel* this); + +void Panel_setSelected(Panel* this, int selected); + +void Panel_draw(Panel* this, bool focus); + +void Panel_onKey(Panel* this, int key); + +#endif diff --git a/Process.c b/Process.c index 0396151..50aac7c 100644 --- a/Process.c +++ b/Process.c @@ -31,7 +31,6 @@ in the source distribution for its full text. #define PAGE_SIZE ( sysconf(_SC_PAGESIZE) / 1024 ) #define PROCESS_COMM_LEN 300 -#define PROCESS_USER_LEN 10 /*{ @@ -62,16 +61,19 @@ typedef struct Process_ { int tty_nr; int tpgid; unsigned long int flags; + #ifdef DEBUG unsigned long int minflt; unsigned long int cminflt; unsigned long int majflt; unsigned long int cmajflt; + #endif unsigned long int utime; unsigned long int stime; long int cutime; long int cstime; long int priority; long int nice; + #ifdef DEBUG long int itrealvalue; unsigned long int starttime; unsigned long int vsize; @@ -89,6 +91,7 @@ typedef struct Process_ { unsigned long int wchan; unsigned long int nswap; unsigned long int cnswap; + #endif int exit_signal; int processor; int m_size; @@ -101,26 +104,27 @@ typedef struct Process_ { uid_t st_uid; float percent_cpu; float percent_mem; - char user[PROCESS_USER_LEN + 1]; + char* user; } Process; -extern char* PROCESS_CLASS; - -extern char* Process_fieldNames[]; - }*/ -/* private property */ +#ifdef DEBUG char* PROCESS_CLASS = "Process"; +#else +#define PROCESS_CLASS NULL +#endif + +char *Process_fieldNames[] = { + "", "PID", "Command", "STATE", "PPID", "PGRP", "SESSION", "TTY_NR", "TPGID", "FLAGS", "MINFLT", "CMINFLT", "MAJFLT", "CMAJFLT", "UTIME", "STIME", "CUTIME", "CSTIME", "PRIORITY", "NICE", "ITREALVALUE", "STARTTIME", "VSIZE", "RSS", "RLIM", "STARTCODE", "ENDCODE", "STARTSTACK", "KSTKESP", "KSTKEIP", "SIGNAL", "BLOCKED", "SIGIGNORE", "SIGCATCH", "WCHAN", "NSWAP", "CNSWAP", "EXIT_SIGNAL", "PROCESSOR", "M_SIZE", "M_RESIDENT", "M_SHARE", "M_TRS", "M_DRS", "M_LRS", "M_DT", "ST_UID", "PERCENT_CPU", "PERCENT_MEM", "USER", "TIME", "*** report bug! ***" +}; -/* private property */ -char *Process_fieldNames[] = { "", "PID", "Command", "STATE", "PPID", "PGRP", "SESSION", "TTY_NR", "TPGID", "FLAGS", "MINFLT", "CMINFLT", "MAJFLT", "CMAJFLT", "UTIME", "STIME", "CUTIME", "CSTIME", "PRIORITY", "NICE", "ITREALVALUE", "STARTTIME", "VSIZE", "RSS", "RLIM", "STARTCODE", "ENDCODE", "STARTSTACK", "KSTKESP", "KSTKEIP", "SIGNAL", "BLOCKED", "SIGIGNORE", "SIGCATCH", "WCHAN", "NSWAP", "CNSWAP", "EXIT_SIGNAL", "PROCESSOR", "M_SIZE", "M_RESIDENT", "M_SHARE", "M_TRS", "M_DRS", "M_LRS", "M_DT", "ST_UID", "PERCENT_CPU", "PERCENT_MEM", "USER", "TIME", "*** report bug! ***"}; +static int Process_getuid = -1; Process* Process_new(struct ProcessList_ *pl) { Process* this = malloc(sizeof(Process)); - ((Object*)this)->class = PROCESS_CLASS; + Object_setClass(this, PROCESS_CLASS); ((Object*)this)->display = Process_display; - ((Object*)this)->compare = Process_compare; ((Object*)this)->delete = Process_delete; this->pl = pl; this->tag = false; @@ -128,6 +132,7 @@ Process* Process_new(struct ProcessList_ *pl) { this->utime = 0; this->stime = 0; this->comm = NULL; + if (Process_getuid == -1) Process_getuid = getuid(); return this; } @@ -147,10 +152,10 @@ void Process_delete(Object* cast) { void Process_display(Object* cast, RichString* out) { Process* this = (Process*) cast; ProcessField* fields = this->pl->fields; - RichString_prune(out); + RichString_init(out); for (int i = 0; fields[i]; i++) Process_writeField(this, out, fields[i]); - if (this->pl->shadowOtherUsers && this->st_uid != getuid()) + if (this->pl->shadowOtherUsers && this->st_uid != Process_getuid) RichString_setAttr(out, CRT_colors[PROCESS_SHADOW]); if (this->tag == true) RichString_setAttr(out, CRT_colors[PROCESS_TAG]); @@ -177,8 +182,7 @@ void Process_sendSignal(Process* this, int signal) { #define ONE_M (ONE_K * ONE_K) #define ONE_G (ONE_M * ONE_K) -/* private */ -void Process_printLargeNumber(Process* this, RichString *str, unsigned int number) { +static void Process_printLargeNumber(Process* this, RichString *str, unsigned int number) { char buffer[11]; int len; if(number >= (1000 * ONE_M)) { @@ -202,10 +206,8 @@ void Process_printLargeNumber(Process* this, RichString *str, unsigned int numbe } } -/* private property */ -double jiffy = 0.0; +static double jiffy = 0.0; -/* private */ static void Process_printTime(RichString* str, unsigned long t) { if(jiffy == 0.0) jiffy = sysconf(_SC_CLK_TCK); double jiffytime = 1.0 / jiffy; @@ -228,8 +230,7 @@ static void Process_printTime(RichString* str, unsigned long t) { RichString_append(str, CRT_colors[DEFAULT_COLOR], buffer); } -/* private */ -inline static void Process_writeCommand(Process* this, int attr, RichString* str) { +static inline void Process_writeCommand(Process* this, int attr, RichString* str) { if (this->pl->highlightBaseName) { char* firstSpace = strchr(this->comm, ' '); if (firstSpace) { @@ -273,21 +274,21 @@ void Process_writeField(Process* this, RichString* str, ProcessField field) { for (int i = 0; i < 32; i++) if (this->indent & (1 << i)) maxIndent = i+1; - for (int i = 0; i < maxIndent - 1; i++) { + for (int i = 0; i < maxIndent - 1; i++) { if (this->indent & (1 << i)) snprintf(buf, n, " | "); else snprintf(buf, n, " "); buf += 4; n -= 4; - } + } if (this->pl->direction == 1) snprintf(buf, n, " `- "); else snprintf(buf, n, " ,- "); RichString_append(str, CRT_colors[PROCESS_TREE], buffer); Process_writeCommand(this, attr, str); - return; + return; } } case STATE: { @@ -316,9 +317,13 @@ void Process_writeField(Process* this, RichString* str, ProcessField field) { case M_SHARE: Process_printLargeNumber(this, str, this->m_share * PAGE_SIZE); return; case ST_UID: snprintf(buffer, n, "%4d ", this->st_uid); break; case USER: { - if (getuid() != this->st_uid) + if (Process_getuid != this->st_uid) attr = CRT_colors[PROCESS_SHADOW]; + if (this->user) { snprintf(buffer, n, "%-8s ", this->user); + } else { + snprintf(buffer, n, "%-8d ", this->st_uid); + } if (buffer[8] != '\0') { buffer[8] = ' '; buffer[9] = '\0'; @@ -353,44 +358,57 @@ void Process_writeField(Process* this, RichString* str, ProcessField field) { return; } -int Process_compare(const Object* v1, const Object* v2) { +int Process_pidCompare(const void* v1, const void* v2) { Process* p1 = (Process*)v1; Process* p2 = (Process*)v2; - int direction = p1->pl->direction; - switch (p1->pl->sortKey) { + return (p1->pid - p2->pid); +} + +int Process_compare(const void* v1, const void* v2) { + Process *p1, *p2; + ProcessList *pl = ((Process*)v1)->pl; + if (pl->direction == 1) { + p1 = (Process*)v1; + p2 = (Process*)v2; + } else { + p2 = (Process*)v1; + p1 = (Process*)v2; + } + switch (pl->sortKey) { case PID: - return (p2->pid - p1->pid) * direction; + return (p1->pid - p2->pid); case PPID: - return (p2->ppid - p1->ppid) * direction; + return (p1->ppid - p2->ppid); case USER: - return strcmp(p2->user, p1->user) * direction; + return strcmp(p1->user, p2->user); case PRIORITY: - return (p2->priority - p1->priority) * direction; + return (p1->priority - p2->priority); case STATE: - return (p2->state - p1->state) * direction; + return (p1->state - p2->state); case NICE: - return (p2->nice - p1->nice) * direction; + return (p1->nice - p2->nice); case M_SIZE: - return (p1->m_size - p2->m_size) * direction; + return (p2->m_size - p1->m_size); case M_RESIDENT: - return (p1->m_resident - p2->m_resident) * direction; + return (p2->m_resident - p1->m_resident); case M_SHARE: - return (p1->m_share - p2->m_share) * direction; + return (p2->m_share - p1->m_share); case PERCENT_CPU: - return (p1->percent_cpu < p2->percent_cpu ? -1 : 1) * direction; + return (p2->percent_cpu > p1->percent_cpu ? 1 : -1); case PERCENT_MEM: - return (p1->percent_mem < p2->percent_mem ? -1 : 1) * direction; + return (p2->m_resident - p1->m_resident); case UTIME: - return (p1->utime - p2->utime) * direction; + return (p2->utime - p1->utime); case STIME: - return (p1->stime - p2->stime) * direction; + return (p2->stime - p1->stime); case TIME: - return ((p1->utime+p1->stime) - (p2->utime+p2->stime)) * direction; + return ((p2->utime+p2->stime) - (p1->utime+p1->stime)); case COMM: - return strcmp(p2->comm, p1->comm) * direction; + return strcmp(p1->comm, p2->comm); default: - return (p2->pid - p1->pid) * direction; + return (p1->pid - p2->pid); } + } char* Process_printField(ProcessField field) { diff --git a/Process.h b/Process.h index f4f1b20..5c4c716 100644 --- a/Process.h +++ b/Process.h @@ -1,4 +1,4 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_Process #define HEADER_Process @@ -34,7 +34,6 @@ in the source distribution for its full text. #define PAGE_SIZE ( sysconf(_SC_PAGESIZE) / 1024 ) #define PROCESS_COMM_LEN 300 -#define PROCESS_USER_LEN 10 typedef enum ProcessField_ { @@ -64,16 +63,19 @@ typedef struct Process_ { int tty_nr; int tpgid; unsigned long int flags; + #ifdef DEBUG unsigned long int minflt; unsigned long int cminflt; unsigned long int majflt; unsigned long int cmajflt; + #endif unsigned long int utime; unsigned long int stime; long int cutime; long int cstime; long int priority; long int nice; + #ifdef DEBUG long int itrealvalue; unsigned long int starttime; unsigned long int vsize; @@ -91,6 +93,7 @@ typedef struct Process_ { unsigned long int wchan; unsigned long int nswap; unsigned long int cnswap; + #endif int exit_signal; int processor; int m_size; @@ -103,15 +106,17 @@ typedef struct Process_ { uid_t st_uid; float percent_cpu; float percent_mem; - char user[PROCESS_USER_LEN + 1]; + char* user; } Process; -extern char* PROCESS_CLASS; - -extern char* Process_fieldNames[]; - +#ifdef DEBUG +extern char* PROCESS_CLASS; +#else +#define PROCESS_CLASS NULL +#endif +extern char *Process_fieldNames[]; Process* Process_new(struct ProcessList_ *pl); @@ -133,7 +138,9 @@ void Process_sendSignal(Process* this, int signal); void Process_writeField(Process* this, RichString* str, ProcessField field); -int Process_compare(const Object* v1, const Object* v2); +int Process_pidCompare(const void* v1, const void* v2); + +int Process_compare(const void* v1, const void* v2); char* Process_printField(ProcessField field); diff --git a/ProcessList.c b/ProcessList.c index a2f1c99..87db785 100644 --- a/ProcessList.c +++ b/ProcessList.c @@ -12,9 +12,10 @@ in the source distribution for its full text. #include "ProcessList.h" #include "Process.h" -#include "TypedVector.h" +#include "Vector.h" #include "UsersTable.h" #include "Hashtable.h" +#include "String.h" #include #include @@ -48,16 +49,20 @@ in the source distribution for its full text. #endif #ifndef MAX_READ -#define MAX_READ 8192 +#define MAX_READ 2048 #endif }*/ /*{ +#ifdef DEBUG +typedef int(*vxscanf)(void*, const char*, va_list); +#endif + typedef struct ProcessList_ { - TypedVector* processes; - TypedVector* processes2; + Vector* processes; + Vector* processes2; Hashtable* processTable; Process* prototype; UsersTable* usersTable; @@ -66,26 +71,26 @@ typedef struct ProcessList_ { int totalTasks; int runningTasks; - long int* totalTime; - long int* userTime; - long int* systemTime; - long int* idleTime; - long int* niceTime; - long int* totalPeriod; - long int* userPeriod; - long int* systemPeriod; - long int* idlePeriod; - long int* nicePeriod; - - long int totalMem; - long int usedMem; - long int freeMem; - long int sharedMem; - long int buffersMem; - long int cachedMem; - long int totalSwap; - long int usedSwap; - long int freeSwap; + unsigned long long int* totalTime; + unsigned long long int* userTime; + unsigned long long int* systemTime; + unsigned long long int* idleTime; + unsigned long long int* niceTime; + unsigned long long int* totalPeriod; + unsigned long long int* userPeriod; + unsigned long long int* systemPeriod; + unsigned long long int* idlePeriod; + unsigned long long int* nicePeriod; + + unsigned long long int totalMem; + unsigned long long int usedMem; + unsigned long long int freeMem; + unsigned long long int sharedMem; + unsigned long long int buffersMem; + unsigned long long int cachedMem; + unsigned long long int totalSwap; + unsigned long long int usedSwap; + unsigned long long int freeSwap; ProcessField* fields; ProcessField sortKey; @@ -104,24 +109,18 @@ typedef struct ProcessList_ { } ProcessList; }*/ -/* private property */ -ProcessField defaultHeaders[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RESIDENT, M_SHARE, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 }; +static ProcessField defaultHeaders[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RESIDENT, M_SHARE, STATE, PERCENT_CPU, PERCENT_MEM, TIME, COMM, 0 }; #ifdef DEBUG -/* private property */ -typedef int(*vxscanf)(void*, const char*, va_list); - #define ProcessList_read(this, buffer, format, ...) ProcessList_xread(this, (vxscanf) vsscanf, buffer, format, ## __VA_ARGS__ ) #define ProcessList_fread(this, file, format, ...) ProcessList_xread(this, (vxscanf) vfscanf, file, format, ## __VA_ARGS__ ) -/* private */ -FILE* ProcessList_fopen(ProcessList* this, const char* path, const char* mode) { +static FILE* ProcessList_fopen(ProcessList* this, const char* path, const char* mode) { fprintf(this->traceFile, "[%s]\n", path); return fopen(path, mode); } -/* private */ static inline int ProcessList_xread(ProcessList* this, vxscanf fn, void* buffer, char* format, ...) { va_list ap; va_start(ap, format); @@ -130,7 +129,10 @@ static inline int ProcessList_xread(ProcessList* this, vxscanf fn, void* buffer, va_start(ap, format); while (*format) { char ch = *format; - char* c; int* d; long int* ld; unsigned long int* lu; char** s; + char* c; int* d; + long int* ld; unsigned long int* lu; + long long int* lld; unsigned long long int* llu; + char** s; if (ch != '%') { fprintf(this->traceFile, "%c", ch); format++; @@ -146,6 +148,12 @@ static inline int ProcessList_xread(ProcessList* this, vxscanf fn, void* buffer, switch (*format) { case 'd': ld = va_arg(ap, long int*); fprintf(this->traceFile, "%ld", *ld); break; case 'u': lu = va_arg(ap, unsigned long int*); fprintf(this->traceFile, "%lu", *lu); break; + case 'l': + format++; + switch (*format) { + case 'd': lld = va_arg(ap, long long int*); fprintf(this->traceFile, "%lld", *lld); break; + case 'u': llu = va_arg(ap, unsigned long long int*); fprintf(this->traceFile, "%llu", *llu); break; + } } } format++; @@ -168,13 +176,13 @@ static inline int ProcessList_xread(ProcessList* this, vxscanf fn, void* buffer, ProcessList* ProcessList_new(UsersTable* usersTable) { ProcessList* this; this = malloc(sizeof(ProcessList)); - this->processes = TypedVector_new(PROCESS_CLASS, true, DEFAULT_SIZE); - this->processTable = Hashtable_new(20, false); + this->processes = Vector_new(PROCESS_CLASS, true, DEFAULT_SIZE, Process_compare); + this->processTable = Hashtable_new(70, false); this->prototype = Process_new(this); this->usersTable = usersTable; /* tree-view auxiliary buffers */ - this->processes2 = TypedVector_new(PROCESS_CLASS, true, DEFAULT_SIZE); + this->processes2 = Vector_new(PROCESS_CLASS, true, DEFAULT_SIZE, Process_compare); #ifdef DEBUG this->traceFile = fopen("/tmp/htop-proc-trace", "w"); @@ -190,23 +198,23 @@ ProcessList* ProcessList_new(UsersTable* usersTable) { } while (String_startsWith(buffer, "cpu")); fclose(status); this->processorCount = procs - 1; - this->totalTime = calloc(procs, sizeof(long int)); - this->userTime = calloc(procs, sizeof(long int)); - this->systemTime = calloc(procs, sizeof(long int)); - this->niceTime = calloc(procs, sizeof(long int)); - this->idleTime = calloc(procs, sizeof(long int)); - this->totalPeriod = calloc(procs, sizeof(long int)); - this->userPeriod = calloc(procs, sizeof(long int)); - this->systemPeriod = calloc(procs, sizeof(long int)); - this->nicePeriod = calloc(procs, sizeof(long int)); - this->idlePeriod = calloc(procs, sizeof(long int)); + this->totalTime = calloc(procs, sizeof(long long int)); + this->userTime = calloc(procs, sizeof(long long int)); + this->systemTime = calloc(procs, sizeof(long long int)); + this->niceTime = calloc(procs, sizeof(long long int)); + this->idleTime = calloc(procs, sizeof(long long int)); + this->totalPeriod = calloc(procs, sizeof(long long int)); + this->userPeriod = calloc(procs, sizeof(long long int)); + this->systemPeriod = calloc(procs, sizeof(long long int)); + this->nicePeriod = calloc(procs, sizeof(long long int)); + this->idlePeriod = calloc(procs, sizeof(long long int)); for (int i = 0; i < procs; i++) { this->totalTime[i] = 1; this->totalPeriod[i] = 1; } this->fields = calloc(sizeof(ProcessField), LAST_PROCESSFIELD+1); - // TODO: turn 'fields' into a TypedVector, + // TODO: turn 'fields' into a Vector, // (and ProcessFields into proper objects). for (int i = 0; defaultHeaders[i]; i++) { this->fields[i] = defaultHeaders[i]; @@ -226,8 +234,8 @@ ProcessList* ProcessList_new(UsersTable* usersTable) { void ProcessList_delete(ProcessList* this) { Hashtable_delete(this->processTable); - TypedVector_delete(this->processes); - TypedVector_delete(this->processes2); + Vector_delete(this->processes); + Vector_delete(this->processes2); Process_delete((Object*)this->prototype); free(this->totalTime); @@ -257,7 +265,8 @@ void ProcessList_invertSortOrder(ProcessList* this) { } RichString ProcessList_printHeader(ProcessList* this) { - RichString out = RichString_new(); + RichString out; + RichString_init(&out); ProcessField* fields = this->fields; for (int i = 0; fields[i]; i++) { char* field = Process_printField(fields[i]); @@ -271,85 +280,80 @@ RichString ProcessList_printHeader(ProcessList* this) { void ProcessList_prune(ProcessList* this) { - TypedVector_prune(this->processes); + Vector_prune(this->processes); } void ProcessList_add(ProcessList* this, Process* p) { - TypedVector_add(this->processes, p); + Vector_add(this->processes, p); Hashtable_put(this->processTable, p->pid, p); } void ProcessList_remove(ProcessList* this, Process* p) { Hashtable_remove(this->processTable, p->pid); - ProcessField pf = this->sortKey; - this->sortKey = PID; - int index = TypedVector_indexOf(this->processes, p); - TypedVector_remove(this->processes, index); - this->sortKey = pf; + int index = Vector_indexOf(this->processes, p, Process_pidCompare); + Vector_remove(this->processes, index); } Process* ProcessList_get(ProcessList* this, int index) { - return (Process*) (TypedVector_get(this->processes, index)); + return (Process*) (Vector_get(this->processes, index)); } int ProcessList_size(ProcessList* this) { - return (TypedVector_size(this->processes)); + return (Vector_size(this->processes)); } -/* private */ -void ProcessList_buildTree(ProcessList* this, int pid, int level, int indent, int direction) { - TypedVector* children = TypedVector_new(PROCESS_CLASS, false, DEFAULT_SIZE); +static void ProcessList_buildTree(ProcessList* this, int pid, int level, int indent, int direction) { + Vector* children = Vector_new(PROCESS_CLASS, false, DEFAULT_SIZE, Process_compare); - for (int i = 0; i < TypedVector_size(this->processes); i++) { - Process* process = (Process*) (TypedVector_get(this->processes, i)); + for (int i = 0; i < Vector_size(this->processes); i++) { + Process* process = (Process*) (Vector_get(this->processes, i)); if (process->ppid == pid) { - Process* process = (Process*) (TypedVector_take(this->processes, i)); - TypedVector_add(children, process); + Process* process = (Process*) (Vector_take(this->processes, i)); + Vector_add(children, process); i--; } } - int size = TypedVector_size(children); + int size = Vector_size(children); for (int i = 0; i < size; i++) { - Process* process = (Process*) (TypedVector_get(children, i)); + Process* process = (Process*) (Vector_get(children, i)); if (direction == 1) - TypedVector_add(this->processes2, process); + Vector_add(this->processes2, process); else - TypedVector_insert(this->processes2, 0, process); + Vector_insert(this->processes2, 0, process); int nextIndent = indent; if (i < size - 1) nextIndent = indent | (1 << level); ProcessList_buildTree(this, process->pid, level+1, nextIndent, direction); process->indent = indent | (1 << level); } - TypedVector_delete(children); + Vector_delete(children); } void ProcessList_sort(ProcessList* this) { if (!this->treeView) { - TypedVector_sort(this->processes); + Vector_sort(this->processes); } else { int direction = this->direction; int sortKey = this->sortKey; this->sortKey = PID; this->direction = 1; - TypedVector_sort(this->processes); + Vector_sort(this->processes); this->sortKey = sortKey; this->direction = direction; - Process* init = (Process*) (TypedVector_take(this->processes, 0)); + Process* init = (Process*) (Vector_take(this->processes, 0)); assert(init->pid == 1); init->indent = 0; - TypedVector_add(this->processes2, init); + Vector_add(this->processes2, init); ProcessList_buildTree(this, init->pid, 0, 0, direction); - TypedVector* t = this->processes; + Vector* t = this->processes; this->processes = this->processes2; this->processes2 = t; } } -/* private */ -int ProcessList_readStatFile(ProcessList* this, Process *proc, FILE *f, char *command) { +static int ProcessList_readStatFile(ProcessList* this, Process *proc, FILE *f, char *command) { static char buf[MAX_READ]; - long int zero; + unsigned long int zero; int size = fread(buf, 1, MAX_READ, f); if(!size) return 0; @@ -367,6 +371,7 @@ int ProcessList_readStatFile(ProcessList* this, Process *proc, FILE *f, char *co command[commsize] = '\0'; location = end + 2; + #ifdef DEBUG int num = ProcessList_read(this, location, "%c %d %d %d %d %d %lu %lu %lu %lu " "%lu %lu %lu %ld %ld %ld %ld %ld %ld " @@ -374,14 +379,34 @@ int ProcessList_readStatFile(ProcessList* this, Process *proc, FILE *f, char *co "%lu %lu %lu %lu %lu %lu %lu %lu " "%d %d", &proc->state, &proc->ppid, &proc->pgrp, &proc->session, &proc->tty_nr, - &proc->tpgid, &proc->flags, &proc->minflt, &proc->cminflt, &proc->majflt, - &proc->cmajflt, &proc->utime, &proc->stime, &proc->cutime, &proc->cstime, + &proc->tpgid, &proc->flags, + &proc->minflt, &proc->cminflt, &proc->majflt, &proc->cmajflt, + &proc->utime, &proc->stime, &proc->cutime, &proc->cstime, &proc->priority, &proc->nice, &zero, &proc->itrealvalue, &proc->starttime, &proc->vsize, &proc->rss, &proc->rlim, &proc->startcode, &proc->endcode, &proc->startstack, &proc->kstkesp, &proc->kstkeip, &proc->signal, &proc->blocked, &proc->sigignore, &proc->sigcatch, &proc->wchan, &proc->nswap, &proc->cnswap, &proc->exit_signal, &proc->processor); + #else + long int uzero; + int num = ProcessList_read(this, location, + "%c %d %d %d %d %d %lu %lu %lu %lu " + "%lu %lu %lu %ld %ld %ld %ld %ld %ld " + "%lu %lu %ld %lu %lu %lu %lu %lu " + "%lu %lu %lu %lu %lu %lu %lu %lu " + "%d %d", + &proc->state, &proc->ppid, &proc->pgrp, &proc->session, &proc->tty_nr, + &proc->tpgid, &proc->flags, + &zero, &zero, &zero, &zero, + &proc->utime, &proc->stime, &proc->cutime, &proc->cstime, + &proc->priority, &proc->nice, &uzero, &uzero, + &zero, &zero, &uzero, &zero, + &zero, &zero, &zero, &zero, + &zero, &zero, &zero, &zero, + &zero, &zero, &zero, &zero, + &proc->exit_signal, &proc->processor); + #endif // This assert is always valid on 2.4, but reportedly not always valid on 2.6. // TODO: Check if the semantics of this field has changed. @@ -394,14 +419,15 @@ int ProcessList_readStatFile(ProcessList* this, Process *proc, FILE *f, char *co bool ProcessList_readStatusFile(ProcessList* this, Process* proc, char* dirname, char* name) { char statusfilename[MAX_NAME+1]; statusfilename[MAX_NAME] = '\0'; + /* + bool success = false; + char buffer[256]; + buffer[255] = '\0'; snprintf(statusfilename, MAX_NAME, "%s/%s/status", dirname, name); FILE* status = ProcessList_fopen(this, statusfilename, "r"); - bool success = false; if (status) { - char buffer[1024]; - buffer[1023] = '\0'; while (!feof(status)) { - char* ok = fgets(buffer, 1023, status); + char* ok = fgets(buffer, 255, status); if (!ok) break; if (String_startsWith(buffer, "Uid:")) { @@ -418,14 +444,18 @@ bool ProcessList_readStatusFile(ProcessList* this, Process* proc, char* dirname, fclose(status); } if (!success) { - snprintf(statusfilename, MAX_NAME, "%s/%s/stat", dirname, name); + */ + snprintf(statusfilename, MAX_NAME, "%s/%s", dirname, name); struct stat sstat; int statok = stat(statusfilename, &sstat); if (statok == -1) return false; proc->st_uid = sstat.st_uid; - } - return success; + return true; + /* + } else + return true; + */ } void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, float period) { @@ -466,24 +496,36 @@ void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, fl char command[PROCESS_COMM_LEN + 1]; Process* process; + Process* existingProcess = (Process*) Hashtable_get(this->processTable, pid); - if (!existingProcess) { - process = Process_clone(prototype); + if (existingProcess) { + process = existingProcess; + } else { + process = prototype; + process->comm = NULL; process->pid = pid; - ProcessList_add(this, process); if (! ProcessList_readStatusFile(this, process, dirname, name)) goto errorReadingProcess; - } else { - process = existingProcess; } process->updated = true; - char* username = UsersTable_getRef(this->usersTable, process->st_uid); - if (username) { - strncpy(process->user, username, PROCESS_USER_LEN); - } else { - snprintf(process->user, PROCESS_USER_LEN, "%d", process->st_uid); + snprintf(statusfilename, MAX_NAME, "%s/%s/statm", dirname, name); + status = ProcessList_fopen(this, statusfilename, "r"); + + if(!status) { + goto errorReadingProcess; } + int num = ProcessList_fread(this, status, "%d %d %d %d %d %d %d", + &process->m_size, &process->m_resident, &process->m_share, + &process->m_trs, &process->m_drs, &process->m_lrs, + &process->m_dt); + + fclose(status); + if(num != 7) + goto errorReadingProcess; + + if (this->hideKernelThreads && process->m_size == 0) + goto errorReadingProcess; int lasttimes = (process->utime + process->stime); @@ -495,14 +537,12 @@ void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, fl int success = ProcessList_readStatFile(this, process, status, command); fclose(status); - if(!success) { + if(!success) goto errorReadingProcess; - } - - process->percent_cpu = (process->utime + process->stime - lasttimes) / - period * 100.0; if(!existingProcess) { + process->user = UsersTable_getRef(this->usersTable, process->st_uid); + snprintf(statusfilename, MAX_NAME, "%s/%s/cmdline", dirname, name); status = ProcessList_fopen(this, statusfilename, "r"); if (!status) { @@ -521,20 +561,8 @@ void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, fl fclose(status); } - snprintf(statusfilename, MAX_NAME, "%s/%s/statm", dirname, name); - status = ProcessList_fopen(this, statusfilename, "r"); - - if(!status) { - goto errorReadingProcess; - } - int num = ProcessList_fread(this, status, "%d %d %d %d %d %d %d", - &process->m_size, &process->m_resident, &process->m_share, - &process->m_trs, &process->m_drs, &process->m_lrs, - &process->m_dt); - - fclose(status); - if(num != 7) - goto errorReadingProcess; + process->percent_cpu = (process->utime + process->stime - lasttimes) / + period * 100.0; process->percent_mem = process->m_resident / (float)(this->usedMem - this->cachedMem - this->buffersMem) * @@ -545,23 +573,31 @@ void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, fl this->runningTasks++; } - if (this->hideKernelThreads && process->m_size == 0) - ProcessList_remove(this, process); + if (!existingProcess) { + process = Process_clone(process); + ProcessList_add(this, process); + } continue; // Exception handler. errorReadingProcess: { - ProcessList_remove(this, process); + if (existingProcess) + ProcessList_remove(this, process); + else { + if (process->comm) + free(process->comm); + } } } } + prototype->comm = NULL; closedir(dir); } void ProcessList_scan(ProcessList* this) { - long int usertime, nicetime, systemtime, idletime, totaltime; - long int swapFree; + unsigned long long int usertime, nicetime, systemtime, idletime, totaltime; + unsigned long long int swapFree; FILE* status; char buffer[128]; @@ -573,25 +609,25 @@ void ProcessList_scan(ProcessList* this) { switch (buffer[0]) { case 'M': if (String_startsWith(buffer, "MemTotal:")) - ProcessList_read(this, buffer, "MemTotal: %ld kB", &this->totalMem); + ProcessList_read(this, buffer, "MemTotal: %llu kB", &this->totalMem); else if (String_startsWith(buffer, "MemFree:")) - ProcessList_read(this, buffer, "MemFree: %ld kB", &this->freeMem); + ProcessList_read(this, buffer, "MemFree: %llu kB", &this->freeMem); else if (String_startsWith(buffer, "MemShared:")) - ProcessList_read(this, buffer, "MemShared: %ld kB", &this->sharedMem); + ProcessList_read(this, buffer, "MemShared: %llu kB", &this->sharedMem); break; case 'B': if (String_startsWith(buffer, "Buffers:")) - ProcessList_read(this, buffer, "Buffers: %ld kB", &this->buffersMem); + ProcessList_read(this, buffer, "Buffers: %llu kB", &this->buffersMem); break; case 'C': if (String_startsWith(buffer, "Cached:")) - ProcessList_read(this, buffer, "Cached: %ld kB", &this->cachedMem); + ProcessList_read(this, buffer, "Cached: %llu kB", &this->cachedMem); break; case 'S': if (String_startsWith(buffer, "SwapTotal:")) - ProcessList_read(this, buffer, "SwapTotal: %ld kB", &this->totalSwap); + ProcessList_read(this, buffer, "SwapTotal: %llu kB", &this->totalSwap); if (String_startsWith(buffer, "SwapFree:")) - ProcessList_read(this, buffer, "SwapFree: %ld kB", &swapFree); + ProcessList_read(this, buffer, "SwapFree: %llu kB", &swapFree); break; } } @@ -606,16 +642,16 @@ void ProcessList_scan(ProcessList* this) { for (int i = 0; i <= this->processorCount; i++) { char buffer[256]; int cpuid; - long int ioWait, irq, softIrq, steal; + unsigned long long int ioWait, irq, softIrq, steal; ioWait = irq = softIrq = steal = 0; // Dependending on your kernel version, // 5, 7 or 8 of these fields will be set. // The rest will remain at zero. fgets(buffer, 255, status); if (i == 0) - ProcessList_read(this, buffer, "cpu %ld %ld %ld %ld %ld %ld %ld %ld", &usertime, &nicetime, &systemtime, &idletime, &ioWait, &irq, &softIrq, &steal); + ProcessList_read(this, buffer, "cpu %llu %llu %llu %llu %llu %llu %llu %llu", &usertime, &nicetime, &systemtime, &idletime, &ioWait, &irq, &softIrq, &steal); else { - ProcessList_read(this, buffer, "cpu%d %ld %ld %ld %ld %ld %ld %ld %ld", &cpuid, &usertime, &nicetime, &systemtime, &idletime, &ioWait, &irq, &softIrq, &steal); + ProcessList_read(this, buffer, "cpu%d %llu %llu %llu %llu %llu %llu %llu %llu", &cpuid, &usertime, &nicetime, &systemtime, &idletime, &ioWait, &irq, &softIrq, &steal); assert(cpuid == i - 1); } // Fields existing on kernels >= 2.6 @@ -642,21 +678,18 @@ void ProcessList_scan(ProcessList* this) { fclose(status); // mark all process as "dirty" - for (int i = 0; i < TypedVector_size(this->processes); i++) { - Process* p = (Process*) TypedVector_get(this->processes, i); + for (int i = 0; i < Vector_size(this->processes); i++) { + Process* p = (Process*) Vector_get(this->processes, i); p->updated = false; } this->totalTasks = 0; this->runningTasks = 0; - signal(11, ProcessList_dontCrash); - ProcessList_processEntries(this, PROCDIR, 0, period); - signal(11, SIG_DFL); - for (int i = TypedVector_size(this->processes) - 1; i >= 0; i--) { - Process* p = (Process*) TypedVector_get(this->processes, i); + for (int i = Vector_size(this->processes) - 1; i >= 0; i--) { + Process* p = (Process*) Vector_get(this->processes, i); if (p->updated == false) ProcessList_remove(this, p); else @@ -664,9 +697,3 @@ void ProcessList_scan(ProcessList* this) { } } - -void ProcessList_dontCrash(int signal) { - // This ugly hack was added because I suspect some - // crashes were caused by contents of /proc vanishing - // away while we read them. -} diff --git a/ProcessList.h b/ProcessList.h index 23d28f2..b38cefc 100644 --- a/ProcessList.h +++ b/ProcessList.h @@ -3,7 +3,7 @@ #ifndef HEADER_ProcessList #define HEADER_ProcessList /* -htop - ProcessList.c +htop - ProcessList.h (C) 2004,2005 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. @@ -15,9 +15,10 @@ in the source distribution for its full text. #endif #include "Process.h" -#include "TypedVector.h" +#include "Vector.h" #include "UsersTable.h" #include "Hashtable.h" +#include "String.h" #include #include @@ -50,14 +51,18 @@ in the source distribution for its full text. #endif #ifndef MAX_READ -#define MAX_READ 8192 +#define MAX_READ 2048 #endif +#ifdef DEBUG +typedef int(*vxscanf)(void*, const char*, va_list); +#endif + typedef struct ProcessList_ { - TypedVector* processes; - TypedVector* processes2; + Vector* processes; + Vector* processes2; Hashtable* processTable; Process* prototype; UsersTable* usersTable; @@ -66,26 +71,26 @@ typedef struct ProcessList_ { int totalTasks; int runningTasks; - long int* totalTime; - long int* userTime; - long int* systemTime; - long int* idleTime; - long int* niceTime; - long int* totalPeriod; - long int* userPeriod; - long int* systemPeriod; - long int* idlePeriod; - long int* nicePeriod; - - long int totalMem; - long int usedMem; - long int freeMem; - long int sharedMem; - long int buffersMem; - long int cachedMem; - long int totalSwap; - long int usedSwap; - long int freeSwap; + unsigned long long int* totalTime; + unsigned long long int* userTime; + unsigned long long int* systemTime; + unsigned long long int* idleTime; + unsigned long long int* niceTime; + unsigned long long int* totalPeriod; + unsigned long long int* userPeriod; + unsigned long long int* systemPeriod; + unsigned long long int* idlePeriod; + unsigned long long int* nicePeriod; + + unsigned long long int totalMem; + unsigned long long int usedMem; + unsigned long long int freeMem; + unsigned long long int sharedMem; + unsigned long long int buffersMem; + unsigned long long int cachedMem; + unsigned long long int totalSwap; + unsigned long long int usedSwap; + unsigned long long int freeSwap; ProcessField* fields; ProcessField sortKey; @@ -103,15 +108,11 @@ typedef struct ProcessList_ { } ProcessList; - #ifdef DEBUG - #define ProcessList_read(this, buffer, format, ...) ProcessList_xread(this, (vxscanf) vsscanf, buffer, format, ## __VA_ARGS__ ) #define ProcessList_fread(this, file, format, ...) ProcessList_xread(this, (vxscanf) vfscanf, file, format, ## __VA_ARGS__ ) - - #else #ifndef ProcessList_read @@ -141,16 +142,12 @@ Process* ProcessList_get(ProcessList* this, int index); int ProcessList_size(ProcessList* this); - void ProcessList_sort(ProcessList* this); - bool ProcessList_readStatusFile(ProcessList* this, Process* proc, char* dirname, char* name); void ProcessList_processEntries(ProcessList* this, char* dirname, int parent, float period); void ProcessList_scan(ProcessList* this); -void ProcessList_dontCrash(int signal); - #endif diff --git a/README b/README index 3857327..965ec8e 100644 --- a/README +++ b/README @@ -2,13 +2,15 @@ htop by Hisham Muhammad -May, 2004 - March, 2006 +May, 2004 - July, 2006 Introduction ~~~~~~~~~~~~ This is htop, an interactive process viewer. -It requires ncurses. Tested with Linux 2.4 and 2.6. +It requires ncurses. It is tested with Linux 2.6, +but is also reported to work (and was originally developed) +with the 2.4 series. Note that, while, htop is Linux specific -- it is based on the Linux /proc filesystem -- it is also reported to work diff --git a/RichString.c b/RichString.c index 7a92e08..3bdc82b 100644 --- a/RichString.c +++ b/RichString.c @@ -12,6 +12,9 @@ /*{ +#define RichString_init(this) (this)->len = 0 +#define RichString_initVal(this) (this).len = 0 + typedef struct RichString_ { int len; chtype chstr[RICHSTRING_MAXLEN+1]; @@ -23,24 +26,8 @@ typedef struct RichString_ { #define MIN(a,b) ((a)<(b)?(a):(b)) #endif -/* private property */ -WINDOW* workArea = NULL; - -RichString RichString_new() { - RichString this; - this.len = 0; - return this; -} - -void RichString_delete(RichString this) { -} - -void RichString_prune(RichString* this) { - this->len = 0; -} - void RichString_write(RichString* this, int attrs, char* data) { - this->len = 0; + RichString_init(this); RichString_append(this, attrs, data); } @@ -49,35 +36,32 @@ inline void RichString_append(RichString* this, int attrs, char* data) { } inline void RichString_appendn(RichString* this, int attrs, char* data, int len) { - if (!workArea) { - workArea = newpad(1, RICHSTRING_MAXLEN); - } - assert(workArea); - wattrset(workArea, attrs); - int maxToWrite = (RICHSTRING_MAXLEN - 1) - this->len; - int wrote = MIN(maxToWrite, len); - mvwaddnstr(workArea, 0, 0, data, maxToWrite); - int oldstrlen = this->len; - this->len += wrote; - mvwinchnstr(workArea, 0, 0, this->chstr + oldstrlen, wrote); - wattroff(workArea, attrs); + int last = MIN(RICHSTRING_MAXLEN - 1, len + this->len); + for (int i = this->len, j = 0; i < last; i++, j++) + this->chstr[i] = data[j] | attrs; + this->chstr[last] = 0; + this->len = last; } void RichString_setAttr(RichString *this, int attrs) { + chtype* ch = this->chstr; for (int i = 0; i < this->len; i++) { - char c = this->chstr[i]; - this->chstr[i] = c | attrs; + *ch = (*ch & 0xff) | attrs; + ch++; } } void RichString_applyAttr(RichString *this, int attrs) { - for (int i = 0; i < this->len - 1; i++) { - this->chstr[i] |= attrs; + chtype* ch = this->chstr; + for (int i = 0; i < this->len; i++) { + *ch |= attrs; + ch++; } } RichString RichString_quickString(int attrs, char* data) { - RichString str = RichString_new(); + RichString str; + RichString_initVal(str); RichString_write(&str, attrs, data); return str; } diff --git a/RichString.h b/RichString.h index f59c576..1f48678 100644 --- a/RichString.h +++ b/RichString.h @@ -1,4 +1,4 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_RichString #define HEADER_RichString @@ -7,7 +7,6 @@ #include #include #include -#include #include "debug.h" #include @@ -15,18 +14,18 @@ #define RICHSTRING_MAXLEN 300 +#define RichString_init(this) (this)->len = 0 +#define RichString_initVal(this) (this).len = 0 + typedef struct RichString_ { int len; chtype chstr[RICHSTRING_MAXLEN+1]; } RichString; - -RichString RichString_new(); - -void RichString_delete(RichString this); - -void RichString_prune(RichString* this); +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif void RichString_write(RichString* this, int attrs, char* data); diff --git a/ScreenManager.c b/ScreenManager.c index 28009ca..8e88e28 100644 --- a/ScreenManager.c +++ b/ScreenManager.c @@ -6,9 +6,9 @@ in the source distribution for its full text. */ #include "ScreenManager.h" -#include "ListBox.h" +#include "Panel.h" #include "Object.h" -#include "TypedVector.h" +#include "Vector.h" #include "FunctionBar.h" #include "debug.h" @@ -29,8 +29,8 @@ typedef struct ScreenManager_ { int x2; int y2; Orientation orientation; - TypedVector* items; - TypedVector* fuBars; + Vector* items; + Vector* fuBars; int itemCount; FunctionBar* fuBar; bool owner; @@ -47,16 +47,16 @@ ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation ori this->y2 = y2; this->fuBar = NULL; this->orientation = orientation; - this->items = TypedVector_new(LISTBOX_CLASS, owner, DEFAULT_SIZE); - this->fuBars = TypedVector_new(FUNCTIONBAR_CLASS, true, DEFAULT_SIZE); + this->items = Vector_new(PANEL_CLASS, owner, DEFAULT_SIZE, NULL); + this->fuBars = Vector_new(FUNCTIONBAR_CLASS, true, DEFAULT_SIZE, NULL); this->itemCount = 0; this->owner = owner; return this; } void ScreenManager_delete(ScreenManager* this) { - TypedVector_delete(this->items); - TypedVector_delete(this->fuBars); + Vector_delete(this->items); + Vector_delete(this->fuBars); free(this); } @@ -64,38 +64,38 @@ inline int ScreenManager_size(ScreenManager* this) { return this->itemCount; } -void ScreenManager_add(ScreenManager* this, ListBox* item, FunctionBar* fuBar, int size) { +void ScreenManager_add(ScreenManager* this, Panel* item, FunctionBar* fuBar, int size) { if (this->orientation == HORIZONTAL) { int lastX = 0; if (this->itemCount > 0) { - ListBox* last = (ListBox*) TypedVector_get(this->items, this->itemCount - 1); + Panel* last = (Panel*) Vector_get(this->items, this->itemCount - 1); lastX = last->x + last->w + 1; } if (size > 0) { - ListBox_resize(item, size, LINES-this->y1+this->y2); + Panel_resize(item, size, LINES-this->y1+this->y2); } else { - ListBox_resize(item, COLS-this->x1+this->x2-lastX, LINES-this->y1+this->y2); + Panel_resize(item, COLS-this->x1+this->x2-lastX, LINES-this->y1+this->y2); } - ListBox_move(item, lastX, this->y1); + Panel_move(item, lastX, this->y1); } // TODO: VERTICAL - TypedVector_add(this->items, item); + Vector_add(this->items, item); if (fuBar) - TypedVector_add(this->fuBars, fuBar); + Vector_add(this->fuBars, fuBar); else - TypedVector_add(this->fuBars, FunctionBar_new(0, NULL, NULL, NULL)); + Vector_add(this->fuBars, FunctionBar_new(0, NULL, NULL, NULL)); if (!this->fuBar && fuBar) this->fuBar = fuBar; item->needsRedraw = true; this->itemCount++; } -ListBox* ScreenManager_remove(ScreenManager* this, int index) { +Panel* ScreenManager_remove(ScreenManager* this, int index) { assert(this->itemCount > index); - ListBox* lb = (ListBox*) TypedVector_remove(this->items, index); - TypedVector_remove(this->fuBars, index); + Panel* panel = (Panel*) Vector_remove(this->items, index); + Vector_remove(this->fuBars, index); this->fuBar = NULL; this->itemCount--; - return lb; + return panel; } void ScreenManager_setFunctionBar(ScreenManager* this, FunctionBar* fuBar) { @@ -112,37 +112,37 @@ void ScreenManager_resize(ScreenManager* this, int x1, int y1, int x2, int y2) { int items = this->itemCount; int lastX = 0; for (int i = 0; i < items - 1; i++) { - ListBox* lb = (ListBox*) TypedVector_get(this->items, i); - ListBox_resize(lb, lb->w, LINES-y1+y2); - ListBox_move(lb, lastX, y1); - lastX = lb->x + lb->w + 1; + Panel* panel = (Panel*) Vector_get(this->items, i); + Panel_resize(panel, panel->w, LINES-y1+y2); + Panel_move(panel, lastX, y1); + lastX = panel->x + panel->w + 1; } - ListBox* lb = (ListBox*) TypedVector_get(this->items, items-1); - ListBox_resize(lb, COLS-x1+x2-lastX, LINES-y1+y2); - ListBox_move(lb, lastX, y1); + Panel* panel = (Panel*) Vector_get(this->items, items-1); + Panel_resize(panel, COLS-x1+x2-lastX, LINES-y1+y2); + Panel_move(panel, lastX, y1); } -void ScreenManager_run(ScreenManager* this, ListBox** lastFocus, int* lastKey) { +void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { bool quit = false; int focus = 0; - ListBox* lbFocus = (ListBox*) TypedVector_get(this->items, focus); + Panel* panelFocus = (Panel*) Vector_get(this->items, focus); if (this->fuBar) FunctionBar_draw(this->fuBar, NULL); - int ch; + int ch = 0; while (!quit) { int items = this->itemCount; for (int i = 0; i < items; i++) { - ListBox* lb = (ListBox*) TypedVector_get(this->items, i); - ListBox_draw(lb, i == focus); + Panel* panel = (Panel*) Vector_get(this->items, i); + Panel_draw(panel, i == focus); if (i < items) { if (this->orientation == HORIZONTAL) { - mvvline(lb->y, lb->x+lb->w, ' ', lb->h+1); + mvvline(panel->y, panel->x+panel->w, ' ', panel->h+1); } } } - FunctionBar* bar = (FunctionBar*) TypedVector_get(this->fuBars, focus); + FunctionBar* bar = (FunctionBar*) Vector_get(this->fuBars, focus); if (bar) this->fuBar = bar; if (this->fuBar) @@ -159,12 +159,12 @@ void ScreenManager_run(ScreenManager* this, ListBox** lastFocus, int* lastKey) { ch = FunctionBar_synthesizeEvent(this->fuBar, mevent.x); } else { for (int i = 0; i < this->itemCount; i++) { - ListBox* lb = (ListBox*) TypedVector_get(this->items, i); - if (mevent.x > lb->x && mevent.x <= lb->x+lb->w && - mevent.y > lb->y && mevent.y <= lb->y+lb->h) { + Panel* panel = (Panel*) Vector_get(this->items, i); + if (mevent.x > panel->x && mevent.x <= panel->x+panel->w && + mevent.y > panel->y && mevent.y <= panel->y+panel->h) { focus = i; - lbFocus = lb; - ListBox_setSelected(lb, mevent.y - lb->y + lb->scrollV - 1); + panelFocus = panel; + Panel_setSelected(panel, mevent.y - panel->y + panel->scrollV - 1); loop = true; break; } @@ -174,8 +174,8 @@ void ScreenManager_run(ScreenManager* this, ListBox** lastFocus, int* lastKey) { } if (loop) continue; - if (lbFocus->eventHandler) { - HandlerResult result = lbFocus->eventHandler(lbFocus, ch); + if (panelFocus->eventHandler) { + HandlerResult result = panelFocus->eventHandler(panelFocus, ch); if (result == HANDLED) { continue; } else if (result == BREAK_LOOP) { @@ -196,8 +196,8 @@ void ScreenManager_run(ScreenManager* this, ListBox** lastFocus, int* lastKey) { tryLeft: if (focus > 0) focus--; - lbFocus = (ListBox*) TypedVector_get(this->items, focus); - if (ListBox_getSize(lbFocus) == 0 && focus > 0) + panelFocus = (Panel*) Vector_get(this->items, focus); + if (Panel_getSize(panelFocus) == 0 && focus > 0) goto tryLeft; break; case KEY_RIGHT: @@ -205,8 +205,8 @@ void ScreenManager_run(ScreenManager* this, ListBox** lastFocus, int* lastKey) { tryRight: if (focus < this->itemCount - 1) focus++; - lbFocus = (ListBox*) TypedVector_get(this->items, focus); - if (ListBox_getSize(lbFocus) == 0 && focus < this->itemCount - 1) + panelFocus = (Panel*) Vector_get(this->items, focus); + if (Panel_getSize(panelFocus) == 0 && focus < this->itemCount - 1) goto tryRight; break; case KEY_F(10): @@ -215,11 +215,11 @@ void ScreenManager_run(ScreenManager* this, ListBox** lastFocus, int* lastKey) { quit = true; continue; default: - ListBox_onKey(lbFocus, ch); + Panel_onKey(panelFocus, ch); break; } } - *lastFocus = lbFocus; + *lastFocus = panelFocus; *lastKey = ch; } diff --git a/ScreenManager.h b/ScreenManager.h index b89d802..416164c 100644 --- a/ScreenManager.h +++ b/ScreenManager.h @@ -1,4 +1,4 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_ScreenManager #define HEADER_ScreenManager @@ -9,9 +9,9 @@ Released under the GNU GPL, see the COPYING file in the source distribution for its full text. */ -#include "ListBox.h" +#include "Panel.h" #include "Object.h" -#include "TypedVector.h" +#include "Vector.h" #include "FunctionBar.h" #include "debug.h" @@ -31,10 +31,10 @@ typedef struct ScreenManager_ { int x2; int y2; Orientation orientation; - TypedVector* items; + Vector* items; + Vector* fuBars; int itemCount; FunctionBar* fuBar; - TypedVector* fuBars; bool owner; } ScreenManager; @@ -45,14 +45,14 @@ void ScreenManager_delete(ScreenManager* this); inline int ScreenManager_size(ScreenManager* this); -void ScreenManager_add(ScreenManager* this, ListBox* item, FunctionBar* fuBar, int size); +void ScreenManager_add(ScreenManager* this, Panel* item, FunctionBar* fuBar, int size); -ListBox* ScreenManager_remove(ScreenManager* this, int index); +Panel* ScreenManager_remove(ScreenManager* this, int index); void ScreenManager_setFunctionBar(ScreenManager* this, FunctionBar* fuBar); void ScreenManager_resize(ScreenManager* this, int x1, int y1, int x2, int y2); -void ScreenManager_run(ScreenManager* this, ListBox** lastFocus, int* lastKey); +void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey); #endif diff --git a/Settings.c b/Settings.c index 91a833e..ca07389 100644 --- a/Settings.c +++ b/Settings.c @@ -65,8 +65,7 @@ void Settings_delete(Settings* this) { free(this); } -/* private */ -void Settings_readMeters(Settings* this, char* line, HeaderSide side) { +static void Settings_readMeters(Settings* this, char* line, HeaderSide side) { char* trim = String_trim(line); char** ids = String_split(trim, ' '); free(trim); @@ -77,8 +76,7 @@ void Settings_readMeters(Settings* this, char* line, HeaderSide side) { String_freeArray(ids); } -/* private */ -void Settings_readMeterModes(Settings* this, char* line, HeaderSide side) { +static void Settings_readMeterModes(Settings* this, char* line, HeaderSide side) { char* trim = String_trim(line); char** ids = String_split(trim, ' '); free(trim); diff --git a/Settings.h b/Settings.h index 66795e9..8c67d29 100644 --- a/Settings.h +++ b/Settings.h @@ -3,7 +3,7 @@ #ifndef HEADER_Settings #define HEADER_Settings /* -htop - Settings.c +htop - Settings.h (C) 2004-2006 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. @@ -32,8 +32,6 @@ Settings* Settings_new(ProcessList* pl, Header* header); void Settings_delete(Settings* this); - - bool Settings_read(Settings* this, char* fileName); bool Settings_write(Settings* this); diff --git a/SignalItem.c b/SignalItem.c index 5a39d3b..81f564d 100644 --- a/SignalItem.c +++ b/SignalItem.c @@ -23,15 +23,17 @@ typedef struct Signal_ { int number; } Signal; -extern char* SIGNAL_CLASS; }*/ -/* private property */ +#ifdef DEBUG char* SIGNAL_CLASS = "Signal"; +#else +#define SIGNAL_CLASS NULL +#endif Signal* Signal_new(char* name, int number) { Signal* this = malloc(sizeof(Signal)); - ((Object*)this)->class = SIGNAL_CLASS; + Object_setClass(this, SIGNAL_CLASS); ((Object*)this)->display = Signal_display; ((Object*)this)->delete = Signal_delete; this->name = name; diff --git a/SignalItem.h b/SignalItem.h index 071d8d8..c60dfa4 100644 --- a/SignalItem.h +++ b/SignalItem.h @@ -1,9 +1,9 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ -#ifndef HEADER_Signal -#define HEADER_Signal +#ifndef HEADER_SignalItem +#define HEADER_SignalItem /* -htop +htop - SignalItem.h (C) 2004-2006 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. @@ -25,8 +25,12 @@ typedef struct Signal_ { int number; } Signal; -extern char* SIGNAL_CLASS; +#ifdef DEBUG +extern char* SIGNAL_CLASS; +#else +#define SIGNAL_CLASS NULL +#endif Signal* Signal_new(char* name, int number); diff --git a/SignalsListBox.c b/SignalsListBox.c deleted file mode 100644 index 94442be..0000000 --- a/SignalsListBox.c +++ /dev/null @@ -1,77 +0,0 @@ - -#include "SignalsListBox.h" -#include "ListBox.h" -#include "SignalItem.h" -#include "RichString.h" - -#include "debug.h" -#include - -#include - -/*{ - -typedef struct SignalsListBox_ { - ListBox super; - - int state; - Signal** signals; -} SignalsListBox; - -}*/ - -SignalsListBox* SignalsListBox_new(int x, int y, int w, int h) { - SignalsListBox* this = (SignalsListBox*) malloc(sizeof(SignalsListBox)); - ListBox* super = (ListBox*) this; - ListBox_init(super, x, y, w, h, SIGNAL_CLASS, true); - ((Object*)this)->delete = SignalsListBox_delete; - - this->signals = Signal_getSignalTable(); - super->eventHandler = SignalsListBox_EventHandler; - int sigCount = Signal_getSignalCount(); - for(int i = 0; i < sigCount; i++) - ListBox_set(super, i, (Object*) this->signals[i]); - SignalsListBox_reset(this); - return this; -} - -void SignalsListBox_delete(Object* object) { - ListBox* super = (ListBox*) object; - SignalsListBox* this = (SignalsListBox*) object; - ListBox_done(super); - free(this->signals); - free(this); -} - -void SignalsListBox_reset(SignalsListBox* this) { - ListBox* super = (ListBox*) this; - - ListBox_setHeader(super, "Send signal:"); - ListBox_setSelected(super, 16); // 16th item is SIGTERM - this->state = 0; -} - -HandlerResult SignalsListBox_EventHandler(ListBox* super, int ch) { - SignalsListBox* this = (SignalsListBox*) super; - - int size = ListBox_getSize(super); - - if (ch <= 255 && isdigit(ch)) { - int signal = ch-48 + this->state; - for (int i = 0; i < size; i++) - if (((Signal*) ListBox_get(super, i))->number == signal) { - ListBox_setSelected(super, i); - break; - } - this->state = signal * 10; - if (this->state > 100) - this->state = 0; - return HANDLED; - } else { - this->state = 0; - } - if (ch == 13) { - return BREAK_LOOP; - } - return IGNORED; -} diff --git a/SignalsListBox.h b/SignalsListBox.h deleted file mode 100644 index f7f0b0c..0000000 --- a/SignalsListBox.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Do not edit this file. It was automatically genarated. */ - -#ifndef HEADER_SignalsListBox -#define HEADER_SignalsListBox - -#include "ListBox.h" -#include "SignalItem.h" -#include "RichString.h" - -#include "debug.h" -#include - -#include - - -typedef struct SignalsListBox_ { - ListBox super; - - int state; - Signal** signals; -} SignalsListBox; - - -SignalsListBox* SignalsListBox_new(int x, int y, int w, int h); - -void SignalsListBox_delete(Object* object); - -void SignalsListBox_reset(SignalsListBox* this); - -HandlerResult SignalsListBox_EventHandler(ListBox* super, int ch); - -#endif diff --git a/SignalsPanel.c b/SignalsPanel.c new file mode 100644 index 0000000..cb9382e --- /dev/null +++ b/SignalsPanel.c @@ -0,0 +1,77 @@ + +#include "SignalsPanel.h" +#include "Panel.h" +#include "SignalItem.h" +#include "RichString.h" + +#include "debug.h" +#include + +#include + +/*{ + +typedef struct SignalsPanel_ { + Panel super; + + int state; + Signal** signals; +} SignalsPanel; + +}*/ + +SignalsPanel* SignalsPanel_new(int x, int y, int w, int h) { + SignalsPanel* this = (SignalsPanel*) malloc(sizeof(SignalsPanel)); + Panel* super = (Panel*) this; + Panel_init(super, x, y, w, h, SIGNAL_CLASS, true); + ((Object*)this)->delete = SignalsPanel_delete; + + this->signals = Signal_getSignalTable(); + super->eventHandler = SignalsPanel_EventHandler; + int sigCount = Signal_getSignalCount(); + for(int i = 0; i < sigCount; i++) + Panel_set(super, i, (Object*) this->signals[i]); + SignalsPanel_reset(this); + return this; +} + +void SignalsPanel_delete(Object* object) { + Panel* super = (Panel*) object; + SignalsPanel* this = (SignalsPanel*) object; + Panel_done(super); + free(this->signals); + free(this); +} + +void SignalsPanel_reset(SignalsPanel* this) { + Panel* super = (Panel*) this; + + Panel_setHeader(super, "Send signal:"); + Panel_setSelected(super, 16); // 16th item is SIGTERM + this->state = 0; +} + +HandlerResult SignalsPanel_EventHandler(Panel* super, int ch) { + SignalsPanel* this = (SignalsPanel*) super; + + int size = Panel_getSize(super); + + if (ch <= 255 && isdigit(ch)) { + int signal = ch-48 + this->state; + for (int i = 0; i < size; i++) + if (((Signal*) Panel_get(super, i))->number == signal) { + Panel_setSelected(super, i); + break; + } + this->state = signal * 10; + if (this->state > 100) + this->state = 0; + return HANDLED; + } else { + this->state = 0; + } + if (ch == 13) { + return BREAK_LOOP; + } + return IGNORED; +} diff --git a/SignalsPanel.h b/SignalsPanel.h new file mode 100644 index 0000000..d34a994 --- /dev/null +++ b/SignalsPanel.h @@ -0,0 +1,32 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_SignalsPanel +#define HEADER_SignalsPanel + +#include "Panel.h" +#include "SignalItem.h" +#include "RichString.h" + +#include "debug.h" +#include + +#include + + +typedef struct SignalsPanel_ { + Panel super; + + int state; + Signal** signals; +} SignalsPanel; + + +SignalsPanel* SignalsPanel_new(int x, int y, int w, int h); + +void SignalsPanel_delete(Object* object); + +void SignalsPanel_reset(SignalsPanel* this); + +HandlerResult SignalsPanel_EventHandler(Panel* super, int ch); + +#endif diff --git a/String.c b/String.c index 00cd4f2..e862bff 100644 --- a/String.c +++ b/String.c @@ -14,6 +14,10 @@ in the source distribution for its full text. #include "debug.h" +/*{ +#define String_startsWith(s, match) (strstr((s), (match)) == (s)) +}*/ + inline void String_delete(char* s) { free(s); } @@ -102,10 +106,6 @@ inline int String_eq(char* s1, char* s2) { return (strcmp(s1, s2) == 0); } -inline int String_startsWith(char* s, char* match) { - return (strstr(s, match) == s); -} - char** String_split(char* s, char sep) { const int rate = 10; char** out = (char**) malloc(sizeof(char*) * rate); diff --git a/String.h b/String.h index f096db1..3a348c2 100644 --- a/String.h +++ b/String.h @@ -1,4 +1,4 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_String #define HEADER_String @@ -17,6 +17,8 @@ in the source distribution for its full text. #include "debug.h" +#define String_startsWith(s, match) (strstr((s), (match)) == (s)) + inline void String_delete(char* s); inline char* String_copy(char* orig); @@ -39,8 +41,6 @@ void String_printPointer(void* p); inline int String_eq(char* s1, char* s2); -inline int String_startsWith(char* s, char* match); - char** String_split(char* s, char sep); void String_freeArray(char** s); diff --git a/SwapMeter.c b/SwapMeter.c index 7b295e9..e7f827b 100644 --- a/SwapMeter.c +++ b/SwapMeter.c @@ -19,10 +19,10 @@ in the source distribution for its full text. #include "debug.h" #include -/* private property */ -static int SwapMeter_attributes[] = { SWAP }; +int SwapMeter_attributes[] = { + SWAP +}; -/* private */ MeterType SwapMeter = { .setValues = SwapMeter_setValues, .display = SwapMeter_display, @@ -46,7 +46,7 @@ void SwapMeter_display(Object* cast, RichString* out) { char buffer[50]; Meter* this = (Meter*)cast; long int swap = (long int) this->values[0]; - RichString_prune(out); + RichString_init(out); RichString_append(out, CRT_colors[METER_TEXT], ":"); sprintf(buffer, "%ldM ", (long int) this->total / 1024); RichString_append(out, CRT_colors[METER_VALUE], buffer); diff --git a/SwapMeter.h b/SwapMeter.h index f9be990..f2b8fb1 100644 --- a/SwapMeter.h +++ b/SwapMeter.h @@ -22,7 +22,9 @@ in the source distribution for its full text. #include "debug.h" #include +extern int SwapMeter_attributes[]; +extern MeterType SwapMeter; void SwapMeter_setValues(Meter* this, char* buffer, int len); diff --git a/TODO b/TODO new file mode 100644 index 0000000..716ab3b --- /dev/null +++ b/TODO @@ -0,0 +1,18 @@ + +BUGS: + + * tagged files are cleared if 'kill' fails + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=375219 + * add swap column for swap usage in MB + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=365038 + +FEATURES: + + * expand/collapse on tree + * handle saving of .htoprc more elegantly + * make bars display refresh independent from list refresh + * auto-calibrate delay + * add some more 'top' features + * add more command-line parameters + * show 'process view' + * make keybindings configurable, blah blah blah... diff --git a/TasksMeter.c b/TasksMeter.c index d970de0..5b99432 100644 --- a/TasksMeter.c +++ b/TasksMeter.c @@ -14,10 +14,10 @@ in the source distribution for its full text. #include "debug.h" -/* private property */ -int TasksMeter_attributes[] = { TASKS_RUNNING }; +int TasksMeter_attributes[] = { + TASKS_RUNNING +}; -/* private */ MeterType TasksMeter = { .setValues = TasksMeter_setValues, .display = TasksMeter_display, @@ -38,7 +38,7 @@ void TasksMeter_setValues(Meter* this, char* buffer, int len) { void TasksMeter_display(Object* cast, RichString* out) { Meter* this = (Meter*)cast; - RichString_prune(out); + RichString_init(out); char buffer[20]; sprintf(buffer, "%d", (int)this->total); RichString_append(out, CRT_colors[METER_VALUE], buffer); diff --git a/TasksMeter.h b/TasksMeter.h index 837730f..e5b6c47 100644 --- a/TasksMeter.h +++ b/TasksMeter.h @@ -17,7 +17,9 @@ in the source distribution for its full text. #include "debug.h" +extern int TasksMeter_attributes[]; +extern MeterType TasksMeter; void TasksMeter_setValues(Meter* this, char* buffer, int len); diff --git a/TraceScreen.c b/TraceScreen.c index a5feded..ff470c4 100644 --- a/TraceScreen.c +++ b/TraceScreen.c @@ -18,40 +18,37 @@ in the source distribution for its full text. #include "ProcessList.h" #include "Process.h" #include "ListItem.h" -#include "ListBox.h" +#include "Panel.h" #include "FunctionBar.h" /*{ typedef struct TraceScreen_ { Process* process; - ListBox* display; + Panel* display; FunctionBar* bar; bool tracing; } TraceScreen; }*/ -/* private property */ static char* tbFunctions[3] = {"AutoScroll ", "Stop Tracing ", "Done "}; -/* private property */ static char* tbKeys[3] = {"F4", "F5", "Esc"}; -/* private property */ static int tbEvents[3] = {KEY_F(4), KEY_F(5), 27}; TraceScreen* TraceScreen_new(Process* process) { TraceScreen* this = (TraceScreen*) malloc(sizeof(TraceScreen)); this->process = process; - this->display = ListBox_new(0, 1, COLS, LINES-2, LISTITEM_CLASS, true); + this->display = Panel_new(0, 1, COLS, LINES-2, LISTITEM_CLASS, true, ListItem_compare); this->bar = FunctionBar_new(3, tbFunctions, tbKeys, tbEvents); this->tracing = true; return this; } void TraceScreen_delete(TraceScreen* this) { - ListBox_delete((Object*)this->display); + Panel_delete((Object*)this->display); FunctionBar_delete((Object*)this->bar); free(this); } @@ -77,11 +74,13 @@ void TraceScreen_run(TraceScreen* this) { fcntl(fdpair[1], F_SETFL, O_NONBLOCK); sprintf(buffer, "%d", this->process->pid); execlp("strace", "strace", "-p", buffer, NULL); + const char* message = "Could not execute 'strace'. Please make sure it is available in your $PATH."; + write(fdpair[1], message, strlen(message)); exit(1); } fcntl(fdpair[0], F_SETFL, O_NONBLOCK); FILE* strace = fdopen(fdpair[0], "r"); - ListBox* lb = this->display; + Panel* panel = this->display; int fd_strace = fileno(strace); TraceScreen_draw(this); CRT_disableDelay(); @@ -105,31 +104,31 @@ void TraceScreen_run(TraceScreen* this) { if (buffer[i] == '\n') { buffer[i] = '\0'; if (contLine) { - ListItem_append((ListItem*)ListBox_get(lb, - ListBox_getSize(lb)-1), line); + ListItem_append((ListItem*)Panel_get(panel, + Panel_getSize(panel)-1), line); contLine = false; } else { - ListBox_add(lb, (Object*) ListItem_new(line, 0)); + Panel_add(panel, (Object*) ListItem_new(line, 0)); } line = buffer+i+1; } } if (line < buffer+nread) { - ListBox_add(lb, (Object*) ListItem_new(line, 0)); + Panel_add(panel, (Object*) ListItem_new(line, 0)); buffer[nread] = '\0'; contLine = true; } if (follow) - ListBox_setSelected(lb, ListBox_getSize(lb)-1); - ListBox_draw(lb, true); + Panel_setSelected(panel, Panel_getSize(panel)-1); + Panel_draw(panel, true); } int ch = getch(); if (ch == KEY_MOUSE) { MEVENT mevent; int ok = getmouse(&mevent); if (ok == OK) - if (mevent.y >= lb->y && mevent.y < LINES - 1) { - ListBox_setSelected(lb, mevent.y - lb->y + lb->scrollV); + if (mevent.y >= panel->y && mevent.y < LINES - 1) { + Panel_setSelected(panel, mevent.y - panel->y + panel->scrollV); follow = false; ch = 0; } if (mevent.y == LINES - 1) @@ -147,21 +146,21 @@ void TraceScreen_run(TraceScreen* this) { case KEY_F(4): follow = !follow; if (follow) - ListBox_setSelected(lb, ListBox_getSize(lb)-1); + Panel_setSelected(panel, Panel_getSize(panel)-1); break; case 'q': case 27: looping = false; break; case KEY_RESIZE: - ListBox_resize(lb, COLS, LINES-2); + Panel_resize(panel, COLS, LINES-2); TraceScreen_draw(this); break; default: follow = false; - ListBox_onKey(lb, ch); + Panel_onKey(panel, ch); } - ListBox_draw(lb, true); + Panel_draw(panel, true); } kill(child, SIGTERM); waitpid(child, NULL, 0); diff --git a/TraceScreen.h b/TraceScreen.h index e26737c..34ee5cb 100644 --- a/TraceScreen.h +++ b/TraceScreen.h @@ -1,11 +1,13 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_TraceScreen +#define HEADER_TraceScreen /* htop - TraceScreen.h -(C) 2005 Hisham H. Muhammad +(C) 2005-2006 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. */ -#ifndef HEADER_TraceScreen -#define HEADER_TraceScreen #define _GNU_SOURCE #include @@ -13,18 +15,24 @@ in the source distribution for its full text. #include #include #include +#include +#include #include "ProcessList.h" -#include "ListBox.h" +#include "Process.h" +#include "ListItem.h" +#include "Panel.h" #include "FunctionBar.h" + typedef struct TraceScreen_ { Process* process; - ListBox* display; + Panel* display; FunctionBar* bar; bool tracing; } TraceScreen; + TraceScreen* TraceScreen_new(Process* process); void TraceScreen_delete(TraceScreen* this); @@ -34,4 +42,3 @@ void TraceScreen_draw(TraceScreen* this); void TraceScreen_run(TraceScreen* this); #endif - diff --git a/TypedVector.c b/TypedVector.c deleted file mode 100644 index 09cc2b0..0000000 --- a/TypedVector.c +++ /dev/null @@ -1,257 +0,0 @@ -/* -htop -(C) 2004-2006 Hisham H. Muhammad -Released under the GNU GPL, see the COPYING file -in the source distribution for its full text. -*/ - -#include "TypedVector.h" -#include "Object.h" -#include -#include -#include - -#include "debug.h" -#include - -/*{ - -#ifndef DEFAULT_SIZE -#define DEFAULT_SIZE -1 -#endif - -typedef void(*TypedVector_procedure)(void*); - -typedef struct TypedVector_ { - Object **array; - int arraySize; - int growthRate; - int items; - char* vectorType; - bool owner; -} TypedVector; - -}*/ - -TypedVector* TypedVector_new(char* vectorType_, bool owner, int size) { - TypedVector* this; - - if (size == DEFAULT_SIZE) - size = 10; - this = (TypedVector*) malloc(sizeof(TypedVector)); - this->growthRate = size; - this->array = (Object**) calloc(size, sizeof(Object*)); - this->arraySize = size; - this->items = 0; - this->vectorType = vectorType_; - this->owner = owner; - return this; -} - -void TypedVector_delete(TypedVector* this) { - if (this->owner) { - for (int i = 0; i < this->items; i++) - if (this->array[i]) - (this->array[i])->delete(this->array[i]); - } - free(this->array); - free(this); -} - -/* private */ -bool TypedVector_isConsistent(TypedVector* this) { - if (this->owner) { - for (int i = 0; i < this->items; i++) - if (this->array[i] && this->array[i]->class != this->vectorType) - return false; - return true; - } else { - return true; - } -} - -void TypedVector_prune(TypedVector* this) { - assert(TypedVector_isConsistent(this)); - int i; - - for (i = 0; i < this->items; i++) - if (this->array[i]) { - if (this->owner) - (this->array[i])->delete(this->array[i]); - this->array[i] = NULL; - } - this->items = 0; -} - -void TypedVector_sort(TypedVector* this) { - assert(TypedVector_isConsistent(this)); - int i, j; - for (i = 1; i < this->items; i++) { - void* t = this->array[i]; - for (j = i-1; j >= 0 && this->array[j]->compare(this->array[j], t) < 0; j--) - this->array[j+1] = this->array[j]; - this->array[j+1] = t; - } - assert(TypedVector_isConsistent(this)); - - /* - for (int i = 0; i < this->items; i++) { - for (int j = i+1; j < this->items; j++) { - if (this->array[j]->compare(this->array[j], t) < 0) { - void* tmp = this->array[i]; - this->array[i] = this->array[j]; - this->array[j] = tmp; - } - } - } - */ -} - -/* private */ -void TypedVector_checkArraySize(TypedVector* this) { - assert(TypedVector_isConsistent(this)); - if (this->items >= this->arraySize) { - int i; - i = this->arraySize; - this->arraySize = this->items + this->growthRate; - this->array = (Object**) realloc(this->array, sizeof(Object*) * this->arraySize); - for (; i < this->arraySize; i++) - this->array[i] = NULL; - } - assert(TypedVector_isConsistent(this)); -} - -void TypedVector_insert(TypedVector* this, int index, void* data_) { - assert(index >= 0); - assert(((Object*)data_)->class == this->vectorType); - Object* data = data_; - assert(TypedVector_isConsistent(this)); - - TypedVector_checkArraySize(this); - assert(this->array[this->items] == NULL); - for (int i = this->items; i >= index; i--) { - this->array[i+1] = this->array[i]; - } - this->array[index] = data; - this->items++; - assert(TypedVector_isConsistent(this)); -} - -Object* TypedVector_take(TypedVector* this, int index) { - assert(index >= 0 && index < this->items); - assert(TypedVector_isConsistent(this)); - Object* removed = this->array[index]; - assert (removed != NULL); - this->items--; - for (int i = index; i < this->items; i++) - this->array[i] = this->array[i+1]; - this->array[this->items] = NULL; - assert(TypedVector_isConsistent(this)); - return removed; -} - -Object* TypedVector_remove(TypedVector* this, int index) { - Object* removed = TypedVector_take(this, index); - if (this->owner) { - removed->delete(removed); - return NULL; - } else - return removed; -} - -void TypedVector_moveUp(TypedVector* this, int index) { - assert(index >= 0 && index < this->items); - assert(TypedVector_isConsistent(this)); - if (index == 0) - return; - Object* temp = this->array[index]; - this->array[index] = this->array[index - 1]; - this->array[index - 1] = temp; -} - -void TypedVector_moveDown(TypedVector* this, int index) { - assert(index >= 0 && index < this->items); - assert(TypedVector_isConsistent(this)); - if (index == this->items - 1) - return; - Object* temp = this->array[index]; - this->array[index] = this->array[index + 1]; - this->array[index + 1] = temp; -} - -void TypedVector_set(TypedVector* this, int index, void* data_) { - assert(index >= 0); - assert(((Object*)data_)->class == this->vectorType); - Object* data = data_; - assert(TypedVector_isConsistent(this)); - - TypedVector_checkArraySize(this); - if (index >= this->items) { - this->items = index+1; - } else { - if (this->owner) { - Object* removed = this->array[index]; - assert (removed != NULL); - if (this->owner) { - removed->delete(removed); - } - } - } - this->array[index] = data; - assert(TypedVector_isConsistent(this)); -} - -inline Object* TypedVector_get(TypedVector* this, int index) { - assert(index < this->items); - assert(TypedVector_isConsistent(this)); - return this->array[index]; -} - -inline int TypedVector_size(TypedVector* this) { - assert(TypedVector_isConsistent(this)); - return this->items; -} - -void TypedVector_merge(TypedVector* this, TypedVector* v2) { - int i; - assert(TypedVector_isConsistent(this)); - - for (i = 0; i < v2->items; i++) - TypedVector_add(this, v2->array[i]); - v2->items = 0; - TypedVector_delete(v2); - assert(TypedVector_isConsistent(this)); -} - -void TypedVector_add(TypedVector* this, void* data_) { - assert(data_ && ((Object*)data_)->class == this->vectorType); - Object* data = data_; - assert(TypedVector_isConsistent(this)); - - TypedVector_set(this, this->items, data); - assert(TypedVector_isConsistent(this)); -} - -inline int TypedVector_indexOf(TypedVector* this, void* search_) { - assert(((Object*)search_)->class == this->vectorType); - Object* search = search_; - assert(TypedVector_isConsistent(this)); - - int i; - - for (i = 0; i < this->items; i++) { - Object* o = (Object*)this->array[i]; - if (o && o->compare(o, search) == 0) - return i; - } - return -1; -} - -void TypedVector_foreach(TypedVector* this, TypedVector_procedure f) { - int i; - assert(TypedVector_isConsistent(this)); - - for (i = 0; i < this->items; i++) - f(this->array[i]); - assert(TypedVector_isConsistent(this)); -} diff --git a/TypedVector.h b/TypedVector.h deleted file mode 100644 index e9e0dfa..0000000 --- a/TypedVector.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Do not edit this file. It was automatically genarated. */ - -#ifndef HEADER_TypedVector -#define HEADER_TypedVector -/* -htop -(C) 2004-2006 Hisham H. Muhammad -Released under the GNU GPL, see the COPYING file -in the source distribution for its full text. -*/ - -#include "Object.h" -#include -#include -#include - -#include "debug.h" -#include - - -#ifndef DEFAULT_SIZE -#define DEFAULT_SIZE -1 -#endif - -typedef void(*TypedVector_procedure)(void*); - -typedef struct TypedVector_ { - Object **array; - int arraySize; - int growthRate; - int items; - char* vectorType; - bool owner; -} TypedVector; - - -TypedVector* TypedVector_new(char* vectorType_, bool owner, int size); - -void TypedVector_delete(TypedVector* this); - -void TypedVector_prune(TypedVector* this); - -void TypedVector_sort(TypedVector* this); - -void TypedVector_insert(TypedVector* this, int index, void* data_); - -Object* TypedVector_take(TypedVector* this, int index); - -Object* TypedVector_remove(TypedVector* this, int index); - -void TypedVector_moveUp(TypedVector* this, int index); - -void TypedVector_moveDown(TypedVector* this, int index); - -void TypedVector_set(TypedVector* this, int index, void* data_); - -inline Object* TypedVector_get(TypedVector* this, int index); - -inline int TypedVector_size(TypedVector* this); - -void TypedVector_merge(TypedVector* this, TypedVector* v2); - -void TypedVector_add(TypedVector* this, void* data_); - -inline int TypedVector_indexOf(TypedVector* this, void* search_); - -void TypedVector_foreach(TypedVector* this, TypedVector_procedure f); - -#endif diff --git a/UptimeMeter.c b/UptimeMeter.c index 4b21245..c2fc0b8 100644 --- a/UptimeMeter.c +++ b/UptimeMeter.c @@ -14,10 +14,10 @@ in the source distribution for its full text. #include "debug.h" -/* private property */ -static int UptimeMeter_attributes[] = { UPTIME }; +int UptimeMeter_attributes[] = { + UPTIME +}; -/* private */ MeterType UptimeMeter = { .setValues = UptimeMeter_setValues, .display = NULL, diff --git a/UptimeMeter.h b/UptimeMeter.h index 4fe279f..7f68d3c 100644 --- a/UptimeMeter.h +++ b/UptimeMeter.h @@ -17,8 +17,10 @@ in the source distribution for its full text. #include "debug.h" +extern int UptimeMeter_attributes[]; +extern MeterType UptimeMeter; -void UptimeMeter_setValues(Meter* cast, char* buffer, int len); +void UptimeMeter_setValues(Meter* this, char* buffer, int len); #endif diff --git a/UsersTable.h b/UsersTable.h index fd717c2..54b997d 100644 --- a/UsersTable.h +++ b/UsersTable.h @@ -1,9 +1,9 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_UsersTable #define HEADER_UsersTable /* -htop +htop - UsersTable.h (C) 2004-2006 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. @@ -20,10 +20,6 @@ in the source distribution for its full text. #include "debug.h" #include -#ifndef SYSCONFDIR -#define SYSCONFDIR "/etc" -#endif - typedef struct UsersTable_ { Hashtable* users; } UsersTable; @@ -36,6 +32,6 @@ char* UsersTable_getRef(UsersTable* this, int uid); inline int UsersTable_size(UsersTable* this); -void UsersTable_foreach(UsersTable*, Hashtable_PairFunction, void*); +inline void UsersTable_foreach(UsersTable* this, Hashtable_PairFunction f, void* userData); #endif diff --git a/Vector.c b/Vector.c new file mode 100644 index 0000000..4ad697c --- /dev/null +++ b/Vector.c @@ -0,0 +1,250 @@ +/* +htop +(C) 2004-2006 Hisham H. Muhammad +Released under the GNU GPL, see the COPYING file +in the source distribution for its full text. +*/ + +#include "Vector.h" +#include "Object.h" +#include +#include +#include + +#include "debug.h" +#include + +/*{ + +#ifndef DEFAULT_SIZE +#define DEFAULT_SIZE -1 +#endif + +typedef void(*Vector_procedure)(void*); + +typedef struct Vector_ { + Object **array; + Object_Compare compare; + int arraySize; + int growthRate; + int items; + char* vectorType; + bool owner; +} Vector; + +}*/ + +Vector* Vector_new(char* vectorType_, bool owner, int size, Object_Compare compare) { + Vector* this; + + if (size == DEFAULT_SIZE) + size = 10; + this = (Vector*) malloc(sizeof(Vector)); + this->growthRate = size; + this->array = (Object**) calloc(size, sizeof(Object*)); + this->arraySize = size; + this->items = 0; + this->vectorType = vectorType_; + this->owner = owner; + this->compare = compare; + return this; +} + +void Vector_delete(Vector* this) { + if (this->owner) { + for (int i = 0; i < this->items; i++) + if (this->array[i]) + (this->array[i])->delete(this->array[i]); + } + free(this->array); + free(this); +} + +#ifdef DEBUG + +static inline bool Vector_isConsistent(Vector* this) { + if (this->owner) { + for (int i = 0; i < this->items; i++) + if (this->array[i] && this->array[i]->class != this->vectorType) + return false; + return true; + } else { + return true; + } +} + +#endif + +void Vector_prune(Vector* this) { + assert(Vector_isConsistent(this)); + int i; + + for (i = 0; i < this->items; i++) + if (this->array[i]) { + if (this->owner) + (this->array[i])->delete(this->array[i]); + this->array[i] = NULL; + } + this->items = 0; +} + +void Vector_sort(Vector* this) { + assert(this->compare); + assert(Vector_isConsistent(this)); + Object_Compare compare = this->compare; + /* Insertion sort works best on mostly-sorted arrays. */ + for (int i = 1; i < this->items; i++) { + int j; + void* t = this->array[i]; + for (j = i-1; j >= 0 && compare(this->array[j], t) > 0; j--) + this->array[j+1] = this->array[j]; + this->array[j+1] = t; + } + assert(Vector_isConsistent(this)); +} + +static void Vector_checkArraySize(Vector* this) { + assert(Vector_isConsistent(this)); + if (this->items >= this->arraySize) { + int i; + i = this->arraySize; + this->arraySize = this->items + this->growthRate; + this->array = (Object**) realloc(this->array, sizeof(Object*) * this->arraySize); + for (; i < this->arraySize; i++) + this->array[i] = NULL; + } + assert(Vector_isConsistent(this)); +} + +void Vector_insert(Vector* this, int index, void* data_) { + assert(index >= 0); + assert(((Object*)data_)->class == this->vectorType); + Object* data = data_; + assert(Vector_isConsistent(this)); + + Vector_checkArraySize(this); + assert(this->array[this->items] == NULL); + for (int i = this->items; i >= index; i--) { + this->array[i+1] = this->array[i]; + } + this->array[index] = data; + this->items++; + assert(Vector_isConsistent(this)); +} + +Object* Vector_take(Vector* this, int index) { + assert(index >= 0 && index < this->items); + assert(Vector_isConsistent(this)); + Object* removed = this->array[index]; + assert (removed != NULL); + this->items--; + for (int i = index; i < this->items; i++) + this->array[i] = this->array[i+1]; + this->array[this->items] = NULL; + assert(Vector_isConsistent(this)); + return removed; +} + +Object* Vector_remove(Vector* this, int index) { + Object* removed = Vector_take(this, index); + if (this->owner) { + removed->delete(removed); + return NULL; + } else + return removed; +} + +void Vector_moveUp(Vector* this, int index) { + assert(index >= 0 && index < this->items); + assert(Vector_isConsistent(this)); + if (index == 0) + return; + Object* temp = this->array[index]; + this->array[index] = this->array[index - 1]; + this->array[index - 1] = temp; +} + +void Vector_moveDown(Vector* this, int index) { + assert(index >= 0 && index < this->items); + assert(Vector_isConsistent(this)); + if (index == this->items - 1) + return; + Object* temp = this->array[index]; + this->array[index] = this->array[index + 1]; + this->array[index + 1] = temp; +} + +void Vector_set(Vector* this, int index, void* data_) { + assert(index >= 0); + assert(((Object*)data_)->class == this->vectorType); + Object* data = data_; + assert(Vector_isConsistent(this)); + + Vector_checkArraySize(this); + if (index >= this->items) { + this->items = index+1; + } else { + if (this->owner) { + Object* removed = this->array[index]; + assert (removed != NULL); + if (this->owner) { + removed->delete(removed); + } + } + } + this->array[index] = data; + assert(Vector_isConsistent(this)); +} + +inline Object* Vector_get(Vector* this, int index) { + assert(index < this->items); + assert(Vector_isConsistent(this)); + return this->array[index]; +} + +inline int Vector_size(Vector* this) { + assert(Vector_isConsistent(this)); + return this->items; +} + +void Vector_merge(Vector* this, Vector* v2) { + int i; + assert(Vector_isConsistent(this)); + + for (i = 0; i < v2->items; i++) + Vector_add(this, v2->array[i]); + v2->items = 0; + Vector_delete(v2); + assert(Vector_isConsistent(this)); +} + +void Vector_add(Vector* this, void* data_) { + assert(data_ && ((Object*)data_)->class == this->vectorType); + Object* data = data_; + assert(Vector_isConsistent(this)); + + Vector_set(this, this->items, data); + assert(Vector_isConsistent(this)); +} + +inline int Vector_indexOf(Vector* this, void* search_, Object_Compare compare) { + assert(((Object*)search_)->class == this->vectorType); + assert(this->compare); + Object* search = search_; + assert(Vector_isConsistent(this)); + for (int i = 0; i < this->items; i++) { + Object* o = (Object*)this->array[i]; + if (o && compare(search, o) == 0) + return i; + } + return -1; +} + +void Vector_foreach(Vector* this, Vector_procedure f) { + int i; + assert(Vector_isConsistent(this)); + + for (i = 0; i < this->items; i++) + f(this->array[i]); + assert(Vector_isConsistent(this)); +} diff --git a/Vector.h b/Vector.h new file mode 100644 index 0000000..b332ae8 --- /dev/null +++ b/Vector.h @@ -0,0 +1,74 @@ +/* Do not edit this file. It was automatically generated. */ + +#ifndef HEADER_Vector +#define HEADER_Vector +/* +htop +(C) 2004-2006 Hisham H. Muhammad +Released under the GNU GPL, see the COPYING file +in the source distribution for its full text. +*/ + +#include "Object.h" +#include +#include +#include + +#include "debug.h" +#include + + +#ifndef DEFAULT_SIZE +#define DEFAULT_SIZE -1 +#endif + +typedef void(*Vector_procedure)(void*); + +typedef struct Vector_ { + Object **array; + Object_Compare compare; + int arraySize; + int growthRate; + int items; + char* vectorType; + bool owner; +} Vector; + + +Vector* Vector_new(char* vectorType_, bool owner, int size, Object_Compare compare); + +void Vector_delete(Vector* this); + +#ifdef DEBUG + +#endif + +void Vector_prune(Vector* this); + +void Vector_sort(Vector* this); + +void Vector_insert(Vector* this, int index, void* data_); + +Object* Vector_take(Vector* this, int index); + +Object* Vector_remove(Vector* this, int index); + +void Vector_moveUp(Vector* this, int index); + +void Vector_moveDown(Vector* this, int index); + +void Vector_set(Vector* this, int index, void* data_); + +inline Object* Vector_get(Vector* this, int index); + +inline int Vector_size(Vector* this); + +void Vector_merge(Vector* this, Vector* v2); + +void Vector_add(Vector* this, void* data_); + +inline int Vector_indexOf(Vector* this, void* search_, Object_Compare compare); + +void Vector_foreach(Vector* this, Vector_procedure f); + +#endif diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..602c151 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +aclocal +autoconf +autoheader +automake --add-missing --copy + + diff --git a/config.h b/config.h index 359fdcb..d566f99 100644 --- a/config.h +++ b/config.h @@ -105,16 +105,16 @@ #define PACKAGE_NAME "htop" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "htop 0.6.2" +#define PACKAGE_STRING "htop 0.6.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "htop" /* Define to the version of this package. */ -#define PACKAGE_VERSION "0.6.2" +#define PACKAGE_VERSION "0.6.3" /* Path of proc filesystem */ -#define PROCDIR "/System/Kernel/Status" +#define PROCDIR "/proc" /* Define as the return type of signal handlers (`int' or `void'). */ #define RETSIGTYPE void @@ -123,7 +123,7 @@ #define STDC_HEADERS 1 /* Version number of package */ -#define VERSION "0.6.2" +#define VERSION "0.6.3" /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ diff --git a/configure b/configure index e702f6c..0796e50 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59 for htop 0.6.2. +# Generated by GNU Autoconf 2.59 for htop 0.6.3. # # Report bugs to . # @@ -269,8 +269,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='htop' PACKAGE_TARNAME='htop' -PACKAGE_VERSION='0.6.2' -PACKAGE_STRING='htop 0.6.2' +PACKAGE_VERSION='0.6.3' +PACKAGE_STRING='htop 0.6.3' PACKAGE_BUGREPORT='loderunner@users.sourceforge.net' ac_unique_file="htop.c" @@ -780,7 +780,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures htop 0.6.2 to adapt to many kinds of systems. +\`configure' configures htop 0.6.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -842,7 +842,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of htop 0.6.2:";; + short | recursive ) echo "Configuration of htop 0.6.3:";; esac cat <<\_ACEOF @@ -965,7 +965,7 @@ fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -htop configure 0.6.2 +htop configure 0.6.3 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. @@ -979,7 +979,7 @@ cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by htop $as_me 0.6.2, which was +It was created by htop $as_me 0.6.3, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ @@ -1614,7 +1614,7 @@ fi # Define the identity of the package. PACKAGE='htop' - VERSION='0.6.2' + VERSION='0.6.3' cat >>confdefs.h <<_ACEOF @@ -2924,6 +2924,8 @@ _ACEOF LIBS="-lncurses $LIBS" +else + missing_libraries="$missing_libraries libncurses" fi @@ -2998,9 +3000,17 @@ _ACEOF LIBS="-lm $LIBS" +else + missing_libraries="$missing_libraries libm" fi +if test ! -z "$missing_libraries"; then + { { echo "$as_me:$LINENO: error: missing libraries:$missing_headers" >&5 +echo "$as_me: error: missing libraries:$missing_headers" >&2;} + { (exit 1); exit 1; }; } +fi + # Checks for header files. @@ -3971,12 +3981,22 @@ if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF + : +else + + missing_headers="$missing_headers $ac_header" fi done +if test ! -z "$missing_headers"; then + { { echo "$as_me:$LINENO: error: missing headers:$missing_headers" >&5 +echo "$as_me: error: missing headers:$missing_headers" >&2;} + { (exit 1); exit 1; }; } +fi + # Checks for typedefs, structures, and compiler characteristics. echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5 echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6 @@ -5697,7 +5717,7 @@ _ASBOX } >&5 cat >&5 <<_CSEOF -This file was extended by htop $as_me 0.6.2, which was +This file was extended by htop $as_me 0.6.3, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -5760,7 +5780,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -htop config.status 0.6.2 +htop config.status 0.6.3 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.ac b/configure.ac index 029c2b6..09d99ec 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.57) -AC_INIT([htop],[0.6.2],[loderunner@users.sourceforge.net]) +AC_INIT([htop],[0.6.3],[loderunner@users.sourceforge.net]) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([htop.c]) AC_CONFIG_HEADER([config.h]) @@ -11,13 +11,23 @@ AC_CONFIG_HEADER([config.h]) AC_PROG_CC # Checks for libraries. -AC_CHECK_LIB([ncurses], [refresh]) -AC_CHECK_LIB([m], [ceil]) +AC_CHECK_LIB([ncurses], [refresh], [], [missing_libraries="$missing_libraries libncurses"]) +AC_CHECK_LIB([m], [ceil], [], [missing_libraries="$missing_libraries libm"]) + +if test ! -z "$missing_libraries"; then + AC_MSG_ERROR([missing libraries:$missing_headers]) +fi # Checks for header files. AC_HEADER_DIRENT AC_HEADER_STDC -AC_CHECK_HEADERS([stdlib.h string.h strings.h sys/param.h sys/time.h unistd.h curses.h]) +AC_CHECK_HEADERS([stdlib.h string.h strings.h sys/param.h sys/time.h unistd.h curses.h],[:],[ + missing_headers="$missing_headers $ac_header" +]) + +if test ! -z "$missing_headers"; then + AC_MSG_ERROR([missing headers:$missing_headers]) +fi # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL diff --git a/debug.h b/debug.h index 8ef971d..1b89f66 100644 --- a/debug.h +++ b/debug.h @@ -1,22 +1,28 @@ -#ifdef DEBUG +#if defined(DEBUG) -#include "DebugMemory.h" + /* Full debug */ + #include "DebugMemory.h" + #define calloc(a, b) DebugMemory_calloc(a, b, __FILE__, __LINE__) + #define malloc(x) DebugMemory_malloc(x, __FILE__, __LINE__, #x) + #define realloc(x,s) DebugMemory_realloc(x, s, __FILE__, __LINE__, #x) + #define strdup(x) DebugMemory_strdup(x, __FILE__, __LINE__) + #define free(x) DebugMemory_free(x, __FILE__, __LINE__) + #define debug_done() DebugMemory_report() -#define calloc(a, b) DebugMemory_calloc(a, b, __FILE__, __LINE__); -#define malloc(x) DebugMemory_malloc(x, __FILE__, __LINE__); -#define realloc(x,s) DebugMemory_realloc(x, s, __FILE__, __LINE__); -#define strdup(x) DebugMemory_strdup(x, __FILE__, __LINE__); -#define free(x) DebugMemory_free(x, __FILE__, __LINE__); +#elif defined(DEBUGLITE) -#define debug_done() DebugMemory_report(); + /* Assertions and core only */ + #ifdef NDEBUG + #undef NDEBUG + #endif + #define debug_done() sleep(0) -#endif - -#ifndef DEBUG +#else -#define NDEBUG - -#define debug_done() sleep(0) + /* No debugging */ + #define NDEBUG + #define debug_done() sleep(0) #endif + diff --git a/htop.1 b/htop.1 index 3572c95..d65682d 100644 --- a/htop.1 +++ b/htop.1 @@ -1,4 +1,4 @@ -.TH "htop" "1" "0.6.2" "Bartosz Fenski " "Utils" +.TH "htop" "1" "0.6.3" "Bartosz Fenski " "Utils" .SH "NAME" htop \- interactive process viewer .SH "SYNTAX" @@ -113,7 +113,7 @@ PID search: type in process ID and the selection highlight will be moved to it. .SH "AUTHORS" .LP -htop is developed by Hisham Muhammad . +htop is developed by Hisham Muhammad . .br This man page was written by Bartosz Fenski for the Debian GNU/Linux distribution (but it may be used by others), and diff --git a/htop.c b/htop.c index 4290920..8ce6a79 100644 --- a/htop.c +++ b/htop.c @@ -14,7 +14,7 @@ in the source distribution for its full text. #include "ProcessList.h" #include "CRT.h" -#include "ListBox.h" +#include "Panel.h" #include "UsersTable.h" #include "SignalItem.h" #include "RichString.h" @@ -22,8 +22,8 @@ in the source distribution for its full text. #include "ScreenManager.h" #include "FunctionBar.h" #include "ListItem.h" -#include "CategoriesListBox.h" -#include "SignalsListBox.h" +#include "CategoriesPanel.h" +#include "SignalsPanel.h" #include "TraceScreen.h" #include "config.h" @@ -33,9 +33,6 @@ in the source distribution for its full text. #define INCSEARCH_MAX 40 -/* private property */ -char htop_barCharacters[] = "|#*@$%&"; - void printVersionFlag() { clear(); printf("htop " VERSION " - (C) 2004-2006 Hisham Muhammad.\n"); @@ -126,62 +123,62 @@ void showHelp() { static void Setup_run(Settings* settings, int headerHeight) { ScreenManager* scr = ScreenManager_new(0, headerHeight, 0, -1, HORIZONTAL, true); - CategoriesListBox* lbCategories = CategoriesListBox_new(settings, scr); - ScreenManager_add(scr, (ListBox*) lbCategories, NULL, 16); - CategoriesListBox_makeMetersPage(lbCategories); - ListBox* lbFocus; + CategoriesPanel* panelCategories = CategoriesPanel_new(settings, scr); + ScreenManager_add(scr, (Panel*) panelCategories, NULL, 16); + CategoriesPanel_makeMetersPage(panelCategories); + Panel* panelFocus; int ch; - ScreenManager_run(scr, &lbFocus, &ch); + ScreenManager_run(scr, &panelFocus, &ch); ScreenManager_delete(scr); } -static bool changePriority(ListBox* lb, int delta) { +static bool changePriority(Panel* panel, int delta) { bool anyTagged = false; - for (int i = 0; i < ListBox_getSize(lb); i++) { - Process* p = (Process*) ListBox_get(lb, i); + for (int i = 0; i < Panel_getSize(panel); i++) { + Process* p = (Process*) Panel_get(panel, i); if (p->tag) { Process_setPriority(p, p->nice + delta); anyTagged = true; } } if (!anyTagged) { - Process* p = (Process*) ListBox_getSelected(lb); + Process* p = (Process*) Panel_getSelected(panel); Process_setPriority(p, p->nice + delta); } return anyTagged; } -static HandlerResult pickWithEnter(ListBox* lb, int ch) { +static HandlerResult pickWithEnter(Panel* panel, int ch) { if (ch == 13) return BREAK_LOOP; return IGNORED; } -static Object* pickFromList(ListBox* lb, ListBox* list, int x, int y, char** keyLabels, FunctionBar* prevBar) { +static Object* pickFromList(Panel* panel, Panel* list, int x, int y, char** keyLabels, FunctionBar* prevBar) { char* fuKeys[2] = {"Enter", "Esc"}; int fuEvents[2] = {13, 27}; - if (!lb->eventHandler) - ListBox_setEventHandler(list, pickWithEnter); + if (!panel->eventHandler) + Panel_setEventHandler(list, pickWithEnter); ScreenManager* scr = ScreenManager_new(0, y, 0, -1, HORIZONTAL, false); ScreenManager_add(scr, list, FunctionBar_new(2, keyLabels, fuKeys, fuEvents), x - 1); - ScreenManager_add(scr, lb, NULL, -1); - ListBox* lbFocus; + ScreenManager_add(scr, panel, NULL, -1); + Panel* panelFocus; int ch; - ScreenManager_run(scr, &lbFocus, &ch); + ScreenManager_run(scr, &panelFocus, &ch); ScreenManager_delete(scr); - ListBox_move(lb, 0, y); - ListBox_resize(lb, COLS, LINES-y-1); + Panel_move(panel, 0, y); + Panel_resize(panel, COLS, LINES-y-1); FunctionBar_draw(prevBar, NULL); - if (lbFocus == list && ch == 13) { - return ListBox_getSelected(list); + if (panelFocus == list && ch == 13) { + return Panel_getSelected(list); } return NULL; } -void addUserToList(int key, void* userCast, void* lbCast) { +void addUserToList(int key, void* userCast, void* panelCast) { char* user = (char*) userCast; - ListBox* lb = (ListBox*) lbCast; - ListBox_add(lb, (Object*) ListItem_new(user, key)); + Panel* panel = (Panel*) panelCast; + Panel_add(panel, (Object*) ListItem_new(user, key)); } void setUserOnly(const char* userName, bool* userOnly, uid_t* userId) { @@ -219,14 +216,14 @@ int main(int argc, char** argv) { exit(1); } - ListBox* lb; + Panel* panel; int quit = 0; int refreshTimeout = 0; int resetRefreshTimeout = 5; bool doRefresh = true; Settings* settings; - ListBox* lbk = NULL; + Panel* killPanel = NULL; char incSearchBuffer[INCSEARCH_MAX]; int incSearchIndex = 0; @@ -248,8 +245,8 @@ int main(int argc, char** argv) { CRT_init(settings->delay, settings->colorScheme); - lb = ListBox_new(0, headerHeight, COLS, LINES - headerHeight - 2, PROCESS_CLASS, false); - ListBox_setRichHeader(lb, ProcessList_printHeader(pl)); + panel = Panel_new(0, headerHeight, COLS, LINES - headerHeight - 2, PROCESS_CLASS, false, NULL); + Panel_setRichHeader(panel, ProcessList_printHeader(pl)); char* searchFunctions[3] = {"Next ", "Exit ", " Search: "}; char* searchKeys[3] = {"F3", "Esc", " "}; @@ -285,9 +282,9 @@ int main(int argc, char** argv) { if (doRefresh) { incSearchIndex = 0; incSearchBuffer[0] = 0; - int currPos = ListBox_getSelectedIndex(lb); + int currPos = Panel_getSelectedIndex(panel); int currPid = 0; - int currScrollV = lb->scrollV; + int currScrollV = panel->scrollV; if (follow) currPid = ProcessList_get(pl, currPos)->pid; if (recalculate) @@ -296,18 +293,18 @@ int main(int argc, char** argv) { ProcessList_sort(pl); refreshTimeout = 1; } - ListBox_prune(lb); + Panel_prune(panel); int size = ProcessList_size(pl); - int lbi = 0; + int index = 0; for (int i = 0; i < size; i++) { Process* p = ProcessList_get(pl, i); if (!userOnly || (p->st_uid == userId)) { - ListBox_set(lb, lbi, (Object*)p); - if ((!follow && lbi == currPos) || (follow && p->pid == currPid)) { - ListBox_setSelected(lb, lbi); - lb->scrollV = currScrollV; + Panel_set(panel, index, (Object*)p); + if ((!follow && index == currPos) || (follow && p->pid == currPid)) { + Panel_setSelected(panel, index); + panel->scrollV = currScrollV; } - lbi++; + index++; } } } @@ -315,7 +312,7 @@ int main(int argc, char** argv) { Header_draw(header); - ListBox_draw(lb, true); + Panel_draw(panel, true); int prev = ch; ch = getch(); @@ -334,7 +331,7 @@ int main(int argc, char** argv) { if (incSearchMode) { doRefresh = false; if (ch == KEY_F(3)) { - int here = ListBox_getSelectedIndex(lb); + int here = Panel_getSelectedIndex(panel); int size = ProcessList_size(pl); int i = here+1; while (i != here) { @@ -342,7 +339,7 @@ int main(int argc, char** argv) { i = 0; Process* p = ProcessList_get(pl, i); if (String_contains_i(p->comm, incSearchBuffer)) { - ListBox_setSelected(lb, i); + Panel_setSelected(panel, i); break; } i++; @@ -367,7 +364,7 @@ int main(int argc, char** argv) { for (int i = 0; i < ProcessList_size(pl); i++) { Process* p = ProcessList_get(pl, i); if (String_contains_i(p->comm, incSearchBuffer)) { - ListBox_setSelected(lb, i); + Panel_setSelected(panel, i); found = true; break; } @@ -381,8 +378,8 @@ int main(int argc, char** argv) { } if (isdigit((char)ch)) { int pid = ch-48 + acc; - for (int i = 0; i < ProcessList_size(pl) && ((Process*) ListBox_getSelected(lb))->pid != pid; i++) - ListBox_setSelected(lb, i); + for (int i = 0; i < ProcessList_size(pl) && ((Process*) Panel_getSelected(panel))->pid != pid; i++) + Panel_setSelected(panel, i); acc = pid * 10; if (acc > 100000) acc = 0; @@ -395,8 +392,8 @@ int main(int argc, char** argv) { MEVENT mevent; int ok = getmouse(&mevent); if (ok == OK) { - if (mevent.y >= lb->y + 1 && mevent.y < LINES - 1) { - ListBox_setSelected(lb, mevent.y - lb->y + lb->scrollV - 1); + if (mevent.y >= panel->y + 1 && mevent.y < LINES - 1) { + Panel_setSelected(panel, mevent.y - panel->y + panel->scrollV - 1); doRefresh = false; refreshTimeout = resetRefreshTimeout; follow = true; @@ -413,7 +410,7 @@ int main(int argc, char** argv) { switch (ch) { case KEY_RESIZE: - ListBox_resize(lb, COLS, LINES-headerHeight-1); + Panel_resize(panel, COLS, LINES-headerHeight-1); if (incSearchMode) FunctionBar_draw(searchBar, incSearchBuffer); else @@ -425,7 +422,7 @@ int main(int argc, char** argv) { pl->sortKey = PERCENT_MEM; pl->treeView = false; settings->changed = true; - ListBox_setRichHeader(lb, ProcessList_printHeader(pl)); + Panel_setRichHeader(panel, ProcessList_printHeader(pl)); break; } case 'T': @@ -434,13 +431,13 @@ int main(int argc, char** argv) { pl->sortKey = TIME; pl->treeView = false; settings->changed = true; - ListBox_setRichHeader(lb, ProcessList_printHeader(pl)); + Panel_setRichHeader(panel, ProcessList_printHeader(pl)); break; } case 'U': { - for (int i = 0; i < ListBox_getSize(lb); i++) { - Process* p = (Process*) ListBox_get(lb, i); + for (int i = 0; i < Panel_getSize(panel); i++) { + Process* p = (Process*) Panel_get(panel, i); p->tag = false; } doRefresh = true; @@ -452,7 +449,7 @@ int main(int argc, char** argv) { pl->sortKey = PERCENT_CPU; pl->treeView = false; settings->changed = true; - ListBox_setRichHeader(lb, ProcessList_printHeader(pl)); + Panel_setRichHeader(panel, ProcessList_printHeader(pl)); break; } case KEY_F(1): @@ -472,14 +469,14 @@ int main(int argc, char** argv) { } case ' ': { - Process* p = (Process*) ListBox_getSelected(lb); + Process* p = (Process*) Panel_getSelected(panel); Process_toggleTag(p); - ListBox_onKey(lb, KEY_DOWN); + Panel_onKey(panel, KEY_DOWN); break; } case 's': { - TraceScreen* ts = TraceScreen_new((Process*) ListBox_getSelected(lb)); + TraceScreen* ts = TraceScreen_new((Process*) Panel_getSelected(panel)); TraceScreen_run(ts); TraceScreen_delete(ts); clear(); @@ -494,10 +491,10 @@ int main(int argc, char** argv) { { Setup_run(settings, headerHeight); // TODO: shouldn't need this, colors should be dynamic - ListBox_setRichHeader(lb, ProcessList_printHeader(pl)); + Panel_setRichHeader(panel, ProcessList_printHeader(pl)); headerHeight = Header_calculateHeight(header); - ListBox_move(lb, 0, headerHeight); - ListBox_resize(lb, COLS, LINES-headerHeight-1); + Panel_move(panel, 0, headerHeight); + Panel_resize(panel, COLS, LINES-headerHeight-1); FunctionBar_draw(defaultBar, NULL); refreshTimeout = 0; break; @@ -509,14 +506,14 @@ int main(int argc, char** argv) { } case 'u': { - ListBox* lbu = ListBox_new(0, 0, 0, 0, LISTITEM_CLASS, true); - ListBox_setHeader(lbu, "Show processes of:"); - UsersTable_foreach(ut, addUserToList, lbu); - TypedVector_sort(lbu->items); + Panel* usersPanel = Panel_new(0, 0, 0, 0, LISTITEM_CLASS, true, ListItem_compare); + Panel_setHeader(usersPanel, "Show processes of:"); + UsersTable_foreach(ut, addUserToList, usersPanel); + Vector_sort(usersPanel->items); ListItem* allUsers = ListItem_new("All users", -1); - ListBox_insert(lbu, 0, (Object*) allUsers); + Panel_insert(usersPanel, 0, (Object*) allUsers); char* fuFunctions[2] = {"Show ", "Cancel "}; - ListItem* picked = (ListItem*) pickFromList(lb, lbu, 20, headerHeight, fuFunctions, defaultBar); + ListItem* picked = (ListItem*) pickFromList(panel, usersPanel, 20, headerHeight, fuFunctions, defaultBar); if (picked) { if (picked == allUsers) { userOnly = false; @@ -530,34 +527,33 @@ int main(int argc, char** argv) { case KEY_F(9): case 'k': { - if (!lbk) { - lbk = (ListBox*) SignalsListBox_new(0, 0, 0, 0); + if (!killPanel) { + killPanel = (Panel*) SignalsPanel_new(0, 0, 0, 0); } - SignalsListBox_reset((SignalsListBox*) lbk); + SignalsPanel_reset((SignalsPanel*) killPanel); char* fuFunctions[2] = {"Send ", "Cancel "}; - Signal* signal = (Signal*) pickFromList(lb, lbk, 15, headerHeight, fuFunctions, defaultBar); + Signal* signal = (Signal*) pickFromList(panel, killPanel, 15, headerHeight, fuFunctions, defaultBar); if (signal) { if (signal->number != 0) { - ListBox_setHeader(lb, "Sending..."); - ListBox_draw(lb, true); + Panel_setHeader(panel, "Sending..."); + Panel_draw(panel, true); refresh(); bool anyTagged = false; - for (int i = 0; i < ListBox_getSize(lb); i++) { - Process* p = (Process*) ListBox_get(lb, i); + for (int i = 0; i < Panel_getSize(panel); i++) { + Process* p = (Process*) Panel_get(panel, i); if (p->tag) { Process_sendSignal(p, signal->number); - Process_toggleTag(p); anyTagged = true; } } if (!anyTagged) { - Process* p = (Process*) ListBox_getSelected(lb); + Process* p = (Process*) Panel_getSelected(panel); Process_sendSignal(p, signal->number); } napms(500); } } - ListBox_setRichHeader(lb, ProcessList_printHeader(pl)); + Panel_setRichHeader(panel, ProcessList_printHeader(pl)); refreshTimeout = 0; break; } @@ -572,25 +568,25 @@ int main(int argc, char** argv) { case '.': case KEY_F(6): { - ListBox* lbf = ListBox_new(0,0,0,0,LISTITEM_CLASS,true); - ListBox_setHeader(lbf, "Sort by"); + Panel* sortPanel = Panel_new(0, 0, 0, 0, LISTITEM_CLASS, true, ListItem_compare); + Panel_setHeader(sortPanel, "Sort by"); char* fuFunctions[2] = {"Sort ", "Cancel "}; ProcessField* fields = pl->fields; for (int i = 0; fields[i]; i++) { char* name = String_trim(Process_printField(fields[i])); - ListBox_add(lbf, (Object*) ListItem_new(name, fields[i])); + Panel_add(sortPanel, (Object*) ListItem_new(name, fields[i])); if (fields[i] == pl->sortKey) - ListBox_setSelected(lbf, i); + Panel_setSelected(sortPanel, i); free(name); } - ListItem* field = (ListItem*) pickFromList(lb, lbf, 15, headerHeight, fuFunctions, defaultBar); + ListItem* field = (ListItem*) pickFromList(panel, sortPanel, 15, headerHeight, fuFunctions, defaultBar); if (field) { pl->treeView = false; settings->changed = true; pl->sortKey = field->key; } - ((Object*)lbf)->delete((Object*)lbf); - ListBox_setRichHeader(lb, ProcessList_printHeader(pl)); + ((Object*)sortPanel)->delete((Object*)sortPanel); + Panel_setRichHeader(panel, ProcessList_printHeader(pl)); refreshTimeout = 0; break; } @@ -607,14 +603,14 @@ int main(int argc, char** argv) { case '=': case '+': { - doRefresh = changePriority(lb, 1); + doRefresh = changePriority(panel, 1); break; } case KEY_F(7): case ']': case '-': { - doRefresh = changePriority(lb, -1); + doRefresh = changePriority(panel, -1); break; } case KEY_F(3): @@ -641,7 +637,7 @@ int main(int argc, char** argv) { default: doRefresh = false; refreshTimeout = resetRefreshTimeout; - ListBox_onKey(lb, ch); + Panel_onKey(panel, ch); break; } follow = false; @@ -658,9 +654,9 @@ int main(int argc, char** argv) { ProcessList_delete(pl); FunctionBar_delete((Object*)searchBar); FunctionBar_delete((Object*)defaultBar); - ((Object*)lb)->delete((Object*)lb); - if (lbk) - ((Object*)lbk)->delete((Object*)lbk); + ((Object*)panel)->delete((Object*)panel); + if (killPanel) + ((Object*)killPanel)->delete((Object*)killPanel); UsersTable_delete(ut); Settings_delete(settings); debug_done(); diff --git a/htop.desktop b/htop.desktop index 2b3ff00..27122e3 100644 --- a/htop.desktop +++ b/htop.desktop @@ -1,6 +1,6 @@ [Desktop Entry] Encoding=UTF-8 -Version=0.6.2 +Version=0.6.3 Name=Htop Type=Application Comment=Show System Processes diff --git a/htop.h b/htop.h index e069678..5042f94 100644 --- a/htop.h +++ b/htop.h @@ -1,4 +1,4 @@ -/* Do not edit this file. It was automatically genarated. */ +/* Do not edit this file. It was automatically generated. */ #ifndef HEADER_htop #define HEADER_htop @@ -9,9 +9,16 @@ Released under the GNU GPL, see the COPYING file in the source distribution for its full text. */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include + #include "ProcessList.h" #include "CRT.h" -#include "ListBox.h" +#include "Panel.h" #include "UsersTable.h" #include "SignalItem.h" #include "RichString.h" @@ -19,34 +26,26 @@ in the source distribution for its full text. #include "ScreenManager.h" #include "FunctionBar.h" #include "ListItem.h" -#include "CategoriesListBox.h" -#include "SignalsListBox.h" +#include "CategoriesPanel.h" +#include "SignalsPanel.h" +#include "TraceScreen.h" #include "config.h" #include "debug.h" -#include -#include -#include -#include -#include - -int usleep(int usec); - //#link m #define INCSEARCH_MAX 40 - void printVersionFlag(); void printHelpFlag(); void showHelp(); -void showColumnConfig(ProcessList* pl); +void addUserToList(int key, void* userCast, void* panelCast); -void Setup_run(Settings* settings, int headerHeight); +void setUserOnly(const char* userName, bool* userOnly, uid_t* userId); int main(int argc, char** argv); diff --git a/scripts/MakeHeader.py b/scripts/MakeHeader.py index 2268fcf..9d78c48 100755 --- a/scripts/MakeHeader.py +++ b/scripts/MakeHeader.py @@ -8,6 +8,7 @@ SKIP=3 SKIPONE=4 state = ANY +static = 0 file = open(sys.argv[1]) name = sys.argv[1][:-2] @@ -34,15 +35,27 @@ for line in file.readlines(): state = COPY elif line == selfheader: pass - elif string.find(line, "typedef") == 0 or line == "/* private */": - state = SKIP - elif string.find(line, "/* private property */") == 0: - state = SKIPONE - elif len(line) > 1 and line[-1] == "{": - out.write( line[:-2] + ";" ) - state = SKIP - elif line == "": - out.write( "" ) + elif line.find("htop - ") == 0 and line[-2:] == ".c": + out.write(line[:-2] + ".h") + elif line.find("static ") != -1: + if line[-1] == "{": + state = SKIP + static = 1 + else: + state = SKIPONE + elif len(line) > 1: + static = 0 + equals = line.find(" = ") + if line[-3:] == "= {": + out.write( "extern " + line[:-4] + ";" ) + state = SKIP + elif equals != -1: + out.write("extern " + line[:equals] + ";" ) + elif line[-1] == "{": + out.write( line[:-2] + ";" ) + state = SKIP + else: + out.write( line ) else: out.write( line ) elif state == COPY: @@ -52,7 +65,11 @@ for line in file.readlines(): out.write( line ) elif state == SKIP: if len(line) >= 1 and line[0] == "}": - state = ANY + if static == 1: + state = SKIPONE + else: + state = ANY + static = 0 elif state == SKIPONE: state = ANY -- cgit v1.2.3