Add term.c for extra terminal features

Look at the cute little state machine!
weechat-hashes
Curtis McEnroe 2018-08-11 15:49:39 -04:00
parent fec5e51d78
commit 461bfca378
No known key found for this signature in database
GPG Key ID: CEA2F97ADCFCD77C
4 changed files with 69 additions and 1 deletions

View File

@ -3,7 +3,7 @@ CFLAGS += -Wall -Wextra -Wpedantic
CFLAGS += -I/usr/local/include -I/usr/local/opt/libressl/include CFLAGS += -I/usr/local/include -I/usr/local/opt/libressl/include
LDFLAGS += -L/usr/local/lib -L/usr/local/opt/libressl/lib LDFLAGS += -L/usr/local/lib -L/usr/local/opt/libressl/lib
LDLIBS = -lcursesw -ltls LDLIBS = -lcursesw -ltls
OBJS = chat.o edit.o handle.o input.o irc.o pls.o tab.o tag.o ui.o url.o OBJS = chat.o edit.o handle.o input.o irc.o pls.o tab.o tag.o term.o ui.o url.o
all: tags chat all: tags chat

1
README
View File

@ -9,6 +9,7 @@ This software requires LibreSSL and targets FreeBSD and Darwin.
input.c Input command handling input.c Input command handling
irc.c TLS client connection irc.c TLS client connection
ui.c Curses UI and mIRC formatting ui.c Curses UI and mIRC formatting
term.c Terminal features unsupported by curses
edit.c Line editing edit.c Line editing
tab.c Tab-complete tab.c Tab-complete
url.c URL detection url.c URL detection

14
chat.h
View File

@ -79,6 +79,20 @@ void uiTopic(struct Tag tag, const char *topic);
void uiLog(struct Tag tag, const wchar_t *line); void uiLog(struct Tag tag, const wchar_t *line);
void uiFmt(struct Tag tag, const wchar_t *format, ...); void uiFmt(struct Tag tag, const wchar_t *format, ...);
enum TermMode {
TERM_FOCUS,
TERM_PASTE,
};
enum TermEvent {
TERM_NONE,
TERM_FOCUS_IN,
TERM_FOCUS_OUT,
TERM_PASTE_START,
TERM_PASTE_END,
};
void termMode(enum TermMode mode, bool set);
enum TermEvent termEvent(char ch);
enum Edit { enum Edit {
EDIT_LEFT, EDIT_LEFT,
EDIT_RIGHT, EDIT_RIGHT,

53
term.c 100644
View File

@ -0,0 +1,53 @@
/* Copyright (C) 2018 Curtis McEnroe <june@causal.agency>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "chat.h"
#define PAIR(a, b) (((short)(a) << 8) | ((short)(b) & 0xFF))
static void privateMode(const char *mode, bool set) {
printf("\33[?%s%c", mode, (set ? 'h' : 'l'));
fflush(stdout);
}
void termMode(enum TermMode mode, bool set) {
switch (mode) {
break; case TERM_FOCUS: privateMode("1004", set);
break; case TERM_PASTE: privateMode("2004", set);
}
}
enum TermEvent termEvent(char ch) {
static char state = '\0';
switch (PAIR(state, ch)) {
break; case PAIR('\0', '\33'): state = '\33';
break; case PAIR('\33', '['): state = '[';
break; case PAIR('[', 'I'): state = '\0'; return TERM_FOCUS_IN;
break; case PAIR('[', 'O'): state = '\0'; return TERM_FOCUS_OUT;
break; case PAIR('[', '2'): state = '2';
break; case PAIR('2', '0'): state = '0';
break; case PAIR('0', '0'): state = '0';
break; case PAIR('0', '~'): state = '\0'; return TERM_PASTE_START;
break; case PAIR('0', '1'): state = '1';
break; case PAIR('1', '~'): state = '\0'; return TERM_PASTE_END;
break; default: state = '\0';
}
return TERM_NONE;
}