mirror of
https://github.com/Tha14/toxic.git
synced 2024-11-23 02:33:02 +01:00
refactor groupchats to allow scrolling
This commit is contained in:
parent
2f981ecb12
commit
a5ce17f44e
@ -2,7 +2,7 @@
|
|||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ([2.65])
|
AC_PREREQ([2.65])
|
||||||
AC_INIT([toxic], [0.3.1], [https://tox.im/])
|
AC_INIT([toxic], [0.3.2], [https://tox.im/])
|
||||||
AC_CONFIG_AUX_DIR(configure_aux)
|
AC_CONFIG_AUX_DIR(configure_aux)
|
||||||
AC_CONFIG_SRCDIR([src/main.c])
|
AC_CONFIG_SRCDIR([src/main.c])
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
@ -793,12 +793,14 @@ static void chat_onDraw(ToxWindow *self, Tox *m)
|
|||||||
|
|
||||||
static void chat_onInit(ToxWindow *self, Tox *m)
|
static void chat_onInit(ToxWindow *self, Tox *m)
|
||||||
{
|
{
|
||||||
|
curs_set(1);
|
||||||
int x2, y2;
|
int x2, y2;
|
||||||
getmaxyx(self->window, y2, x2);
|
getmaxyx(self->window, y2, x2);
|
||||||
self->x = x2;
|
self->x = x2;
|
||||||
|
|
||||||
/* Init statusbar info */
|
/* Init statusbar info */
|
||||||
StatusBar *statusbar = self->stb;
|
StatusBar *statusbar = self->stb;
|
||||||
|
|
||||||
statusbar->status = tox_get_user_status(m, self->num);
|
statusbar->status = tox_get_user_status(m, self->num);
|
||||||
statusbar->is_online = tox_get_friend_connection_status(m, self->num) == 1;
|
statusbar->is_online = tox_get_friend_connection_status(m, self->num) == 1;
|
||||||
|
|
||||||
@ -809,6 +811,7 @@ static void chat_onInit(ToxWindow *self, Tox *m)
|
|||||||
|
|
||||||
/* Init subwindows */
|
/* Init subwindows */
|
||||||
ChatContext *ctx = self->chatwin;
|
ChatContext *ctx = self->chatwin;
|
||||||
|
|
||||||
statusbar->topline = subwin(self->window, 2, x2, 0, 0);
|
statusbar->topline = subwin(self->window, 2, x2, 0, 0);
|
||||||
ctx->history = subwin(self->window, y2-CHATBOX_HEIGHT+1, x2, 0, 0);
|
ctx->history = subwin(self->window, y2-CHATBOX_HEIGHT+1, x2, 0, 0);
|
||||||
scrollok(ctx->history, 1);
|
scrollok(ctx->history, 1);
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include "chat.h"
|
#include "chat.h"
|
||||||
#include "friendlist.h"
|
#include "friendlist.h"
|
||||||
#include "misc_tools.h"
|
#include "misc_tools.h"
|
||||||
|
#include "line_info.h"
|
||||||
|
|
||||||
#ifdef _SUPPORT_AUDIO
|
#ifdef _SUPPORT_AUDIO
|
||||||
#include "audio_call.h"
|
#include "audio_call.h"
|
||||||
@ -104,12 +105,14 @@ static void friendlist_onMessage(ToxWindow *self, Tox *m, int32_t num, uint8_t *
|
|||||||
uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'};
|
uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'};
|
||||||
tox_get_name(m, num, nick);
|
tox_get_name(m, num, nick);
|
||||||
nick[TOXIC_MAX_NAME_LENGTH] = '\0';
|
nick[TOXIC_MAX_NAME_LENGTH] = '\0';
|
||||||
wprintw(prompt->window, "%s: %s\n", nick, str);
|
|
||||||
|
|
||||||
wattron(prompt->window, COLOR_PAIR(RED));
|
uint8_t timefrmt[TIME_STR_SIZE];
|
||||||
wprintw(prompt->window, "* Warning: Too many windows are open.\n");
|
get_time_str(timefrmt);
|
||||||
wattron(prompt->window, COLOR_PAIR(RED));
|
|
||||||
|
|
||||||
|
line_info_add(prompt, timefrmt, nick, NULL, str, IN_MSG, 0, 0);
|
||||||
|
|
||||||
|
uint8_t *msg = "* Warning: Too many windows are open.";
|
||||||
|
line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, RED);
|
||||||
alert_window(prompt, WINDOW_ALERT_1, true);
|
alert_window(prompt, WINDOW_ALERT_1, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,7 +123,7 @@ static void friendlist_onConnectionChange(ToxWindow *self, Tox *m, int32_t num,
|
|||||||
if (num >= max_friends_index)
|
if (num >= max_friends_index)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
friends[num].online = status == 1 ? true : false;
|
friends[num].online = status;
|
||||||
update_friend_last_online(num, get_unix_time());
|
update_friend_last_online(num, get_unix_time());
|
||||||
store_data(m, DATA_FILE);
|
store_data(m, DATA_FILE);
|
||||||
sort_friendlist_index();
|
sort_friendlist_index();
|
||||||
@ -210,9 +213,9 @@ 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';
|
||||||
|
|
||||||
wattron(prompt->window, COLOR_PAIR(RED));
|
uint8_t msg[MAX_STR_SIZE];
|
||||||
wprintw(prompt->window, "* File transfer from %s failed: too many windows are open.\n", nick);
|
snprintf(msg, sizeof(msg), "* File transfer from %s failed: too many windows are open.", nick);
|
||||||
wattron(prompt->window, COLOR_PAIR(RED));
|
line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, RED);
|
||||||
|
|
||||||
alert_window(prompt, WINDOW_ALERT_1, true);
|
alert_window(prompt, WINDOW_ALERT_1, true);
|
||||||
}
|
}
|
||||||
@ -232,9 +235,9 @@ 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';
|
||||||
|
|
||||||
wattron(prompt->window, COLOR_PAIR(RED));
|
uint8_t msg[MAX_STR_SIZE];
|
||||||
wprintw(prompt->window, "* Group chat invite from %s failed: too many windows are open.\n", nick);
|
snprintf(msg, sizeof(msg), "* Group chat invite from %s failed: too many windows are open.", nick);
|
||||||
wattron(prompt->window, COLOR_PAIR(RED));
|
line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, RED);
|
||||||
|
|
||||||
alert_window(prompt, WINDOW_ALERT_1, true);
|
alert_window(prompt, WINDOW_ALERT_1, true);
|
||||||
}
|
}
|
||||||
@ -340,9 +343,8 @@ 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 {
|
||||||
wattron(prompt->window, COLOR_PAIR(RED));
|
uint8_t *msg = "* Warning: Too many windows are open.";
|
||||||
wprintw(prompt->window, "* Warning: Too many windows are open.\n");
|
line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, RED);
|
||||||
wattron(prompt->window, COLOR_PAIR(RED));
|
|
||||||
|
|
||||||
alert_window(prompt, WINDOW_ALERT_1, true);
|
alert_window(prompt, WINDOW_ALERT_1, true);
|
||||||
}
|
}
|
||||||
@ -534,11 +536,13 @@ static void friendlist_onAv(ToxWindow *self, ToxAv *av)
|
|||||||
uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'};
|
uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'};
|
||||||
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);
|
|
||||||
|
|
||||||
wattron(prompt->window, COLOR_PAIR(RED));
|
uint8_t msg[MAX_STR_SIZE];
|
||||||
wprintw(prompt->window, "* Warning: Too many windows are open.\n");
|
snprintf(msg, sizeof(msg), "Audio action from: %s!", nick);
|
||||||
wattron(prompt->window, COLOR_PAIR(RED));
|
line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
|
||||||
|
|
||||||
|
uint8_t *errmsg = "* Warning: Too many windows are open.";
|
||||||
|
line_info_add(prompt, NULL, NULL, NULL, errmsg, SYS_MSG, 0, RED);
|
||||||
|
|
||||||
alert_window(prompt, WINDOW_ALERT_0, true);
|
alert_window(prompt, WINDOW_ALERT_0, true);
|
||||||
}
|
}
|
||||||
|
@ -181,8 +181,9 @@ void cmd_add(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX
|
|||||||
|
|
||||||
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])
|
||||||
{
|
{
|
||||||
wclear(window);
|
struct history *hst = self->chatwin->hst;
|
||||||
wprintw(window, "\n\n");
|
line_info_cleanup(hst);
|
||||||
|
line_info_init(hst);
|
||||||
}
|
}
|
||||||
|
|
||||||
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])
|
||||||
@ -393,7 +394,7 @@ void cmd_prompt_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*a
|
|||||||
{ " /groupchat : Create a group chat" },
|
{ " /groupchat : Create a group chat" },
|
||||||
{ " /myid : Print your ID" },
|
{ " /myid : Print your ID" },
|
||||||
{ " /help : Print this message again" },
|
{ " /help : Print this message again" },
|
||||||
{ " /clear : Clear the window" },
|
{ " /clear : Clear window history" },
|
||||||
{ " /quit or /exit : Exit Toxic" },
|
{ " /quit or /exit : Exit Toxic" },
|
||||||
#ifdef _SUPPORT_AUDIO
|
#ifdef _SUPPORT_AUDIO
|
||||||
{ " /lsdev <type> : List devices where type: in|out" },
|
{ " /lsdev <type> : List devices where type: in|out" },
|
||||||
|
146
src/groupchat.c
146
src/groupchat.c
@ -35,6 +35,7 @@
|
|||||||
#include "prompt.h"
|
#include "prompt.h"
|
||||||
#include "toxic_strings.h"
|
#include "toxic_strings.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "line_info.h"
|
||||||
|
|
||||||
extern char *DATA_FILE;
|
extern char *DATA_FILE;
|
||||||
extern int store_data(Tox *m, char *path);
|
extern int store_data(Tox *m, char *path);
|
||||||
@ -103,29 +104,38 @@ static void close_groupchat(ToxWindow *self, Tox *m, int groupnum)
|
|||||||
kill_groupchat_window(self);
|
kill_groupchat_window(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_groupchat_help(ChatContext *ctx)
|
static void print_groupchat_help(ToxWindow *self)
|
||||||
{
|
{
|
||||||
wattron(ctx->history, COLOR_PAIR(CYAN) | A_BOLD);
|
uint8_t *msg = "Group chat commands:";
|
||||||
wprintw(ctx->history, "Group chat commands:\n");
|
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 1, CYAN);
|
||||||
wattroff(ctx->history, COLOR_PAIR(CYAN) | A_BOLD);
|
|
||||||
|
|
||||||
wprintw(ctx->history, " /add <id> <msg> : Add friend with optional message\n");
|
#define NUMLINES 9
|
||||||
wprintw(ctx->history, " /status <type> <msg>: Set your status with optional note\n");
|
|
||||||
wprintw(ctx->history, " /note <msg> : Set a personal note\n");
|
|
||||||
wprintw(ctx->history, " /nick <nick> : Set your nickname\n");
|
|
||||||
wprintw(ctx->history, " /groupchat : Create a group chat\n");
|
|
||||||
wprintw(ctx->history, " /log <on> or <off> : Enable/disable logging\n");
|
|
||||||
wprintw(ctx->history, " /close : Close the current group chat\n");
|
|
||||||
wprintw(ctx->history, " /help : Print this message again\n");
|
|
||||||
wprintw(ctx->history, " /help global : Show a list of global commands\n");
|
|
||||||
|
|
||||||
wattron(ctx->history, COLOR_PAIR(CYAN) | A_BOLD);
|
uint8_t lines[NUMLINES][MAX_STR_SIZE] = {
|
||||||
wprintw(ctx->history, " * Argument messages must be enclosed in quotation marks.\n");
|
|
||||||
wprintw(ctx->history, " * Scroll peer list with the Page Up/Page Down keys.\n\n");
|
{ " /add <id> <msg> : Add friend with optional message" },
|
||||||
wattroff(ctx->history, COLOR_PAIR(CYAN) | A_BOLD);
|
{ " /status <type> <msg>: Set your status with optional note" },
|
||||||
wattron(ctx->history, COLOR_PAIR(WHITE) | A_BOLD);
|
{ " /note <msg> : Set a personal note" },
|
||||||
wprintw(ctx->history, " Notice, some friends will be missing names while finding peers\n\n");
|
{ " /nick <nick> : Set your nickname" },
|
||||||
wattroff(ctx->history, COLOR_PAIR(WHITE) | A_BOLD);
|
{ " /groupchat : Create a group chat" },
|
||||||
|
{ " /log <on> or <off> : Enable/disable logging" },
|
||||||
|
{ " /close : Close the current group chat" },
|
||||||
|
{ " /help : Print this message again" },
|
||||||
|
{ " /help global : Show a list of global commands" },
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUMLINES; ++i)
|
||||||
|
line_info_add(self, NULL, NULL, NULL, lines[i], SYS_MSG, 0, 0);
|
||||||
|
|
||||||
|
msg = " * Use ESC key to toggle history scroll mode";
|
||||||
|
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 1, CYAN);
|
||||||
|
msg = " * Scroll peer list with the Page Up/Page Down keys.\n";
|
||||||
|
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 1, CYAN);
|
||||||
|
msg = " * Notice, some friends will be missing names while finding peers\n";
|
||||||
|
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, int groupnum, int peernum,
|
static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, int groupnum, int peernum,
|
||||||
@ -158,19 +168,10 @@ static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, int groupnum, int
|
|||||||
|
|
||||||
alert_window(self, alert_type, beep);
|
alert_window(self, alert_type, beep);
|
||||||
|
|
||||||
print_time(ctx->history);
|
uint8_t timefrmt[TIME_STR_SIZE];
|
||||||
wattron(ctx->history, COLOR_PAIR(nick_clr));
|
get_time_str(timefrmt);
|
||||||
wprintw(ctx->history, "%s: ", nick);
|
|
||||||
wattroff(ctx->history, COLOR_PAIR(nick_clr));
|
|
||||||
|
|
||||||
if (msg[0] == '>') {
|
|
||||||
wattron(ctx->history, COLOR_PAIR(GREEN));
|
|
||||||
wprintw(ctx->history, "%s\n", msg);
|
|
||||||
wattroff(ctx->history, COLOR_PAIR(GREEN));
|
|
||||||
} else {
|
|
||||||
wprintw(ctx->history, "%s\n", msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
line_info_add(self, timefrmt, nick, NULL, msg, IN_MSG, 0, nick_clr);
|
||||||
write_to_log(msg, nick, ctx->log, false);
|
write_to_log(msg, nick, ctx->log, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,11 +203,10 @@ static void groupchat_onGroupAction(ToxWindow *self, Tox *m, int groupnum, int p
|
|||||||
tox_group_peername(m, groupnum, peernum, nick);
|
tox_group_peername(m, groupnum, peernum, nick);
|
||||||
nick[TOXIC_MAX_NAME_LENGTH] = '\0'; /* enforce client max name length */
|
nick[TOXIC_MAX_NAME_LENGTH] = '\0'; /* enforce client max name length */
|
||||||
|
|
||||||
print_time(ctx->history);
|
uint8_t timefrmt[TIME_STR_SIZE];
|
||||||
wattron(ctx->history, COLOR_PAIR(YELLOW));
|
get_time_str(timefrmt);
|
||||||
wprintw(ctx->history, "* %s %s\n", nick, action);
|
|
||||||
wattroff(ctx->history, COLOR_PAIR(YELLOW));
|
|
||||||
|
|
||||||
|
line_info_add(self, timefrmt, nick, NULL, action, ACTION, 0, 0);
|
||||||
write_to_log(action, nick, ctx->log, true);
|
write_to_log(action, nick, ctx->log, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,31 +270,21 @@ static void groupchat_onGroupNamelistChange(ToxWindow *self, Tox *m, int groupnu
|
|||||||
qsort(groupchats[groupnum].peer_names, groupchats[groupnum].num_peers, TOX_MAX_NAME_LENGTH, qsort_strcasecmp_hlpr);
|
qsort(groupchats[groupnum].peer_names, groupchats[groupnum].num_peers, TOX_MAX_NAME_LENGTH, qsort_strcasecmp_hlpr);
|
||||||
|
|
||||||
ChatContext *ctx = self->chatwin;
|
ChatContext *ctx = self->chatwin;
|
||||||
print_time(ctx->history);
|
|
||||||
|
|
||||||
const uint8_t *event;
|
uint8_t *event;
|
||||||
|
uint8_t timefrmt[TIME_STR_SIZE];
|
||||||
|
get_time_str(timefrmt);
|
||||||
|
|
||||||
switch (change) {
|
switch (change) {
|
||||||
case TOX_CHAT_CHANGE_PEER_ADD:
|
case TOX_CHAT_CHANGE_PEER_ADD:
|
||||||
event = "has joined the room";
|
event = "has joined the room";
|
||||||
|
line_info_add(self, timefrmt, peername, NULL, event, CONNECTION, 0, GREEN);
|
||||||
wattron(ctx->history, COLOR_PAIR(GREEN));
|
|
||||||
wattron(ctx->history, A_BOLD);
|
|
||||||
wprintw(ctx->history, "* %s", peername);
|
|
||||||
wattroff(ctx->history, A_BOLD);
|
|
||||||
wprintw(ctx->history, " %s\n", event);
|
|
||||||
wattroff(ctx->history, COLOR_PAIR(GREEN));
|
|
||||||
|
|
||||||
write_to_log(event, peername, ctx->log, true);
|
write_to_log(event, peername, ctx->log, true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOX_CHAT_CHANGE_PEER_DEL:
|
case TOX_CHAT_CHANGE_PEER_DEL:
|
||||||
event = "has left the room";
|
event = "has left the room";
|
||||||
|
line_info_add(self, timefrmt, oldpeername, NULL, event, CONNECTION, 0, 0);
|
||||||
wattron(ctx->history, A_BOLD);
|
|
||||||
wprintw(ctx->history, "* %s", oldpeername);
|
|
||||||
wattroff(ctx->history, A_BOLD);
|
|
||||||
wprintw(ctx->history, " %s\n", event);
|
|
||||||
|
|
||||||
if (groupchats[self->num].side_pos > 0)
|
if (groupchats[self->num].side_pos > 0)
|
||||||
--groupchats[self->num].side_pos;
|
--groupchats[self->num].side_pos;
|
||||||
@ -303,17 +293,8 @@ static void groupchat_onGroupNamelistChange(ToxWindow *self, Tox *m, int groupnu
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case TOX_CHAT_CHANGE_PEER_NAME:
|
case TOX_CHAT_CHANGE_PEER_NAME:
|
||||||
wattron(ctx->history, COLOR_PAIR(MAGENTA));
|
event = " is now known as ";
|
||||||
wattron(ctx->history, A_BOLD);
|
line_info_add(self, timefrmt, oldpeername, peername, event, NAME_CHANGE, 0, 0);
|
||||||
wprintw(ctx->history, "* %s", oldpeername);
|
|
||||||
wattroff(ctx->history, A_BOLD);
|
|
||||||
|
|
||||||
wprintw(ctx->history, " is now known as ");
|
|
||||||
|
|
||||||
wattron(ctx->history, A_BOLD);
|
|
||||||
wprintw(ctx->history, "%s\n", peername);
|
|
||||||
wattroff(ctx->history, A_BOLD);
|
|
||||||
wattroff(ctx->history, COLOR_PAIR(MAGENTA));
|
|
||||||
|
|
||||||
uint8_t tmp_event[TOXIC_MAX_NAME_LENGTH + 32];
|
uint8_t tmp_event[TOXIC_MAX_NAME_LENGTH + 32];
|
||||||
snprintf(tmp_event, sizeof(tmp_event), "is now known as %s", peername);
|
snprintf(tmp_event, sizeof(tmp_event), "is now known as %s", peername);
|
||||||
@ -331,9 +312,8 @@ static void send_group_action(ToxWindow *self, ChatContext *ctx, Tox *m, uint8_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tox_group_action_send(m, self->num, action, strlen(action) + 1) == -1) {
|
if (tox_group_action_send(m, self->num, action, strlen(action) + 1) == -1) {
|
||||||
wattron(ctx->history, COLOR_PAIR(RED));
|
uint8_t *errmsg = " * Failed to send action.";
|
||||||
wprintw(ctx->history, " * Failed to send action\n");
|
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, RED);
|
||||||
wattroff(ctx->history, COLOR_PAIR(RED));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,6 +326,17 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
|
|||||||
getmaxyx(self->window, y2, x2);
|
getmaxyx(self->window, y2, x2);
|
||||||
int cur_len = 0;
|
int cur_len = 0;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
if (key == 0x107 || key == 0x8 || key == 0x7f) { /* BACKSPACE key: Remove character behind pos */
|
if (key == 0x107 || key == 0x8 || key == 0x7f) { /* BACKSPACE key: Remove character behind pos */
|
||||||
if (ctx->pos > 0) {
|
if (ctx->pos > 0) {
|
||||||
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos - 1]));
|
cur_len = MAX(1, wcwidth(ctx->line[ctx->pos - 1]));
|
||||||
@ -502,7 +493,7 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
|
|||||||
|
|
||||||
wclear(ctx->linewin);
|
wclear(ctx->linewin);
|
||||||
wmove(self->window, y2 - CURS_Y_OFFSET, 0);
|
wmove(self->window, y2 - CURS_Y_OFFSET, 0);
|
||||||
wclrtobot(self->window);
|
|
||||||
|
|
||||||
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);
|
||||||
@ -515,7 +506,7 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
|
|||||||
if (strcmp(line, "help global") == 0)
|
if (strcmp(line, "help global") == 0)
|
||||||
execute(ctx->history, self, m, "/help", GLOBAL_COMMAND_MODE);
|
execute(ctx->history, self, m, "/help", GLOBAL_COMMAND_MODE);
|
||||||
else
|
else
|
||||||
print_groupchat_help(ctx);
|
print_groupchat_help(self);
|
||||||
|
|
||||||
} else if (strncmp(line, "/me ", strlen("/me ")) == 0) {
|
} else if (strncmp(line, "/me ", strlen("/me ")) == 0) {
|
||||||
send_group_action(self, ctx, m, line + strlen("/me "));
|
send_group_action(self, ctx, m, line + strlen("/me "));
|
||||||
@ -524,9 +515,8 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
|
|||||||
}
|
}
|
||||||
} else if (!string_is_empty(line)) {
|
} else if (!string_is_empty(line)) {
|
||||||
if (tox_group_message_send(m, self->num, line, strlen(line) + 1) == -1) {
|
if (tox_group_message_send(m, self->num, line, strlen(line) + 1) == -1) {
|
||||||
wattron(ctx->history, COLOR_PAIR(RED));
|
uint8_t *errmsg = " * Failed to send message.";
|
||||||
wprintw(ctx->history, " * Failed to send message.\n");
|
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, RED);
|
||||||
wattroff(ctx->history, COLOR_PAIR(RED));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -536,13 +526,17 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
|
|||||||
|
|
||||||
static void groupchat_onDraw(ToxWindow *self, Tox *m)
|
static void groupchat_onDraw(ToxWindow *self, Tox *m)
|
||||||
{
|
{
|
||||||
curs_set(1);
|
|
||||||
int x2, y2;
|
int x2, y2;
|
||||||
getmaxyx(self->window, y2, x2);
|
getmaxyx(self->window, y2, x2);
|
||||||
|
|
||||||
ChatContext *ctx = self->chatwin;
|
ChatContext *ctx = self->chatwin;
|
||||||
|
|
||||||
|
if (!ctx->hst->scroll_mode)
|
||||||
|
scrollok(ctx->history, 1);
|
||||||
|
|
||||||
wclear(ctx->linewin);
|
wclear(ctx->linewin);
|
||||||
|
line_info_print(self);
|
||||||
|
|
||||||
if (ctx->len > 0) {
|
if (ctx->len > 0) {
|
||||||
uint8_t line[MAX_STR_SIZE];
|
uint8_t line[MAX_STR_SIZE];
|
||||||
@ -593,22 +587,26 @@ static void groupchat_onInit(ToxWindow *self, Tox *m)
|
|||||||
getmaxyx(self->window, y, x);
|
getmaxyx(self->window, y, x);
|
||||||
|
|
||||||
ChatContext *ctx = self->chatwin;
|
ChatContext *ctx = self->chatwin;
|
||||||
|
|
||||||
ctx->history = subwin(self->window, y-CHATBOX_HEIGHT+1, x-SIDEBAR_WIDTH-1, 0, 0);
|
ctx->history = subwin(self->window, y-CHATBOX_HEIGHT+1, x-SIDEBAR_WIDTH-1, 0, 0);
|
||||||
scrollok(ctx->history, 1);
|
|
||||||
ctx->linewin = subwin(self->window, CHATBOX_HEIGHT, x, y-CHATBOX_HEIGHT, 0);
|
ctx->linewin = subwin(self->window, CHATBOX_HEIGHT, x, y-CHATBOX_HEIGHT, 0);
|
||||||
ctx->sidebar = subwin(self->window, y-CHATBOX_HEIGHT+1, SIDEBAR_WIDTH, 0, x-SIDEBAR_WIDTH);
|
ctx->sidebar = subwin(self->window, y-CHATBOX_HEIGHT+1, SIDEBAR_WIDTH, 0, x-SIDEBAR_WIDTH);
|
||||||
|
|
||||||
|
ctx->hst = malloc(sizeof(struct history));
|
||||||
ctx->log = malloc(sizeof(struct chatlog));
|
ctx->log = malloc(sizeof(struct chatlog));
|
||||||
|
|
||||||
if (ctx->log == NULL) {
|
if (ctx->log == NULL || ctx->hst == NULL) {
|
||||||
endwin();
|
endwin();
|
||||||
fprintf(stderr, "malloc() failed. Aborting...\n");
|
fprintf(stderr, "malloc() failed. Aborting...\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(ctx->hst, 0, sizeof(struct history));
|
||||||
memset(ctx->log, 0, sizeof(struct chatlog));
|
memset(ctx->log, 0, sizeof(struct chatlog));
|
||||||
|
|
||||||
print_groupchat_help(ctx);
|
line_info_init(ctx->hst);
|
||||||
|
|
||||||
|
print_groupchat_help(self);
|
||||||
execute(ctx->history, self, m, "/log", GLOBAL_COMMAND_MODE);
|
execute(ctx->history, self, m, "/log", GLOBAL_COMMAND_MODE);
|
||||||
|
|
||||||
wmove(self->window, y-CURS_Y_OFFSET, 0);
|
wmove(self->window, y-CURS_Y_OFFSET, 0);
|
||||||
|
@ -50,7 +50,7 @@ void line_info_init(struct history *hst)
|
|||||||
static void line_info_reset_start(struct history *hst)
|
static void line_info_reset_start(struct history *hst)
|
||||||
{
|
{
|
||||||
struct line_info *line = hst->line_end;
|
struct line_info *line = hst->line_end;
|
||||||
uint32_t start_id = hst->start_id;
|
uint32_t start_id = hst->start_id + 1;
|
||||||
|
|
||||||
while (line) {
|
while (line) {
|
||||||
if (line->id == start_id) {
|
if (line->id == start_id) {
|
||||||
@ -91,7 +91,7 @@ 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 type, uint8_t bold, uint8_t colour)
|
||||||
{
|
{
|
||||||
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));
|
||||||
@ -107,8 +107,9 @@ void line_info_add(ToxWindow *self, uint8_t *tmstmp, uint8_t *name1, uint8_t *na
|
|||||||
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 (type) {
|
||||||
case ACTION:
|
case ACTION:
|
||||||
|
case NAME_CHANGE:
|
||||||
len += 3;
|
len += 3;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -131,7 +132,7 @@ void line_info_add(ToxWindow *self, uint8_t *tmstmp, uint8_t *name1, uint8_t *na
|
|||||||
}
|
}
|
||||||
|
|
||||||
new_line->len = len;
|
new_line->len = len;
|
||||||
new_line->msgtype = msgtype;
|
new_line->type = type;
|
||||||
new_line->bold = bold;
|
new_line->bold = bold;
|
||||||
new_line->colour = colour;
|
new_line->colour = colour;
|
||||||
new_line->id = hst->line_end->id + 1;
|
new_line->id = hst->line_end->id + 1;
|
||||||
@ -180,15 +181,19 @@ void line_info_print(ToxWindow *self)
|
|||||||
WINDOW *win = ctx->history;
|
WINDOW *win = ctx->history;
|
||||||
|
|
||||||
wclear(win);
|
wclear(win);
|
||||||
wmove(win, 1, 0);
|
|
||||||
int y2, x2;
|
int y2, x2;
|
||||||
getmaxyx(self->window, y2, x2);
|
getmaxyx(self->window, y2, x2);
|
||||||
|
|
||||||
struct line_info *line = ctx->hst->line_start;
|
if (self->is_groupchat)
|
||||||
|
wmove(win, 0, 0);
|
||||||
|
else
|
||||||
|
wmove(win, 2, 0);
|
||||||
|
|
||||||
|
struct line_info *line = ctx->hst->line_start->next;
|
||||||
int numlines = 0;
|
int numlines = 0;
|
||||||
|
|
||||||
while(line && numlines <= y2) {
|
while(line && numlines <= y2) {
|
||||||
uint8_t type = line->msgtype;
|
uint8_t type = line->type;
|
||||||
numlines += line->len / x2;
|
numlines += line->len / x2;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@ -274,6 +279,25 @@ void line_info_print(ToxWindow *self)
|
|||||||
wprintw(win, "%s\n", line->msg);
|
wprintw(win, "%s\n", line->msg);
|
||||||
wattroff(win, COLOR_PAIR(line->colour));
|
wattroff(win, COLOR_PAIR(line->colour));
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NAME_CHANGE:
|
||||||
|
wattron(win, COLOR_PAIR(BLUE));
|
||||||
|
wprintw(win, "%s", line->timestamp);
|
||||||
|
wattroff(win, COLOR_PAIR(BLUE));
|
||||||
|
|
||||||
|
wattron(win, COLOR_PAIR(MAGENTA));
|
||||||
|
wattron(win, A_BOLD);
|
||||||
|
wprintw(win, "* %s", line->name1);
|
||||||
|
wattroff(win, A_BOLD);
|
||||||
|
|
||||||
|
wprintw(win, "%s", line->msg);
|
||||||
|
|
||||||
|
wattron(win, A_BOLD);
|
||||||
|
wprintw(win, "%s\n", line->name2);
|
||||||
|
wattroff(win, A_BOLD);
|
||||||
|
wattroff(win, COLOR_PAIR(MAGENTA));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MAX_HISTORY 50
|
#define MAX_HISTORY 200
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SYS_MSG,
|
SYS_MSG,
|
||||||
@ -29,6 +29,7 @@ enum {
|
|||||||
PROMPT,
|
PROMPT,
|
||||||
ACTION,
|
ACTION,
|
||||||
CONNECTION,
|
CONNECTION,
|
||||||
|
NAME_CHANGE,
|
||||||
} LINE_TYPE;
|
} LINE_TYPE;
|
||||||
|
|
||||||
struct line_info {
|
struct line_info {
|
||||||
@ -36,7 +37,7 @@ struct line_info {
|
|||||||
uint8_t name1[TOXIC_MAX_NAME_LENGTH];
|
uint8_t name1[TOXIC_MAX_NAME_LENGTH];
|
||||||
uint8_t name2[TOXIC_MAX_NAME_LENGTH];
|
uint8_t name2[TOXIC_MAX_NAME_LENGTH];
|
||||||
uint8_t msg[MAX_STR_SIZE];
|
uint8_t msg[MAX_STR_SIZE];
|
||||||
uint8_t msgtype;
|
uint8_t type;
|
||||||
uint8_t bold;
|
uint8_t bold;
|
||||||
uint8_t colour;
|
uint8_t colour;
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
@ -57,7 +58,7 @@ struct history {
|
|||||||
};
|
};
|
||||||
|
|
||||||
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 type, uint8_t bold, uint8_t colour);
|
||||||
void line_info_cleanup(struct history *hst);
|
void line_info_cleanup(struct history *hst);
|
||||||
void line_info_toggle_scroll(ToxWindow *self, bool scroll);
|
void line_info_toggle_scroll(ToxWindow *self, bool scroll);
|
||||||
void line_info_init(struct history *hst);
|
void line_info_init(struct history *hst);
|
||||||
|
@ -55,17 +55,6 @@ struct tm *get_time(void)
|
|||||||
return timeinfo;
|
return timeinfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prints the time to given window */
|
|
||||||
void print_time(WINDOW *window)
|
|
||||||
{
|
|
||||||
uint8_t s[MAX_STR_SIZE];
|
|
||||||
strftime(s, MAX_STR_SIZE, "[%H:%M:%S] ", get_time());
|
|
||||||
|
|
||||||
wattron(window, COLOR_PAIR(BLUE));
|
|
||||||
wprintw(window, "%s", s);
|
|
||||||
wattroff(window,COLOR_PAIR(BLUE));
|
|
||||||
}
|
|
||||||
|
|
||||||
void get_time_str(uint8_t *buf)
|
void get_time_str(uint8_t *buf)
|
||||||
{
|
{
|
||||||
strftime(buf, TIME_STR_SIZE, "[%H:%M:%S] ", get_time());
|
strftime(buf, TIME_STR_SIZE, "[%H:%M:%S] ", get_time());
|
||||||
|
@ -29,8 +29,8 @@ unsigned char *hex_string_to_bin(char hex_string[]);
|
|||||||
/* get the current unix time */
|
/* get the current unix time */
|
||||||
uint64_t get_unix_time(void);
|
uint64_t get_unix_time(void);
|
||||||
|
|
||||||
/* Prints the time to given window */
|
/*Puts the current time in buf in the format of [Hour:Min:Sec] */
|
||||||
void print_time(WINDOW *window);
|
void get_time_str(uint8_t *buf);
|
||||||
|
|
||||||
/* get the current local time */
|
/* get the current local time */
|
||||||
struct tm *get_time(void);
|
struct tm *get_time(void);
|
||||||
|
16
src/prompt.c
16
src/prompt.c
@ -215,7 +215,6 @@ 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(ctx->history, "\n");
|
|
||||||
--ctx->orig_y;
|
--ctx->orig_y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -403,24 +402,25 @@ static void prompt_onFriendRequest(ToxWindow *self, Tox *m, uint8_t *key, uint8_
|
|||||||
data[length - 1] = 0;
|
data[length - 1] = 0;
|
||||||
ChatContext *ctx = self->chatwin;
|
ChatContext *ctx = self->chatwin;
|
||||||
|
|
||||||
wprintw(ctx->history, "\n");
|
uint8_t timefrmt[TIME_STR_SIZE];
|
||||||
print_time(ctx->history);
|
get_time_str(timefrmt);
|
||||||
|
|
||||||
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'", data);
|
||||||
wprintw(ctx->history, "%s", msg);
|
line_info_add(self, timefrmt, NULL, NULL, msg, SYS_MSG, 0, 0);
|
||||||
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";
|
uint8_t *errmsg = "Friend request queue is full. Discarding request.";
|
||||||
wprintw(ctx->history, "%s", errmsg);
|
line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0);
|
||||||
write_to_log(errmsg, "", ctx->log, true);
|
write_to_log(errmsg, "", ctx->log, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
wprintw(ctx->history, "Type \"/accept %d\" to accept it.\n", n);
|
snprintf(msg, sizeof(msg), "Type \"/accept %d\" to accept it.", n);
|
||||||
|
line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0);
|
||||||
alert_window(self, WINDOW_ALERT_1, true);
|
alert_window(self, WINDOW_ALERT_1, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user