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.c103
1 files changed, 95 insertions, 8 deletions
diff --git a/testing/toxic/main.c b/testing/toxic/main.c
index 0aad6777..fffc3f84 100644
--- a/testing/toxic/main.c
+++ b/testing/toxic/main.c
@@ -14,6 +14,10 @@
14#include "windows.h" 14#include "windows.h"
15 15
16extern ToxWindow new_prompt(); 16extern ToxWindow new_prompt();
17extern ToxWindow new_friendlist();
18
19extern int friendlist_onFriendAdded(int num);
20
17extern int add_req(uint8_t* public_key); // XXX 21extern int add_req(uint8_t* public_key); // XXX
18 22
19#define TOXWINDOWS_MAX_NUM 32 23#define TOXWINDOWS_MAX_NUM 32
@@ -25,21 +29,59 @@ static ToxWindow* prompt;
25 29
26// CALLBACKS START 30// CALLBACKS START
27void on_request(uint8_t* public_key, uint8_t* data, uint16_t length) { 31void on_request(uint8_t* public_key, uint8_t* data, uint16_t length) {
32 size_t i;
28 int n = add_req(public_key); 33 int n = add_req(public_key);
29 34
30 wprintw(prompt->window, "\nFriend request.\nUse \"accept %d\" to accept it.\n", n); 35 wprintw(prompt->window, "\nFriend request from:\n");
36
37 for(i=0; i<32; i++) {
38 wprintw(prompt->window, "%02x", public_key[i] & 0xff);
39 }
40 wprintw(prompt->window, "\n");
41
42 wprintw(prompt->window, "Use \"accept %d\" to accept it.\n", n);
43
44 for(i=0; i<w_num; i++) {
45 if(windows[i].onFriendRequest != NULL)
46 windows[i].onFriendRequest(&windows[i], public_key, data, length);
47 }
31} 48}
32 49
33void on_message(int friendnumber, uint8_t* string, uint16_t length) { 50void on_message(int friendnumber, uint8_t* string, uint16_t length) {
51 size_t i;
52
34 wprintw(prompt->window, "\n(message) %d: %s!\n", friendnumber, string); 53 wprintw(prompt->window, "\n(message) %d: %s!\n", friendnumber, string);
54
55 for(i=0; i<w_num; i++) {
56 if(windows[i].onMessage != NULL)
57 windows[i].onMessage(&windows[i], friendnumber, string, length);
58 }
35} 59}
36 60
37void on_nickchange(int friendnumber, uint8_t* string, uint16_t length) { 61void on_nickchange(int friendnumber, uint8_t* string, uint16_t length) {
38 wprintw(prompt->window, "\n(nick) %d: %s!\n", friendnumber, string); 62 size_t i;
63
64 wprintw(prompt->window, "\n(nickchange) %d: %s!\n", friendnumber, string);
65
66 for(i=0; i<w_num; i++) {
67 if(windows[i].onNickChange != NULL)
68 windows[i].onNickChange(&windows[i], friendnumber, string, length);
69 }
39} 70}
40 71
41void on_statuschange(int friendnumber, uint8_t* string, uint16_t length) { 72void on_statuschange(int friendnumber, uint8_t* string, uint16_t length) {
42 wprintw(prompt->window, "\n(status) %d: %s!\n", friendnumber, string); 73 size_t i;
74
75 wprintw(prompt->window, "\n(statuschange) %d: %s!\n", friendnumber, string);
76
77 for(i=0; i<w_num; i++) {
78 if(windows[i].onStatusChange != NULL)
79 windows[i].onStatusChange(&windows[i], friendnumber, string, length);
80 }
81}
82
83void on_friendadded(int friendnumber) {
84 friendlist_onFriendAdded(friendnumber);
43} 85}
44// CALLBACKS END 86// CALLBACKS END
45 87
@@ -73,7 +115,7 @@ static void init_tox() {
73 m_callback_userstatus(on_statuschange); 115 m_callback_userstatus(on_statuschange);
74} 116}
75 117
76static int add_window(ToxWindow w) { 118int add_window(ToxWindow w) {
77 if(w_num == TOXWINDOWS_MAX_NUM) 119 if(w_num == TOXWINDOWS_MAX_NUM)
78 return -1; 120 return -1;
79 121
@@ -88,14 +130,22 @@ static int add_window(ToxWindow w) {
88 windows[w_num++] = w; 130 windows[w_num++] = w;
89 w.onInit(&w); 131 w.onInit(&w);
90 132
91 return w_num; 133 return w_num - 1;
134}
135
136int focus_window(int num) {
137 if(num >= w_num || num < 0)
138 return -1;
139
140 w_active = num;
141 return 0;
92} 142}
93 143
94static void init_windows() { 144static void init_windows() {
95 w_num = 0; 145 w_num = 0;
96 w_active = 0; 146 w_active = 0;
97 147
98 if(add_window(new_prompt()) == -1) { 148 if(add_window(new_prompt()) == -1 || add_window(new_friendlist()) == -1) {
99 fprintf(stderr, "add_window() failed.\n"); 149 fprintf(stderr, "add_window() failed.\n");
100 150
101 endwin(); 151 endwin();
@@ -134,14 +184,18 @@ static void load_data() {
134 184
135 if(buf == NULL) { 185 if(buf == NULL) {
136 fprintf(stderr, "malloc() failed.\n"); 186 fprintf(stderr, "malloc() failed.\n");
187
137 fclose(fd); 188 fclose(fd);
189 endwin();
138 exit(1); 190 exit(1);
139 } 191 }
140 192
141 if(fread(buf, len, 1, fd) != 1){ 193 if(fread(buf, len, 1, fd) != 1){
142 fprintf(stderr, "fread() failed.\n"); 194 fprintf(stderr, "fread() failed.\n");
195
143 free(buf); 196 free(buf);
144 fclose(fd); 197 fclose(fd);
198 endwin();
145 exit(1); 199 exit(1);
146 } 200 }
147 201
@@ -153,6 +207,7 @@ static void load_data() {
153 207
154 if(buf == NULL) { 208 if(buf == NULL) {
155 fprintf(stderr, "malloc() failed.\n"); 209 fprintf(stderr, "malloc() failed.\n");
210 endwin();
156 exit(1); 211 exit(1);
157 } 212 }
158 213
@@ -161,14 +216,18 @@ static void load_data() {
161 fd = fopen("data", "w"); 216 fd = fopen("data", "w");
162 if(fd == NULL) { 217 if(fd == NULL) {
163 fprintf(stderr, "fopen() failed.\n"); 218 fprintf(stderr, "fopen() failed.\n");
219
164 free(buf); 220 free(buf);
221 endwin();
165 exit(1); 222 exit(1);
166 } 223 }
167 224
168 if(fwrite(buf, len, 1, fd) != 1){ 225 if(fwrite(buf, len, 1, fd) != 1){
169 fprintf(stderr, "fwrite() failed.\n"); 226 fprintf(stderr, "fwrite() failed.\n");
227
170 free(buf); 228 free(buf);
171 fclose(fd); 229 fclose(fd);
230 endwin();
172 exit(1); 231 exit(1);
173 } 232 }
174 } 233 }
@@ -178,6 +237,7 @@ static void load_data() {
178} 237}
179 238
180static void draw_bar() { 239static void draw_bar() {
240 static int odd = 0;
181 size_t i; 241 size_t i;
182 242
183 attron(COLOR_PAIR(4)); 243 attron(COLOR_PAIR(4));
@@ -186,12 +246,26 @@ static void draw_bar() {
186 246
187 move(LINES - 1, 0); 247 move(LINES - 1, 0);
188 248
249 attron(COLOR_PAIR(4) | A_BOLD);
250 printw(" TOXIC 1.0 |");
251 attroff(COLOR_PAIR(4) | A_BOLD);
252
189 for(i=0; i<w_num; i++) { 253 for(i=0; i<w_num; i++) {
190 if(i == w_active) { 254 if(i == w_active) {
191 attron(A_BOLD); 255 attron(A_BOLD);
192 } 256 }
193 257
194 printw(" %s ", windows[i].title); 258 odd = (odd+1) % 2;
259
260 if(windows[i].blink && odd) {
261 attron(COLOR_PAIR(3));
262 }
263
264 printw(" %s", windows[i].title);
265
266 if(windows[i].blink && odd) {
267 attron(COLOR_PAIR(3));
268 }
195 269
196 if(i == w_active) { 270 if(i == w_active) {
197 attroff(A_BOLD); 271 attroff(A_BOLD);
@@ -201,6 +275,11 @@ static void draw_bar() {
201 refresh(); 275 refresh();
202} 276}
203 277
278void prepare_window(WINDOW* w) {
279 mvwin(w, 0, 0);
280 wresize(w, LINES-2, COLS);
281}
282
204int main(int argc, char* argv[]) { 283int main(int argc, char* argv[]) {
205 int ch; 284 int ch;
206 ToxWindow* a; 285 ToxWindow* a;
@@ -211,14 +290,22 @@ int main(int argc, char* argv[]) {
211 init_windows(); 290 init_windows();
212 291
213 while(true) { 292 while(true) {
293 // Update tox.
214 do_tox(); 294 do_tox();
215 295
296 // Draw.
216 a = &windows[w_active]; 297 a = &windows[w_active];
298 prepare_window(a->window);
299 a->blink = false;
217 a->onDraw(a); 300 a->onDraw(a);
218 draw_bar(); 301 draw_bar();
219 302
303 // Handle input.
220 ch = getch(); 304 ch = getch();
221 if(ch != ERR) { 305 if(ch == '\t') {
306 w_active = (w_active + 1) % w_num;
307 }
308 else if(ch != ERR) {
222 a->onKey(a, ch); 309 a->onKey(a, ch);
223 } 310 }
224 311