diff --git a/.travis.yml b/.travis.yml
index 210bdb7..8b48566 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,15 +1,15 @@
language: c
compiler:
- gcc
- # - clang # Fix me
+ - clang
before_script:
# Installing yasm (needed for compiling vpx) and openal
- - sudo apt-get -yq install yasm libopenal-dev libconfig-dev libalut-dev libnotify-dev
+ - sudo apt-get -yq install yasm libopenal-dev libconfig-dev libalut-dev libnotify-dev clang llvm-dev
# Installing libsodium, needed for toxcore
- git clone https://github.com/jedisct1/libsodium.git libsodium
- cd libsodium
- - git checkout tags/0.7.0 > /dev/null
+ - git checkout tags/1.0.2 > /dev/null
- ./autogen.sh > /dev/null
- ./configure > /dev/null
- make check -j2 || make check || exit 1 > /dev/null
diff --git a/INSTALL.md b/INSTALL.md
new file mode 100644
index 0000000..6dc0bba
--- /dev/null
+++ b/INSTALL.md
@@ -0,0 +1,68 @@
+# Installation
+* [Dependencies](#deps)
+ * [OS X Notes](#deps_osx)
+* [Compiling](#compiling)
+ * [Documentation](#docs)
+* [Notes](#notes)
+ * [Compilation variables](#comp_vars)
+ * [Packaging](#packaging)
+
+
+## Dependencies
+| Name | Needed by | Debian package |
+|------------------------------------------------------|----------------------------|------------------|
+| [Tox Core](https://github.com/irungentoo/toxcore) | BASE | *None* |
+| [NCurses](https://www.gnu.org/software/ncurses) | BASE | libncursesw5-dev |
+| [LibConfig](http://www.hyperrealm.com/libconfig) | BASE | libconfig-dev |
+| [Tox Core AV](https://github.com/irungentoo/toxcore) | AUDIO | *None* |
+| [OpenAL](http://openal.org) | AUDIO, SOUND NOTIFICATIONS | libopenal-dev |
+| [OpenALUT](http://openal.org) | SOUND NOTIFICATIONS | libalut-dev |
+| [LibNotify](https://developer.gnome.org/libnotify) | DESKTOP NOTIFICATIONS | libnotify-dev |
+| [AsciiDoc](http://asciidoc.org/index.html) | DOCUMENTATION1 | asciidoc |
+1: see [Documentation](#docs)
+
+
+#### OS X Notes
+Using [Homebrew](http://brew.sh):
+```
+brew install openal-soft freealut libconfig
+brew install https://raw.githubusercontent.com/Tox/homebrew-tox/master/Formula/libtoxcore.rb
+brew install https://raw.githubusercontent.com/Homebrew/homebrew-x11/master/libnotify.rb
+```
+
+You can omit `libnotify` if you intend to build without desktop notifications enabled.
+
+
+## Compiling
+```
+cd build/
+make PREFIX="/where/to/install"
+sudo make install PREFIX="/where/to/install"
+```
+
+
+#### Documentation
+Run `make doc` in the build directory after editing the asciidoc files to regenerate the manpages.
+**NOTE FOR DEVELOPERS**: asciidoc files and generated manpages will need to be commited together.
+**NOTE FOR EVERYONE**: [asciidoc](http://asciidoc.org/index.html) (and this step) is only required for regenerating manpages when you modify them.
+
+
+## Notes
+
+
+#### Compilation variables
+* You can add specific flags to the Makefile with `USER_CFLAGS=""` and/or `USER_LDFLAGS=""`
+* You can pass your own flags to the Makefile with `CFLAGS=""` and/or `LDFLAGS=""` (this will supersede the default ones)
+* Additional features are automatically enabled if all dependencies are found, but you can disable them by using special variables:
+ * `DISABLE_X11=1` → build toxic without X11 support (needed for focus tracking)
+ * `DISABLE_AV=1` → build toxic without audio call support
+ * `DISABLE_SOUND_NOTIFY=1` → build toxic without sound notifications support
+ * `DISABLE_DESKTOP_NOTIFY=1` → build toxic without desktop notifications support
+
+
+#### Packaging
+* For packaging purpose, you can use `DESTDIR=""` to specify a directory where to store installed files
+* `DESTDIR=""` can be used in addition to `PREFIX=""`:
+ * `DESTDIR=""` is meant to specify a directory where to store installed files (ex: "/tmp/build/pkg")
+ * `PREFIX=""` is meant to specify a prefix directory for binaries and data files (ex: "/usr/local")
+
diff --git a/README.md b/README.md
index 4c5e5d5..d3cc263 100644
--- a/README.md
+++ b/README.md
@@ -1,53 +1,31 @@
# Toxic [![Build Status](https://travis-ci.org/Tox/toxic.png?branch=master)](https://travis-ci.org/Tox/toxic)
Toxic is a [Tox](https://tox.im)-based instant messenging client which formerly resided in the [Tox core repository](https://github.com/irungentoo/toxcore), and is now available as a standalone application.
-![Toxic Screenshot](https://i.imgur.com/san99Z2.png "Home Screen")
+[![Toxic Screenshot](https://i.imgur.com/san99Z2.png "Home Screen")](https://i.imgur.com/san99Z2.png)
## Installation
+[Use our repositories](https://wiki.tox.im/Binaries#Linux)
+[Compile it yourself](/INSTALL.md)
-### Dependencies
-##### Base
-* [libtoxcore](https://github.com/irungentoo/toxcore)
-* [ncurses](https://www.gnu.org/software/ncurses) (for Debian based systems, 'libncursesw5-dev')
-* [libconfig](http://www.hyperrealm.com/libconfig) (for Debian based systems, 'libconfig-dev')
+## Downloads
+If you don't like installation methods listed above, you can still download precompiled binaries from [jenkins](https://jenkins.libtoxcore.so):
+* [Linux 32 bit](https://jenkins.libtoxcore.so/job/toxic_linux_i386/lastSuccessfulBuild/artifact/toxic_linux_i386.tar.xz) [![Build Status](https://jenkins.libtoxcore.so/job/toxic_linux_i386/badge/icon)](https://jenkins.libtoxcore.so/job/toxic_linux_i386/lastSuccessfulBuild/artifact/toxic_linux_i386.tar.xz)
+* [Linux 64 bit](https://jenkins.libtoxcore.so/job/toxic_linux_amd64/lastSuccessfulBuild/artifact/toxic_linux_amd64.tar.xz) [![Build Status](https://jenkins.libtoxcore.so/job/toxic_linux_amd64/badge/icon)](https://jenkins.libtoxcore.so/job/toxic_linux_amd64/lastSuccessfulBuild/artifact/toxic_linux_amd64.tar.xz)
+* [~~Linux ARMv6~~](https://jenkins.libtoxcore.so/job/toxic_linux_armv6/lastSuccessfulBuild/artifact/toxic_linux_armv6.tar.xz) **CURRENTLY DISABLED** [![Build Status](https://jenkins.libtoxcore.so/job/toxic_linux_amd64/badge/icon)](https://jenkins.libtoxcore.so/job/toxic_linux_armv6/lastSuccessfulBuild/artifact/toxic_linux_armv6.tar.xz)
-##### Audio
-* libtoxav ([libtoxcore](https://github.com/irungentoo/toxcore) compiled with audio support)
-* [openal](http://openal.org) (for Debian based systems, 'libopenal-dev')
+#### DEBs packages
+* [toxic-i386.deb](https://jenkins.libtoxcore.so/job/toxic-linux-pkg/lastSuccessfulBuild/artifact/toxic-i386.deb)
+* [toxic-x86_64.deb](https://jenkins.libtoxcore.so/job/toxic-linux-pkg/lastSuccessfulBuild/artifact/toxic-x86_64.deb)
-##### Sound notifications
-* [openal](http://openal.org) (for Debian based systems, 'libopenal-dev')
-* [openalut](http://openal.org) (for Debian based systems, 'libalut-dev')
+#### RPMs packages
+* [toxic-i386.rpm](https://jenkins.libtoxcore.so/job/toxic-linux-pkg/lastSuccessfulBuild/artifact/toxic-i386.rpm)
+* [toxic-x86_64.rpm](https://jenkins.libtoxcore.so/job/toxic-linux-pkg/lastSuccessfulBuild/artifact/toxic-x86_64.rpm)
-##### Desktop notifications
-* [libnotify](https://developer.gnome.org/libnotify) (for Debian based systems, 'libnotify-dev')
+## Settings
+Running Toxic for the first time creates an empty file called toxic.conf in your home configuration directory ("~/.config/tox" for Linux users). Adding options to this file allows you to enable auto-logging, change the time format (12/24 hour), and much more.
+You can view our example config file [here](misc/toxic.conf.example).
-##### Documentation
-* [Asciidoc](http://asciidoc.org/index.html) (only required for regenerating manpages)
- * Run `make doc` in the build directory after editing the asciidoc files to regenerate the manpages.
- * **NOTE FOR DEVELOPERS**: asciidoc files and generated manpages will need to be commited together.
-
-### Compiling
-1. `cd build/`
-2. `make PREFIX="/where/to/install"`
-3. `sudo make install PREFIX="/where/to/install"`
-
-### Compilation Notes
-* You can add specific flags to the Makefile with `USER_CFLAGS=""` and/or `USER_LDFLAGS=""`
-* You can pass your own flags to the Makefile with `CFLAGS=""` and/or `LDFLAGS=""` (this will supersede the default ones)
-* Additional features are automatically enabled if all dependencies are found, but you can disable them by using special variables:
- * `DISABLE_X11=1` → build toxic without X11 support (needed for focus tracking)
- * `DISABLE_AV=1` → build toxic without audio call support
- * `DISABLE_SOUND_NOTIFY=1` → build toxic without sound notifications support
- * `DISABLE_DESKTOP_NOTIFY=1` → build toxic without desktop notifications support
-
-### Packaging
-* For packaging purpose, you can use `DESTDIR=""` to specify a directory where to store installed files
-* `DESTDIR=""` can be used in addition to `PREFIX=""`:
- * `DESTDIR=""` is meant to specify a directory where to store installed files (ex: "/tmp/build/pkg")
- * `PREFIX=""` is meant to specify a prefix directory for binaries and data files (ex: "/usr/local")
-
-### Troubleshooting
+## Troubleshooting
If your default prefix is "/usr/local" and you receive the following:
```
error while loading shared libraries: libtoxcore.so.0: cannot open shared object file: No such file or directory
@@ -58,13 +36,3 @@ echo '/usr/local/lib/' | sudo tee -a /etc/ld.so.conf.d/locallib.conf
sudo ldconfig
```
-## Precompiled binaries
-You can download precompiled binaries from [jenkins](https://jenkins.libtoxcore.so):
-* [Linux (packages)](https://wiki.tox.im/Binaries#Linux)
-* [Linux 32 bit](https://jenkins.libtoxcore.so/job/toxic_linux_i386/lastSuccessfulBuild/artifact/toxic_linux_i386.tar.xz)
-* [Linux 64 bit](https://jenkins.libtoxcore.so/job/toxic_linux_amd64/lastSuccessfulBuild/artifact/toxic_linux_amd64.tar.xz)
-
-## Settings
-Running Toxic for the first time creates an empty file called toxic.conf in your home configuration directory ("~/.config/tox" for Linux users). Adding options to this file allows you to enable auto-logging, change the time format (12/24 hour), and much more.
-You can view our example config file [here](misc/toxic.conf.example).
-
diff --git a/cfg/systems/Darwin.mk b/cfg/systems/Darwin.mk
new file mode 100644
index 0000000..f33a4be
--- /dev/null
+++ b/cfg/systems/Darwin.mk
@@ -0,0 +1,10 @@
+# Special options for OS X
+# This assumes the use of Homebrew. Change the paths if using MacPorts or Fink.
+
+PKG_CONFIG_PATH = $(shell export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/opt/libconfig/lib/pkgconfig:/usr/local/lib/pkgconfig:/opt/X11/lib/pkgconfig)
+
+LIBS := $(filter-out ncursesw, $(LIBS))
+
+# OS X ships a usable, recent version of ncurses, but calls it ncurses not ncursesw.
+LDFLAGS += -lncurses -lalut -ltoxav -ltoxcore -ltoxdns -lresolv -lconfig -ltoxencryptsave -g
+CFLAGS += -I/usr/local/opt/freealut/include/AL -I/usr/local/opt/glib/include/glib-2.0 -g
diff --git a/doc/toxic.conf.5 b/doc/toxic.conf.5
index 3fb2aee..fa30e86 100644
--- a/doc/toxic.conf.5
+++ b/doc/toxic.conf.5
@@ -2,12 +2,12 @@
.\" Title: toxic.conf
.\" Author: [see the "AUTHORS" section]
.\" Generator: DocBook XSL Stylesheets v1.78.1
-.\" Date: 2014-10-08
+.\" Date: 2015-02-08
.\" Manual: Toxic Manual
.\" Source: toxic __VERSION__
.\" Language: English
.\"
-.TH "TOXIC\&.CONF" "5" "2014\-10\-08" "toxic __VERSION__" "Toxic Manual"
+.TH "TOXIC\&.CONF" "5" "2015\-02\-08" "toxic __VERSION__" "Toxic Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -105,6 +105,26 @@ Show welcome message on startup\&. true or false
.RS 4
Maximum lines for chat window history\&. Integer value\&. (for example: 700)
.RE
+.PP
+\fBline_join\fR
+.RS 4
+Indicator for when someone connects or joins a group\&. Three characters max for line_ settings\&.
+.RE
+.PP
+\fBline_quit\fR
+.RS 4
+Indicator for when someone disconnects or leaves a group\&.
+.RE
+.PP
+\fBline_alert\fR
+.RS 4
+Indicator for alert messages\&.
+.RE
+.PP
+\fBline_normal\fR
+.RS 4
+Indicator for normal messages\&.
+.RE
.RE
.PP
\fBaudio\fR
diff --git a/doc/toxic.conf.5.asc b/doc/toxic.conf.5.asc
index 05ae202..4643405 100644
--- a/doc/toxic.conf.5.asc
+++ b/doc/toxic.conf.5.asc
@@ -66,6 +66,18 @@ OPTIONS
*history_size*;;
Maximum lines for chat window history. Integer value. (for example: 700)
+ *line_join*;;
+ Indicator for when someone connects or joins a group.
+ Three characters max for line_ settings.
+
+ *line_quit*;;
+ Indicator for when someone disconnects or leaves a group.
+
+ *line_alert*;;
+ Indicator for alert messages.
+
+ *line_normal*;;
+ Indicator for normal messages.
*audio*::
Configuration related to audio devices.
diff --git a/misc/DHTnodes b/misc/DHTnodes
index 1e867a9..7accc7d 100644
--- a/misc/DHTnodes
+++ b/misc/DHTnodes
@@ -1 +1,6 @@
192.254.75.104 33445 6058FF1DA1E013AD4F829CBE8E5DDFD30A4DE55901B0997832E3E8A64E19026C
+130.133.110.14 33445 461FA3776EF0FA655F1A05477DF1B3B614F7D6B124F7DB1DD4FE3C08B03B640F
+104.167.101.29 33445 5918AC3C06955962A75AD7DF4F80A5D7C34F7DB9E1498D2E0495DE35B3FE8A57
+198.98.51.198 33445 1D5A5F2F5D6233058BF0259B09622FB40B482E4FA0931EB8FD3AB8E7BF7DAF6F
+80.232.246.79 33445 0B8DCEAA7BDDC44BB11173F987CAE3566A2D7057D8DD3CC642BD472B9391002A
+
diff --git a/misc/toxic.conf.example b/misc/toxic.conf.example
index 29d6abf..7b8e352 100644
--- a/misc/toxic.conf.example
+++ b/misc/toxic.conf.example
@@ -28,6 +28,18 @@ ui = {
// maximum lines for chat window history
history_size=700;
+
+ // Indicator for display when someone connects or joins a group.
+ line_join="-->";
+
+ // Indicator for display when someone disconnects or leaves a group.
+ line_quit="<--";
+
+ // Indicator for alert messages.
+ line_alert="-!-";
+
+ // Indicator for normal messages.
+ line_normal="---";
};
audio = {
diff --git a/src/autocomplete.c b/src/autocomplete.c
index 1c7c94b..5b6af44 100644
--- a/src/autocomplete.c
+++ b/src/autocomplete.c
@@ -209,7 +209,7 @@ static void complt_home_dir(ToxWindow *self, char *path, int pathsize, const cha
{
ChatContext *ctx = self->chatwin;
- char homedir[MAX_STR_SIZE];
+ char homedir[MAX_STR_SIZE] = {0};
get_home_dir(homedir, sizeof(homedir));
char newline[MAX_STR_SIZE];
diff --git a/src/chat.c b/src/chat.c
index e8a3ade..890a61c 100644
--- a/src/chat.c
+++ b/src/chat.c
@@ -205,7 +205,7 @@ static void chat_onConnectionChange(ToxWindow *self, Tox *m, int32_t num, uint8_
chat_stop_file_senders(num);
msg = "has gone offline";
- line_info_add(self, timefrmt, nick, NULL, CONNECTION, 0, RED, msg);
+ line_info_add(self, timefrmt, nick, NULL, DISCONNECTION, 0, RED, msg);
write_to_log(msg, nick, ctx->log, true);
}
}
diff --git a/src/configdir.c b/src/configdir.c
index 9bc6744..8a9f60c 100644
--- a/src/configdir.c
+++ b/src/configdir.c
@@ -66,7 +66,7 @@ void get_home_dir(char *home, int size)
*/
char *get_user_config_dir(void)
{
- char home[NSS_BUFLEN_PASSWD];
+ char home[NSS_BUFLEN_PASSWD] = {0};
get_home_dir(home, sizeof(home));
char *user_config_dir;
diff --git a/src/friendlist.c b/src/friendlist.c
index 4ea76d3..2540d8d 100644
--- a/src/friendlist.c
+++ b/src/friendlist.c
@@ -150,7 +150,7 @@ static int save_blocklist(char *path)
memset(&tmp, 0, sizeof(BlockedFriend));
tmp.namelength = htons(Blocked.list[i].namelength);
memcpy(tmp.name, Blocked.list[i].name, Blocked.list[i].namelength + 1);
- memcpy(tmp.pub_key, Blocked.list[i].pub_key, TOX_CLIENT_ID_SIZE);
+ memcpy(tmp.pub_key, Blocked.list[i].pub_key, TOX_PUBLIC_KEY_SIZE);
uint8_t lastonline[sizeof(uint64_t)];
memcpy(lastonline, &Blocked.list[i].last_on, sizeof(uint64_t));
@@ -232,7 +232,7 @@ int load_blocklist(char *path)
Blocked.list[i].num = i;
Blocked.list[i].namelength = ntohs(tmp.namelength);
memcpy(Blocked.list[i].name, tmp.name, Blocked.list[i].namelength + 1);
- memcpy(Blocked.list[i].pub_key, tmp.pub_key, TOX_CLIENT_ID_SIZE);
+ memcpy(Blocked.list[i].pub_key, tmp.pub_key, TOX_PUBLIC_KEY_SIZE);
uint8_t lastonline[sizeof(uint64_t)];
memcpy(lastonline, &tmp.last_on, sizeof(uint64_t));
@@ -448,7 +448,7 @@ static void friendlist_add_blocked(Tox *m, int32_t fnum, int32_t bnum)
Friends.list[i].namelength = Blocked.list[bnum].namelength;
update_friend_last_online(i, Blocked.list[bnum].last_on);
memcpy(Friends.list[i].name, Blocked.list[bnum].name, Friends.list[i].namelength + 1);
- memcpy(Friends.list[i].pub_key, Blocked.list[bnum].pub_key, TOX_CLIENT_ID_SIZE);
+ memcpy(Friends.list[i].pub_key, Blocked.list[bnum].pub_key, TOX_PUBLIC_KEY_SIZE);
if (i == Friends.max_idx)
++Friends.max_idx;
@@ -641,7 +641,7 @@ void block_friend(Tox *m, int32_t fnum)
Blocked.list[i].num = i;
Blocked.list[i].namelength = Friends.list[fnum].namelength;
Blocked.list[i].last_on = Friends.list[fnum].last_online.last_on;
- memcpy(Blocked.list[i].pub_key, Friends.list[fnum].pub_key, TOX_CLIENT_ID_SIZE);
+ memcpy(Blocked.list[i].pub_key, Friends.list[fnum].pub_key, TOX_PUBLIC_KEY_SIZE);
memcpy(Blocked.list[i].name, Friends.list[fnum].name, Friends.list[fnum].namelength + 1);
++Blocked.num_blocked;
@@ -820,7 +820,7 @@ static void blocklist_onDraw(ToxWindow *self, Tox *m, int y2, int x2)
int i;
- for (i = 0; i < TOX_CLIENT_ID_SIZE; ++i)
+ for (i = 0; i < TOX_PUBLIC_KEY_SIZE; ++i)
wprintw(self->window, "%02X", Blocked.list[selected_num].pub_key[i] & 0xff);
}
@@ -1009,7 +1009,7 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m)
int i;
- for (i = 0; i < TOX_CLIENT_ID_SIZE; ++i)
+ for (i = 0; i < TOX_PUBLIC_KEY_SIZE; ++i)
wprintw(self->window, "%02X", Friends.list[selected_num].pub_key[i] & 0xff);
}
diff --git a/src/friendlist.h b/src/friendlist.h
index d1e7f58..0969b47 100644
--- a/src/friendlist.h
+++ b/src/friendlist.h
@@ -58,7 +58,7 @@ typedef struct {
int namelength;
char statusmsg[TOX_MAX_STATUSMESSAGE_LENGTH + 1];
uint16_t statusmsg_len;
- char pub_key[TOX_CLIENT_ID_SIZE];
+ char pub_key[TOX_PUBLIC_KEY_SIZE];
int32_t num;
int chatwin;
bool active;
@@ -75,7 +75,7 @@ typedef struct {
typedef struct {
char name[TOXIC_MAX_NAME_LENGTH + 1];
int namelength;
- char pub_key[TOX_CLIENT_ID_SIZE];
+ char pub_key[TOX_PUBLIC_KEY_SIZE];
int32_t num;
bool active;
uint64_t last_on;
diff --git a/src/global_commands.c b/src/global_commands.c
index d38c351..f7299a1 100644
--- a/src/global_commands.c
+++ b/src/global_commands.c
@@ -574,9 +574,9 @@ void cmd_requests(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv
if (!FrndRequests.request[i].active)
continue;
- char id[TOX_CLIENT_ID_SIZE * 2 + 1] = {0};
+ char id[TOX_PUBLIC_KEY_SIZE * 2 + 1] = {0};
- for (j = 0; j < TOX_CLIENT_ID_SIZE; ++j) {
+ for (j = 0; j < TOX_PUBLIC_KEY_SIZE; ++j) {
char d[3];
snprintf(d, sizeof(d), "%02X", FrndRequests.request[i].key[j] & 0xff);
strcat(id, d);
diff --git a/src/groupchat.c b/src/groupchat.c
index cdaf18c..05c202b 100644
--- a/src/groupchat.c
+++ b/src/groupchat.c
@@ -461,7 +461,7 @@ static void groupchat_onGroupPeerExit(ToxWindow *self, Tox *m, int groupnum, uin
char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt));
- line_info_add(self, timefrmt, name, NULL, CONNECTION, 0, RED, "has left the room (%s)", partmessage);
+ line_info_add(self, timefrmt, name, NULL, DISCONNECTION, 0, RED, "has left the room (%s)", partmessage);
char log_str[TOXIC_MAX_NAME_LENGTH + MAX_STR_SIZE];
snprintf(log_str, sizeof(log_str), "%s has left the room (%s)", name, partmessage);
diff --git a/src/line_info.c b/src/line_info.c
index baca619..ab2d3c8 100644
--- a/src/line_info.c
+++ b/src/line_info.c
@@ -156,23 +156,27 @@ void line_info_add(ToxWindow *self, const char *timestr, const char *name1, cons
switch (type) {
case IN_ACTION:
case OUT_ACTION:
- len += 5;
+ len += strlen(user_settings->line_normal) + 2;
break;
case IN_MSG:
case OUT_MSG:
- len += 6;
+ len += strlen(user_settings->line_normal) + 3;
break;
case CONNECTION:
- len += 5;
+ len += strlen(user_settings->line_join) + 2;
+ break;
+
+ case DISCONNECTION:
+ len += strlen(user_settings->line_quit) + 2;
break;
case SYS_MSG:
break;
case NAME_CHANGE:
- len += 4;
+ len += strlen(user_settings->line_alert) + 1;
break;
case PROMPT:
@@ -309,7 +313,7 @@ void line_info_print(ToxWindow *self)
nameclr = CYAN;
wattron(win, COLOR_PAIR(nameclr));
- wprintw(win, "--- %s: ", line->name1);
+ wprintw(win, "%s %s: ", user_settings->line_normal, line->name1);
wattroff(win, COLOR_PAIR(nameclr));
if (line->msg[0] == '>')
@@ -342,7 +346,7 @@ void line_info_print(ToxWindow *self)
wattroff(win, COLOR_PAIR(BLUE));
wattron(win, COLOR_PAIR(YELLOW));
- wprintw(win, "--- %s %s", line->name1, line->msg);
+ wprintw(win, "%s %s %s", user_settings->line_normal, line->name1, line->msg);
wattroff(win, COLOR_PAIR(YELLOW));
if (type == OUT_ACTION && timed_out(line->timestamp, get_unix_time(), NOREAD_FLAG_TIMEOUT)) {
@@ -399,7 +403,24 @@ void line_info_print(ToxWindow *self)
wattroff(win, COLOR_PAIR(BLUE));
wattron(win, COLOR_PAIR(line->colour));
- wprintw(win, "%s ", line->colour == RED ? "<--" : "-->");
+ wprintw(win, "%s ", user_settings->line_join);
+
+ wattron(win, A_BOLD);
+ wprintw(win, "%s ", line->name1);
+ wattroff(win, A_BOLD);
+
+ wprintw(win, "%s\n", line->msg);
+ wattroff(win, COLOR_PAIR(line->colour));
+
+ break;
+
+ case DISCONNECTION:
+ wattron(win, COLOR_PAIR(BLUE));
+ wprintw(win, "%s", line->timestr);
+ wattroff(win, COLOR_PAIR(BLUE));
+
+ wattron(win, COLOR_PAIR(line->colour));
+ wprintw(win, "%s ", user_settings->line_quit);
wattron(win, A_BOLD);
wprintw(win, "%s ", line->name1);
@@ -416,7 +437,7 @@ void line_info_print(ToxWindow *self)
wattroff(win, COLOR_PAIR(BLUE));
wattron(win, COLOR_PAIR(MAGENTA));
- wprintw(win, "-!- ");
+ wprintw(win, "%s ", user_settings->line_alert);
wattron(win, A_BOLD);
wprintw(win, "%s", line->name1);
wattroff(win, A_BOLD);
@@ -502,24 +523,24 @@ bool line_info_onKey(ToxWindow *self, wint_t key)
struct history *hst = self->chatwin->hst;
bool match = true;
- if (key == user_settings->key_half_page_up) {
- line_info_page_up(self, hst);
- }
- else if (key == user_settings->key_half_page_down) {
- line_info_page_down(self, hst);
- }
- else if (key == user_settings->key_scroll_line_up) {
- line_info_scroll_up(hst);
- }
- else if (key == user_settings->key_scroll_line_down) {
- line_info_scroll_down(hst);
- }
- else if (key == user_settings->key_page_bottom) {
- line_info_reset_start(self, hst);
- }
- else {
- match = false;
- }
+ if (key == user_settings->key_half_page_up) {
+ line_info_page_up(self, hst);
+ }
+ else if (key == user_settings->key_half_page_down) {
+ line_info_page_down(self, hst);
+ }
+ else if (key == user_settings->key_scroll_line_up) {
+ line_info_scroll_up(hst);
+ }
+ else if (key == user_settings->key_scroll_line_down) {
+ line_info_scroll_down(hst);
+ }
+ else if (key == user_settings->key_page_bottom) {
+ line_info_reset_start(self, hst);
+ }
+ else {
+ match = false;
+ }
return match;
}
diff --git a/src/line_info.h b/src/line_info.h
index c9bdd39..0e5c9a1 100644
--- a/src/line_info.h
+++ b/src/line_info.h
@@ -41,6 +41,7 @@ enum {
OUT_ACTION_READ, /* same as OUT_MSG_READ but for actions */
PROMPT,
CONNECTION,
+ DISCONNECTION,
NAME_CHANGE,
} LINE_TYPE;
diff --git a/src/prompt.c b/src/prompt.c
index 66f8838..e11cb04 100644
--- a/src/prompt.c
+++ b/src/prompt.c
@@ -146,7 +146,7 @@ static int add_friend_request(const char *public_key, const char *data)
for (i = 0; i <= FrndRequests.max_idx; ++i) {
if (!FrndRequests.request[i].active) {
FrndRequests.request[i].active = true;
- memcpy(FrndRequests.request[i].key, public_key, TOX_CLIENT_ID_SIZE);
+ memcpy(FrndRequests.request[i].key, public_key, TOX_PUBLIC_KEY_SIZE);
snprintf(FrndRequests.request[i].msg, sizeof(FrndRequests.request[i].msg), "%s", data);
if (i == FrndRequests.max_idx)
@@ -358,7 +358,7 @@ static void prompt_onConnectionChange(ToxWindow *self, Tox *m, int32_t friendnum
"Toxic", "%s has come online", nick );
} else {
msg = "has gone offline";
- line_info_add(self, timefrmt, nick, NULL, CONNECTION, 0, RED, msg);
+ line_info_add(self, timefrmt, nick, NULL, DISCONNECTION, 0, RED, msg);
write_to_log(msg, nick, ctx->log, true);
if (self->active_box != -1)
diff --git a/src/prompt.h b/src/prompt.h
index e184b8d..e6eb0cc 100644
--- a/src/prompt.h
+++ b/src/prompt.h
@@ -31,7 +31,7 @@
struct friend_request {
bool active;
char msg[MAX_STR_SIZE];
- uint8_t key[TOX_CLIENT_ID_SIZE];
+ uint8_t key[TOX_PUBLIC_KEY_SIZE];
};
typedef struct {
diff --git a/src/settings.c b/src/settings.c
index 95bd487..cd8385f 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -55,6 +55,11 @@ static struct ui_strings {
const char* show_typing_self;
const char* show_typing_other;
const char* show_welcome_msg;
+
+ const char* line_join;
+ const char* line_quit;
+ const char* line_alert;
+ const char* line_normal;
} ui_strings = {
"ui",
"timestamps",
@@ -66,6 +71,10 @@ static struct ui_strings {
"show_typing_self",
"show_typing_other",
"show_welcome_msg",
+ "line_join",
+ "line_quit",
+ "line_alert",
+ "line_normal",
};
static void ui_defaults(struct user_settings* settings)
@@ -79,6 +88,11 @@ static void ui_defaults(struct user_settings* settings)
settings->show_typing_self = SHOW_TYPING_ON;
settings->show_typing_other = SHOW_TYPING_ON;
settings->show_welcome_msg = SHOW_WELCOME_MSG_ON;
+
+ snprintf(settings->line_join, LINE_HINT_MAX + 1, "%s", LINE_JOIN);
+ snprintf(settings->line_quit, LINE_HINT_MAX + 1, "%s", LINE_QUIT);
+ snprintf(settings->line_alert, LINE_HINT_MAX + 1, "%s", LINE_ALERT);
+ snprintf(settings->line_normal, LINE_HINT_MAX + 1, "%s", LINE_NORMAL);
}
static const struct keys_strings {
@@ -110,15 +124,15 @@ static const struct keys_strings {
/* defines from toxic.h */
static void key_defaults(struct user_settings* settings)
{
- settings->key_next_tab = T_KEY_NEXT;
- settings->key_prev_tab = T_KEY_PREV;
- settings->key_scroll_line_up = KEY_PPAGE;
- settings->key_scroll_line_down = KEY_NPAGE;
- settings->key_half_page_up = T_KEY_C_F;
- settings->key_half_page_down = T_KEY_C_V;
- settings->key_page_bottom = T_KEY_C_H;
- settings->key_peer_list_up = T_KEY_C_LB;
- settings->key_peer_list_down = T_KEY_C_RB;
+ settings->key_next_tab = T_KEY_NEXT;
+ settings->key_prev_tab = T_KEY_PREV;
+ settings->key_scroll_line_up = KEY_PPAGE;
+ settings->key_scroll_line_down = KEY_NPAGE;
+ settings->key_half_page_up = T_KEY_C_F;
+ settings->key_half_page_down = T_KEY_C_V;
+ settings->key_page_bottom = T_KEY_C_H;
+ settings->key_peer_list_up = T_KEY_C_LB;
+ settings->key_peer_list_down = T_KEY_C_RB;
settings->key_toggle_peerlist = T_KEY_C_B;
}
@@ -212,7 +226,7 @@ int settings_load(struct user_settings *s, const char *patharg)
config_t cfg[1];
config_setting_t *setting;
const char *str = NULL;
-
+
/* Load default settings */
ui_defaults(s);
tox_defaults(s);
@@ -262,6 +276,19 @@ int settings_load(struct user_settings *s, const char *patharg)
config_setting_lookup_bool(setting, ui_strings.show_welcome_msg, &s->show_welcome_msg);
config_setting_lookup_int(setting, ui_strings.time_format, &s->time);
s->time = s->time == TIME_24 || s->time == TIME_12 ? s->time : TIME_24; /* Check defaults */
+
+ if ( config_setting_lookup_string(setting, ui_strings.line_join, &str) ) {
+ snprintf(s->line_join, sizeof(s->line_join), "%s", str);
+ }
+ if ( config_setting_lookup_string(setting, ui_strings.line_quit, &str) ) {
+ snprintf(s->line_quit, sizeof(s->line_quit), "%s", str);
+ }
+ if ( config_setting_lookup_string(setting, ui_strings.line_alert, &str) ) {
+ snprintf(s->line_alert, sizeof(s->line_alert), "%s", str);
+ }
+ if ( config_setting_lookup_string(setting, ui_strings.line_normal, &str) ) {
+ snprintf(s->line_normal, sizeof(s->line_normal), "%s", str);
+ }
}
/* paths */
@@ -289,48 +316,48 @@ int settings_load(struct user_settings *s, const char *patharg)
if ( config_setting_lookup_string(setting, tox_strings.avatar_path, &str) ) {
snprintf(s->avatar_path, sizeof(s->avatar_path), "%s", str);
- int len = strlen(s->avatar_path);
+ int len = strlen(str);
if (len >= sizeof(s->avatar_path))
s->avatar_path[0] = '\0';
}
}
- /* keys */
- if ((setting = config_lookup(cfg, key_strings.self)) != NULL) {
- const char* tmp = NULL;
- if (config_setting_lookup_string(setting, key_strings.next_tab, &tmp))
- s->key_next_tab = key_parse(&tmp);
- if (config_setting_lookup_string(setting, key_strings.prev_tab, &tmp))
- s->key_prev_tab = key_parse(&tmp);
- if (config_setting_lookup_string(setting, key_strings.scroll_line_up, &tmp))
- s->key_scroll_line_up = key_parse(&tmp);
- if (config_setting_lookup_string(setting, key_strings.scroll_line_down, &tmp))
- s->key_scroll_line_down= key_parse(&tmp);
- if (config_setting_lookup_string(setting, key_strings.half_page_up, &tmp))
- s->key_half_page_up = key_parse(&tmp);
- if (config_setting_lookup_string(setting, key_strings.half_page_down, &tmp))
- s->key_half_page_down = key_parse(&tmp);
- if (config_setting_lookup_string(setting, key_strings.page_bottom, &tmp))
- s->key_page_bottom = key_parse(&tmp);
- if (config_setting_lookup_string(setting, key_strings.peer_list_up, &tmp))
- s->key_peer_list_up = key_parse(&tmp);
- if (config_setting_lookup_string(setting, key_strings.peer_list_down, &tmp))
- s->key_peer_list_down = key_parse(&tmp);
- if (config_setting_lookup_string(setting, key_strings.toggle_peerlist, &tmp))
- s->key_toggle_peerlist = key_parse(&tmp);
- }
+ /* keys */
+ if ((setting = config_lookup(cfg, key_strings.self)) != NULL) {
+ const char* tmp = NULL;
+ if (config_setting_lookup_string(setting, key_strings.next_tab, &tmp))
+ s->key_next_tab = key_parse(&tmp);
+ if (config_setting_lookup_string(setting, key_strings.prev_tab, &tmp))
+ s->key_prev_tab = key_parse(&tmp);
+ if (config_setting_lookup_string(setting, key_strings.scroll_line_up, &tmp))
+ s->key_scroll_line_up = key_parse(&tmp);
+ if (config_setting_lookup_string(setting, key_strings.scroll_line_down, &tmp))
+ s->key_scroll_line_down= key_parse(&tmp);
+ if (config_setting_lookup_string(setting, key_strings.half_page_up, &tmp))
+ s->key_half_page_up = key_parse(&tmp);
+ if (config_setting_lookup_string(setting, key_strings.half_page_down, &tmp))
+ s->key_half_page_down = key_parse(&tmp);
+ if (config_setting_lookup_string(setting, key_strings.page_bottom, &tmp))
+ s->key_page_bottom = key_parse(&tmp);
+ if (config_setting_lookup_string(setting, key_strings.peer_list_up, &tmp))
+ s->key_peer_list_up = key_parse(&tmp);
+ if (config_setting_lookup_string(setting, key_strings.peer_list_down, &tmp))
+ s->key_peer_list_down = key_parse(&tmp);
+ if (config_setting_lookup_string(setting, key_strings.toggle_peerlist, &tmp))
+ s->key_toggle_peerlist = key_parse(&tmp);
+ }
#ifdef AUDIO
if ((setting = config_lookup(cfg, audio_strings.self)) != NULL) {
config_setting_lookup_int(setting, audio_strings.input_device, &s->audio_in_dev);
s->audio_in_dev = s->audio_in_dev < 0 || s->audio_in_dev > MAX_DEVICES ? 0 : s->audio_in_dev;
-
+
config_setting_lookup_int(setting, audio_strings.output_device, &s->audio_out_dev);
s->audio_out_dev = s->audio_out_dev < 0 || s->audio_out_dev > MAX_DEVICES ? 0 : s->audio_out_dev;
-
+
config_setting_lookup_float(setting, audio_strings.VAD_treshold, &s->VAD_treshold);
- }
+ }
#endif
#ifdef SOUND_NOTIFY
@@ -340,7 +367,7 @@ int settings_load(struct user_settings *s, const char *patharg)
if (str && strcasecmp(str, NO_SOUND) != 0)
set_sound(error, PACKAGE_DATADIR "/sounds/ToxicError.wav");
}
-
+
if ( !config_setting_lookup_string(setting, sound_strings.user_log_in, &str) ||
!set_sound(user_log_in, str) ) {
if (str && strcasecmp(str, NO_SOUND) != 0)
diff --git a/src/settings.h b/src/settings.h
index 52e6ddc..1cc9e13 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -25,6 +25,9 @@
#include
+/* Represents line_* hints max strlen */
+#define LINE_HINT_MAX 3
+
/* holds user setting values */
struct user_settings {
int autolog; /* boolean */
@@ -37,19 +40,24 @@ struct user_settings {
int show_typing_other; /* boolean */
int show_welcome_msg; /* boolean */
+ char line_join[LINE_HINT_MAX + 1];
+ char line_quit[LINE_HINT_MAX + 1];
+ char line_alert[LINE_HINT_MAX + 1];
+ char line_normal[LINE_HINT_MAX + 1];
+
char download_path[PATH_MAX];
char chatlogs_path[PATH_MAX];
char avatar_path[PATH_MAX];
- int key_next_tab;
- int key_prev_tab;
- int key_scroll_line_up;
- int key_scroll_line_down;
- int key_half_page_up;
- int key_half_page_down;
- int key_page_bottom;
- int key_peer_list_up;
- int key_peer_list_down;
+ int key_next_tab;
+ int key_prev_tab;
+ int key_scroll_line_up;
+ int key_scroll_line_down;
+ int key_half_page_up;
+ int key_half_page_down;
+ int key_page_bottom;
+ int key_peer_list_up;
+ int key_peer_list_down;
int key_toggle_peerlist;
#ifdef AUDIO
@@ -84,5 +92,10 @@ enum {
DFLT_HST_SIZE = 700,
} settings_values;
+#define LINE_JOIN "-->"
+#define LINE_QUIT "<--"
+#define LINE_ALERT "-!-"
+#define LINE_NORMAL "---"
+
int settings_load(struct user_settings *s, const char *patharg);
#endif /* #define SETTINGS_H */
diff --git a/src/toxic.c b/src/toxic.c
index b2a6291..5f3dbeb 100644
--- a/src/toxic.c
+++ b/src/toxic.c
@@ -1,4 +1,4 @@
-/* main.c
+/* toxic.c
*
*
* Copyright (C) 2014 Toxic All Rights Reserved.
@@ -332,13 +332,13 @@ static Tox *init_tox(void)
#define MIN_NODE_LINE 50 /* IP: 7 + port: 5 + key: 38 + spaces: 2 = 70. ! (& e.g. tox.im = 6) */
#define MAX_NODE_LINE 256 /* Approx max number of chars in a sever line (name + port + key) */
#define MAXNODES 50
-#define NODELEN (MAX_NODE_LINE - TOX_CLIENT_ID_SIZE - 7)
+#define NODELEN (MAX_NODE_LINE - TOX_PUBLIC_KEY_SIZE - 7)
static struct toxNodes {
int lines;
char nodes[MAXNODES][NODELEN];
uint16_t ports[MAXNODES];
- char keys[MAXNODES][TOX_CLIENT_ID_SIZE];
+ char keys[MAXNODES][TOX_PUBLIC_KEY_SIZE];
} toxNodes;
static int load_nodelist(const char *filename)
@@ -368,7 +368,7 @@ static int load_nodelist(const char *filename)
toxNodes.ports[toxNodes.lines] = atoi(port);
char *key_binary = hex_string_to_bin(key_ascii);
- memcpy(toxNodes.keys[toxNodes.lines], key_binary, TOX_CLIENT_ID_SIZE);
+ memcpy(toxNodes.keys[toxNodes.lines], key_binary, TOX_PUBLIC_KEY_SIZE);
free(key_binary);
toxNodes.lines++;