toxic: Made everything 1000x more userfriendly.

This commit is contained in:
plutooo 2013-07-31 11:20:16 -07:00
parent 2247b7fad5
commit 0815d1110d
5 changed files with 79 additions and 24 deletions

View File

@ -1,3 +1,7 @@
/*
* Toxic -- Tox Curses Client
*/
#include <curses.h> #include <curses.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -38,7 +42,13 @@ static void chat_onMessage(ToxWindow* self, int num, uint8_t* msg, uint16_t len)
fix_name(msg); fix_name(msg);
fix_name(nick); fix_name(nick);
wprintw(ctx->history, "%s: %s\n", nick, msg); wattron(ctx->history, COLOR_PAIR(4));
wprintw(ctx->history, "%s: ", nick);
wattroff(ctx->history, COLOR_PAIR(4));
wprintw(ctx->history, "%s\n", msg);
self->blink = true;
} }
static void chat_onNickChange(ToxWindow* self, int num, uint8_t* nick, uint16_t len) { static void chat_onNickChange(ToxWindow* self, int num, uint8_t* nick, uint16_t len) {
@ -70,15 +80,27 @@ static void chat_onKey(ToxWindow* self, int key) {
} }
} }
else if(key == '\n') { else if(key == '\n') {
wprintw(ctx->history, "you: %s\n", ctx->line); wattron(ctx->history, COLOR_PAIR(1));
wprintw(ctx->history, "you: ", ctx->line);
wattroff(ctx->history, COLOR_PAIR(1));
wprintw(ctx->history, "%s\n", ctx->line);
if(m_sendmessage(ctx->friendnum, (uint8_t*) ctx->line, strlen(ctx->line)+1) < 0) { if(m_sendmessage(ctx->friendnum, (uint8_t*) ctx->line, strlen(ctx->line)+1) < 0) {
wattron(ctx->history, COLOR_PAIR(3));
wprintw(ctx->history, " * Failed to send message.\n"); wprintw(ctx->history, " * Failed to send message.\n");
wattroff(ctx->history, COLOR_PAIR(3));
} }
ctx->line[0] = '\0'; ctx->line[0] = '\0';
ctx->pos = 0; ctx->pos = 0;
} }
else if(key == 0x107) {
if(ctx->pos != 0) {
ctx->line[--ctx->pos] = '\0';
}
}
} }
static void chat_onDraw(ToxWindow* self) { static void chat_onDraw(ToxWindow* self) {
@ -105,7 +127,6 @@ static void chat_onInit(ToxWindow* self) {
getmaxyx(self->window, y, x); getmaxyx(self->window, y, x);
ctx->history = subwin(self->window, y - 4, x, 0, 0); ctx->history = subwin(self->window, y - 4, x, 0, 0);
wprintw(ctx->history, "Here goes chat\n");
scrollok(ctx->history, 1); scrollok(ctx->history, 1);
ctx->linewin = subwin(self->window, 2, x, y - 3, 0); ctx->linewin = subwin(self->window, 2, x, y - 3, 0);

View File

@ -22,7 +22,7 @@ typedef struct {
uint8_t name[MAX_NAME_LENGTH]; uint8_t name[MAX_NAME_LENGTH];
uint8_t status[MAX_USERSTATUS_LENGTH]; uint8_t status[MAX_USERSTATUS_LENGTH];
int num; int num;
int chatwin;
} friend_t; } friend_t;
static friend_t friends[MAX_FRIENDS_NUM]; static friend_t friends[MAX_FRIENDS_NUM];
@ -37,7 +37,7 @@ void fix_name(uint8_t* name) {
uint8_t* q = name; uint8_t* q = name;
while(*p != 0) { while(*p != 0) {
if(isalnum(*p)) { if(isprint(*p)) {
*q++ = *p; *q++ = *p;
} }
@ -47,6 +47,16 @@ void fix_name(uint8_t* name) {
*q = 0; *q = 0;
} }
void friendlist_onMessage(ToxWindow* self, int num, uint8_t* str, uint16_t len) {
if(num >= num_friends)
return;
if(friends[num].chatwin == -1) {
friends[num].chatwin = add_window(new_chat(num));
}
}
void friendlist_onNickChange(ToxWindow* self, int num, uint8_t* str, uint16_t len) { void friendlist_onNickChange(ToxWindow* self, int num, uint8_t* str, uint16_t len) {
if(len >= MAX_NAME_LENGTH || num >= num_friends) if(len >= MAX_NAME_LENGTH || num >= num_friends)
@ -55,8 +65,6 @@ void friendlist_onNickChange(ToxWindow* self, int num, uint8_t* str, uint16_t le
memcpy((char*) &friends[num].name, (char*) str, len); memcpy((char*) &friends[num].name, (char*) str, len);
friends[num].name[len] = 0; friends[num].name[len] = 0;
fix_name(friends[num].name); fix_name(friends[num].name);
return;
} }
void friendlist_onStatusChange(ToxWindow* self, int num, uint8_t* str, uint16_t len) { void friendlist_onStatusChange(ToxWindow* self, int num, uint8_t* str, uint16_t len) {
@ -67,8 +75,6 @@ void friendlist_onStatusChange(ToxWindow* self, int num, uint8_t* str, uint16_t
memcpy((char*) &friends[num].status, (char*) str, len); memcpy((char*) &friends[num].status, (char*) str, len);
friends[num].status[len] = 0; friends[num].status[len] = 0;
fix_name(friends[num].status); fix_name(friends[num].status);
return;
} }
int friendlist_onFriendAdded(int num) { int friendlist_onFriendAdded(int num) {
@ -80,6 +86,7 @@ int friendlist_onFriendAdded(int num) {
getname(num, friends[num_friends].name); getname(num, friends[num_friends].name);
strcpy((char*) friends[num_friends].name, "unknown"); strcpy((char*) friends[num_friends].name, "unknown");
strcpy((char*) friends[num_friends].status, "unknown"); strcpy((char*) friends[num_friends].status, "unknown");
friends[num_friends].chatwin = -1;
num_friends++; num_friends++;
return 0; return 0;
@ -96,7 +103,12 @@ static void friendlist_onKey(ToxWindow* self, int key) {
num_selected = (num_selected+1) % num_friends; num_selected = (num_selected+1) % num_friends;
} }
else if(key == '\n') { else if(key == '\n') {
focus_window(add_window(new_chat(num_selected)));
if(friends[num_selected].chatwin != -1)
return;
friends[num_selected].chatwin = add_window(new_chat(num_selected));
focus_window(friends[num_selected].chatwin);
} }
} }
@ -110,12 +122,8 @@ static void friendlist_onDraw(ToxWindow* self) {
} }
else { else {
wattron(self->window, COLOR_PAIR(2) | A_BOLD); wattron(self->window, COLOR_PAIR(2) | A_BOLD);
wprintw(self->window, "Friend list:\n"); wprintw(self->window, "Open chat with.. (up/down keys, enter)\n");
wattroff(self->window, A_BOLD); wattroff(self->window, COLOR_PAIR(2) | A_BOLD);
wprintw(self->window, " ENTER: start a chat\n");
wprintw(self->window, " UP/DOWN: navigate list\n");
wattroff(self->window, COLOR_PAIR(2));
} }
wprintw(self->window, "\n"); wprintw(self->window, "\n");
@ -123,7 +131,7 @@ static void friendlist_onDraw(ToxWindow* self) {
for(i=0; i<num_friends; i++) { for(i=0; i<num_friends; i++) {
if(i == num_selected) wattron(self->window, COLOR_PAIR(3)); if(i == num_selected) wattron(self->window, COLOR_PAIR(3));
wprintw(self->window, " [%d] ", friends[i].num); wprintw(self->window, " [#%d] ", friends[i].num);
if(i == num_selected) wattroff(self->window, COLOR_PAIR(3)); if(i == num_selected) wattroff(self->window, COLOR_PAIR(3));
attron(A_BOLD); attron(A_BOLD);
@ -149,6 +157,7 @@ ToxWindow new_friendlist() {
ret.onKey = &friendlist_onKey; ret.onKey = &friendlist_onKey;
ret.onDraw = &friendlist_onDraw; ret.onDraw = &friendlist_onDraw;
ret.onInit = &friendlist_onInit; ret.onInit = &friendlist_onInit;
ret.onMessage = &friendlist_onMessage;
ret.onNickChange = &friendlist_onNickChange; ret.onNickChange = &friendlist_onNickChange;
ret.onStatusChange = &friendlist_onStatusChange; ret.onStatusChange = &friendlist_onStatusChange;
strcpy(ret.title, "[friends]"); strcpy(ret.title, "[friends]");

View File

@ -32,7 +32,14 @@ void on_request(uint8_t* public_key, uint8_t* data, uint16_t length) {
size_t i; size_t i;
int n = add_req(public_key); int n = add_req(public_key);
wprintw(prompt->window, "\nFriend request.\nUse \"accept %d\" to accept it.\n", n); wprintw(prompt->window, "\nFriend request from:\n");
for(i=0; i<32; i++) {
wprintw(prompt->window, "%02x", public_key[i] & 0xff);
}
wprintw(prompt->window, "\n");
wprintw(prompt->window, "Use \"accept %d\" to accept it.\n", n);
for(i=0; i<w_num; i++) { for(i=0; i<w_num; i++) {
if(windows[i].onFriendRequest != NULL) if(windows[i].onFriendRequest != NULL)
@ -230,6 +237,7 @@ static void load_data() {
} }
static void draw_bar() { static void draw_bar() {
static int odd = 0;
size_t i; size_t i;
attron(COLOR_PAIR(4)); attron(COLOR_PAIR(4));
@ -238,17 +246,27 @@ static void draw_bar() {
move(LINES - 1, 0); move(LINES - 1, 0);
attron(COLOR_PAIR(3) | A_BOLD); attron(COLOR_PAIR(4) | A_BOLD);
printw(" TOXIC 1.0 |"); printw(" TOXIC 1.0 |");
attroff(COLOR_PAIR(3) | A_BOLD); attroff(COLOR_PAIR(4) | A_BOLD);
for(i=0; i<w_num; i++) { for(i=0; i<w_num; i++) {
if(i == w_active) { if(i == w_active) {
attron(A_BOLD); attron(A_BOLD);
} }
odd = (odd+1) % 2;
if(windows[i].blink && odd) {
attron(COLOR_PAIR(3));
}
printw(" %s", windows[i].title); printw(" %s", windows[i].title);
if(windows[i].blink && odd) {
attron(COLOR_PAIR(3));
}
if(i == w_active) { if(i == w_active) {
attroff(A_BOLD); attroff(A_BOLD);
} }
@ -278,6 +296,7 @@ int main(int argc, char* argv[]) {
// Draw. // Draw.
a = &windows[w_active]; a = &windows[w_active];
prepare_window(a->window); prepare_window(a->window);
a->blink = false;
a->onDraw(a); a->onDraw(a);
draw_bar(); draw_bar();

View File

@ -42,7 +42,7 @@ static int prompt_buf_pos=0;
static void execute(ToxWindow* self, char* cmd) { static void execute(ToxWindow* self, char* cmd) {
if(!strcmp(cmd, "quit") || !strcmp(cmd, "exit")) { if(!strcmp(cmd, "quit") || !strcmp(cmd, "exit") || !strcmp(cmd, "q")) {
endwin(); endwin();
exit(0); exit(0);
} }
@ -282,12 +282,11 @@ static void prompt_onDraw(ToxWindow* self) {
static void print_usage(ToxWindow* self) { static void print_usage(ToxWindow* self) {
wattron(self->window, COLOR_PAIR(2) | A_BOLD); wattron(self->window, COLOR_PAIR(2) | A_BOLD);
wprintw(self->window, "Usage:\n"); wprintw(self->window, "Commands:\n");
wattroff(self->window, A_BOLD); wattroff(self->window, A_BOLD);
wprintw(self->window, " connect <ip> <port> <key> : Connect to DHT server\n"); wprintw(self->window, " connect <ip> <port> <key> : Connect to DHT server\n");
wprintw(self->window, " add <id> <message> : Add friend\n"); wprintw(self->window, " add <id> <message> : Add friend\n");
wprintw(self->window, " msg <number> <message> : Send message\n");
wprintw(self->window, " status <message> : Set your status\n"); wprintw(self->window, " status <message> : Set your status\n");
wprintw(self->window, " nick <nickname> : Set your nickname\n"); wprintw(self->window, " nick <nickname> : Set your nickname\n");
wprintw(self->window, " accept <number> : Accept friend request\n"); wprintw(self->window, " accept <number> : Accept friend request\n");
@ -296,7 +295,7 @@ static void print_usage(ToxWindow* self) {
wattron(self->window, A_BOLD); wattron(self->window, A_BOLD);
wprintw(self->window, "Use the TAB key to navigate through the tabs.\n"); wprintw(self->window, "TIP: Use the TAB key to navigate through the tabs.\n\n");
wattroff(self->window, A_BOLD); wattroff(self->window, A_BOLD);
wattroff(self->window, COLOR_PAIR(2)); wattroff(self->window, COLOR_PAIR(2));

View File

@ -1,3 +1,9 @@
/*
* Toxic -- Tox Curses Client
*/
#include <stdbool.h>
typedef struct ToxWindow_ ToxWindow; typedef struct ToxWindow_ ToxWindow;
struct ToxWindow_ { struct ToxWindow_ {
@ -11,6 +17,7 @@ struct ToxWindow_ {
char title[256]; char title[256];
void* x; void* x;
bool blink;
WINDOW* window; WINDOW* window;
}; };