summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--INSTALL.md2
-rw-r--r--testing/toxic/chat.c3
-rw-r--r--testing/toxic/friendlist.c36
-rw-r--r--testing/toxic/friendlist.h2
-rw-r--r--testing/toxic/main.c1
-rw-r--r--testing/toxic/prompt.c8
-rw-r--r--testing/toxic/prompt.h4
-rw-r--r--testing/toxic/windows.c171
-rw-r--r--testing/toxic/windows.h10
9 files changed, 84 insertions, 153 deletions
diff --git a/INSTALL.md b/INSTALL.md
index 3d01d562..53ce5156 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -37,6 +37,7 @@ git checkout tags/0.4.2
37./configure && make check 37./configure && make check
38sudo checkinstall --install --pkgname libsodium --pkgversion 0.4.2 --nodoc 38sudo checkinstall --install --pkgname libsodium --pkgversion 0.4.2 --nodoc
39sudo ldconfig 39sudo ldconfig
40cd ..
40``` 41```
41 42
42Or if checkinstall is not easily available for your distribution (e.g. Fedora), 43Or if checkinstall is not easily available for your distribution (e.g. Fedora),
@@ -50,6 +51,7 @@ git checkout tags/0.4.2
50./configure 51./configure
51make check 52make check
52sudo make install 53sudo make install
54cd ..
53``` 55```
54 56
55 57
diff --git a/testing/toxic/chat.c b/testing/toxic/chat.c
index ef932cd2..67c2ed05 100644
--- a/testing/toxic/chat.c
+++ b/testing/toxic/chat.c
@@ -335,7 +335,8 @@ void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd)
335 else if (strcmp(ctx->line, "/close") == 0) { 335 else if (strcmp(ctx->line, "/close") == 0) {
336 int f_num = ctx->friendnum; 336 int f_num = ctx->friendnum;
337 delwin(ctx->linewin); 337 delwin(ctx->linewin);
338 del_window(self, f_num); 338 del_window(self);
339 disable_chatwin(f_num);
339 } 340 }
340 341
341 else 342 else
diff --git a/testing/toxic/friendlist.c b/testing/toxic/friendlist.c
index c85fd3ae..0a58bc54 100644
--- a/testing/toxic/friendlist.c
+++ b/testing/toxic/friendlist.c
@@ -13,7 +13,6 @@
13#include "windows.h" 13#include "windows.h"
14#include "friendlist.h" 14#include "friendlist.h"
15 15
16static char *WINDOW_STATUS;
17 16
18typedef struct { 17typedef struct {
19 uint8_t name[MAX_NAME_LENGTH]; 18 uint8_t name[MAX_NAME_LENGTH];
@@ -48,17 +47,7 @@ void friendlist_onMessage(ToxWindow *self, Messenger *m, int num, uint8_t *str,
48 return; 47 return;
49 48
50 if (friends[num].chatwin == -1) { 49 if (friends[num].chatwin == -1) {
51 friends[num].chatwin = num; 50 friends[num].chatwin = add_window(m, new_chat(m, num));
52 int i;
53
54 /* Find first open slot to hold chat window */
55 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
56 if (WINDOW_STATUS[i] == -1) {
57 WINDOW_STATUS[i] = num;
58 add_window(m, new_chat(m, num), i);
59 break;
60 }
61 }
62 } 51 }
63} 52}
64 53
@@ -106,25 +95,9 @@ static void friendlist_onKey(ToxWindow *self, Messenger *m, int key)
106 } else if (key == '\n') { 95 } else if (key == '\n') {
107 /* Jump to chat window if already open */ 96 /* Jump to chat window if already open */
108 if (friends[num_selected].chatwin != -1) { 97 if (friends[num_selected].chatwin != -1) {
109 int i; 98 set_active_window(friends[num_selected].chatwin);
110
111 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
112 if (WINDOW_STATUS[i] == num_selected) {
113 set_active_window(i);
114 break;
115 }
116 }
117 } else { 99 } else {
118 int i; 100 friends[num_selected].chatwin = add_window(m, new_chat(m, num_selected));
119
120 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
121 if (WINDOW_STATUS[i] == -1) {
122 WINDOW_STATUS[i] = num_selected;
123 friends[num_selected].chatwin = num_selected;
124 add_window(m, new_chat(m, num_selected), i);
125 break;
126 }
127 }
128 } 101 }
129 } 102 }
130} 103}
@@ -172,9 +145,8 @@ static void friendlist_onInit(ToxWindow *self, Messenger *m)
172 145
173} 146}
174 147
175ToxWindow new_friendlist(char *ws) 148ToxWindow new_friendlist()
176{ 149{
177 WINDOW_STATUS = ws;
178 ToxWindow ret; 150 ToxWindow ret;
179 memset(&ret, 0, sizeof(ret)); 151 memset(&ret, 0, sizeof(ret));
180 152
diff --git a/testing/toxic/friendlist.h b/testing/toxic/friendlist.h
index f0c27f53..91b917fd 100644
--- a/testing/toxic/friendlist.h
+++ b/testing/toxic/friendlist.h
@@ -4,7 +4,7 @@
4#include "windows.h" 4#include "windows.h"
5#include "chat.h" 5#include "chat.h"
6 6
7ToxWindow new_friendlist(char *ws); 7ToxWindow new_friendlist();
8int friendlist_onFriendAdded(Messenger *m, int num); 8int friendlist_onFriendAdded(Messenger *m, int num);
9void disable_chatwin(int f_num); 9void disable_chatwin(int f_num);
10void fix_name(uint8_t *name); 10void fix_name(uint8_t *name);
diff --git a/testing/toxic/main.c b/testing/toxic/main.c
index 04f6c4fd..05fabe4c 100644
--- a/testing/toxic/main.c
+++ b/testing/toxic/main.c
@@ -324,7 +324,6 @@ int main(int argc, char *argv[])
324 init_term(); 324 init_term();
325 Messenger *m = init_tox(); 325 Messenger *m = init_tox();
326 ToxWindow *prompt = init_windows(m); 326 ToxWindow *prompt = init_windows(m);
327 init_window_status();
328 327
329 if (f_loadfromfile) 328 if (f_loadfromfile)
330 load_data(m, DATA_FILE); 329 load_data(m, DATA_FILE);
diff --git a/testing/toxic/prompt.c b/testing/toxic/prompt.c
index e6c88510..473633d4 100644
--- a/testing/toxic/prompt.c
+++ b/testing/toxic/prompt.c
@@ -19,7 +19,6 @@ extern int store_data(Messenger *m, char *path);
19uint8_t pending_requests[MAX_STR_SIZE][CLIENT_ID_SIZE]; // XXX 19uint8_t pending_requests[MAX_STR_SIZE][CLIENT_ID_SIZE]; // XXX
20uint8_t num_requests = 0; // XXX 20uint8_t num_requests = 0; // XXX
21 21
22static friendAddedFn *on_friendadded_cb;
23static char prompt_buf[MAX_STR_SIZE] = {0}; 22static char prompt_buf[MAX_STR_SIZE] = {0};
24static int prompt_buf_pos = 0; 23static int prompt_buf_pos = 0;
25 24
@@ -97,7 +96,7 @@ void cmd_accept(ToxWindow *self, Messenger *m, char **args)
97 wprintw(self->window, "Failed to add friend.\n"); 96 wprintw(self->window, "Failed to add friend.\n");
98 else { 97 else {
99 wprintw(self->window, "Friend accepted as: %d.\n", num); 98 wprintw(self->window, "Friend accepted as: %d.\n", num);
100 on_friendadded_cb(m, num); 99 on_friendadded(m, num);
101 } 100 }
102} 101}
103 102
@@ -174,7 +173,7 @@ void cmd_add(ToxWindow *self, Messenger *m, char **args)
174 173
175 default: 174 default:
176 wprintw(self->window, "Friend added as %d.\n", num); 175 wprintw(self->window, "Friend added as %d.\n", num);
177 on_friendadded_cb(m, num); 176 on_friendadded(m, num);
178 break; 177 break;
179 } 178 }
180} 179}
@@ -481,9 +480,8 @@ static void prompt_onInit(ToxWindow *self, Messenger *m)
481 wclrtoeol(self->window); 480 wclrtoeol(self->window);
482} 481}
483 482
484ToxWindow new_prompt(friendAddedFn *f) 483ToxWindow new_prompt()
485{ 484{
486 on_friendadded_cb = f;
487 ToxWindow ret; 485 ToxWindow ret;
488 memset(&ret, 0, sizeof(ret)); 486 memset(&ret, 0, sizeof(ret));
489 ret.onKey = &prompt_onKey; 487 ret.onKey = &prompt_onKey;
diff --git a/testing/toxic/prompt.h b/testing/toxic/prompt.h
index 6c5320ab..8e12a42f 100644
--- a/testing/toxic/prompt.h
+++ b/testing/toxic/prompt.h
@@ -3,9 +3,7 @@
3 3
4#include "windows.h" 4#include "windows.h"
5 5
6typedef void (friendAddedFn)(Messenger *m, int friendnumber); 6ToxWindow new_prompt();
7
8ToxWindow new_prompt(friendAddedFn *f);
9int add_req(uint8_t *public_key); 7int add_req(uint8_t *public_key);
10unsigned char *hex_string_to_bin(char hex_string[]); 8unsigned char *hex_string_to_bin(char hex_string[]);
11 9
diff --git a/testing/toxic/windows.c b/testing/toxic/windows.c
index 11396e2c..a2c649d5 100644
--- a/testing/toxic/windows.c
+++ b/testing/toxic/windows.c
@@ -6,15 +6,10 @@
6extern char *DATA_FILE; 6extern char *DATA_FILE;
7extern int store_data(Messenger *m, char *path); 7extern int store_data(Messenger *m, char *path);
8 8
9/* Holds status of chat windows */ 9static ToxWindow windows[MAX_WINDOWS_NUM];
10char WINDOW_STATUS[MAX_WINDOW_SLOTS]; 10static ToxWindow *active_window;
11
12static int w_num;
13static ToxWindow windows[MAX_WINDOW_SLOTS];
14static Messenger *m;
15int active_window;
16
17static ToxWindow *prompt; 11static ToxWindow *prompt;
12static Messenger *m;
18 13
19/* CALLBACKS START */ 14/* CALLBACKS START */
20void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void *userdata) 15void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void *userdata)
@@ -31,7 +26,7 @@ void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void *userd
31 wprintw(prompt->window, "\nWith the message: %s\n", data); 26 wprintw(prompt->window, "\nWith the message: %s\n", data);
32 wprintw(prompt->window, "\nUse \"accept %d\" to accept it.\n", n); 27 wprintw(prompt->window, "\nUse \"accept %d\" to accept it.\n", n);
33 28
34 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { 29 for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
35 if (windows[i].onFriendRequest != NULL) 30 if (windows[i].onFriendRequest != NULL)
36 windows[i].onFriendRequest(&windows[i], public_key, data, length); 31 windows[i].onFriendRequest(&windows[i], public_key, data, length);
37 } 32 }
@@ -41,7 +36,7 @@ void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length
41{ 36{
42 int i; 37 int i;
43 38
44 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { 39 for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
45 if (windows[i].onMessage != NULL) 40 if (windows[i].onMessage != NULL)
46 windows[i].onMessage(&windows[i], m, friendnumber, string, length); 41 windows[i].onMessage(&windows[i], m, friendnumber, string, length);
47 } 42 }
@@ -51,7 +46,7 @@ void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length,
51{ 46{
52 int i; 47 int i;
53 48
54 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { 49 for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
55 if (windows[i].onAction != NULL) 50 if (windows[i].onAction != NULL)
56 windows[i].onAction(&windows[i], m, friendnumber, string, length); 51 windows[i].onAction(&windows[i], m, friendnumber, string, length);
57 } 52 }
@@ -62,7 +57,7 @@ void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t len
62 wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string); 57 wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string);
63 int i; 58 int i;
64 59
65 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { 60 for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
66 if (windows[i].onNickChange != NULL) 61 if (windows[i].onNickChange != NULL)
67 windows[i].onNickChange(&windows[i], friendnumber, string, length); 62 windows[i].onNickChange(&windows[i], friendnumber, string, length);
68 } 63 }
@@ -73,7 +68,7 @@ void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t l
73 wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string); 68 wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string);
74 int i; 69 int i;
75 70
76 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { 71 for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
77 if (windows[i].onStatusChange != NULL) 72 if (windows[i].onStatusChange != NULL)
78 windows[i].onStatusChange(&windows[i], friendnumber, string, length); 73 windows[i].onStatusChange(&windows[i], friendnumber, string, length);
79 } 74 }
@@ -89,119 +84,89 @@ void on_friendadded(Messenger *m, int friendnumber)
89} 84}
90/* CALLBACKS END */ 85/* CALLBACKS END */
91 86
92int add_window(Messenger *m, ToxWindow w, int n) 87int add_window(Messenger *m, ToxWindow w)
93{ 88{
94 if (w_num >= TOXWINDOWS_MAX_NUM)
95 return -1;
96
97 if (LINES < 2) 89 if (LINES < 2)
98 return -1; 90 return -1;
99 91
100 w.window = newwin(LINES - 2, COLS, 0, 0); 92 int i;
101 93 for(i = 0; i < MAX_WINDOWS_NUM; i++) {
102 if (w.window == NULL) 94 if (windows[i].window)
103 return -1; 95 continue;
104 96
105 windows[n] = w; 97 w.window = newwin(LINES - 2, COLS, 0, 0);
106 w.onInit(&w, m); 98 if (w.window == NULL)
107 w_num++; 99 return -1;
108 active_window = n; 100
109 return n; 101 windows[i] = w;
102 w.onInit(&w, m);
103
104 active_window = windows+i;
105 return i;
106 }
107
108 return -1;
110} 109}
111 110
112/* Deletes window w and cleans up */ 111/* Deletes window w and cleans up */
113void del_window(ToxWindow *w, int f_num) 112void del_window(ToxWindow *w)
114{ 113{
115 active_window = 0; // Go to prompt screen 114 active_window = windows; // Go to prompt screen
116 delwin(w->window); 115 delwin(w->window);
117 int i; 116 if (w->x)
118 117 free(w->x);
119 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { 118 w->window = NULL;
120 if (WINDOW_STATUS[i] == f_num) { 119 memset(w, 0, sizeof(ToxWindow));
121 WINDOW_STATUS[i] = -1;
122 disable_chatwin(f_num);
123 break;
124 }
125 }
126
127 clear(); 120 clear();
128 refresh(); 121 refresh();
129} 122}
130 123
131/* Shows next window when tab or back-tab is pressed */ 124/* Shows next window when tab or back-tab is pressed */
132void set_active_window(int ch) 125void set_next_window(int ch)
133{ 126{
134 int f_inf = 0; 127 ToxWindow *end = windows+MAX_WINDOWS_NUM-1;
135 int max = MAX_WINDOW_SLOTS - 1; 128 ToxWindow *inf = active_window;
136 129 while(true) {
137 if (ch == '\t') { 130 if (ch == '\t') {
138 int i = (active_window + 1) % max; 131 if (++active_window > end)
139 132 active_window = windows;
140 while (true) { 133 } else
141 if (WINDOW_STATUS[i] != -1) { 134 if (--active_window < windows)
142 active_window = i; 135 active_window = end;
143 return; 136
144 } 137 if (active_window->window)
145 138 return;
146 i = (i + 1) % max; 139
147 140 if (active_window == inf) { // infinite loop check
148 if (f_inf++ > max) { // infinite loop check 141 endwin();
149 endwin(); 142 exit(2);
150 exit(2);
151 }
152 }
153 } else {
154 int i = active_window - 1;
155
156 if (i < 0) i = max;
157
158 while (true) {
159 if (WINDOW_STATUS[i] != -1) {
160 active_window = i;
161 return;
162 }
163
164 if (--i < 0) i = max;
165
166 if (f_inf++ > max) {
167 endwin();
168 exit(2);
169 }
170 } 143 }
171 } 144 }
172} 145}
173 146
174void init_window_status() 147void set_active_window(int index)
175{ 148{
176 /* Default window values decrement from -2 */ 149 if (index < 0 || index >= MAX_WINDOWS_NUM)
177 int i; 150 return;
178 151
179 for (i = 0; i < N_DEFAULT_WINS; ++i) 152 active_window = windows+index;
180 WINDOW_STATUS[i] = -(i + 2);
181
182 int j;
183
184 for (j = N_DEFAULT_WINS; j < MAX_WINDOW_SLOTS; j++)
185 WINDOW_STATUS[j] = -1;
186} 153}
187 154
188ToxWindow *init_windows() 155ToxWindow *init_windows()
189{ 156{
190 w_num = 0; 157 int n_prompt = add_window(m, new_prompt());
191 int n_prompt = 0; 158
192 int n_friendslist = 1; 159 if (n_prompt == -1
193 int n_dhtstatus = 2; 160 || add_window(m, new_friendlist()) == -1
194 161 || add_window(m, new_dhtstatus()) == -1) {
195 if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1
196 || add_window(m, new_friendlist(WINDOW_STATUS), n_friendslist) == -1
197 || add_window(m, new_dhtstatus(), n_dhtstatus) == -1) {
198 fprintf(stderr, "add_window() failed.\n"); 162 fprintf(stderr, "add_window() failed.\n");
199 endwin(); 163 endwin();
200 exit(1); 164 exit(1);
201 } 165 }
202 166
203 active_window = n_prompt;
204 prompt = &windows[n_prompt]; 167 prompt = &windows[n_prompt];
168 active_window = prompt;
169
205 return prompt; 170 return prompt;
206} 171}
207 172
@@ -222,9 +187,9 @@ static void draw_bar()
222 187
223 int i; 188 int i;
224 189
225 for (i = 0; i < (MAX_WINDOW_SLOTS); ++i) { 190 for (i = 0; i < (MAX_WINDOWS_NUM); ++i) {
226 if (WINDOW_STATUS[i] != -1) { 191 if (windows[i].window) {
227 if (i == active_window) 192 if (windows+i == active_window)
228 attron(A_BOLD); 193 attron(A_BOLD);
229 194
230 odd = (odd + 1) % blinkrate; 195 odd = (odd + 1) % blinkrate;
@@ -237,7 +202,7 @@ static void draw_bar()
237 if (windows[i].blink && (odd < (blinkrate / 2))) 202 if (windows[i].blink && (odd < (blinkrate / 2)))
238 attroff(COLOR_PAIR(3)); 203 attroff(COLOR_PAIR(3));
239 204
240 if (i == active_window) { 205 if (windows+i == active_window) {
241 attroff(A_BOLD); 206 attroff(A_BOLD);
242 } 207 }
243 } 208 }
@@ -255,7 +220,7 @@ void prepare_window(WINDOW *w)
255void draw_active_window(Messenger *m) 220void draw_active_window(Messenger *m)
256{ 221{
257 222
258 ToxWindow *a = &windows[active_window]; 223 ToxWindow *a = active_window;
259 prepare_window(a->window); 224 prepare_window(a->window);
260 a->blink = false; 225 a->blink = false;
261 draw_bar(); 226 draw_bar();
@@ -265,7 +230,7 @@ void draw_active_window(Messenger *m)
265 int ch = getch(); 230 int ch = getch();
266 231
267 if (ch == '\t' || ch == KEY_BTAB) 232 if (ch == '\t' || ch == KEY_BTAB)
268 set_active_window(ch); 233 set_next_window(ch);
269 else if (ch != ERR) 234 else if (ch != ERR)
270 a->onKey(a, m, ch); 235 a->onKey(a, m, ch);
271} 236}
diff --git a/testing/toxic/windows.h b/testing/toxic/windows.h
index 553a6200..be5557e9 100644
--- a/testing/toxic/windows.h
+++ b/testing/toxic/windows.h
@@ -8,7 +8,7 @@
8#include <stdint.h> 8#include <stdint.h>
9#include <stdbool.h> 9#include <stdbool.h>
10#include "../../core/Messenger.h" 10#include "../../core/Messenger.h"
11#define TOXWINDOWS_MAX_NUM 32 11#define MAX_WINDOWS_NUM 32
12#define MAX_FRIENDS_NUM 100 12#define MAX_FRIENDS_NUM 100
13#define MAX_STR_SIZE 256 13#define MAX_STR_SIZE 256
14#define KEY_SIZE_BYTES 32 14#define KEY_SIZE_BYTES 32
@@ -16,9 +16,6 @@
16/* number of permanent default windows */ 16/* number of permanent default windows */
17#define N_DEFAULT_WINS 3 17#define N_DEFAULT_WINS 3
18 18
19/* maximum window slots for WINDOW_STATUS array */
20#define MAX_WINDOW_SLOTS N_DEFAULT_WINS+MAX_FRIENDS_NUM
21
22#ifndef TOXICVER 19#ifndef TOXICVER
23#define TOXICVER "NOVER" //Use the -D flag to set this 20#define TOXICVER "NOVER" //Use the -D flag to set this
24#endif 21#endif
@@ -48,11 +45,10 @@ void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length,
48void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata); 45void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata);
49void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata); 46void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata);
50void on_friendadded(Messenger *m, int friendnumber); 47void on_friendadded(Messenger *m, int friendnumber);
51void init_window_status();
52ToxWindow *init_windows(); 48ToxWindow *init_windows();
53void draw_active_window(Messenger *m); 49void draw_active_window(Messenger *m);
54int add_window(Messenger *m, ToxWindow w, int n); 50int add_window(Messenger *m, ToxWindow w);
55void del_window(ToxWindow *w, int f_num); 51void del_window(ToxWindow *w);
56void set_active_window(int ch); 52void set_active_window(int ch);
57#endif 53#endif
58 54