From e3862aa67e37ecef0eb8f82ba1f4a710ffac9c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Wed, 16 Dec 2020 21:46:11 +0100 Subject: Rework drawing of FunctionBar Draw the FunctionBar within Panel_draw instead of manually throughout the code. Add an optional PanelClass function drawFunctionBar, to allow specific panels to override the default FunctionBar_draw call. Rework the code on color change, to really change all colors (selection markers and panel headers). Closes: #402 --- Action.c | 4 ++-- AffinityPanel.c | 1 - AvailableMetersPanel.c | 1 - ColorsPanel.c | 19 ++++++++----------- ColumnsPanel.c | 2 +- FunctionBar.c | 7 ++++--- IncSet.c | 19 ++++++------------- InfoScreen.c | 15 ++++++++------- MainPanel.c | 19 ++++++++++++------- MetersPanel.c | 5 ++--- Panel.c | 25 ++++++++++++++++++------- Panel.h | 27 +++++++++++++++++---------- ScreenManager.c | 32 ++++++++++++++------------------ TraceScreen.c | 6 +----- 14 files changed, 93 insertions(+), 89 deletions(-) diff --git a/Action.c b/Action.c index d7359be8..ea670752 100644 --- a/Action.c +++ b/Action.c @@ -341,7 +341,7 @@ static Htop_Reaction actionKill(State* st) { if (sgn) { if (sgn->key != 0) { Panel_setHeader(st->panel, "Sending..."); - Panel_draw(st->panel, true, true); + Panel_draw(st->panel, false, true, true); refresh(); MainPanel_foreachProcess((MainPanel*)st->panel, Process_sendSignal, (Arg) { .i = sgn->key }, NULL); napms(500); @@ -372,7 +372,7 @@ static Htop_Reaction actionFilterByUser(State* st) { Htop_Reaction Action_follow(State* st) { st->pl->following = MainPanel_selectedPid((MainPanel*)st->panel); - Panel_setSelectionColor(st->panel, CRT_colors[PANEL_SELECTION_FOLLOW]); + Panel_setSelectionColor(st->panel, PANEL_SELECTION_FOLLOW); return HTOP_KEEP_FOLLOWING; } diff --git a/AffinityPanel.c b/AffinityPanel.c index 314dcae3..a4d63616 100644 --- a/AffinityPanel.c +++ b/AffinityPanel.c @@ -173,7 +173,6 @@ static void AffinityPanel_update(AffinityPanel* this, bool keepSelected) { Panel* super = (Panel*) this; FunctionBar_setLabel(super->currentBar, KEY_F(3), this->topoView ? "Collapse/Expand" : ""); - FunctionBar_draw(super->currentBar); int oldSelected = Panel_getSelectedIndex(super); Panel_prune(super); diff --git a/AvailableMetersPanel.c b/AvailableMetersPanel.c index ce012557..7c82229b 100644 --- a/AvailableMetersPanel.c +++ b/AvailableMetersPanel.c @@ -35,7 +35,6 @@ static inline void AvailableMetersPanel_addMeter(Header* header, Panel* panel, c Panel_add(panel, (Object*) Meter_toListItem(meter, false)); Panel_setSelected(panel, Panel_size(panel) - 1); MetersPanel_setMoving((MetersPanel*)panel, true); - FunctionBar_draw(panel->currentBar); } static HandlerResult AvailableMetersPanel_eventHandler(Panel* super, int ch) { diff --git a/ColorsPanel.c b/ColorsPanel.c index 2fb1c92f..c076adc0 100644 --- a/ColorsPanel.c +++ b/ColorsPanel.c @@ -60,26 +60,21 @@ static HandlerResult ColorsPanel_eventHandler(Panel* super, int ch) { case KEY_MOUSE: case KEY_RECLICK: case ' ': + assert(mark >= 0); + assert(mark < LAST_COLORSCHEME); for (int i = 0; ColorSchemeNames[i] != NULL; i++) CheckItem_set((CheckItem*)Panel_get(super, i), false); CheckItem_set((CheckItem*)Panel_get(super, mark), true); this->settings->colorScheme = mark; - result = HANDLED; - } - - if (result == HANDLED) { this->settings->changed = true; - const Header* header = this->scr->header; + CRT_setColors(mark); clear(); - Panel* menu = (Panel*) Vector_get(this->scr->panels, 0); - Header_draw(header); - FunctionBar_draw(super->currentBar); - RichString_setAttr(&(super->header), CRT_colors[PANEL_HEADER_FOCUS]); - RichString_setAttr(&(menu->header), CRT_colors[PANEL_HEADER_UNFOCUS]); - ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2); + + result = HANDLED | REDRAW; } + return result; } @@ -100,6 +95,8 @@ ColorsPanel* ColorsPanel_new(Settings* settings, ScreenManager* scr) { this->settings = settings; this->scr = scr; + assert(ARRAYSIZE(ColorSchemeNames) == LAST_COLORSCHEME + 1); + Panel_setHeader(super, "Colors"); for (int i = 0; ColorSchemeNames[i] != NULL; i++) { Panel_add(super, (Object*) CheckItem_newByVal(ColorSchemeNames[i], false)); diff --git a/ColumnsPanel.c b/ColumnsPanel.c index b2a82465..ea561663 100644 --- a/ColumnsPanel.c +++ b/ColumnsPanel.c @@ -44,7 +44,7 @@ static HandlerResult ColumnsPanel_eventHandler(Panel* super, int ch) { { if (selected < size - 1) { this->moving = !(this->moving); - Panel_setSelectionColor(super, this->moving ? CRT_colors[PANEL_SELECTION_FOLLOW] : CRT_colors[PANEL_SELECTION_FOCUS]); + Panel_setSelectionColor(super, this->moving ? PANEL_SELECTION_FOLLOW : PANEL_SELECTION_FOCUS); ListItem* selectedItem = (ListItem*) Panel_getSelected(super); if (selectedItem) selectedItem->moving = this->moving; diff --git a/FunctionBar.c b/FunctionBar.c index 627bc777..1c260ab7 100644 --- a/FunctionBar.c +++ b/FunctionBar.c @@ -112,10 +112,11 @@ void FunctionBar_drawExtra(const FunctionBar* this, const char* buffer, int attr attrset(attr); } mvaddstr(LINES - 1, x, buffer); - attrset(CRT_colors[RESET_COLOR]); x += strlen(buffer); } + attrset(CRT_colors[RESET_COLOR]); + if (setCursor) { CRT_cursorX = x; curs_set(1); @@ -132,10 +133,10 @@ void FunctionBar_append(const char* buffer, int attr) { } else { attrset(attr); } - mvaddstr(LINES - 1, currentLen, buffer); + mvaddstr(LINES - 1, currentLen + 1, buffer); attrset(CRT_colors[RESET_COLOR]); - currentLen += strlen(buffer); + currentLen += strlen(buffer) + 1; } int FunctionBar_synthesizeEvent(const FunctionBar* this, int pos) { diff --git a/IncSet.c b/IncSet.c index 8cd850b3..af8e3aef 100644 --- a/IncSet.c +++ b/IncSet.c @@ -54,12 +54,13 @@ static inline void IncMode_done(IncMode* mode) { } IncSet* IncSet_new(FunctionBar* bar) { - IncSet* this = xCalloc(1, sizeof(IncSet)); + IncSet* this = xMalloc(sizeof(IncSet)); IncMode_initSearch(&(this->modes[INC_SEARCH])); IncMode_initFilter(&(this->modes[INC_FILTER])); this->active = NULL; - this->filtering = false; this->defaultBar = bar; + this->filtering = false; + this->found = false; return this; } @@ -99,20 +100,14 @@ static void updateWeakPanel(IncSet* this, Panel* panel, Vector* lines) { static bool search(IncMode* mode, Panel* panel, IncMode_GetPanelValue getPanelValue) { int size = Panel_size(panel); - bool found = false; for (int i = 0; i < size; i++) { if (String_contains_i(getPanelValue(panel, i), mode->buffer)) { Panel_setSelected(panel, i); - found = true; - break; + return true; } } - FunctionBar_drawExtra(mode->bar, - mode->buffer, - found ? -1 : CRT_colors[FAILED_SEARCH], - true); - return found; + return false; } static bool IncMode_find(IncMode* mode, Panel* panel, IncMode_GetPanelValue getPanelValue, int step) { @@ -202,7 +197,6 @@ bool IncSet_handleKey(IncSet* this, int ch, Panel* panel, IncMode_GetPanelValue } this->active = NULL; Panel_setDefaultBar(panel); - FunctionBar_draw(this->defaultBar); doSearch = false; } if (doSearch) { @@ -221,13 +215,12 @@ const char* IncSet_getListItemValue(Panel* panel, int i) { void IncSet_activate(IncSet* this, IncType type, Panel* panel) { this->active = &(this->modes[type]); - FunctionBar_drawExtra(this->active->bar, this->active->buffer, -1, true); panel->currentBar = this->active->bar; } void IncSet_drawBar(const IncSet* this) { if (this->active) { - FunctionBar_drawExtra(this->active->bar, this->active->buffer, -1, true); + FunctionBar_drawExtra(this->active->bar, this->active->buffer, (this->active->isFilter || this->found) ? -1 : CRT_colors[FAILED_SEARCH], true); } else { FunctionBar_draw(this->defaultBar); } diff --git a/InfoScreen.c b/InfoScreen.c index 515d64f0..79f123e9 100644 --- a/InfoScreen.c +++ b/InfoScreen.c @@ -44,8 +44,10 @@ void InfoScreen_drawTitled(InfoScreen* this, const char* fmt, ...) { va_list ap; va_start(ap, fmt); - char* title = xMalloc(COLS + 1); - int len = vsnprintf(title, COLS + 1, fmt, ap); + char title[COLS + 1]; + int len = vsnprintf(title, sizeof(title), fmt, ap); + va_end(ap); + if (len > COLS) { memset(&title[COLS - 3], '.', 3); } @@ -54,11 +56,9 @@ void InfoScreen_drawTitled(InfoScreen* this, const char* fmt, ...) { mvhline(0, 0, ' ', COLS); mvwprintw(stdscr, 0, 0, title); attrset(CRT_colors[DEFAULT_COLOR]); - this->display->needsRedraw = true; - Panel_draw(this->display, true, true); + Panel_draw(this->display, true, true, true); + IncSet_drawBar(this->inc); - free(title); - va_end(ap); } void InfoScreen_addLine(InfoScreen* this, const char* line) { @@ -89,7 +89,8 @@ void InfoScreen_run(InfoScreen* this) { bool looping = true; while (looping) { - Panel_draw(panel, true, true); + Panel_draw(panel, false, true, true); + IncSet_drawBar(this->inc); if (this->inc->active) { (void) move(LINES - 1, CRT_cursorX); diff --git a/MainPanel.c b/MainPanel.c index 815609f6..949138dc 100644 --- a/MainPanel.c +++ b/MainPanel.c @@ -100,16 +100,12 @@ static HandlerResult MainPanel_eventHandler(Panel* super, int ch) { if (reaction & HTOP_REDRAW_BAR) { MainPanel_updateTreeFunctions(this, this->state->settings->treeView); - IncSet_drawBar(this->inc); - if (this->state->pauseProcessUpdate) { - FunctionBar_append("PAUSED", CRT_colors[PAUSED]); - } } if (reaction & HTOP_UPDATE_PANELHDR) { ProcessList_printHeader(this->state->pl, Panel_getHeader(super)); } if (reaction & HTOP_REFRESH) { - result |= REDRAW; + result |= REFRESH; } if (reaction & HTOP_RECALCULATE) { result |= RESCAN; @@ -122,7 +118,7 @@ static HandlerResult MainPanel_eventHandler(Panel* super, int ch) { } if (!(reaction & HTOP_KEEP_FOLLOWING)) { this->state->pl->following = -1; - Panel_setSelectionColor(super, CRT_colors[PANEL_SELECTION_FOCUS]); + Panel_setSelectionColor(super, PANEL_SELECTION_FOCUS); } return result; } @@ -164,12 +160,21 @@ bool MainPanel_foreachProcess(MainPanel* this, MainPanel_ForeachProcessFn fn, Ar return ok; } +static void MainPanel_drawFunctionBar(Panel* super) { + MainPanel* this = (MainPanel*) super; + IncSet_drawBar(this->inc); + if (this->state->pauseProcessUpdate) { + FunctionBar_append("PAUSED", CRT_colors[PAUSED]); + } +} + const PanelClass MainPanel_class = { .super = { .extends = Class(Panel), .delete = MainPanel_delete }, - .eventHandler = MainPanel_eventHandler + .eventHandler = MainPanel_eventHandler, + .drawFunctionBar = MainPanel_drawFunctionBar }; MainPanel* MainPanel_new() { diff --git a/MetersPanel.c b/MetersPanel.c index 7e20be0f..dc2c43b3 100644 --- a/MetersPanel.c +++ b/MetersPanel.c @@ -55,13 +55,12 @@ void MetersPanel_setMoving(MetersPanel* this, bool moving) { selected->moving = moving; } if (!moving) { - Panel_setSelectionColor(super, CRT_colors[PANEL_SELECTION_FOCUS]); + Panel_setSelectionColor(super, PANEL_SELECTION_FOCUS); Panel_setDefaultBar(super); } else { - Panel_setSelectionColor(super, CRT_colors[PANEL_SELECTION_FOLLOW]); + Panel_setSelectionColor(super, PANEL_SELECTION_FOLLOW); super->currentBar = Meters_movingBar; } - FunctionBar_draw(this->super.currentBar); } static inline bool moveToNeighbor(MetersPanel* this, MetersPanel* neighbor, int selected) { diff --git a/Panel.c b/Panel.c index 37b9c4ef..480a0125 100644 --- a/Panel.c +++ b/Panel.c @@ -56,10 +56,11 @@ void Panel_init(Panel* this, int x, int y, int w, int h, const ObjectClass* type this->selected = 0; this->oldSelected = 0; this->needsRedraw = true; + this->wasFocus = false; RichString_beginAllocated(this->header); this->defaultBar = fuBar; this->currentBar = fuBar; - this->selectionColor = CRT_colors[PANEL_SELECTION_FOCUS]; + this->selectionColorId = PANEL_SELECTION_FOCUS; } void Panel_done(Panel* this) { @@ -70,8 +71,8 @@ void Panel_done(Panel* this) { RichString_end(this->header); } -void Panel_setSelectionColor(Panel* this, int color) { - this->selectionColor = color; +void Panel_setSelectionColor(Panel* this, ColorElements colorId) { + this->selectionColorId = colorId; } RichString* Panel_getHeader(Panel* this) { @@ -217,7 +218,7 @@ void Panel_splice(Panel* this, Vector* from) { this->needsRedraw = true; } -void Panel_draw(Panel* this, bool focus, bool highlightSelected) { +void Panel_draw(Panel* this, bool force_redraw, bool focus, bool highlightSelected) { assert (this != NULL); int size = Vector_size(this->items); @@ -234,6 +235,7 @@ void Panel_draw(Panel* this, bool focus, bool highlightSelected) { attrset(attr); mvhline(y, x, ' ', this->w); if (scrollH < headerLen) { + RichString_setAttr(&this->header, attr); RichString_printoffnVal(this->header, y, x, scrollH, MINIMUM(headerLen - scrollH, this->w)); } @@ -262,10 +264,10 @@ void Panel_draw(Panel* this, bool focus, bool highlightSelected) { int upTo = MINIMUM(first + h, size); int selectionColor = focus - ? this->selectionColor + ? CRT_colors[this->selectionColorId] : CRT_colors[PANEL_SELECTION_UNFOCUS]; - if (this->needsRedraw) { + if (this->needsRedraw || force_redraw) { int line = 0; for (int i = first; line < h && i < upTo; i++) { Object* itemObj = Vector_get(this->items, i); @@ -293,7 +295,6 @@ void Panel_draw(Panel* this, bool focus, bool highlightSelected) { mvhline(y + line, x, ' ', this->w); line++; } - this->needsRedraw = false; } else { Object* oldObj = Vector_get(this->items, this->oldSelected); @@ -319,7 +320,17 @@ void Panel_draw(Panel* this, bool focus, bool highlightSelected) { RichString_end(new); RichString_end(old); } + + if (focus && (this->needsRedraw || force_redraw || !this->wasFocus)) { + if (Panel_drawFunctionBarFn(this)) + Panel_drawFunctionBar(this); + else + FunctionBar_draw(this->currentBar); + } + this->oldSelected = this->selected; + this->wasFocus = focus; + this->needsRedraw = false; move(0, 0); } diff --git a/Panel.h b/Panel.h index 86c134e0..959c0b78 100644 --- a/Panel.h +++ b/Panel.h @@ -9,6 +9,7 @@ in the source distribution for its full text. #include +#include "CRT.h" #include "FunctionBar.h" #include "Object.h" #include "RichString.h" @@ -22,9 +23,10 @@ typedef enum HandlerResult_ { HANDLED = 0x01, IGNORED = 0x02, BREAK_LOOP = 0x04, - REDRAW = 0x08, - RESCAN = 0x10, - SYNTH_KEY = 0x20, + REFRESH = 0x08, + REDRAW = 0x10, + RESCAN = 0x20, + SYNTH_KEY = 0x40, } HandlerResult; #define EVENT_SET_SELECTED (-1) @@ -33,16 +35,20 @@ typedef enum HandlerResult_ { #define EVENT_IS_HEADER_CLICK(ev_) ((ev_) >= -10000 && (ev_) <= -9000) #define EVENT_HEADER_CLICK_GET_X(ev_) ((ev_) + 10000) -typedef HandlerResult(*Panel_EventHandler)(Panel*, int); +typedef HandlerResult (*Panel_EventHandler)(Panel*, int); +typedef void (*Panel_DrawFunctionBar)(Panel*); typedef struct PanelClass_ { const ObjectClass super; const Panel_EventHandler eventHandler; + const Panel_DrawFunctionBar drawFunctionBar; } PanelClass; -#define As_Panel(this_) ((const PanelClass*)((this_)->super.klass)) -#define Panel_eventHandlerFn(this_) As_Panel(this_)->eventHandler -#define Panel_eventHandler(this_, ev_) As_Panel(this_)->eventHandler((Panel*)(this_), ev_) +#define As_Panel(this_) ((const PanelClass*)((this_)->super.klass)) +#define Panel_eventHandlerFn(this_) As_Panel(this_)->eventHandler +#define Panel_eventHandler(this_, ev_) (assert(As_Panel(this_)->eventHandler), As_Panel(this_)->eventHandler((Panel*)(this_), ev_)) +#define Panel_drawFunctionBarFn(this_) As_Panel(this_)->drawFunctionBar +#define Panel_drawFunctionBar(this_) (assert(As_Panel(this_)->drawFunctionBar), As_Panel(this_)->drawFunctionBar((Panel*)(this_))) struct Panel_ { Object super; @@ -55,10 +61,11 @@ struct Panel_ { int scrollV; short scrollH; bool needsRedraw; + bool wasFocus; FunctionBar* currentBar; FunctionBar* defaultBar; RichString header; - int selectionColor; + ColorElements selectionColorId; }; #define Panel_setDefaultBar(this_) do { (this_)->currentBar = (this_)->defaultBar; } while (0) @@ -75,7 +82,7 @@ void Panel_init(Panel* this, int x, int y, int w, int h, const ObjectClass* type void Panel_done(Panel* this); -void Panel_setSelectionColor(Panel* this, int color); +void Panel_setSelectionColor(Panel* this, ColorElements colorId); RichString* Panel_getHeader(Panel* this); @@ -109,7 +116,7 @@ int Panel_size(Panel* this); void Panel_setSelected(Panel* this, int selected); -void Panel_draw(Panel* this, bool focus, bool highlightSelected); +void Panel_draw(Panel* this, bool force_redraw, bool focus, bool highlightSelected); void Panel_splice(Panel* this, Vector* from); diff --git a/ScreenManager.c b/ScreenManager.c index 94904b5f..57cb564d 100644 --- a/ScreenManager.c +++ b/ScreenManager.c @@ -119,29 +119,20 @@ static void checkRecalculation(ScreenManager* this, double* oldTime, int* sortTi *rescan = false; } -static void ScreenManager_drawPanels(ScreenManager* this, int focus) { +static void ScreenManager_drawPanels(ScreenManager* this, int focus, bool force_redraw) { const int nPanels = this->panelCount; for (int i = 0; i < nPanels; i++) { Panel* panel = (Panel*) Vector_get(this->panels, i); - Panel_draw(panel, i == focus, !((panel == this->state->panel) && this->state->hideProcessSelection)); + Panel_draw(panel, force_redraw, i == focus, !((panel == this->state->panel) && this->state->hideProcessSelection)); mvvline(panel->y, panel->x + panel->w, ' ', panel->h + 1); } } -static Panel* setCurrentPanel(const ScreenManager* this, Panel* panel) { - FunctionBar_draw(panel->currentBar); - if (panel == this->state->panel && this->state->pauseProcessUpdate) { - FunctionBar_append("PAUSED", CRT_colors[PAUSED]); - } - - return panel; -} - void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { bool quit = false; int focus = 0; - Panel* panelFocus = setCurrentPanel(this, (Panel*) Vector_get(this->panels, focus)); + Panel* panelFocus = (Panel*) Vector_get(this->panels, focus); double oldTime = 0.0; @@ -150,6 +141,7 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { bool timedOut = true; bool redraw = true; + bool force_redraw = false; bool rescan = false; int sortTimeout = 0; int resetSortTimeout = 5; @@ -159,8 +151,9 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { checkRecalculation(this, &oldTime, &sortTimeout, &redraw, &rescan, &timedOut); } - if (redraw) { - ScreenManager_drawPanels(this, focus); + if (redraw || force_redraw) { + ScreenManager_drawPanels(this, focus, force_redraw); + force_redraw = false; } int prevCh = ch; @@ -187,7 +180,7 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { ch = KEY_MOUSE; if (panel == panelFocus || this->allowFocusChange) { focus = i; - panelFocus = setCurrentPanel(this, panel); + panelFocus = panel; Object* oldSelection = Panel_getSelected(panel); Panel_setSelected(panel, mevent.y - panel->y + panel->scrollV - 1); if (Panel_getSelected(panel) == oldSelection) { @@ -234,9 +227,12 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { if (result & SYNTH_KEY) { ch = result >> 16; } - if (result & REDRAW) { + if (result & REFRESH) { sortTimeout = 0; } + if (result & REDRAW) { + force_redraw = true; + } if (result & RESCAN) { rescan = true; sortTimeout = 0; @@ -269,7 +265,7 @@ tryLeft: focus--; } - panelFocus = setCurrentPanel(this, (Panel*) Vector_get(this->panels, focus)); + panelFocus = (Panel*) Vector_get(this->panels, focus); if (Panel_size(panelFocus) == 0 && focus > 0) { goto tryLeft; } @@ -290,7 +286,7 @@ tryRight: focus++; } - panelFocus = setCurrentPanel(this, (Panel*) Vector_get(this->panels, focus)); + panelFocus = (Panel*) Vector_get(this->panels, focus); if (Panel_size(panelFocus) == 0 && focus < this->panelCount - 1) { goto tryRight; } diff --git a/TraceScreen.c b/TraceScreen.c index e6bd1fb1..e04f4f8a 100644 --- a/TraceScreen.c +++ b/TraceScreen.c @@ -71,11 +71,7 @@ void TraceScreen_delete(Object* cast) { } void TraceScreen_draw(InfoScreen* this) { - attrset(CRT_colors[PANEL_HEADER_FOCUS]); - mvhline(0, 0, ' ', COLS); - mvprintw(0, 0, "Trace of process %d - %s", this->process->pid, Process_getCommand(this->process)); - attrset(CRT_colors[DEFAULT_COLOR]); - IncSet_drawBar(this->inc); + InfoScreen_drawTitled(this, "Trace of process %d - %s", this->process->pid, Process_getCommand(this->process)); } bool TraceScreen_forkTracer(TraceScreen* this) { -- cgit v1.2.3 From 358d20687f6913f151f3943e1d8655ce71457f6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Sat, 19 Dec 2020 23:05:07 +0100 Subject: Use variable-length-array instead of small dynamic allocation --- CommandScreen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CommandScreen.c b/CommandScreen.c index d3428290..56b752d6 100644 --- a/CommandScreen.c +++ b/CommandScreen.c @@ -17,9 +17,10 @@ static void CommandScreen_scan(InfoScreen* this) { Panel_prune(panel); const char* p = Process_getCommand(this->process); - char* line = xMalloc(COLS + 1); + char line[COLS + 1]; int line_offset = 0, last_spc = -1, len; for (; *p != '\0'; p++, line_offset++) { + assert(line_offset >= 0 && (size_t)line_offset < sizeof(line)); line[line_offset] = *p; if (*p == ' ') { last_spc = line_offset; @@ -41,7 +42,6 @@ static void CommandScreen_scan(InfoScreen* this) { InfoScreen_addLine(this, line); } - free(line); Panel_setSelected(panel, idx); } -- cgit v1.2.3 From 3f9c63d5c02fc822c3fbdda3c2328c85cdbc1740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Sun, 20 Dec 2020 11:23:08 +0100 Subject: MetersPanel: drop color interruption in FunctionBar --- MetersPanel.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MetersPanel.c b/MetersPanel.c index dc2c43b3..30991a0e 100644 --- a/MetersPanel.c +++ b/MetersPanel.c @@ -20,8 +20,8 @@ in the source distribution for its full text. // Note: In code the meters are known to have bar/text/graph "Modes", but in UI // we call them "Styles". -static const char* const MetersFunctions[] = {"Style ", "Move ", " ", "Delete", "Done ", NULL}; -static const char* const MetersKeys[] = {"Space", "Enter", " ", "Del", "F10"}; +static const char* const MetersFunctions[] = {"Style ", "Move ", " ", "Delete", "Done ", NULL}; +static const char* const MetersKeys[] = {"Space", "Enter", "", "Del", "F10"}; static const int MetersEvents[] = {' ', 13, ERR, KEY_DC, KEY_F(10)}; // We avoid UTF-8 arrows ← → here as they might display full-width on Chinese -- cgit v1.2.3