1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-06-29 16:27:45 +02:00

refactor prompt to allow scrolling

This commit is contained in:
Jfreegman 2014-03-25 03:17:22 -04:00
parent a40b6b1b1b
commit 5e941427d3
8 changed files with 252 additions and 209 deletions

View File

@ -53,22 +53,19 @@ void cmd_chat_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*arg
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 1, CYAN); line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 1, CYAN);
#ifdef _SUPPORT_AUDIO #ifdef _SUPPORT_AUDIO
#define NUMLINES 11 #define NUMLINES 12
#else #else
#define NUMLINES 7 #define NUMLINES 8
#endif #endif
uint8_t lines[NUMLINES][MAX_STR_SIZE] = { uint8_t lines[NUMLINES][MAX_STR_SIZE] = {
#ifdef _SUPPORT_AUDIO #ifdef _SUPPORT_AUDIO
{ " /call : Audio call" }, { " /call : Audio call" },
{ " /cancel : Cancel call" }, { " /cancel : Cancel call" },
{ " /answer : Answer incomming call" }, { " /answer : Answer incomming call" },
{ " /hangup : Hangup active call" }, { " /hangup : Hangup active call" },
#endif /* _SUPPORT_AUDIO */ #endif /* _SUPPORT_AUDIO */
{ " /invite <n> : Invite friend to a group chat" }, { " /invite <n> : Invite friend to a group chat" },
{ " /join : Join a pending group chat" }, { " /join : Join a pending group chat" },
{ " /log <on> or <off> : Enable/disable logging" }, { " /log <on> or <off> : Enable/disable logging" },
@ -76,7 +73,7 @@ void cmd_chat_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*arg
{ " /savefile <n> : Receive a file" }, { " /savefile <n> : Receive a file" },
{ " /close : Close the current chat window" }, { " /close : Close the current chat window" },
{ " /help : Print this message again" }, { " /help : Print this message again" },
//{ " /help global : Show a list of global commands" }, { " /help global : Show a list of global commands" },
}; };
int i; int i;
@ -84,7 +81,7 @@ void cmd_chat_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*arg
for (i = 0; i < NUMLINES; ++i) for (i = 0; i < NUMLINES; ++i)
line_info_add(self, NULL, NULL, NULL, lines[i], SYS_MSG, 0, 0); line_info_add(self, NULL, NULL, NULL, lines[i], SYS_MSG, 0, 0);
msg = " * Use ESC key to toggle history scroll mode"; msg = " * Use ESC key to toggle history scroll mode\n";
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 1, CYAN); line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 1, CYAN);
} }

View File

@ -32,6 +32,7 @@
#include "execute.h" #include "execute.h"
#include "chat_commands.h" #include "chat_commands.h"
#include "global_commands.h" #include "global_commands.h"
#include "line_info.h"
struct cmd_func { struct cmd_func {
const char *name; const char *name;
@ -76,7 +77,7 @@ static struct cmd_func chat_commands[] = {
/* Parses input command and puts args into arg array. /* Parses input command and puts args into arg array.
Returns number of arguments on success, -1 on failure. */ Returns number of arguments on success, -1 on failure. */
static int parse_command(WINDOW *w, char *cmd, char (*args)[MAX_STR_SIZE]) static int parse_command(WINDOW *w, ToxWindow *self, char *cmd, char (*args)[MAX_STR_SIZE])
{ {
int num_args = 0; int num_args = 0;
bool cmd_end = false; /* flags when we get to the end of cmd */ bool cmd_end = false; /* flags when we get to the end of cmd */
@ -88,7 +89,8 @@ static int parse_command(WINDOW *w, char *cmd, char (*args)[MAX_STR_SIZE])
end = strchr(cmd+1, '\"'); end = strchr(cmd+1, '\"');
if (end++ == NULL) { /* Increment past the end quote */ if (end++ == NULL) { /* Increment past the end quote */
wprintw(w, "Invalid argument. Did you forget a closing \"?\n"); uint8_t *errmsg = "Invalid argument. Did you forget a closing \"?";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return -1; return -1;
} }
@ -131,7 +133,7 @@ void execute(WINDOW* w, ToxWindow *self, Tox *m, char *cmd, int mode)
return; return;
char args[MAX_NUM_ARGS][MAX_STR_SIZE] = {0}; char args[MAX_NUM_ARGS][MAX_STR_SIZE] = {0};
int num_args = parse_command(w, cmd, args); int num_args = parse_command(w, self, cmd, args);
if (num_args == -1) if (num_args == -1)
return; return;
@ -153,5 +155,6 @@ void execute(WINDOW* w, ToxWindow *self, Tox *m, char *cmd, int mode)
if (do_command(w, self, m, num_args, GLOBAL_NUM_COMMANDS, global_commands, args) == 0) if (do_command(w, self, m, num_args, GLOBAL_NUM_COMMANDS, global_commands, args) == 0)
return; return;
wprintw(w, "Invalid command.\n"); uint8_t *errmsg = "Invalid command.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
} }

View File

@ -106,7 +106,6 @@ static void friendlist_onMessage(ToxWindow *self, Tox *m, int32_t num, uint8_t *
nick[TOXIC_MAX_NAME_LENGTH] = '\0'; nick[TOXIC_MAX_NAME_LENGTH] = '\0';
wprintw(prompt->window, "%s: %s\n", nick, str); wprintw(prompt->window, "%s: %s\n", nick, str);
prep_prompt_win();
wattron(prompt->window, COLOR_PAIR(RED)); wattron(prompt->window, COLOR_PAIR(RED));
wprintw(prompt->window, "* Warning: Too many windows are open.\n"); wprintw(prompt->window, "* Warning: Too many windows are open.\n");
wattron(prompt->window, COLOR_PAIR(RED)); wattron(prompt->window, COLOR_PAIR(RED));
@ -211,7 +210,6 @@ static void friendlist_onFileSendRequest(ToxWindow *self, Tox *m, int32_t num, u
tox_get_name(m, num, nick); tox_get_name(m, num, nick);
nick[TOXIC_MAX_NAME_LENGTH] = '\0'; nick[TOXIC_MAX_NAME_LENGTH] = '\0';
prep_prompt_win();
wattron(prompt->window, COLOR_PAIR(RED)); wattron(prompt->window, COLOR_PAIR(RED));
wprintw(prompt->window, "* File transfer from %s failed: too many windows are open.\n", nick); wprintw(prompt->window, "* File transfer from %s failed: too many windows are open.\n", nick);
wattron(prompt->window, COLOR_PAIR(RED)); wattron(prompt->window, COLOR_PAIR(RED));
@ -234,7 +232,6 @@ static void friendlist_onGroupInvite(ToxWindow *self, Tox *m, int32_t num, uint8
tox_get_name(m, num, nick); tox_get_name(m, num, nick);
nick[TOXIC_MAX_NAME_LENGTH] = '\0'; nick[TOXIC_MAX_NAME_LENGTH] = '\0';
prep_prompt_win();
wattron(prompt->window, COLOR_PAIR(RED)); wattron(prompt->window, COLOR_PAIR(RED));
wprintw(prompt->window, "* Group chat invite from %s failed: too many windows are open.\n", nick); wprintw(prompt->window, "* Group chat invite from %s failed: too many windows are open.\n", nick);
wattron(prompt->window, COLOR_PAIR(RED)); wattron(prompt->window, COLOR_PAIR(RED));
@ -343,7 +340,6 @@ static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key)
friends[f].chatwin = add_window(m, new_chat(m, friends[f].num)); friends[f].chatwin = add_window(m, new_chat(m, friends[f].num));
set_active_window(friends[f].chatwin); set_active_window(friends[f].chatwin);
} else { } else {
prep_prompt_win();
wattron(prompt->window, COLOR_PAIR(RED)); wattron(prompt->window, COLOR_PAIR(RED));
wprintw(prompt->window, "* Warning: Too many windows are open.\n"); wprintw(prompt->window, "* Warning: Too many windows are open.\n");
wattron(prompt->window, COLOR_PAIR(RED)); wattron(prompt->window, COLOR_PAIR(RED));
@ -539,8 +535,7 @@ static void friendlist_onAv(ToxWindow *self, ToxAv *av)
tox_get_name(m, id, nick); tox_get_name(m, id, nick);
nick[TOXIC_MAX_NAME_LENGTH] = '\0'; nick[TOXIC_MAX_NAME_LENGTH] = '\0';
wprintw(prompt->window, "Audio action from: %s!\n", nick); wprintw(prompt->window, "Audio action from: %s!\n", nick);
prep_prompt_win();
wattron(prompt->window, COLOR_PAIR(RED)); wattron(prompt->window, COLOR_PAIR(RED));
wprintw(prompt->window, "* Warning: Too many windows are open.\n"); wprintw(prompt->window, "* Warning: Too many windows are open.\n");
wattron(prompt->window, COLOR_PAIR(RED)); wattron(prompt->window, COLOR_PAIR(RED));

View File

@ -30,6 +30,7 @@
#include "toxic_windows.h" #include "toxic_windows.h"
#include "misc_tools.h" #include "misc_tools.h"
#include "friendlist.h" #include "friendlist.h"
#include "line_info.h"
extern char *DATA_FILE; extern char *DATA_FILE;
extern ToxWindow *prompt; extern ToxWindow *prompt;
@ -42,30 +43,34 @@ extern uint8_t num_frnd_requests;
/* command functions */ /* command functions */
void cmd_accept(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_accept(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{ {
/* check arguments */ uint8_t *msg;
if (argc != 1) { if (argc != 1) {
wprintw(window, "Invalid syntax.\n"); msg = "Invalid syntax.";
return; line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
return;
} }
int req = atoi(argv[1]); int req = atoi(argv[1]);
if ((req == 0 && strcmp(argv[1], "0"))|| req >= MAX_FRIENDS_NUM) { if ((req == 0 && strcmp(argv[1], "0"))|| req >= MAX_FRIENDS_NUM) {
wprintw(window, "No pending friend request with that number.\n"); msg = "No pending friend request with that number.";
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
return; return;
} }
if (!strlen(pending_frnd_requests[req])) { if (!strlen(pending_frnd_requests[req])) {
wprintw(window, "No pending friend request with that number.\n"); msg = "No pending friend request with that number.";
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
return; return;
} }
int32_t friendnum = tox_add_friend_norequest(m, pending_frnd_requests[req]); int32_t friendnum = tox_add_friend_norequest(m, pending_frnd_requests[req]);
if (friendnum == -1) if (friendnum == -1)
wprintw(window, "Failed to add friend.\n"); msg = "Failed to add friend.";
else { else {
wprintw(window, "Friend request accepted.\n"); msg = "Friend request accepted.";
on_friendadded(m, friendnum, true); on_friendadded(m, friendnum, true);
} }
@ -79,12 +84,16 @@ void cmd_accept(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[
} }
num_frnd_requests = i; num_frnd_requests = i;
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
} }
void cmd_add(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_add(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{ {
uint8_t *errmsg;
if (argc < 1) { if (argc < 1) {
wprintw(window, "Invalid syntax.\n"); errmsg = "Invalid syntax.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
@ -95,7 +104,8 @@ void cmd_add(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX
uint8_t *temp = argv[2]; uint8_t *temp = argv[2];
if (temp[0] != '\"') { if (temp[0] != '\"') {
wprintw(window, "Message must be enclosed in quotes.\n"); errmsg = "Message must be enclosed in quotes.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
@ -108,7 +118,8 @@ void cmd_add(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX
} }
if (strlen(id) != 2 * TOX_FRIEND_ADDRESS_SIZE) { if (strlen(id) != 2 * TOX_FRIEND_ADDRESS_SIZE) {
wprintw(window, "Invalid ID length.\n"); errmsg = "Invalid ID length.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
@ -123,7 +134,8 @@ void cmd_add(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX
xx[2] = '\0'; xx[2] = '\0';
if (sscanf(xx, "%02x", &x) != 1) { if (sscanf(xx, "%02x", &x) != 1) {
wprintw(window, "Invalid ID.\n"); errmsg = "Invalid ID.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
@ -138,31 +150,33 @@ void cmd_add(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX
switch (f_num) { switch (f_num) {
case TOX_FAERR_TOOLONG: case TOX_FAERR_TOOLONG:
wprintw(window, "Message is too long.\n"); errmsg = "Message is too long.";
break; break;
case TOX_FAERR_NOMESSAGE: case TOX_FAERR_NOMESSAGE:
wprintw(window, "Please add a message to your request.\n"); errmsg = "Please add a message to your request.";
break; break;
case TOX_FAERR_OWNKEY: case TOX_FAERR_OWNKEY:
wprintw(window, "That appears to be your own ID.\n"); errmsg = "That appears to be your own ID.";
break; break;
case TOX_FAERR_ALREADYSENT: case TOX_FAERR_ALREADYSENT:
wprintw(window, "Friend request has already been sent.\n"); errmsg = "Friend request has already been sent.";
break; break;
case TOX_FAERR_UNKNOWN: case TOX_FAERR_UNKNOWN:
wprintw(window, "Undefined error when adding friend.\n"); errmsg = "Undefined error when adding friend.";
break; break;
case TOX_FAERR_BADCHECKSUM: case TOX_FAERR_BADCHECKSUM:
wprintw(window, "Bad checksum in address.\n"); errmsg = "Bad checksum in address.";
break; break;
case TOX_FAERR_SETNEWNOSPAM: case TOX_FAERR_SETNEWNOSPAM:
wprintw(window, "Nospam was different (is this contact already added?)\n"); errmsg = "Nospam was different (is this contact already added?";
break; break;
default: default:
wprintw(window, "Friend request sent.\n"); errmsg = "Friend request sent.";
on_friendadded(m, f_num, true); on_friendadded(m, f_num, true);
break; break;
} }
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
} }
void cmd_clear(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_clear(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
@ -173,9 +187,12 @@ void cmd_clear(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[M
void cmd_connect(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_connect(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{ {
uint8_t *errmsg;
/* check arguments */ /* check arguments */
if (argc != 3) { if (argc != 3) {
wprintw(window, "Invalid syntax.\n"); errmsg = "Invalid syntax.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
@ -185,7 +202,8 @@ void cmd_connect(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)
char *key = argv[3]; char *key = argv[3];
if (atoi(port) == 0) { if (atoi(port) == 0) {
wprintw(window, "Invalid syntax.\n"); errmsg = "Invalid syntax.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
@ -197,48 +215,46 @@ void cmd_connect(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)
void cmd_groupchat(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_groupchat(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{ {
uint8_t *errmsg;
if (get_num_active_windows() >= MAX_WINDOWS_NUM) { if (get_num_active_windows() >= MAX_WINDOWS_NUM) {
wattron(window, COLOR_PAIR(RED)); errmsg = " * Warning: Too many windows are open.";
wprintw(window, " * Warning: Too many windows are open.\n"); line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, RED);
wattron(window, COLOR_PAIR(RED));
return; return;
} }
int groupnum = tox_add_groupchat(m); int groupnum = tox_add_groupchat(m);
if (groupnum == -1) { if (groupnum == -1) {
wprintw(window, "Group chat instance failed to initialize.\n"); errmsg = "Group chat instance failed to initialize.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
if (init_groupchat_win(prompt, m, groupnum) == -1) { if (init_groupchat_win(prompt, m, groupnum) == -1) {
wprintw(window, "Group chat window failed to initialize.\n"); errmsg = "Group chat window failed to initialize.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
tox_del_groupchat(m, groupnum); tox_del_groupchat(m, groupnum);
return; return;
} }
wprintw(window, "Group chat created as %d.\n", groupnum); uint8_t msg[MAX_STR_SIZE];
snprintf(msg, sizeof(msg), "Group chat created as %d.", groupnum);
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
} }
void cmd_log(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_log(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{ {
uint8_t *msg;
struct chatlog *log = self->chatwin->log; struct chatlog *log = self->chatwin->log;
if (argc == 0) { if (argc == 0) {
if (log->log_on) { if (log->log_on)
wprintw(window, "Logging for this window is "); msg = "Logging for this window is ON. Type \"/log off\" to disable.";
wattron(window, COLOR_PAIR(GREEN) | A_BOLD); else
wprintw(window, "[on]"); msg = "Logging for this window is OFF. Type \"/log on\" to enable.";
wattroff(window, COLOR_PAIR(GREEN) | A_BOLD);
wprintw(window, ". Type \"/log off\" to disable.\n");
} else {
wprintw(window, "Logging for this window is ");
wattron(window, COLOR_PAIR(RED) | A_BOLD);
wprintw(window, "[off]");
wattroff(window, COLOR_PAIR(RED) | A_BOLD);
wprintw(window, ". Type \"/log on\" to enable.\n");
}
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
return; return;
} }
@ -257,10 +273,8 @@ void cmd_log(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX
log_enable(self->name, NULL, log); log_enable(self->name, NULL, log);
} }
wprintw(window, "Logging "); msg = "Logging enabled";
wattron(window, COLOR_PAIR(GREEN) | A_BOLD); line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
wprintw(window, "[on]\n");
wattroff(window, COLOR_PAIR(GREEN) | A_BOLD);
return; return;
} else if (!strcmp(swch, "0") || !strcmp(swch, "off")) { } else if (!strcmp(swch, "0") || !strcmp(swch, "off")) {
if (self->is_chat) if (self->is_chat)
@ -268,14 +282,13 @@ void cmd_log(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX
log_disable(log); log_disable(log);
wprintw(window, "Logging "); msg = "Logging disabled";
wattron(window, COLOR_PAIR(RED) | A_BOLD); line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
wprintw(window, "[off]\n");
wattroff(window, COLOR_PAIR(RED) | A_BOLD);
return; return;
} }
wprintw(window, "Invalid option. Use \"/log on\" and \"/log off\" to toggle logging.\n"); msg = "Invalid option. Use \"/log on\" and \"/log off\" to toggle logging.";
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
} }
void cmd_myid(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_myid(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
@ -292,14 +305,17 @@ void cmd_myid(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA
strcat(id, xx); strcat(id, xx);
} }
wprintw(window, "%s\n", id); line_info_add(self, NULL, NULL, NULL, id, SYS_MSG, 0, 0);
} }
void cmd_nick(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_nick(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{ {
uint8_t *errmsg;
/* check arguments */ /* check arguments */
if (argc < 1) { if (argc < 1) {
wprintw(window, "Invalid name.\n"); errmsg = "Invalid name.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
@ -313,7 +329,8 @@ void cmd_nick(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA
} }
if (!valid_nick(nick)) { if (!valid_nick(nick)) {
wprintw(window, "Invalid name.\n"); errmsg = "Invalid name.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
@ -330,15 +347,19 @@ void cmd_nick(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA
void cmd_note(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_note(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{ {
uint8_t *errmsg;
if (argc < 1) { if (argc < 1) {
wprintw(window, "Wrong number of arguments.\n"); errmsg = "Wrong number of arguments.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
uint8_t *msg = argv[1]; uint8_t *msg = argv[1];
if (msg[0] != '\"') { if (msg[0] != '\"') {
wprintw(window, "Note must be enclosed in quotes.\n"); errmsg = "Note must be enclosed in quotes.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
@ -351,33 +372,43 @@ void cmd_note(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA
void cmd_prompt_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_prompt_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{ {
wclear(window); uint8_t *msg = "Global commands:";
wattron(window, COLOR_PAIR(CYAN) | A_BOLD); line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 1, CYAN);
wprintw(window, "\n\nGlobal commands:\n");
wattroff(window, COLOR_PAIR(CYAN) | A_BOLD);
wprintw(window, " /add <id> <msg> : Add friend with optional message\n");
wprintw(window, " /accept <n> : Accept friend request\n");
wprintw(window, " /connect <ip> <port> <key> : Manually connect to a DHT node\n");
wprintw(window, " /status <type> <msg> : Set status with optional note\n");
wprintw(window, " /note <msg> : Set a personal note\n");
wprintw(window, " /nick <nick> : Set your nickname\n");
wprintw(window, " /log <on> or <off> : Enable/disable logging\n");
wprintw(window, " /groupchat : Create a group chat\n");
wprintw(window, " /myid : Print your ID\n");
wprintw(window, " /help : Print this message again\n");
wprintw(window, " /clear : Clear the window\n");
wprintw(window, " /quit or /exit : Exit Toxic\n");
#ifdef _SUPPORT_AUDIO #ifdef _SUPPORT_AUDIO
wprintw(window, " /lsdev <type> : List devices where type: in|out\n"); #define NUMLINES 14
wprintw(window, " /sdev <type> <id> : Set active device\n"); #else
#define NUMLINES 12
#endif
uint8_t lines[NUMLINES][MAX_STR_SIZE] = {
{ " /add <id> <msg> : Add friend with optional message" },
{ " /accept <n> : Accept friend request" },
{ " /connect <ip> <port> <key> : Manually connect to a DHT node" },
{ " /status <type> <msg> : Set status with optional note" },
{ " /note <msg> : Set a personal note" },
{ " /nick <nick> : Set your nickname" },
{ " /log <on> or <off> : Enable/disable logging" },
{ " /groupchat : Create a group chat" },
{ " /myid : Print your ID" },
{ " /help : Print this message again" },
{ " /clear : Clear the window" },
{ " /quit or /exit : Exit Toxic" },
#ifdef _SUPPORT_AUDIO
{ " /lsdev <type> : List devices where type: in|out" },
{ " /sdev <type> <id> : Set active device" },
#endif /* _SUPPORT_AUDIO */ #endif /* _SUPPORT_AUDIO */
wattron(window, COLOR_PAIR(CYAN) | A_BOLD); };
wprintw(window, " * Argument messages must be enclosed in quotation marks.\n"); int i;
wprintw(window, " * Use ctrl-o and ctrl-p to navigate through the tabs.\n\n");
wattroff(window, COLOR_PAIR(CYAN) | A_BOLD); for (i = 0; i < NUMLINES; ++i)
line_info_add(self, NULL, NULL, NULL, lines[i], SYS_MSG, 0, 0);
msg = " * Argument messages must be enclosed in quotation marks.\n"
" * Use ctrl-o and ctrl-p to navigate through the tabs.\n";
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 1, CYAN);
} }
void cmd_quit(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_quit(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
@ -388,16 +419,19 @@ void cmd_quit(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA
void cmd_status(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) void cmd_status(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{ {
uint8_t *msg = NULL; uint8_t *msg = NULL;
uint8_t *errmsg;
if (argc >= 2) { if (argc >= 2) {
msg = argv[2]; msg = argv[2];
if (msg[0] != '\"') { if (msg[0] != '\"') {
wprintw(window, "Note must be enclosed in quotes.\n"); errmsg = "Note must be enclosed in quotes.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
} else if (argc != 1) { } else if (argc != 1) {
wprintw(window, "Wrong number of arguments.\n"); errmsg = "Wrong number of arguments.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }
@ -418,7 +452,8 @@ void cmd_status(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[
else if (!strcmp(l_status, "busy")) else if (!strcmp(l_status, "busy"))
status_kind = TOX_USERSTATUS_BUSY; status_kind = TOX_USERSTATUS_BUSY;
else { else {
wprintw(window, "Invalid status. Valid statuses are: online, busy and away.\n"); errmsg = "Invalid status. Valid statuses are: online, busy and away.";
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
return; return;
} }

View File

@ -34,7 +34,6 @@
void line_info_init(struct history *hst) void line_info_init(struct history *hst)
{ {
hst->line_root = malloc(sizeof(struct line_info)); hst->line_root = malloc(sizeof(struct line_info));
memset(hst->line_root, 0, sizeof(struct line_info));
if (hst->line_root == NULL) { if (hst->line_root == NULL) {
endwin(); endwin();
@ -42,6 +41,7 @@ void line_info_init(struct history *hst)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
memset(hst->line_root, 0, sizeof(struct line_info));
hst->line_start = hst->line_root; hst->line_start = hst->line_root;
hst->line_end = hst->line_start; hst->line_end = hst->line_start;
} }
@ -64,8 +64,7 @@ static void line_info_reset_start(struct history *hst)
void line_info_toggle_scroll(ToxWindow *self, bool scroll) void line_info_toggle_scroll(ToxWindow *self, bool scroll)
{ {
ChatContext *ctx = self->chatwin; WINDOW *win = self->chatwin->history;
WINDOW *win = self->is_prompt ? self->window : ctx->history;
struct history *hst = self->chatwin->hst; struct history *hst = self->chatwin->hst;
if (scroll) { if (scroll) {
@ -94,10 +93,8 @@ void line_info_cleanup(struct history *hst)
void line_info_add(ToxWindow *self, uint8_t *tmstmp, uint8_t *name1, uint8_t *name2, uint8_t *msg, void line_info_add(ToxWindow *self, uint8_t *tmstmp, uint8_t *name1, uint8_t *name2, uint8_t *msg,
uint8_t msgtype, uint8_t bold, uint8_t colour) uint8_t msgtype, uint8_t bold, uint8_t colour)
{ {
WINDOW *win = self->is_prompt ? self->window : self->chatwin->history;
struct history *hst = self->chatwin->hst; struct history *hst = self->chatwin->hst;
struct line_info *new_line = malloc(sizeof(struct line_info)); struct line_info *new_line = malloc(sizeof(struct line_info));
memset(new_line, 0, sizeof(struct line_info));
if (new_line == NULL) { if (new_line == NULL) {
endwin(); endwin();
@ -105,17 +102,18 @@ void line_info_add(ToxWindow *self, uint8_t *tmstmp, uint8_t *name1, uint8_t *na
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
memset(new_line, 0, sizeof(struct line_info));
int len = 1; /* there will always be a newline */ int len = 1; /* there will always be a newline */
/* for type-specific formatting in print function */ /* for type-specific formatting in print function */
switch (msgtype) { switch (msgtype) {
case OUT_MSG:
case IN_MSG:
len += 2;
break;
case ACTION: case ACTION:
len += 3; len += 3;
break; break;
default:
len += 2;
break;
} }
if (msg) { if (msg) {
@ -143,7 +141,7 @@ void line_info_add(ToxWindow *self, uint8_t *tmstmp, uint8_t *name1, uint8_t *na
hst->line_end = new_line; hst->line_end = new_line;
/* If chat history exceeds limit move root forward and free old root */ /* If chat history exceeds limit move root forward and free old root */
if (++(hst->line_items) >= MAX_HISTORY) { if (++hst->line_items > MAX_HISTORY) {
--hst->line_items; --hst->line_items;
struct line_info *tmp = hst->line_root->next; struct line_info *tmp = hst->line_root->next;
tmp->prev = NULL; tmp->prev = NULL;
@ -159,10 +157,12 @@ void line_info_add(ToxWindow *self, uint8_t *tmstmp, uint8_t *name1, uint8_t *na
int y, y2, x, x2; int y, y2, x, x2;
getmaxyx(self->window, y2, x2); getmaxyx(self->window, y2, x2);
getyx(win, y, x); getyx(self->chatwin->history, y, x);
int n = self->is_prompt ? 0 : CHATBOX_HEIGHT;
/* move line_start forward proportionate to the number of new rows */ /* move line_start forward proportionate to the number of new rows */
if (y >= y2 - CHATBOX_HEIGHT) { if (y >= y2 - n) {
int i; int i;
int lines = 1 + (len / x2); int lines = 1 + (len / x2);
@ -177,7 +177,8 @@ void line_info_add(ToxWindow *self, uint8_t *tmstmp, uint8_t *name1, uint8_t *na
void line_info_print(ToxWindow *self) void line_info_print(ToxWindow *self)
{ {
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
WINDOW *win = self->is_prompt ? self->window : win; WINDOW *win = ctx->history;
wclear(win); wclear(win);
wmove(win, 1, 0); wmove(win, 1, 0);
int y2, x2; int y2, x2;
@ -186,7 +187,7 @@ void line_info_print(ToxWindow *self)
struct line_info *line = ctx->hst->line_start; struct line_info *line = ctx->hst->line_start;
int numlines = 0; int numlines = 0;
while(line && numlines <= x2) { while(line && numlines <= y2) {
uint8_t type = line->msgtype; uint8_t type = line->msgtype;
numlines += line->len / x2; numlines += line->len / x2;
@ -199,10 +200,10 @@ void line_info_print(ToxWindow *self)
int nameclr = GREEN; int nameclr = GREEN;
if (type == IN_MSG)
nameclr = CYAN;
if (line->colour) if (line->colour)
nameclr = line->colour; nameclr = line->colour;
else if (type == IN_MSG)
nameclr = CYAN;
wattron(win, COLOR_PAIR(nameclr)); wattron(win, COLOR_PAIR(nameclr));
wprintw(win, "%s: ", line->name1); wprintw(win, "%s: ", line->name1);
@ -249,6 +250,31 @@ void line_info_print(ToxWindow *self)
wattroff(win, COLOR_PAIR(line->colour)); wattroff(win, COLOR_PAIR(line->colour));
break; break;
case PROMPT:
wattron(win, COLOR_PAIR(GREEN));
wprintw(win, "$ ");
wattroff(win, COLOR_PAIR(GREEN));
if (line->msg[0])
wprintw(win, "%s", line->msg);
wprintw(win, "\n");
break;
case CONNECTION:
wattron(win, COLOR_PAIR(BLUE));
wprintw(win, "%s", line->timestamp);
wattroff(win, COLOR_PAIR(BLUE));
wattron(win, COLOR_PAIR(line->colour));
wattron(win, A_BOLD);
wprintw(win, "* %s ", line->name1);
wattroff(win, A_BOLD);
wprintw(win, "%s\n", line->msg);
wattroff(win, COLOR_PAIR(line->colour));
break;
} }
line = line->next; line = line->next;

View File

@ -26,6 +26,7 @@ enum {
SYS_MSG, SYS_MSG,
IN_MSG, IN_MSG,
OUT_MSG, OUT_MSG,
PROMPT,
ACTION, ACTION,
CONNECTION, CONNECTION,
} LINE_TYPE; } LINE_TYPE;

View File

@ -60,6 +60,7 @@
#include "prompt.h" #include "prompt.h"
#include "misc_tools.h" #include "misc_tools.h"
#include "file_senders.h" #include "file_senders.h"
#include "line_info.h"
#ifdef _SUPPORT_AUDIO #ifdef _SUPPORT_AUDIO
#include "audio_call.h" #include "audio_call.h"
@ -272,6 +273,8 @@ int init_connection(Tox *m)
static void do_connection(Tox *m, ToxWindow *prompt) static void do_connection(Tox *m, ToxWindow *prompt)
{ {
uint8_t msg[MAX_STR_SIZE] = {0};
static int conn_try = 0; static int conn_try = 0;
static int conn_err = 0; static int conn_err = 0;
static bool dht_on = false; static bool dht_on = false;
@ -281,21 +284,21 @@ static void do_connection(Tox *m, ToxWindow *prompt)
if (!dht_on && !is_connected && !(conn_try++ % 100)) { if (!dht_on && !is_connected && !(conn_try++ % 100)) {
if (!conn_err) { if (!conn_err) {
if ((conn_err = init_connection(m))) { if ((conn_err = init_connection(m))) {
prep_prompt_win(); snprintf(msg, sizeof(msg), "\nAuto-connect failed with error code %d", conn_err);
wprintw(prompt->window, "\nAuto-connect failed with error code %d\n", conn_err);
} }
} }
} else if (!dht_on && is_connected) { } else if (!dht_on && is_connected) {
dht_on = true; dht_on = true;
prompt_update_connectionstatus(prompt, dht_on); prompt_update_connectionstatus(prompt, dht_on);
prep_prompt_win(); snprintf(msg, sizeof(msg), "DHT connected.");
wprintw(prompt->window, "DHT connected.\n");
} else if (dht_on && !is_connected) { } else if (dht_on && !is_connected) {
dht_on = false; dht_on = false;
prompt_update_connectionstatus(prompt, dht_on); prompt_update_connectionstatus(prompt, dht_on);
prep_prompt_win(); snprintf(msg, sizeof(msg), "\nDHT disconnected. Attempting to reconnect.");
wprintw(prompt->window, "\nDHT disconnected. Attempting to reconnect.\n");
} }
if (msg[0])
line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
} }
static void load_friendlist(Tox *m) static void load_friendlist(Tox *m)

View File

@ -65,25 +65,6 @@ const uint8_t glob_cmd_list[AC_NUM_GLOB_COMMANDS][MAX_CMDNAME_SIZE] = {
#endif /* _SUPPORT_AUDIO */ #endif /* _SUPPORT_AUDIO */
}; };
/* prevents input string from eating system messages: call this prior to printing a prompt message
TODO: This is only a partial fix */
void prep_prompt_win(void)
{
ChatContext *ctx = prompt->chatwin;
if (ctx->len <= 0)
return;
wprintw(prompt->window, "\n");
if (!ctx->at_bottom) {
wmove(prompt->window, ctx->orig_y - 1, X_OFST);
++ctx->orig_y;
} else {
wmove(prompt->window, ctx->orig_y - 2, X_OFST);
}
}
/* Updates own nick in prompt statusbar */ /* Updates own nick in prompt statusbar */
void prompt_update_nick(ToxWindow *prompt, uint8_t *nick, uint16_t len) void prompt_update_nick(ToxWindow *prompt, uint8_t *nick, uint16_t len)
{ {
@ -142,14 +123,26 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key)
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
int x, y, y2, x2; int x, y, y2, x2;
getyx(self->window, y, x); getyx(ctx->history, y, x);
getmaxyx(self->window, y2, x2); getmaxyx(ctx->history, y2, x2);
/* this is buggy */
//if (key == T_KEY_ESC) { /* ESC key: Toggle history scroll mode */
// bool scroll = ctx->hst->scroll_mode ? false : true;
// line_info_toggle_scroll(self, scroll);
//}
/* If we're in scroll mode ignore rest of function */
if (ctx->hst->scroll_mode) {
line_info_onKey(self, key);
return;
}
/* BACKSPACE key: Remove one character from line */ /* BACKSPACE key: Remove one character from line */
if (key == 0x107 || key == 0x8 || key == 0x7f) { if (key == 0x107 || key == 0x8 || key == 0x7f) {
if (ctx->pos > 0) { if (ctx->pos > 0) {
del_char_buf_bck(ctx->line, &ctx->pos, &ctx->len); del_char_buf_bck(ctx->line, &ctx->pos, &ctx->len);
wmove(self->window, y, x-1); /* not necessary but fixes a display glitch */ wmove(ctx->history, y, x-1); /* not necessary but fixes a display glitch */
ctx->scroll = false; ctx->scroll = false;
} else { } else {
beep(); beep();
@ -167,8 +160,8 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key)
else if (key == T_KEY_DISCARD) { /* CTRL-U: Delete entire line behind pos */ else if (key == T_KEY_DISCARD) { /* CTRL-U: Delete entire line behind pos */
if (ctx->pos > 0) { if (ctx->pos > 0) {
wmove(self->window, ctx->orig_y, X_OFST); wmove(ctx->history, ctx->orig_y, X_OFST);
wclrtobot(self->window); wclrtobot(ctx->history);
discard_buf(ctx->line, &ctx->pos, &ctx->len); discard_buf(ctx->line, &ctx->pos, &ctx->len);
} else { } else {
beep(); beep();
@ -207,7 +200,7 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key)
} }
else if (key == KEY_UP) { /* fetches previous item in history */ else if (key == KEY_UP) { /* fetches previous item in history */
wmove(self->window, ctx->orig_y, X_OFST); wmove(ctx->history, ctx->orig_y, X_OFST);
fetch_hist_item(ctx->line, &ctx->pos, &ctx->len, ctx->ln_history, ctx->hst_tot, fetch_hist_item(ctx->line, &ctx->pos, &ctx->len, ctx->ln_history, ctx->hst_tot,
&ctx->hst_pos, MOVE_UP); &ctx->hst_pos, MOVE_UP);
@ -222,14 +215,14 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key)
int k = ctx->orig_y + ((ctx->len + p_ofst) / px2); int k = ctx->orig_y + ((ctx->len + p_ofst) / px2);
if (k >= y2) { if (k >= y2) {
wprintw(self->window, "\n"); wprintw(ctx->history, "\n");
--ctx->orig_y; --ctx->orig_y;
} }
} }
} }
else if (key == KEY_DOWN) { /* fetches next item in history */ else if (key == KEY_DOWN) { /* fetches next item in history */
wmove(self->window, ctx->orig_y, X_OFST); wmove(ctx->history, ctx->orig_y, X_OFST);
fetch_hist_item(ctx->line, &ctx->pos, &ctx->len, ctx->ln_history, ctx->hst_tot, fetch_hist_item(ctx->line, &ctx->pos, &ctx->len, ctx->ln_history, ctx->hst_tot,
&ctx->hst_pos, MOVE_DOWN); &ctx->hst_pos, MOVE_DOWN);
} }
@ -258,8 +251,8 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key)
} }
/* RETURN key: execute command */ /* RETURN key: execute command */
else if (key == '\n') { else if (key == '\n') {
wprintw(self->window, "\n"); wprintw(ctx->history, "\n");
uint8_t line[MAX_STR_SIZE]; uint8_t line[MAX_STR_SIZE] = {0};
if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1) if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1)
memset(&line, 0, sizeof(line)); memset(&line, 0, sizeof(line));
@ -267,7 +260,8 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key)
if (!string_is_empty(line)) if (!string_is_empty(line))
add_line_to_hist(ctx->line, ctx->len, ctx->ln_history, &ctx->hst_tot, &ctx->hst_pos); add_line_to_hist(ctx->line, ctx->len, ctx->ln_history, &ctx->hst_tot, &ctx->hst_pos);
execute(self->window, self, m, line, GLOBAL_COMMAND_MODE); line_info_add(self, NULL, NULL, NULL, line, PROMPT, 0, 0);
execute(ctx->history, self, m, line, GLOBAL_COMMAND_MODE);
reset_buf(ctx->line, &ctx->pos, &ctx->len); reset_buf(ctx->line, &ctx->pos, &ctx->len);
} }
} }
@ -277,9 +271,8 @@ static void prompt_onDraw(ToxWindow *self, Tox *m)
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
int x, y, x2, y2; int x, y, x2, y2;
getyx(self->window, y, x); getyx(ctx->history, y, x);
getmaxyx(self->window, y2, x2); getmaxyx(ctx->history, y2, x2);
wclrtobot(self->window);
line_info_print(self); line_info_print(self);
/* if len is >= screen width offset max x by X_OFST to account for prompt char */ /* if len is >= screen width offset max x by X_OFST to account for prompt char */
@ -297,7 +290,7 @@ static void prompt_onDraw(ToxWindow *self, Tox *m)
if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1) if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1)
reset_buf(ctx->line, &ctx->pos, &ctx->len); reset_buf(ctx->line, &ctx->pos, &ctx->len);
else else
mvwprintw(self->window, ctx->orig_y, X_OFST, line); mvwprintw(ctx->history, ctx->orig_y, X_OFST, line);
int k = ctx->orig_y + ((ctx->len + p_ofst) / px2); int k = ctx->orig_y + ((ctx->len + p_ofst) / px2);
@ -315,9 +308,9 @@ static void prompt_onDraw(ToxWindow *self, Tox *m)
ctx->orig_y = y; ctx->orig_y = y;
} }
wattron(self->window, COLOR_PAIR(GREEN)); wattron(ctx->history, COLOR_PAIR(GREEN));
mvwprintw(self->window, ctx->orig_y, 0, "$ "); mvwprintw(ctx->history, ctx->orig_y, 0, "$ ");
wattroff(self->window, COLOR_PAIR(GREEN)); wattroff(ctx->history, COLOR_PAIR(GREEN));
StatusBar *statusbar = self->stb; StatusBar *statusbar = self->stb;
werase(statusbar->topline); werase(statusbar->topline);
@ -363,43 +356,18 @@ static void prompt_onDraw(ToxWindow *self, Tox *m)
if (statusbar->statusmsg[0]) if (statusbar->statusmsg[0])
wprintw(statusbar->topline, " - %s", statusbar->statusmsg); wprintw(statusbar->topline, " - %s", statusbar->statusmsg);
wprintw(statusbar->topline, "\n");
/* put cursor back in correct spot */ /* put cursor back in correct spot */
int y_m = ctx->orig_y + ((ctx->pos + p_ofst) / px2); int y_m = ctx->orig_y + ((ctx->pos + p_ofst) / px2);
int x_m = (ctx->pos + X_OFST) % x2; int x_m = (ctx->pos + X_OFST) % x2;
wmove(self->window, y_m, x_m); wmove(self->window, y_m, x_m);
} }
static void prompt_onInit(ToxWindow *self, Tox *m)
{
curs_set(1);
scrollok(self->window, true);
ChatContext *ctx = self->chatwin;
ctx->log = malloc(sizeof(struct chatlog));
ctx->hst = malloc(sizeof(struct history));
if (ctx->log == NULL || ctx->hst == NULL) {
endwin();
fprintf(stderr, "malloc() failed. Aborting...\n");
exit(EXIT_FAILURE);
}
memset(ctx->log, 0, sizeof(struct chatlog));
memset(ctx->hst, 0, sizeof(struct history));
execute(self->window, self, m, "/help", GLOBAL_COMMAND_MODE);
wclrtoeol(self->window);
}
static void prompt_onConnectionChange(ToxWindow *self, Tox *m, int32_t friendnum , uint8_t status) static void prompt_onConnectionChange(ToxWindow *self, Tox *m, int32_t friendnum , uint8_t status)
{ {
if (friendnum < 0) if (friendnum < 0)
return; return;
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
prep_prompt_win();
uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'}; uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'};
@ -409,31 +377,18 @@ static void prompt_onConnectionChange(ToxWindow *self, Tox *m, int32_t friendnum
if (!nick[0]) if (!nick[0])
snprintf(nick, sizeof(nick), "%s", UNKNOWN_NAME); snprintf(nick, sizeof(nick), "%s", UNKNOWN_NAME);
wprintw(self->window, "\n"); uint8_t timefrmt[TIME_STR_SIZE];
print_time(self->window); get_time_str(timefrmt);
uint8_t *msg;
const uint8_t *msg;
if (status == 1) { if (status == 1) {
msg = "has come online"; msg = "has come online";
wattron(self->window, COLOR_PAIR(GREEN)); line_info_add(self, timefrmt, nick, NULL, msg, CONNECTION, 0, GREEN);
wattron(self->window, A_BOLD);
wprintw(self->window, "* %s ", nick);
wattroff(self->window, A_BOLD);
wprintw(self->window, "%s\n", msg);
wattroff(self->window, COLOR_PAIR(GREEN));
write_to_log(msg, nick, ctx->log, true); write_to_log(msg, nick, ctx->log, true);
alert_window(self, WINDOW_ALERT_2, false); alert_window(self, WINDOW_ALERT_2, false);
} else { } else {
msg = "has gone offline"; msg = "has gone offline";
wattron(self->window, COLOR_PAIR(RED)); line_info_add(self, timefrmt, nick, NULL, msg, CONNECTION, 0, RED);
wattron(self->window, A_BOLD);
wprintw(self->window, "* %s ", nick);
wattroff(self->window, A_BOLD);
wprintw(self->window, "%s\n", msg);
wattroff(self->window, COLOR_PAIR(RED));
write_to_log(msg, nick, ctx->log, true); write_to_log(msg, nick, ctx->log, true);
} }
} }
@ -443,33 +398,32 @@ static void prompt_onFriendRequest(ToxWindow *self, Tox *m, uint8_t *key, uint8_
/* make sure message data is null-terminated */ /* make sure message data is null-terminated */
data[length - 1] = 0; data[length - 1] = 0;
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
prep_prompt_win();
wprintw(self->window, "\n"); wprintw(ctx->history, "\n");
print_time(self->window); print_time(ctx->history);
uint8_t msg[MAX_STR_SIZE]; uint8_t msg[MAX_STR_SIZE];
snprintf(msg, sizeof(msg), "Friend request with the message '%s'\n", data); snprintf(msg, sizeof(msg), "Friend request with the message '%s'\n", data);
wprintw(self->window, "%s", msg); wprintw(ctx->history, "%s", msg);
write_to_log(msg, "", ctx->log, true); write_to_log(msg, "", ctx->log, true);
int n = add_friend_request(key); int n = add_friend_request(key);
if (n == -1) { if (n == -1) {
const uint8_t *errmsg = "Friend request queue is full. Discarding request.\n"; const uint8_t *errmsg = "Friend request queue is full. Discarding request.\n";
wprintw(self->window, "%s", errmsg); wprintw(ctx->history, "%s", errmsg);
write_to_log(errmsg, "", ctx->log, true); write_to_log(errmsg, "", ctx->log, true);
return; return;
} }
wprintw(self->window, "Type \"/accept %d\" to accept it.\n", n); wprintw(ctx->history, "Type \"/accept %d\" to accept it.\n", n);
alert_window(self, WINDOW_ALERT_1, true); alert_window(self, WINDOW_ALERT_1, true);
} }
void prompt_init_statusbar(ToxWindow *self, Tox *m) void prompt_init_statusbar(ToxWindow *self, Tox *m)
{ {
int x, y; int x2, y2;
getmaxyx(self->window, y, x); getmaxyx(self->window, y2, x2);
/* Init statusbar info */ /* Init statusbar info */
StatusBar *statusbar = self->stb; StatusBar *statusbar = self->stb;
@ -499,7 +453,36 @@ void prompt_init_statusbar(ToxWindow *self, Tox *m)
prompt_update_status(prompt, status); prompt_update_status(prompt, status);
/* Init statusbar subwindow */ /* Init statusbar subwindow */
statusbar->topline = subwin(self->window, 2, x, 0, 0); statusbar->topline = subwin(self->window, 2, x2, 0, 0);
}
static void prompt_onInit(ToxWindow *self, Tox *m)
{
ChatContext *ctx = self->chatwin;
curs_set(1);
int y2, x2;
getmaxyx(self->window, y2, x2);
ctx->history = subwin(self->window, y2, x2, 0, 0);
scrollok(ctx->history, 1);
ctx->log = malloc(sizeof(struct chatlog));
ctx->hst = malloc(sizeof(struct history));
if (ctx->log == NULL || ctx->hst == NULL) {
endwin();
fprintf(stderr, "malloc() failed. Aborting...\n");
exit(EXIT_FAILURE);
}
memset(ctx->log, 0, sizeof(struct chatlog));
memset(ctx->hst, 0, sizeof(struct history));
line_info_init(ctx->hst);
execute(ctx->history, self, m, "/help", GLOBAL_COMMAND_MODE);
wmove(ctx->history, y2-1, 2);
} }
ToxWindow new_prompt(void) ToxWindow new_prompt(void)