1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-06-18 15:17:46 +02:00

properly close windows on exit

This commit is contained in:
Jfreegman 2014-02-26 05:23:11 -05:00
parent 5ff7065744
commit a61f5f6a6d
7 changed files with 77 additions and 38 deletions

View File

@ -71,6 +71,24 @@ static void set_typingstatus(ToxWindow *self, Tox *m, bool is_typing)
ctx->self_is_typing = is_typing;
}
void kill_chat_window(ToxWindow *self)
{
set_active_window(0);
ChatContext *ctx = self->chatwin;
StatusBar *statusbar = self->stb;
write_to_log(ctx);
int f_num = self->num;
delwin(ctx->linewin);
delwin(statusbar->topline);
del_window(self);
disable_chatwin(f_num);
free(ctx);
free(statusbar);
}
static void chat_onMessage(ToxWindow *self, Tox *m, int num, uint8_t *msg, uint16_t len)
{
if (self->num != num)
@ -333,7 +351,6 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key)
getyx(self->window, y, x);
getmaxyx(self->window, y2, x2);
int cur_len = 0;
bool close_win = false;
if (key == 0x107 || key == 0x8 || key == 0x7f) { /* BACKSPACE key: Remove character behind pos */
if (ctx->pos > 0) {
@ -480,17 +497,17 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key)
add_line_to_hist(ctx->line, ctx->len, ctx->ln_history, &ctx->hst_tot, &ctx->hst_pos);
if (line[0] == '/') {
if (close_win = !strcmp(line, "/close")) {
write_to_log(ctx);
int f_num = self->num;
delwin(ctx->linewin);
delwin(statusbar->topline);
del_window(self);
disable_chatwin(f_num);
} else if (strncmp(line, "/me ", strlen("/me ")) == 0)
if (strcmp(line, "/close") == 0) {
if (ctx->self_is_typing)
set_typingstatus(self, m, false);
kill_chat_window(self);
return;
} else if (strncmp(line, "/me ", strlen("/me ")) == 0) {
send_action(self, ctx, m, line + strlen("/me "));
else
} else {
execute(ctx->history, self, m, line, CHAT_COMMAND_MODE);
}
} else if (!string_is_empty(line)) {
uint8_t selfname[TOX_MAX_NAME_LENGTH];
tox_get_self_name(m, selfname, TOX_MAX_NAME_LENGTH);
@ -516,18 +533,11 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key)
}
}
if (close_win) {
free(ctx);
free(statusbar);
} else {
reset_buf(ctx->line, &ctx->pos, &ctx->len);
}
reset_buf(ctx->line, &ctx->pos, &ctx->len);
}
if (!close_win) {
if (ctx->len <= 0 && ctx->self_is_typing)
set_typingstatus(self, m, false);
}
if (ctx->len <= 0 && ctx->self_is_typing)
set_typingstatus(self, m, false);
}
static void chat_onDraw(ToxWindow *self, Tox *m)
@ -660,10 +670,8 @@ static void chat_onInit(ToxWindow *self, Tox *m)
execute(ctx->history, self, m, "/help", CHAT_COMMAND_MODE);
wmove(self->window, y2 - CURS_Y_OFFSET, 0);
if (self->name) {
ctx->log.log_on = true;
init_logging_session(self->name, friends[self->num].pub_key, ctx);
}
ctx->log.log_on = true;
init_logging_session(self->name, friends[self->num].pub_key, ctx);
}
ToxWindow new_chat(Tox *m, int friendnum)
@ -672,6 +680,7 @@ ToxWindow new_chat(Tox *m, int friendnum)
memset(&ret, 0, sizeof(ret));
ret.active = true;
ret.is_chat = true;
ret.onKey = &chat_onKey;
ret.onDraw = &chat_onDraw;

View File

@ -25,6 +25,7 @@
#include "toxic_windows.h"
void kill_chat_window(ToxWindow *self);
ToxWindow new_chat(Tox *m, int friendnum);
#endif /* end of include guard: CHAT_H_6489PZ13 */

View File

@ -71,8 +71,19 @@ int init_groupchat_win(ToxWindow *prompt, Tox *m, int groupnum)
return -1;
}
static void close_groupchatwin(Tox *m, int groupnum)
void kill_groupchat_window(ToxWindow *self)
{
ChatContext *ctx = self->chatwin;
write_to_log(ctx);
delwin(ctx->linewin);
del_window(self);
free(ctx);
}
static void close_groupchat(ToxWindow *self, Tox *m, int groupnum)
{
set_active_window(0);
tox_del_groupchat(m, groupnum);
free(groupchats[groupnum].peer_names);
@ -87,6 +98,8 @@ static void close_groupchatwin(Tox *m, int groupnum)
}
max_groupchat_index = i;
kill_groupchat_window(self);
}
static void print_groupchat_help(ChatContext *ctx)
@ -480,19 +493,14 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
wclear(ctx->linewin);
wmove(self->window, y2 - CURS_Y_OFFSET, 0);
wclrtobot(self->window);
bool close_win = false;
if (!string_is_empty(line))
add_line_to_hist(ctx->line, ctx->len, ctx->ln_history, &ctx->hst_tot, &ctx->hst_pos);
if (line[0] == '/') {
if (close_win = strcmp(line, "/close") == 0) {
write_to_log(ctx);
set_active_window(0);
int groupnum = self->num;
delwin(ctx->linewin);
del_window(self);
close_groupchatwin(m, groupnum);
if (strcmp(line, "/close") == 0) {
close_groupchat(self, m, self->num);
return;
} else if (strcmp(line, "/help") == 0)
print_groupchat_help(ctx);
else if (strncmp(line, "/me ", strlen("/me ")) == 0)
@ -507,10 +515,7 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
}
}
if (close_win)
free(ctx);
else
reset_buf(ctx->line, &ctx->pos, &ctx->len);
reset_buf(ctx->line, &ctx->pos, &ctx->len);
}
}
@ -591,6 +596,7 @@ ToxWindow new_group_chat(Tox *m, int groupnum)
memset(&ret, 0, sizeof(ret));
ret.active = true;
ret.is_groupchat = true;
ret.onKey = &groupchat_onKey;
ret.onDraw = &groupchat_onDraw;

View File

@ -33,5 +33,6 @@ typedef struct {
uint8_t groupkey[TOX_CLIENT_ID_SIZE];
} GroupChat;
void kill_groupchat_window(ToxWindow *self);
int init_groupchat_win(ToxWindow *prompt, Tox *m, int groupnum);
ToxWindow new_group_chat(Tox *m, int groupnum);

View File

@ -475,6 +475,7 @@ void exit_toxic(Tox *m)
fclose(file_senders[i].file);
}
kill_all_windows();
free(DATA_FILE);
free(SRVLIST_FILE);
free(prompt->stb);

View File

@ -109,6 +109,10 @@ struct ToxWindow {
bool active;
int x;
/* window type identifiers */
bool is_chat;
bool is_groupchat;
bool alert0;
bool alert1;
bool alert2;
@ -132,7 +136,7 @@ struct StatusBar {
};
#define MAX_LOG_BUF_LINES 10 /* write log_buf contents to log file after this many lines */
#define MAX_LOG_LINE_SIZE MAX_STR_SIZE + TOXIC_MAX_NAME_LENGTH + 24 /* extra room for time/date */
#define MAX_LOG_LINE_SIZE MAX_STR_SIZE + TOXIC_MAX_NAME_LENGTH + 24 /* extra room for timestamp */
struct chatlog {
uint8_t log_path[MAX_STR_SIZE];
@ -226,4 +230,7 @@ int add_window(Tox *m, ToxWindow w);
void del_window(ToxWindow *w);
void set_active_window(int ch);
int num_active_windows(void);
/* closes all chat and groupchat windows (should only be called on shutdown) */
void kill_all_windows(void);
#endif

View File

@ -30,6 +30,7 @@
#include "friendlist.h"
#include "prompt.h"
#include "toxic_windows.h"
#include "groupchat.h"
extern char *DATA_FILE;
@ -409,3 +410,16 @@ int num_active_windows(void)
return count;
}
/* destroys all chat and groupchat windows (should only be called on shutdown) */
void kill_all_windows(void)
{
int i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].is_chat)
kill_chat_window(&windows[i]);
else if (windows[i].is_groupchat)
kill_groupchat_window(&windows[i]);
}
}