diff options
author | Astonex <softukitu@gmail.com> | 2013-07-31 23:02:09 +0100 |
---|---|---|
committer | Astonex <softukitu@gmail.com> | 2013-07-31 23:02:09 +0100 |
commit | f05aa308701f33f3bf9df022a4b376deeedef235 (patch) | |
tree | c10b8a3cca6822400853bfd3bc2c5fd1cca73f83 /testing/toxic/friendlist.c | |
parent | 8dfba27242ca23fca5de852541f2101568dbf7cb (diff) | |
parent | c558cb63f6db35bd51f2f2331e21df03105ee82a (diff) |
Merge remote-tracking branch 'ProjectTox/master'
Diffstat (limited to 'testing/toxic/friendlist.c')
-rw-r--r-- | testing/toxic/friendlist.c | 166 |
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 | |||
15 | extern int add_window(ToxWindow w); | ||
16 | extern int focus_window(int num); | ||
17 | extern ToxWindow new_chat(int friendnum); | ||
18 | |||
19 | #define MAX_FRIENDS_NUM 100 | ||
20 | |||
21 | typedef 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 | |||
28 | static friend_t friends[MAX_FRIENDS_NUM]; | ||
29 | static int num_friends = 0; | ||
30 | static int num_selected = 0; | ||
31 | |||
32 | |||
33 | void 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 | |||
50 | void 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 | |||
60 | void 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 | |||
70 | void 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 | |||
80 | int 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 | |||
95 | static 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 | |||
115 | static 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 | |||
147 | static void friendlist_onInit(ToxWindow* self) { | ||
148 | |||
149 | } | ||
150 | |||
151 | |||
152 | ToxWindow 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 | } | ||