Add extremely basic editing and message sending
parent
0df8bd51aa
commit
4cce893eab
1
Makefile
1
Makefile
|
@ -6,6 +6,7 @@ CFLAGS += -std=c11 -Wall -Wextra -Wpedantic
|
|||
LDLIBS = -lcurses -lcrypto -ltls
|
||||
|
||||
OBJS += chat.o
|
||||
OBJS += command.o
|
||||
OBJS += edit.o
|
||||
OBJS += handle.o
|
||||
OBJS += irc.o
|
||||
|
|
12
chat.h
12
chat.h
|
@ -20,6 +20,7 @@
|
|||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <time.h>
|
||||
#include <wchar.h>
|
||||
|
||||
#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0]))
|
||||
#define BIT(x) x##Bit, x = 1 << x##Bit, x##Bit_ = x##Bit
|
||||
|
@ -109,6 +110,7 @@ void ircFormat(const char *format, ...)
|
|||
__attribute__((format(printf, 1, 2)));
|
||||
|
||||
void handle(struct Message msg);
|
||||
void command(size_t id, char *input);
|
||||
|
||||
enum Heat { Cold, Warm, Hot };
|
||||
void uiInit(void);
|
||||
|
@ -122,8 +124,14 @@ void uiFormat(
|
|||
size_t id, enum Heat heat, const time_t *time, const char *format, ...
|
||||
) __attribute__((format(printf, 4, 5)));
|
||||
|
||||
const char *editHead(void);
|
||||
const char *editTail(void);
|
||||
enum Edit {
|
||||
EditKill,
|
||||
EditInsert,
|
||||
EditEnter,
|
||||
};
|
||||
void edit(size_t id, enum Edit op, wchar_t ch);
|
||||
char *editHead(void);
|
||||
char *editTail(void);
|
||||
|
||||
static inline enum Color hash(const char *str) {
|
||||
if (*str == '~') str++;
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
/* Copyright (C) 2020 C. McEnroe <june@causal.agency>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "chat.h"
|
||||
|
||||
void command(size_t id, char *input) {
|
||||
ircFormat("PRIVMSG %s :%s\r\n", idNames[id], input);
|
||||
struct Message msg = {
|
||||
.nick = self.nick,
|
||||
// TODO: .user,
|
||||
.cmd = "PRIVMSG",
|
||||
.params[0] = idNames[id],
|
||||
.params[1] = input,
|
||||
};
|
||||
handle(msg);
|
||||
}
|
32
edit.c
32
edit.c
|
@ -23,22 +23,40 @@
|
|||
#include "chat.h"
|
||||
|
||||
enum { Cap = 512 };
|
||||
static wchar_t buf[Cap] = L"foo\0033bar\3baz";
|
||||
static size_t len = 12;
|
||||
static size_t pos = 6;
|
||||
static wchar_t buf[Cap];
|
||||
static size_t len;
|
||||
static size_t pos;
|
||||
|
||||
const char *editHead(void) {
|
||||
char *editHead(void) {
|
||||
static char mbs[MB_LEN_MAX * Cap];
|
||||
const wchar_t *ptr = buf;
|
||||
size_t n = wcsnrtombs(mbs, &ptr, pos, sizeof(mbs), NULL);
|
||||
size_t n = wcsnrtombs(mbs, &ptr, pos, sizeof(mbs) - 1, NULL);
|
||||
assert(n != (size_t)-1);
|
||||
mbs[n] = '\0';
|
||||
return mbs;
|
||||
}
|
||||
|
||||
const char *editTail(void) {
|
||||
char *editTail(void) {
|
||||
static char mbs[MB_LEN_MAX * Cap];
|
||||
const wchar_t *ptr = &buf[pos];
|
||||
size_t n = wcsnrtombs(mbs, &ptr, len - pos, sizeof(mbs), NULL);
|
||||
size_t n = wcsnrtombs(mbs, &ptr, len - pos, sizeof(mbs) - 1, NULL);
|
||||
assert(n != (size_t)-1);
|
||||
mbs[n] = '\0';
|
||||
return mbs;
|
||||
}
|
||||
|
||||
void edit(size_t id, enum Edit op, wchar_t ch) {
|
||||
switch (op) {
|
||||
break; case EditKill: len = pos = 0;
|
||||
break; case EditInsert: {
|
||||
if (len == Cap) break;
|
||||
buf[pos++] = ch;
|
||||
len++;
|
||||
}
|
||||
break; case EditEnter: {
|
||||
pos = 0;
|
||||
command(id, editTail());
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
5
ui.c
5
ui.c
|
@ -498,8 +498,11 @@ static void keyMeta(wchar_t ch) {
|
|||
}
|
||||
|
||||
static void keyCtrl(wchar_t ch) {
|
||||
size_t id = windows.active->id;
|
||||
switch (ch) {
|
||||
break; case L'J': edit(id, EditEnter, 0);
|
||||
break; case L'L': clearok(curscr, true);
|
||||
break; case L'U': edit(id, EditKill, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -518,7 +521,7 @@ void uiRead(void) {
|
|||
} else if (iswcntrl(ch)) {
|
||||
keyCtrl(ch ^ L'@');
|
||||
} else {
|
||||
// TODO: Insert.
|
||||
edit(windows.active->id, EditInsert, ch);
|
||||
}
|
||||
meta = false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue