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 -#include - -#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 - -#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 #include -#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 #include -#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 +#include +#include + +#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 + +#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);