summaryrefslogtreecommitdiff
path: root/testing/toxic/friendlist.c
diff options
context:
space:
mode:
authorAstonex <softukitu@gmail.com>2013-07-31 23:02:09 +0100
committerAstonex <softukitu@gmail.com>2013-07-31 23:02:09 +0100
commitf05aa308701f33f3bf9df022a4b376deeedef235 (patch)
treec10b8a3cca6822400853bfd3bc2c5fd1cca73f83 /testing/toxic/friendlist.c
parent8dfba27242ca23fca5de852541f2101568dbf7cb (diff)
parentc558cb63f6db35bd51f2f2331e21df03105ee82a (diff)
Merge remote-tracking branch 'ProjectTox/master'
Diffstat (limited to 'testing/toxic/friendlist.c')
-rw-r--r--testing/toxic/friendlist.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/testing/toxic/friendlist.c b/testing/toxic/friendlist.c
new file mode 100644
index 00000000..f9a413f9
--- /dev/null
+++ b/testing/toxic/friendlist.c
@@ -0,0 +1,166 @@
1/*
2 * Toxic -- Tox Curses Client
3 */
4
5#include <curses.h>
6#include <string.h>
7#include <stdint.h>
8#include <ctype.h>
9
10#include "../../core/Messenger.h"
11#include "../../core/network.h"
12
13#include "windows.h"
14
15extern int add_window(ToxWindow w);
16extern int focus_window(int num);
17extern ToxWindow new_chat(int friendnum);
18
19#define MAX_FRIENDS_NUM 100
20
21typedef struct {
22 uint8_t name[MAX_NAME_LENGTH];
23 uint8_t status[MAX_USERSTATUS_LENGTH];
24 int num;
25 int chatwin;
26} friend_t;
27
28static friend_t friends[MAX_FRIENDS_NUM];
29static int num_friends = 0;
30static int num_selected = 0;
31
32
33void fix_name(uint8_t* name) {
34
35 // Remove all non alphanumeric characters.
36 uint8_t* p = name;
37 uint8_t* q = name;
38
39 while(*p != 0) {
40 if(isprint(*p)) {
41 *q++ = *p;
42 }
43
44 p++;
45 }
46
47 *q = 0;
48}
49
50void friendlist_onMessage(ToxWindow* self, int num, uint8_t* str, uint16_t len) {
51
52 if(num >= num_friends)
53 return;
54
55 if(friends[num].chatwin == -1) {
56 friends[num].chatwin = add_window(new_chat(num));
57 }
58}
59
60void friendlist_onNickChange(ToxWindow* self, int num, uint8_t* str, uint16_t len) {
61
62 if(len >= MAX_NAME_LENGTH || num >= num_friends)
63 return;
64
65 memcpy((char*) &friends[num].name, (char*) str, len);
66 friends[num].name[len] = 0;
67 fix_name(friends[num].name);
68}
69
70void friendlist_onStatusChange(ToxWindow* self, int num, uint8_t* str, uint16_t len) {
71
72 if(len >= MAX_USERSTATUS_LENGTH || num >= num_friends)
73 return;
74
75 memcpy((char*) &friends[num].status, (char*) str, len);
76 friends[num].status[len] = 0;
77 fix_name(friends[num].status);
78}
79
80int friendlist_onFriendAdded(int num) {
81
82 if(num_friends == MAX_FRIENDS_NUM)
83 return -1;
84
85 friends[num_friends].num = num;
86 getname(num, friends[num_friends].name);
87 strcpy((char*) friends[num_friends].name, "unknown");
88 strcpy((char*) friends[num_friends].status, "unknown");
89 friends[num_friends].chatwin = -1;
90
91 num_friends++;
92 return 0;
93}
94
95static void friendlist_onKey(ToxWindow* self, int key) {
96
97 if(key == KEY_UP) {
98 if(num_selected != 0)
99 num_selected--;
100 }
101 else if(key == KEY_DOWN) {
102 if(num_friends != 0)
103 num_selected = (num_selected+1) % num_friends;
104 }
105 else if(key == '\n') {
106
107 if(friends[num_selected].chatwin != -1)
108 return;
109
110 friends[num_selected].chatwin = add_window(new_chat(num_selected));
111 focus_window(friends[num_selected].chatwin);
112 }
113}
114
115static void friendlist_onDraw(ToxWindow* self) {
116 size_t i;
117
118 wclear(self->window);
119
120 if(num_friends == 0) {
121 wprintw(self->window, "Empty. Add some friends! :-)\n");
122 }
123 else {
124 wattron(self->window, COLOR_PAIR(2) | A_BOLD);
125 wprintw(self->window, "Open chat with.. (up/down keys, enter)\n");
126 wattroff(self->window, COLOR_PAIR(2) | A_BOLD);
127 }
128
129 wprintw(self->window, "\n");
130
131 for(i=0; i<num_friends; i++) {
132
133 if(i == num_selected) wattron(self->window, COLOR_PAIR(3));
134 wprintw(self->window, " [#%d] ", friends[i].num);
135 if(i == num_selected) wattroff(self->window, COLOR_PAIR(3));
136
137 attron(A_BOLD);
138 wprintw(self->window, "%s ", friends[i].name);
139 attroff(A_BOLD);
140
141 wprintw(self->window, "(%s)\n", friends[i].status);
142 }
143
144 wrefresh(self->window);
145}
146
147static void friendlist_onInit(ToxWindow* self) {
148
149}
150
151
152ToxWindow new_friendlist() {
153 ToxWindow ret;
154
155 memset(&ret, 0, sizeof(ret));
156
157 ret.onKey = &friendlist_onKey;
158 ret.onDraw = &friendlist_onDraw;
159 ret.onInit = &friendlist_onInit;
160 ret.onMessage = &friendlist_onMessage;
161 ret.onNickChange = &friendlist_onNickChange;
162 ret.onStatusChange = &friendlist_onStatusChange;
163 strcpy(ret.title, "[friends]");
164
165 return ret;
166}