Hi Kevin,
I've ported the Sidebar and given your patches a bit of a test-drive.
Looking good.
https://github.com/neomutt/neomutt/tree/devel/win-sidebar
This simplifies Sidebar noticeably:
-90 lines in sidebar.c
-70 lines in other code
I've attached a couple of suggested changes.
* A patch fix the compile under slang
* A refactoring of mutt_reflow_windows()
To make the function a bit simpler, I've added some variables tracking
the remaining space. I've reordered the windows slightly to make the
maths easier. This also makes it easy to slot in the sidebar window.
For fun, I added a '$sidebar_on_right' variable, which works OK-ish.
Problems encountered so far:
The pager still uses some clrtoeol()s overwriting my right-Sidebar
mutt_FormatString() still references COLS
Fixing mutt_FormatString() isn't too hard, but it's used in over 40
places, so it'll be a bit tedious. Would you like me to look at it?
Rich
diff --git a/curs_lib.c b/curs_lib.c
index d7bc4ce..8af9a81 100644
--- a/curs_lib.c
+++ b/curs_lib.c
@@ -151,7 +151,7 @@ event_t mutt_getch (void)
int _mutt_get_field (const char *field, char *buf, size_t buflen, int
complete, int multiple, char ***files, int *numfiles)
{
int ret;
- int x;
+ int x, y;
ENTER_STATE *es = mutt_new_enter_state();
@@ -162,7 +162,7 @@ int _mutt_get_field (const char *field, char *buf, size_t
buflen, int complete,
addstr ((char *)field); /* cast to get around bad prototypes */
NORMAL_COLOR;
mutt_refresh ();
- x = getcurx (stdscr);
+ getyx (stdscr, y, x);
ret = _mutt_enter_string (buf, buflen, x, complete, multiple, files,
numfiles, es);
}
while (ret == 1);
@@ -577,7 +577,12 @@ int mutt_window_mvprintw (mutt_window_t *win, int row, int
col, const char *fmt,
if ((rv = mutt_window_move (win, row, col) != ERR))
{
va_start (ap, fmt);
+#ifdef USE_SLANG_CURSES
+ SLsmg_vprintf (fmt, ap);
+ rv = 0;
+#else
rv = vw_printw (stdscr, fmt, ap);
+#endif
va_end (ap);
}
void mutt_reflow_windows (void)
{
if (option (OPTNOCURSES))
return;
dprint (2, (debugfile, "In mutt_reflow_windows\n"));
/* Remaining space */
int x = 0;
int y = 0;
int w = COLS;
int h = LINES;
MuttMessageWindow->rows = 1;
MuttMessageWindow->cols = w;
MuttMessageWindow->row_offset = h - 1;
MuttMessageWindow->col_offset = 0;
h -= MuttMessageWindow->rows;
if (option (OPTHELP))
MuttHelpWindow->rows = 1;
else
MuttHelpWindow->rows = 0;
MuttHelpWindow->cols = w;
MuttHelpWindow->col_offset = x;
if (option (OPTSTATUSONTOP)) {
MuttHelpWindow->row_offset = y + h - 1;
} else {
MuttHelpWindow->row_offset = y;
y += MuttHelpWindow->rows;
}
h -= MuttHelpWindow->rows;
MuttStatusWindow->rows = 1;
MuttStatusWindow->cols = w;
MuttStatusWindow->col_offset = x;
if (option (OPTSTATUSONTOP)) {
MuttStatusWindow->row_offset = y;
y += MuttStatusWindow->rows;
} else {
MuttStatusWindow->row_offset = y + h - 1;
}
h -= MuttStatusWindow->rows;
MuttIndexWindow->rows = h;
MuttIndexWindow->cols = w;
MuttIndexWindow->row_offset = y;
MuttIndexWindow->col_offset = x;
}