summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2012-12-05 15:12:20 +0000
committerHisham Muhammad <hisham@gobolinux.org>2012-12-05 15:12:20 +0000
commit00b324bfc162030b575e03795dcfcaac56bd0b4d (patch)
treefbaada243839b0b67351856e2d02a2e8184bf65f
parent2a73405cd060b543d56987650327b18078a137d7 (diff)
Changes in object model: separate class objects to store vtable. Also, nicer UTF-8 display of big numbers.
-rw-r--r--Affinity.h27
-rw-r--r--AffinityPanel.c12
-rw-r--r--AffinityPanel.h2
-rw-r--r--AvailableColumnsPanel.c14
-rw-r--r--AvailableColumnsPanel.h2
-rw-r--r--AvailableMetersPanel.c22
-rw-r--r--AvailableMetersPanel.h2
-rw-r--r--BatteryMeter.c9
-rw-r--r--BatteryMeter.h2
-rw-r--r--CPUMeter.c92
-rw-r--r--CPUMeter.h14
-rw-r--r--CRT.c10
-rw-r--r--CRT.h4
-rw-r--r--CategoriesPanel.c14
-rw-r--r--CategoriesPanel.h2
-rw-r--r--CheckItem.c16
-rw-r--r--CheckItem.h6
-rw-r--r--ClockMeter.c9
-rw-r--r--ClockMeter.h2
-rw-r--r--ColorsPanel.c16
-rw-r--r--ColorsPanel.h2
-rw-r--r--ColumnsPanel.c14
-rw-r--r--ColumnsPanel.h2
-rw-r--r--DisplayOptionsPanel.c14
-rw-r--r--DisplayOptionsPanel.h2
-rw-r--r--FunctionBar.c14
-rw-r--r--FunctionBar.h6
-rw-r--r--Header.c41
-rw-r--r--Header.h2
-rw-r--r--HostnameMeter.c9
-rw-r--r--HostnameMeter.h2
-rw-r--r--IOPriorityPanel.c2
-rw-r--r--ListItem.c16
-rw-r--r--ListItem.h6
-rw-r--r--LoadAverageMeter.c20
-rw-r--r--LoadAverageMeter.h4
-rw-r--r--MemoryMeter.c10
-rw-r--r--MemoryMeter.h2
-rw-r--r--Meter.c223
-rw-r--r--Meter.h96
-rw-r--r--MetersPanel.c14
-rw-r--r--MetersPanel.h2
-rw-r--r--Object.c59
-rw-r--r--Object.h39
-rw-r--r--OpenFilesScreen.c5
-rw-r--r--Panel.c51
-rw-r--r--Panel.h25
-rw-r--r--Process.c17
-rw-r--r--Process.h8
-rw-r--r--ProcessList.c15
-rw-r--r--ProcessList.h6
-rw-r--r--ScreenManager.c8
-rw-r--r--SignalsPanel.c33
-rw-r--r--SignalsPanel.h9
-rw-r--r--SwapMeter.c10
-rw-r--r--SwapMeter.h2
-rw-r--r--TasksMeter.c10
-rw-r--r--TasksMeter.h2
-rw-r--r--TraceScreen.c13
-rw-r--r--UptimeMeter.c9
-rw-r--r--UptimeMeter.h2
-rw-r--r--Vector.c39
-rw-r--r--Vector.h5
-rw-r--r--htop.c81
64 files changed, 662 insertions, 566 deletions
diff --git a/Affinity.h b/Affinity.h
new file mode 100644
index 00000000..3a19ea49
--- /dev/null
+++ b/Affinity.h
@@ -0,0 +1,27 @@
+/* Do not edit this file. It was automatically generated. */
+
+#ifndef HEADER_Affinity
+#define HEADER_Affinity
+/*
+htop - Affinity.h
+(C) 2004-2011 Hisham H. Muhammad
+Released under the GNU GPL, see the COPYING file
+in the source distribution for its full text.
+*/
+
+
+typedef struct Affinity_ {
+ int size;
+ int used;
+ int* cpus;
+} Affinity;
+
+
+Affinity* Affinity_new();
+
+void Affinity_delete(Affinity* this);
+
+void Affinity_add(Affinity* this, int id);
+
+
+#endif
diff --git a/AffinityPanel.c b/AffinityPanel.c
index 8c406fb3..094a0104 100644
--- a/AffinityPanel.c
+++ b/AffinityPanel.c
@@ -34,9 +34,17 @@ static HandlerResult AffinityPanel_eventHandler(Panel* this, int ch) {
return IGNORED;
}
+PanelClass AffinityPanel_class = {
+ .super = {
+ .extends = Class(Panel),
+ .delete = Panel_delete
+ },
+ .eventHandler = AffinityPanel_eventHandler
+};
+
Panel* AffinityPanel_new(ProcessList* pl, Affinity* affinity) {
- Panel* this = Panel_new(1, 1, 1, 1, CHECKITEM_CLASS, true, ListItem_compare);
- this->eventHandler = AffinityPanel_eventHandler;
+ Panel* this = Panel_new(1, 1, 1, 1, true, Class(CheckItem));
+ Object_setClass(this, Class(AffinityPanel));
Panel_setHeader(this, "Use CPUs:");
int curCpu = 0;
diff --git a/AffinityPanel.h b/AffinityPanel.h
index 392a2597..63283c51 100644
--- a/AffinityPanel.h
+++ b/AffinityPanel.h
@@ -14,6 +14,8 @@ in the source distribution for its full text.
#include "ProcessList.h"
#include "ListItem.h"
+extern PanelClass AffinityPanel_class;
+
Panel* AffinityPanel_new(ProcessList* pl, Affinity* affinity);
Affinity* AffinityPanel_getAffinity(Panel* this);
diff --git a/AvailableColumnsPanel.c b/AvailableColumnsPanel.c
index fce9880c..d954da8c 100644
--- a/AvailableColumnsPanel.c
+++ b/AvailableColumnsPanel.c
@@ -63,15 +63,21 @@ static HandlerResult AvailableColumnsPanel_eventHandler(Panel* super, int ch) {
return result;
}
+PanelClass AvailableColumnsPanel_class = {
+ .super = {
+ .extends = Class(Panel),
+ .delete = AvailableColumnsPanel_delete
+ },
+ .eventHandler = AvailableColumnsPanel_eventHandler
+};
+
AvailableColumnsPanel* AvailableColumnsPanel_new(Settings* settings, Panel* columns, ScreenManager* scr) {
- AvailableColumnsPanel* this = (AvailableColumnsPanel*) malloc(sizeof(AvailableColumnsPanel));
+ AvailableColumnsPanel* this = AllocThis(AvailableColumnsPanel);
Panel* super = (Panel*) this;
- Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true);
- ((Object*)this)->delete = AvailableColumnsPanel_delete;
+ Panel_init(super, 1, 1, 1, 1, Class(ListItem), true);
this->settings = settings;
this->scr = scr;
- super->eventHandler = AvailableColumnsPanel_eventHandler;
Panel_setHeader(super, "Available Columns");
diff --git a/AvailableColumnsPanel.h b/AvailableColumnsPanel.h
index 6a32f9fb..0a29e6a4 100644
--- a/AvailableColumnsPanel.h
+++ b/AvailableColumnsPanel.h
@@ -22,6 +22,8 @@ typedef struct AvailableColumnsPanel_ {
} AvailableColumnsPanel;
+extern PanelClass AvailableColumnsPanel_class;
+
AvailableColumnsPanel* AvailableColumnsPanel_new(Settings* settings, Panel* columns, ScreenManager* scr);
#endif
diff --git a/AvailableMetersPanel.c b/AvailableMetersPanel.c
index 0cdb508f..f5828516 100644
--- a/AvailableMetersPanel.c
+++ b/AvailableMetersPanel.c
@@ -37,7 +37,7 @@ static void AvailableMetersPanel_delete(Object* object) {
free(this);
}
-static inline void AvailableMetersPanel_addHeader(Header* header, Panel* panel, MeterType* type, int param, HeaderSide side) {
+static inline void AvailableMetersPanel_addHeader(Header* header, Panel* panel, MeterClass* type, int param, HeaderSide side) {
Meter* meter = (Meter*) Header_addMeter(header, type, param, side);
Panel_add(panel, (Object*) Meter_toListItem(meter));
}
@@ -78,26 +78,32 @@ static HandlerResult AvailableMetersPanel_eventHandler(Panel* super, int ch) {
return result;
}
+PanelClass AvailableMetersPanel_class = {
+ .super = {
+ .extends = Class(Panel),
+ .delete = AvailableMetersPanel_delete
+ },
+ .eventHandler = AvailableMetersPanel_eventHandler
+};
+
AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Panel* leftMeters, Panel* rightMeters, ScreenManager* scr) {
- AvailableMetersPanel* this = (AvailableMetersPanel*) malloc(sizeof(AvailableMetersPanel));
+ AvailableMetersPanel* this = AllocThis(AvailableMetersPanel);
Panel* super = (Panel*) this;
- Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true);
- ((Object*)this)->delete = AvailableMetersPanel_delete;
+ Panel_init(super, 1, 1, 1, 1, Class(ListItem), true);
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) {
+ MeterClass* type = Meter_types[i];
+ if (type != &CPUMeter_class) {
Panel_add(super, (Object*) ListItem_new(type->uiName, i << 16));
}
}
- MeterType* type = &CPUMeter;
+ MeterClass* type = &CPUMeter_class;
int cpus = settings->pl->cpuCount;
if (cpus > 1) {
Panel_add(super, (Object*) ListItem_new("CPU average", 0));
diff --git a/AvailableMetersPanel.h b/AvailableMetersPanel.h
index c34f0b2c..281e2857 100644
--- a/AvailableMetersPanel.h
+++ b/AvailableMetersPanel.h
@@ -23,6 +23,8 @@ typedef struct AvailableMetersPanel_ {
} AvailableMetersPanel;
+extern PanelClass AvailableMetersPanel_class;
+
AvailableMetersPanel* AvailableMetersPanel_new(Settings* settings, Panel* leftMeters, Panel* rightMeters, ScreenManager* scr);
#endif
diff --git a/BatteryMeter.c b/BatteryMeter.c
index 071efd53..d2a4049d 100644
--- a/BatteryMeter.c
+++ b/BatteryMeter.c
@@ -328,10 +328,13 @@ static void BatteryMeter_setValues(Meter * this, char *buffer, int len) {
return;
}
-MeterType BatteryMeter = {
+MeterClass BatteryMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete
+ },
.setValues = BatteryMeter_setValues,
- .display = NULL,
- .mode = TEXT_METERMODE,
+ .defaultMode = TEXT_METERMODE,
.items = 1,
.total = 100.0,
.attributes = BatteryMeter_attributes,
diff --git a/BatteryMeter.h b/BatteryMeter.h
index 56ed951e..25fd3c92 100644
--- a/BatteryMeter.h
+++ b/BatteryMeter.h
@@ -22,6 +22,6 @@ typedef enum ACPresence_ {
extern int BatteryMeter_attributes[];
-extern MeterType BatteryMeter;
+extern MeterClass BatteryMeter_class;
#endif
diff --git a/CPUMeter.c b/CPUMeter.c
index 90555ff6..b9d888ce 100644
--- a/CPUMeter.c
+++ b/CPUMeter.c
@@ -61,13 +61,13 @@ static void CPUMeter_setValues(Meter* this, char* buffer, int size) {
this->values[5] = cpuData->ioWaitPeriod / total * 100.0;
this->values[6] = cpuData->stealPeriod / total * 100.0;
this->values[7] = cpuData->guestPeriod / total * 100.0;
- this->type->items = 8;
+ Meter_setItems(this, 8);
percent = MIN(100.0, MAX(0.0, (this->values[0]+this->values[1]+this->values[2]+
this->values[3]+this->values[4])));
} else {
this->values[2] = cpuData->systemAllPeriod / total * 100.0;
this->values[3] = (cpuData->stealPeriod + cpuData->guestPeriod) / total * 100.0;
- this->type->items = 4;
+ Meter_setItems(this, 4);
percent = MIN(100.0, MAX(0.0, (this->values[0]+this->values[1]+this->values[2]+this->values[3])));
}
if (isnan(percent)) percent = 0.0;
@@ -126,7 +126,7 @@ static void CPUMeter_display(Object* cast, RichString* out) {
static void AllCPUsMeter_getRange(Meter* this, int* start, int* count) {
int cpus = this->pl->cpuCount;
- switch(this->type->name[0]) {
+ switch(Meter_name(this)[0]) {
default:
case 'A': // All
*start = 0;
@@ -152,13 +152,13 @@ static void AllCPUsMeter_init(Meter* this) {
AllCPUsMeter_getRange(this, &start, &count);
for (int i = 0; i < count; i++) {
if (!meters[i])
- meters[i] = Meter_new(this->pl, start+i+1, &CPUMeter);
- meters[i]->type->init(meters[i]);
+ meters[i] = Meter_new(this->pl, start+i+1, (MeterClass*) Class(CPUMeter));
+ Meter_init(meters[i]);
}
if (this->mode == 0)
this->mode = BAR_METERMODE;
int h = Meter_modes[this->mode]->h;
- if (strchr(this->type->name, '2'))
+ if (strchr(Meter_name(this), '2'))
this->h = h * ((count+1) / 2);
else
this->h = h * count;
@@ -172,7 +172,7 @@ static void AllCPUsMeter_done(Meter* this) {
Meter_delete((Object*)meters[i]);
}
-static void AllCPUsMeter_setMode(Meter* this, int mode) {
+static void AllCPUsMeter_updateMode(Meter* this, int mode) {
Meter** meters = (Meter**) this->drawData;
this->mode = mode;
int h = Meter_modes[mode]->h;
@@ -181,7 +181,7 @@ static void AllCPUsMeter_setMode(Meter* this, int mode) {
for (int i = 0; i < count; i++) {
Meter_setMode(meters[i], mode);
}
- if (strchr(this->type->name, '2'))
+ if (strchr(Meter_name(this), '2'))
this->h = h * ((count+1) / 2);
else
this->h = h * count;
@@ -214,10 +214,14 @@ static void SingleColCPUsMeter_draw(Meter* this, int x, int y, int w) {
}
}
-MeterType CPUMeter = {
+MeterClass CPUMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = CPUMeter_display
+ },
.setValues = CPUMeter_setValues,
- .display = CPUMeter_display,
- .mode = BAR_METERMODE,
+ .defaultMode = BAR_METERMODE,
.items = 8,
.total = 100.0,
.attributes = CPUMeter_attributes,
@@ -227,8 +231,13 @@ MeterType CPUMeter = {
.init = CPUMeter_init
};
-MeterType AllCPUsMeter = {
- .mode = 0,
+MeterClass AllCPUsMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = CPUMeter_display
+ },
+ .defaultMode = CUSTOM_METERMODE,
.items = 1,
.total = 100.0,
.attributes = CPUMeter_attributes,
@@ -237,12 +246,17 @@ MeterType AllCPUsMeter = {
.caption = "CPU",
.draw = SingleColCPUsMeter_draw,
.init = AllCPUsMeter_init,
- .setMode = AllCPUsMeter_setMode,
+ .updateMode = AllCPUsMeter_updateMode,
.done = AllCPUsMeter_done
};
-MeterType AllCPUs2Meter = {
- .mode = 0,
+MeterClass AllCPUs2Meter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = CPUMeter_display
+ },
+ .defaultMode = CUSTOM_METERMODE,
.items = 1,
.total = 100.0,
.attributes = CPUMeter_attributes,
@@ -251,12 +265,17 @@ MeterType AllCPUs2Meter = {
.caption = "CPU",
.draw = DualColCPUsMeter_draw,
.init = AllCPUsMeter_init,
- .setMode = AllCPUsMeter_setMode,
+ .updateMode = AllCPUsMeter_updateMode,
.done = AllCPUsMeter_done
};
-MeterType LeftCPUsMeter = {
- .mode = 0,
+MeterClass LeftCPUsMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = CPUMeter_display
+ },
+ .defaultMode = CUSTOM_METERMODE,
.items = 1,
.total = 100.0,
.attributes = CPUMeter_attributes,
@@ -265,12 +284,17 @@ MeterType LeftCPUsMeter = {
.caption = "CPU",
.draw = SingleColCPUsMeter_draw,
.init = AllCPUsMeter_init,
- .setMode = AllCPUsMeter_setMode,
+ .updateMode = AllCPUsMeter_updateMode,
.done = AllCPUsMeter_done
};
-MeterType RightCPUsMeter = {
- .mode = 0,
+MeterClass RightCPUsMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = CPUMeter_display
+ },
+ .defaultMode = CUSTOM_METERMODE,
.items = 1,
.total = 100.0,
.attributes = CPUMeter_attributes,
@@ -279,12 +303,17 @@ MeterType RightCPUsMeter = {
.caption = "CPU",
.draw = SingleColCPUsMeter_draw,
.init = AllCPUsMeter_init,
- .setMode = AllCPUsMeter_setMode,
+ .updateMode = AllCPUsMeter_updateMode,
.done = AllCPUsMeter_done
};
-MeterType LeftCPUs2Meter = {
- .mode = 0,
+MeterClass LeftCPUs2Meter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = CPUMeter_display
+ },
+ .defaultMode = CUSTOM_METERMODE,
.items = 1,
.total = 100.0,
.attributes = CPUMeter_attributes,
@@ -293,12 +322,17 @@ MeterType LeftCPUs2Meter = {
.caption = "CPU",
.draw = DualColCPUsMeter_draw,
.init = AllCPUsMeter_init,
- .setMode = AllCPUsMeter_setMode,
+ .updateMode = AllCPUsMeter_updateMode,
.done = AllCPUsMeter_done
};
-MeterType RightCPUs2Meter = {
- .mode = 0,
+MeterClass RightCPUs2Meter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = CPUMeter_display
+ },
+ .defaultMode = CUSTOM_METERMODE,
.items = 1,
.total = 100.0,
.attributes = CPUMeter_attributes,
@@ -307,7 +341,7 @@ MeterType RightCPUs2Meter = {
.caption = "CPU",
.draw = DualColCPUsMeter_draw,
.init = AllCPUsMeter_init,
- .setMode = AllCPUsMeter_setMode,
+ .updateMode = AllCPUsMeter_updateMode,
.done = AllCPUsMeter_done
};
diff --git a/CPUMeter.h b/CPUMeter.h
index 251fbdc4..f91c7597 100644
--- a/CPUMeter.h
+++ b/CPUMeter.h
@@ -20,19 +20,19 @@ extern int CPUMeter_attributes[];
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
-extern MeterType CPUMeter;
+extern MeterClass CPUMeter_class;
-extern MeterType AllCPUsMeter;
+extern MeterClass AllCPUsMeter_class;
-extern MeterType AllCPUs2Meter;
+extern MeterClass AllCPUs2Meter_class;
-extern MeterType LeftCPUsMeter;
+extern MeterClass LeftCPUsMeter_class;
-extern MeterType RightCPUsMeter;
+extern MeterClass RightCPUsMeter_class;
-extern MeterType LeftCPUs2Meter;
+extern MeterClass LeftCPUs2Meter_class;
-extern MeterType RightCPUs2Meter;
+extern MeterClass RightCPUs2Meter_class;
#endif
diff --git a/CRT.c b/CRT.c
index 6cc979f7..3a1eb913 100644
--- a/CRT.c
+++ b/CRT.c
@@ -112,10 +112,12 @@ typedef enum ColorElements_ {
static bool CRT_hasColors;
-int CRT_delay = 0;
+static int CRT_delay = 0;
int CRT_colorScheme = 0;
+bool CRT_utf8 = false;
+
int CRT_colors[LAST_COLORELEMENT] = { 0 };
int CRT_cursorX = 0;
@@ -158,7 +160,7 @@ void CRT_init(int delay, int colorScheme) {
noecho();
CRT_delay = delay;
CRT_colorScheme = colorScheme;
- halfdelay(CRT_delay);
+ halfdelay(CRT_delay/2);
nonl();
intrflush(stdscr, false);
keypad(stdscr, true);
@@ -212,7 +214,7 @@ int CRT_readKey() {
cbreak();
nodelay(stdscr, FALSE);
int ret = getch();
- halfdelay(CRT_delay);
+ halfdelay(CRT_delay/2);
return ret;
}
@@ -223,7 +225,7 @@ void CRT_disableDelay() {
}
void CRT_enableDelay() {
- halfdelay(CRT_delay);
+ halfdelay(CRT_delay/2);
}
void CRT_setColors(int colorScheme) {
diff --git a/CRT.h b/CRT.h
index 7916b16d..f7d4d723 100644
--- a/CRT.h
+++ b/CRT.h
@@ -101,10 +101,10 @@ typedef enum ColorElements_ {
// TODO: centralize these in Settings.
-extern int CRT_delay;
-
extern int CRT_colorScheme;
+extern bool CRT_utf8;
+
extern int CRT_colors[LAST_COLORELEMENT];
extern int CRT_cursorX;
diff --git a/CategoriesPanel.c b/CategoriesPanel.c
index 449a5be6..bf6ee543 100644
--- a/CategoriesPanel.c
+++ b/CategoriesPanel.c
@@ -132,15 +132,21 @@ static HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch) {
return result;
}
+PanelClass CategoriesPanel_class = {
+ .super = {
+ .extends = Class(Panel),
+ .delete = CategoriesPanel_delete
+ },
+ .eventHandler = CategoriesPanel_eventHandler
+};
+
CategoriesPanel* CategoriesPanel_new(Settings* settings, ScreenManager* scr) {
- CategoriesPanel* this = (CategoriesPanel*) malloc(sizeof(CategoriesPanel));
+ CategoriesPanel* this = AllocThis(CategoriesPanel);
Panel* super = (Panel*) this;
- Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true);
- ((Object*)this)->delete = CategoriesPanel_delete;
+ Panel_init(super, 1, 1, 1, 1, Class(ListItem), true);
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));
diff --git a/CategoriesPanel.h b/CategoriesPanel.h
index 1311fe2e..9d30330f 100644
--- a/CategoriesPanel.h
+++ b/CategoriesPanel.h
@@ -23,6 +23,8 @@ typedef struct CategoriesPanel_ {
void CategoriesPanel_makeMetersPage(CategoriesPanel* this);
+extern PanelClass CategoriesPanel_class;
+
CategoriesPanel* CategoriesPanel_new(Settings* settings, ScreenManager* scr);
#endif
diff --git a/CheckItem.c b/CheckItem.c
index 0fb40cfd..8c05e38e 100644
--- a/CheckItem.c
+++ b/CheckItem.c
@@ -24,12 +24,6 @@ typedef struct CheckItem_ {
}*/
-#ifdef DEBUG
-char* CHECKITEM_CLASS = "CheckItem";
-#else
-#define CHECKITEM_CLASS NULL
-#endif
-
static void CheckItem_delete(Object* cast) {
CheckItem* this = (CheckItem*)cast;
assert (this != NULL);
@@ -50,11 +44,13 @@ static void CheckItem_display(Object* cast, RichString* out) {
RichString_append(out, CRT_colors[CHECK_TEXT], this->text);
}
+ObjectClass CheckItem_class = {
+ .display = CheckItem_display,
+ .delete = CheckItem_delete
+};
+
CheckItem* CheckItem_new(char* text, bool* ref, bool value) {
- CheckItem* this = malloc(sizeof(CheckItem));
- Object_setClass(this, CHECKITEM_CLASS);
- ((Object*)this)->display = CheckItem_display;
- ((Object*)this)->delete = CheckItem_delete;
+ CheckItem* this = AllocThis(CheckItem);
this->text = text;
this->value = value;
this->ref = ref;
diff --git a/CheckItem.h b/CheckItem.h
index 6c70790e..98ed17a1 100644
--- a/CheckItem.h
+++ b/CheckItem.h
@@ -19,11 +19,7 @@ typedef struct CheckItem_ {
} CheckItem;
-#ifdef DEBUG
-extern char* CHECKITEM_CLASS;
-#else
-#define CHECKITEM_CLASS NULL
-#endif
+extern ObjectClass CheckItem_class;
CheckItem* CheckItem_new(char* text, bool* ref, bool value);
diff --git a/ClockMeter.c b/ClockMeter.c
index 7edf5bf1..3b0911fe 100644
--- a/ClockMeter.c
+++ b/ClockMeter.c
@@ -26,10 +26,13 @@ static void ClockMeter_setValues(Meter* this, char* buffer, int size) {
strftime(buffer, size, "%H:%M:%S", lt);
}
-MeterType ClockMeter = {
+MeterClass ClockMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete
+ },
.setValues = ClockMeter_setValues,
- .display = NULL,
- .mode = TEXT_METERMODE,
+ .defaultMode = TEXT_METERMODE,
.total = 100.0,
.items = 1,
.attributes = ClockMeter_attributes,
diff --git a/ClockMeter.h b/ClockMeter.h
index ed19786c..3e0aef53 100644
--- a/ClockMeter.h
+++ b/ClockMeter.h
@@ -13,6 +13,6 @@ in the source distribution for its full text.
extern int ClockMeter_attributes[];
-extern MeterType ClockMeter;
+extern MeterClass ClockMeter_class;
#endif
diff --git a/ColorsPanel.c b/ColorsPanel.c
index bf94bf53..4e28d017 100644
--- a/ColorsPanel.c
+++ b/ColorsPanel.c
@@ -51,7 +51,7 @@ static void ColorsPanel_delete(Object* object) {
free(this);
}
-static HandlerResult ColorsPanel_EventHandler(Panel* super, int ch) {
+static HandlerResult ColorsPanel_eventHandler(Panel* super, int ch) {
ColorsPanel* this = (ColorsPanel*) super;
HandlerResult result = IGNORED;
@@ -83,15 +83,21 @@ static HandlerResult ColorsPanel_EventHandler(Panel* super, int ch) {
return result;
}
+PanelClass ColorsPanel_class = {
+ .super = {
+ .extends = Class(Panel),
+ .delete = ColorsPanel_delete
+ },
+ .eventHandler = ColorsPanel_eventHandler
+};
+
ColorsPanel* ColorsPanel_new(Settings* settings, ScreenManager* scr) {
- ColorsPanel* this = (ColorsPanel*) malloc(sizeof(ColorsPanel));
+ ColorsPanel* this = AllocThis(ColorsPanel);
Panel* super = (Panel*) this;
- Panel_init(super, 1, 1, 1, 1, CHECKITEM_CLASS, true);
- ((Object*)this)->delete = ColorsPanel_delete;
+ Panel_init(super, 1, 1, 1, 1, Class(CheckItem), true);
this->settings = settings;
this->scr = scr;
- super->eventHandler = ColorsPanel_EventHandler;
Panel_setHeader(super, "Colors");
for (int i = 0; ColorSchemes[i] != NULL; i++) {
diff --git a/ColorsPanel.h b/ColorsPanel.h
index 61b89c0c..10dcb50d 100644
--- a/ColorsPanel.h
+++ b/ColorsPanel.h
@@ -27,6 +27,8 @@ typedef struct ColorsPanel_ {
} ColorsPanel;
+extern PanelClass ColorsPanel_class;
+
ColorsPanel* ColorsPanel_new(Settings* settings, ScreenManager* scr);
#endif
diff --git a/ColumnsPanel.c b/ColumnsPanel.c
index d6b442a3..639d5e6d 100644
--- a/ColumnsPanel.c
+++ b/ColumnsPanel.c
@@ -82,15 +82,21 @@ static HandlerResult ColumnsPanel_eventHandler(Panel* super, int ch) {
return result;
}
+PanelClass ColumnsPanel_class = {
+ .super = {
+ .extends = Class(Panel),
+ .delete = ColumnsPanel_delete
+ },
+ .eventHandler = ColumnsPanel_eventHandler
+};
+
ColumnsPanel* ColumnsPanel_new(Settings* settings, ScreenManager* scr) {
- ColumnsPanel* this = (ColumnsPanel*) malloc(sizeof(ColumnsPanel));
+ ColumnsPanel* this = AllocThis(ColumnsPanel);
Panel* super = (Panel*) this;
- Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true);
- ((Object*)this)->delete = ColumnsPanel_delete;
+ Panel_init(super, 1, 1, 1, 1, Class(ListItem), true);
this->settings = settings;
this->scr = scr;
- super->eventHandler = ColumnsPanel_eventHandler;
Panel_setHeader(super, "Active Columns");
ProcessField* fields = this->settings->pl->fields;
diff --git a/ColumnsPanel.h b/ColumnsPanel.h
index 2ebb3873..122d9f99 100644
--- a/ColumnsPanel.h
+++ b/ColumnsPanel.h
@@ -21,6 +21,8 @@ typedef struct ColumnsPanel_ {
} ColumnsPanel;
+extern PanelClass ColumnsPanel_class;
+
ColumnsPanel* ColumnsPanel_new(Settings* settings, ScreenManager* scr);
int ColumnsPanel_fieldNameToIndex(const char* name);
diff --git a/DisplayOptionsPanel.c b/DisplayOptionsPanel.c
index 7ec035b0..2c01b5ef 100644
--- a/DisplayOptionsPanel.c
+++ b/DisplayOptionsPanel.c
@@ -61,15 +61,21 @@ static HandlerResult DisplayOptionsPanel_eventHandler(Panel* super, int ch) {
return result;
}
+PanelClass DisplayOptionsPanel_class = {
+ .super = {
+ .extends = Class(Panel),
+ .delete = DisplayOptionsPanel_delete
+ },
+ .eventHandler = DisplayOptionsPanel_eventHandler
+};
+
DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* scr) {
- DisplayOptionsPanel* this = (DisplayOptionsPanel*) malloc(sizeof(DisplayOptionsPanel));
+ DisplayOptionsPanel* this = AllocThis(DisplayOptionsPanel);
Panel* super = (Panel*) this;
- Panel_init(super, 1, 1, 1, 1, CHECKITEM_CLASS, true);
- ((Object*)this)->delete = DisplayOptionsPanel_delete;
+ Panel_init(super, 1, 1, 1, 1, Class(CheckItem), true);
this->settings = settings;
this->scr = scr;
- super->eventHandler = DisplayOptionsPanel_eventHandler;
Panel_setHeader(super, "Display options");
Panel_add(super, (Object*) CheckItem_new(strdup("Tree view"), &(settings->pl->treeView), false));
diff --git a/DisplayOptionsPanel.h b/DisplayOptionsPanel.h
index 1e013f35..2a7509ae 100644
--- a/DisplayOptionsPanel.h
+++ b/DisplayOptionsPanel.h
@@ -21,6 +21,8 @@ typedef struct DisplayOptionsPanel_ {
} DisplayOptionsPanel;
+extern PanelClass DisplayOptionsPanel_class;
+
DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* scr);
#endif
diff --git a/FunctionBar.c b/FunctionBar.c
index dc4368ef..fb62823b 100644
--- a/FunctionBar.c
+++ b/FunctionBar.c
@@ -29,22 +29,18 @@ typedef struct FunctionBar_ {
}*/
-#ifdef DEBUG
-char* FUNCTIONBAR_CLASS = "FunctionBar";
-#else
-#define FUNCTIONBAR_CLASS NULL
-#endif
-
static const char* FunctionBar_FKeys[] = {"F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", NULL};
static const char* FunctionBar_FLabels[] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", NULL};
static int FunctionBar_FEvents[] = {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)};
+ObjectClass FunctionBar_class = {
+ .delete = FunctionBar_delete
+};
+
FunctionBar* FunctionBar_new(const char** functions, const char** keys, int* events) {
- FunctionBar* this = malloc(sizeof(FunctionBar));
- Object_setClass(this, FUNCTIONBAR_CLASS);
- ((Object*) this)->delete = FunctionBar_delete;
+ FunctionBar* this = AllocThis(FunctionBar);
this->functions = (char**) functions;
if (keys && events) {
this->staticData = false;
diff --git a/FunctionBar.h b/FunctionBar.h
index 584d7fde..68e28f9f 100644
--- a/FunctionBar.h
+++ b/FunctionBar.h
@@ -21,11 +21,7 @@ typedef struct FunctionBar_ {
} FunctionBar;
-#ifdef DEBUG
-extern char* FUNCTIONBAR_CLASS;
-#else
-#define FUNCTIONBAR_CLASS NULL
-#endif
+extern ObjectClass FunctionBar_class;
FunctionBar* FunctionBar_new(const char** functions, const char** keys, int* events);
diff --git a/Header.c b/Header.c
index ea1078ff..7d954a3f 100644
--- a/Header.c
+++ b/Header.c
@@ -50,8 +50,8 @@ typedef struct Header_ {
Header* Header_new(ProcessList* pl) {
Header* this = calloc(sizeof(Header), 1);
- this->leftMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL);
- this->rightMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL);
+ this->leftMeters = Vector_new(Class(Meter), true, DEFAULT_SIZE);
+ this->rightMeters = Vector_new(Class(Meter), true, DEFAULT_SIZE);
this->margin = true;
this->pl = pl;
return this;
@@ -75,7 +75,7 @@ void Header_createMeter(Header* this, char* name, HeaderSide side) {
if (!ok) param = 0;
*paren = '\0';
}
- for (MeterType** type = Meter_types; *type; type++) {
+ for (MeterClass** type = Meter_types; *type; type++) {
if (String_eq(name, (*type)->name)) {
Vector_add(meters, Meter_new(this->pl, param, *type));
break;
@@ -94,7 +94,7 @@ void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side) {
Meter_setMode(meter, mode);
}
-Meter* Header_addMeter(Header* this, MeterType* type, int param, HeaderSide side) {
+Meter* Header_addMeter(Header* this, MeterClass* type, int param, HeaderSide side) {
Vector* meters = side == LEFT_HEADER
? this->leftMeters
: this->rightMeters;
@@ -118,10 +118,10 @@ char* Header_readMeterName(Header* this, int i, HeaderSide side) {
: this->rightMeters;
Meter* meter = (Meter*) Vector_get(meters, i);
- int nameLen = strlen(meter->type->name);
+ int nameLen = strlen(Meter_name(meter));
int len = nameLen + 100;
char* name = malloc(len);
- strncpy(name, meter->type->name, nameLen);
+ strncpy(name, Meter_name(meter), nameLen);
name[nameLen] = '\0';
if (meter->param)
snprintf(name + nameLen, len - nameLen, "(%d)", meter->param);
@@ -140,38 +140,37 @@ MeterModeId Header_readMeterMode(Header* this, int i, HeaderSide side) {
void Header_defaultMeters(Header* this, int cpuCount) {
if (cpuCount > 8) {
- Vector_add(this->leftMeters, Meter_new(this->pl, 0, &LeftCPUs2Meter));
- Vector_add(this->rightMeters, Meter_new(this->pl, 0, &RightCPUs2Meter));
+ Vector_add(this->leftMeters, Meter_new(this->pl, 0, (MeterClass*) Class(LeftCPUs2Meter)));
+ Vector_add(this->rightMeters, Meter_new(this->pl, 0, (MeterClass*) Class(RightCPUs2Meter)));
} else if (cpuCount > 4) {
- Vector_add(this->leftMeters, Meter_new(this->pl, 0, &LeftCPUsMeter));
- Vector_add(this->rightMeters, Meter_new(this->pl, 0, &RightCPUsMeter));
+ Vector_add(this->leftMeters, Meter_new(this->pl, 0, (MeterClass*) Class(LeftCPUsMeter)));
+ Vector_add(this->rightMeters, Meter_new(this->pl, 0, (MeterClass*) Class(RightCPUsMeter)));
} else {
- Vector_add(this->leftMeters, Meter_new(this->pl, 0, &AllCPUsMeter));
+ Vector_add(this->leftMeters, Meter_new(this->pl, 0, (MeterClass*) Class(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));
+ Vector_add(this->leftMeters, Meter_new(this->pl, 0, (MeterClass*) Class(MemoryMeter)));
+ Vector_add(this->leftMeters, Meter_new(this->pl, 0, (MeterClass*) Class(SwapMeter)));
+ Vector_add(this->rightMeters, Meter_new(this->pl, 0, (MeterClass*) Class(TasksMeter)));
+ Vector_add(this->rightMeters, Meter_new(this->pl, 0, (MeterClass*) Class(LoadAverageMeter)));
+ Vector_add(this->rightMeters, Meter_new(this->pl, 0, (MeterClass*) Class(UptimeMeter)));
}
void Header_reinit(Header* this) {
for (int i = 0; i < Vector_size(this->leftMeters); i++) {
Meter* meter = (Meter*) Vector_get(this->leftMeters, i);
- if (meter->type->init)
- meter->type->init(meter);
+ if (Meter_initFn(meter))
+ Meter_init(meter);
}
for (int i = 0; i < Vector_size(this->rightMeters); i++) {
Meter* meter = (Meter*) Vector_get(this->rightMeters, i);
- if (meter->type->init)
- meter->type->init(meter);
+ if (Meter_initFn(meter))
+ Meter_init(meter);
}
}
void Header_draw(const Header* this) {
int height = this->height;
int pad = this->pad;
-
attrset(CRT_colors[RESET_COLOR]);
for (int y = 0; y < height; y++) {
mvhline(y, 0, ' ', COLS);
diff --git a/Header.h b/Header.h
index 938d1417..27187f3f 100644
--- a/Header.h
+++ b/Header.h
@@ -39,7 +39,7 @@ void Header_createMeter(Header* this, char* name, HeaderSide side);
void Header_setMode(Header* this, int i, MeterModeId mode, HeaderSide side);
-Meter* Header_addMeter(Header* this, MeterType* type, int param, HeaderSide side);
+Meter* Header_addMeter(Header* this, MeterClass* type, int param, HeaderSide side);
int Header_size(Header* this, HeaderSide side);
diff --git a/HostnameMeter.c b/HostnameMeter.c
index 0498ab76..95ac9714 100644
--- a/HostnameMeter.c
+++ b/HostnameMeter.c
@@ -24,10 +24,13 @@ static void HostnameMeter_setValues(Meter* this, char* buffer, int size) {
gethostname(buffer, size-1);
}
-MeterType HostnameMeter = {
+MeterClass HostnameMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete
+ },
.setValues = HostnameMeter_setValues,
- .display = NULL,
- .mode = TEXT_METERMODE,
+ .defaultMode = TEXT_METERMODE,
.total = 100.0,
.items = 1,
.attributes = HostnameMeter_attributes,
diff --git a/HostnameMeter.h b/HostnameMeter.h
index addc7537..3697dff8 100644
--- a/HostnameMeter.h
+++ b/HostnameMeter.h
@@ -13,6 +13,6 @@ in the source distribution for its full text.
extern int HostnameMeter_attributes[];
-extern MeterType HostnameMeter;
+extern MeterClass HostnameMeter_class;
#endif
diff --git a/IOPriorityPanel.c b/IOPriorityPanel.c
index bc80b7dc..04d98b18 100644
--- a/IOPriorityPanel.c
+++ b/IOPriorityPanel.c
@@ -14,7 +14,7 @@ in the source distribution for its full text.
}*/
Panel* IOPriorityPanel_new(IOPriority currPrio) {
- Panel* this = Panel_new(1, 1, 1, 1, LISTITEM_CLASS, true, ListItem_compare);
+ Panel* this = Panel_new(1, 1, 1, 1, true, Class(ListItem));
Panel_setHeader(this, "IO Priority:");
Panel_add(this, (Object*) ListItem_new("None (based on nice)", IOPriority_None));
diff --git a/ListItem.c b/ListItem.c
index af50ca95..677707f0 100644
--- a/ListItem.c
+++ b/ListItem.c
@@ -26,12 +26,6 @@ typedef struct ListItem_ {
}*/
-#ifdef DEBUG
-char* LISTITEM_CLASS = "ListItem";
-#else
-#define LISTITEM_CLASS NULL
-#endif
-
static void ListItem_delete(Object* cast) {
ListItem* this = (ListItem*)cast;
free(this->value);
@@ -49,11 +43,13 @@ static void ListItem_display(Object* cast, RichString* out) {
RichString_write(out, CRT_colors[DEFAULT_COLOR], this->value/*buffer*/);
}
+ObjectClass ListItem_class = {
+ .display = ListItem_display,
+ .delete = ListItem_delete
+};
+
ListItem* ListItem_new(const char* value, int key) {
- ListItem* this = malloc(sizeof(ListItem));
- Object_setClass(this, LISTITEM_CLASS);
- ((Object*)this)->display = ListItem_display;
- ((Object*)this)->delete = ListItem_delete;
+ ListItem* this = AllocThis(ListItem);
this->value = strdup(value);
this->key = key;
return this;
diff --git a/ListItem.h b/ListItem.h
index 083a5c99..a3ca0759 100644
--- a/ListItem.h
+++ b/ListItem.h
@@ -18,11 +18,7 @@ typedef struct ListItem_ {
} ListItem;
-#ifdef DEBUG
-extern char* LISTITEM_CLASS;
-#else
-#define LISTITEM_CLASS NULL
-#endif
+extern ObjectClass ListItem_class;
ListItem* ListItem_new(const char* value, int key);
diff --git a/LoadAverageMeter.c b/LoadAverageMeter.c
index 9d5071b1..f4f37c7e 100644
--- a/LoadAverageMeter.c
+++ b/LoadAverageMeter.c
@@ -67,10 +67,14 @@ static void LoadMeter_display(Object* cast, RichString* out) {
RichString_write(out, CRT_colors[LOAD], buffer);
}
-MeterType LoadAverageMeter = {
+MeterClass LoadAverageMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = LoadAverageMeter_display,
+ },
.setValues = LoadAverageMeter_setValues,
- .display = LoadAverageMeter_display,
- .mode = TEXT_METERMODE,
+ .defaultMode = TEXT_METERMODE,
.items = 3,
.total = 100.0,
.attributes = LoadAverageMeter_attributes,
@@ -79,10 +83,14 @@ MeterType LoadAverageMeter = {
.caption = "Load average: "
};
-MeterType LoadMeter = {
+MeterClass LoadMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = LoadMeter_display,
+ },
.setValues = LoadMeter_setValues,
- .display = LoadMeter_display,
- .mode = TEXT_METERMODE,
+ .defaultMode = TEXT_METERMODE,
.items = 1,
.total = 100.0,
.attributes = LoadMeter_attributes,
diff --git a/LoadAverageMeter.h b/LoadAverageMeter.h
index b30680f3..bd18f4d0 100644
--- a/LoadAverageMeter.h
+++ b/LoadAverageMeter.h
@@ -15,8 +15,8 @@ extern int LoadAverageMeter_attributes[];
extern int LoadMeter_attributes[];
-extern MeterType LoadAverageMeter;
+extern MeterClass LoadAverageMeter_class;
-extern MeterType LoadMeter;
+extern MeterClass LoadMeter_class;
#endif
diff --git a/MemoryMeter.c b/MemoryMeter.c
index fa897d7e..eca0442e 100644
--- a/MemoryMeter.c
+++ b/MemoryMeter.c
@@ -59,10 +59,14 @@ static void MemoryMeter_display(Object* cast, RichString* out) {
RichString_append(out, CRT_colors[MEMORY_CACHE], buffer);
}
-MeterType MemoryMeter = {
+MeterClass MemoryMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = MemoryMeter_display,
+ },
.setValues = MemoryMeter_setValues,
- .display = MemoryMeter_display,
- .mode = BAR_METERMODE,
+ .defaultMode = BAR_METERMODE,
.items = 3,
.total = 100.0,
.attributes = MemoryMeter_attributes,
diff --git a/MemoryMeter.h b/MemoryMeter.h
index 8fa1e42b..6ddae923 100644
--- a/MemoryMeter.h
+++ b/MemoryMeter.h
@@ -13,6 +13,6 @@ in the source distribution for its full text.
extern int MemoryMeter_attributes[];
-extern MeterType MemoryMeter;
+extern MeterClass MemoryMeter_class;
#endif
diff --git a/Meter.c b/Meter.c
index b009d667..7948028e 100644
--- a/Meter.c
+++ b/Meter.c
@@ -21,17 +21,14 @@ in the source distribution for its full text.
#include "CRT.h"
#include "String.h"
#include "ListItem.h"
+#include "Settings.h"
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <assert.h>
-#include <time.h>
-
-#ifndef USE_FUNKY_MODES
-#define USE_FUNKY_MODES 1
-#endif
+#include <sys/time.h>
#define METER_BUFFER_LEN 128
@@ -40,44 +37,52 @@ in the source distribution for its full text.
#include "ProcessList.h"
typedef struct Meter_ Meter;
-typedef struct MeterType_ MeterType;
-typedef struct MeterMode_ MeterMode;
-typedef void(*MeterType_Init)(Meter*);
-typedef void(*MeterType_Done)(Meter*);
-typedef void(*MeterType_SetMode)(Meter*, int);
+typedef void(*Meter_Init)(Meter*);
+typedef void(*Meter_Done)(Meter*);
+typedef void(*Meter_UpdateMode)(Meter*, int);
typedef void(*Meter_SetValues)(Meter*, char*, int);
typedef void(*Meter_Draw)(Meter*, int, int, int);
-struct MeterMode_ {
- Meter_Draw draw;
- const char* uiName;
- int h;
-};
-
-struct MeterType_ {
- Meter_SetValues setValues;
- Object_Display display;
- int mode;
+typedef struct MeterClass_ {
+ ObjectClass super;
+ const Meter_Init init;
+ const Meter_Done done;
+ const Meter_UpdateMode updateMode;
+ const Meter_Draw draw;
+ const Meter_SetValues setValues;
+ const int defaultMode;
int items;
- double total;
- int* attributes;
+ const double total;
+ const int* attributes;
const char* name;
const char* uiName;
const char* caption;
- MeterType_Init init;
- MeterType_Done done;
- MeterType_SetMode setMode;
- Meter_Draw draw;
-};
+} MeterClass;
+
+#define As_Meter(this_) ((MeterClass*)((this_)->super.klass))
+#define Meter_initFn(this_) As_Meter(this_)->init
+#define Meter_init(this_) As_Meter(this_)->init((Meter*)(this_))
+#define Meter_done(this_) As_Meter(this_)->done((Meter*)(this_))
+#define Meter_updateModeFn(this_) As_Meter(this_)->updateMode
+#define Meter_updateMode(this_, m_) As_Meter(this_)->updateMode((Meter*)(this_), m_)
+#define Meter_drawFn(this_) As_Meter(this_)->draw
+#define Meter_doneFn(this_) As_Meter(this_)->done
+#define Meter_setValues(this_, c_, i_) As_Meter(this_)->setValues((Meter*)(this_), c_, i_)
+#define Meter_defaultMode(this_) As_Meter(this_)->defaultMode
+#define Meter_getItems(this_) As_Meter(this_)->items
+#define Meter_setItems(this_, n_) As_Meter(this_)->items = (n_)
+#define Meter_attributes(this_) As_Meter(this_)->attributes
+#define Meter_name(this_) As_Meter(this_)->name
+#define Meter_uiName(this_) As_Meter(this_)->uiName
struct Meter_ {
Object super;
+ Meter_Draw draw;
+
char* caption;
- MeterType* type;
int mode;
int param;
- Meter_Draw draw;
void* drawData;
int h;
ProcessList* pl;
@@ -85,24 +90,26 @@ struct Meter_ {
double total;
};
-#ifdef USE_FUNKY_MODES
-typedef struct GraphData_ {
- time_t time;
- double values[METER_BUFFER_LEN];
-} GraphData;
-#endif
+typedef struct MeterMode_ {
+ Meter_Draw draw;
+ const char* uiName;
+ int h;
+} MeterMode;
typedef enum {
CUSTOM_METERMODE = 0,
BAR_METERMODE,
TEXT_METERMODE,
-#ifdef USE_FUNKY_MODES
GRAPH_METERMODE,
LED_METERMODE,
-#endif
LAST_METERMODE
} MeterModeId;
+typedef struct GraphData_ {
+ struct timeval time;
+ double values[METER_BUFFER_LEN];
+} GraphData;
+
}*/
#ifndef MIN
@@ -112,47 +119,44 @@ typedef enum {
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
-#ifdef DEBUG
-char* METER_CLASS = "Meter";
-#else
-#define METER_CLASS NULL
-#endif
+MeterClass Meter_class = {
+ .super = {
+ .extends = Class(Object)
+ }
+};
-MeterType* Meter_types[] = {
- &CPUMeter,
- &ClockMeter,
- &LoadAverageMeter,
- &LoadMeter,
- &MemoryMeter,
- &SwapMeter,
- &TasksMeter,
- &UptimeMeter,
- &BatteryMeter,
- &HostnameMeter,
- &AllCPUsMeter,
- &AllCPUs2Meter,
- &LeftCPUsMeter,
- &RightCPUsMeter,
- &LeftCPUs2Meter,
- &RightCPUs2Meter,
+MeterClass* Meter_types[] = {
+ &CPUMeter_class,
+ &ClockMeter_class,
+ &LoadAverageMeter_class,
+ &LoadMeter_class,
+ &MemoryMeter_class,
+ &SwapMeter_class,
+ &TasksMeter_class,
+ &UptimeMeter_class,
+ &BatteryMeter_class,
+ &HostnameMeter_class,
+ &AllCPUsMeter_class,
+ &AllCPUs2Meter_class,
+ &LeftCPUsMeter_class,
+ &RightCPUsMeter_class,
+ &LeftCPUs2Meter_class,
+ &RightCPUs2Meter_class,
NULL
};
-Meter* Meter_new(ProcessList* pl, int param, MeterType* type) {
+Meter* Meter_new(ProcessList* pl, int param, MeterClass* type) {
Meter* this = calloc(sizeof(Meter), 1);
- Object_setClass(this, METER_CLASS);
- ((Object*)this)->delete = Meter_delete;
- ((Object*)this)->display = type->display;
+ Object_setClass(this, type);
this->h = 1;
- this->type = type;
this->param = param;
this->pl = pl;
this->values = calloc(sizeof(double), type->items);
this->total = type->total;
this->caption = strdup(type->caption);
- if (this->type->init)
- this->type->init(this);
- Meter_setMode(this, type->mode);
+ if (Meter_initFn(this))
+ Meter_init(this);
+ Meter_setMode(this, type->defaultMode);
return this;
}
@@ -160,8 +164,8 @@ void Meter_delete(Object* cast) {
if (!cast)
return;
Meter* this = (Meter*) cast;
- if (this->type->done) {
- this->type->done(this);
+ if (Meter_doneFn(this)) {
+ Meter_done(this);
}
if (this->drawData)
free(this->drawData);
@@ -176,12 +180,10 @@ void Meter_setCaption(Meter* this, const char* caption) {
}
static inline void Meter_displayBuffer(Meter* this, char* buffer, RichString* out) {
- MeterType* type = this->type;
- Object_Display display = ((Object*)this)->display;
- if (display) {
- display((Object*)this, out);
+ if (Object_displayFn(this)) {
+ Object_display(this, out);
} else {
- RichString_write(out, CRT_colors[type->attributes[0]], buffer);
+ RichString_write(out, CRT_colors[Meter_attributes(this)[0]], buffer);
}
}
@@ -191,10 +193,10 @@ void Meter_setMode(Meter* this, int modeIndex) {
if (!modeIndex)
modeIndex = 1;
assert(modeIndex < LAST_METERMODE);
- if (this->type->mode == 0) {
- this->draw = this->type->draw;
- if (this->type->setMode)
- this->type->setMode(this, modeIndex);
+ if (Meter_defaultMode(this) == CUSTOM_METERMODE) {
+ this->draw = Meter_drawFn(this);
+ if (Meter_updateModeFn(this))
+ Meter_updateMode(this, modeIndex);
} else {
assert(modeIndex >= 1);
if (this->drawData)
@@ -209,7 +211,6 @@ void Meter_setMode(Meter* this, int modeIndex) {
}
ListItem* Meter_toListItem(Meter* this) {
- MeterType* type = this->type;
char mode[21];
if (this->mode)
snprintf(mode, 20, " [%s]", Meter_modes[this->mode]->uiName);
@@ -221,16 +222,15 @@ ListItem* Meter_toListItem(Meter* this) {
else
number[0] = '\0';
char buffer[51];
- snprintf(buffer, 50, "%s%s%s", type->uiName, number, mode);
+ snprintf(buffer, 50, "%s%s%s", Meter_uiName(this), number, mode);
return ListItem_new(buffer, 0);
}
/* ---------- TextMeterMode ---------- */
static void TextMeterMode_draw(Meter* this, int x, int y, int w) {
- MeterType* type = this->type;
char buffer[METER_BUFFER_LEN];
- type->setValues(this, buffer, METER_BUFFER_LEN - 1);
+ Meter_setValues(this, buffer, METER_BUFFER_LEN - 1);
attrset(CRT_colors[METER_TEXT]);
mvaddstr(y, x, this->caption);
@@ -250,9 +250,8 @@ static void TextMeterMode_draw(Meter* this, int x, int y, int w) {
static char BarMeterMode_characters[] = "|#*@$%&";
static void BarMeterMode_draw(Meter* this, int x, int y, int w) {
- MeterType* type = this->type;
char buffer[METER_BUFFER_LEN];
- type->setValues(this, buffer, METER_BUFFER_LEN - 1);
+ Meter_setValues(this, buffer, METER_BUFFER_LEN - 1);
w -= 2;
attrset(CRT_colors[METER_TEXT]);
@@ -282,7 +281,8 @@ static void BarMeterMode_draw(Meter* this, int x, int y, int w) {
// First draw in the bar[] buffer...
int offset = 0;
- for (int i = 0; i < type->items; i++) {
+ int items = Meter_getItems(this);
+ for (int i = 0; i < items; i++) {
double value = this->values[i];
value = MAX(value, 0);
value = MIN(value, this->total);
@@ -307,8 +307,8 @@ static void BarMeterMode_draw(Meter* this, int x, int y, int w) {
// ...then print the buffer.
offset = 0;
- for (int i = 0; i < type->items; i++) {
- attrset(CRT_colors[type->attributes[i]]);
+ for (int i = 0; i < items; i++) {
+ attrset(CRT_colors[Meter_attributes(this)[i]]);
mvaddnstr(y, x + offset, bar + offset, blockSizes[i]);
offset += blockSizes[i];
offset = MAX(offset, 0);
@@ -323,8 +323,6 @@ static void BarMeterMode_draw(Meter* this, int x, int y, int w) {
attrset(CRT_colors[RESET_COLOR]);
}
-#ifdef USE_FUNKY_MODES
-
/* ---------- GraphMeterMode ---------- */
#define DrawDot(a,y,c) do { attrset(a); mvaddch(y, x+k, c); } while(0)
@@ -347,19 +345,21 @@ static void GraphMeterMode_draw(Meter* this, int x, int y, int w) {
GraphData* data = (GraphData*) this->drawData;
const int nValues = METER_BUFFER_LEN;
- time_t now = time(NULL);
- if (now > data->time) {
- data->time = now;
+ struct timeval now;
+ gettimeofday(&now, NULL);
+ if (!timercmp(&now, &(data->time), <)) {
+ struct timeval delay = { .tv_sec = (int)(DEFAULT_DELAY/10), .tv_usec = (DEFAULT_DELAY-((int)(DEFAULT_DELAY/10)*10)) * 100000 };
+ timeradd(&now, &delay, &(data->time));
for (int i = 0; i < nValues - 1; i++)
data->values[i] = data->values[i+1];
- MeterType* type = this->type;
char buffer[nValues];
- type->setValues(this, buffer, nValues - 1);
+ Meter_setValues(this, buffer, nValues - 1);
double value = 0.0;
- for (int i = 0; i < type->items; i++)
+ int items = Meter_getItems(this);
+ for (int i = 0; i < items; i++)
value += this->values[i];
value /= this->total;
data->values[nValues - 1] = value;
@@ -383,28 +383,39 @@ static void GraphMeterMode_draw(Meter* this, int x, int y, int w) {
/* ---------- LEDMeterMode ---------- */
-static const char* LEDMeterMode_digits[3][10] = {
+static const char* LEDMeterMode_digitsAscii[3][10] = {
{ " __ "," "," __ "," __ "," "," __ "," __ "," __ "," __ "," __ "},
{ "| |"," |"," __|"," __|","|__|","|__ ","|__ "," |","|__|","|__|"},
{ "|__|"," |","|__ "," __|"," |"," __|","|__|"," |","|__|"," __|"},
};
+static const char* LEDMeterMode_digitsUtf8[3][10] = {
+ { "┌──┐"," ┐ ","╶──┐","╶──┐","╷ ╷","┌──╴","┌──╴","╶──┐","┌──┐","┌──┐"},
+ { "│ │"," │ ","┌──┘"," ──┤","└──┤","└──┐","├──┐"," │","├──┤","└──┤"},
+ { "└──┘"," ╵ ","└──╴","╶──┘"," ╵","╶──┘","└──┘"," ╵","└──┘"," ──┘"},
+};
+
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]);
+ if (CRT_utf8) {
+ for (int i = 0; i < 3; i++)
+ mvaddstr(y+i, x, LEDMeterMode_digitsUtf8[i][n]);
+ } else {
+ for (int i = 0; i < 3; i++)
+ mvaddstr(y+i, x, LEDMeterMode_digitsAscii[i][n]);
+ }
}
static void LEDMeterMode_draw(Meter* this, int x, int y, int w) {
(void) w;
- MeterType* type = this->type;
char buffer[METER_BUFFER_LEN];
- type->setValues(this, buffer, METER_BUFFER_LEN - 1);
+ Meter_setValues(this, buffer, METER_BUFFER_LEN - 1);
RichString_begin(out);
Meter_displayBuffer(this, buffer, &out);
+ int yText = CRT_utf8 ? y+1 : y+2;
attrset(CRT_colors[LED_COLOR]);
- mvaddstr(y+2, x, this->caption);
+ mvaddstr(yText, x, this->caption);
int xx = x + strlen(this->caption);
int len = RichString_sizeVal(out);
for (int i = 0; i < len; i++) {
@@ -413,7 +424,7 @@ static void LEDMeterMode_draw(Meter* this, int x, int y, int w) {
LEDMeterMode_drawDigit(xx, y, c-48);
xx += 4;
} else {
- mvaddch(y+2, xx, c);
+ mvaddch(yText, xx, c);
xx += 1;
}
}
@@ -421,8 +432,6 @@ static void LEDMeterMode_draw(Meter* this, int x, int y, int w) {
RichString_end(out);
}
-#endif
-
static MeterMode BarMeterMode = {
.uiName = "Bar",
.h = 1,
@@ -435,8 +444,6 @@ static MeterMode TextMeterMode = {
.draw = TextMeterMode_draw,
};
-#ifdef USE_FUNKY_MODES
-
static MeterMode GraphMeterMode = {
.uiName = "Graph",
.h = 3,
@@ -449,15 +456,11 @@ static MeterMode LEDMeterMode = {
.draw = LEDMeterMode_draw,
};
-#endif
-
MeterMode* Meter_modes[] = {
NULL,
&BarMeterMode,
&TextMeterMode,
-#ifdef USE_FUNKY_MODES
&GraphMeterMode,
&LEDMeterMode,
-#endif
NULL
};
diff --git a/Meter.h b/Meter.h
index 08827240..64668c4b 100644
--- a/Meter.h
+++ b/Meter.h
@@ -9,54 +9,58 @@ Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
-#ifndef USE_FUNKY_MODES
-#define USE_FUNKY_MODES 1
-#endif
-
#define METER_BUFFER_LEN 128
#include "ListItem.h"
#include "ProcessList.h"
typedef struct Meter_ Meter;
-typedef struct MeterType_ MeterType;
-typedef struct MeterMode_ MeterMode;
-typedef void(*MeterType_Init)(Meter*);
-typedef void(*MeterType_Done)(Meter*);
-typedef void(*MeterType_SetMode)(Meter*, int);
+typedef void(*Meter_Init)(Meter*);
+typedef void(*Meter_Done)(Meter*);
+typedef void(*Meter_UpdateMode)(Meter*, int);
typedef void(*Meter_SetValues)(Meter*, char*, int);
typedef void(*Meter_Draw)(Meter*, int, int, int);
-struct MeterMode_ {
- Meter_Draw draw;
- const char* uiName;
- int h;
-};
-
-struct MeterType_ {
- Meter_SetValues setValues;
- Object_Display display;
- int mode;
+typedef struct MeterClass_ {
+ ObjectClass super;
+ const Meter_Init init;
+ const Meter_Done done;
+ const Meter_UpdateMode updateMode;
+ const Meter_Draw draw;
+ const Meter_SetValues setValues;
+ const int defaultMode;
int items;
- double total;
- int* attributes;
+ const double total;
+ const int* attributes;
const char* name;
const char* uiName;
const char* caption;
- MeterType_Init init;
- MeterType_Done done;
- MeterType_SetMode setMode;
- Meter_Draw draw;
-};
+} MeterClass;
+
+#define As_Meter(this_) ((MeterClass*)((this_)->super.klass))
+#define Meter_initFn(this_) As_Meter(this_)->init
+#define Meter_init(this_) As_Meter(this_)->init((Meter*)(this_))
+#define Meter_done(this_) As_Meter(this_)->done((Meter*)(this_))
+#define Meter_updateModeFn(this_) As_Meter(this_)->updateMode
+#define Meter_updateMode(this_, m_) As_Meter(this_)->updateMode((Meter*)(this_), m_)
+#define Meter_drawFn(this_) As_Meter(this_)->draw
+#define Meter_doneFn(this_) As_Meter(this_)->done
+#define Meter_setValues(this_, c_, i_) As_Meter(this_)->setValues((Meter*)(this_), c_, i_)
+#define Meter_defaultMode(this_) As_Meter(this_)->defaultMode
+#define Meter_getItems(this_) As_Meter(this_)->items
+#define Meter_setItems(this_, n_) As_Meter(this_)->items = (n_)
+#define Meter_attributes(this_) As_Meter(this_)->attributes
+#define Meter_name(this_) As_Meter(this_)->name
+#define Meter_uiName(this_) As_Meter(this_)->uiName
struct Meter_ {
Object super;
+ Meter_Draw draw;
+
char* caption;
- MeterType* type;
int mode;
int param;
- Meter_Draw draw;
void* drawData;
int h;
ProcessList* pl;
@@ -64,24 +68,26 @@ struct Meter_ {
double total;
};
-#ifdef USE_FUNKY_MODES
-typedef struct GraphData_ {
- time_t time;
- double values[METER_BUFFER_LEN];
-} GraphData;
-#endif
+typedef struct MeterMode_ {
+ Meter_Draw draw;
+ const char* uiName;
+ int h;
+} MeterMode;
typedef enum {
CUSTOM_METERMODE = 0,
BAR_METERMODE,
TEXT_METERMODE,
-#ifdef USE_FUNKY_MODES
GRAPH_METERMODE,
LED_METERMODE,
-#endif
LAST_METERMODE
} MeterModeId;
+typedef struct GraphData_ {
+ struct timeval time;
+ double values[METER_BUFFER_LEN];
+} GraphData;
+
#ifndef MIN
#define MIN(a,b) ((a)<(b)?(a):(b))
@@ -90,15 +96,11 @@ typedef enum {
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
-#ifdef DEBUG
-extern char* METER_CLASS;
-#else
-#define METER_CLASS NULL
-#endif
+extern MeterClass Meter_class;
-extern MeterType* Meter_types[];
+extern MeterClass* Meter_types[];
-Meter* Meter_new(ProcessList* pl, int param, MeterType* type);
+Meter* Meter_new(ProcessList* pl, int param, MeterClass* type);
void Meter_delete(Object* cast);
@@ -112,20 +114,12 @@ ListItem* Meter_toListItem(Meter* this);
/* ---------- BarMeterMode ---------- */
-#ifdef USE_FUNKY_MODES
-
/* ---------- GraphMeterMode ---------- */
#define DrawDot(a,y,c) do { attrset(a); mvaddch(y, x+k, c); } while(0)
/* ---------- LEDMeterMode ---------- */
-#endif
-
-#ifdef USE_FUNKY_MODES
-
-#endif
-
extern MeterMode* Meter_modes[];
#endif
diff --git a/MetersPanel.c b/MetersPanel.c
index 8302c5a7..0e755f52 100644
--- a/MetersPanel.c
+++ b/MetersPanel.c
@@ -92,16 +92,22 @@ static HandlerResult MetersPanel_eventHandler(Panel* super, int ch) {
return result;
}
+PanelClass MetersPanel_class = {
+ .super = {
+ .extends = Class(Panel),
+ .delete = MetersPanel_delete
+ },
+ .eventHandler = MetersPanel_eventHandler
+};
+
MetersPanel* MetersPanel_new(Settings* settings, const char* header, Vector* meters, ScreenManager* scr) {
- MetersPanel* this = (MetersPanel*) malloc(sizeof(MetersPanel));
+ MetersPanel* this = AllocThis(MetersPanel);
Panel* super = (Panel*) this;
- Panel_init(super, 1, 1, 1, 1, LISTITEM_CLASS, true);
- ((Object*)this)->delete = MetersPanel_delete;
+ Panel_init(super, 1, 1, 1, 1, Class(ListItem), true);
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);
diff --git a/MetersPanel.h b/MetersPanel.h
index 4aa2c3d4..56c83e77 100644
--- a/MetersPanel.h
+++ b/MetersPanel.h
@@ -22,6 +22,8 @@ typedef struct MetersPanel_ {
} MetersPanel;
+extern PanelClass MetersPanel_class;
+
MetersPanel* MetersPanel_new(Settings* settings, const char* header, Vector* meters, ScreenManager* scr);
#endif
diff --git a/Object.c b/Object.c
index 395bd10a..2399e50c 100644
--- a/Object.c
+++ b/Object.c
@@ -1,51 +1,62 @@
/*
htop - Object.c
-(C) 2004-2011 Hisham H. Muhammad
+(C) 2004-2012 Hisham H. Muhammad
Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
#include "Object.h"
-#include "CRT.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdbool.h>
-
/*{
#include "RichString.h"
-#ifndef DEBUG
-#define Object_setClass(obj, class)
-#endif
-
typedef struct Object_ Object;
typedef void(*Object_Display)(Object*, RichString*);
typedef int(*Object_Compare)(const void*, const void*);
typedef void(*Object_Delete)(Object*);
+#define Object_getClass(obj_) ((Object*)(obj_))->klass
+#define Object_setClass(obj_, class_) Object_getClass(obj_) = (ObjectClass*) class_
+
+#define Object_delete(obj_) Object_getClass(obj_)->delete((Object*)(obj_))
+#define Object_displayFn(obj_) Object_getClass(obj_)->display
+#define Object_display(obj_, str_) Object_getClass(obj_)->display((Object*)(obj_), str_)
+#define Object_compare(obj_, other_) Object_getClass(obj_)->compare((const void*)(obj_), other_)
+
+#define Class(class_) ((ObjectClass*)(&(class_ ## _class)))
+
+#define AllocThis(class_) (class_*) malloc(sizeof(class_)); Object_setClass(this, Class(class_));
+
+typedef struct ObjectClass_ {
+ const void* extends;
+ const Object_Display display;
+ const Object_Delete delete;
+ const Object_Compare compare;
+} ObjectClass;
+
struct Object_ {
- #ifdef DEBUG
- char* class;
- #endif
- Object_Display display;
- Object_Delete delete;
+ ObjectClass* klass;
};
-}*/
-#ifdef DEBUG
-char* OBJECT_CLASS = "Object";
+}*/
-#else
-#define OBJECT_CLASS NULL
-#endif
+ObjectClass Object_class = {
+ .extends = NULL
+};
#ifdef DEBUG
-void Object_setClass(void* this, char* class) {
- ((Object*)this)->class = class;
+bool Object_isA(Object* o, const ObjectClass* klass) {
+ if (!o)
+ return false;
+ const ObjectClass* type = o->klass;
+ while (type) {
+ if (type == klass)
+ return true;
+ type = type->extends;
+ }
+ return false;
}
#endif
diff --git a/Object.h b/Object.h
index 8ebc1d50..bfabe6f8 100644
--- a/Object.h
+++ b/Object.h
@@ -4,41 +4,48 @@
#define HEADER_Object
/*
htop - Object.h
-(C) 2004-2011 Hisham H. Muhammad
+(C) 2004-2012 Hisham H. Muhammad
Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
#include "RichString.h"
-#ifndef DEBUG
-#define Object_setClass(obj, class)
-#endif
-
typedef struct Object_ Object;
typedef void(*Object_Display)(Object*, RichString*);
typedef int(*Object_Compare)(const void*, const void*);
typedef void(*Object_Delete)(Object*);
+#define Object_getClass(obj_) ((Object*)(obj_))->klass
+#define Object_setClass(obj_, class_) Object_getClass(obj_) = (ObjectClass*) class_
+
+#define Object_delete(obj_) Object_getClass(obj_)->delete((Object*)(obj_))
+#define Object_displayFn(obj_) Object_getClass(obj_)->display
+#define Object_display(obj_, str_) Object_getClass(obj_)->display((Object*)(obj_), str_)
+#define Object_compare(obj_, other_) Object_getClass(obj_)->compare((const void*)(obj_), other_)
+
+#define Class(class_) ((ObjectClass*)(&(class_ ## _class)))
+
+#define AllocThis(class_) (class_*) malloc(sizeof(class_)); Object_setClass(this, Class(class_));
+
+typedef struct ObjectClass_ {
+ const void* extends;
+ const Object_Display display;
+ const Object_Delete delete;
+ const Object_Compare compare;
+} ObjectClass;
+
struct Object_ {
- #ifdef DEBUG
- char* class;
- #endif
- Object_Display display;
- Object_Delete delete;
+ ObjectClass* klass;
};
-#ifdef DEBUG
-extern char* OBJECT_CLASS;
-#else
-#define OBJECT_CLASS NULL
-#endif
+extern ObjectClass Object_class;
#ifdef DEBUG
-void Object_setClass(void* this, char* class);
+bool Object_isA(Object* o, const ObjectClass* klass);
#endif
diff --git a/OpenFilesScreen.c b/OpenFilesScreen.c
index 30d02af0..e33f2e76 100644
--- a/OpenFilesScreen.c
+++ b/OpenFilesScreen.c
@@ -57,7 +57,7 @@ static int ofsEvents[] = {KEY_F(3), KEY_F(4), KEY_F(5), 27};
OpenFilesScreen* OpenFilesScreen_new(Process* process) {
OpenFilesScreen* this = (OpenFilesScreen*) malloc(sizeof(OpenFilesScreen));
this->process = process;
- this->display = Panel_new(0, 1, COLS, LINES-3, LISTITEM_CLASS, false, ListItem_compare);
+ this->display = Panel_new(0, 1, COLS, LINES-3, false, Class(ListItem));
if (Process_isThread(process))
this->pid = process->tgid;
else
@@ -170,7 +170,7 @@ void OpenFilesScreen_run(OpenFilesScreen* this) {
FunctionBar* bar = FunctionBar_new(ofsFunctions, ofsKeys, ofsEvents);
IncSet* inc = IncSet_new(bar);
- Vector* lines = Vector_new(panel->items->type, true, DEFAULT_SIZE, ListItem_compare);
+ Vector* lines = Vector_new(panel->items->type, true, DEFAULT_SIZE);
OpenFilesScreen_scan(this, lines, inc);
OpenFilesScreen_draw(this, inc);
@@ -234,6 +234,7 @@ void OpenFilesScreen_run(OpenFilesScreen* this) {
}
}
+ Vector_delete(lines);
FunctionBar_delete((Object*)bar);
IncSet_delete(inc);
}
diff --git a/Panel.c b/Panel.c
index d0f69bfd..8a40ab61 100644
--- a/Panel.c
+++ b/Panel.c
@@ -38,8 +38,18 @@ typedef enum HandlerResult_ {
typedef HandlerResult(*Panel_EventHandler)(Panel*, int);
+typedef struct PanelClass_ {
+ const ObjectClass super;
+ const Panel_EventHandler eventHandler;
+} PanelClass;
+
+#define As_Panel(this_) ((PanelClass*)((this_)->super.klass))
+#define Panel_eventHandlerFn(this_) As_Panel(this_)->eventHandler
+#define Panel_eventHandler(this_, ev_) As_Panel(this_)->eventHandler((Panel*)(this_), ev_)
+
struct Panel_ {
Object super;
+ PanelClass* class;
int x, y, w, h;
WINDOW* window;
Vector* items;
@@ -49,7 +59,6 @@ struct Panel_ {
int oldSelected;
bool needsRedraw;
RichString header;
- Panel_EventHandler eventHandler;
char* eventHandlerBuffer;
};
@@ -62,22 +71,24 @@ struct Panel_ {
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
-#ifdef DEBUG
-char* PANEL_CLASS = "Panel";
-#else
-#define PANEL_CLASS NULL
-#endif
-
#define KEY_CTRLN 0016 /* control-n key */
#define KEY_CTRLP 0020 /* control-p key */
#define KEY_CTRLF 0006 /* control-f key */
#define KEY_CTRLB 0002 /* control-b key */
-Panel* Panel_new(int x, int y, int w, int h, char* type, bool owner, Object_Compare compare) {
+PanelClass Panel_class = {
+ .super = {
+ .extends = Class(Object),
+ .delete = Panel_delete
+ },
+ .eventHandler = Panel_selectByTyping
+};
+
+Panel* Panel_new(int x, int y, int w, int h, bool owner, ObjectClass* type) {
Panel* this;
this = malloc(sizeof(Panel));
+ Object_setClass(this, Class(Panel));
Panel_init(this, x, y, w, h, type, owner);
- this->items->compare = compare;
return this;
}
@@ -87,17 +98,13 @@ void Panel_delete(Object* cast) {
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;
+void Panel_init(Panel* this, int x, int y, int w, int h, ObjectClass* type, bool owner) {
this->x = x;
this->y = y;
this->w = w;
this->h = h;
- this->eventHandler = NULL;
this->eventHandlerBuffer = NULL;
- this->items = Vector_new(type, owner, DEFAULT_SIZE, ListItem_compare);
+ this->items = Vector_new(type, owner, DEFAULT_SIZE);
this->scrollV = 0;
this->scrollH = 0;
this->selected = 0;
@@ -129,10 +136,6 @@ inline void Panel_setHeader(Panel* this, const char* header) {
this->needsRedraw = true;
}
-void Panel_setEventHandler(Panel* this, Panel_EventHandler eh) {
- this->eventHandler = eh;
-}
-
void Panel_move(Panel* this, int x, int y) {
assert (this != NULL);
@@ -238,8 +241,8 @@ void Panel_setSelected(Panel* this, int selected) {
selected = MAX(0, MIN(Vector_size(this->items) - 1, selected));
this->selected = selected;
- if (this->eventHandler) {
- this->eventHandler(this, EVENT_SETSELECTED);
+ if (Panel_eventHandlerFn(this)) {
+ Panel_eventHandler(this, EVENT_SETSELECTED);
}
}
@@ -293,7 +296,7 @@ void Panel_draw(Panel* this, bool focus) {
for(int i = first, j = 0; j < this->h && i < last; i++, j++) {
Object* itemObj = Vector_get(this->items, i);
RichString_begin(item);
- itemObj->display(itemObj, &item);
+ Object_display(itemObj, &item);
int itemLen = RichString_sizeVal(item);
int amt = MIN(itemLen - scrollH, this->w);
if (i == this->selected) {
@@ -317,11 +320,11 @@ void Panel_draw(Panel* this, bool focus) {
} else {
Object* oldObj = Vector_get(this->items, this->oldSelected);
RichString_begin(old);
- oldObj->display(oldObj, &old);
+ Object_display(oldObj, &old);
int oldLen = RichString_sizeVal(old);
Object* newObj = Vector_get(this->items, this->selected);
RichString_begin(new);
- newObj->display(newObj, &new);
+ Object_display(newObj, &new);
int newLen = RichString_sizeVal(new);
mvhline(y+ this->oldSelected - this->scrollV, x+0, ' ', this->w);
if (scrollH < oldLen)
diff --git a/Panel.h b/Panel.h
index 3f355837..16f0c2fe 100644
--- a/Panel.h
+++ b/Panel.h
@@ -26,8 +26,18 @@ typedef enum HandlerResult_ {
typedef HandlerResult(*Panel_EventHandler)(Panel*, int);
+typedef struct PanelClass_ {
+ const ObjectClass super;
+ const Panel_EventHandler eventHandler;
+} PanelClass;
+
+#define As_Panel(this_) ((PanelClass*)((this_)->super.klass))
+#define Panel_eventHandlerFn(this_) As_Panel(this_)->eventHandler
+#define Panel_eventHandler(this_, ev_) As_Panel(this_)->eventHandler((Panel*)(this_), ev_)
+
struct Panel_ {
Object super;
+ PanelClass* class;
int x, y, w, h;
WINDOW* window;
Vector* items;
@@ -37,7 +47,6 @@ struct Panel_ {
int oldSelected;
bool needsRedraw;
RichString header;
- Panel_EventHandler eventHandler;
char* eventHandlerBuffer;
};
@@ -49,22 +58,18 @@ struct Panel_ {
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
-#ifdef DEBUG
-extern char* PANEL_CLASS;
-#else
-#define PANEL_CLASS NULL
-#endif
-
#define KEY_CTRLN 0016 /* control-n key */
#define KEY_CTRLP 0020 /* control-p key */
#define KEY_CTRLF 0006 /* control-f key */
#define KEY_CTRLB 0002 /* control-b key */
-Panel* Panel_new(int x, int y, int w, int h, char* type, bool owner, Object_Compare compare);
+extern PanelClass Panel_class;
+
+Panel* Panel_new(int x, int y, int w, int h, bool owner, ObjectClass* type);
void Panel_delete(Object* cast);
-void Panel_init(Panel* this, int x, int y, int w, int h, char* type, bool owner);
+void Panel_init(Panel* this, int x, int y, int w, int h, ObjectClass* type, bool owner);
void Panel_done(Panel* this);
@@ -72,8 +77,6 @@ RichString* Panel_getHeader(Panel* this);
extern void Panel_setHeader(Panel* this, const 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);
diff --git a/Process.c b/Process.c
index 99e9f13b..af56b704 100644
--- a/Process.c
+++ b/Process.c
@@ -175,12 +175,6 @@ typedef struct Process_ {
}*/
-#ifdef DEBUG
-char* PROCESS_CLASS = "Process";
-#else
-#define PROCESS_CLASS NULL
-#endif
-
const char *Process_fieldNames[] = {
"", "PID", "Command", "STATE", "PPID", "PGRP", "SESSION",
"TTY_NR", "TPGID", "FLAGS", "MINFLT", "CMINFLT", "MAJFLT", "CMAJFLT",
@@ -564,11 +558,16 @@ void Process_delete(Object* cast) {
free(this);
}
+ObjectClass Process_class = {
+ .extends = Class(Object),
+ .display = Process_display,
+ .delete = Process_delete,
+ .compare = Process_compare
+};
+
Process* Process_new(struct ProcessList_ *pl) {
Process* this = calloc(sizeof(Process), 1);
- Object_setClass(this, PROCESS_CLASS);
- ((Object*)this)->display = Process_display;
- ((Object*)this)->delete = Process_delete;
+ Object_setClass(this, Class(Process));
this->pid = 0;
this->pl = pl;
this->tag = false;
diff --git a/Process.h b/Process.h
index c5f59346..c875d86e 100644
--- a/Process.h
+++ b/Process.h
@@ -153,12 +153,6 @@ typedef struct Process_ {
} Process;
-#ifdef DEBUG
-extern char* PROCESS_CLASS;
-#else
-#define PROCESS_CLASS NULL
-#endif
-
extern const char *Process_fieldNames[];
extern const char *Process_fieldTitles[];
@@ -172,6 +166,8 @@ void Process_getMaxPid();
void Process_delete(Object* cast);
+extern ObjectClass Process_class;
+
Process* Process_new(struct ProcessList_ *pl);
void Process_toggleTag(Process* this);
diff --git a/ProcessList.c b/ProcessList.c
index 0138919a..99a6512c 100644
--- a/ProcessList.c
+++ b/ProcessList.c
@@ -68,12 +68,6 @@ typedef enum TreeStr_ {
TREE_STR_COUNT
} TreeStr;
-typedef enum TreeType_ {
- TREE_TYPE_AUTO,
- TREE_TYPE_ASCII,
- TREE_TYPE_UTF8,
-} TreeType;
-
typedef struct CPUData_ {
unsigned long long int totalTime;
unsigned long long int userTime;
@@ -184,13 +178,13 @@ const char *ProcessList_treeStrUtf8[TREE_STR_COUNT] = {
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList) {
ProcessList* this;
this = calloc(sizeof(ProcessList), 1);
- this->processes = Vector_new(PROCESS_CLASS, true, DEFAULT_SIZE, Process_compare);
+ this->processes = Vector_new(Class(Process), true, DEFAULT_SIZE);
this->processTable = Hashtable_new(140, false);
this->usersTable = usersTable;
this->pidWhiteList = pidWhiteList;
/* tree-view auxiliary buffers */
- this->processes2 = Vector_new(PROCESS_CLASS, true, DEFAULT_SIZE, Process_compare);
+ this->processes2 = Vector_new(Class(Process), true, DEFAULT_SIZE);
FILE* file = fopen(PROCSTATFILE, "r");
if (file == NULL) {
@@ -243,6 +237,9 @@ ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList) {
this->treeStr = NULL;
this->following = -1;
+ if (CRT_utf8)
+ this->treeStr = CRT_utf8 ? ProcessList_treeStrUtf8 : ProcessList_treeStrAscii;
+
return this;
}
@@ -312,7 +309,7 @@ int ProcessList_size(ProcessList* this) {
}
static void ProcessList_buildTree(ProcessList* this, pid_t pid, int level, int indent, int direction, bool show) {
- Vector* children = Vector_new(PROCESS_CLASS, false, DEFAULT_SIZE, Process_compare);
+ Vector* children = Vector_new(Class(Process), false, DEFAULT_SIZE);
for (int i = Vector_size(this->processes) - 1; i >= 0; i--) {
Process* process = (Process*) (Vector_get(this->processes, i));
diff --git a/ProcessList.h b/ProcessList.h
index 7385a294..e410ae25 100644
--- a/ProcessList.h
+++ b/ProcessList.h
@@ -51,12 +51,6 @@ typedef enum TreeStr_ {
TREE_STR_COUNT
} TreeStr;
-typedef enum TreeType_ {
- TREE_TYPE_AUTO,
- TREE_TYPE_ASCII,
- TREE_TYPE_UTF8,
-} TreeType;
-
typedef struct CPUData_ {
unsigned long long int totalTime;
unsigned long long int userTime;
diff --git a/ScreenManager.c b/ScreenManager.c
index 777e9de3..9218909b 100644
--- a/ScreenManager.c
+++ b/ScreenManager.c
@@ -52,8 +52,8 @@ ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation ori
this->y2 = y2;
this->fuBar = NULL;
this->orientation = orientation;
- this->panels = Vector_new(PANEL_CLASS, owner, DEFAULT_SIZE, NULL);
- this->fuBars = Vector_new(FUNCTIONBAR_CLASS, true, DEFAULT_SIZE, NULL);
+ this->panels = Vector_new(Class(Panel), owner, DEFAULT_SIZE);
+ this->fuBars = Vector_new(Class(FunctionBar), true, DEFAULT_SIZE);
this->panelCount = 0;
this->header = header;
this->owner = owner;
@@ -184,8 +184,8 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) {
}
}
- if (panelFocus->eventHandler) {
- HandlerResult result = panelFocus->eventHandler(panelFocus, ch);
+ if (Panel_eventHandlerFn(panelFocus)) {
+ HandlerResult result = Panel_eventHandler(panelFocus, ch);
if (result == HANDLED) {
continue;
} else if (result == BREAK_LOOP) {
diff --git a/SignalsPanel.c b/SignalsPanel.c
index e1a88b57..a52e5289 100644
--- a/SignalsPanel.c
+++ b/SignalsPanel.c
@@ -5,6 +5,7 @@ Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
+#include "Panel.h"
#include "SignalsPanel.h"
#include "ListItem.h"
@@ -16,26 +17,14 @@ in the source distribution for its full text.
#include <ctype.h>
/*{
-#include "Panel.h"
typedef struct SignalItem_ {
const char* name;
int number;
} SignalItem;
-typedef struct SignalsPanel_ {
- Panel super;
-} SignalsPanel;
-
}*/
-static void SignalsPanel_delete(Object* object) {
- Panel* super = (Panel*) object;
- SignalsPanel* this = (SignalsPanel*) object;
- Panel_done(super);
- free(this);
-}
-
static SignalItem signals[] = {
{ .name = " 0 Cancel", .number = 0 },
{ .name = " 1 SIGHUP", .number = 1 },
@@ -73,21 +62,11 @@ static SignalItem signals[] = {
{ .name = "31 SIGSYS", .number = 31 },
};
-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, LISTITEM_CLASS, true);
- ((Object*)this)->delete = SignalsPanel_delete;
-
+Panel* SignalsPanel_new() {
+ Panel* this = Panel_new(1, 1, 1, 1, true, Class(ListItem));
for(unsigned int i = 0; i < sizeof(signals)/sizeof(SignalItem); i++)
- Panel_set(super, i, (Object*) ListItem_new(signals[i].name, signals[i].number));
- SignalsPanel_reset(this);
+ Panel_set(this, i, (Object*) ListItem_new(signals[i].name, signals[i].number));
+ Panel_setHeader(this, "Send signal:");
+ Panel_setSelected(this, 16); // 16th item is SIGTERM
return this;
}
-
-void SignalsPanel_reset(SignalsPanel* this) {
- Panel* super = (Panel*) this;
-
- Panel_setHeader(super, "Send signal:");
- Panel_setSelected(super, 16); // 16th item is SIGTERM
-}
diff --git a/SignalsPanel.h b/SignalsPanel.h
index 598c70fb..da753546 100644
--- a/SignalsPanel.h
+++ b/SignalsPanel.h
@@ -9,20 +9,13 @@ Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
-#include "Panel.h"
typedef struct SignalItem_ {
const char* name;
int number;
} SignalItem;
-typedef struct SignalsPanel_ {
- Panel super;
-} SignalsPanel;
-
-SignalsPanel* SignalsPanel_new(int x, int y, int w, int h);
-
-void SignalsPanel_reset(SignalsPanel* this);
+Panel* SignalsPanel_new();
#endif
diff --git a/SwapMeter.c b/SwapMeter.c
index 48a7dae0..df6dd666 100644
--- a/SwapMeter.c
+++ b/SwapMeter.c
@@ -59,10 +59,14 @@ static void SwapMeter_display(Object* cast, RichString* out) {
RichString_append(out, CRT_colors[METER_VALUE], buffer);
}
-MeterType SwapMeter = {
+MeterClass SwapMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = SwapMeter_display,
+ },
.setValues = SwapMeter_setValues,
- .display = SwapMeter_display,
- .mode = BAR_METERMODE,
+ .defaultMode = BAR_METERMODE,
.items = 1,
.total = 100.0,
.attributes = SwapMeter_attributes,
diff --git a/SwapMeter.h b/SwapMeter.h
index 5b5c9403..bb46a38c 100644
--- a/SwapMeter.h
+++ b/SwapMeter.h
@@ -18,6 +18,6 @@ in the source distribution for its full text.
extern int SwapMeter_attributes[];
/* NOTE: Value is in kilobytes */
-extern MeterType SwapMeter;
+extern MeterClass SwapMeter_class;
#endif
diff --git a/TasksMeter.c b/TasksMeter.c
index cfe03093..b6b1aff9 100644
--- a/TasksMeter.c
+++ b/TasksMeter.c
@@ -55,10 +55,14 @@ static void TasksMeter_display(Object* cast, RichString* out) {
RichString_append(out, CRT_colors[METER_TEXT], " running");
}
-MeterType TasksMeter = {
+MeterClass TasksMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete,
+ .display = TasksMeter_display,
+ },
.setValues = TasksMeter_setValues,
- .display = TasksMeter_display,
- .mode = TEXT_METERMODE,
+ .defaultMode = TEXT_METERMODE,
.items = 1,
.total = 100.0,
.attributes = TasksMeter_attributes,
diff --git a/TasksMeter.h b/TasksMeter.h
index cc6a60ab..a7a0db70 100644
--- a/TasksMeter.h
+++ b/TasksMeter.h
@@ -13,6 +13,6 @@ in the source distribution for its full text.
extern int TasksMeter_attributes[];
-extern MeterType TasksMeter;
+extern MeterClass TasksMeter_class;
#endif
diff --git a/TraceScreen.c b/TraceScreen.c
index 5fc48023..89581a9b 100644
--- a/TraceScreen.c
+++ b/TraceScreen.c
@@ -46,7 +46,7 @@ static int tsEvents[] = {KEY_F(3), KEY_F(4), KEY_F(8), KEY_F(9), 27};
TraceScreen* TraceScreen_new(Process* process) {
TraceScreen* this = (TraceScreen*) malloc(sizeof(TraceScreen));
this->process = process;
- this->display = Panel_new(0, 1, COLS, LINES-2, LISTITEM_CLASS, false, ListItem_compare);
+ this->display = Panel_new(0, 1, COLS, LINES-2, false, Class(ListItem));
this->tracing = true;
return this;
}
@@ -106,7 +106,7 @@ void TraceScreen_run(TraceScreen* this) {
FunctionBar* bar = FunctionBar_new(tsFunctions, tsKeys, tsEvents);
IncSet* inc = IncSet_new(bar);
- Vector* lines = Vector_new(panel->items->type, true, DEFAULT_SIZE, ListItem_compare);
+ Vector* lines = Vector_new(panel->items->type, true, DEFAULT_SIZE);
TraceScreen_draw(this, inc);
@@ -122,11 +122,11 @@ void TraceScreen_run(TraceScreen* this) {
if (ch == ERR) {
fd_set fds;
FD_ZERO(&fds);
- FD_SET(STDIN_FILENO, &fds);
+// FD_SET(STDIN_FILENO, &fds);
FD_SET(fd_strace, &fds);
- //struct timeval tv;
- //tv.tv_sec = 0; tv.tv_usec = 500;
- int ready = select(fd_strace+1, &fds, NULL, NULL, NULL/*&tv*/);
+ struct timeval tv;
+ tv.tv_sec = 0; tv.tv_usec = 500;
+ int ready = select(fd_strace+1, &fds, NULL, NULL, &tv);
int nread = 0;
if (ready > 0 && FD_ISSET(fd_strace, &fds))
nread = fread(buffer, 1, 1000, strace);
@@ -218,6 +218,7 @@ void TraceScreen_run(TraceScreen* this) {
IncSet_delete(inc);
FunctionBar_delete((Object*)bar);
+ Vector_delete(lines);
kill(child, SIGTERM);
waitpid(child, NULL, 0);
diff --git a/UptimeMeter.c b/UptimeMeter.c
index d31f911f..97d0777b 100644
--- a/UptimeMeter.c
+++ b/UptimeMeter.c
@@ -49,10 +49,13 @@ static void UptimeMeter_setValues(Meter* this, char* buffer, int len) {
snprintf(buffer, len, "%s%02d:%02d:%02d", daysbuf, hours, minutes, seconds);
}
-MeterType UptimeMeter = {
+MeterClass UptimeMeter_class = {
+ .super = {
+ .extends = Class(Meter),
+ .delete = Meter_delete
+ },
.setValues = UptimeMeter_setValues,
- .display = NULL,
- .mode = TEXT_METERMODE,
+ .defaultMode = TEXT_METERMODE,
.items = 1,
.total = 100.0,
.attributes = UptimeMeter_attributes,
diff --git a/UptimeMeter.h b/UptimeMeter.h
index 78814def..fe0bbba9 100644
--- a/UptimeMeter.h
+++ b/UptimeMeter.h
@@ -13,6 +13,6 @@ in the source distribution for its full text.
extern int UptimeMeter_attributes[];
-extern MeterType UptimeMeter;
+extern MeterClass UptimeMeter_class;
#endif
diff --git a/Vector.c b/Vector.c
index 78ec2de5..2d6bae30 100644
--- a/Vector.c
+++ b/Vector.c
@@ -23,17 +23,16 @@ in the source distribution for its full text.
typedef struct Vector_ {
Object **array;
- Object_Compare compare;
+ ObjectClass* type;
int arraySize;
int growthRate;
int items;
- char* type;
bool owner;
} Vector;
}*/
-Vector* Vector_new(char* type, bool owner, int size, Object_Compare compare) {
+Vector* Vector_new(ObjectClass* type, bool owner, int size) {
Vector* this;
if (size == DEFAULT_SIZE)
@@ -45,7 +44,6 @@ Vector* Vector_new(char* type, bool owner, int size, Object_Compare compare) {
this->items = 0;
this->type = type;
this->owner = owner;
- this->compare = compare;
return this;
}
@@ -53,7 +51,7 @@ 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]);
+ Object_delete(this->array[i]);
}
free(this->array);
free(this);
@@ -65,7 +63,7 @@ static inline bool Vector_isConsistent(Vector* this) {
assert(this->items <= this->arraySize);
if (this->owner) {
for (int i = 0; i < this->items; i++)
- if (this->array[i] && this->array[i]->class != this->type)
+ if (this->array[i] && !Object_isA(this->array[i], this->type))
return false;
return true;
} else {
@@ -92,7 +90,7 @@ void Vector_prune(Vector* this) {
if (this->owner) {
for (i = 0; i < this->items; i++)
if (this->array[i]) {
- (this->array[i])->delete(this->array[i]);
+ Object_delete(this->array[i]);
//this->array[i] = NULL;
}
}
@@ -164,18 +162,16 @@ static void insertionSort(Object** array, int left, int right, Object_Compare co
}
void Vector_quickSort(Vector* this) {
- assert(this->compare);
+ assert(this->type->compare);
assert(Vector_isConsistent(this));
- Object_Compare compare = this->compare;
- quickSort(this->array, 0, this->items - 1, compare);
+ quickSort(this->array, 0, this->items - 1, this->type->compare);
assert(Vector_isConsistent(this));
}
void Vector_insertionSort(Vector* this) {
- assert(this->compare);
+ assert(this->type->compare);
assert(Vector_isConsistent(this));
- Object_Compare compare = this->compare;
- insertionSort(this->array, 0, this->items - 1, compare);
+ insertionSort(this->array, 0, this->items - 1, this->type->compare);
assert(Vector_isConsistent(this));
}
@@ -196,8 +192,7 @@ void Vector_insert(Vector* this, int idx, void* data_) {
Object* data = data_;
assert(idx >= 0);
assert(idx <= this->items);
- assert(data_);
- assert(data->class == this->type);
+ assert(Object_isA(data, this->type));
assert(Vector_isConsistent(this));
Vector_checkArraySize(this);
@@ -226,7 +221,7 @@ Object* Vector_take(Vector* this, int idx) {
Object* Vector_remove(Vector* this, int idx) {
Object* removed = Vector_take(this, idx);
if (this->owner) {
- removed->delete(removed);
+ Object_delete(removed);
return NULL;
} else
return removed;
@@ -253,9 +248,9 @@ void Vector_moveDown(Vector* this, int idx) {
}
void Vector_set(Vector* this, int idx, void* data_) {
- assert(idx >= 0);
- assert(((Object*)data_)->class == this->type);
Object* data = data_;
+ assert(idx >= 0);
+ assert(Object_isA((Object*)data, this->type));
assert(Vector_isConsistent(this));
Vector_checkArraySize(this);
@@ -266,7 +261,7 @@ void Vector_set(Vector* this, int idx, void* data_) {
Object* removed = this->array[idx];
assert (removed != NULL);
if (this->owner) {
- removed->delete(removed);
+ Object_delete(removed);
}
}
}
@@ -309,8 +304,8 @@ static void Vector_merge(Vector* this, Vector* v2) {
*/
void Vector_add(Vector* this, void* data_) {
- assert(data_ && ((Object*)data_)->class == this->type);
Object* data = data_;
+ assert(Object_isA((Object*)data, this->type));
assert(Vector_isConsistent(this));
int i = this->items;
Vector_set(this, this->items, data);
@@ -319,9 +314,9 @@ void Vector_add(Vector* this, void* data_) {
}
inline int Vector_indexOf(Vector* this, void* search_, Object_Compare compare) {
- assert(((Object*)search_)->class == this->type);
- assert(this->compare);
Object* search = search_;
+ assert(Object_isA((Object*)search, this->type));
+ assert(compare);
assert(Vector_isConsistent(this));
for (int i = 0; i < this->items; i++) {
Object* o = (Object*)this->array[i];
diff --git a/Vector.h b/Vector.h
index dc3361a2..9b284778 100644
--- a/Vector.h
+++ b/Vector.h
@@ -19,16 +19,15 @@ in the source distribution for its full text.
typedef struct Vector_ {
Object **array;
- Object_Compare compare;
+ ObjectClass* type;
int arraySize;
int growthRate;
int items;
- char* type;
bool owner;
} Vector;
-Vector* Vector_new(char* type, bool owner, int size, Object_Compare compare);
+Vector* Vector_new(ObjectClass* type, bool owner, int size);
void Vector_delete(Vector* this);
diff --git a/htop.c b/htop.c
index a48e1d83..cdee8eeb 100644
--- a/htop.c
+++ b/htop.c
@@ -210,8 +210,6 @@ static bool changePriority(Panel* panel, int delta) {
static Object* pickFromVector(Panel* panel, Panel* list, int x, int y, const char** keyLabels, FunctionBar* prevBar, Header* header) {
const char* fuKeys[] = {"Enter", "Esc", NULL};
int fuEvents[] = {13, 27};
- if (!list->eventHandler)
- Panel_setEventHandler(list, Panel_selectByTyping);
ScreenManager* scr = ScreenManager_new(0, y, 0, -1, HORIZONTAL, header, false);
scr->allowFocusChange = false;
ScreenManager_add(scr, list, FunctionBar_new(keyLabels, fuKeys, fuEvents), x - 1);
@@ -275,7 +273,6 @@ int main(int argc, char** argv) {
bool userOnly = false;
uid_t userId = 0;
int usecolors = 1;
- TreeType treeType = TREE_TYPE_AUTO;
char *argCopy;
char *pid;
Hashtable *pidWhiteList = NULL;
@@ -378,11 +375,23 @@ int main(int argc, char** argv) {
bool doRecalculate = false;
Settings* settings;
- Panel* killPanel = NULL;
-
ProcessList* pl = NULL;
UsersTable* ut = UsersTable_new();
+#ifdef HAVE_LIBNCURSESW
+ char *locale = setlocale(LC_ALL, NULL);
+ if (locale == NULL || locale[0] == '\0')
+ locale = setlocale(LC_CTYPE, NULL);
+ if (locale != NULL &&
+ (strstr(locale, "UTF-8") ||
+ strstr(locale, "utf-8") ||
+ strstr(locale, "UTF8") ||
+ strstr(locale, "utf8")))
+ CRT_utf8 = true;
+ else
+ CRT_utf8 = false;
+#endif
+
pl = ProcessList_new(ut, pidWhiteList);
Process_getMaxPid();
@@ -396,36 +405,9 @@ int main(int argc, char** argv) {
if (!usecolors)
settings->colorScheme = COLORSCHEME_MONOCHROME;
- if (treeType == TREE_TYPE_AUTO) {
-#ifdef HAVE_LIBNCURSESW
- char *locale = setlocale(LC_ALL, NULL);
- if (locale == NULL || locale[0] == '\0')
- locale = setlocale(LC_CTYPE, NULL);
- if (locale != NULL &&
- (strstr(locale, "UTF-8") ||
- strstr(locale, "utf-8") ||
- strstr(locale, "UTF8") ||
- strstr(locale, "utf8")))
- treeType = TREE_TYPE_UTF8;
- else
- treeType = TREE_TYPE_ASCII;
-#else
- treeType = TREE_TYPE_ASCII;
-#endif
- }
- switch (treeType) {
- default:
- case TREE_TYPE_ASCII:
- pl->treeStr = ProcessList_treeStrAscii;
- break;
- case TREE_TYPE_UTF8:
- pl->treeStr = ProcessList_treeStrUtf8;
- break;
- }
-
CRT_init(settings->delay, settings->colorScheme);
- Panel* panel = Panel_new(0, headerHeight, COLS, LINES - headerHeight - 2, PROCESS_CLASS, false, NULL);
+ Panel* panel = Panel_new(0, headerHeight, COLS, LINES - headerHeight - 2, false, &Process_class);
ProcessList_setPanel(pl, panel);
if (sortKey > 0) {
@@ -457,14 +439,18 @@ int main(int argc, char** argv) {
int ch = ERR;
int closeTimeout = 0;
+ bool idle = false;
+
while (!quit) {
gettimeofday(&tv, NULL);
newTime = ((double)tv.tv_sec * 10) + ((double)tv.tv_usec / 100000);
- recalculate = (newTime - oldTime > CRT_delay);
+ recalculate = (newTime - oldTime > settings->delay);
Process* p = (Process*)Panel_getSelected(panel);
int following = (follow && p) ? p->pid : -1;
- if (recalculate)
+ if (recalculate) {
+ Header_draw(header);
oldTime = newTime;
+ }
if (doRefresh) {
if (recalculate || doRecalculate) {
ProcessList_scan(pl);
@@ -475,12 +461,13 @@ int main(int argc, char** argv) {
refreshTimeout = 1;
}
ProcessList_rebuildPanel(pl, true, following, userOnly, userId, IncSet_filter(inc));
+ idle = false;
}
doRefresh = true;
-
- Header_draw(header);
- Panel_draw(panel, true);
+ if (!idle)
+ Panel_draw(panel, true);
+
int prev = ch;
if (inc->active)
move(LINES-1, CRT_cursorX);
@@ -496,8 +483,10 @@ int main(int argc, char** argv) {
}
} else
closeTimeout = 0;
+ idle = true;
continue;
}
+ idle = false;
if (ch == KEY_MOUSE) {
MEVENT mevent;
@@ -655,7 +644,7 @@ int main(int argc, char** argv) {
}
case 'u':
{
- Panel* usersPanel = Panel_new(0, 0, 0, 0, LISTITEM_CLASS, true, ListItem_compare);
+ Panel* usersPanel = Panel_new(0, 0, 0, 0, true, Class(ListItem));
Panel_setHeader(usersPanel, "Show processes of:");
UsersTable_foreach(ut, addUserToVector, usersPanel);
Vector_insertionSort(usersPanel->items);
@@ -687,12 +676,9 @@ int main(int argc, char** argv) {
case KEY_F(9):
case 'k':
{
- if (!killPanel) {
- killPanel = (Panel*) SignalsPanel_new(0, 0, 0, 0);
- }
- SignalsPanel_reset((SignalsPanel*) killPanel);
+ Panel* signalsPanel = (Panel*) SignalsPanel_new();
const char* fuFunctions[] = {"Send ", "Cancel ", NULL};
- ListItem* sgn = (ListItem*) pickFromVector(panel, killPanel, 15, headerHeight, fuFunctions, defaultBar, header);
+ ListItem* sgn = (ListItem*) pickFromVector(panel, signalsPanel, 15, headerHeight, fuFunctions, defaultBar, header);
if (sgn) {
if (sgn->key != 0) {
Panel_setHeader(panel, "Sending...");
@@ -703,6 +689,7 @@ int main(int argc, char** argv) {
}
}
ProcessList_printHeader(pl, Panel_getHeader(panel));
+ Panel_delete((Object*)signalsPanel);
refreshTimeout = 0;
break;
}
@@ -744,7 +731,7 @@ int main(int argc, char** argv) {
case '.':
case KEY_F(6):
{
- Panel* sortPanel = Panel_new(0, 0, 0, 0, LISTITEM_CLASS, true, ListItem_compare);
+ Panel* sortPanel = Panel_new(0, 0, 0, 0, true, Class(ListItem));
Panel_setHeader(sortPanel, "Sort by");
const char* fuFunctions[] = {"Sort ", "Cancel ", NULL};
ProcessField* fields = pl->fields;
@@ -762,7 +749,7 @@ int main(int argc, char** argv) {
} else {
ProcessList_printHeader(pl, Panel_getHeader(panel));
}
- ((Object*)sortPanel)->delete((Object*)sortPanel);
+ Object_delete(sortPanel);
refreshTimeout = 0;
break;
}
@@ -858,8 +845,6 @@ int main(int argc, char** argv) {
IncSet_delete(inc);
FunctionBar_delete((Object*)defaultBar);
Panel_delete((Object*)panel);
- if (killPanel)
- ((Object*)killPanel)->delete((Object*)killPanel);
UsersTable_delete(ut);
Settings_delete(settings);
if(pidWhiteList) {

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