Add term.c for extra terminal features

Look at the cute little state machine!
这个提交包含在:
Curtis McEnroe 2018-08-11 15:49:39 -04:00
父节点 fec5e51d78
当前提交 461bfca378
找不到此签名对应的密钥
GPG 密钥 ID: CEA2F97ADCFCD77C
共有 4 个文件被更改,包括 69 次插入1 次删除

查看文件

@ -3,7 +3,7 @@ CFLAGS += -Wall -Wextra -Wpedantic
CFLAGS += -I/usr/local/include -I/usr/local/opt/libressl/include
LDFLAGS += -L/usr/local/lib -L/usr/local/opt/libressl/lib
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

1
README
查看文件

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

14
chat.h
查看文件

@ -79,6 +79,20 @@ void uiTopic(struct Tag tag, const char *topic);
void uiLog(struct Tag tag, const wchar_t *line);
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 {
EDIT_LEFT,
EDIT_RIGHT,

53
term.c 普通文件
查看文件

@ -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;
}