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();