summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--catgirl.17
-rw-r--r--ui.c45
2 files changed, 51 insertions, 1 deletions
diff --git a/catgirl.1 b/catgirl.1
index ac558a9..5e333a8 100644
--- a/catgirl.1
+++ b/catgirl.1
@@ -260,6 +260,13 @@ Switch to previous window.
Switch to previously selected window.
.It Ic M-a
Cycle through unread windows.
+.It Ic M-l
+List the contents of the window
+without word-wrapping.
+Press
+.Ic Enter
+to return to
+.Nm .
.It Ic M-m
Insert a blank line in the window.
.It Ic M- Ns Ar n
diff --git a/ui.c b/ui.c
index b3b98dd..66c695f 100644
--- a/ui.c
+++ b/ui.c
@@ -157,6 +157,7 @@ static const char *EnterPasteMode = "\33[?2004h";
static const char *ExitPasteMode = "\33[?2004l";
static bool hidden;
+static bool waiting;
void uiShow(void) {
putp(EnterFocusMode);
@@ -204,6 +205,7 @@ static void errExit(void) {
X(KeyMetaB, "\33b") \
X(KeyMetaD, "\33d") \
X(KeyMetaF, "\33f") \
+ X(KeyMetaL, "\33l") \
X(KeyMetaM, "\33m") \
X(KeyMetaU, "\33u") \
X(KeyMetaSlash, "\33/") \
@@ -528,6 +530,37 @@ static void resize(void) {
statusUpdate();
}
+static void bufferList(struct Buffer *buffer) {
+ uiHide();
+ waiting = true;
+ for (size_t i = 0; i < BufferCap; ++i) {
+ time_t time = buffer->times[(buffer->len + i) % BufferCap];
+ const char *line = buffer->lines[(buffer->len + i) % BufferCap];
+ if (!line) continue;
+
+ struct tm *tm = localtime(&time);
+ if (!tm) continue;
+ char buf[sizeof("[00:00:00]")];
+ strftime(buf, sizeof(buf), "[%T]", tm);
+ vid_attr(colorAttr(mapColor(Gray)), colorPair(mapColor(Gray), -1), NULL);
+ printf("%s\t", buf);
+
+ size_t len;
+ struct Style style = Reset;
+ while (*line) {
+ styleParse(&style, &line, &len);
+ vid_attr(
+ style.attr | colorAttr(mapColor(style.fg)),
+ colorPair(mapColor(style.fg), mapColor(style.bg)),
+ NULL
+ );
+ if (len) printf("%.*s", (int)len, line);
+ line += len;
+ }
+ printf("\n");
+ }
+}
+
static void inputAdd(struct Style *style, const char *str) {
size_t len;
while (*str) {
@@ -702,6 +735,7 @@ static void keyCode(int code) {
break; case KeyMetaB: edit(id, EditPrevWord, 0);
break; case KeyMetaD: edit(id, EditDeleteNextWord, 0);
break; case KeyMetaF: edit(id, EditNextWord, 0);
+ break; case KeyMetaL: bufferList(&window->buffer);
break; case KeyMetaM: waddch(window->pad, '\n');
break; case KeyMetaU: windowScrollUnread(window);
@@ -760,7 +794,16 @@ static void keyStyle(wchar_t ch) {
}
void uiRead(void) {
- if (hidden) return;
+ if (hidden) {
+ if (waiting) {
+ uiShow();
+ flushinp();
+ waiting = false;
+ } else {
+ return;
+ }
+ }
+
int ret;
wint_t ch;
static bool style;