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++;