summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ui.c61
1 files changed, 38 insertions, 23 deletions
diff --git a/ui.c b/ui.c
index e91bd26..5b7ef5e 100644
--- a/ui.c
+++ b/ui.c
@@ -46,9 +46,18 @@
#define A_ITALIC A_NORMAL
#endif
+enum {
+ StatusLines = 1,
+ WindowLines = 1024,
+ MarkerLines = 1,
+ SplitLines = 5,
+ InputLines = 1,
+ InputCols = 1024,
+};
+
#define BOTTOM (LINES - 1)
#define RIGHT (COLS - 1)
-#define PAGE_LINES (LINES - 2)
+#define MAIN_LINES (LINES - StatusLines - InputLines)
static WINDOW *status;
static WINDOW *marker;
@@ -82,7 +91,6 @@ static struct Line bufferLine(const struct Buffer *buffer, size_t i) {
return buffer->lines[(buffer->len + i) % BufferCap];
}
-enum { WindowLines = BufferCap };
struct Window {
uint id;
WINDOW *pad;
@@ -264,8 +272,6 @@ static void errExit(void) {
reset_shell_mode();
}
-enum { SplitLines = 5 };
-
void uiInit(void) {
initscr();
cbreak();
@@ -284,13 +290,16 @@ void uiInit(void) {
ENUM_KEY
#undef X
- status = newwin(1, COLS, 0, 0);
+ status = newwin(StatusLines, COLS, 0, 0);
if (!status) err(EX_OSERR, "newwin");
- marker = newwin(1, COLS, BOTTOM - SplitLines - 1, 0);
+ marker = newwin(
+ MarkerLines, COLS,
+ LINES - InputLines - SplitLines - MarkerLines, 0
+ );
wbkgd(marker, ACS_BULLET);
- input = newpad(1, 1024);
+ input = newpad(InputLines, InputCols);
if (!input) err(EX_OSERR, "newpad");
keypad(input, true);
nodelay(input, true);
@@ -309,20 +318,27 @@ void uiDraw(void) {
if (hidden) return;
wnoutrefresh(status);
const struct Window *window = windows.ptrs[windows.show];
- pnoutrefresh(
- window->pad,
- WindowLines - window->scroll - PAGE_LINES + !!window->scroll, 0,
- 1, 0,
- BOTTOM - 1 - !!window->scroll, RIGHT
- );
- if (window->scroll) {
+ if (!window->scroll) {
+ pnoutrefresh(
+ window->pad,
+ WindowLines - MAIN_LINES, 0,
+ StatusLines, 0,
+ BOTTOM - InputLines, RIGHT
+ );
+ } else {
+ pnoutrefresh(
+ window->pad,
+ WindowLines - window->scroll - MAIN_LINES + MarkerLines, 0,
+ StatusLines, 0,
+ BOTTOM - InputLines - SplitLines - MarkerLines, RIGHT
+ );
touchwin(marker);
wnoutrefresh(marker);
pnoutrefresh(
window->pad,
WindowLines - SplitLines, 0,
- BOTTOM - SplitLines, 0,
- BOTTOM - 1, RIGHT
+ LINES - InputLines - SplitLines, 0,
+ BOTTOM - InputLines, RIGHT
);
}
int y, x;
@@ -330,7 +346,7 @@ void uiDraw(void) {
pnoutrefresh(
input,
0, (x + 1 > RIGHT ? x + 1 - RIGHT : 0),
- BOTTOM, 0,
+ LINES - InputLines, 0,
BOTTOM, RIGHT
);
(void)y;
@@ -517,21 +533,20 @@ void uiHide(void) {
static void windowScroll(struct Window *window, int n) {
mark(window);
window->scroll += n;
- if (window->scroll > WindowLines - PAGE_LINES) {
- window->scroll = WindowLines - PAGE_LINES;
+ if (window->scroll > WindowLines - MAIN_LINES) {
+ window->scroll = WindowLines - MAIN_LINES;
}
if (window->scroll < 0) window->scroll = 0;
unmark(window);
}
static void windowScrollPage(struct Window *window, int n) {
- // -1 for split marker, -1 for line of overlap.
- windowScroll(window, n * (PAGE_LINES - SplitLines - 2));
+ windowScroll(window, n * (MAIN_LINES - SplitLines - MarkerLines - 1));
}
static void windowScrollUnread(struct Window *window) {
window->scroll = 0;
- windowScroll(window, window->unreadSoft - PAGE_LINES + 1);
+ windowScroll(window, window->unreadSoft - MAIN_LINES);
}
static int wordWidth(const char *str) {
@@ -687,7 +702,7 @@ static void reflow(struct Window *window) {
}
static void resize(void) {
- mvwin(marker, BOTTOM - SplitLines - 1, 0);
+ mvwin(marker, LINES - InputLines - SplitLines - MarkerLines, 0);
int height, width;
getmaxyx(windows.ptrs[0]->pad, height, width);
if (width == COLS) return;