Improve resizing the sidebar - sfeed_curses - sfeed curses UI (now part of sfeed, development is in sfeed)
(HTM) git clone git://git.codemadness.org/sfeed_curses
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 7d9d4d493a90bbd56bbe5cf175970a32ecb915bd
(DIR) parent a9deda50bcc3a23a8876237cd72b69c62ac21db0
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Tue, 16 Mar 2021 18:08:19 +0100
Improve resizing the sidebar
- Make sure the value of the actual set pane width / height using
getsidebarsize and checking it in updatesidebar() is the same and not out of
sync, which would unnecesarily call updategeom() and redraw unnecesary part.
This would be reproducable in a rare case when the window height is 1 row and
the feeds are toggled with 't'.
- Separate calculating the optimal default size of the feedbar in a
getsidebarsizedefault() function.
- Clamp the minimal and maximum value when adjusting the sidebar size depending
on the layout. This also fixes an issue in horizontal layout mode when the
sidebar is 1 column high. It would require 2 keypresses (instead of 1) to
increase the sidebar.
- Only call updategeom() when it actually changed.
Diffstat:
M sfeed_curses.c | 70 ++++++++++++++++++++++---------
1 file changed, 51 insertions(+), 19 deletions(-)
---
(DIR) diff --git a/sfeed_curses.c b/sfeed_curses.c
@@ -905,7 +905,7 @@ setlayout(int n)
void
updategeom(void)
{
- int barsize, h, w, x = 0, y = 0;
+ int h, w, x = 0, y = 0;
panes[PaneFeeds].hidden = layout == LayoutMonocle && (selpane != PaneFeeds);
panes[PaneItems].hidden = layout == LayoutMonocle && (selpane != PaneItems);
@@ -920,10 +920,7 @@ updategeom(void)
switch (layout) {
case LayoutVertical:
- /* NOTE: updatesidebar() must happen before this function for the
- remaining width */
- barsize = getsidebarsize();
- panes[PaneFeeds].width = MAX(barsize, 0);
+ panes[PaneFeeds].width = getsidebarsize();
x += panes[PaneFeeds].width;
w -= panes[PaneFeeds].width;
@@ -935,8 +932,7 @@ updategeom(void)
panes[PaneFeeds].height = MAX(h, 1);
break;
case LayoutHorizontal:
- barsize = getsidebarsize();
- panes[PaneFeeds].height = MAX(barsize, 1);
+ panes[PaneFeeds].height = getsidebarsize();
h -= panes[PaneFeeds].height;
y += panes[PaneFeeds].height;
@@ -1470,17 +1466,14 @@ feeds_reloadall(void)
updatetitle();
}
+/* calculate optimal (default) size */
int
-getsidebarsize(void)
+getsidebarsizedefault(void)
{
struct feed *feed;
size_t i;
int len, size;
- /* fixed sidebar size? else calculate an optimal size automatically */
- if (fixedsidebarsizes[layout] >= 0)
- return fixedsidebarsizes[layout];
-
switch (layout) {
case LayoutVertical:
for (i = 0, size = 0; i < nfeeds; i++) {
@@ -1507,6 +1500,51 @@ getsidebarsize(void)
return 0;
}
+int
+getsidebarsize(void)
+{
+ int size;
+
+ /* fixed sidebar size? else calculate an optimal size */
+ if ((size = fixedsidebarsizes[layout]) < 0)
+ size = getsidebarsizedefault();
+
+ switch (layout) {
+ case LayoutVertical:
+ return MAX(size, 0);
+ case LayoutHorizontal:
+ return MAX(size, 1);
+ }
+
+ return size;
+}
+
+void
+adjustsidebarsize(int n)
+{
+ int size;
+
+ /* fixed sidebar size? else calculate an optimal size */
+ if ((size = fixedsidebarsizes[layout]) < 0)
+ size = getsidebarsizedefault();
+ if (n > 0) {
+ if (layout == LayoutVertical && size + 1 < win.width)
+ size++;
+ else if (layout == LayoutHorizontal && size + 1 < win.height)
+ size++;
+ } else if (n < 0) {
+ if (layout == LayoutVertical && size > 0)
+ size--;
+ else if (layout == LayoutHorizontal && size > 1)
+ size--;
+ }
+
+ if (size != fixedsidebarsizes[layout]) {
+ fixedsidebarsizes[layout] = size;
+ updategeom();
+ }
+}
+
void
updatesidebar(void)
{
@@ -2174,13 +2212,7 @@ nextpage:
break;
case '<': /* decrease fixed sidebar width */
case '>': /* increase fixed sidebar width */
- if (fixedsidebarsizes[layout] < 0)
- fixedsidebarsizes[layout] = getsidebarsize();
- if (ch == '<' && fixedsidebarsizes[layout] > 0)
- fixedsidebarsizes[layout]--;
- else if (ch != '<')
- fixedsidebarsizes[layout]++;
- updategeom();
+ adjustsidebarsize(ch == '<' ? -1 : +1);
break;
case '=': /* reset fixed sidebar to automatic size */
fixedsidebarsizes[layout] = -1;