summaryrefslogtreecommitdiff
path: root/testing/toxic/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'testing/toxic/main.c')
-rw-r--r--testing/toxic/main.c255
1 files changed, 12 insertions, 243 deletions
diff --git a/testing/toxic/main.c b/testing/toxic/main.c
index 40ff5d09..d7b251dc 100644
--- a/testing/toxic/main.c
+++ b/testing/toxic/main.c
@@ -21,94 +21,13 @@
21 21
22#include "configdir.h" 22#include "configdir.h"
23#include "windows.h" 23#include "windows.h"
24 24#include "prompt.h"
25extern ToxWindow new_prompt(); 25#include "friendlist.h"
26extern ToxWindow new_friendlist();
27
28extern int friendlist_onFriendAdded(Messenger *m, int num);
29extern void disable_chatwin(int f_num);
30extern int add_req(uint8_t *public_key); // XXX
31extern unsigned char *hex_string_to_bin(char hex_string[]);
32
33/* Holds status of chat windows */
34char WINDOW_STATUS[MAX_WINDOW_SLOTS];
35 26
36#ifndef TOXICVER 27#ifndef TOXICVER
37#define TOXICVER "NOVER" //Use the -D flag to set this 28#define TOXICVER "NOVER" //Use the -D flag to set this
38#endif 29#endif
39 30
40static ToxWindow windows[MAX_WINDOW_SLOTS];
41static ToxWindow* prompt;
42
43static Messenger *m;
44
45int w_num;
46int active_window;
47
48/* CALLBACKS START */
49void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userdata)
50{
51 int n = add_req(public_key);
52 wprintw(prompt->window, "\nFriend request from:\n");
53
54 int i;
55 for (i = 0; i < KEY_SIZE_BYTES; ++i) {
56 wprintw(prompt->window, "%02x", public_key[i] & 0xff);
57 }
58
59 wprintw(prompt->window, "\nWith the message: %s\n", data);
60 wprintw(prompt->window, "\nUse \"accept %d\" to accept it.\n", n);
61
62 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
63 if (windows[i].onFriendRequest != NULL)
64 windows[i].onFriendRequest(&windows[i], public_key, data, length);
65 }
66}
67
68void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
69{
70 int i;
71 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
72 if (windows[i].onMessage != NULL)
73 windows[i].onMessage(&windows[i], m, friendnumber, string, length);
74 }
75}
76
77void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
78{
79 int i;
80 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
81 if (windows[i].onAction != NULL)
82 windows[i].onAction(&windows[i], m, friendnumber, string, length);
83 }
84}
85
86void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
87{
88 wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string);
89 int i;
90 for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
91 if (windows[i].onNickChange != NULL)
92 windows[i].onNickChange(&windows[i], friendnumber, string, length);
93 }
94}
95
96void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void* userdata)
97{
98 wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string);
99 int i;
100 for (i=0; i<MAX_WINDOW_SLOTS; ++i) {
101 if (windows[i].onStatusChange != NULL)
102 windows[i].onStatusChange(&windows[i], friendnumber, string, length);
103 }
104}
105
106void on_friendadded(int friendnumber)
107{
108 friendlist_onFriendAdded(m, friendnumber);
109}
110/* CALLBACKS END */
111
112static void init_term() 31static void init_term()
113{ 32{
114 /* Setup terminal */ 33 /* Setup terminal */
@@ -129,10 +48,10 @@ static void init_term()
129 refresh(); 48 refresh();
130} 49}
131 50
132static void init_tox() 51static Messenger * init_tox()
133{ 52{
134 /* Init core */ 53 /* Init core */
135 m = initMessenger(); 54 Messenger *m = initMessenger();
136 55
137 /* Callbacks */ 56 /* Callbacks */
138 m_callback_friendrequest(m, on_request, NULL); 57 m_callback_friendrequest(m, on_request, NULL);
@@ -147,6 +66,7 @@ static void init_tox()
147#else 66#else
148 setname(m, (uint8_t*) "Hipster", sizeof("Hipster")); 67 setname(m, (uint8_t*) "Hipster", sizeof("Hipster"));
149#endif 68#endif
69 return m;
150} 70}
151 71
152#define MAXLINE 90 /* Approx max number of chars in a sever line (IP + port + key) */ 72#define MAXLINE 90 /* Approx max number of chars in a sever line (IP + port + key) */
@@ -195,67 +115,7 @@ int init_connection(void)
195 return 0; 115 return 0;
196} 116}
197 117
198void init_window_status() 118static void do_tox(Messenger *m, ToxWindow * prompt)
199{
200 /* Default window values decrement from -2 */
201 int i;
202 for (i = 0; i < N_DEFAULT_WINS; ++i)
203 WINDOW_STATUS[i] = -(i+2);
204
205 int j;
206 for (j = N_DEFAULT_WINS; j < MAX_WINDOW_SLOTS; j++)
207 WINDOW_STATUS[j] = -1;
208}
209
210int add_window(ToxWindow w, int n)
211{
212 if (w_num >= TOXWINDOWS_MAX_NUM)
213 return -1;
214
215 if (LINES < 2)
216 return -1;
217
218 w.window = newwin(LINES - 2, COLS, 0, 0);
219 if (w.window == NULL)
220 return -1;
221
222 windows[n] = w;
223 w.onInit(&w, m);
224 w_num++;
225 return n;
226}
227
228/* Deletes window w and cleans up */
229void del_window(ToxWindow *w, int f_num)
230{
231 delwin(w->window);
232 int i;
233 for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
234 if (WINDOW_STATUS[i] == f_num) {
235 WINDOW_STATUS[i] = -1;
236 disable_chatwin(f_num);
237 break;
238 }
239 }
240 clear();
241 refresh();
242}
243
244static void init_windows()
245{
246 w_num = 0;
247 int n_prompt = 0;
248 int n_friendslist = 1;
249 if (add_window(new_prompt(), n_prompt) == -1
250 || add_window(new_friendlist(), n_friendslist) == -1) {
251 fprintf(stderr, "add_window() failed.\n");
252 endwin();
253 exit(1);
254 }
255 prompt = &windows[n_prompt];
256}
257
258static void do_tox()
259{ 119{
260 static int conn_try = 0; 120 static int conn_try = 0;
261 static int conn_err = 0; 121 static int conn_err = 0;
@@ -279,7 +139,7 @@ static void do_tox()
279 doMessenger(m); 139 doMessenger(m);
280} 140}
281 141
282static void load_data(char *path) 142static void load_data(Messenger *m, char *path)
283{ 143{
284 FILE *fd; 144 FILE *fd;
285 size_t len; 145 size_t len;
@@ -336,88 +196,8 @@ static void load_data(char *path)
336 fclose(fd); 196 fclose(fd);
337} 197}
338 198
339static void draw_bar()
340{
341 static int odd = 0;
342 int blinkrate = 30;
343
344 attron(COLOR_PAIR(4));
345 mvhline(LINES - 2, 0, '_', COLS);
346 attroff(COLOR_PAIR(4));
347
348 move(LINES - 1, 0);
349
350 attron(COLOR_PAIR(4) | A_BOLD);
351 printw(" TOXIC " TOXICVER "|");
352 attroff(COLOR_PAIR(4) | A_BOLD);
353
354 int i;
355 for (i = 0; i < (MAX_WINDOW_SLOTS); ++i) {
356 if (WINDOW_STATUS[i] != -1) {
357 if (i == active_window)
358 attron(A_BOLD);
359
360 odd = (odd+1) % blinkrate;
361 if (windows[i].blink && (odd < (blinkrate/2)))
362 attron(COLOR_PAIR(3));
363
364 printw(" %s", windows[i].title);
365 if (windows[i].blink && (odd < (blinkrate/2)))
366 attroff(COLOR_PAIR(3));
367
368 if (i == active_window) {
369 attroff(A_BOLD);
370 }
371 }
372 }
373 refresh();
374}
375
376void prepare_window(WINDOW *w)
377{
378 mvwin(w, 0, 0);
379 wresize(w, LINES-2, COLS);
380}
381
382/* Shows next window when tab or back-tab is pressed */
383void set_active_window(int ch)
384{
385 int f_inf = 0;
386 int max = MAX_WINDOW_SLOTS-1;
387 if (ch == '\t') {
388 int i = (active_window + 1) % max;
389 while (true) {
390 if (WINDOW_STATUS[i] != -1) {
391 active_window = i;
392 return;
393 }
394 i = (i + 1) % max;
395 if (f_inf++ > max) { // infinite loop check
396 endwin();
397 exit(2);
398 }
399 }
400 }else {
401 int i = active_window - 1;
402 if (i < 0) i = max;
403 while (true) {
404 if (WINDOW_STATUS[i] != -1) {
405 active_window = i;
406 return;
407 }
408 if (--i < 0) i = max;
409 if (f_inf++ > max) {
410 endwin();
411 exit(2);
412 }
413 }
414 }
415}
416
417int main(int argc, char *argv[]) 199int main(int argc, char *argv[])
418{ 200{
419 int ch;
420 ToxWindow* a;
421 char *user_config_dir = get_user_config_dir(); 201 char *user_config_dir = get_user_config_dir();
422 char *DATA_FILE; 202 char *DATA_FILE;
423 int config_err = create_user_config_dir(user_config_dir); 203 int config_err = create_user_config_dir(user_config_dir);
@@ -451,12 +231,12 @@ int main(int argc, char *argv[])
451 } 231 }
452 232
453 init_term(); 233 init_term();
454 init_tox(); 234 Messenger *m = init_tox();
455 init_windows(); 235 ToxWindow * prompt = init_windows(m);
456 init_window_status(); 236 init_window_status();
457 237
458 if(f_loadfromfile) 238 if(f_loadfromfile)
459 load_data(DATA_FILE); 239 load_data(m, DATA_FILE);
460 free(DATA_FILE); 240 free(DATA_FILE);
461 241
462 if (f_flag == -1) { 242 if (f_flag == -1) {
@@ -474,21 +254,10 @@ int main(int argc, char *argv[])
474 } 254 }
475 while(true) { 255 while(true) {
476 /* Update tox */ 256 /* Update tox */
477 do_tox(); 257 do_tox(m, prompt);
478 258
479 /* Draw */ 259 /* Draw */
480 a = &windows[active_window]; 260 draw_active_window(m);
481 prepare_window(a->window);
482 a->blink = false;
483 draw_bar();
484 a->onDraw(a);
485
486 /* Handle input */
487 ch = getch();
488 if (ch == '\t' || ch == KEY_BTAB)
489 set_active_window(ch);
490 else if (ch != ERR)
491 a->onKey(a, m, ch);
492 } 261 }
493 cleanupMessenger(m); 262 cleanupMessenger(m);
494 return 0; 263 return 0;