summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Göttsche <cgzones@googlemail.com>2020-11-21 21:40:08 +0100
committercgzones <cgzones@googlemail.com>2020-11-25 20:46:27 +0100
commit267014cbfe584ff9a1bc74d671f8aaa27251fd49 (patch)
treec49c5efc511a93722052084b78a735962db46b91
parentadf918520976a5f06181c1c05392a0da6e4bbaa5 (diff)
Add support to change numeric options in settings screen
Like delay or highlightDelaySecs
-rw-r--r--CRT.c12
-rw-r--r--CRT.h4
-rw-r--r--CheckItem.c73
-rw-r--r--CheckItem.h31
-rw-r--r--ColorsPanel.c4
-rw-r--r--DisplayOptionsPanel.c87
-rw-r--r--Makefile.am4
-rw-r--r--Meter.c3
-rw-r--r--OptionItem.c189
-rw-r--r--OptionItem.h70
-rw-r--r--Settings.c4
-rw-r--r--htop.c2
12 files changed, 330 insertions, 153 deletions
diff --git a/CRT.c b/CRT.c
index 31c94cbd..c1fcb0df 100644
--- a/CRT.c
+++ b/CRT.c
@@ -72,7 +72,7 @@ bool CRT_utf8 = false;
const char* const* CRT_treeStr = CRT_treeStrAscii;
-int CRT_delay;
+static const int* CRT_delay;
const char* CRT_degreeSign;
@@ -654,10 +654,10 @@ static struct sigaction old_sig_handler[32];
// TODO: pass an instance of Settings instead.
-void CRT_init(int delay, int colorScheme, bool allowUnicode) {
+void CRT_init(const int* delay, int colorScheme, bool allowUnicode) {
initscr();
noecho();
- CRT_delay = CLAMP(delay, 1, 255);
+ CRT_delay = delay;
CRT_colors = CRT_colorSchemes[colorScheme];
CRT_colorScheme = colorScheme;
@@ -666,7 +666,7 @@ void CRT_init(int delay, int colorScheme, bool allowUnicode) {
CRT_colorSchemes[COLORSCHEME_BROKENGRAY][i] = color == (A_BOLD | ColorPairGrayBlack) ? ColorPair(White, Black) : color;
}
- halfdelay(CRT_delay);
+ halfdelay(*CRT_delay);
nonl();
intrflush(stdscr, false);
keypad(stdscr, true);
@@ -774,7 +774,7 @@ int CRT_readKey() {
cbreak();
nodelay(stdscr, FALSE);
int ret = getch();
- halfdelay(CRT_delay);
+ halfdelay(*CRT_delay);
return ret;
}
@@ -785,7 +785,7 @@ void CRT_disableDelay() {
}
void CRT_enableDelay() {
- halfdelay(CRT_delay);
+ halfdelay(*CRT_delay);
}
void CRT_setColors(int colorScheme) {
diff --git a/CRT.h b/CRT.h
index c95b0fb7..ec3fdafe 100644
--- a/CRT.h
+++ b/CRT.h
@@ -142,8 +142,6 @@ extern bool CRT_utf8;
extern const char* const* CRT_treeStr;
-extern int CRT_delay;
-
extern const int* CRT_colors;
extern int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT];
@@ -175,7 +173,7 @@ static inline void CRT_restorePrivileges(void) { }
#endif /* HAVE_SETUID_ENABLED */
-void CRT_init(int delay, int colorScheme, bool allowUnicode);
+void CRT_init(const int* delay, int colorScheme, bool allowUnicode);
void CRT_done(void);
diff --git a/CheckItem.c b/CheckItem.c
deleted file mode 100644
index 5fcae96b..00000000
--- a/CheckItem.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
-htop - CheckItem.c
-(C) 2004-2011 Hisham H. Muhammad
-Released under the GNU GPLv2, see the COPYING file
-in the source distribution for its full text.
-*/
-
-#include "CheckItem.h"
-
-#include <assert.h>
-#include <stdlib.h>
-
-#include "CRT.h"
-#include "RichString.h"
-
-
-static void CheckItem_delete(Object* cast) {
- CheckItem* this = (CheckItem*)cast;
- assert (this != NULL);
-
- free(this->text);
- free(this);
-}
-
-static void CheckItem_display(const Object* cast, RichString* out) {
- const CheckItem* this = (const CheckItem*)cast;
- assert (this != NULL);
- RichString_write(out, CRT_colors[CHECK_BOX], "[");
- if (CheckItem_get(this)) {
- RichString_append(out, CRT_colors[CHECK_MARK], "x");
- } else {
- RichString_append(out, CRT_colors[CHECK_MARK], " ");
- }
- RichString_append(out, CRT_colors[CHECK_BOX], "] ");
- RichString_append(out, CRT_colors[CHECK_TEXT], this->text);
-}
-
-const ObjectClass CheckItem_class = {
- .display = CheckItem_display,
- .delete = CheckItem_delete
-};
-
-CheckItem* CheckItem_newByRef(char* text, bool* ref) {
- CheckItem* this = AllocThis(CheckItem);
- this->text = text;
- this->value = false;
- this->ref = ref;
- return this;
-}
-
-CheckItem* CheckItem_newByVal(char* text, bool value) {
- CheckItem* this = AllocThis(CheckItem);
- this->text = text;
- this->value = value;
- this->ref = NULL;
- return this;
-}
-
-void CheckItem_set(CheckItem* this, bool value) {
- if (this->ref) {
- *(this->ref) = value;
- } else {
- this->value = value;
- }
-}
-
-bool CheckItem_get(const CheckItem* this) {
- if (this->ref) {
- return *(this->ref);
- } else {
- return this->value;
- }
-}
diff --git a/CheckItem.h b/CheckItem.h
deleted file mode 100644
index a357111f..00000000
--- a/CheckItem.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef HEADER_CheckItem
-#define HEADER_CheckItem
-/*
-htop - CheckItem.h
-(C) 2004-2011 Hisham H. Muhammad
-Released under the GNU GPLv2, see the COPYING file
-in the source distribution for its full text.
-*/
-
-#include <stdbool.h>
-
-#include "Object.h"
-
-typedef struct CheckItem_ {
- Object super;
- char* text;
- bool* ref;
- bool value;
-} CheckItem;
-
-extern const ObjectClass CheckItem_class;
-
-CheckItem* CheckItem_newByRef(char* text, bool* ref);
-
-CheckItem* CheckItem_newByVal(char* text, bool value);
-
-void CheckItem_set(CheckItem* this, bool value);
-
-bool CheckItem_get(const CheckItem* this);
-
-#endif
diff --git a/ColorsPanel.c b/ColorsPanel.c
index 9da71545..69927092 100644
--- a/ColorsPanel.c
+++ b/ColorsPanel.c
@@ -10,11 +10,11 @@ in the source distribution for its full text.
#include <stdbool.h>
#include <stdlib.h>
-#include "CheckItem.h"
#include "CRT.h"
#include "FunctionBar.h"
#include "Header.h"
#include "Object.h"
+#include "OptionItem.h"
#include "ProvideCurses.h"
#include "RichString.h"
#include "Vector.h"
@@ -103,7 +103,7 @@ ColorsPanel* ColorsPanel_new(Settings* settings, ScreenManager* scr) {
Panel_setHeader(super, "Colors");
for (int i = 0; ColorSchemeNames[i] != NULL; i++) {
- Panel_add(super, (Object*) CheckItem_newByVal(xStrdup(ColorSchemeNames[i]), false));
+ Panel_add(super, (Object*) CheckItem_newByVal(ColorSchemeNames[i], false));
}
CheckItem_set((CheckItem*)Panel_get(super, settings->colorScheme), true);
return this;
diff --git a/DisplayOptionsPanel.c b/DisplayOptionsPanel.c
index cbc155df..bf3fa584 100644
--- a/DisplayOptionsPanel.c
+++ b/DisplayOptionsPanel.c
@@ -12,11 +12,11 @@ in the source distribution for its full text.
#include <stdbool.h>
#include <stdlib.h>
-#include "CheckItem.h"
#include "CRT.h"
#include "FunctionBar.h"
#include "Header.h"
#include "Object.h"
+#include "OptionItem.h"
#include "ProvideCurses.h"
#include "XUtils.h"
@@ -34,17 +34,38 @@ static HandlerResult DisplayOptionsPanel_eventHandler(Panel* super, int ch) {
DisplayOptionsPanel* this = (DisplayOptionsPanel*) super;
HandlerResult result = IGNORED;
- CheckItem* selected = (CheckItem*) Panel_getSelected(super);
+ OptionItem* selected = (OptionItem*) Panel_getSelected(super);
- switch(ch) {
- case 0x0a:
- case 0x0d:
+ switch (ch) {
+ case '\n':
+ case '\r':
case KEY_ENTER:
case KEY_MOUSE:
case KEY_RECLICK:
case ' ':
- CheckItem_set(selected, !CheckItem_get(selected));
- result = HANDLED;
+ switch (OptionItem_kind(selected)) {
+ case OPTION_ITEM_CHECK:
+ CheckItem_toggle((CheckItem*)selected);
+ result = HANDLED;
+ break;
+ case OPTION_ITEM_NUMBER:
+ NumberItem_toggle((NumberItem*)selected);
+ result = HANDLED;
+ break;
+ }
+ break;
+ case '-':
+ if (OptionItem_kind(selected) == OPTION_ITEM_NUMBER) {
+ NumberItem_decrease((NumberItem*)selected);
+ result = HANDLED;
+ }
+ break;
+ case '+':
+ if (OptionItem_kind(selected) == OPTION_ITEM_NUMBER) {
+ NumberItem_increase((NumberItem*)selected);
+ result = HANDLED;
+ }
+ break;
}
if (result == HANDLED) {
@@ -70,39 +91,41 @@ DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager*
DisplayOptionsPanel* this = AllocThis(DisplayOptionsPanel);
Panel* super = (Panel*) this;
FunctionBar* fuBar = FunctionBar_new(DisplayOptionsFunctions, NULL, NULL);
- Panel_init(super, 1, 1, 1, 1, Class(CheckItem), true, fuBar);
+ Panel_init(super, 1, 1, 1, 1, Class(OptionItem), true, fuBar);
this->settings = settings;
this->scr = scr;
Panel_setHeader(super, "Display options");
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Tree view"), &(settings->treeView)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Shadow other users' processes"), &(settings->shadowOtherUsers)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Hide kernel threads"), &(settings->hideKernelThreads)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Hide userland process threads"), &(settings->hideUserlandThreads)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Display threads in a different color"), &(settings->highlightThreads)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Show custom thread names"), &(settings->showThreadNames)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Show program path"), &(settings->showProgramPath)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Highlight program \"basename\""), &(settings->highlightBaseName)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Merge exe, comm and cmdline in Command"), &(settings->showMergedCommand)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("- Try to find comm in cmdline (when Command is merged)"), &(settings->findCommInCmdline)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("- Try to strip exe from cmdline (when Command is merged)"), &(settings->stripExeFromCmdline)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Highlight large numbers in memory counters"), &(settings->highlightMegabytes)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Leave a margin around header"), &(settings->headerMargin)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Detailed CPU time (System/IO-Wait/Hard-IRQ/Soft-IRQ/Steal/Guest)"), &(settings->detailedCPUTime)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Count CPUs from 1 instead of 0"), &(settings->countCPUsFromOne)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Update process names on every refresh"), &(settings->updateProcessNames)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Add guest time in CPU meter percentage"), &(settings->accountGuestInCPUMeter)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Also show CPU percentage numerically"), &(settings->showCPUUsage)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Also show CPU frequency"), &(settings->showCPUFrequency)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Tree view", &(settings->treeView)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Shadow other users' processes", &(settings->shadowOtherUsers)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Hide kernel threads", &(settings->hideKernelThreads)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Hide userland process threads", &(settings->hideUserlandThreads)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Display threads in a different color", &(settings->highlightThreads)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Show custom thread names", &(settings->showThreadNames)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Show program path", &(settings->showProgramPath)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Highlight program \"basename\"", &(settings->highlightBaseName)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Merge exe, comm and cmdline in Command", &(settings->showMergedCommand)));
+ Panel_add(super, (Object*) CheckItem_newByRef("- Try to find comm in cmdline (when Command is merged)", &(settings->findCommInCmdline)));
+ Panel_add(super, (Object*) CheckItem_newByRef("- Try to strip exe from cmdline (when Command is merged)", &(settings->stripExeFromCmdline)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Highlight large numbers in memory counters", &(settings->highlightMegabytes)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Leave a margin around header", &(settings->headerMargin)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Detailed CPU time (System/IO-Wait/Hard-IRQ/Soft-IRQ/Steal/Guest)", &(settings->detailedCPUTime)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Count CPUs from 1 instead of 0", &(settings->countCPUsFromOne)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Update process names on every refresh", &(settings->updateProcessNames)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Add guest time in CPU meter percentage", &(settings->accountGuestInCPUMeter)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Also show CPU percentage numerically", &(settings->showCPUUsage)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Also show CPU frequency", &(settings->showCPUFrequency)));
#ifdef HAVE_LIBSENSORS
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Also show CPU temperature"), &(settings->showCPUTemperature)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("- Show temperature in degree Fahrenheit instead of Celsius"), &(settings->degreeFahrenheit)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Also show CPU temperature", &(settings->showCPUTemperature)));
+ Panel_add(super, (Object*) CheckItem_newByRef("- Show temperature in degree Fahrenheit instead of Celsius", &(settings->degreeFahrenheit)));
#endif
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Enable the mouse"), &(settings->enableMouse)));
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Highlight new and old processes"), &(settings->highlightChanges)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Enable the mouse", &(settings->enableMouse)));
+ Panel_add(super, (Object*) NumberItem_newByRef("Update interval (in seconds)", &(settings->delay), -1, 1, 255));
+ Panel_add(super, (Object*) CheckItem_newByRef("Highlight new and old processes", &(settings->highlightChanges)));
+ Panel_add(super, (Object*) NumberItem_newByRef("- Highlight time (in seconds)", &(settings->highlightDelaySecs), 0, 1, 24*60*60));
#ifdef HAVE_LIBHWLOC
- Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Show topology when selecting affinity by default"), &(settings->topologyAffinity)));
+ Panel_add(super, (Object*) CheckItem_newByRef("Show topology when selecting affinity by default", &(settings->topologyAffinity)));
#endif
return this;
}
diff --git a/Makefile.am b/Makefile.am
index 07b7b168..351c1081 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -21,7 +21,6 @@ myhtopsources = \
AvailableMetersPanel.c \
BatteryMeter.c \
CategoriesPanel.c \
- CheckItem.c \
ClockMeter.c \
ColorsPanel.c \
ColumnsPanel.c \
@@ -50,6 +49,7 @@ myhtopsources = \
NetworkIOMeter.c \
Object.c \
OpenFilesScreen.c \
+ OptionItem.c \
Panel.c \
Process.c \
ProcessList.c \
@@ -76,7 +76,6 @@ myhtopheaders = \
CPUMeter.h \
CRT.h \
CategoriesPanel.h \
- CheckItem.h \
ClockMeter.h \
ColorsPanel.h \
ColumnsPanel.h \
@@ -103,6 +102,7 @@ myhtopheaders = \
NetworkIOMeter.h \
Object.h \
OpenFilesScreen.h \
+ OptionItem.h \
Panel.h \
Process.h \
ProcessList.h \
diff --git a/Meter.c b/Meter.c
index 2f02f0ad..79421fb0 100644
--- a/Meter.c
+++ b/Meter.c
@@ -305,7 +305,8 @@ static void GraphMeterMode_draw(Meter* this, int x, int y, int w) {
struct timeval now;
gettimeofday(&now, NULL);
if (!timercmp(&now, &(data->time), <)) {
- struct timeval delay = { .tv_sec = CRT_delay / 10, .tv_usec = (CRT_delay - ((CRT_delay / 10) * 10)) * 100000 };
+ int globalDelay = this->pl->settings->delay;
+ struct timeval delay = { .tv_sec = globalDelay / 10, .tv_usec = (globalDelay - ((globalDelay / 10) * 10)) * 100000 };
timeradd(&now, &delay, &(data->time));
for (int i = 0; i < nValues - 1; i++)
diff --git a/OptionItem.c b/OptionItem.c
new file mode 100644
index 00000000..625a994f
--- /dev/null
+++ b/OptionItem.c
@@ -0,0 +1,189 @@
+/*
+htop - OptionItem.c
+(C) 2004-2011 Hisham H. Muhammad
+Released under the GNU GPLv2, see the COPYING file
+in the source distribution for its full text.
+*/
+
+#include "OptionItem.h"
+
+#include <assert.h>
+#include <math.h>
+#include <stdlib.h>
+
+#include "CRT.h"
+#include "RichString.h"
+
+
+static void OptionItem_delete(Object* cast) {
+ OptionItem* this = (OptionItem*)cast;
+ assert (this != NULL);
+
+ free(this->text);
+ free(this);
+}
+
+static void CheckItem_display(const Object* cast, RichString* out) {
+ const CheckItem* this = (const CheckItem*)cast;
+ assert (this != NULL);
+
+ RichString_write(out, CRT_colors[CHECK_BOX], "[");
+ if (CheckItem_get(this)) {
+ RichString_append(out, CRT_colors[CHECK_MARK], "x");
+ } else {
+ RichString_append(out, CRT_colors[CHECK_MARK], " ");
+ }
+ RichString_append(out, CRT_colors[CHECK_BOX], "] ");
+ RichString_append(out, CRT_colors[CHECK_TEXT], this->super.text);
+}
+
+static void NumberItem_display(const Object* cast, RichString* out) {
+ const NumberItem* this = (const NumberItem*)cast;
+ assert (this != NULL);
+
+ char buffer[12];
+ RichString_write(out, CRT_colors[CHECK_BOX], "[");
+ int written;
+ if (this->scale < 0) {
+ written = xSnprintf(buffer, sizeof(buffer), "%.*f", -this->scale, pow(10, this->scale) * NumberItem_get(this));
+ } else if (this->scale > 0) {
+ written = xSnprintf(buffer, sizeof(buffer), "%d", (int) (pow(10, this->scale) * NumberItem_get(this)));
+ } else {
+ written = xSnprintf(buffer, sizeof(buffer), "%d", NumberItem_get(this));
+ }
+ RichString_append(out, CRT_colors[CHECK_MARK], buffer);
+ RichString_append(out, CRT_colors[CHECK_BOX], "]");
+ for (int i = written; i < 5; i++) {
+ RichString_append(out, CRT_colors[CHECK_BOX], " ");
+ }
+ RichString_append(out, CRT_colors[CHECK_TEXT], this->super.text);
+}
+
+const OptionItemClass OptionItem_class = {
+ .super = {
+ .extends = Class(Object),
+ .delete = OptionItem_delete
+ }
+};
+
+const OptionItemClass CheckItem_class = {
+ .super = {
+ .extends = Class(OptionItem),
+ .delete = OptionItem_delete,
+ .display = CheckItem_display
+ },
+ .kind = OPTION_ITEM_CHECK
+};
+
+const OptionItemClass NumberItem_class = {
+ .super = {
+ .extends = Class(OptionItem),
+ .delete = OptionItem_delete,
+ .display = NumberItem_display
+ },
+ .kind = OPTION_ITEM_NUMBER
+};
+
+CheckItem* CheckItem_newByRef(const char* text, bool* ref) {
+ CheckItem* this = AllocThis(CheckItem);
+ this->super.text = xStrdup(text);
+ this->value = false;
+ this->ref = ref;
+ return this;
+}
+
+CheckItem* CheckItem_newByVal(const char* text, bool value) {
+ CheckItem* this = AllocThis(CheckItem);
+ this->super.text = xStrdup(text);
+ this->value = value;
+ this->ref = NULL;
+ return this;
+}
+
+bool CheckItem_get(const CheckItem* this) {
+ if (this->ref) {
+ return *(this->ref);
+ } else {
+ return this->value;
+ }
+}
+
+void CheckItem_set(CheckItem* this, bool value) {
+ if (this->ref) {
+ *(this->ref) = value;
+ } else {
+ this->value = value;
+ }
+}
+
+void CheckItem_toggle(CheckItem* this) {
+ if (this->ref) {
+ *(this->ref) = !*(this->ref);
+ } else {
+ this->value = !this->value;
+ }
+}
+
+NumberItem* NumberItem_newByRef(const char* text, int* ref, int scale, int min, int max) {
+ assert(min <= max);
+
+ NumberItem* this = AllocThis(NumberItem);
+ this->super.text = xStrdup(text);
+ this->value = 0;
+ this->ref = ref;
+ this->scale = scale;
+ this->min = min;
+ this->max = max;
+ return this;
+}
+
+NumberItem* NumberItem_newByVal(const char* text, int value, int scale, int min, int max) {
+ assert(min <= max);
+
+ NumberItem* this = AllocThis(NumberItem);
+ this->super.text = xStrdup(text);
+ this->value = CLAMP(value, min, max);
+ this->ref = NULL;
+ this->scale = scale;
+ this->min = min;
+ this->max = max;
+ return this;
+}
+
+int NumberItem_get(const NumberItem* this) {
+ if (this->ref) {
+ return *(this->ref);
+ } else {
+ return this->value;
+ }
+}
+
+void NumberItem_decrease(NumberItem* this) {
+ if (this->ref) {
+ *(this->ref) = CLAMP(*(this->ref) - 1, this->min, this->max);
+ } else {
+ this->value = CLAMP(this->value - 1, this->min, this->max);
+ }
+}
+
+void NumberItem_increase(NumberItem* this) {
+ if (this->ref) {
+ *(this->ref) = CLAMP(*(this->ref) + 1, this->min, this->max);
+ } else {
+ this->value = CLAMP(this->value + 1, this->min, this->max);
+ }
+}
+
+void NumberItem_toggle(NumberItem* this) {
+ if (this->ref) {
+ if (*(this->ref) >= this->max)
+ *(this->ref) = this->min;
+ else
+ *(this->ref) += 1;
+ } else {
+ if (this->value >= this->max)
+ this->value = this->min;
+ else
+ this->value += 1;
+ }
+}
diff --git a/OptionItem.h b/OptionItem.h
new file mode 100644
index 00000000..8dd802d9
--- /dev/null
+++ b/OptionItem.h
@@ -0,0 +1,70 @@
+#ifndef HEADER_OptionItem
+#define HEADER_OptionItem
+/*
+htop - OptionItem.h
+(C) 2004-2011 Hisham H. Muhammad
+Released under the GNU GPLv2, see the COPYING file
+in the source distribution for its full text.
+*/
+
+#include <stdbool.h>
+
+#include "Object.h"
+
+
+enum OptionItemType {
+ OPTION_ITEM_CHECK,
+ OPTION_ITEM_NUMBER,
+};
+
+typedef struct OptionItemClass_ {
+ const ObjectClass super;
+
+ enum OptionItemType kind;
+} OptionItemClass;
+
+#define As_OptionItem(this_) ((const OptionItemClass*)((this_)->super.klass))
+#define OptionItem_kind(this_) As_OptionItem(this_)->kind
+
+typedef struct OptionItem_ {
+ Object super;
+
+ char* text;
+} OptionItem;
+
+typedef struct CheckItem_ {
+ OptionItem super;
+
+ bool* ref;
+ bool value;
+} CheckItem;
+
+typedef struct NumberItem_ {
+ OptionItem super;
+
+ char* text;
+ int* ref;
+ int value;
+ int scale;
+ int min;
+ int max;
+} NumberItem;
+
+extern const OptionItemClass OptionItem_class;
+extern const OptionItemClass CheckItem_class;
+extern const OptionItemClass NumberItem_class;
+
+CheckItem* CheckItem_newByRef(const char* text, bool* ref);
+CheckItem* CheckItem_newByVal(const char* text, bool value);
+bool CheckItem_get(const CheckItem* this);
+void CheckItem_set(CheckItem* this, bool value);
+void CheckItem_toggle(CheckItem* this);
+
+NumberItem* NumberItem_newByRef(const char* text, int* ref, int scale, int min, int max);
+NumberItem* NumberItem_newByVal(const char* text, int value, int scale, int min, int max);
+int NumberItem_get(const NumberItem* this);
+void NumberItem_decrease(NumberItem* this);
+void NumberItem_increase(NumberItem* this);
+void NumberItem_toggle(NumberItem* this);
+
+#endif
diff --git a/Settings.c b/Settings.c
index 9564c8ee..1daea7dc 100644
--- a/Settings.c
+++ b/Settings.c
@@ -160,7 +160,7 @@ static bool Settings_read(Settings* this, const char* fileName, int initialCpuCo
} else if (String_eq(option[0], "highlight_changes")) {
this->highlightChanges = atoi(option[1]);
} else if (String_eq(option[0], "highlight_changes_delay_secs")) {
- this->highlightDelaySecs = atoi(option[1]);
+ this->highlightDelaySecs = CLAMP(atoi(option[1]), 1, 24*60*60);
} else if (String_eq(option[0], "find_comm_in_cmdline")) {
this->findCommInCmdline = atoi(option[1]);
} else if (String_eq(option[0], "strip_exe_from_cmdline")) {
@@ -194,7 +194,7 @@ static bool Settings_read(Settings* this, const char* fileName, int initialCpuCo
} else if (String_eq(option[0], "account_guest_in_cpu_meter")) {
this->accountGuestInCPUMeter = atoi(option[1]);
} else if (String_eq(option[0], "delay")) {
- this->delay = atoi(option[1]);
+ this->delay = CLAMP(atoi(option[1]), 1, 255);
} else if (String_eq(option[0], "color_scheme")) {
this->colorScheme = atoi(option[1]);
if (this->colorScheme < 0 || this->colorScheme >= LAST_COLORSCHEME) {
diff --git a/htop.c b/htop.c
index 0a2401ca..15b58304 100644
--- a/htop.c
+++ b/htop.c
@@ -304,7 +304,7 @@ int main(int argc, char** argv) {
settings->direction = 1;
}
- CRT_init(settings->delay, settings->colorScheme, flags.allowUnicode);
+ CRT_init(&(settings->delay), settings->colorScheme, flags.allowUnicode);
MainPanel* panel = MainPanel_new();
ProcessList_setPanel(pl, (Panel*) panel);

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