From 33e16fe870f4d4f5852620a90a4c0a198cdfddd0 Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Thu, 6 Mar 2014 19:39:57 -0500 Subject: [PATCH 1/4] small optimization --- src/chat.c | 2 ++ src/chat_commands.c | 2 +- src/friendlist.c | 8 +++---- src/global_commands.c | 2 +- src/toxic_windows.h | 2 +- src/windows.c | 49 ++++++++++++++++++++----------------------- 6 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/chat.c b/src/chat.c index c165f84..ff9137d 100644 --- a/src/chat.c +++ b/src/chat.c @@ -296,7 +296,9 @@ static void chat_onFileData(ToxWindow *self, Tox *m, int num, uint8_t filenum, u wattron(ctx->history, COLOR_PAIR(RED)); wprintw(ctx->history, "* Error writing to file.\n"); wattroff(ctx->history, COLOR_PAIR(RED)); + tox_file_send_control(m, num, 1, filenum, TOX_FILECONTROL_KILL, 0, 0); + chat_close_file_receiver(num, filenum); } } diff --git a/src/chat_commands.c b/src/chat_commands.c index f69e081..cd37086 100644 --- a/src/chat_commands.c +++ b/src/chat_commands.c @@ -90,7 +90,7 @@ void cmd_groupinvite(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*a void cmd_join_group(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { - if (num_active_windows() >= MAX_WINDOWS_NUM) { + if (get_num_active_windows() >= MAX_WINDOWS_NUM) { wattron(window, COLOR_PAIR(RED)); wprintw(window, " * Warning: Too many windows are open.\n"); wattron(window, COLOR_PAIR(RED)); diff --git a/src/friendlist.c b/src/friendlist.c index 13059be..b220a93 100644 --- a/src/friendlist.c +++ b/src/friendlist.c @@ -77,7 +77,7 @@ static void friendlist_onMessage(ToxWindow *self, Tox *m, int num, uint8_t *str, return; if (friends[num].chatwin == -1) { - if (num_active_windows() < MAX_WINDOWS_NUM) { + if (get_num_active_windows() < MAX_WINDOWS_NUM) { friends[num].chatwin = add_window(m, new_chat(m, friends[num].num)); } else { uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'}; @@ -178,7 +178,7 @@ static void friendlist_onFileSendRequest(ToxWindow *self, Tox *m, int num, uint8 return; if (friends[num].chatwin == -1) { - if (num_active_windows() < MAX_WINDOWS_NUM) { + if (get_num_active_windows() < MAX_WINDOWS_NUM) { friends[num].chatwin = add_window(m, new_chat(m, friends[num].num)); } else { tox_file_send_control(m, num, 1, filenum, TOX_FILECONTROL_KILL, 0, 0); @@ -203,7 +203,7 @@ static void friendlist_onGroupInvite(ToxWindow *self, Tox *m, int num, uint8_t * return; if (friends[num].chatwin == -1) { - if (num_active_windows() < MAX_WINDOWS_NUM) { + if (get_num_active_windows() < MAX_WINDOWS_NUM) { friends[num].chatwin = add_window(m, new_chat(m, friends[num].num)); } else { uint8_t nick[TOX_MAX_NAME_LENGTH] = {'\0'}; @@ -264,7 +264,7 @@ static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key) /* Jump to chat window if already open */ if (friends[f].chatwin != -1) { set_active_window(friends[f].chatwin); - } else if (num_active_windows() < MAX_WINDOWS_NUM) { + } else if (get_num_active_windows() < MAX_WINDOWS_NUM) { friends[f].chatwin = add_window(m, new_chat(m, friends[f].num)); set_active_window(friends[f].chatwin); } else { diff --git a/src/global_commands.c b/src/global_commands.c index 80a2978..1babf81 100644 --- a/src/global_commands.c +++ b/src/global_commands.c @@ -197,7 +197,7 @@ void cmd_connect(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv) void cmd_groupchat(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { - if (num_active_windows() >= MAX_WINDOWS_NUM) { + if (get_num_active_windows() >= MAX_WINDOWS_NUM) { wattron(window, COLOR_PAIR(RED)); wprintw(window, " * Warning: Too many windows are open.\n"); wattron(window, COLOR_PAIR(RED)); diff --git a/src/toxic_windows.h b/src/toxic_windows.h index 1e10a7b..ee2e9f3 100644 --- a/src/toxic_windows.h +++ b/src/toxic_windows.h @@ -234,7 +234,7 @@ void draw_active_window(Tox *m); int add_window(Tox *m, ToxWindow w); void del_window(ToxWindow *w); void set_active_window(int ch); -int num_active_windows(void); +int get_num_active_windows(void); /* cleans up all chat and groupchat windows (should only be called on shutdown) */ void kill_all_windows(void); diff --git a/src/windows.c b/src/windows.c index e5dd40f..ff6202c 100644 --- a/src/windows.c +++ b/src/windows.c @@ -39,12 +39,14 @@ static ToxWindow *active_window; extern ToxWindow *prompt; +static int num_active_windows; + /* CALLBACKS START */ void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void *userdata) { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onFriendRequest != NULL) windows[i].onFriendRequest(&windows[i], public_key, data, length); } @@ -54,7 +56,7 @@ void on_connectionchange(Tox *m, int friendnumber, uint8_t status, void *userdat { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onConnectionChange != NULL) windows[i].onConnectionChange(&windows[i], m, friendnumber, status); } @@ -64,7 +66,7 @@ void on_typing_change(Tox *m, int friendnumber, int is_typing, void *userdata) { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onTypingChange != NULL) windows[i].onTypingChange(&windows[i], m, friendnumber, is_typing); } @@ -74,7 +76,7 @@ void on_message(Tox *m, int friendnumber, uint8_t *string, uint16_t length, void { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onMessage != NULL) windows[i].onMessage(&windows[i], m, friendnumber, string, length); } @@ -84,7 +86,7 @@ void on_action(Tox *m, int friendnumber, uint8_t *string, uint16_t length, void { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onAction != NULL) windows[i].onAction(&windows[i], m, friendnumber, string, length); } @@ -97,7 +99,7 @@ void on_nickchange(Tox *m, int friendnumber, uint8_t *string, uint16_t length, v int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onNickChange != NULL) windows[i].onNickChange(&windows[i], m, friendnumber, string, length); } @@ -110,7 +112,7 @@ void on_statusmessagechange(Tox *m, int friendnumber, uint8_t *string, uint16_t { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onStatusMessageChange != NULL) windows[i].onStatusMessageChange(&windows[i], friendnumber, string, length); } @@ -120,7 +122,7 @@ void on_statuschange(Tox *m, int friendnumber, TOX_USERSTATUS status, void *user { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onStatusChange != NULL) windows[i].onStatusChange(&windows[i], m, friendnumber, status); } @@ -130,7 +132,7 @@ void on_friendadded(Tox *m, int friendnumber, bool sort) { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onFriendAdded != NULL) windows[i].onFriendAdded(&windows[i], m, friendnumber, sort); } @@ -144,7 +146,7 @@ void on_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *message, { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onGroupMessage != NULL) windows[i].onGroupMessage(&windows[i], m, groupnumber, peernumber, message, length); } @@ -155,7 +157,7 @@ void on_groupaction(Tox *m, int groupnumber, int peernumber, uint8_t *action, ui { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onGroupAction != NULL) windows[i].onGroupAction(&windows[i], m, groupnumber, peernumber, action, length); } @@ -165,7 +167,7 @@ void on_groupinvite(Tox *m, int friendnumber, uint8_t *group_pub_key, void *user { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onGroupInvite != NULL) windows[i].onGroupInvite(&windows[i], m, friendnumber, group_pub_key); } @@ -175,7 +177,7 @@ void on_group_namelistchange(Tox *m, int groupnumber, int peernumber, uint8_t ch { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onGroupNamelistChange != NULL) windows[i].onGroupNamelistChange(&windows[i], m, groupnumber, peernumber, change); } @@ -186,7 +188,7 @@ void on_file_sendrequest(Tox *m, int friendnumber, uint8_t filenumber, uint64_t { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onFileSendRequest != NULL) windows[i].onFileSendRequest(&windows[i], m, friendnumber, filenumber, filesize, filename, filename_length); @@ -198,7 +200,7 @@ void on_file_control (Tox *m, int friendnumber, uint8_t receive_send, uint8_t fi { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onFileControl != NULL) windows[i].onFileControl(&windows[i], m, friendnumber, receive_send, filenumber, control_type, data, length); @@ -210,7 +212,7 @@ void on_file_data(Tox *m, int friendnumber, uint8_t filenumber, uint8_t *data, u { int i; - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + for (i = 0; i < num_active_windows; ++i) { if (windows[i].onFileData != NULL) windows[i].onFileData(&windows[i], m, friendnumber, filenumber, data, length); } @@ -240,6 +242,8 @@ int add_window(Tox *m, ToxWindow w) windows[i] = w; w.onInit(&w, m); + ++num_active_windows; + return i; } @@ -256,6 +260,7 @@ void del_window(ToxWindow *w) clear(); refresh(); + --num_active_windows; } /* Shows next window when tab or back-tab is pressed */ @@ -398,17 +403,9 @@ void draw_active_window(Tox *m) a->onKey(a, m, ch); } -int num_active_windows(void) +int get_num_active_windows(void) { - int count = 0; - int i; - - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { - if (windows[i].active) - ++count; - } - - return count; + return num_active_windows; } /* destroys all chat and groupchat windows (should only be called on shutdown) */ From fe0641e981d2f656f4d8fd844ea55bac7929c9f6 Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Sat, 8 Mar 2014 23:57:21 -0500 Subject: [PATCH 2/4] add popup alert on friend delete --- src/friendlist.c | 59 ++++++++++++++++++++++++++++++++++++++++++--- src/friendlist.h | 5 ++++ src/misc_tools.c | 2 +- src/toxic_windows.h | 2 ++ src/windows.c | 12 ++++++--- 5 files changed, 73 insertions(+), 7 deletions(-) diff --git a/src/friendlist.c b/src/friendlist.c index b220a93..4fcc476 100644 --- a/src/friendlist.c +++ b/src/friendlist.c @@ -44,6 +44,8 @@ static int num_friends = 0; ToxicFriend friends[MAX_FRIENDS_NUM]; static int friendlist_index[MAX_FRIENDS_NUM] = {0}; +static PendingDel pendingdelete; + #define S_WEIGHT 100 static int index_name_cmp(const void *n1, const void *n2) @@ -230,7 +232,7 @@ static void select_friend(ToxWindow *self, Tox *m, wint_t key) } } -static void delete_friend(Tox *m, ToxWindow *self, int f_num, wint_t key) +static void delete_friend(Tox *m, int f_num) { tox_del_friend(m, f_num); memset(&friends[f_num], 0, sizeof(ToxicFriend)); @@ -253,6 +255,48 @@ static void delete_friend(Tox *m, ToxWindow *self, int f_num, wint_t key) store_data(m, DATA_FILE); } +/* activates delete friend popup */ +static void del_friend_activate(ToxWindow *self, Tox *m, int f_num) +{ + int x2, y2; + getmaxyx(self->window, y2, x2); + self->popup = newwin(3, 22 + TOXIC_MAX_NAME_LENGTH, 8, 8); + + wattron(self->popup, A_BOLD); + box(self->popup, ACS_VLINE, ACS_HLINE); + wattroff(self->popup, A_BOLD); + + pendingdelete.active = true; + pendingdelete.num = f_num; +} + +/* deactivates delete friend popup and deletes friend if instructed */ +static void del_friend_deactivate(ToxWindow *self, Tox *m, wint_t key) +{ + if (key == 'y') + delete_friend(m, pendingdelete.num); + + memset(&pendingdelete, 0, sizeof(PendingDel)); + delwin(self->popup); + self->popup = NULL; + clear(); + refresh(); +} + +static void friendlist_onPopup(ToxWindow *self, Tox *m) +{ + if (self->popup == NULL) + return; + + wmove(self->popup, 1, 1); + wprintw(self->popup, "Delete contact "); + wattron(self->popup, A_BOLD); + wprintw(self->popup, "%s", friends[pendingdelete.num].name); + wattroff(self->popup, A_BOLD); + wprintw(self->popup, "? y/n"); + wrefresh(self->popup); +} + static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key) { if (num_friends == 0) @@ -260,6 +304,14 @@ static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key) int f = friendlist_index[num_selected]; + /* lock screen and force decision on deletion popup */ + if (pendingdelete.active) { + if (key == 'y' || key == 'n') + del_friend_deactivate(self, m, key); + + return; + } + if (key == '\n') { /* Jump to chat window if already open */ if (friends[f].chatwin != -1) { @@ -276,7 +328,7 @@ static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key) alert_window(prompt, WINDOW_ALERT_1, true); } } else if (key == KEY_DC) { - delete_friend(m, self, f, key); + del_friend_activate(self, m, f); } else { select_friend(self, m, key); } @@ -306,7 +358,7 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) wattroff(self->window, COLOR_PAIR(CYAN)); wattron(self->window, A_BOLD); - wprintw(self->window, " Friends: %d/%d \n\n", tox_get_num_online_friends(m), num_friends); + wprintw(self->window, " Online: %d/%d \n\n", tox_get_num_online_friends(m), num_friends); wattroff(self->window, A_BOLD); if ((y2 - FLIST_OFST) <= 0) /* don't allow division by zero */ @@ -421,6 +473,7 @@ ToxWindow new_friendlist(void) ret.active = true; ret.onKey = &friendlist_onKey; + ret.onPopup = &friendlist_onPopup; ret.onDraw = &friendlist_onDraw; ret.onInit = &friendlist_onInit; ret.onFriendAdded = &friendlist_onFriendAdded; diff --git a/src/friendlist.h b/src/friendlist.h index 23a3565..75af609 100644 --- a/src/friendlist.h +++ b/src/friendlist.h @@ -42,6 +42,11 @@ typedef struct { struct FileReceiver file_receiver; } ToxicFriend; +typedef struct { + int num; + bool active; +} PendingDel; + ToxWindow new_friendlist(void); void disable_chatwin(int f_num); int get_friendnum(uint8_t *name); diff --git a/src/misc_tools.c b/src/misc_tools.c index be41bc1..4430a35 100644 --- a/src/misc_tools.c +++ b/src/misc_tools.c @@ -105,7 +105,7 @@ int wcs_to_mbs_buf(uint8_t *buf, const wchar_t *string, size_t n) return len; } -/* convert wide characters to multibyte string: string returned must be free'd */ +/* convert wide characters to multibyte string: string returned must be freed */ uint8_t *wcs_to_mbs(wchar_t *string) { uint8_t *ret = NULL; diff --git a/src/toxic_windows.h b/src/toxic_windows.h index ee2e9f3..6242b9c 100644 --- a/src/toxic_windows.h +++ b/src/toxic_windows.h @@ -88,6 +88,7 @@ typedef struct ChatContext ChatContext; struct ToxWindow { void(*onKey)(ToxWindow *, Tox *, wint_t); void(*onDraw)(ToxWindow *, Tox *); + void(*onPopup)(ToxWindow *, Tox*); void(*onInit)(ToxWindow *, Tox *); void(*onFriendRequest)(ToxWindow *, uint8_t *, uint8_t *, uint16_t); void(*onFriendAdded)(ToxWindow *, Tox *, int, bool); @@ -124,6 +125,7 @@ struct ToxWindow { PromptBuf *promptbuf; StatusBar *stb; + WINDOW *popup; WINDOW *window; }; diff --git a/src/windows.c b/src/windows.c index ff6202c..ccbbf12 100644 --- a/src/windows.c +++ b/src/windows.c @@ -387,8 +387,14 @@ void draw_active_window(Tox *m) wresize(a->window, LINES - 2, COLS); #endif - a->onDraw(a, m); - wrefresh(a->window); + /* ignore main window if popup is active */ + if (a->popup) { + a->onPopup(a, m); + wrefresh(a->popup); + } else { + a->onDraw(a, m); + wrefresh(a->window); + } /* Handle input */ #ifdef HAVE_WIDECHAR @@ -397,7 +403,7 @@ void draw_active_window(Tox *m) ch = getch(); #endif - if (ch == T_KEY_NEXT || ch == T_KEY_PREV) + if ((ch == T_KEY_NEXT || ch == T_KEY_PREV) && !a->popup) /* lock window if active popup */ set_next_window((int) ch); else if (ch != ERR) a->onKey(a, m, ch); From d08feb2cc5e86a7f469b15b1a02410e24ef68b95 Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Sun, 9 Mar 2014 01:02:54 -0500 Subject: [PATCH 3/4] simplify popup drawing --- src/friendlist.c | 13 +++++++------ src/toxic_windows.h | 1 - src/windows.c | 12 +++--------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/friendlist.c b/src/friendlist.c index 4fcc476..c4a8cf5 100644 --- a/src/friendlist.c +++ b/src/friendlist.c @@ -262,10 +262,6 @@ static void del_friend_activate(ToxWindow *self, Tox *m, int f_num) getmaxyx(self->window, y2, x2); self->popup = newwin(3, 22 + TOXIC_MAX_NAME_LENGTH, 8, 8); - wattron(self->popup, A_BOLD); - box(self->popup, ACS_VLINE, ACS_HLINE); - wattroff(self->popup, A_BOLD); - pendingdelete.active = true; pendingdelete.num = f_num; } @@ -283,17 +279,22 @@ static void del_friend_deactivate(ToxWindow *self, Tox *m, wint_t key) refresh(); } -static void friendlist_onPopup(ToxWindow *self, Tox *m) +static void draw_popup(ToxWindow *self, Tox *m) { if (self->popup == NULL) return; + wattron(self->popup, A_BOLD); + box(self->popup, ACS_VLINE, ACS_HLINE); + wattroff(self->popup, A_BOLD); + wmove(self->popup, 1, 1); wprintw(self->popup, "Delete contact "); wattron(self->popup, A_BOLD); wprintw(self->popup, "%s", friends[pendingdelete.num].name); wattroff(self->popup, A_BOLD); wprintw(self->popup, "? y/n"); + wrefresh(self->popup); } @@ -453,6 +454,7 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) self->x = x2; wrefresh(self->window); + draw_popup(self, m); } void disable_chatwin(int f_num) @@ -473,7 +475,6 @@ ToxWindow new_friendlist(void) ret.active = true; ret.onKey = &friendlist_onKey; - ret.onPopup = &friendlist_onPopup; ret.onDraw = &friendlist_onDraw; ret.onInit = &friendlist_onInit; ret.onFriendAdded = &friendlist_onFriendAdded; diff --git a/src/toxic_windows.h b/src/toxic_windows.h index 6242b9c..8759966 100644 --- a/src/toxic_windows.h +++ b/src/toxic_windows.h @@ -88,7 +88,6 @@ typedef struct ChatContext ChatContext; struct ToxWindow { void(*onKey)(ToxWindow *, Tox *, wint_t); void(*onDraw)(ToxWindow *, Tox *); - void(*onPopup)(ToxWindow *, Tox*); void(*onInit)(ToxWindow *, Tox *); void(*onFriendRequest)(ToxWindow *, uint8_t *, uint8_t *, uint16_t); void(*onFriendAdded)(ToxWindow *, Tox *, int, bool); diff --git a/src/windows.c b/src/windows.c index ccbbf12..ff6202c 100644 --- a/src/windows.c +++ b/src/windows.c @@ -387,14 +387,8 @@ void draw_active_window(Tox *m) wresize(a->window, LINES - 2, COLS); #endif - /* ignore main window if popup is active */ - if (a->popup) { - a->onPopup(a, m); - wrefresh(a->popup); - } else { - a->onDraw(a, m); - wrefresh(a->window); - } + a->onDraw(a, m); + wrefresh(a->window); /* Handle input */ #ifdef HAVE_WIDECHAR @@ -403,7 +397,7 @@ void draw_active_window(Tox *m) ch = getch(); #endif - if ((ch == T_KEY_NEXT || ch == T_KEY_PREV) && !a->popup) /* lock window if active popup */ + if (ch == T_KEY_NEXT || ch == T_KEY_PREV) set_next_window((int) ch); else if (ch != ERR) a->onKey(a, m, ch); From e8cd1417b75b9f9648f71d820a19b346b77878e3 Mon Sep 17 00:00:00 2001 From: Jman012 Date: Sat, 8 Mar 2014 23:42:37 -0800 Subject: [PATCH 4/4] Fixed clang error, disabling the execute module. --- src/misc_tools.c | 4 ++-- src/misc_tools.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/misc_tools.c b/src/misc_tools.c index 4430a35..a3dc418 100644 --- a/src/misc_tools.c +++ b/src/misc_tools.c @@ -70,8 +70,8 @@ void print_time(WINDOW *window) wattroff(window,COLOR_PAIR(BLUE)); } -/* Returns true if the string is empty, false otherwise */ -bool string_is_empty(char *string) +/* Returns 1 if the string is empty, 0 otherwise */ +int string_is_empty(char *string) { return string[0] == '\0'; } diff --git a/src/misc_tools.h b/src/misc_tools.h index af264b9..4d711e9 100644 --- a/src/misc_tools.h +++ b/src/misc_tools.h @@ -32,8 +32,8 @@ struct tm *get_time(void); /* Prints the time to given window */ void print_time(WINDOW *window); -/* Returns true if the string is empty, false otherwise */ -bool string_is_empty(char *string); +/* Returns 1 if the string is empty, 0 otherwise */ +int string_is_empty(char *string); /* convert a multibyte string to a wide character string (must provide buffer) */ int char_to_wcs_buf(wchar_t *buf, const uint8_t *string, size_t n);