From 31a2e648c5c44fdeb7d81b91367a3a9a02893ad2 Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Wed, 11 Jun 2014 18:47:18 -0400 Subject: [PATCH] code cleanup --- src/main.c | 651 -------------------------------------------- src/misc_tools.c | 7 +- src/settings.c | 2 +- src/toxic.c | 35 +-- src/toxic_windows.h | 260 ------------------ src/windows.c | 33 ++- 6 files changed, 37 insertions(+), 951 deletions(-) delete mode 100644 src/main.c delete mode 100644 src/toxic_windows.h diff --git a/src/main.c b/src/main.c deleted file mode 100644 index f979c4f..0000000 --- a/src/main.c +++ /dev/null @@ -1,651 +0,0 @@ -/* main.c - * - * - * Copyright (C) 2014 Toxic All Rights Reserved. - * - * This file is part of Toxic. - * - * Toxic is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Toxic is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Toxic. If not, see . - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifndef SIGWINCH -#define SIGWINCH 28 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "configdir.h" -#include "toxic_windows.h" -#include "friendlist.h" -#include "prompt.h" -#include "misc_tools.h" -#include "file_senders.h" -#include "line_info.h" -#include "settings.h" - -#ifdef _SUPPORT_AUDIO -#include "audio_call.h" -#endif /* _SUPPORT_AUDIO */ - -#ifndef PACKAGE_DATADIR -#define PACKAGE_DATADIR "." -#endif - -#ifdef _SUPPORT_AUDIO -ToxAv *av; -#endif /* _SUPPORT_AUDIO */ - -/* Export for use in Callbacks */ -char *DATA_FILE = NULL; -ToxWindow *prompt = NULL; - -struct arg_opts { - int ignore_data_file; - int use_ipv4; - char config_path[MAX_STR_SIZE]; - char nodes_path[MAX_STR_SIZE]; -} arg_opts; - -struct _Winthread Winthread; -struct user_settings *user_settings = NULL; - -void on_window_resize(int sig) -{ - refresh(); - clear(); -} - -static void init_term(void) -{ - /* Setup terminal */ - signal(SIGWINCH, on_window_resize); -#if HAVE_WIDECHAR - - if (setlocale(LC_ALL, "") == NULL) { - fprintf(stderr, "Could not set your locale, plese check your locale settings or" - "disable wide char support\n"); - exit(EXIT_FAILURE); - } - -#endif - initscr(); - cbreak(); - keypad(stdscr, 1); - noecho(); - timeout(100); - - if (has_colors()) { - short bg_color = COLOR_BLACK; - start_color(); - - if (user_settings->colour_theme == NATIVE_COLS) { - if (assume_default_colors(-1, -1) == OK) - bg_color = -1; - } - - init_pair(0, COLOR_WHITE, COLOR_BLACK); - init_pair(1, COLOR_GREEN, bg_color); - init_pair(2, COLOR_CYAN, bg_color); - init_pair(3, COLOR_RED, bg_color); - init_pair(4, COLOR_BLUE, bg_color); - init_pair(5, COLOR_YELLOW, bg_color); - init_pair(6, COLOR_MAGENTA, bg_color); - init_pair(7, COLOR_BLACK, COLOR_BLACK); - init_pair(8, COLOR_BLACK, COLOR_WHITE); - } - - refresh(); -} - -static Tox *init_tox(int ipv4) -{ - /* Init core */ - int ipv6 = !ipv4; - Tox *m = tox_new(ipv6); - - /* - * TOX_ENABLE_IPV6_DEFAULT is always 1. - * Checking it is redundant, this *should* be doing ipv4 fallback - */ - if (ipv6 && m == NULL) { - fprintf(stderr, "IPv6 didn't initialize, trying IPv4\n"); - m = tox_new(0); - } - - if (ipv4) - fprintf(stderr, "Forcing IPv4 connection\n"); - - if (m == NULL) - return NULL; - - /* Callbacks */ - tox_callback_connection_status(m, on_connectionchange, NULL); - tox_callback_typing_change(m, on_typing_change, NULL); - tox_callback_friend_request(m, on_request, NULL); - tox_callback_friend_message(m, on_message, NULL); - tox_callback_name_change(m, on_nickchange, NULL); - tox_callback_user_status(m, on_statuschange, NULL); - tox_callback_status_message(m, on_statusmessagechange, NULL); - tox_callback_friend_action(m, on_action, NULL); - tox_callback_group_invite(m, on_groupinvite, NULL); - tox_callback_group_message(m, on_groupmessage, NULL); - tox_callback_group_action(m, on_groupaction, NULL); - tox_callback_group_namelist_change(m, on_group_namelistchange, NULL); - tox_callback_file_send_request(m, on_file_sendrequest, NULL); - tox_callback_file_control(m, on_file_control, NULL); - tox_callback_file_data(m, on_file_data, NULL); - -#ifdef __linux__ - tox_set_name(m, (uint8_t *) "Cool dude", strlen("Cool dude")); -#elif defined(__FreeBSD__) - tox_set_name(m, (uint8_t *) "Nerd", strlen("Nerd")); -#elif defined(__APPLE__) - tox_set_name(m, (uint8_t *) "Hipster", strlen("Hipster")); /* This used to users of other Unixes are hipsters */ -#else - tox_set_name(m, (uint8_t *) "Registered Minix user #4", strlen("Registered Minix user #4")); -#endif - - return m; -} - -#define MINLINE 50 /* IP: 7 + port: 5 + key: 38 + spaces: 2 = 70. ! (& e.g. tox.im = 6) */ -#define MAXLINE 256 /* Approx max number of chars in a sever line (name + port + key) */ -#define MAXNODES 50 -#define NODELEN (MAXLINE - TOX_CLIENT_ID_SIZE - 7) - -static int linecnt = 0; -static char nodes[MAXNODES][NODELEN]; -static uint16_t ports[MAXNODES]; -static uint8_t keys[MAXNODES][TOX_CLIENT_ID_SIZE]; - -static int nodelist_load(char *filename) -{ - if (!filename) - return 1; - - FILE *fp = fopen(filename, "r"); - - if (fp == NULL) - return 1; - - char line[MAXLINE]; - - while (fgets(line, sizeof(line), fp) && linecnt < MAXNODES) { - if (strlen(line) > MINLINE) { - char *name = strtok(line, " "); - char *port = strtok(NULL, " "); - char *key_ascii = strtok(NULL, " "); - - /* invalid line */ - if (name == NULL || port == NULL || key_ascii == NULL) - continue; - - snprintf(nodes[linecnt], sizeof(nodes[linecnt]), "%s", name); - nodes[linecnt][NODELEN - 1] = 0; - ports[linecnt] = htons(atoi(port)); - - uint8_t *key_binary = hex_string_to_bin(key_ascii); - memcpy(keys[linecnt], key_binary, TOX_CLIENT_ID_SIZE); - free(key_binary); - - linecnt++; - } - } - - if (linecnt < 1) { - fclose(fp); - return 2; - } - - fclose(fp); - return 0; -} - -int init_connection_helper(Tox *m, int line) -{ - return tox_bootstrap_from_address(m, nodes[line], TOX_ENABLE_IPV6_DEFAULT, - ports[line], keys[line]); -} - -/* Connects to a random DHT node listed in the DHTnodes file - * - * return codes: - * 1: failed to open node file - * 2: no line of sufficient length in node file - * 3: failed to resolve name to IP - * 4: nodelist file contains no acceptable line - */ -static bool srvlist_loaded = false; - -#define NUM_INIT_NODES 5 - -int init_connection(Tox *m) -{ - if (linecnt > 0) /* already loaded nodelist */ - return init_connection_helper(m, rand() % linecnt) ? 0 : 3; - - /* only once: - * - load the nodelist - * - connect to "everyone" inside - */ - if (!srvlist_loaded) { - srvlist_loaded = true; - int res; - - if (!arg_opts.nodes_path[0]) - res = nodelist_load(PACKAGE_DATADIR "/DHTnodes"); - else - res = nodelist_load(arg_opts.nodes_path); - - if (linecnt < 1) - return res; - - res = 3; - int i; - int n = MIN(NUM_INIT_NODES, linecnt); - - for (i = 0; i < n; ++i) { - if (init_connection_helper(m, rand() % linecnt)) - res = 0; - } - - return res; - } - - /* empty nodelist file */ - return 4; -} - -static void do_connection(Tox *m, ToxWindow *prompt) -{ - uint8_t msg[MAX_STR_SIZE] = {0}; - - static int conn_try = 0; - static int conn_err = 0; - static bool dht_on = false; - - bool is_connected = tox_isconnected(m); - - if (!dht_on && !is_connected && !(conn_try++ % 100)) { - if (!conn_err) { - if ((conn_err = init_connection(m))) { - snprintf(msg, sizeof(msg), "\nAuto-connect failed with error code %d", conn_err); - } - } - } else if (!dht_on && is_connected) { - dht_on = true; - prompt_update_connectionstatus(prompt, dht_on); - snprintf(msg, sizeof(msg), "DHT connected."); - } else if (dht_on && !is_connected) { - dht_on = false; - prompt_update_connectionstatus(prompt, dht_on); - snprintf(msg, sizeof(msg), "\nDHT disconnected. Attempting to reconnect."); - } - - if (msg[0]) - line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); -} - -static void load_friendlist(Tox *m) -{ - uint32_t i; - uint32_t numfriends = tox_count_friendlist(m); - - for (i = 0; i < numfriends; ++i) - friendlist_onFriendAdded(NULL, m, i, false); -} - -/* - * Store Messenger to given location - * Return 0 stored successfully - * Return 1 file path is NULL - * Return 2 malloc failed - * Return 3 opening path failed - * Return 4 fwrite failed - */ -int store_data(Tox *m, char *path) -{ - if (arg_opts.ignore_data_file) - return 0; - - if (path == NULL) - return 1; - - FILE *fd; - size_t len; - uint8_t *buf; - - len = tox_size(m); - buf = malloc(len); - - if (buf == NULL) - return 2; - - tox_save(m, buf); - - fd = fopen(path, "wb"); - - if (fd == NULL) { - free(buf); - return 3; - } - - if (fwrite(buf, len, 1, fd) != 1) { - free(buf); - fclose(fd); - return 4; - } - - free(buf); - fclose(fd); - return 0; -} - -static void load_data(Tox *m, char *path) -{ - if (arg_opts.ignore_data_file) - return; - - FILE *fd; - size_t len; - uint8_t *buf; - - if ((fd = fopen(path, "rb")) != NULL) { - fseek(fd, 0, SEEK_END); - len = ftell(fd); - fseek(fd, 0, SEEK_SET); - - buf = malloc(len); - - if (buf == NULL) { - fclose(fd); - endwin(); - fprintf(stderr, "malloc() failed. Aborting...\n"); - exit(EXIT_FAILURE); - } - - if (fread(buf, len, 1, fd) != 1) { - free(buf); - fclose(fd); - endwin(); - fprintf(stderr, "fread() failed. Aborting...\n"); - exit(EXIT_FAILURE); - } - - tox_load(m, buf, len); - load_friendlist(m); - - free(buf); - fclose(fd); - } else { - int st; - - if ((st = store_data(m, path)) != 0) { - endwin(); - fprintf(stderr, "Store messenger failed with return code: %d\n", st); - exit(EXIT_FAILURE); - } - } -} - -void exit_toxic(Tox *m) -{ - store_data(m, DATA_FILE); - close_all_file_senders(); - kill_all_windows(); - log_disable(prompt->chatwin->log); - line_info_cleanup(prompt->chatwin->hst); - free(DATA_FILE); - free(prompt->stb); - free(prompt->chatwin->log); - free(prompt->chatwin->hst); - free(prompt->chatwin); - free(user_settings); -#ifdef _SUPPORT_AUDIO - terminate_audio(); -#endif /* _SUPPORT_AUDIO */ - tox_kill(m); - endwin(); - exit(EXIT_SUCCESS); -} - -static void do_toxic(Tox *m, ToxWindow *prompt) -{ - pthread_mutex_lock(&Winthread.lock); - - do_connection(m, prompt); - do_file_senders(m); - - /* main tox-core loop */ - tox_do(m); - - pthread_mutex_unlock(&Winthread.lock); -} - -void *thread_winref(void *data) -{ - Tox *m = (Tox *) data; - - while (true) { - draw_active_window(m); - refresh_inactive_windows(); - } -} - -static void print_usage(void) -{ - fprintf(stderr, "usage: toxic [OPTION] [FILE ...]\n"); - fprintf(stderr, " -f, --file Use specified data file\n"); - fprintf(stderr, " -x, --nodata Ignore data file\n"); - fprintf(stderr, " -4, --ipv4 Force IPv4 connection\n"); - fprintf(stderr, " -c, --config Use specified config file\n"); - fprintf(stderr, " -n, --nodes Use specified DHTnodes file\n"); - fprintf(stderr, " -h, --help Show this message and exit\n"); -} - -static void set_default_opts(void) -{ - arg_opts.use_ipv4 = 0; - arg_opts.ignore_data_file = 0; -} - -static void parse_args(int argc, char *argv[]) -{ - set_default_opts(); - - const char *opts_str = "4xf:c:n:h"; - int opt, indexptr; - - while (true) { - static struct option long_opts[] = { - {"file", required_argument, 0, 'f'}, - {"nodata", no_argument, 0, 'x'}, - {"ipv4", no_argument, 0, '4'}, - {"config", required_argument, 0, 'c'}, - {"nodes", required_argument, 0, 'n'}, - {"help", no_argument, 0, 'h'}, - }; - - opt = getopt_long(argc, argv, opts_str, long_opts, &indexptr); - - if (opt == -1) - break; - - switch (opt) { - case 'f': - DATA_FILE = strdup(optarg); - break; - - case 'x': - arg_opts.ignore_data_file = 1; - break; - - case '4': - arg_opts.use_ipv4 = 1; - break; - - case 'c': - snprintf(arg_opts.config_path, sizeof(arg_opts.config_path), "%s", optarg); - break; - - case 'n': - snprintf(arg_opts.nodes_path, sizeof(arg_opts.nodes_path), "%s", optarg); - break; - - case 'h': - default: - print_usage(); - exit(EXIT_FAILURE); - } - } -} - -int main(int argc, char *argv[]) -{ - char *user_config_dir = get_user_config_dir(); - int config_err = 0; - - parse_args(argc, argv); - - /* Make sure all written files are read/writeable only by the current user. */ - umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - - config_err = create_user_config_dir(user_config_dir); - - if (DATA_FILE == NULL ) { - if (config_err) { - DATA_FILE = strdup("data"); - } else { - DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); - - if (DATA_FILE != NULL) { - strcpy(DATA_FILE, user_config_dir); - strcat(DATA_FILE, CONFIGDIR); - strcat(DATA_FILE, "data"); - } else { - endwin(); - fprintf(stderr, "malloc() failed. Aborting...\n"); - exit(EXIT_FAILURE); - } - } - } - - free(user_config_dir); - - /* init user_settings struct and load settings from conf file */ - user_settings = malloc(sizeof(struct user_settings)); - - if (user_settings == NULL) { - endwin(); - fprintf(stderr, "malloc() failed. Aborting...\n"); - exit(EXIT_FAILURE); - } - - memset(user_settings, 0, sizeof(struct user_settings)); - - char *p = arg_opts.config_path[0] ? arg_opts.config_path : NULL; - int settings_err = settings_load(user_settings, p); - - Tox *m = init_tox(arg_opts.use_ipv4); - init_term(); - - if (m == NULL) { - endwin(); - fprintf(stderr, "Failed to initialize network. Aborting...\n"); - exit(EXIT_FAILURE); - } - - if (!arg_opts.ignore_data_file) - load_data(m, DATA_FILE); - - prompt = init_windows(m); - - /* create new thread for ncurses stuff */ - if (pthread_mutex_init(&Winthread.lock, NULL) != 0) { - endwin(); - fprintf(stderr, "Mutex init failed. Aborting...\n"); - exit(EXIT_FAILURE); - } - - if (pthread_create(&Winthread.tid, NULL, thread_winref, (void *) m) != 0) { - endwin(); - fprintf(stderr, "Thread creation failed. Aborting...\n"); - exit(EXIT_FAILURE); - } - - uint8_t *msg; - -#ifdef _SUPPORT_AUDIO - - av = init_audio(prompt, m); - - device_set(prompt, input, user_settings->audio_in_dev); - device_set(prompt, output, user_settings->audio_out_dev); - - if ( errors() == NoError ) - msg = "Audio initiated with no problems."; - else /* Get error code and stuff */ - msg = "Error initiating audio!"; - - line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); - -#endif /* _SUPPORT_AUDIO */ - - if (config_err) { - msg = "Unable to determine configuration directory. Defaulting to 'data' for a keyfile..."; - line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); - } - - - if (settings_err == -1) { - msg = "Failed to load user settings"; - line_info_add(prompt, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); - } - - - sort_friendlist_index(); - prompt_init_statusbar(prompt, m); - - while (true) { - update_unix_time(); - do_toxic(m, prompt); - // uint32_t st = MIN(tox_do_interval(m) * 1000, 20000); - usleep(10000); - } - - return 0; -} diff --git a/src/misc_tools.c b/src/misc_tools.c index b28d814..80220f5 100644 --- a/src/misc_tools.c +++ b/src/misc_tools.c @@ -243,9 +243,10 @@ void get_file_name(uint8_t *namebuf, uint8_t *pathname) uint8_t *filename = strrchr(pathname, '/'); - if (filename == NULL) { - filename = pathname; - } else if (!strlen(++filename)) { + if (filename != NULL) { + if (!strlen(++filename)) + filename = pathname; + } else { filename = pathname; } diff --git a/src/settings.c b/src/settings.c index 9e10d42..723f40f 100644 --- a/src/settings.c +++ b/src/settings.c @@ -146,7 +146,7 @@ static void uset_dwnld_path(struct user_settings *s, const char *val) strcpy(s->download_path, val); - if (val[len] != '/') + if (val[len - 1] != '/') strcat(s->download_path, "/"); } diff --git a/src/toxic.c b/src/toxic.c index 2a54a69..9d9682c 100644 --- a/src/toxic.c +++ b/src/toxic.c @@ -1,4 +1,4 @@ -/* toxic.c +/* main.c * * * Copyright (C) 2014 Toxic All Rights Reserved. @@ -92,8 +92,8 @@ void on_window_resize(int sig) static void init_term(void) { - /* Setup terminal */ signal(SIGWINCH, on_window_resize); + #if HAVE_WIDECHAR if (setlocale(LC_ALL, "") == NULL) { @@ -103,6 +103,7 @@ static void init_term(void) } #endif + initscr(); cbreak(); keypad(stdscr, 1); @@ -450,9 +451,7 @@ static void do_toxic(Tox *m, ToxWindow *prompt) do_connection(m, prompt); do_file_senders(m); - - /* main tox-core loop */ - tox_do(m); + tox_do(m); /* main tox-core loop */ pthread_mutex_unlock(&Winthread.lock); } @@ -488,24 +487,19 @@ static void parse_args(int argc, char *argv[]) { set_default_opts(); + static struct option long_opts[] = { + {"file", required_argument, 0, 'f'}, + {"nodata", no_argument, 0, 'x'}, + {"ipv4", no_argument, 0, '4'}, + {"config", required_argument, 0, 'c'}, + {"nodes", required_argument, 0, 'n'}, + {"help", no_argument, 0, 'h'}, + }; + const char *opts_str = "4xf:c:n:h"; int opt, indexptr; - while (true) { - static struct option long_opts[] = { - {"file", required_argument, 0, 'f'}, - {"nodata", no_argument, 0, 'x'}, - {"ipv4", no_argument, 0, '4'}, - {"config", required_argument, 0, 'c'}, - {"nodes", required_argument, 0, 'n'}, - {"help", no_argument, 0, 'h'}, - }; - - opt = getopt_long(argc, argv, opts_str, long_opts, &indexptr); - - if (opt == -1) - break; - + while ((opt = getopt_long(argc, argv, opts_str, long_opts, &indexptr)) != -1) { switch (opt) { case 'f': DATA_FILE = strdup(optarg); @@ -644,7 +638,6 @@ int main(int argc, char *argv[]) while (true) { update_unix_time(); do_toxic(m, prompt); - // uint32_t st = MIN(tox_do_interval(m) * 1000, 20000); usleep(10000); } diff --git a/src/toxic_windows.h b/src/toxic_windows.h deleted file mode 100644 index 30d0f18..0000000 --- a/src/toxic_windows.h +++ /dev/null @@ -1,260 +0,0 @@ -/* toxic_windows.h - * - * - * Copyright (C) 2014 Toxic All Rights Reserved. - * - * This file is part of Toxic. - * - * Toxic is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Toxic is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Toxic. If not, see . - * - */ - -#ifndef _windows_h -#define _windows_h - -#ifndef TOXICVER -#define TOXICVER "NOVER_" /* Use the -D flag to set this */ -#endif - -#include -#include -#include -#include - -#include - -#ifdef _SUPPORT_AUDIO -#include -#endif /* _SUPPORT_AUDIO */ - -#define UNKNOWN_NAME "Anonymous" - -#define MAX_WINDOWS_NUM 32 -#define MAX_FRIENDS_NUM 100 -#define MAX_STR_SIZE 256 -#define MAX_CMDNAME_SIZE 64 -#define KEY_SIZE_BYTES 32 -#define TOXIC_MAX_NAME_LENGTH 32 /* Must be <= TOX_MAX_NAME_LENGTH */ -#define N_DEFAULT_WINS 2 /* number of permanent default windows */ -#define CURS_Y_OFFSET 3 /* y-axis cursor offset for chat contexts */ -#define CHATBOX_HEIGHT 4 -#define KEY_IDENT_DIGITS 2 /* number of hex digits to display for the pub-key based identifier */ -#define TIME_STR_SIZE 16 - -#define EXIT_SUCCESS 0 -#define EXIT_FAILURE 1 - -/* ASCII key codes */ -#define T_KEY_KILL 0xB /* ctrl-k */ -#define T_KEY_DISCARD 0x15 /* ctrl-u */ -#define T_KEY_NEXT 0x10 /* ctrl-p */ -#define T_KEY_PREV 0x0F /* ctrl-o */ -#define T_KEY_C_E 0x05 /* ctrl-e */ -#define T_KEY_C_A 0x01 /* ctrl-a */ -#define T_KEY_ESC 0x1B /* ESC key */ - -/* Curses foreground colours (background is black) */ -enum { - WHITE, - GREEN, - CYAN, - RED, - BLUE, - YELLOW, - MAGENTA, - BLACK, -}; - -/* tab alert types: lower types take priority */ -enum { - WINDOW_ALERT_0, - WINDOW_ALERT_1, - WINDOW_ALERT_2, -}; - -enum { - MOVE_UP, - MOVE_DOWN, -}; - -/* Fixes text color problem on some terminals. - Uncomment if necessary */ -/* #define URXVT_FIX */ - -typedef struct ToxWindow ToxWindow; -typedef struct StatusBar StatusBar; -typedef struct PromptBuf PromptBuf; -typedef struct ChatContext ChatContext; - -struct ToxWindow { - void(*onKey)(ToxWindow *, Tox *, wint_t, bool); - void(*onDraw)(ToxWindow *, Tox *); - void(*onInit)(ToxWindow *, Tox *); - void(*onFriendRequest)(ToxWindow *, Tox *, uint8_t *, uint8_t *, uint16_t); - void(*onFriendAdded)(ToxWindow *, Tox *, int32_t, bool); - void(*onConnectionChange)(ToxWindow *, Tox *, int32_t, uint8_t); - void(*onMessage)(ToxWindow *, Tox *, int32_t, uint8_t *, uint16_t); - void(*onNickChange)(ToxWindow *, Tox *, int32_t, uint8_t *, uint16_t); - void(*onStatusChange)(ToxWindow *, Tox *, int32_t, uint8_t); - void(*onStatusMessageChange)(ToxWindow *, int32_t, uint8_t *, uint16_t); - void(*onAction)(ToxWindow *, Tox *, int32_t, uint8_t *, uint16_t); - void(*onGroupMessage)(ToxWindow *, Tox *, int, int, uint8_t *, uint16_t); - void(*onGroupAction)(ToxWindow *, Tox *, int, int, uint8_t *, uint16_t); - void(*onGroupInvite)(ToxWindow *, Tox *, int32_t, uint8_t *); - void(*onGroupNamelistChange)(ToxWindow *, Tox *, int, int, uint8_t); - void(*onFileSendRequest)(ToxWindow *, Tox *, int32_t, uint8_t, uint64_t, uint8_t *, uint16_t); - void(*onFileControl)(ToxWindow *, Tox *, int32_t, uint8_t, uint8_t, uint8_t, uint8_t *, uint16_t); - void(*onFileData)(ToxWindow *, Tox *, int32_t, uint8_t, uint8_t *, uint16_t); - void(*onTypingChange)(ToxWindow *, Tox *, int32_t, uint8_t); - -#ifdef _SUPPORT_AUDIO - - void(*onInvite)(ToxWindow *, ToxAv *, int); - void(*onRinging)(ToxWindow *, ToxAv *, int); - void(*onStarting)(ToxWindow *, ToxAv *, int); - void(*onEnding)(ToxWindow *, ToxAv *, int); - void(*onError)(ToxWindow *, ToxAv *, int); - void(*onStart)(ToxWindow *, ToxAv *, int); - void(*onCancel)(ToxWindow *, ToxAv *, int); - void(*onReject)(ToxWindow *, ToxAv *, int); - void(*onEnd)(ToxWindow *, ToxAv *, int); - void(*onRequestTimeout)(ToxWindow *, ToxAv *, int); - void(*onPeerTimeout)(ToxWindow *, ToxAv *, int); - - int call_index; /* If in a call will have this index set, otherwise it's -1. - * Don't modify outside av callbacks. */ -#endif /* _SUPPORT_AUDIO */ - - char name[TOX_MAX_NAME_LENGTH]; - int32_t num; /* corresponds to friendnumber in chat windows */ - bool active; - int x; - - /* window type identifiers */ - bool is_chat; - bool is_groupchat; - bool is_prompt; - - bool alert0; - bool alert1; - bool alert2; - - ChatContext *chatwin; - StatusBar *stb; - - WINDOW *popup; - WINDOW *window; -}; - -/* statusbar info holder */ -struct StatusBar { - WINDOW *topline; - uint8_t statusmsg[TOX_MAX_STATUSMESSAGE_LENGTH]; - uint16_t statusmsg_len; - uint8_t nick[TOX_MAX_NAME_LENGTH]; - uint16_t nick_len; - uint8_t status; - bool is_online; -}; - -#define MAX_LINE_HIST 128 - -/* chat and groupchat window/buffer holder */ -struct ChatContext { - wchar_t line[MAX_STR_SIZE]; - size_t pos; - size_t len; - - wchar_t ln_history[MAX_LINE_HIST][MAX_STR_SIZE]; /* history for input lines/commands */ - int hst_pos; - int hst_tot; - - struct history *hst; - struct chatlog *log; - - uint8_t self_is_typing; - - WINDOW *history; - WINDOW *linewin; - WINDOW *sidebar; - - /* specific for prompt */ - bool at_bottom; /* true if line end is at bottom of window */ - int orig_y; /* y axis point of line origin */ -}; - -/* Start file transfer code */ - -#define FILE_PIECE_SIZE 2048 /* must be >= (MAX_CRYPTO_DATA_SIZE - 2) in toxcore/net_crypto.h */ -#define MAX_FILES 256 -#define TIMEOUT_FILESENDER 300 - -typedef struct { - FILE *file; - ToxWindow *toxwin; - int32_t friendnum; - bool active; - int filenum; - uint8_t nextpiece[FILE_PIECE_SIZE]; - uint16_t piecelen; - uint8_t pathname[MAX_STR_SIZE]; - uint64_t timestamp; - uint64_t size; - uint32_t line_id; -} FileSender; - -struct FileReceiver { - uint8_t filenames[MAX_FILES][MAX_STR_SIZE]; - FILE *files[MAX_FILES]; - bool pending[MAX_FILES]; - uint64_t size[MAX_FILES]; - uint32_t line_id[MAX_FILES]; -}; - -/* End file transfer code */ - -struct _Winthread { - pthread_t tid; - pthread_mutex_t lock; -}; - -void on_request(Tox *m, uint8_t *public_key, uint8_t *data, uint16_t length, void *userdata); -void on_connectionchange(Tox *m, int32_t friendnumber, uint8_t status, void *userdata); -void on_message(Tox *m, int32_t friendnumber, uint8_t *string, uint16_t length, void *userdata); -void on_action(Tox *m, int32_t friendnumber, uint8_t *string, uint16_t length, void *userdata); -void on_nickchange(Tox *m, int32_t friendnumber, uint8_t *string, uint16_t length, void *userdata); -void on_statuschange(Tox *m, int32_t friendnumber, uint8_t status, void *userdata); -void on_statusmessagechange(Tox *m, int32_t friendnumber, uint8_t *string, uint16_t length, void *userdata); -void on_friendadded(Tox *m, int32_t friendnumber, bool sort); -void on_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *message, uint16_t length, void *userdata); -void on_groupaction(Tox *m, int groupnumber, int peernumber, uint8_t *action, uint16_t length, void *userdata); -void on_groupinvite(Tox *m, int32_t friendnumber, uint8_t *group_pub_key, void *userdata); -void on_group_namelistchange(Tox *m, int groupnumber, int peernumber, uint8_t change, void *userdata); -void on_file_sendrequest(Tox *m, int32_t friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *pathname, - uint16_t pathname_length, void *userdata); -void on_file_control(Tox *m, int32_t friendnumber, uint8_t receive_send, uint8_t filenumber, uint8_t control_type, - uint8_t *data, uint16_t length, void *userdata); -void on_file_data(Tox *m, int32_t friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *userdata); -void on_typing_change(Tox *m, int32_t friendnumber, uint8_t is_typing, void *userdata); - -ToxWindow *init_windows(Tox *m); -void draw_active_window(Tox *m); -int add_window(Tox *m, ToxWindow w); -void del_window(ToxWindow *w); -void set_active_window(int ch); -int get_num_active_windows(void); - -/* cleans up all chat and groupchat windows (should only be called on shutdown) */ -void kill_all_windows(void); -#endif diff --git a/src/windows.c b/src/windows.c index e1f93f4..ef14525 100644 --- a/src/windows.c +++ b/src/windows.c @@ -352,25 +352,28 @@ static void draw_bar(void) int i; for (i = 0; i < MAX_WINDOWS_NUM; ++i) { - if (windows[i].active) { - if (windows + i == active_window) { -#ifdef URXVT_FIX - attron(A_BOLD | COLOR_PAIR(GREEN)); - } else { -#endif - attron(A_BOLD); - } + if (!windows[i].active) + continue; - draw_window_tab(windows[i]); + if (windows + i == active_window) - if (windows + i == active_window) { #ifdef URXVT_FIX - attroff(A_BOLD | COLOR_PAIR(GREEN)); - } else { + attron(A_BOLD | COLOR_PAIR(GREEN)); + else #endif - attroff(A_BOLD); - } - } + + attron(A_BOLD); + + draw_window_tab(windows[i]); + + if (windows + i == active_window) + +#ifdef URXVT_FIX + attroff(A_BOLD | COLOR_PAIR(GREEN)); + else +#endif + + attroff(A_BOLD); } refresh();