summaryrefslogtreecommitdiff
path: root/sys-process/htop/files/htop-3.0.4-sort_column_header_highlight.patch
blob: a2b6a0d4259a6a38c98a918efcbf8a428f1f3bcc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
From 86d293125565a15bbd94683080dbc755c5d7edee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
Date: Tue, 22 Dec 2020 17:12:38 +0100
Subject: [PATCH] Restore highlighted header of current sorted process column

---
 MainPanel.c     | 10 ++++++++--
 Panel.c         | 22 ++++++++++------------
 Panel.h         |  6 ++++--
 ScreenManager.c |  2 +-
 htop.c          |  2 --
 5 files changed, 23 insertions(+), 19 deletions(-)

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,