diff --git a/MainPanel.c b/MainPanel.c index 949138dc..c8a4c059 100644 --- a/MainPanel.c +++ b/MainPanel.c @@ -102,7 +102,7 @@ static HandlerResult MainPanel_eventHandler(Panel* super, int ch) { MainPanel_updateTreeFunctions(this, this->state->settings->treeView); } if (reaction & HTOP_UPDATE_PANELHDR) { - ProcessList_printHeader(this->state->pl, Panel_getHeader(super)); + result |= REDRAW; } if (reaction & HTOP_REFRESH) { result |= REFRESH; @@ -168,13 +168,19 @@ static void MainPanel_drawFunctionBar(Panel* super) { } } +static void MainPanel_printHeader(Panel* super) { + MainPanel* this = (MainPanel*) super; + ProcessList_printHeader(this->state->pl, &super->header); +} + const PanelClass MainPanel_class = { .super = { .extends = Class(Panel), .delete = MainPanel_delete }, .eventHandler = MainPanel_eventHandler, - .drawFunctionBar = MainPanel_drawFunctionBar + .drawFunctionBar = MainPanel_drawFunctionBar, + .printHeader = MainPanel_printHeader }; MainPanel* MainPanel_new() { diff --git a/Panel.c b/Panel.c index b36f1efc..26a0c0ec 100644 --- a/Panel.c +++ b/Panel.c @@ -76,13 +76,6 @@ void Panel_setSelectionColor(Panel* this, ColorElements colorId) { this->selectionColorId = colorId; } -RichString* Panel_getHeader(Panel* this) { - assert (this != NULL); - - this->needsRedraw = true; - return &(this->header); -} - inline void Panel_setHeader(Panel* this, const char* header) { RichString_writeWide(&(this->header), CRT_colors[PANEL_HEADER_FOCUS], header); this->needsRedraw = true; @@ -228,15 +221,20 @@ void Panel_draw(Panel* this, bool force_redraw, bool focus, bool highlightSelect int x = this->x; int h = this->h; + const int header_attr = focus + ? CRT_colors[PANEL_HEADER_FOCUS] + : CRT_colors[PANEL_HEADER_UNFOCUS]; + if (force_redraw) { + if (Panel_printHeaderFn(this)) + Panel_printHeader(this); + else + RichString_setAttr(&this->header, header_attr); + } int headerLen = RichString_sizeVal(this->header); if (headerLen > 0) { - int attr = focus - ? CRT_colors[PANEL_HEADER_FOCUS] - : CRT_colors[PANEL_HEADER_UNFOCUS]; - attrset(attr); + attrset(header_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)); } diff --git a/Panel.h b/Panel.h index 959c0b78..63659e3c 100644 --- a/Panel.h +++ b/Panel.h @@ -37,11 +37,13 @@ typedef enum HandlerResult_ { typedef HandlerResult (*Panel_EventHandler)(Panel*, int); typedef void (*Panel_DrawFunctionBar)(Panel*); +typedef void (*Panel_PrintHeader)(Panel*); typedef struct PanelClass_ { const ObjectClass super; const Panel_EventHandler eventHandler; const Panel_DrawFunctionBar drawFunctionBar; + const Panel_PrintHeader printHeader; } PanelClass; #define As_Panel(this_) ((const PanelClass*)((this_)->super.klass)) @@ -49,6 +51,8 @@ typedef struct PanelClass_ { #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_))) +#define Panel_printHeaderFn(this_) As_Panel(this_)->printHeader +#define Panel_printHeader(this_) (assert(As_Panel(this_)->printHeader), As_Panel(this_)->printHeader((Panel*)(this_))) struct Panel_ { Object super; @@ -84,8 +88,6 @@ void Panel_done(Panel* this); void Panel_setSelectionColor(Panel* this, ColorElements colorId); -RichString* Panel_getHeader(Panel* this); - void Panel_setHeader(Panel* this, const char* header); void Panel_move(Panel* this, int x, int y); diff --git a/ScreenManager.c b/ScreenManager.c index 57cb564d..4c74e477 100644 --- a/ScreenManager.c +++ b/ScreenManager.c @@ -141,7 +141,7 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { bool timedOut = true; bool redraw = true; - bool force_redraw = false; + bool force_redraw = true; bool rescan = false; int sortTimeout = 0; int resetSortTimeout = 5; diff --git a/htop.c b/htop.c index 4b43ed2a..aa6d9147 100644 --- a/htop.c +++ b/htop.c @@ -313,8 +313,6 @@ int main(int argc, char** argv) { MainPanel_updateTreeFunctions(panel, settings->treeView); - ProcessList_printHeader(pl, Panel_getHeader((Panel*)panel)); - State state = { .settings = settings, .ut = ut,