diff options
Diffstat (limited to 'testing/toxic/friendlist.c')
-rw-r--r-- | testing/toxic/friendlist.c | 142 |
1 files changed, 80 insertions, 62 deletions
diff --git a/testing/toxic/friendlist.c b/testing/toxic/friendlist.c index 05651b0e..f03914e6 100644 --- a/testing/toxic/friendlist.c +++ b/testing/toxic/friendlist.c | |||
@@ -12,54 +12,59 @@ | |||
12 | 12 | ||
13 | #include "windows.h" | 13 | #include "windows.h" |
14 | 14 | ||
15 | extern int add_window(ToxWindow w); | 15 | extern char WINDOW_STATUS[TOXWINDOWS_MAX_NUM]; |
16 | extern int focus_window(int num); | 16 | extern int add_window(ToxWindow w, int n); |
17 | extern ToxWindow new_chat(int friendnum); | 17 | extern ToxWindow new_chat(int friendnum); |
18 | 18 | ||
19 | #define MAX_FRIENDS_NUM 100 | 19 | extern int active_window; |
20 | 20 | ||
21 | typedef struct { | 21 | typedef struct { |
22 | uint8_t name[MAX_NAME_LENGTH]; | 22 | uint8_t name[MAX_NAME_LENGTH]; |
23 | uint8_t status[MAX_USERSTATUS_LENGTH]; | 23 | uint8_t status[MAX_USERSTATUS_LENGTH]; |
24 | int num; | 24 | int num; |
25 | int chatwin; | 25 | int chatwin; |
26 | } friend_t; | 26 | } friend_t; |
27 | 27 | ||
28 | static friend_t friends[MAX_FRIENDS_NUM]; | 28 | static friend_t friends[MAX_FRIENDS_NUM]; |
29 | static int num_friends = 0; | 29 | static int num_friends = 0; |
30 | static int num_selected = 0; | 30 | static int num_selected = 0; |
31 | 31 | ||
32 | 32 | void fix_name(uint8_t *name) | |
33 | void fix_name(uint8_t* name) { | 33 | { |
34 | 34 | /* Remove all non alphanumeric characters */ | |
35 | // Remove all non alphanumeric characters. | 35 | uint8_t *p = name; |
36 | uint8_t* p = name; | 36 | uint8_t *q = name; |
37 | uint8_t* q = name; | ||
38 | |||
39 | while(*p != 0) { | 37 | while(*p != 0) { |
40 | if(isprint(*p)) { | 38 | if (isprint(*p)) |
41 | *q++ = *p; | 39 | *q++ = *p; |
42 | } | ||
43 | |||
44 | p++; | 40 | p++; |
45 | } | 41 | } |
46 | |||
47 | *q = 0; | 42 | *q = 0; |
48 | } | 43 | } |
49 | 44 | ||
50 | void friendlist_onMessage(ToxWindow* self, int num, uint8_t* str, uint16_t len) { | 45 | void friendlist_onMessage(ToxWindow *self, int num, uint8_t *str, uint16_t len) |
51 | 46 | { | |
52 | if(num >= num_friends) | 47 | if (num >= num_friends) |
53 | return; | 48 | return; |
54 | 49 | ||
55 | if(friends[num].chatwin == -1) { | 50 | if (friends[num].chatwin == -1) { |
56 | friends[num].chatwin = add_window(new_chat(num)); | 51 | friends[num].chatwin = num; |
52 | int i; | ||
53 | /* Find first open slot to hold chat window */ | ||
54 | for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { | ||
55 | if (WINDOW_STATUS[i] == -1) { | ||
56 | WINDOW_STATUS[i] = num; | ||
57 | add_window(new_chat(num), i); | ||
58 | active_window = i; | ||
59 | break; | ||
60 | } | ||
61 | } | ||
57 | } | 62 | } |
58 | } | 63 | } |
59 | 64 | ||
60 | void friendlist_onNickChange(ToxWindow* self, int num, uint8_t* str, uint16_t len) { | 65 | void friendlist_onNickChange(ToxWindow *self, int num, uint8_t *str, uint16_t len) |
61 | 66 | { | |
62 | if(len >= MAX_NAME_LENGTH || num >= num_friends) | 67 | if (len >= MAX_NAME_LENGTH || num >= num_friends) |
63 | return; | 68 | return; |
64 | 69 | ||
65 | memcpy((char*) &friends[num].name, (char*) str, len); | 70 | memcpy((char*) &friends[num].name, (char*) str, len); |
@@ -67,9 +72,9 @@ void friendlist_onNickChange(ToxWindow* self, int num, uint8_t* str, uint16_t le | |||
67 | fix_name(friends[num].name); | 72 | fix_name(friends[num].name); |
68 | } | 73 | } |
69 | 74 | ||
70 | void friendlist_onStatusChange(ToxWindow* self, int num, uint8_t* str, uint16_t len) { | 75 | void friendlist_onStatusChange(ToxWindow *self, int num, uint8_t *str, uint16_t len) |
71 | 76 | { | |
72 | if(len >= MAX_USERSTATUS_LENGTH || num >= num_friends) | 77 | if (len >= MAX_USERSTATUS_LENGTH || num >= num_friends) |
73 | return; | 78 | return; |
74 | 79 | ||
75 | memcpy((char*) &friends[num].status, (char*) str, len); | 80 | memcpy((char*) &friends[num].status, (char*) str, len); |
@@ -77,48 +82,59 @@ void friendlist_onStatusChange(ToxWindow* self, int num, uint8_t* str, uint16_t | |||
77 | fix_name(friends[num].status); | 82 | fix_name(friends[num].status); |
78 | } | 83 | } |
79 | 84 | ||
80 | int friendlist_onFriendAdded(int num) { | 85 | int friendlist_onFriendAdded(int num) |
81 | 86 | { | |
82 | if(num_friends == MAX_FRIENDS_NUM) | 87 | if (num_friends == MAX_FRIENDS_NUM) |
83 | return -1; | 88 | return -1; |
84 | 89 | ||
85 | friends[num_friends].num = num; | 90 | friends[num_friends].num = num; |
86 | getname(num, friends[num_friends].name); | 91 | getname(num, friends[num_friends].name); |
87 | strcpy((char*) friends[num_friends].name, "unknown"); | 92 | strcpy((char*) friends[num_friends].name, "unknown"); |
88 | strcpy((char*) friends[num_friends].status, "unknown"); | 93 | strcpy((char*) friends[num_friends].status, "unknown"); |
89 | friends[num_friends].chatwin = -1; | 94 | friends[num_friends++].chatwin = -1; |
90 | |||
91 | num_friends++; | ||
92 | return 0; | 95 | return 0; |
93 | } | 96 | } |
94 | 97 | ||
95 | static void friendlist_onKey(ToxWindow* self, int key) { | 98 | static void friendlist_onKey(ToxWindow *self, int key) |
96 | 99 | { | |
97 | if(key == KEY_UP) { | 100 | if (key == KEY_UP) { |
98 | if(num_selected != 0) | 101 | if (--num_selected < 0) |
99 | num_selected--; | 102 | num_selected = num_friends-1; |
100 | } | 103 | } |
101 | else if(key == KEY_DOWN) { | 104 | else if (key == KEY_DOWN) { |
102 | if(num_friends != 0) | 105 | if (num_friends != 0) |
103 | num_selected = (num_selected+1) % num_friends; | 106 | num_selected = (num_selected+1) % num_friends; |
104 | } | 107 | } |
105 | else if(key == '\n') { | 108 | else if (key == '\n') { |
106 | 109 | /* Jump to chat window if already open */ | |
107 | if(friends[num_selected].chatwin != -1) | 110 | if (friends[num_selected].chatwin != -1) { |
108 | return; | 111 | int i; |
109 | 112 | for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { | |
110 | friends[num_selected].chatwin = add_window(new_chat(num_selected)); | 113 | if (WINDOW_STATUS[i] == num_selected) { |
111 | focus_window(friends[num_selected].chatwin); | 114 | active_window = i; |
115 | break; | ||
116 | } | ||
117 | } | ||
118 | }else { | ||
119 | int i; | ||
120 | for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { | ||
121 | if (WINDOW_STATUS[i] == -1) { | ||
122 | WINDOW_STATUS[i] = num_selected; | ||
123 | friends[num_selected].chatwin = num_selected; | ||
124 | add_window(new_chat(num_selected), i); | ||
125 | active_window = i; | ||
126 | break; | ||
127 | } | ||
128 | } | ||
129 | } | ||
112 | } | 130 | } |
113 | } | 131 | } |
114 | 132 | ||
115 | static void friendlist_onDraw(ToxWindow* self) { | 133 | static void friendlist_onDraw(ToxWindow *self) |
134 | { | ||
116 | curs_set(0); | 135 | curs_set(0); |
117 | size_t i; | ||
118 | |||
119 | werase(self->window); | 136 | werase(self->window); |
120 | 137 | if (num_friends == 0) { | |
121 | if(num_friends == 0) { | ||
122 | wprintw(self->window, "Empty. Add some friends! :-)\n"); | 138 | wprintw(self->window, "Empty. Add some friends! :-)\n"); |
123 | } | 139 | } |
124 | else { | 140 | else { |
@@ -128,12 +144,11 @@ static void friendlist_onDraw(ToxWindow* self) { | |||
128 | } | 144 | } |
129 | 145 | ||
130 | wprintw(self->window, "\n"); | 146 | wprintw(self->window, "\n"); |
131 | 147 | int i; | |
132 | for(i=0; i<num_friends; i++) { | 148 | for (i = 0; i < num_friends; ++i) { |
133 | 149 | if (i == num_selected) wattron(self->window, COLOR_PAIR(3)); | |
134 | if(i == num_selected) wattron(self->window, COLOR_PAIR(3)); | ||
135 | wprintw(self->window, " [#%d] ", friends[i].num); | 150 | wprintw(self->window, " [#%d] ", friends[i].num); |
136 | if(i == num_selected) wattroff(self->window, COLOR_PAIR(3)); | 151 | if (i == num_selected) wattroff(self->window, COLOR_PAIR(3)); |
137 | 152 | ||
138 | attron(A_BOLD); | 153 | attron(A_BOLD); |
139 | wprintw(self->window, "%s ", friends[i].name); | 154 | wprintw(self->window, "%s ", friends[i].name); |
@@ -141,18 +156,21 @@ static void friendlist_onDraw(ToxWindow* self) { | |||
141 | 156 | ||
142 | wprintw(self->window, "(%s)\n", friends[i].status); | 157 | wprintw(self->window, "(%s)\n", friends[i].status); |
143 | } | 158 | } |
144 | |||
145 | wrefresh(self->window); | 159 | wrefresh(self->window); |
146 | } | 160 | } |
147 | 161 | ||
148 | static void friendlist_onInit(ToxWindow* self) { | 162 | void disable_chatwin(int f_num) |
149 | 163 | { | |
164 | friends[f_num].chatwin = -1; | ||
150 | } | 165 | } |
151 | 166 | ||
167 | static void friendlist_onInit(ToxWindow *self) | ||
168 | { | ||
169 | |||
170 | } | ||
152 | 171 | ||
153 | ToxWindow new_friendlist() { | 172 | ToxWindow new_friendlist() { |
154 | ToxWindow ret; | 173 | ToxWindow ret; |
155 | |||
156 | memset(&ret, 0, sizeof(ret)); | 174 | memset(&ret, 0, sizeof(ret)); |
157 | 175 | ||
158 | ret.onKey = &friendlist_onKey; | 176 | ret.onKey = &friendlist_onKey; |
@@ -161,7 +179,7 @@ ToxWindow new_friendlist() { | |||
161 | ret.onMessage = &friendlist_onMessage; | 179 | ret.onMessage = &friendlist_onMessage; |
162 | ret.onNickChange = &friendlist_onNickChange; | 180 | ret.onNickChange = &friendlist_onNickChange; |
163 | ret.onStatusChange = &friendlist_onStatusChange; | 181 | ret.onStatusChange = &friendlist_onStatusChange; |
164 | strcpy(ret.title, "[friends]"); | ||
165 | 182 | ||
183 | strcpy(ret.title, "[friends]"); | ||
166 | return ret; | 184 | return ret; |
167 | } | 185 | } |