1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-12-23 20:23:25 +01:00

add line kill and discard ability

This commit is contained in:
Jfreegman 2013-12-05 22:55:14 -05:00
parent 2ad238d69f
commit 7a14845790
7 changed files with 76 additions and 14 deletions

View File

@ -296,6 +296,18 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key)
del_char_buf_frnt(ctx->line, &ctx->pos, &ctx->len);
}
else if (key == T_KEY_DISCARD) { /* CTRL-U: Delete entire line behind pos */
if (ctx->pos > 0) {
discard_buf(ctx->line, &ctx->pos, &ctx->len);
wmove(self->window, y2 - CURS_Y_OFFSET, 0);
}
}
else if (key == T_KEY_KILL) { /* CTRL-K: Delete entire line in front of pos */
if (ctx->pos != ctx->len)
kill_buf(ctx->line, &ctx->pos, &ctx->len);
}
else if (key == KEY_HOME) { /* HOME key: Move cursor to beginning of line */
if (ctx->pos > 0) {
ctx->pos = 0;

View File

@ -239,6 +239,18 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
del_char_buf_frnt(ctx->line, &ctx->pos, &ctx->len);
}
else if (key == T_KEY_DISCARD) { /* CTRL-U: Delete entire line behind pos */
if (ctx->pos > 0) {
discard_buf(ctx->line, &ctx->pos, &ctx->len);
wmove(self->window, y2 - CURS_Y_OFFSET, 0);
}
}
else if (key == T_KEY_KILL) { /* CTRL-K: Delete entire line in front of pos */
if (ctx->pos != ctx->len)
kill_buf(ctx->line, &ctx->pos, &ctx->len);
}
else if (key == KEY_HOME) { /* HOME key: Move cursor to beginning of line */
if (ctx->pos > 0) {
ctx->pos = 0;

View File

@ -439,6 +439,7 @@ void exit_toxic(Tox *m)
free(DATA_FILE);
free(SRVLIST_FILE);
free(prompt->stb);
free(prompt->promptbuf);
tox_kill(m);
endwin();
exit(EXIT_SUCCESS);

View File

@ -211,6 +211,32 @@ void del_char_buf_frnt(wchar_t *buf, size_t *pos, size_t *len)
--(*len);
}
/* Deletes the entire line before pos */
void discard_buf(wchar_t *buf, size_t *pos, size_t *len)
{
if (*pos <= 0)
return;
int i;
int c = 0;
for (i = *pos; i <= *len; ++i)
buf[c++] = buf[i];
*pos = 0;
*len = c - 1;
}
/* Deletes the entire line in front of pos */
void kill_buf(wchar_t *buf, size_t *pos, size_t *len)
{
if (*len == *pos)
return;
buf[*pos] = L'\0';
*len = *pos;
}
/* nulls buf and sets pos and len to 0 */
void reset_buf(wchar_t *buf, size_t *pos, size_t *len)
{

View File

@ -93,6 +93,16 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key)
}
}
else if (key == T_KEY_DISCARD) { /* CTRL-U: Delete entire line behind pos */
if (prt->pos > 0)
discard_buf(prt->line, &prt->pos, &prt->len);
}
else if (key == T_KEY_KILL) { /* CTRL-K: Delete entire line in front of pos */
if (prt->len != prt->pos)
kill_buf(prt->line, &prt->pos, &prt->len);
}
else if (key == KEY_HOME) { /* HOME key: Move cursor to beginning of line */
if (prt->pos != 0)
prt->pos = 0;
@ -125,7 +135,7 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key)
}
/* RETURN key: execute command */
else if (key == '\n') {
wprintw(self->window, "\n");
wprintw(self->window, "\n");
uint8_t *line = wcs_to_char(prt->line);
execute(self->window, self, m, line, GLOBAL_COMMAND_MODE);
reset_buf(prt->line, &prt->pos, &prt->len);
@ -153,9 +163,8 @@ static void prompt_onDraw(ToxWindow *self, Tox *m)
if (prt->len > 0) {
mvwprintw(self->window, prt->orig_y, X_OFST, wcs_to_char(prt->line));
/* y distance between pos and len */
int d = prt->pos < (prt->len - px2) ? (y2 - y - 1) : 0;
int d = y2 - y - 1;
/* 1 if end of line is touching bottom of window, 0 otherwise */
int bot = prt->orig_y + ((prt->len + p_ofst) / px2) == y2;
@ -166,14 +175,14 @@ static void prompt_onDraw(ToxWindow *self, Tox *m)
prt->scroll = false;
}
} else {
prt->orig_y = y; /* Mark point of origin for new line */
wattron(self->window, COLOR_PAIR(GREEN));
mvwprintw(self->window, y, 0, "$ ");
wattroff(self->window, COLOR_PAIR(GREEN));
} else { /* Mark point of origin for new line */
prt->orig_y = y;
}
wattron(self->window, COLOR_PAIR(GREEN));
mvwprintw(self->window, prt->orig_y, 0, "$ ");
wattroff(self->window, COLOR_PAIR(GREEN));
StatusBar *statusbar = self->stb;
werase(statusbar->topline);
mvwhline(statusbar->topline, 1, 0, ACS_HLINE, x2);
@ -216,8 +225,8 @@ static void prompt_onDraw(ToxWindow *self, Tox *m)
wattroff(statusbar->topline, A_BOLD);
/* put cursor back in correct spot */
int y_m = prt->pos <= 0 ? prt->orig_y : prt->orig_y + ((prt->pos + p_ofst) / px2);
int x_m = prt->pos > 0 ? (prt->pos + X_OFST) % x2 : X_OFST;
int y_m = prt->orig_y + ((prt->pos + p_ofst) / px2);
int x_m = (prt->pos + X_OFST) % x2;
wmove(self->window, y_m, x_m);
}
@ -256,7 +265,6 @@ static void prompt_onConnectionChange(ToxWindow *self, Tox *m, int friendnum , u
wprintw(self->window, "has gone offline\n");
wattroff(self->window, COLOR_PAIR(RED));
}
}
static void prompt_onFriendRequest(ToxWindow *self, uint8_t *key, uint8_t *data, uint16_t length)

View File

@ -5,7 +5,7 @@
#ifndef PROMPT_H_UZYGWFFL
#define PROMPT_H_UZYGWFFL
#define X_OFST 2 /* offset to account for prompt "# " */
#define X_OFST 2 /* offset to account for prompt char */
ToxWindow new_prompt(void);
void prompt_init_statusbar(ToxWindow *self, Tox *m);

View File

@ -29,6 +29,9 @@
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#define T_KEY_KILL 0xB /* ASCII code for ctrl-k */
#define T_KEY_DISCARD 0x15 /* ASCII code for ctrl-u */
/* Curses foreground colours (background is black) */
enum {
WHITE,
@ -114,7 +117,7 @@ struct PromptBuf {
wchar_t line[MAX_STR_SIZE];
size_t pos;
size_t len;
int orig_y;
int orig_y; /* y axis point of origin for line */
bool scroll; /* used for prompt window hack to determine when to scroll down */
WINDOW *linewin;
};