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

code cleanup, add delay for unread message notification

This commit is contained in:
Jfreegman 2014-09-07 15:06:40 -04:00
parent 5b9bd603ea
commit 8dd25e1f0b
4 changed files with 38 additions and 50 deletions

View File

@ -31,6 +31,8 @@
#include "groupchat.h" #include "groupchat.h"
#include "settings.h" #include "settings.h"
#include "notify.h" #include "notify.h"
#include "message_queue.h"
#include "misc_tools.h"
extern struct user_settings *user_settings_; 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. /* creates new line_info line and puts it in the queue.
SYS_MSG lines may contain an arbitrary number of arguments for string formatting */ 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, ...) uint8_t colour, const char *msg, ...)
{ {
struct history *hst = self->chatwin->hst; 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 */ /* for type-specific formatting in print function */
switch (type) { switch (type) {
case GROUP_ACTION:
len += 3;
break;
case OUT_ACTION: case OUT_ACTION:
case IN_ACTION: case IN_ACTION:
case GROUP_ACTION:
len += 5; len += 5;
break; break;
@ -191,9 +196,9 @@ void line_info_add(ToxWindow *self, char *tmstmp, char *name1, char *name2, uint
} }
} }
if (tmstmp) { if (timestr) {
snprintf(new_line->timestamp, sizeof(new_line->timestamp), "%s", tmstmp); snprintf(new_line->timestr, sizeof(new_line->timestr), "%s", timestr);
len += strlen(new_line->timestamp); len += strlen(new_line->timestr);
} }
if (name1) { 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->type = type;
new_line->bold = bold; new_line->bold = bold;
new_line->colour = colour; new_line->colour = colour;
new_line->timestamp = get_unix_time();
hst->queue[hst->queue_sz++] = new_line; hst->queue[hst->queue_sz++] = new_line;
} }
@ -289,7 +295,7 @@ void line_info_print(ToxWindow *self)
case OUT_MSG_READ: case OUT_MSG_READ:
case IN_MSG: case IN_MSG:
wattron(win, COLOR_PAIR(BLUE)); wattron(win, COLOR_PAIR(BLUE));
wprintw(win, "%s", line->timestamp); wprintw(win, "%s", line->timestr);
wattroff(win, COLOR_PAIR(BLUE)); wattroff(win, COLOR_PAIR(BLUE));
int nameclr = GREEN; int nameclr = GREEN;
@ -311,7 +317,7 @@ void line_info_print(ToxWindow *self)
if (line->msg[0] == '>') if (line->msg[0] == '>')
wattroff(win, COLOR_PAIR(GREEN)); 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)); wattron(win, COLOR_PAIR(RED));
wprintw(win, " x", line->msg); wprintw(win, " x", line->msg);
wattroff(win, COLOR_PAIR(RED)); wattroff(win, COLOR_PAIR(RED));
@ -325,14 +331,14 @@ void line_info_print(ToxWindow *self)
case OUT_ACTION: case OUT_ACTION:
case IN_ACTION: case IN_ACTION:
wattron(win, COLOR_PAIR(BLUE)); wattron(win, COLOR_PAIR(BLUE));
wprintw(win, "%s", line->timestamp); wprintw(win, "%s", line->timestr);
wattroff(win, COLOR_PAIR(BLUE)); wattroff(win, COLOR_PAIR(BLUE));
wattron(win, COLOR_PAIR(YELLOW)); wattron(win, COLOR_PAIR(YELLOW));
wprintw(win, "* %s %s", line->name1, line->msg); wprintw(win, "* %s %s", line->name1, line->msg);
wattroff(win, COLOR_PAIR(YELLOW)); 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)); wattron(win, COLOR_PAIR(RED));
wprintw(win, " x", line->msg); wprintw(win, " x", line->msg);
wattroff(win, COLOR_PAIR(RED)); wattroff(win, COLOR_PAIR(RED));
@ -342,9 +348,9 @@ void line_info_print(ToxWindow *self)
break; break;
case SYS_MSG: case SYS_MSG:
if (line->timestamp[0]) { if (line->timestr[0]) {
wattron(win, COLOR_PAIR(BLUE)); wattron(win, COLOR_PAIR(BLUE));
wprintw(win, "%s", line->timestamp); wprintw(win, "%s", line->timestr);
wattroff(win, COLOR_PAIR(BLUE)); wattroff(win, COLOR_PAIR(BLUE));
} }
@ -377,7 +383,7 @@ void line_info_print(ToxWindow *self)
case CONNECTION: case CONNECTION:
wattron(win, COLOR_PAIR(BLUE)); wattron(win, COLOR_PAIR(BLUE));
wprintw(win, "%s", line->timestamp); wprintw(win, "%s", line->timestr);
wattroff(win, COLOR_PAIR(BLUE)); wattroff(win, COLOR_PAIR(BLUE));
wattron(win, COLOR_PAIR(line->colour)); wattron(win, COLOR_PAIR(line->colour));
@ -391,7 +397,7 @@ void line_info_print(ToxWindow *self)
case NAME_CHANGE: case NAME_CHANGE:
wattron(win, COLOR_PAIR(BLUE)); wattron(win, COLOR_PAIR(BLUE));
wprintw(win, "%s", line->timestamp); wprintw(win, "%s", line->timestr);
wattroff(win, COLOR_PAIR(BLUE)); wattroff(win, COLOR_PAIR(BLUE));
wattron(win, COLOR_PAIR(MAGENTA)); wattron(win, COLOR_PAIR(MAGENTA));

View File

@ -45,10 +45,11 @@ enum {
} LINE_TYPE; } LINE_TYPE;
struct line_info { struct line_info {
char timestamp[TIME_STR_SIZE]; char timestr[TIME_STR_SIZE];
char name1[TOXIC_MAX_NAME_LENGTH]; char name1[TOXIC_MAX_NAME_LENGTH];
char name2[TOXIC_MAX_NAME_LENGTH]; char name2[TOXIC_MAX_NAME_LENGTH];
char msg[TOX_MAX_MESSAGE_LENGTH]; char msg[TOX_MAX_MESSAGE_LENGTH];
uint64_t timestamp;
uint8_t type; uint8_t type;
uint8_t bold; uint8_t bold;
uint8_t colour; uint8_t colour;
@ -73,7 +74,7 @@ struct history {
/* creates new line_info line and puts it in the queue. /* creates new line_info line and puts it in the queue.
SYS_MSG lines may contain an arbitrary number of arguments for string formatting */ 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, ...); uint8_t colour, const char *msg, ...);
/* Prints a section of history starting at line_start */ /* Prints a section of history starting at line_start */

View File

@ -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->type = type;
new_m->line_id = line_id; new_m->line_id = line_id;
if (q->root == NULL) { if (q->root == NULL)
new_m->prev = NULL;
q->root = new_m; q->root = new_m;
} else { else
new_m->prev = q->end;
q->end->next = new_m; q->end->next = new_m;
}
q->end = 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) 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) { if (root->receipt != receipt)
struct cqueue_msg *next = q_msg->next; 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;
cqueue_mark_read(self, root->line_id, root->type);
struct cqueue_msg *next = root->next;
free(q->root); free(q->root);
q->root = next; q->root = next;
} else {
q_msg->prev->next = next;
free(q_msg);
}
cqueue_mark_read(self, line_id, type);
return;
}
q_msg = next;
}
} }
#define CQUEUE_TRY_SEND_INTERVAL 5
/* Tries to send oldest message in queue. If fails, tries again in 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) void cqueue_try_send(ToxWindow *self, Tox *m)
{ {

View File

@ -20,6 +20,8 @@
* *
*/ */
#define CQUEUE_TRY_SEND_INTERVAL 5
struct cqueue_msg { struct cqueue_msg {
char message[MAX_STR_SIZE]; char message[MAX_STR_SIZE];
int len; int len;
@ -27,7 +29,6 @@ struct cqueue_msg {
uint8_t type; uint8_t type;
uint32_t receipt; uint32_t receipt;
uint64_t last_send_try; uint64_t last_send_try;
struct cqueue_msg *prev;
struct cqueue_msg *next; struct cqueue_msg *next;
}; };
@ -40,8 +41,9 @@ struct chat_queue {
void cqueue_cleanup(struct chat_queue *q); 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); 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); 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); void cqueue_remove(ToxWindow *self, struct chat_queue *q, uint32_t receipt);