1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-07-01 19:57:47 +02:00

made statusmessages resize dynamically according to window size

This commit is contained in:
Jfreegman 2013-09-13 02:02:49 -04:00
parent 863121273e
commit b7375fb2a1
5 changed files with 58 additions and 36 deletions

View File

@ -44,7 +44,7 @@ static void chat_onMessage(ToxWindow *self, Tox *m, int num, uint8_t *msg, uint1
if (self->friendnum != num) if (self->friendnum != num)
return; return;
ChatContext *ctx = (ChatContext *) self->x; ChatContext *ctx = (ChatContext *) self->chatwin;
struct tm *timeinfo = get_time(); struct tm *timeinfo = get_time();
@ -68,7 +68,7 @@ void chat_onConnectionChange(ToxWindow *self, Tox *m, int num, uint8_t status)
if (self->friendnum != num) if (self->friendnum != num)
return; return;
StatusBar *statusbar = (StatusBar *) self->s; StatusBar *statusbar = (StatusBar *) self->stb;
statusbar->is_online = status == 1 ? true : false; statusbar->is_online = status == 1 ? true : false;
} }
@ -77,7 +77,7 @@ static void chat_onAction(ToxWindow *self, Tox *m, int num, uint8_t *action, uin
if (self->friendnum != num) if (self->friendnum != num)
return; return;
ChatContext *ctx = (ChatContext *) self->x; ChatContext *ctx = (ChatContext *) self->chatwin;
struct tm *timeinfo = get_time(); struct tm *timeinfo = get_time();
uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'}; uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'};
@ -108,7 +108,7 @@ static void chat_onStatusChange(ToxWindow *self, Tox *m, int num, TOX_USERSTATUS
if (self->friendnum != num) if (self->friendnum != num)
return; return;
StatusBar *statusbar = (StatusBar *) self->s; StatusBar *statusbar = (StatusBar *) self->stb;
statusbar->status = status; statusbar->status = status;
} }
@ -117,7 +117,7 @@ static void chat_onStatusMessageChange(ToxWindow *self, int num, uint8_t *status
if (self->friendnum != num) if (self->friendnum != num)
return; return;
StatusBar *statusbar = (StatusBar *) self->s; StatusBar *statusbar = (StatusBar *) self->stb;
statusbar->statusmsg_len = len; statusbar->statusmsg_len = len;
snprintf(statusbar->statusmsg, len, "%s", status); snprintf(statusbar->statusmsg, len, "%s", status);
} }
@ -349,8 +349,8 @@ static void execute(ToxWindow *self, ChatContext *ctx, StatusBar *statusbar, Tox
static void chat_onKey(ToxWindow *self, Tox *m, wint_t key) static void chat_onKey(ToxWindow *self, Tox *m, wint_t key)
{ {
ChatContext *ctx = (ChatContext *) self->x; ChatContext *ctx = (ChatContext *) self->chatwin;
StatusBar *statusbar = (StatusBar *) self->s; StatusBar *statusbar = (StatusBar *) self->stb;
struct tm *timeinfo = get_time(); struct tm *timeinfo = get_time();
@ -442,10 +442,10 @@ static void chat_onDraw(ToxWindow *self, Tox *m)
int x, y; int x, y;
getmaxyx(self->window, y, x); getmaxyx(self->window, y, x);
ChatContext *ctx = (ChatContext *) self->x; ChatContext *ctx = (ChatContext *) self->chatwin;
/* Draw status bar */ /* Draw status bar */
StatusBar *statusbar = (StatusBar *) self->s; StatusBar *statusbar = (StatusBar *) self->stb;
mvwhline(statusbar->topline, 1, 0, '-', x); mvwhline(statusbar->topline, 1, 0, '-', x);
wmove(statusbar->topline, 0, 0); wmove(statusbar->topline, 0, 0);
@ -477,7 +477,6 @@ static void chat_onDraw(ToxWindow *self, Tox *m)
wattron(statusbar->topline, COLOR_PAIR(colour) | A_BOLD); wattron(statusbar->topline, COLOR_PAIR(colour) | A_BOLD);
wprintw(statusbar->topline, "[%s]", status_text); wprintw(statusbar->topline, "[%s]", status_text);
wattroff(statusbar->topline, COLOR_PAIR(colour) | A_BOLD); wattroff(statusbar->topline, COLOR_PAIR(colour) | A_BOLD);
} else { } else {
wattron(statusbar->topline, A_BOLD); wattron(statusbar->topline, A_BOLD);
wprintw(statusbar->topline, " %s ", self->name); wprintw(statusbar->topline, " %s ", self->name);
@ -485,19 +484,30 @@ static void chat_onDraw(ToxWindow *self, Tox *m)
wprintw(statusbar->topline, "[Offline]"); wprintw(statusbar->topline, "[Offline]");
} }
/* Reset statusbar->statusmsg on window resize */
if (x != self->x) {
uint8_t statusmsg[TOX_MAX_STATUSMESSAGE_LENGTH] = {'\0'};
tox_copy_statusmessage(m, self->friendnum, statusmsg, TOX_MAX_STATUSMESSAGE_LENGTH);
snprintf(statusbar->statusmsg, sizeof(statusbar->statusmsg), "%s", statusmsg);
statusbar->statusmsg_len = tox_get_statusmessage_size(m, self->friendnum);
}
self->x = x;
/* Truncate note if it doesn't fit in statusbar */ /* Truncate note if it doesn't fit in statusbar */
uint16_t maxlen = x - getcurx(statusbar->topline) - 5; uint16_t maxlen = x - getcurx(statusbar->topline) - 6;
if (statusbar->statusmsg_len > maxlen) { if (statusbar->statusmsg_len > maxlen) {
statusbar->statusmsg[maxlen] = '\0'; statusbar->statusmsg[maxlen] = '\0';
statusbar->statusmsg_len = maxlen; statusbar->statusmsg_len = maxlen;
} }
wattron(statusbar->topline, A_BOLD); if (statusbar->statusmsg[0]) {
wprintw(statusbar->topline, " | %s |", statusbar->statusmsg); wattron(statusbar->topline, A_BOLD);
wattroff(statusbar->topline, A_BOLD); wprintw(statusbar->topline, " | %s | ", statusbar->statusmsg);
wattroff(statusbar->topline, A_BOLD);
}
wprintw(statusbar->topline, "\n"); wprintw(statusbar->topline, "\n");
mvwhline(ctx->linewin, 0, 0, '_', x); mvwhline(ctx->linewin, 0, 0, '_', x);
wrefresh(self->window); wrefresh(self->window);
} }
@ -506,9 +516,10 @@ static void chat_onInit(ToxWindow *self, Tox *m)
{ {
int x, y; int x, y;
getmaxyx(self->window, y, x); getmaxyx(self->window, y, x);
self->x = x;
/* Init statusbar info */ /* Init statusbar info */
StatusBar *statusbar = (StatusBar *) self->s; StatusBar *statusbar = (StatusBar *) self->stb;
statusbar->status = tox_get_userstatus(m, self->friendnum); statusbar->status = tox_get_userstatus(m, self->friendnum);
statusbar->is_online = tox_get_friend_connectionstatus(m, self->friendnum) == 1; statusbar->is_online = tox_get_friend_connectionstatus(m, self->friendnum) == 1;
@ -518,7 +529,7 @@ static void chat_onInit(ToxWindow *self, Tox *m)
statusbar->statusmsg_len = tox_get_statusmessage_size(m, self->friendnum); statusbar->statusmsg_len = tox_get_statusmessage_size(m, self->friendnum);
/* Init subwindows */ /* Init subwindows */
ChatContext *ctx = (ChatContext *) self->x; ChatContext *ctx = (ChatContext *) self->chatwin;
statusbar->topline = subwin(self->window, 2, x, 0, 0); statusbar->topline = subwin(self->window, 2, x, 0, 0);
ctx->history = subwin(self->window, y-3, x, 0, 0); ctx->history = subwin(self->window, y-3, x, 0, 0);
scrollok(ctx->history, 1); scrollok(ctx->history, 1);
@ -547,12 +558,12 @@ ToxWindow new_chat(Tox *m, ToxWindow *prompt, int friendnum)
tox_getname(m, friendnum, name); tox_getname(m, friendnum, name);
snprintf(ret.name, sizeof(ret.name), "%s", name); snprintf(ret.name, sizeof(ret.name), "%s", name);
ChatContext *x = calloc(1, sizeof(ChatContext)); ChatContext *chatwin = calloc(1, sizeof(ChatContext));
StatusBar *s = calloc(1, sizeof(StatusBar)); StatusBar *stb = calloc(1, sizeof(StatusBar));
if (s != NULL && x != NULL) { if (stb != NULL && chatwin != NULL) {
ret.x = x; ret.chatwin = chatwin;
ret.s = s; ret.stb = stb;
} else { } else {
endwin(); endwin();
fprintf(stderr, "calloc() failed. Aborting...\n"); fprintf(stderr, "calloc() failed. Aborting...\n");

View File

@ -219,11 +219,21 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m)
wattroff(self->window, COLOR_PAIR(colour) | A_BOLD); wattroff(self->window, COLOR_PAIR(colour) | A_BOLD);
wprintw(self->window, "]%s (", friends[i].name); wprintw(self->window, "]%s (", friends[i].name);
/* Truncate note if it doesn't fit on one line */
int x, y; int x, y;
getmaxyx(self->window, y, x); getmaxyx(self->window, y, x);
uint16_t maxlen = x - getcurx(self->window) - 2;
/* Reset friends[i].statusmsg on window resize */
if (x != self->x) {
uint8_t statusmsg[TOX_MAX_STATUSMESSAGE_LENGTH] = {'\0'};
tox_copy_statusmessage(m, friends[i].num, statusmsg, TOX_MAX_STATUSMESSAGE_LENGTH);
snprintf(friends[i].statusmsg, sizeof(friends[i].statusmsg), "%s", statusmsg);
friends[i].statusmsg_len = tox_get_statusmessage_size(m, self->friendnum);
}
self->x = x;
/* Truncate note if it doesn't fit on one line */
uint16_t maxlen = x - getcurx(self->window) - 2;
if (friends[i].statusmsg_len > maxlen) { if (friends[i].statusmsg_len > maxlen) {
friends[i].statusmsg[maxlen] = '\0'; friends[i].statusmsg[maxlen] = '\0';
friends[i].statusmsg_len = maxlen; friends[i].statusmsg_len = maxlen;

View File

@ -359,7 +359,7 @@ void exit_toxic(Tox *m)
store_data(m, DATA_FILE); store_data(m, DATA_FILE);
free(DATA_FILE); free(DATA_FILE);
free(SRVLIST_FILE); free(SRVLIST_FILE);
free(prompt->s); free(prompt->stb);
tox_kill(m); tox_kill(m);
endwin(); endwin();
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);

View File

@ -57,28 +57,28 @@ static struct {
/* Updates own nick in prompt statusbar */ /* Updates own nick in prompt statusbar */
void prompt_update_nick(ToxWindow *prompt, uint8_t *nick) void prompt_update_nick(ToxWindow *prompt, uint8_t *nick)
{ {
StatusBar *statusbar = (StatusBar *) prompt->s; StatusBar *statusbar = (StatusBar *) prompt->stb;
snprintf(statusbar->nick, sizeof(statusbar->nick), "%s", nick); snprintf(statusbar->nick, sizeof(statusbar->nick), "%s", nick);
} }
/* Updates own statusmessage in prompt statusbar */ /* Updates own statusmessage in prompt statusbar */
void prompt_update_statusmessage(ToxWindow *prompt, uint8_t *statusmsg) void prompt_update_statusmessage(ToxWindow *prompt, uint8_t *statusmsg)
{ {
StatusBar *statusbar = (StatusBar *) prompt->s; StatusBar *statusbar = (StatusBar *) prompt->stb;
snprintf(statusbar->statusmsg, sizeof(statusbar->statusmsg), "%s", statusmsg); snprintf(statusbar->statusmsg, sizeof(statusbar->statusmsg), "%s", statusmsg);
} }
/* Updates own status in prompt statusbar */ /* Updates own status in prompt statusbar */
void prompt_update_status(ToxWindow *prompt, TOX_USERSTATUS status) void prompt_update_status(ToxWindow *prompt, TOX_USERSTATUS status)
{ {
StatusBar *statusbar = (StatusBar *) prompt->s; StatusBar *statusbar = (StatusBar *) prompt->stb;
statusbar->status = status; statusbar->status = status;
} }
/* Updates own connection status in prompt statusbar */ /* Updates own connection status in prompt statusbar */
void prompt_update_connectionstatus(ToxWindow *prompt, bool is_connected) void prompt_update_connectionstatus(ToxWindow *prompt, bool is_connected)
{ {
StatusBar *statusbar = (StatusBar *) prompt->s; StatusBar *statusbar = (StatusBar *) prompt->stb;
statusbar->is_online = is_connected; statusbar->is_online = is_connected;
} }
@ -612,7 +612,7 @@ static void prompt_onDraw(ToxWindow *self, Tox *m)
--y; --y;
} }
StatusBar *statusbar = (StatusBar *) self->s; StatusBar *statusbar = (StatusBar *) self->stb;
werase(statusbar->topline); werase(statusbar->topline);
@ -676,7 +676,7 @@ void prompt_init_statusbar(ToxWindow *self, Tox *m)
getmaxyx(self->window, y, x); getmaxyx(self->window, y, x);
/* Init statusbar info */ /* Init statusbar info */
StatusBar *statusbar = (StatusBar *) self->s; StatusBar *statusbar = (StatusBar *) self->stb;
statusbar->status = TOX_USERSTATUS_NONE; statusbar->status = TOX_USERSTATUS_NONE;
statusbar->is_online = false; statusbar->is_online = false;
@ -703,10 +703,10 @@ ToxWindow new_prompt()
ret.onFriendRequest = &prompt_onFriendRequest; ret.onFriendRequest = &prompt_onFriendRequest;
strcpy(ret.name, "prompt"); strcpy(ret.name, "prompt");
StatusBar *s = calloc(1, sizeof(StatusBar)); StatusBar *stb = calloc(1, sizeof(StatusBar));
if (s != NULL) if (stb != NULL)
ret.s = s; ret.stb = stb;
else { else {
endwin(); endwin();
fprintf(stderr, "calloc() failed. Aborting...\n"); fprintf(stderr, "calloc() failed. Aborting...\n");

View File

@ -52,9 +52,10 @@ struct ToxWindow_ {
char name[TOX_MAX_NAME_LENGTH]; char name[TOX_MAX_NAME_LENGTH];
int friendnum; int friendnum;
int x;
void *x; void *chatwin;
void *s; void *stb;
void *prompt; void *prompt;
bool blink; bool blink;