Add term.c for extra terminal features

Look at the cute little state machine!
Tento commit je obsažen v:
Curtis McEnroe 2018-08-11 15:49:39 -04:00
rodič fec5e51d78
revize 461bfca378
V databázi nebyl nalezen žádný známý klíč pro tento podpis
ID GPG klíče: CEA2F97ADCFCD77C
4 změnil soubory, kde provedl 69 přidání a 1 odebrání

Zobrazit soubor

@ -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
Zobrazit soubor

@ -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
Zobrazit soubor

@ -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 Normální soubor
Zobrazit soubor

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