diff options
Diffstat (limited to 'testing/toxic/main.c')
-rw-r--r-- | testing/toxic/main.c | 170 |
1 files changed, 107 insertions, 63 deletions
diff --git a/testing/toxic/main.c b/testing/toxic/main.c index 45760b1c..19a0b959 100644 --- a/testing/toxic/main.c +++ b/testing/toxic/main.c | |||
@@ -17,14 +17,13 @@ extern ToxWindow new_prompt(); | |||
17 | extern ToxWindow new_friendlist(); | 17 | extern ToxWindow new_friendlist(); |
18 | 18 | ||
19 | extern int friendlist_onFriendAdded(int num); | 19 | extern int friendlist_onFriendAdded(int num); |
20 | 20 | extern void disable_chatwin(int f_num); | |
21 | extern int add_req(uint8_t* public_key); // XXX | 21 | extern int add_req(uint8_t* public_key); // XXX |
22 | 22 | ||
23 | #define TOXWINDOWS_MAX_NUM 32 | 23 | char WINDOW_STATUS[MAX_WINDOW_SLOTS]; // Holds status of chat windows |
24 | 24 | static ToxWindow windows[MAX_WINDOW_SLOTS]; | |
25 | static ToxWindow windows[TOXWINDOWS_MAX_NUM]; | 25 | int w_num; |
26 | static int w_num; | 26 | int w_active; |
27 | static int w_active; | ||
28 | static ToxWindow* prompt; | 27 | static ToxWindow* prompt; |
29 | 28 | ||
30 | // CALLBACKS START | 29 | // CALLBACKS START |
@@ -41,7 +40,7 @@ void on_request(uint8_t* public_key, uint8_t* data, uint16_t length) { | |||
41 | 40 | ||
42 | wprintw(prompt->window, "Use \"accept %d\" to accept it.\n", n); | 41 | wprintw(prompt->window, "Use \"accept %d\" to accept it.\n", n); |
43 | 42 | ||
44 | for(i=0; i<w_num; i++) { | 43 | for(i=0; i<MAX_WINDOW_SLOTS; i++) { |
45 | if(windows[i].onFriendRequest != NULL) | 44 | if(windows[i].onFriendRequest != NULL) |
46 | windows[i].onFriendRequest(&windows[i], public_key, data, length); | 45 | windows[i].onFriendRequest(&windows[i], public_key, data, length); |
47 | } | 46 | } |
@@ -52,7 +51,7 @@ void on_message(int friendnumber, uint8_t* string, uint16_t length) { | |||
52 | 51 | ||
53 | wprintw(prompt->window, "\n(message) %d: %s\n", friendnumber, string); | 52 | wprintw(prompt->window, "\n(message) %d: %s\n", friendnumber, string); |
54 | 53 | ||
55 | for(i=0; i<w_num; i++) { | 54 | for(i=0; i<MAX_WINDOW_SLOTS; i++) { |
56 | if(windows[i].onMessage != NULL) | 55 | if(windows[i].onMessage != NULL) |
57 | windows[i].onMessage(&windows[i], friendnumber, string, length); | 56 | windows[i].onMessage(&windows[i], friendnumber, string, length); |
58 | } | 57 | } |
@@ -63,18 +62,18 @@ void on_nickchange(int friendnumber, uint8_t* string, uint16_t length) { | |||
63 | 62 | ||
64 | wprintw(prompt->window, "\n(nickchange) %d: %s!\n", friendnumber, string); | 63 | wprintw(prompt->window, "\n(nickchange) %d: %s!\n", friendnumber, string); |
65 | 64 | ||
66 | for(i=0; i<w_num; i++) { | 65 | for(i=0; i<MAX_WINDOW_SLOTS; i++) { |
67 | if(windows[i].onNickChange != NULL) | 66 | if(windows[i].onNickChange != NULL) |
68 | windows[i].onNickChange(&windows[i], friendnumber, string, length); | 67 | windows[i].onNickChange(&windows[i], friendnumber, string, length); |
69 | } | 68 | } |
70 | } | 69 | } |
71 | 70 | ||
72 | void on_statuschange(int friendnumber, uint8_t* string, uint16_t length) { | 71 | void on_statuschange(int friendnumber, USERSTATUS_KIND kind, uint8_t* string, uint16_t length) { |
73 | size_t i; | 72 | size_t i; |
74 | 73 | ||
75 | wprintw(prompt->window, "\n(statuschange) %d: %s!\n", friendnumber, string); | 74 | wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string); |
76 | 75 | ||
77 | for(i=0; i<w_num; i++) { | 76 | for(i=0; i<MAX_WINDOW_SLOTS; i++) { |
78 | if(windows[i].onStatusChange != NULL) | 77 | if(windows[i].onStatusChange != NULL) |
79 | windows[i].onStatusChange(&windows[i], friendnumber, string, length); | 78 | windows[i].onStatusChange(&windows[i], friendnumber, string, length); |
80 | } | 79 | } |
@@ -115,44 +114,60 @@ static void init_tox() { | |||
115 | m_callback_userstatus(on_statuschange); | 114 | m_callback_userstatus(on_statuschange); |
116 | } | 115 | } |
117 | 116 | ||
118 | int add_window(ToxWindow w) { | 117 | void init_window_status() { |
119 | if(w_num == TOXWINDOWS_MAX_NUM) | 118 | /* Default window values decrement from -2 */ |
119 | int i; | ||
120 | for (i = 0; i < N_DEFAULT_WINS; i++) | ||
121 | WINDOW_STATUS[i] = -(i+2); | ||
122 | |||
123 | int j; | ||
124 | for (j = N_DEFAULT_WINS; j < MAX_WINDOW_SLOTS; j++) | ||
125 | WINDOW_STATUS[j] = -1; | ||
126 | } | ||
127 | |||
128 | int add_window(ToxWindow w, int n) { | ||
129 | if(w_num >= TOXWINDOWS_MAX_NUM) | ||
120 | return -1; | 130 | return -1; |
121 | 131 | ||
122 | if(LINES < 2) | 132 | if(LINES < 2) |
123 | return -1; | 133 | return -1; |
124 | 134 | ||
125 | w.window = newwin(LINES - 2, COLS, 0, 0); | 135 | w.window = newwin(LINES - 2, COLS, 0, 0); |
126 | |||
127 | if(w.window == NULL) | 136 | if(w.window == NULL) |
128 | return -1; | 137 | return -1; |
129 | 138 | ||
130 | windows[w_num++] = w; | 139 | windows[n] = w; |
131 | w.onInit(&w); | 140 | w.onInit(&w); |
132 | 141 | w_num++; | |
133 | return w_num - 1; | 142 | return n; |
134 | } | 143 | } |
135 | 144 | ||
136 | int focus_window(int num) { | 145 | /* Deletes window w and cleans up */ |
137 | if(num >= w_num || num < 0) | 146 | void del_window(ToxWindow *w, int f_num) { |
138 | return -1; | 147 | delwin(w->window); |
139 | 148 | int i; | |
140 | w_active = num; | 149 | for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; i++) { |
141 | return 0; | 150 | if (WINDOW_STATUS[i] == f_num) { |
151 | WINDOW_STATUS[i] = -1; | ||
152 | disable_chatwin(f_num); | ||
153 | break; | ||
154 | } | ||
155 | } | ||
156 | clear(); | ||
157 | refresh(); | ||
142 | } | 158 | } |
143 | 159 | ||
144 | static void init_windows() { | 160 | static void init_windows() { |
145 | w_num = 0; | 161 | w_num = 0; |
146 | w_active = 0; | 162 | int n_prompt = 0; |
147 | 163 | int n_friendslist = 1; | |
148 | if(add_window(new_prompt()) == -1 || add_window(new_friendlist()) == -1) { | 164 | if(add_window(new_prompt(), n_prompt) == -1 |
165 | || add_window(new_friendlist(), n_friendslist) == -1) { | ||
149 | fprintf(stderr, "add_window() failed.\n"); | 166 | fprintf(stderr, "add_window() failed.\n"); |
150 | |||
151 | endwin(); | 167 | endwin(); |
152 | exit(1); | 168 | exit(1); |
153 | } | 169 | } |
154 | 170 | prompt = &windows[n_prompt]; | |
155 | prompt = &windows[0]; | ||
156 | } | 171 | } |
157 | 172 | ||
158 | static void do_tox() { | 173 | static void do_tox() { |
@@ -201,7 +216,7 @@ static void load_data(char *path) { | |||
201 | 216 | ||
202 | Messenger_load(buf, len); | 217 | Messenger_load(buf, len); |
203 | } | 218 | } |
204 | else { | 219 | else { |
205 | len = Messenger_size(); | 220 | len = Messenger_size(); |
206 | buf = malloc(len); | 221 | buf = malloc(len); |
207 | 222 | ||
@@ -238,7 +253,6 @@ static void load_data(char *path) { | |||
238 | 253 | ||
239 | static void draw_bar() { | 254 | static void draw_bar() { |
240 | static int odd = 0; | 255 | static int odd = 0; |
241 | size_t i; | ||
242 | 256 | ||
243 | attron(COLOR_PAIR(4)); | 257 | attron(COLOR_PAIR(4)); |
244 | mvhline(LINES - 2, 0, '_', COLS); | 258 | mvhline(LINES - 2, 0, '_', COLS); |
@@ -250,28 +264,26 @@ static void draw_bar() { | |||
250 | printw(" TOXIC 1.0 |"); | 264 | printw(" TOXIC 1.0 |"); |
251 | attroff(COLOR_PAIR(4) | A_BOLD); | 265 | attroff(COLOR_PAIR(4) | A_BOLD); |
252 | 266 | ||
253 | for(i=0; i<w_num; i++) { | 267 | int i; |
254 | if(i == w_active) { | 268 | for (i = 0; i < (MAX_WINDOW_SLOTS-1); i++) { |
255 | attron(A_BOLD); | 269 | if (WINDOW_STATUS[i] != -1) { |
256 | } | 270 | if (i == w_active) |
257 | 271 | attron(A_BOLD); | |
258 | odd = (odd+1) % 10; | 272 | |
259 | 273 | odd = (odd+1) % 10; | |
260 | if(windows[i].blink && (odd < 5)) { | 274 | if(windows[i].blink && (odd < 5)) { |
261 | attron(COLOR_PAIR(3)); | 275 | attron(COLOR_PAIR(3)); |
262 | } | 276 | } |
263 | 277 | ||
264 | printw(" %s", windows[i].title); | 278 | printw(" %s", windows[i].title); |
265 | 279 | if(windows[i].blink && (odd < 5)) { | |
266 | if(windows[i].blink && (odd < 5)) { | 280 | attron(COLOR_PAIR(3)); |
267 | attron(COLOR_PAIR(3)); | 281 | } |
268 | } | 282 | if(i == w_active) { |
269 | 283 | attroff(A_BOLD); | |
270 | if(i == w_active) { | 284 | } |
271 | attroff(A_BOLD); | ||
272 | } | 285 | } |
273 | } | 286 | } |
274 | |||
275 | refresh(); | 287 | refresh(); |
276 | } | 288 | } |
277 | 289 | ||
@@ -280,6 +292,42 @@ void prepare_window(WINDOW* w) { | |||
280 | wresize(w, LINES-2, COLS); | 292 | wresize(w, LINES-2, COLS); |
281 | } | 293 | } |
282 | 294 | ||
295 | /* Shows next window when tab or back-tab is pressed */ | ||
296 | void set_active_window(int ch) { | ||
297 | int f_inf = 0; | ||
298 | int max = MAX_WINDOW_SLOTS-1; | ||
299 | if (ch == '\t') { | ||
300 | int i = (w_active + 1) % max; | ||
301 | while (true) { | ||
302 | if (WINDOW_STATUS[i] != -1) { | ||
303 | w_active = i; | ||
304 | return; | ||
305 | } | ||
306 | i = (i + 1) % max; | ||
307 | if (f_inf++ > max) { // infinite loop check | ||
308 | endwin(); | ||
309 | clear(); | ||
310 | exit(2); | ||
311 | } | ||
312 | } | ||
313 | }else { | ||
314 | int i = w_active - 1; | ||
315 | if (i < 0) i = max; | ||
316 | while (true) { | ||
317 | if (WINDOW_STATUS[i] != -1) { | ||
318 | w_active = i; | ||
319 | return; | ||
320 | } | ||
321 | if (--i < 0) i = max; | ||
322 | if (f_inf++ > max) { | ||
323 | endwin(); | ||
324 | clear(); | ||
325 | exit(2); | ||
326 | } | ||
327 | } | ||
328 | } | ||
329 | } | ||
330 | |||
283 | int main(int argc, char* argv[]) { | 331 | int main(int argc, char* argv[]) { |
284 | int ch; | 332 | int ch; |
285 | int i = 0; | 333 | int i = 0; |
@@ -289,7 +337,7 @@ int main(int argc, char* argv[]) { | |||
289 | 337 | ||
290 | for(i = 0; i < argc; i++) { | 338 | for(i = 0; i < argc; i++) { |
291 | if (argv[i] == NULL){ | 339 | if (argv[i] == NULL){ |
292 | break; | 340 | break; |
293 | } else if(argv[i][0] == '-') { | 341 | } else if(argv[i][0] == '-') { |
294 | if(argv[i][1] == 'f') { | 342 | if(argv[i][1] == 'f') { |
295 | if(argv[i + 1] != NULL) | 343 | if(argv[i + 1] != NULL) |
@@ -305,6 +353,7 @@ int main(int argc, char* argv[]) { | |||
305 | init_tox(); | 353 | init_tox(); |
306 | load_data(filename); | 354 | load_data(filename); |
307 | init_windows(); | 355 | init_windows(); |
356 | init_window_status(); | ||
308 | 357 | ||
309 | if(f_flag == -1) { | 358 | if(f_flag == -1) { |
310 | attron(COLOR_PAIR(3) | A_BOLD); | 359 | attron(COLOR_PAIR(3) | A_BOLD); |
@@ -312,8 +361,7 @@ int main(int argc, char* argv[]) { | |||
312 | "defaulting to 'data' for a keyfile...\n"); | 361 | "defaulting to 'data' for a keyfile...\n"); |
313 | attroff(COLOR_PAIR(3) | A_BOLD); | 362 | attroff(COLOR_PAIR(3) | A_BOLD); |
314 | } | 363 | } |
315 | 364 | ||
316 | |||
317 | while(true) { | 365 | while(true) { |
318 | // Update tox. | 366 | // Update tox. |
319 | do_tox(); | 367 | do_tox(); |
@@ -327,18 +375,14 @@ int main(int argc, char* argv[]) { | |||
327 | 375 | ||
328 | // Handle input. | 376 | // Handle input. |
329 | ch = getch(); | 377 | ch = getch(); |
330 | if(ch == '\t') { | 378 | if(ch == '\t' || ch == KEY_BTAB) |
331 | w_active = (w_active + 1) % w_num; | 379 | set_active_window(ch); |
332 | } | 380 | else if(ch != ERR) { |
333 | else if(ch == KEY_BTAB) { | 381 | a->onKey(a, ch); |
334 | w_active = (w_active + w_num - 1) % w_num; | ||
335 | } | 382 | } |
336 | else if(ch != ERR) { | 383 | else if(ch != ERR) { |
337 | a->onKey(a, ch); | 384 | a->onKey(a, ch); |
338 | } | 385 | } |
339 | |||
340 | } | 386 | } |
341 | |||
342 | return 0; | 387 | return 0; |
343 | } | 388 | } |
344 | |||