From ce9d0660548fb33328b5e460a9c3a68a6e2f5a6a Mon Sep 17 00:00:00 2001 From: Aaron Lipinski Date: Wed, 14 Aug 2013 21:16:02 +1200 Subject: [PATCH 01/14] Have toxic handle new no-spam values from friend request --- prompt.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/prompt.c b/prompt.c index e1a7d75..b1d6693 100644 --- a/prompt.c +++ b/prompt.c @@ -138,6 +138,12 @@ void cmd_add(ToxWindow *self, Messenger *m, char **args) case FAERR_UNKNOWN: wprintw(self->window, "Undefined error when adding friend.\n"); break; + case FAERR_BADCHECKSUM: + wprintw(self->window, "Bad checksum in address.\n"); + break; + case FAERR_SETNEWNOSPAM: + wprintw(self->window, "Nospam was different.\n"); + break; default: wprintw(self->window, "Friend added as %d.\n", num); on_friendadded(num); From 4a6edcbf1e44804819883377e744f8e93dc8ac17 Mon Sep 17 00:00:00 2001 From: Astonex Date: Wed, 14 Aug 2013 11:23:38 +0100 Subject: [PATCH 02/14] Update prompt.c Make id uppercase. --- prompt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/prompt.c b/prompt.c index e1a7d75..c0169c6 100644 --- a/prompt.c +++ b/prompt.c @@ -121,6 +121,11 @@ void cmd_add(ToxWindow *self, Messenger *m, char **args) } id_bin[i] = x; } + + for (i = 0; i < FRIEND_ADDRESS_SIZE; i++) { + id[i] = toupper(id[i]); + } + int num = m_addfriend(m, id_bin, (uint8_t*) msg, strlen(msg)+1); switch (num) { case FAERR_TOOLONG: From 5d07842d96c384685b34d8abf31e2e4c8193fce6 Mon Sep 17 00:00:00 2001 From: Aaron Lipinski Date: Tue, 13 Aug 2013 09:34:46 +1200 Subject: [PATCH 03/14] prefer param over static Conflicts: testing/toxic/main.c --- friendlist.c | 6 +++--- main.c | 29 ++++++++++++++--------------- prompt.c | 6 +++--- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/friendlist.c b/friendlist.c index 56061cf..1a77440 100644 --- a/friendlist.c +++ b/friendlist.c @@ -13,7 +13,7 @@ #include "windows.h" extern char WINDOW_STATUS[TOXWINDOWS_MAX_NUM]; -extern int add_window(ToxWindow w, int n); +extern int add_window(Messenger *m, ToxWindow w, int n); extern ToxWindow new_chat(Messenger *m, int friendnum); extern int active_window; @@ -54,7 +54,7 @@ void friendlist_onMessage(ToxWindow *self, Messenger *m, int num, uint8_t *str, for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { if (WINDOW_STATUS[i] == -1) { WINDOW_STATUS[i] = num; - add_window(new_chat(m, num), i); + add_window(m, new_chat(m, num), i); active_window = i; break; } @@ -121,7 +121,7 @@ static void friendlist_onKey(ToxWindow *self, Messenger *m, int key) if (WINDOW_STATUS[i] == -1) { WINDOW_STATUS[i] = num_selected; friends[num_selected].chatwin = num_selected; - add_window(new_chat(m, num_selected), i); + add_window(m, new_chat(m, num_selected), i); active_window = i; break; } diff --git a/main.c b/main.c index 40ff5d0..8ab2d39 100644 --- a/main.c +++ b/main.c @@ -40,8 +40,6 @@ char WINDOW_STATUS[MAX_WINDOW_SLOTS]; static ToxWindow windows[MAX_WINDOW_SLOTS]; static ToxWindow* prompt; -static Messenger *m; - int w_num; int active_window; @@ -103,7 +101,7 @@ void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t l } } -void on_friendadded(int friendnumber) +void on_friendadded(Messenger *m, int friendnumber) { friendlist_onFriendAdded(m, friendnumber); } @@ -129,10 +127,10 @@ static void init_term() refresh(); } -static void init_tox() +static Messenger * init_tox() { /* Init core */ - m = initMessenger(); + Messenger *m = initMessenger(); /* Callbacks */ m_callback_friendrequest(m, on_request, NULL); @@ -147,6 +145,7 @@ static void init_tox() #else setname(m, (uint8_t*) "Hipster", sizeof("Hipster")); #endif + return m; } #define MAXLINE 90 /* Approx max number of chars in a sever line (IP + port + key) */ @@ -207,7 +206,7 @@ void init_window_status() WINDOW_STATUS[j] = -1; } -int add_window(ToxWindow w, int n) +int add_window(Messenger *m, ToxWindow w, int n) { if (w_num >= TOXWINDOWS_MAX_NUM) return -1; @@ -241,13 +240,13 @@ void del_window(ToxWindow *w, int f_num) refresh(); } -static void init_windows() +static void init_windows(Messenger *m) { w_num = 0; int n_prompt = 0; int n_friendslist = 1; - if (add_window(new_prompt(), n_prompt) == -1 - || add_window(new_friendlist(), n_friendslist) == -1) { + if (add_window(m, new_prompt(), n_prompt) == -1 + || add_window(m, new_friendlist(), n_friendslist) == -1) { fprintf(stderr, "add_window() failed.\n"); endwin(); exit(1); @@ -255,7 +254,7 @@ static void init_windows() prompt = &windows[n_prompt]; } -static void do_tox() +static void do_tox(Messenger *m) { static int conn_try = 0; static int conn_err = 0; @@ -279,7 +278,7 @@ static void do_tox() doMessenger(m); } -static void load_data(char *path) +static void load_data(Messenger *m, char *path) { FILE *fd; size_t len; @@ -451,12 +450,12 @@ int main(int argc, char *argv[]) } init_term(); - init_tox(); - init_windows(); + Messenger *m = init_tox(); + init_windows(m); init_window_status(); if(f_loadfromfile) - load_data(DATA_FILE); + load_data(m, DATA_FILE); free(DATA_FILE); if (f_flag == -1) { @@ -474,7 +473,7 @@ int main(int argc, char *argv[]) } while(true) { /* Update tox */ - do_tox(); + do_tox(m); /* Draw */ a = &windows[active_window]; diff --git a/prompt.c b/prompt.c index b1d6693..c01ed71 100644 --- a/prompt.c +++ b/prompt.c @@ -15,7 +15,7 @@ uint8_t pending_requests[MAX_STR_SIZE][CLIENT_ID_SIZE]; // XXX uint8_t num_requests=0; // XXX -extern void on_friendadded(int friendnumber); +extern void on_friendadded(Messenger *m, int friendnumber); static char prompt_buf[MAX_STR_SIZE] = {0}; static int prompt_buf_pos = 0; @@ -87,7 +87,7 @@ void cmd_accept(ToxWindow *self, Messenger *m, char **args) wprintw(self->window, "Failed to add friend.\n"); else { wprintw(self->window, "Friend accepted as: %d.\n", num); - on_friendadded(num); + on_friendadded(m, num); } } @@ -146,7 +146,7 @@ void cmd_add(ToxWindow *self, Messenger *m, char **args) break; default: wprintw(self->window, "Friend added as %d.\n", num); - on_friendadded(num); + on_friendadded(m, num); break; } } From 063523a042f7c67d5ee8a2345dc0ab1cd2115b21 Mon Sep 17 00:00:00 2001 From: Aaron Lipinski Date: Sun, 11 Aug 2013 12:58:15 +1200 Subject: [PATCH 04/14] add header guard and includes to windows.h --- windows.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/windows.h b/windows.h index 648243d..4eb55a9 100644 --- a/windows.h +++ b/windows.h @@ -1,8 +1,13 @@ /* * Toxic -- Tox Curses Client */ +#ifndef _windows_h +#define _windows_h +#include +#include #include +#include "../../core/Messenger.h" #define TOXWINDOWS_MAX_NUM 32 #define MAX_FRIENDS_NUM 100 #define MAX_STR_SIZE 256 @@ -32,3 +37,6 @@ struct ToxWindow_ { WINDOW* window; }; + +#endif + From 2c81fd5e4b91b0db42f7a21784a06f572a12aa27 Mon Sep 17 00:00:00 2001 From: Aaron Lipinski Date: Tue, 13 Aug 2013 10:50:43 +1200 Subject: [PATCH 05/14] remove externs in favor of includes --- chat.c | 10 +++---- chat.h | 7 +++++ friendlist.c | 25 ++++++++-------- friendlist.h | 14 +++++++++ main.c | 84 +++++++++++++++++++++++++--------------------------- prompt.c | 6 ++-- prompt.h | 14 +++++++++ 7 files changed, 98 insertions(+), 62 deletions(-) create mode 100644 chat.h create mode 100644 friendlist.h create mode 100644 prompt.h diff --git a/chat.c b/chat.c index 1b5e743..6811569 100644 --- a/chat.c +++ b/chat.c @@ -13,6 +13,8 @@ #include "../../core/network.h" #include "windows.h" +#include "friendlist.h" +#include "chat.h" #define CURS_Y_OFFSET 3 @@ -24,10 +26,8 @@ typedef struct { WINDOW* linewin; } ChatContext; -extern int active_window; +static delWindowFn *del_window; -extern void del_window(ToxWindow *w, int f_num); -extern void fix_name(uint8_t *name); void print_help(ChatContext *self); void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd); @@ -320,7 +320,6 @@ void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd) } else if (strcmp(ctx->line, "/close") == 0) { - active_window = 0; // Go to prompt screen int f_num = ctx->friendnum; delwin(ctx->linewin); del_window(self, f_num); @@ -371,8 +370,9 @@ void print_help(ChatContext *self) wattroff(self->history, COLOR_PAIR(2)); } -ToxWindow new_chat(Messenger *m, int friendnum) +ToxWindow new_chat(Messenger *m, int friendnum, delWindowFn *f) { + del_window = f; ToxWindow ret; memset(&ret, 0, sizeof(ret)); diff --git a/chat.h b/chat.h new file mode 100644 index 0000000..dcd5b3b --- /dev/null +++ b/chat.h @@ -0,0 +1,7 @@ +#ifndef CHAT_H_6489PZ13 +#define CHAT_H_6489PZ13 + +typedef void (delWindowFn)(ToxWindow *w, int f_num); +ToxWindow new_chat(Messenger *m, int friendnum, delWindowFn f); + +#endif /* end of include guard: CHAT_H_6489PZ13 */ diff --git a/friendlist.c b/friendlist.c index 1a77440..5b79fde 100644 --- a/friendlist.c +++ b/friendlist.c @@ -10,13 +10,12 @@ #include "../../core/Messenger.h" #include "../../core/network.h" -#include "windows.h" +#include "friendlist.h" -extern char WINDOW_STATUS[TOXWINDOWS_MAX_NUM]; -extern int add_window(Messenger *m, ToxWindow w, int n); -extern ToxWindow new_chat(Messenger *m, int friendnum); - -extern int active_window; +static delWindowFn *del_window; +static setActiveWindowFn *set_active_window; +static addWindowFn *add_window; +static char * WINDOW_STATUS; typedef struct { uint8_t name[MAX_NAME_LENGTH]; @@ -54,8 +53,7 @@ void friendlist_onMessage(ToxWindow *self, Messenger *m, int num, uint8_t *str, for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { if (WINDOW_STATUS[i] == -1) { WINDOW_STATUS[i] = num; - add_window(m, new_chat(m, num), i); - active_window = i; + add_window(m, new_chat(m, num, del_window), i); break; } } @@ -111,7 +109,7 @@ static void friendlist_onKey(ToxWindow *self, Messenger *m, int key) int i; for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { if (WINDOW_STATUS[i] == num_selected) { - active_window = i; + set_active_window(i); break; } } @@ -121,8 +119,7 @@ static void friendlist_onKey(ToxWindow *self, Messenger *m, int key) if (WINDOW_STATUS[i] == -1) { WINDOW_STATUS[i] = num_selected; friends[num_selected].chatwin = num_selected; - add_window(m, new_chat(m, num_selected), i); - active_window = i; + add_window(m, new_chat(m, num_selected, del_window), i); break; } } @@ -169,7 +166,11 @@ static void friendlist_onInit(ToxWindow *self, Messenger *m) } -ToxWindow new_friendlist() { +ToxWindow new_friendlist(delWindowFn dw, setActiveWindowFn saw, addWindowFn aw, char * ws) { + del_window = dw; + set_active_window = saw; + add_window = aw; + WINDOW_STATUS = ws; ToxWindow ret; memset(&ret, 0, sizeof(ret)); diff --git a/friendlist.h b/friendlist.h new file mode 100644 index 0000000..e8b93ae --- /dev/null +++ b/friendlist.h @@ -0,0 +1,14 @@ +#ifndef FRIENDLIST_H_53I41IM +#define FRIENDLIST_H_53I41IM + + +#include "windows.h" +#include "chat.h" +typedef void (setActiveWindowFn)(int ch); +typedef int (addWindowFn)(Messenger *m, ToxWindow w, int n); +ToxWindow new_friendlist(delWindowFn dw, setActiveWindowFn saw, addWindowFn aw, char * ws); +int friendlist_onFriendAdded(Messenger *m, int num); +void disable_chatwin(int f_num); +void fix_name(uint8_t *name); + +#endif /* end of include guard: FRIENDLIST_H_53I41IM */ diff --git a/main.c b/main.c index 8ab2d39..a109311 100644 --- a/main.c +++ b/main.c @@ -21,14 +21,9 @@ #include "configdir.h" #include "windows.h" +#include "prompt.h" +#include "friendlist.h" -extern ToxWindow new_prompt(); -extern ToxWindow new_friendlist(); - -extern int friendlist_onFriendAdded(Messenger *m, int num); -extern void disable_chatwin(int f_num); -extern int add_req(uint8_t *public_key); // XXX -extern unsigned char *hex_string_to_bin(char hex_string[]); /* Holds status of chat windows */ char WINDOW_STATUS[MAX_WINDOW_SLOTS]; @@ -221,12 +216,14 @@ int add_window(Messenger *m, ToxWindow w, int n) windows[n] = w; w.onInit(&w, m); w_num++; + active_window = n; return n; } /* Deletes window w and cleans up */ void del_window(ToxWindow *w, int f_num) { + active_window = 0; // Go to prompt screen delwin(w->window); int i; for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { @@ -240,13 +237,48 @@ void del_window(ToxWindow *w, int f_num) refresh(); } +/* Shows next window when tab or back-tab is pressed */ +void set_active_window(int ch) +{ + int f_inf = 0; + int max = MAX_WINDOW_SLOTS-1; + if (ch == '\t') { + int i = (active_window + 1) % max; + while (true) { + if (WINDOW_STATUS[i] != -1) { + active_window = i; + return; + } + i = (i + 1) % max; + if (f_inf++ > max) { // infinite loop check + endwin(); + exit(2); + } + } + }else { + int i = active_window - 1; + if (i < 0) i = max; + while (true) { + if (WINDOW_STATUS[i] != -1) { + active_window = i; + return; + } + if (--i < 0) i = max; + if (f_inf++ > max) { + endwin(); + exit(2); + } + } + } +} + static void init_windows(Messenger *m) { w_num = 0; int n_prompt = 0; int n_friendslist = 1; - if (add_window(m, new_prompt(), n_prompt) == -1 - || add_window(m, new_friendlist(), n_friendslist) == -1) { + if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1 + || add_window(m, new_friendlist(del_window, set_active_window, add_window, WINDOW_STATUS), n_friendslist) == -1) { fprintf(stderr, "add_window() failed.\n"); endwin(); exit(1); @@ -378,40 +410,6 @@ void prepare_window(WINDOW *w) wresize(w, LINES-2, COLS); } -/* Shows next window when tab or back-tab is pressed */ -void set_active_window(int ch) -{ - int f_inf = 0; - int max = MAX_WINDOW_SLOTS-1; - if (ch == '\t') { - int i = (active_window + 1) % max; - while (true) { - if (WINDOW_STATUS[i] != -1) { - active_window = i; - return; - } - i = (i + 1) % max; - if (f_inf++ > max) { // infinite loop check - endwin(); - exit(2); - } - } - }else { - int i = active_window - 1; - if (i < 0) i = max; - while (true) { - if (WINDOW_STATUS[i] != -1) { - active_window = i; - return; - } - if (--i < 0) i = max; - if (f_inf++ > max) { - endwin(); - exit(2); - } - } - } -} int main(int argc, char *argv[]) { diff --git a/prompt.c b/prompt.c index c01ed71..bc4b854 100644 --- a/prompt.c +++ b/prompt.c @@ -11,11 +11,12 @@ #include "../../core/network.h" #include "windows.h" +#include "prompt.h" uint8_t pending_requests[MAX_STR_SIZE][CLIENT_ID_SIZE]; // XXX uint8_t num_requests=0; // XXX -extern void on_friendadded(Messenger *m, int friendnumber); +static friendAddedFn *on_friendadded; static char prompt_buf[MAX_STR_SIZE] = {0}; static int prompt_buf_pos = 0; @@ -428,8 +429,9 @@ static void prompt_onInit(ToxWindow *self, Messenger *m) wclrtoeol(self->window); } -ToxWindow new_prompt() +ToxWindow new_prompt(friendAddedFn *f) { + on_friendadded = f; ToxWindow ret; memset(&ret, 0, sizeof(ret)); ret.onKey = &prompt_onKey; diff --git a/prompt.h b/prompt.h new file mode 100644 index 0000000..6c5320a --- /dev/null +++ b/prompt.h @@ -0,0 +1,14 @@ +#ifndef PROMPT_H_UZYGWFFL +#define PROMPT_H_UZYGWFFL + +#include "windows.h" + +typedef void (friendAddedFn)(Messenger *m, int friendnumber); + +ToxWindow new_prompt(friendAddedFn *f); +int add_req(uint8_t *public_key); +unsigned char *hex_string_to_bin(char hex_string[]); + +#endif /* end of include guard: PROMPT_H_UZYGWFFL */ + + From 722d27212852a780a7e97462eb2a02d143998b8d Mon Sep 17 00:00:00 2001 From: Aaron Lipinski Date: Tue, 13 Aug 2013 12:21:03 +1200 Subject: [PATCH 06/14] move windows functions to its own file --- CMakeLists.txt | 1 + main.c | 236 +------------------------------------------------ windows.c | 235 ++++++++++++++++++++++++++++++++++++++++++++++++ windows.h | 8 ++ 4 files changed, 248 insertions(+), 232 deletions(-) create mode 100644 windows.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 13b8692..dd811b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ set(exe_name toxic) add_executable(${exe_name} main.c + windows.c prompt.c friendlist.c chat.c diff --git a/main.c b/main.c index a109311..d7b251d 100644 --- a/main.c +++ b/main.c @@ -24,84 +24,10 @@ #include "prompt.h" #include "friendlist.h" - -/* Holds status of chat windows */ -char WINDOW_STATUS[MAX_WINDOW_SLOTS]; - #ifndef TOXICVER #define TOXICVER "NOVER" //Use the -D flag to set this #endif -static ToxWindow windows[MAX_WINDOW_SLOTS]; -static ToxWindow* prompt; - -int w_num; -int active_window; - -/* CALLBACKS START */ -void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userdata) -{ - int n = add_req(public_key); - wprintw(prompt->window, "\nFriend request from:\n"); - - int i; - for (i = 0; i < KEY_SIZE_BYTES; ++i) { - wprintw(prompt->window, "%02x", public_key[i] & 0xff); - } - - wprintw(prompt->window, "\nWith the message: %s\n", data); - wprintw(prompt->window, "\nUse \"accept %d\" to accept it.\n", n); - - for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { - if (windows[i].onFriendRequest != NULL) - windows[i].onFriendRequest(&windows[i], public_key, data, length); - } -} - -void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) -{ - int i; - for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { - if (windows[i].onMessage != NULL) - windows[i].onMessage(&windows[i], m, friendnumber, string, length); - } -} - -void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) -{ - int i; - for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { - if (windows[i].onAction != NULL) - windows[i].onAction(&windows[i], m, friendnumber, string, length); - } -} - -void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) -{ - wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string); - int i; - for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { - if (windows[i].onNickChange != NULL) - windows[i].onNickChange(&windows[i], friendnumber, string, length); - } -} - -void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) -{ - wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string); - int i; - for (i=0; i= TOXWINDOWS_MAX_NUM) - return -1; - - if (LINES < 2) - return -1; - - w.window = newwin(LINES - 2, COLS, 0, 0); - if (w.window == NULL) - return -1; - - windows[n] = w; - w.onInit(&w, m); - w_num++; - active_window = n; - return n; -} - -/* Deletes window w and cleans up */ -void del_window(ToxWindow *w, int f_num) -{ - active_window = 0; // Go to prompt screen - delwin(w->window); - int i; - for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { - if (WINDOW_STATUS[i] == f_num) { - WINDOW_STATUS[i] = -1; - disable_chatwin(f_num); - break; - } - } - clear(); - refresh(); -} - -/* Shows next window when tab or back-tab is pressed */ -void set_active_window(int ch) -{ - int f_inf = 0; - int max = MAX_WINDOW_SLOTS-1; - if (ch == '\t') { - int i = (active_window + 1) % max; - while (true) { - if (WINDOW_STATUS[i] != -1) { - active_window = i; - return; - } - i = (i + 1) % max; - if (f_inf++ > max) { // infinite loop check - endwin(); - exit(2); - } - } - }else { - int i = active_window - 1; - if (i < 0) i = max; - while (true) { - if (WINDOW_STATUS[i] != -1) { - active_window = i; - return; - } - if (--i < 0) i = max; - if (f_inf++ > max) { - endwin(); - exit(2); - } - } - } -} - -static void init_windows(Messenger *m) -{ - w_num = 0; - int n_prompt = 0; - int n_friendslist = 1; - if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1 - || add_window(m, new_friendlist(del_window, set_active_window, add_window, WINDOW_STATUS), n_friendslist) == -1) { - fprintf(stderr, "add_window() failed.\n"); - endwin(); - exit(1); - } - prompt = &windows[n_prompt]; -} - -static void do_tox(Messenger *m) +static void do_tox(Messenger *m, ToxWindow * prompt) { static int conn_try = 0; static int conn_err = 0; @@ -367,54 +196,8 @@ static void load_data(Messenger *m, char *path) fclose(fd); } -static void draw_bar() -{ - static int odd = 0; - int blinkrate = 30; - - attron(COLOR_PAIR(4)); - mvhline(LINES - 2, 0, '_', COLS); - attroff(COLOR_PAIR(4)); - - move(LINES - 1, 0); - - attron(COLOR_PAIR(4) | A_BOLD); - printw(" TOXIC " TOXICVER "|"); - attroff(COLOR_PAIR(4) | A_BOLD); - - int i; - for (i = 0; i < (MAX_WINDOW_SLOTS); ++i) { - if (WINDOW_STATUS[i] != -1) { - if (i == active_window) - attron(A_BOLD); - - odd = (odd+1) % blinkrate; - if (windows[i].blink && (odd < (blinkrate/2))) - attron(COLOR_PAIR(3)); - - printw(" %s", windows[i].title); - if (windows[i].blink && (odd < (blinkrate/2))) - attroff(COLOR_PAIR(3)); - - if (i == active_window) { - attroff(A_BOLD); - } - } - } - refresh(); -} - -void prepare_window(WINDOW *w) -{ - mvwin(w, 0, 0); - wresize(w, LINES-2, COLS); -} - - int main(int argc, char *argv[]) { - int ch; - ToxWindow* a; char *user_config_dir = get_user_config_dir(); char *DATA_FILE; int config_err = create_user_config_dir(user_config_dir); @@ -449,7 +232,7 @@ int main(int argc, char *argv[]) init_term(); Messenger *m = init_tox(); - init_windows(m); + ToxWindow * prompt = init_windows(m); init_window_status(); if(f_loadfromfile) @@ -471,21 +254,10 @@ int main(int argc, char *argv[]) } while(true) { /* Update tox */ - do_tox(m); + do_tox(m, prompt); /* Draw */ - a = &windows[active_window]; - prepare_window(a->window); - a->blink = false; - draw_bar(); - a->onDraw(a); - - /* Handle input */ - ch = getch(); - if (ch == '\t' || ch == KEY_BTAB) - set_active_window(ch); - else if (ch != ERR) - a->onKey(a, m, ch); + draw_active_window(m); } cleanupMessenger(m); return 0; diff --git a/windows.c b/windows.c new file mode 100644 index 0000000..c395243 --- /dev/null +++ b/windows.c @@ -0,0 +1,235 @@ +#include "friendlist.h" +#include "prompt.h" +#include "windows.h" + +/* Holds status of chat windows */ +char WINDOW_STATUS[MAX_WINDOW_SLOTS]; + +static int w_num; +static ToxWindow windows[MAX_WINDOW_SLOTS]; +static Messenger *m; +int active_window; + +static ToxWindow* prompt; + +/* CALLBACKS START */ +void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userdata) +{ + int n = add_req(public_key); + wprintw(prompt->window, "\nFriend request from:\n"); + + int i; + for (i = 0; i < KEY_SIZE_BYTES; ++i) { + wprintw(prompt->window, "%02x", public_key[i] & 0xff); + } + + wprintw(prompt->window, "\nWith the message: %s\n", data); + wprintw(prompt->window, "\nUse \"accept %d\" to accept it.\n", n); + + for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { + if (windows[i].onFriendRequest != NULL) + windows[i].onFriendRequest(&windows[i], public_key, data, length); + } +} + +void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) +{ + int i; + for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { + if (windows[i].onMessage != NULL) + windows[i].onMessage(&windows[i], m, friendnumber, string, length); + } +} + +void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) +{ + int i; + for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { + if (windows[i].onAction != NULL) + windows[i].onAction(&windows[i], m, friendnumber, string, length); + } +} + +void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) +{ + wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string); + int i; + for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { + if (windows[i].onNickChange != NULL) + windows[i].onNickChange(&windows[i], friendnumber, string, length); + } +} + +void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata) +{ + wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string); + int i; + for (i=0; i= TOXWINDOWS_MAX_NUM) + return -1; + + if (LINES < 2) + return -1; + + w.window = newwin(LINES - 2, COLS, 0, 0); + if (w.window == NULL) + return -1; + + windows[n] = w; + w.onInit(&w, m); + w_num++; + active_window = n; + return n; +} + +/* Deletes window w and cleans up */ +void del_window(ToxWindow *w, int f_num) +{ + active_window = 0; // Go to prompt screen + delwin(w->window); + int i; + for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { + if (WINDOW_STATUS[i] == f_num) { + WINDOW_STATUS[i] = -1; + disable_chatwin(f_num); + break; + } + } + clear(); + refresh(); +} + +/* Shows next window when tab or back-tab is pressed */ +void set_active_window(int ch) +{ + int f_inf = 0; + int max = MAX_WINDOW_SLOTS-1; + if (ch == '\t') { + int i = (active_window + 1) % max; + while (true) { + if (WINDOW_STATUS[i] != -1) { + active_window = i; + return; + } + i = (i + 1) % max; + if (f_inf++ > max) { // infinite loop check + endwin(); + exit(2); + } + } + }else { + int i = active_window - 1; + if (i < 0) i = max; + while (true) { + if (WINDOW_STATUS[i] != -1) { + active_window = i; + return; + } + if (--i < 0) i = max; + if (f_inf++ > max) { + endwin(); + exit(2); + } + } + } +} + +void init_window_status() +{ + /* Default window values decrement from -2 */ + int i; + for (i = 0; i < N_DEFAULT_WINS; ++i) + WINDOW_STATUS[i] = -(i+2); + + int j; + for (j = N_DEFAULT_WINS; j < MAX_WINDOW_SLOTS; j++) + WINDOW_STATUS[j] = -1; +} + +ToxWindow * init_windows() +{ + w_num = 0; + int n_prompt = 0; + int n_friendslist = 1; + if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1 + || add_window(m, new_friendlist(del_window, set_active_window, add_window, WINDOW_STATUS), n_friendslist) == -1) { + fprintf(stderr, "add_window() failed.\n"); + endwin(); + exit(1); + } + prompt = &windows[n_prompt]; + return prompt; +} + +static void draw_bar() +{ + static int odd = 0; + int blinkrate = 30; + + attron(COLOR_PAIR(4)); + mvhline(LINES - 2, 0, '_', COLS); + attroff(COLOR_PAIR(4)); + + move(LINES - 1, 0); + + attron(COLOR_PAIR(4) | A_BOLD); + printw(" TOXIC " TOXICVER "|"); + attroff(COLOR_PAIR(4) | A_BOLD); + + int i; + for (i = 0; i < (MAX_WINDOW_SLOTS); ++i) { + if (WINDOW_STATUS[i] != -1) { + if (i == active_window) + attron(A_BOLD); + + odd = (odd+1) % blinkrate; + if (windows[i].blink && (odd < (blinkrate/2))) + attron(COLOR_PAIR(3)); + + printw(" %s", windows[i].title); + if (windows[i].blink && (odd < (blinkrate/2))) + attroff(COLOR_PAIR(3)); + + if (i == active_window) { + attroff(A_BOLD); + } + } + } + refresh(); +} + +void prepare_window(WINDOW *w) +{ + mvwin(w, 0, 0); + wresize(w, LINES-2, COLS); +} + +void draw_active_window(Messenger * m) +{ + + ToxWindow *a = &windows[active_window]; + prepare_window(a->window); + a->blink = false; + draw_bar(); + a->onDraw(a); + + /* Handle input */ + int ch = getch(); + if (ch == '\t' || ch == KEY_BTAB) + set_active_window(ch); + else if (ch != ERR) + a->onKey(a, m, ch); +} diff --git a/windows.h b/windows.h index 4eb55a9..613fa3b 100644 --- a/windows.h +++ b/windows.h @@ -38,5 +38,13 @@ struct ToxWindow_ { WINDOW* window; }; +void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userdata); +void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata); +void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata); +void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata); +void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata); +void init_window_status(); +ToxWindow * init_windows(); +void draw_active_window(Messenger * m); #endif From 4a3292a32b7db96e6c073beb2b87a131ac190c14 Mon Sep 17 00:00:00 2001 From: Aaron Lipinski Date: Tue, 13 Aug 2013 12:32:09 +1200 Subject: [PATCH 07/14] remove temporary callbacks from refactoring --- chat.c | 5 +---- chat.h | 3 +-- friendlist.c | 13 ++++--------- friendlist.h | 6 ++---- windows.c | 2 +- windows.h | 3 +++ 6 files changed, 12 insertions(+), 20 deletions(-) diff --git a/chat.c b/chat.c index 6811569..e4da948 100644 --- a/chat.c +++ b/chat.c @@ -26,8 +26,6 @@ typedef struct { WINDOW* linewin; } ChatContext; -static delWindowFn *del_window; - void print_help(ChatContext *self); void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd); @@ -370,9 +368,8 @@ void print_help(ChatContext *self) wattroff(self->history, COLOR_PAIR(2)); } -ToxWindow new_chat(Messenger *m, int friendnum, delWindowFn *f) +ToxWindow new_chat(Messenger *m, int friendnum) { - del_window = f; ToxWindow ret; memset(&ret, 0, sizeof(ret)); diff --git a/chat.h b/chat.h index dcd5b3b..7599d46 100644 --- a/chat.h +++ b/chat.h @@ -1,7 +1,6 @@ #ifndef CHAT_H_6489PZ13 #define CHAT_H_6489PZ13 -typedef void (delWindowFn)(ToxWindow *w, int f_num); -ToxWindow new_chat(Messenger *m, int friendnum, delWindowFn f); +ToxWindow new_chat(Messenger *m, int friendnum); #endif /* end of include guard: CHAT_H_6489PZ13 */ diff --git a/friendlist.c b/friendlist.c index 5b79fde..e7504fb 100644 --- a/friendlist.c +++ b/friendlist.c @@ -10,11 +10,9 @@ #include "../../core/Messenger.h" #include "../../core/network.h" +#include "windows.h" #include "friendlist.h" -static delWindowFn *del_window; -static setActiveWindowFn *set_active_window; -static addWindowFn *add_window; static char * WINDOW_STATUS; typedef struct { @@ -53,7 +51,7 @@ void friendlist_onMessage(ToxWindow *self, Messenger *m, int num, uint8_t *str, for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { if (WINDOW_STATUS[i] == -1) { WINDOW_STATUS[i] = num; - add_window(m, new_chat(m, num, del_window), i); + add_window(m, new_chat(m, num), i); break; } } @@ -119,7 +117,7 @@ static void friendlist_onKey(ToxWindow *self, Messenger *m, int key) if (WINDOW_STATUS[i] == -1) { WINDOW_STATUS[i] = num_selected; friends[num_selected].chatwin = num_selected; - add_window(m, new_chat(m, num_selected, del_window), i); + add_window(m, new_chat(m, num_selected), i); break; } } @@ -166,10 +164,7 @@ static void friendlist_onInit(ToxWindow *self, Messenger *m) } -ToxWindow new_friendlist(delWindowFn dw, setActiveWindowFn saw, addWindowFn aw, char * ws) { - del_window = dw; - set_active_window = saw; - add_window = aw; +ToxWindow new_friendlist(char * ws) { WINDOW_STATUS = ws; ToxWindow ret; memset(&ret, 0, sizeof(ret)); diff --git a/friendlist.h b/friendlist.h index e8b93ae..c3d8dac 100644 --- a/friendlist.h +++ b/friendlist.h @@ -1,12 +1,10 @@ #ifndef FRIENDLIST_H_53I41IM #define FRIENDLIST_H_53I41IM - #include "windows.h" #include "chat.h" -typedef void (setActiveWindowFn)(int ch); -typedef int (addWindowFn)(Messenger *m, ToxWindow w, int n); -ToxWindow new_friendlist(delWindowFn dw, setActiveWindowFn saw, addWindowFn aw, char * ws); + +ToxWindow new_friendlist(char * ws); int friendlist_onFriendAdded(Messenger *m, int num); void disable_chatwin(int f_num); void fix_name(uint8_t *name); diff --git a/windows.c b/windows.c index c395243..d19392a 100644 --- a/windows.c +++ b/windows.c @@ -165,7 +165,7 @@ ToxWindow * init_windows() int n_prompt = 0; int n_friendslist = 1; if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1 - || add_window(m, new_friendlist(del_window, set_active_window, add_window, WINDOW_STATUS), n_friendslist) == -1) { + || add_window(m, new_friendlist(WINDOW_STATUS), n_friendslist) == -1) { fprintf(stderr, "add_window() failed.\n"); endwin(); exit(1); diff --git a/windows.h b/windows.h index 613fa3b..37f3e9d 100644 --- a/windows.h +++ b/windows.h @@ -46,5 +46,8 @@ void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t l void init_window_status(); ToxWindow * init_windows(); void draw_active_window(Messenger * m); +int add_window(Messenger *m, ToxWindow w, int n); +void del_window(ToxWindow *w, int f_num); +void set_active_window(int ch); #endif From 56210d46f992516fc28e0b62d9a96433b153f830 Mon Sep 17 00:00:00 2001 From: irungentoo Date: Wed, 14 Aug 2013 08:56:29 -0400 Subject: [PATCH 08/14] Fixed small compile error on my end. --- main.c | 3 --- windows.h | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/main.c b/main.c index d7b251d..063c148 100644 --- a/main.c +++ b/main.c @@ -24,9 +24,6 @@ #include "prompt.h" #include "friendlist.h" -#ifndef TOXICVER -#define TOXICVER "NOVER" //Use the -D flag to set this -#endif static void init_term() { diff --git a/windows.h b/windows.h index 37f3e9d..7d81e81 100644 --- a/windows.h +++ b/windows.h @@ -19,6 +19,10 @@ /* maximum window slots for WINDOW_STATUS array */ #define MAX_WINDOW_SLOTS N_DEFAULT_WINS+MAX_FRIENDS_NUM +#ifndef TOXICVER +#define TOXICVER "NOVER" //Use the -D flag to set this +#endif + typedef struct ToxWindow_ ToxWindow; struct ToxWindow_ { From 9cabdaa6a0cb9e1cc4ed43cf6df88b2f9577fa3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Arg=C3=BCelles?= Date: Wed, 14 Aug 2013 10:40:26 -0500 Subject: [PATCH 09/14] Fix segfault when using -f in toxic Call strdup() to the data file argument string to avoid segmentation fault when it is later freed. --- main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.c b/main.c index 063c148..ec33c72 100644 --- a/main.c +++ b/main.c @@ -218,7 +218,7 @@ int main(int argc, char *argv[]) else if (argv[i][0] == '-') { if (argv[i][1] == 'f') { if (argv[i + 1] != NULL) - DATA_FILE = argv[i + 1]; + DATA_FILE = strdup(argv[i + 1]); else f_flag = -1; } else if (argv[i][1] == 'n') { From cab4d4388900af61f4dbe8e110bdf3efe724c974 Mon Sep 17 00:00:00 2001 From: naxuroqa Date: Wed, 14 Aug 2013 19:21:36 +0200 Subject: [PATCH 10/14] Fix for another segfault/leak case when using -f arg --- main.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/main.c b/main.c index ec33c72..53639eb 100644 --- a/main.c +++ b/main.c @@ -196,17 +196,8 @@ static void load_data(Messenger *m, char *path) int main(int argc, char *argv[]) { char *user_config_dir = get_user_config_dir(); - char *DATA_FILE; - int config_err = create_user_config_dir(user_config_dir); - if(config_err) { - DATA_FILE = "data"; - } else { - DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); - strcpy(DATA_FILE, user_config_dir); - strcat(DATA_FILE, CONFIGDIR); - strcat(DATA_FILE, "data"); - } - free(user_config_dir); + char *DATA_FILE = NULL; + int config_err = 0; /* This is broken */ int f_loadfromfile = 1; @@ -227,6 +218,19 @@ int main(int argc, char *argv[]) } } + if (DATA_FILE == NULL ) { + config_err = create_user_config_dir(user_config_dir); + if (config_err) { + DATA_FILE = strdup("data"); + } else { + DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); + strcpy(DATA_FILE, user_config_dir); + strcat(DATA_FILE, CONFIGDIR); + strcat(DATA_FILE, "data"); + } + } + free(user_config_dir); + init_term(); Messenger *m = init_tox(); ToxWindow * prompt = init_windows(m); From 202d162d2e8f7f972bdea6e4adce57cc4302a052 Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Wed, 14 Aug 2013 16:02:21 -0400 Subject: [PATCH 11/14] small bug fixes --- chat.c | 2 +- main.c | 5 ++--- prompt.c | 2 +- windows.c | 5 +++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/chat.c b/chat.c index e4da948..d5edf95 100644 --- a/chat.c +++ b/chat.c @@ -314,7 +314,7 @@ void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd) snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff); strcat(id, xx); } - wprintw(ctx->history, "Your ID: %s\n", id); + wprintw(ctx->history, "%s\n", id); } else if (strcmp(ctx->line, "/close") == 0) { diff --git a/main.c b/main.c index 53639eb..d1a4be5 100644 --- a/main.c +++ b/main.c @@ -45,7 +45,7 @@ static void init_term() refresh(); } -static Messenger * init_tox() +static Messenger *init_tox() { /* Init core */ Messenger *m = initMessenger(); @@ -199,7 +199,6 @@ int main(int argc, char *argv[]) char *DATA_FILE = NULL; int config_err = 0; - /* This is broken */ int f_loadfromfile = 1; int f_flag = 0; int i = 0; @@ -233,7 +232,7 @@ int main(int argc, char *argv[]) init_term(); Messenger *m = init_tox(); - ToxWindow * prompt = init_windows(m); + ToxWindow *prompt = init_windows(m); init_window_status(); if(f_loadfromfile) diff --git a/prompt.c b/prompt.c index fb8a509..b84773a 100644 --- a/prompt.c +++ b/prompt.c @@ -238,7 +238,7 @@ void cmd_myid(ToxWindow *self, Messenger *m, char **args) snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff); strcat(id, xx); } - wprintw(self->window, "Your ID: %s\n", id); + wprintw(self->window, "%s\n", id); } void cmd_nick(ToxWindow *self, Messenger *m, char **args) diff --git a/windows.c b/windows.c index d19392a..aab46e9 100644 --- a/windows.c +++ b/windows.c @@ -159,7 +159,7 @@ void init_window_status() WINDOW_STATUS[j] = -1; } -ToxWindow * init_windows() +ToxWindow *init_windows() { w_num = 0; int n_prompt = 0; @@ -170,6 +170,7 @@ ToxWindow * init_windows() endwin(); exit(1); } + active_window = n_prompt; prompt = &windows[n_prompt]; return prompt; } @@ -217,7 +218,7 @@ void prepare_window(WINDOW *w) wresize(w, LINES-2, COLS); } -void draw_active_window(Messenger * m) +void draw_active_window(Messenger *m) { ToxWindow *a = &windows[active_window]; From 0ac97aa79401493f3bc5209dfa057b3e652a3cf2 Mon Sep 17 00:00:00 2001 From: Aaron Lipinski Date: Sun, 11 Aug 2013 12:59:16 +1200 Subject: [PATCH 12/14] refresh windows after resize --- main.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/main.c b/main.c index d1a4be5..aa025a1 100644 --- a/main.c +++ b/main.c @@ -8,6 +8,7 @@ #include #include #include +#include #ifdef _win32 #include @@ -25,9 +26,17 @@ #include "friendlist.h" +void on_window_resize(int sig) +{ + endwin(); + refresh(); + clear(); +} + static void init_term() { /* Setup terminal */ + signal(SIGWINCH, on_window_resize); initscr(); cbreak(); keypad(stdscr, 1); From 1af9d84aad95a83f11bc104ac2da68be4e65c186 Mon Sep 17 00:00:00 2001 From: Aaron Lipinski Date: Sun, 11 Aug 2013 14:48:02 +1200 Subject: [PATCH 13/14] add dhtstatus file --- CMakeLists.txt | 1 + dhtstatus.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ dhtstatus.h | 8 +++++ 3 files changed, 98 insertions(+) create mode 100644 dhtstatus.c create mode 100644 dhtstatus.h diff --git a/CMakeLists.txt b/CMakeLists.txt index dd811b9..9ee7020 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ add_executable(${exe_name} windows.c prompt.c friendlist.c + dhtstatus.c chat.c configdir.c) diff --git a/dhtstatus.c b/dhtstatus.c new file mode 100644 index 0000000..6626890 --- /dev/null +++ b/dhtstatus.c @@ -0,0 +1,89 @@ +#include "dhtstatus.h" +#include "string.h" +#include "../../core/network.h" +#include "../../core/DHT.h" + +typedef uint8_t ipbuf[3*4+3+1]; +static int num_selected = 0; + +static void printip(ipbuf buf, IP ip) +{ + sprintf((char*)buf, "%u.%u.%u.%u", ip.c[0], ip.c[1], ip.c[2], ip.c[3]); +} + +static void dhtstatus_onKey(ToxWindow *self, Messenger *m, int key) +{ + switch(key) { + case KEY_UP: + case 'k': + if (--num_selected < 0) + num_selected = CLIENT_ID_SIZE-1; + break; + + case KEY_DOWN: + case 'j': + num_selected = (num_selected+1) % CLIENT_ID_SIZE; + break; + + case '\n': + break; + + default: + break; + } +} + +static void dhtstatus_onDraw(ToxWindow *self) +{ + Client_data * close_clientlist = DHT_get_close_list(); + curs_set(0); + werase(self->window); + + uint64_t now = unix_time(); + uint32_t i, j; + ipbuf ipbuf; + wprintw(self->window,"\n%llu ______________________ CLOSE LIST ________________________ ___ IP ADDR ___ _PRT_ LST PNG ____ SELF ____ _PRT_ LST\n\n", now); + for(i = 0; i < CLIENT_ID_SIZE; i++) { + Client_data * client = close_clientlist + i; + if (i == num_selected) wattron(self->window, COLOR_PAIR(3)); + wprintw(self->window,"[%02i] ", i); + uint16_t port = ntohs(client->ip_port.port); + if(port) { + for(j = 0; j < 32; j++) + wprintw(self->window, "%02hhx", client->client_id[j]); + + printip(ipbuf, client->ip_port.ip); + wprintw(self->window, " %15s %5u ", ipbuf, port); + wprintw(self->window, " %3llu ", now - client->timestamp); + wprintw(self->window, " %3llu ", now - client->last_pinged); + + port = ntohs(client->ret_ip_port.port); + if(port) { + printip(ipbuf, client->ret_ip_port.ip); + wprintw(self->window, " %15s %5u %3llu", ipbuf, port, now - close_clientlist[i].ret_timestamp); + } + } + wprintw(self->window, "\n"); + if (i == num_selected) wattroff(self->window, COLOR_PAIR(3)); + } + + wrefresh(self->window); +} + +static void dhtstatus_onInit(ToxWindow *self, Messenger *m) +{ + +} + +ToxWindow new_dhtstatus() +{ + ToxWindow ret; + memset(&ret, 0, sizeof(ret)); + + ret.onKey = &dhtstatus_onKey; + ret.onDraw = &dhtstatus_onDraw; + ret.onInit = &dhtstatus_onInit; + + strcpy(ret.title, "[dht status]"); + return ret; +} diff --git a/dhtstatus.h b/dhtstatus.h new file mode 100644 index 0000000..2b30e5a --- /dev/null +++ b/dhtstatus.h @@ -0,0 +1,8 @@ +#ifndef _dhtstatus_h +#define _dhtstatus_h + +#include "windows.h" + +ToxWindow new_dhtstatus(); + +#endif From 662b1f2bac9d5e8debbd5d158bc8f13b1b397f66 Mon Sep 17 00:00:00 2001 From: Aaron Lipinski Date: Sun, 11 Aug 2013 14:49:41 +1200 Subject: [PATCH 14/14] add dhtstatus window --- windows.c | 5 ++++- windows.h | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/windows.c b/windows.c index aab46e9..6de5074 100644 --- a/windows.c +++ b/windows.c @@ -1,5 +1,6 @@ #include "friendlist.h" #include "prompt.h" +#include "dhtstatus.h" #include "windows.h" /* Holds status of chat windows */ @@ -164,8 +165,10 @@ ToxWindow *init_windows() w_num = 0; int n_prompt = 0; int n_friendslist = 1; + int n_dhtstatus = 2; if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1 - || add_window(m, new_friendlist(WINDOW_STATUS), n_friendslist) == -1) { + || add_window(m, new_friendlist(WINDOW_STATUS), n_friendslist) == -1 + || add_window(m, new_dhtstatus(), n_dhtstatus) == -1) { fprintf(stderr, "add_window() failed.\n"); endwin(); exit(1); diff --git a/windows.h b/windows.h index 7d81e81..893ccf6 100644 --- a/windows.h +++ b/windows.h @@ -14,7 +14,7 @@ #define KEY_SIZE_BYTES 32 /* number of permanent default windows */ -#define N_DEFAULT_WINS 2 +#define N_DEFAULT_WINS 3 /* maximum window slots for WINDOW_STATUS array */ #define MAX_WINDOW_SLOTS N_DEFAULT_WINS+MAX_FRIENDS_NUM