1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-11-26 16:03:27 +01:00

implement group titles

This commit is contained in:
Jfreegman 2014-11-14 22:15:59 -05:00
parent dd8c2caac7
commit 76c21c8b34
No known key found for this signature in database
GPG Key ID: 3627F3144076AE63
16 changed files with 193 additions and 26 deletions

View File

@ -14,6 +14,7 @@ LDFLAGS = $(USER_LDFLAGS)
OBJ = chat.o chat_commands.o configdir.o dns.o execute.o file_senders.o notify.o OBJ = chat.o chat_commands.o configdir.o dns.o execute.o file_senders.o notify.o
OBJ += friendlist.o global_commands.o groupchat.o line_info.o input.o help.o autocomplete.o OBJ += friendlist.o global_commands.o groupchat.o line_info.o input.o help.o autocomplete.o
OBJ += log.o misc_tools.o prompt.o settings.o toxic.o toxic_strings.o windows.o message_queue.o OBJ += log.o misc_tools.o prompt.o settings.o toxic.o toxic_strings.o windows.o message_queue.o
OBJ += group_commands.o
# Check on wich system we are running # Check on wich system we are running
UNAME_S = $(shell uname -s) UNAME_S = $(shell uname -s)

View File

@ -116,19 +116,6 @@ static void set_self_typingstatus(ToxWindow *self, Tox *m, uint8_t is_typing)
ctx->self_is_typing = is_typing; ctx->self_is_typing = is_typing;
} }
static void chat_set_window_name(ToxWindow *self, const char *nick, int len)
{
char nick_cpy[TOXIC_MAX_NAME_LENGTH + 1];
snprintf(nick_cpy, sizeof(nick_cpy), "%s", nick);
if (len > MAX_WINDOW_NAME_LENGTH) {
strcpy(&nick_cpy[MAX_WINDOW_NAME_LENGTH - 3], "...");
nick_cpy[MAX_WINDOW_NAME_LENGTH] = '\0';
}
snprintf(self->name, sizeof(self->name), "%s", nick_cpy);
}
static void close_all_file_receivers(Tox *m, int friendnum); static void close_all_file_receivers(Tox *m, int friendnum);
void kill_chat_window(ToxWindow *self, Tox *m) void kill_chat_window(ToxWindow *self, Tox *m)
@ -264,7 +251,7 @@ static void chat_onNickChange(ToxWindow *self, Tox *m, int32_t num, const char *
len = strlen(statusbar->nick); len = strlen(statusbar->nick);
statusbar->nick_len = len; statusbar->nick_len = len;
chat_set_window_name(self, statusbar->nick, len); set_window_title(self, statusbar->nick, len);
} }
static void chat_onStatusChange(ToxWindow *self, Tox *m, int32_t num, uint8_t status) static void chat_onStatusChange(ToxWindow *self, Tox *m, int32_t num, uint8_t status)
@ -1172,7 +1159,7 @@ ToxWindow new_chat(Tox *m, int32_t friendnum)
char nick[TOX_MAX_NAME_LENGTH]; char nick[TOX_MAX_NAME_LENGTH];
int n_len = get_nick_truncate(m, nick, friendnum); int n_len = get_nick_truncate(m, nick, friendnum);
chat_set_window_name(&ret, nick, n_len); set_window_title(&ret, nick, n_len);
ChatContext *chatwin = calloc(1, sizeof(ChatContext)); ChatContext *chatwin = calloc(1, sizeof(ChatContext));
StatusBar *stb = calloc(1, sizeof(StatusBar)); StatusBar *stb = calloc(1, sizeof(StatusBar));

View File

@ -29,6 +29,7 @@
#include "execute.h" #include "execute.h"
#include "chat_commands.h" #include "chat_commands.h"
#include "global_commands.h" #include "global_commands.h"
#include "group_commands.h"
#include "line_info.h" #include "line_info.h"
#include "misc_tools.h" #include "misc_tools.h"
#include "notify.h" #include "notify.h"
@ -81,6 +82,8 @@ static struct cmd_func chat_commands[] = {
}; };
static struct cmd_func group_commands[] = { static struct cmd_func group_commands[] = {
{ "/title", cmd_set_title },
#ifdef AUDIO #ifdef AUDIO
{ "/mute", cmd_mute }, { "/mute", cmd_mute },
{ "/sense", cmd_sense }, { "/sense", cmd_sense },

70
src/group_commands.c Normal file
View File

@ -0,0 +1,70 @@
/* group_commands.c
*
*
* Copyright (C) 2014 Toxic All Rights Reserved.
*
* This file is part of Toxic.
*
* Toxic 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.
*
* Toxic 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 Toxic. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include <string.h>
#include "toxic.h"
#include "windows.h"
#include "line_info.h"
#include "misc_tools.h"
#include "log.h"
void cmd_set_title(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
char title[MAX_STR_SIZE];
if (argc < 1) {
snprintf(title, sizeof(title), "Group title: %s", self->name);
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, MAGENTA, title);
return;
}
if (argv[1][0] != '\"') {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Title must be enclosed in quotes.");
return;
}
/* remove opening and closing quotes */
snprintf(title, sizeof(title), "%s", &argv[1][1]);
int len = strlen(title) - 1;
title[len] = '\0';
if (tox_group_set_title(m, self->num, (uint8_t *) title, len) != 0) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set title.");
return;
}
set_window_title(self, title, len);
char timefrmt[TIME_STR_SIZE];
char selfnick[TOX_MAX_NAME_LENGTH];
get_time_str(timefrmt, sizeof(timefrmt));
uint16_t sn_len = tox_get_self_name(m, (uint8_t *) selfnick);
selfnick[sn_len] = '\0';
line_info_add(self, timefrmt, selfnick, title, NAME_CHANGE, 0, 0, " changed the group title to ");
char tmp_event[MAX_STR_SIZE];
snprintf(tmp_event, sizeof(tmp_event), "set title to %s", title);
write_to_log(tmp_event, selfnick, self->chatwin->log, true);
}

31
src/group_commands.h Normal file
View File

@ -0,0 +1,31 @@
/* group_commands.h
*
*
* Copyright (C) 2014 Toxic All Rights Reserved.
*
* This file is part of Toxic.
*
* Toxic 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.
*
* Toxic 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 Toxic. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef GROUP_COMMANDS_H
#define GROUP_COMMANDS_H
#include "windows.h"
#include "toxic.h"
void cmd_set_title(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
#endif /* GROUP_COMMANDS_H */

View File

@ -55,9 +55,9 @@ extern struct user_settings *user_settings;
extern struct Winthread Winthread; extern struct Winthread Winthread;
#ifdef AUDIO #ifdef AUDIO
#define AC_NUM_GROUP_COMMANDS 21 #define AC_NUM_GROUP_COMMANDS 22
#else #else
#define AC_NUM_GROUP_COMMANDS 17 #define AC_NUM_GROUP_COMMANDS 18
#endif /* AUDIO */ #endif /* AUDIO */
/* Array of groupchat command names used for tab completion. */ /* Array of groupchat command names used for tab completion. */
@ -79,6 +79,7 @@ static const char group_cmd_list[AC_NUM_GROUP_COMMANDS][MAX_CMDNAME_SIZE] = {
{ "/quit" }, { "/quit" },
{ "/requests" }, { "/requests" },
{ "/status" }, { "/status" },
{ "/title" },
#ifdef AUDIO #ifdef AUDIO
@ -274,6 +275,36 @@ static void groupchat_onGroupAction(ToxWindow *self, Tox *m, int groupnum, int p
write_to_log(action, nick, ctx->log, true); write_to_log(action, nick, ctx->log, true);
} }
static void groupchat_onGroupTitleChange(ToxWindow *self, Tox *m, int groupnum, int peernum, const char *title,
uint8_t length)
{
ChatContext *ctx = self->chatwin;
if (self->num != groupnum)
return;
set_window_title(self, title, length);
char event[MAX_STR_SIZE];
char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt));
/* announce title when we join the room */
if (!timed_out(groupchats[self->num].start_time, get_unix_time(), GROUP_EVENT_WAIT)) {
snprintf(event, sizeof(event), "Title set to: %s", title);
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, MAGENTA, event);
return;
}
char nick[TOX_MAX_NAME_LENGTH];
get_group_nick_truncate(m, nick, peernum, groupnum);
line_info_add(self, timefrmt, nick, title, NAME_CHANGE, 0, 0, (char *) "changed the group title to");
char tmp_event[MAX_STR_SIZE];
snprintf(tmp_event, sizeof(tmp_event), "set title to %s", title);
write_to_log(tmp_event, nick, ctx->log, true);
}
/* Puts two copies of peerlist/lengths in chat instance */ /* Puts two copies of peerlist/lengths in chat instance */
static void copy_peernames(int gnum, uint8_t peerlist[][TOX_MAX_NAME_LENGTH], uint16_t lengths[], int npeers) static void copy_peernames(int gnum, uint8_t peerlist[][TOX_MAX_NAME_LENGTH], uint16_t lengths[], int npeers)
{ {
@ -326,8 +357,6 @@ struct group_add_thrd {
pthread_attr_t attr; pthread_attr_t attr;
}; };
#define GROUP_EVENT_WAIT 2
/* Waits GROUP_EVENT_WAIT seconds for a new peer to set their name before announcing them */ /* Waits GROUP_EVENT_WAIT seconds for a new peer to set their name before announcing them */
void *group_add_wait(void *data) void *group_add_wait(void *data)
{ {
@ -708,6 +737,7 @@ ToxWindow new_group_chat(Tox *m, int groupnum)
ret.onGroupMessage = &groupchat_onGroupMessage; ret.onGroupMessage = &groupchat_onGroupMessage;
ret.onGroupNamelistChange = &groupchat_onGroupNamelistChange; ret.onGroupNamelistChange = &groupchat_onGroupNamelistChange;
ret.onGroupAction = &groupchat_onGroupAction; ret.onGroupAction = &groupchat_onGroupAction;
ret.onGroupTitleChange = &groupchat_onGroupTitleChange;
#ifdef AUDIO #ifdef AUDIO
ret.onWriteDevice = &groupchat_onWriteDevice; ret.onWriteDevice = &groupchat_onWriteDevice;

View File

@ -30,6 +30,7 @@
#define SIDEBAR_WIDTH 16 #define SIDEBAR_WIDTH 16
#define SDBAR_OFST 2 /* Offset for the peer number box at the top of the statusbar */ #define SDBAR_OFST 2 /* Offset for the peer number box at the top of the statusbar */
#define MAX_GROUPCHAT_NUM MAX_WINDOWS_NUM - 2 #define MAX_GROUPCHAT_NUM MAX_WINDOWS_NUM - 2
#define GROUP_EVENT_WAIT 2
#ifdef AUDIO #ifdef AUDIO
#define MAX_GROUP_PEERS 256 /* arbitrary limit, only used for audio */ #define MAX_GROUP_PEERS 256 /* arbitrary limit, only used for audio */

View File

@ -240,9 +240,15 @@ static void help_draw_group(ToxWindow *self)
wmove(win, 1, 1); wmove(win, 1, 1);
wattron(win, A_BOLD | COLOR_PAIR(RED)); wattron(win, A_BOLD | COLOR_PAIR(RED));
wprintw(win, "Group audio commands:\n"); wprintw(win, "Group commands:\n");
wattroff(win, A_BOLD | COLOR_PAIR(RED)); wattroff(win, A_BOLD | COLOR_PAIR(RED));
wprintw(win, " /title <msg> : Set group title (show current title if no msg)\n\n");
wattron(win, A_BOLD);
wprintw(win, " Audio commands:\n");
wattroff(win, A_BOLD);
wprintw(win, " /mute <type> : Mute active device where type: in | out\n"); wprintw(win, " /mute <type> : Mute active device where type: in | out\n");
wprintw(win, " /sense <n> : VAD sensitivity threshold\n\n"); wprintw(win, " /sense <n> : VAD sensitivity threshold\n\n");
@ -302,7 +308,7 @@ void help_onKey(ToxWindow *self, wint_t key)
#ifdef AUDIO /* remove if/when we add non-audio group commands */ #ifdef AUDIO /* remove if/when we add non-audio group commands */
case 'r': case 'r':
help_init_window(self, 7, 80); help_init_window(self, 10, 80);
self->help->type = HELP_GROUP; self->help->type = HELP_GROUP;
break; break;
#endif #endif

View File

@ -130,8 +130,8 @@ static struct line_info *line_info_ret_queue(struct history *hst)
} }
/* creates new line_info line and puts it in the queue. */ /* creates new line_info line and puts it in the queue. */
void line_info_add(ToxWindow *self, char *timestr, char *name1, char *name2, uint8_t type, uint8_t bold, void line_info_add(ToxWindow *self, const char *timestr, const char *name1, const char *name2, uint8_t type,
uint8_t colour, const char *msg, ...) uint8_t bold, uint8_t colour, const char *msg, ...)
{ {
struct history *hst = self->chatwin->hst; struct history *hst = self->chatwin->hst;

View File

@ -74,8 +74,8 @@ struct history {
}; };
/* creates new line_info line and puts it in the queue. */ /* creates new line_info line and puts it in the queue. */
void line_info_add(ToxWindow *self, char *timestr, char *name1, char *name2, uint8_t type, uint8_t bold, void line_info_add(ToxWindow *self, const char *timestr, const char *name1, const char *name2, uint8_t type,
uint8_t colour, const char *msg, ...); uint8_t bold, uint8_t colour, const char *msg, ...);
/* Prints a section of history starting at line_start */ /* Prints a section of history starting at line_start */
void line_info_print(ToxWindow *self); void line_info_print(ToxWindow *self);

View File

@ -377,3 +377,21 @@ int check_file_signature(const char *signature, size_t size, FILE *fp)
return ret == 0 ? 0 : 1; return ret == 0 ? 0 : 1;
} }
/* sets window title in tab bar. */
void set_window_title(ToxWindow *self, const char *title, int len)
{
char cpy[TOXIC_MAX_NAME_LENGTH + 1];
if (self->is_groupchat) /* keep groupnumber in title */
snprintf(cpy, sizeof(cpy), "%d-%s", self->num, title);
else
snprintf(cpy, sizeof(cpy), "%s", title);
if (len > MAX_WINDOW_NAME_LENGTH) {
strcpy(&cpy[MAX_WINDOW_NAME_LENGTH - 3], "...");
cpy[MAX_WINDOW_NAME_LENGTH] = '\0';
}
snprintf(self->name, sizeof(self->name), "%s", cpy);
}

View File

@ -134,4 +134,7 @@ off_t file_size(const char *path);
On success this function will seek back to the beginning of fp */ On success this function will seek back to the beginning of fp */
int check_file_signature(const char *signature, size_t size, FILE *fp); int check_file_signature(const char *signature, size_t size, FILE *fp);
/* sets window title in tab bar. */
void set_window_title(ToxWindow *self, const char *title, int len);
#endif /* #define MISC_TOOLS_H */ #endif /* #define MISC_TOOLS_H */

View File

@ -313,6 +313,7 @@ static Tox *init_tox(void)
tox_callback_file_control(m, on_file_control, NULL); tox_callback_file_control(m, on_file_control, NULL);
tox_callback_file_data(m, on_file_data, NULL); tox_callback_file_data(m, on_file_data, NULL);
tox_callback_read_receipt(m, on_read_receipt, NULL); tox_callback_read_receipt(m, on_read_receipt, NULL);
tox_callback_group_title(m, on_group_titlechange, NULL);
tox_set_name(m, (uint8_t *) "Toxic User", strlen("Toxic User")); tox_set_name(m, (uint8_t *) "Toxic User", strlen("Toxic User"));

View File

@ -107,6 +107,7 @@ void on_groupmessage(Tox *m, int groupnumber, int peernumber, const uint8_t *mes
void on_groupaction(Tox *m, int groupnumber, int peernumber, const uint8_t *action, uint16_t length, void *userdata); void on_groupaction(Tox *m, int groupnumber, int peernumber, const uint8_t *action, uint16_t length, void *userdata);
void on_groupinvite(Tox *m, int32_t friendnumber, uint8_t type, const uint8_t *group_pub_key, uint16_t length, void *userdata); void on_groupinvite(Tox *m, int32_t friendnumber, uint8_t type, const uint8_t *group_pub_key, uint16_t length, void *userdata);
void on_group_namelistchange(Tox *m, int groupnumber, int peernumber, uint8_t change, void *userdata); void on_group_namelistchange(Tox *m, int groupnumber, int peernumber, uint8_t change, void *userdata);
void on_group_titlechange(Tox *m, int groupnumber, int peernumber, const uint8_t *title, uint8_t length, void *userdata);
void on_file_sendrequest(Tox *m, int32_t friendnumber, uint8_t filenumber, uint64_t filesize, const uint8_t *pathname, void on_file_sendrequest(Tox *m, int32_t friendnumber, uint8_t filenumber, uint64_t filesize, const uint8_t *pathname,
uint16_t pathname_length, void *userdata); uint16_t pathname_length, void *userdata);
void on_file_control(Tox *m, int32_t friendnumber, uint8_t receive_send, uint8_t filenumber, uint8_t control_type, void on_file_control(Tox *m, int32_t friendnumber, uint8_t receive_send, uint8_t filenumber, uint8_t control_type,

View File

@ -209,6 +209,20 @@ void on_group_namelistchange(Tox *m, int groupnumber, int peernumber, uint8_t ch
} }
} }
void on_group_titlechange(Tox *m, int groupnumber, int peernumber, const uint8_t *title, uint8_t length,
void *userdata)
{
char data[MAX_STR_SIZE + 1];
length = copy_tox_str(data, sizeof(data), (const char *) title, length);
int i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupTitleChange != NULL)
windows[i].onGroupTitleChange(&windows[i], m, groupnumber, peernumber, data, length);
}
}
void on_file_sendrequest(Tox *m, int32_t friendnumber, uint8_t filenumber, uint64_t filesize, void on_file_sendrequest(Tox *m, int32_t friendnumber, uint8_t filenumber, uint64_t filesize,
const uint8_t *filename, uint16_t filename_length, void *userdata) const uint8_t *filename, uint16_t filename_length, void *userdata)
{ {

View File

@ -37,7 +37,7 @@
#include "toxic.h" #include "toxic.h"
#define MAX_WINDOWS_NUM 32 #define MAX_WINDOWS_NUM 32
#define MAX_WINDOW_NAME_LENGTH 16 #define MAX_WINDOW_NAME_LENGTH 20
#define CURS_Y_OFFSET 1 /* y-axis cursor offset for chat contexts */ #define CURS_Y_OFFSET 1 /* y-axis cursor offset for chat contexts */
#define CHATBOX_HEIGHT 2 #define CHATBOX_HEIGHT 2
@ -117,6 +117,7 @@ struct ToxWindow {
void(*onGroupAction)(ToxWindow *, Tox *, int, int, const char *, uint16_t); void(*onGroupAction)(ToxWindow *, Tox *, int, int, const char *, uint16_t);
void(*onGroupInvite)(ToxWindow *, Tox *, int32_t, uint8_t, const char *, uint16_t); void(*onGroupInvite)(ToxWindow *, Tox *, int32_t, uint8_t, const char *, uint16_t);
void(*onGroupNamelistChange)(ToxWindow *, Tox *, int, int, uint8_t); void(*onGroupNamelistChange)(ToxWindow *, Tox *, int, int, uint8_t);
void(*onGroupTitleChange)(ToxWindow *, Tox *, int, int, const char *, uint8_t);
void(*onFileSendRequest)(ToxWindow *, Tox *, int32_t, uint8_t, uint64_t, const char *, uint16_t); void(*onFileSendRequest)(ToxWindow *, Tox *, int32_t, uint8_t, uint64_t, const char *, uint16_t);
void(*onFileControl)(ToxWindow *, Tox *, int32_t, uint8_t, uint8_t, uint8_t, const char *, uint16_t); void(*onFileControl)(ToxWindow *, Tox *, int32_t, uint8_t, uint8_t, uint8_t, const char *, uint16_t);
void(*onFileData)(ToxWindow *, Tox *, int32_t, uint8_t, const char *, uint16_t); void(*onFileData)(ToxWindow *, Tox *, int32_t, uint8_t, const char *, uint16_t);