mirror of
https://github.com/Tha14/toxic.git
synced 2024-12-23 11:03:25 +01:00
code cleanup, add delay for unread message notification
This commit is contained in:
parent
5b9bd603ea
commit
8dd25e1f0b
@ -31,6 +31,8 @@
|
||||
#include "groupchat.h"
|
||||
#include "settings.h"
|
||||
#include "notify.h"
|
||||
#include "message_queue.h"
|
||||
#include "misc_tools.h"
|
||||
|
||||
extern struct user_settings *user_settings_;
|
||||
|
||||
@ -129,7 +131,7 @@ static struct line_info *line_info_ret_queue(struct history *hst)
|
||||
|
||||
/* creates new line_info line and puts it in the queue.
|
||||
SYS_MSG lines may contain an arbitrary number of arguments for string formatting */
|
||||
void line_info_add(ToxWindow *self, char *tmstmp, char *name1, char *name2, uint8_t type, uint8_t bold,
|
||||
void line_info_add(ToxWindow *self, char *timestr, char *name1, char *name2, uint8_t type, uint8_t bold,
|
||||
uint8_t colour, const char *msg, ...)
|
||||
{
|
||||
struct history *hst = self->chatwin->hst;
|
||||
@ -153,9 +155,12 @@ void line_info_add(ToxWindow *self, char *tmstmp, char *name1, char *name2, uint
|
||||
|
||||
/* for type-specific formatting in print function */
|
||||
switch (type) {
|
||||
case GROUP_ACTION:
|
||||
len += 3;
|
||||
break;
|
||||
|
||||
case OUT_ACTION:
|
||||
case IN_ACTION:
|
||||
case GROUP_ACTION:
|
||||
len += 5;
|
||||
break;
|
||||
|
||||
@ -191,9 +196,9 @@ void line_info_add(ToxWindow *self, char *tmstmp, char *name1, char *name2, uint
|
||||
}
|
||||
}
|
||||
|
||||
if (tmstmp) {
|
||||
snprintf(new_line->timestamp, sizeof(new_line->timestamp), "%s", tmstmp);
|
||||
len += strlen(new_line->timestamp);
|
||||
if (timestr) {
|
||||
snprintf(new_line->timestr, sizeof(new_line->timestr), "%s", timestr);
|
||||
len += strlen(new_line->timestr);
|
||||
}
|
||||
|
||||
if (name1) {
|
||||
@ -210,6 +215,7 @@ void line_info_add(ToxWindow *self, char *tmstmp, char *name1, char *name2, uint
|
||||
new_line->type = type;
|
||||
new_line->bold = bold;
|
||||
new_line->colour = colour;
|
||||
new_line->timestamp = get_unix_time();
|
||||
|
||||
hst->queue[hst->queue_sz++] = new_line;
|
||||
}
|
||||
@ -289,7 +295,7 @@ void line_info_print(ToxWindow *self)
|
||||
case OUT_MSG_READ:
|
||||
case IN_MSG:
|
||||
wattron(win, COLOR_PAIR(BLUE));
|
||||
wprintw(win, "%s", line->timestamp);
|
||||
wprintw(win, "%s", line->timestr);
|
||||
wattroff(win, COLOR_PAIR(BLUE));
|
||||
|
||||
int nameclr = GREEN;
|
||||
@ -311,7 +317,7 @@ void line_info_print(ToxWindow *self)
|
||||
if (line->msg[0] == '>')
|
||||
wattroff(win, COLOR_PAIR(GREEN));
|
||||
|
||||
if (type == OUT_MSG) { /* sent message with no recieve receipt */
|
||||
if (type == OUT_MSG && timed_out(line->timestamp, get_unix_time(), CQUEUE_TRY_SEND_INTERVAL)) {
|
||||
wattron(win, COLOR_PAIR(RED));
|
||||
wprintw(win, " x", line->msg);
|
||||
wattroff(win, COLOR_PAIR(RED));
|
||||
@ -325,14 +331,14 @@ void line_info_print(ToxWindow *self)
|
||||
case OUT_ACTION:
|
||||
case IN_ACTION:
|
||||
wattron(win, COLOR_PAIR(BLUE));
|
||||
wprintw(win, "%s", line->timestamp);
|
||||
wprintw(win, "%s", line->timestr);
|
||||
wattroff(win, COLOR_PAIR(BLUE));
|
||||
|
||||
wattron(win, COLOR_PAIR(YELLOW));
|
||||
wprintw(win, "* %s %s", line->name1, line->msg);
|
||||
wattroff(win, COLOR_PAIR(YELLOW));
|
||||
|
||||
if (type == OUT_ACTION) { /* sent action with no recieve receipt */
|
||||
if (type == OUT_ACTION && timed_out(line->timestamp, get_unix_time(), CQUEUE_TRY_SEND_INTERVAL)) {
|
||||
wattron(win, COLOR_PAIR(RED));
|
||||
wprintw(win, " x", line->msg);
|
||||
wattroff(win, COLOR_PAIR(RED));
|
||||
@ -342,9 +348,9 @@ void line_info_print(ToxWindow *self)
|
||||
break;
|
||||
|
||||
case SYS_MSG:
|
||||
if (line->timestamp[0]) {
|
||||
if (line->timestr[0]) {
|
||||
wattron(win, COLOR_PAIR(BLUE));
|
||||
wprintw(win, "%s", line->timestamp);
|
||||
wprintw(win, "%s", line->timestr);
|
||||
wattroff(win, COLOR_PAIR(BLUE));
|
||||
}
|
||||
|
||||
@ -377,7 +383,7 @@ void line_info_print(ToxWindow *self)
|
||||
|
||||
case CONNECTION:
|
||||
wattron(win, COLOR_PAIR(BLUE));
|
||||
wprintw(win, "%s", line->timestamp);
|
||||
wprintw(win, "%s", line->timestr);
|
||||
wattroff(win, COLOR_PAIR(BLUE));
|
||||
|
||||
wattron(win, COLOR_PAIR(line->colour));
|
||||
@ -391,7 +397,7 @@ void line_info_print(ToxWindow *self)
|
||||
|
||||
case NAME_CHANGE:
|
||||
wattron(win, COLOR_PAIR(BLUE));
|
||||
wprintw(win, "%s", line->timestamp);
|
||||
wprintw(win, "%s", line->timestr);
|
||||
wattroff(win, COLOR_PAIR(BLUE));
|
||||
|
||||
wattron(win, COLOR_PAIR(MAGENTA));
|
||||
|
@ -45,10 +45,11 @@ enum {
|
||||
} LINE_TYPE;
|
||||
|
||||
struct line_info {
|
||||
char timestamp[TIME_STR_SIZE];
|
||||
char timestr[TIME_STR_SIZE];
|
||||
char name1[TOXIC_MAX_NAME_LENGTH];
|
||||
char name2[TOXIC_MAX_NAME_LENGTH];
|
||||
char msg[TOX_MAX_MESSAGE_LENGTH];
|
||||
uint64_t timestamp;
|
||||
uint8_t type;
|
||||
uint8_t bold;
|
||||
uint8_t colour;
|
||||
@ -73,7 +74,7 @@ struct history {
|
||||
|
||||
/* creates new line_info line and puts it in the queue.
|
||||
SYS_MSG lines may contain an arbitrary number of arguments for string formatting */
|
||||
void line_info_add(ToxWindow *self, char *tmstmp, char *name1, char *name2, uint8_t type, uint8_t bold,
|
||||
void line_info_add(ToxWindow *self, char *timestr, char *name1, char *name2, uint8_t type, uint8_t bold,
|
||||
uint8_t colour, const char *msg, ...);
|
||||
|
||||
/* Prints a section of history starting at line_start */
|
||||
|
@ -53,13 +53,10 @@ void cqueue_add(struct chat_queue *q, const char *msg, int len, uint8_t type, ui
|
||||
new_m->type = type;
|
||||
new_m->line_id = line_id;
|
||||
|
||||
if (q->root == NULL) {
|
||||
new_m->prev = NULL;
|
||||
if (q->root == NULL)
|
||||
q->root = new_m;
|
||||
} else {
|
||||
new_m->prev = q->end;
|
||||
else
|
||||
q->end->next = new_m;
|
||||
}
|
||||
|
||||
q->end = new_m;
|
||||
}
|
||||
@ -80,39 +77,21 @@ static void cqueue_mark_read(ToxWindow *self, uint32_t id, uint8_t type)
|
||||
}
|
||||
}
|
||||
|
||||
/* removes the message with the same receipt number from queue and updates line to show the message was received*/
|
||||
/* removes root from queue and updates line to show the message was received.
|
||||
receipt should always be equal to queue root's receipt */
|
||||
void cqueue_remove(ToxWindow *self, struct chat_queue *q, uint32_t receipt)
|
||||
{
|
||||
struct cqueue_msg *q_msg = q->root;
|
||||
struct cqueue_msg *root = q->root;
|
||||
|
||||
while (q_msg) {
|
||||
struct cqueue_msg *next = q_msg->next;
|
||||
if (root->receipt != receipt)
|
||||
return;
|
||||
|
||||
if (q_msg->receipt == receipt) {
|
||||
uint32_t line_id = q_msg->line_id;
|
||||
uint8_t type = q_msg->type;
|
||||
|
||||
if (q_msg->prev == NULL) {
|
||||
if (next)
|
||||
next->prev = NULL;
|
||||
|
||||
free(q->root);
|
||||
q->root = next;
|
||||
} else {
|
||||
q_msg->prev->next = next;
|
||||
free(q_msg);
|
||||
}
|
||||
|
||||
cqueue_mark_read(self, line_id, type);
|
||||
return;
|
||||
}
|
||||
|
||||
q_msg = next;
|
||||
}
|
||||
cqueue_mark_read(self, root->line_id, root->type);
|
||||
struct cqueue_msg *next = root->next;
|
||||
free(q->root);
|
||||
q->root = next;
|
||||
}
|
||||
|
||||
#define CQUEUE_TRY_SEND_INTERVAL 5
|
||||
|
||||
/* Tries to send oldest message in queue. If fails, tries again in CQUEUE_TRY_SEND_INTERVAL seconds */
|
||||
void cqueue_try_send(ToxWindow *self, Tox *m)
|
||||
{
|
||||
|
@ -20,6 +20,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#define CQUEUE_TRY_SEND_INTERVAL 5
|
||||
|
||||
struct cqueue_msg {
|
||||
char message[MAX_STR_SIZE];
|
||||
int len;
|
||||
@ -27,7 +29,6 @@ struct cqueue_msg {
|
||||
uint8_t type;
|
||||
uint32_t receipt;
|
||||
uint64_t last_send_try;
|
||||
struct cqueue_msg *prev;
|
||||
struct cqueue_msg *next;
|
||||
};
|
||||
|
||||
@ -40,8 +41,9 @@ struct chat_queue {
|
||||
void cqueue_cleanup(struct chat_queue *q);
|
||||
void cqueue_add(struct chat_queue *q, const char *msg, int len, uint8_t type, uint32_t line_id);
|
||||
|
||||
/* Tries to send oldest message in queue once every CQUEUE_TRY_SEND_INTERVAL seconds */
|
||||
/* Tries to send oldest message in queue. If fails, tries again in CQUEUE_TRY_SEND_INTERVAL seconds */
|
||||
void cqueue_try_send(ToxWindow *self, Tox *m);
|
||||
|
||||
/* removes the message with the same receipt number from queue and updates line to show the message was received*/
|
||||
/* removes root from queue and updates line to show the message was received.
|
||||
receipt should always be equal to queue root's receipt */
|
||||
void cqueue_remove(ToxWindow *self, struct chat_queue *q, uint32_t receipt);
|
||||
|
Loading…
Reference in New Issue
Block a user