1
0
mirror of https://github.com/Tha14/toxic.git synced 2025-04-08 07:22:58 +02:00

Compare commits

...

1599 Commits

Author SHA1 Message Date
jfreegman
30d01127e7
Remove invalid groupchat commands
These commands only work in audio conferences
2023-10-05 13:37:54 -04:00
jfreegman
85ab7592c9
Fix group ignore functionality
Ignoring a peer now persists if they leave/disconnect and rejoin the group.
In addition, ignore status is now displayed in the peer list sidebar
as a red # symbol.
2023-10-03 20:33:37 -04:00
jfreegman
6cdd01da25
Fix syntax error in static build script 2023-09-03 08:16:42 -04:00
jfreegman
69e4ed452d
tell compiler that exit_toxic funcs don't return 2023-08-26 08:05:43 -04:00
jfreegman
4c77e80a7f
Fix ID lookup error messages
We now properly distinguish between ID lookups and domain name lookups
and print the appropriate error message for each given case
2023-08-09 10:39:27 -04:00
jfreegman
ff669be8d1
detach group names from global name
Group names are now set on a per-group basis and are not affected
by the global /nick command.
2023-04-04 16:16:57 -04:00
Pigpog
5d757e1230
Update help dialog height to fit the new commands
Made the "global" and "chat" help pages fit properly in the dialog again.
I also made the logic for deciding height for the chat page consistent with the other pages.
2023-03-04 17:07:15 -05:00
jfreegman
70ab422acc
Update static build script 2023-03-04 10:11:37 -05:00
jfreegman
2a052edb9e
Bump version to 0.12.0 & Update man pages
We no longer use libera as they were found to be spying on their
users' private conversations, so we've replaced it with a
public tox group via the new groupchat implementation
2023-03-04 09:52:15 -05:00
jfreegman
efbfa2c95c
Remove toxme.io from nameservers list as it no longer exists 2023-01-11 13:16:13 -05:00
jfreegman
3f3e848b6f
Show connection status in groupchat peerlist 2023-01-05 12:33:04 -05:00
8d125d5e6b
Change conference invite, accept, Add NGC join, invite, accept 2023-01-05 19:12:00 +02:00
fbdc20dfa5
fix: git clone toxcore recursive 2022-11-30 12:36:05 +01:00
jfreegman
e8388bf20c
Show toxcore TRACE logging messages
I'm not sure why this was disabled. It shouldn't be.
2022-10-13 23:27:31 -04:00
jfreegman
398aecdd92
Fix group whispering for duplicate nicks
If a group has numerous peers with the same nick we now require
their public key in order to send a private message. Previously
we would greedily send the message to the first peer
in the list.
2022-10-06 14:16:16 -04:00
jfreegman
57a439c9b4
Remove testnet specific code
Preparing for ngc merge
2022-09-22 14:05:23 -04:00
jfreegman
0aea5d7fbe
Remove testnet specific code
Preparing for ngc merge
2022-09-22 13:51:00 -04:00
jfreegman
e56edd556f
Remove error code that no longer exists 2022-07-14 00:17:39 -04:00
jfreegman
7ed031b9bf
Fix static build script 2022-06-28 10:54:19 -04:00
6ef2c784c5
Fix tab alert bug on peer exit 2022-06-28 17:31:27 +03:00
jfreegman
058057c64d
Fix style issues 2022-06-27 19:42:38 -04:00
146b00b8ca
Fix chatlog saving with new hide connection msg pr 2022-06-28 01:58:32 +03:00
jfreegman
85024bfce8
Update config man page 2022-06-27 10:40:03 -04:00
129bb6ba68
New option: Hide peer connection status in groups 2022-06-27 17:31:05 +03:00
jfreegman
68b4713ef7
Update group API 2022-06-02 10:20:38 -04:00
jfreegman
46eb69412e
Update group API 2022-04-23 13:14:44 -04:00
jfreegman
f47b4c1c3c
Remove duplicate help menu entry 2022-03-18 12:24:07 -04:00
jfreegman
22eb6797b1
Fix another group peerlist scrolling bug 2022-03-18 12:24:06 -04:00
jfreegman
0edad7b862
Fix group peerlist scrolling bug 2022-03-18 12:24:06 -04:00
jfreegman
cc80da00fc
Increase how long we wait after joining a group before showing peer join messages 2022-03-18 12:24:06 -04:00
jfreegman
32efac931c
Connect second testnet bootstrap node to ipv4 instead of 6 2022-03-18 12:24:05 -04:00
jfreegman
4f936e5f9c
Add higher precision for logging timestamps 2022-03-18 12:24:05 -04:00
jfreegman
529d905bd0
Add timestamps to logger and enable widechar for bazel build 2022-03-18 12:24:05 -04:00
jfreegman
631b1d8b08
Fix second bootstrap node info 2022-03-18 12:24:04 -04:00
jfreegman
9ac8d517e9
Add second testnet bootstrap node 2022-03-18 12:24:04 -04:00
jfreegman
90152f5e17
some logging code cleanup 2022-03-18 12:24:04 -04:00
jfreegman
4d501aeb2a
Add support for new voice state feature 2022-03-18 12:24:03 -04:00
jfreegman
1b9f4f337a
Fix name change notifications
Due to recent core changes we now need to store a peer's
previous name instead of relying on API lookups via the
peer_id in the name change callback in order to display
the correct info
2022-03-18 12:24:03 -04:00
jfreegman
812f2d1ff9
Fix some weird/incorrect code for printing private messages 2022-03-18 12:24:03 -04:00
jfreegman
2eeb1de20d
Remove usage of deprecated API typedefs 2022-03-18 12:24:02 -04:00
jfreegman
ba896fd124
Hardcode testnet bootstrap node 2022-03-18 12:24:02 -04:00
jfreegman
3ff3516e42
Add more descriptive errors to some moderation commands 2022-03-18 12:24:02 -04:00
jfreegman
2ef3d68173
Properly handle group mod event
We now update all peer roles if we get a moderation event
in which the peer ID is invalid, per recent API changes
2022-03-18 12:24:01 -04:00
jfreegman
7a099f86c8
Fix duplicate config example line 2022-03-18 12:24:01 -04:00
jfreegman
9a629072b3
Fix possible null deref 2022-03-18 12:24:00 -04:00
jfreegman
27259ff23f
Update function name (merge conflict) 2022-03-18 12:24:00 -04:00
jfreegman
f786b7ae6a
Refactor peer-specific commands
This takes into account the possibility of multiple peers in
the group using the same nick. The /whois command now lists
all peers associated with the input name, and all commands
that target a peer with a non-unique nick will require the
public key to be used.
2022-03-18 12:24:00 -04:00
jfreegman
cd4a5e5fde
Fix rebase mistakes 2022-03-18 12:23:59 -04:00
jfreegman
0b32b985f1
Add topic lock command and callbacks 2022-03-18 12:23:59 -04:00
jfreegman
5851cb2dd8
Don't announce/alert on self group join 2022-03-18 12:23:59 -04:00
jfreegman
1847025213
Make /whois show both public key and name 2022-03-18 12:23:58 -04:00
jfreegman
1a2320b035
Add the ability to make peer-specific commands using public keys
This allows us to use commands on peers who may be using nicks with strange
or unsupported unicode characters
2022-03-18 12:23:58 -04:00
jfreegman
1211899a40
Add /list command that lists all group peers w/ public keys 2022-03-18 12:23:58 -04:00
jfreegman
5dabaac804
Remove some unnecessary code 2022-03-18 12:23:57 -04:00
jfreegman
4f26171e3f
Re-add /group command
Another one lost in a rebase
2022-03-18 12:23:57 -04:00
jfreegman
fa075f1972
Add connection type to whois group peer queries 2022-03-18 12:23:57 -04:00
jfreegman
cbf3145aee
Remove redundant command /mykey
You can get your own key with the /whois command
2022-03-18 12:23:56 -04:00
jfreegman
06bdb0d167
Add groupchat help menu
It seems to have disappeared after a recent rebase
2022-03-18 12:23:56 -04:00
jfreegman
0212391d7d
Disable DHT nodeslist fetching temporarily
We don't want to fetch the mainnet nodes list when we're on
the NGC testnet. This should be fixed before the NGC merge
2022-03-18 12:23:56 -04:00
jfreegman
535a8402d6
Merge with master (V0.11.1) 2022-03-18 12:23:55 -04:00
jfreegman
2c51afd9ef
Sync with master branch 2022-03-18 12:23:55 -04:00
jfreegman
4aca8b6ecb
Fix/update groupchat UI 2022-03-18 12:23:55 -04:00
jfreegman
28be56aad9
Fix bug causing group PM's to increment window notifications by 2 instead of 1 2022-03-18 12:23:54 -04:00
jfreegman
38004367a1
Port fix for invalid error handling of widechar conversions from master 2022-03-18 12:23:54 -04:00
jfreegman
5499bb6645
Fix/update group logging implementation 2022-03-18 12:23:53 -04:00
jfreegman
ed8ba89cd8
Fix merge conflicts with master 2022-03-18 12:23:53 -04:00
jfreegman
812210d63f
Implement new groupchats 2022-03-18 12:23:53 -04:00
jfreegman
cec96e1ea3
Use calloc instead of malloc for new message queue items
This prevents us from accidentally using uninitialized memory
2022-03-18 12:17:50 -04:00
iphydf
eb7e6151a2
cleanup: Ensure python_api.c is never completely empty.
C doesn't allow this, there must be at least some declarations in it,
even if no code.
2022-03-17 17:52:37 +00:00
jfreegman
22ca3704d2
Use a small hack to get around an ncurses buffer overread
Patch by iphydf
2022-03-16 16:31:41 -04:00
iphydf
fdfaaf953f
cleanup: Remove all uses of deprecated enum names.
All-caps enum names have been deprecated for a while now and will go
away in 0.3.0.
2022-03-07 19:20:35 +00:00
jfreegman
310cf464d0
Fix bug causing messages containing newline byte to disappear
The wcswidth() function was silently failing when trying to convert
messages containing a newline to a widechar buffer which resulted
in the message showing up as an empty line. we now fall back
to using strlen to get the width of the string, which might still
cause minor display bugs when the message contains unicode, but is
still better than losing messages entirely.
2022-03-02 15:58:21 -05:00
jfreegman
0c11b3121a
Update static musl build script
Bump toxcore to v0.2.16 and add new msgpack dependency
2022-02-20 13:12:23 -05:00
jfreegman
1bdf0041bc
Bump toxic and curl versions in static build script 2022-02-12 21:17:19 -05:00
jfreegman
6a203fd7bf
Make sure we compare wchars to wchars instead of bytes 2022-02-03 13:01:08 -05:00
iphydf
93b3bbd5f6
chore: Use latest instead of versioned toktok-stack image. 2022-01-30 19:32:00 +00:00
jfreegman
e122c5dbca
Use widechars to display strings in the UI
This fixes a bug where printing a bunch of UTF8 chars with glyphs
that have a size > 1 would make the entire chat window disappear.
It also fixes an issue where said UTF8 chars would be truncated
and generally not display correctly.
2022-01-27 15:45:56 -05:00
jfreegman
f6f41a510b
Add some simple impersonation detection on friend requests
This will alert the user when the first six bytes of a new
contact's public key is the same as any other contact in
their list. These 6 bytes are used elsewhere in toxic for
unique identification.

Also did a small refactor regarding the KEY_IDENT_BYTES
define
2022-01-23 11:32:57 -05:00
jfreegman
05dbc626e2
Make sure we check for duplicate paths in pending file transfers list
This fixes a bug where if you receive multiple file transfer
requests simultaneously and they have the same path the files
will overwrite each other
2022-01-17 10:53:34 -05:00
iphydf
ceb175e3f1
chore: Add check that the static build script works.
Otherwise it'll break again in the future and we won't know.
2022-01-13 01:37:24 +00:00
Maxim Biro
4bd1d9bfee
Update libbrotli pc file sed
libbrotli has updated its .pc files since the last sed was written, so
it didn't work anymore, resulting in Toxic build failing. However, the
way they have updated it, it's still broken, so a different sed is
needed.
2022-01-05 15:55:30 -05:00
Maxim Biro
55944aa5a9
Remove broken Docker check
The Docker detection method doesn't work on cgroup v2 systems, so the
script just keeps erroring out.

There doesn't seem to be a simple way to detect that we are running
inside a Docker container, so it makes sense to drop that check
altogether.
2022-01-05 15:52:57 -05:00
Maxim Biro
b71c6a3792
Improve static build script documentation 2022-01-05 15:51:52 -05:00
jfreegman
0239509439
Bump version to 0.11.3 and update toxcore version in static build script 2021-12-24 14:21:26 -05:00
jfreegman
602d9d97c1
Send file control cancel when we block or delete a friend 2021-12-22 14:53:09 -05:00
jfreegman
6f8f6f0ac5
Implement file transfer queue for offline friends
File transfers initiated for offline friends are now
added to a queue and initiated all at once when the friend
appears online.
2021-12-22 14:27:28 -05:00
iphydf
8d58e8f4d6
chore: Fix BUILD format (we check this on toktok-stack now). 2021-12-21 12:23:01 +00:00
jfreegman
b6f892edf5
Remove unnecessary define for keeping track of string array size 2021-12-15 13:39:11 -05:00
jfreegman
f91d10c831
Add missing ifdef 2021-12-13 12:37:51 -05:00
jfreegman
3f18c6f8de
cleanup: fix some uninitialized memory warnings and clarify some logic 2021-12-13 12:33:58 -05:00
jfreegman
bf1e1b73fc
Do proper error handling for a few malloc calls 2021-12-12 11:30:27 -05:00
jfreegman
3eac65036c
Make infer print full error log 2021-12-11 20:13:31 -05:00
iphydf
85f9ec6b9a
chore: Add "infer" static analysis action on CI. 2021-12-11 23:55:29 +00:00
iphydf
5230616a9d
chore: Fix CI: don't install bootstrap daemon. 2021-12-11 23:01:47 +00:00
iphydf
8e0e318df1
chore: Add github CI workflow. 2021-12-11 22:47:54 +00:00
iphydf
701c0e1e94
cleanup: Reduce the amount of "extern" in .c files.
There is no check at all that the types of externs actually match the
type of the definition. This just accidentally was not a problem, but now
the compiler helps a bit in keeping it that way.
2021-12-11 22:35:51 +00:00
iphydf
71f6a8d4d6
cleanup: Avoid casting away constness from pointers. 2021-12-11 22:22:25 +00:00
jfreegman
1cace1e81d
Do exact length check for string passed to tox_pk_string_to_bytes 2021-12-11 17:13:30 -05:00
jfreegman
3030cda47e
Fix possible null dereference
game invite info needs to be set after calloc in case it fails
2021-12-10 13:44:33 -05:00
jfreegman
2946e0dc56
Zero-init coordinates
Not strictly necessary, but makes static analysis happy
2021-12-10 13:09:47 -05:00
iphydf
da90ca8b74
Fix bazel build for games. 2021-12-10 17:52:43 +00:00
jfreegman
17e5cc1147 Merge branch 'toktok' 2021-12-08 14:38:39 -05:00
jfreegman
d02ac24de8
Fix regression causing typing notifications to break
Also a small refactor so we use less duplicate code and reduce mutex usage
2021-12-07 22:14:32 -05:00
jfreegman
66e4c590dc
Fix some lazy/incorrect code in cmd_add()
This fixes a rare but possible scenario where a name@domain lookup that's
longer than a tox id won't work. It also fixes custom messages for domain
lookups
2021-12-07 13:27:38 -05:00
jfreegman
8176b43880
Update static build script
Bump curl and toxcore versions
2021-12-06 11:42:53 -05:00
jfreegman
b88dc9fda1
Bump version to 0.11.2 2021-12-06 11:08:17 -05:00
jfreegman
d7a19791b4
Remove CHANGELOG.md
This hasn't been updated in ages
2021-12-06 10:59:00 -05:00
jfreegman
e2c8497da9
Cleanup code around tox ID/pk conversion functions 2021-12-06 10:46:19 -05:00
jfreegman
afbd185222
/add command no longer requires quotes around the message 2021-12-06 10:06:49 -05:00
iphydf
64794e14cd
chore: Use toktok-stack 0.0.23 for cirrus builds. 2021-12-06 00:40:44 +00:00
jfreegman
e9a0a30408
Some documentation improvements 2021-12-05 17:03:42 -05:00
jfreegman
8aa57b0539
Fix issue with audio VAD threshold
The default VAD was always being set to 0. We now use the
value provided by the config file if defined
2021-12-05 16:36:13 -05:00
jfreegman
7b734f3996
Make tab completion case sensitive 2021-12-04 16:34:15 -05:00
jfreegman
27e20d6f44
Fix possible buffer overrun in python API 2021-11-26 18:57:40 -05:00
iphydf
f39da4d7f2
chore: Add a bazel test that calls toxic with --help.
This way we at least know it doesn't crash on load. Some code runs. We'll
want some real tests at some point, but this ensures *something* works.
2021-11-26 23:57:39 +00:00
iphydf
af70c3d660
chore: Remove travis; add cirrus ci.
We still need a GitHub workflow to test the "make" build. For now, we only
test toktok-stack and the bazel build.
2021-11-26 23:52:39 +00:00
jfreegman
58d0bd0663
Allow empty notes 2021-11-26 09:03:43 -05:00
jfreegman
090fcfffe3
Fix a couple data races 2021-11-26 08:51:38 -05:00
jfreegman
1cba726bb8
Show self connection type and small UI makeover
Connection type is now separated from status in the top status bar
2021-11-25 23:05:33 -05:00
jfreegman
50a074ed22
Remove some unnecessary calls to flag_interface_refresh() 2021-11-21 20:16:02 -05:00
jfreegman
3fddc410b3
Reduce sound notify polling by factor of 10
Polling 100 times per second is excessive. This should help reduce
Toxic's resource usage without a noticable difference to the user.
2021-11-21 14:52:09 -05:00
jfreegman
0a708e4a2e
Make sure conference audio calls are properly flagged
This fixes a bug causing the conference audio noise animations
and indicators from properly displaying
2021-11-20 10:16:47 -05:00
jfreegman
b7002ef3f0
Allow ncurses refresh rate to be set dynamically
This allows us to have a higher refresh rate only when necessary (e.g. games)
2021-11-20 09:49:04 -05:00
jfreegman
1803da85c1
Refactor unread message flagging
This fixes an issue where the interface wasn't able to update
when the unread message flag changed. It also cleans up some
ugly code
2021-11-19 22:54:35 -05:00
jfreegman
f3f81111c8
Greatly reduce redundant window refreshing
This should substantially reduce CPU usage and possibly fix some
issues with interface jittering/flashing
2021-11-19 17:54:35 -05:00
jfreegman
13337041ce
Show friend connection type (UDP/TCP) in friend status bar 2021-11-10 13:27:11 -05:00
Sergei Trofimovich
41e93adbdb game_chess.c: always use "%s"-style format for printf()-style functions
`ncuses-6.3` added printf-style function attributes and now makes
it easier to catch cases when user input is used in palce of format
string when built with CFLAGS=-Werror=format-security:

    toxic/src/game_chess.c:1633:63: error:
      format not a string literal and no format arguments [-Werror=format-security]
     1633 |         mvwprintw(win, board->y_bottom_bound + 2, x_mid, state->status_message);
          |                                                          ~~~~~^~~~~~~~~~~~~~~~

Let's wrap all the missing places with "%s" format.
2021-11-04 09:44:33 +00:00
jfreegman
34b7c0a0d8
Options parsing code cleanup 2021-11-03 16:23:38 -04:00
cryptogospod
bcdec5d624
Improve installation instructions 2021-09-12 16:58:28 +02:00
jfreegman
9e353443c2
Fix outdated help message 2021-08-16 11:14:09 -04:00
jfreegman
d02f3b4acb
Fix a graphical bug with the game border on some terminal emulators 2021-07-27 14:15:36 -04:00
jfreegman
f2b1c81279
Fix static build script and update libcurl version 2021-06-28 23:07:03 -04:00
jfreegman
768617a129
Fix small build bug and bump to v0.11.1 2021-06-28 16:04:25 -04:00
jfreegman
8dfd009e0e
Some minor fixes for game module 2021-06-28 13:54:25 -04:00
jfreegman
321f694bb8
Add ability to toggle colours in game of life 2021-06-03 14:45:03 -04:00
jfreegman
4514ecd839
Refactor game window sizing
- Add large square and rectangle window types
- Remove forced small windows
- Fit game of life to largest possible window type
- Hide cursor in game of life when game is running
2021-06-03 01:19:49 -04:00
jfreegman
5e67571908
Implement Conway's Game of Life 2021-06-01 23:00:00 -04:00
jfreegman
c293fbe0c7
Add support for game window notifications 2021-05-24 14:30:29 -04:00
jfreegman
93fb84206d
Bump to version 0.11.0 2021-05-24 14:30:28 -04:00
jfreegman
35aa6922d6
Show previous window instead of Home after closing a window 2021-05-24 14:30:28 -04:00
jfreegman
7abf6388f8
Add ability to compile without game support 2021-05-24 14:30:28 -04:00
jfreegman
7aeb1a0aac
Add networking to game engine / add multiplayer chess 2021-05-24 14:30:27 -04:00
jfreegman
60bdcf0ba5
Begin implementing chess 2021-05-24 14:30:27 -04:00
jfreegman
a623976a0e
Add game module (WIP) 2021-05-24 14:30:26 -04:00
jfreegman
556a522637
Update man pages with new IRC server 2021-05-24 13:50:00 -04:00
jfreegman
a2f0f298aa
Fix bug showing friends with busy status as online 2021-04-20 13:29:41 -04:00
jfreegman
0fc1d9e994
Add two missing mutex unlocks 2021-03-27 11:50:57 -04:00
jfreegman
80fd3d3b97
Fix buggy behaviour when printing non-ascii characters in Home input field
This line doesn't appear to be doing anything useful - most likely a leftover
from the recent UI overhaul
2021-01-25 22:36:05 -05:00
jfreegman
07a41f9e0b
Show previous window instead of Home after closing a window 2021-01-25 17:09:23 -05:00
jfreegman
f643975941
Fix bug preventing the /clear command from working in Home window 2021-01-23 21:17:46 -05:00
jfreegman
a5246bcbc6
Bump to version 0.10.1 2021-01-20 16:18:43 -05:00
Maxim Biro
b37e28c2d0
Add a script for building minimal static toxic
The intention is that JFreegman would run it locally on his machine for
every Toxic release and publish the build artifacts on GitHub for
download, similarly to how the qTox team makes release builds. This
should mitigate the loss of the Jenkins build server to some extent,
which used to provide Toxic builds before.
2021-01-19 21:48:51 -05:00
Maxim Biro
973e60ef11
Fix Makefile assignment bug
When a user provides variable=value as an argument to make, all
assignments to that variable are ignored within the Makefile because the
user has explicitly overrode variable to be "value". This made the
ENABLE_ASAN assignment to be ignored, resulting in Toxic always enabling
ASAN unless you run `make ENABLE_ASAN=disabled`, which is not
documented and not how it's intended to work. This can be fixed by
prefixing the assignment with "override", but to be in line with other
argument assignments we just change the variable name.

See more at:
https://www.gnu.org/software/make/manual/html_node/Overriding.html
2021-01-19 20:18:24 -05:00
jfreegman
ae94bc593b
Rename some build options for naming consistency 2021-01-19 15:21:31 -05:00
jfreegman
81eb58532e
Fix bug sometimes causing join message spam on conference join 2021-01-17 17:10:10 -05:00
jfreegman
8464ea9a7a
Fix minor display bug with the audio call info box 2021-01-12 19:18:22 -05:00
jfreegman
b77bff35a1
Add config man entries for colour scheme options 2020-12-06 11:52:46 -05:00
jfreegman
eb964b64c2
Fix off by one error and comment magic numbers 2020-12-05 20:53:09 -05:00
Lily
2ff9d29491
Custom colors proof of concept
Fix formatting

Fix repeated variable in example config
2020-12-05 17:46:13 -06:00
jfreegman
2640919318
Don't announce when ghost peers leave the group
This appears to be a toxcore bug, but nonetheless it looks ugly. Also changed
group -> conference for join/part messages
2020-12-03 11:49:48 -05:00
jfreegman
2fcbc4fa1c
Remove lots of duplicate code related to printing timestamps 2020-11-30 17:55:57 -05:00
jfreegman
4330bf5867
Show peer join/part messages in conferences
Also a couple trivial fixes
2020-11-30 12:06:13 -05:00
jfreegman
3f1b7cdd26
Update config example and some default settings to reflect recent changes 2020-11-30 00:58:43 -05:00
jfreegman
1e985c1456
Interface improvements and bump to v0.10.0
- Give window tab and statusbar a make over
- Place window tab above input field
- Reduce input field to one square in height
- Refactor window tab so that it's now a subwin of its parent ToxWindow
- Fix bug causing notification counter to sometimes increment by 2
- No longer scroll on output when output is not at bottom of screen
- Show a small indicator on far left of window tab when output is
  not at bottom of screen
- Reduce ncurses/UI thread sleep time by half
- Handle nanosleep errors better
2020-11-29 23:26:51 -05:00
jfreegman
61740bda85
Fix a couple minor issues
Print a warning if remove() fails, and check if the win pointer is null
before using it (this is unnecessary but it's correct and shuts coverity up)
2020-11-26 18:25:37 -05:00
jfreegman
0d8e6d713e
Update readme screenshot and bump to v0.9.1 2020-11-26 16:58:09 -05:00
jfreegman
39e4ff8bd6
Fix tab complete bug
If a directory contains a single entry tab complete will no longer fail
2020-11-26 16:20:51 -05:00
jfreegman
0434ac186a
Fix bug causing file transfer status bars to be truncated 2020-11-26 16:17:00 -05:00
jfreegman
8d9d51640c
Fix display bug caused by noread flag appended to unread messages
A line's line count now increments without messing up the formatting in cases where
the noread flag wraps to the next line.

Additionally, the way noread flags are handled has been refactored and made
more efficient.
2020-11-26 16:16:59 -05:00
jfreegman
c4c0c0d1f4
Another logging fix
When renaming a log file, if the new name already exists we just
start appending to it and delete the old file. There's no need
to create a backup.

This fixes an issue where leaving and rejoining the same group
multiple times will eventually lead to the logger not working
due to trying to use the same file name over and over again.
2020-11-26 16:10:59 -05:00
jfreegman
3f2826bd66
Add release and LLVM asan build options
The release build uses -O2 and flto, and has no debug symbols.
-Wmissing-field-initializer was removed due to false positives
on newer versions of clang
2020-11-26 16:04:54 -05:00
jfreegman
7b7ea0e386
Fix small regression
This wasn't supposed to make it into the commit
2020-11-24 23:42:25 -05:00
jfreegman
d35a38735b
Fix line wrapping/padding issues
It should now parse messages with newlines properly as well as messages that
contain long sequences of characters with no spaces
2020-11-24 19:47:04 -05:00
jfreegman
f0c4906fdc
Fix some off by one bugs with line scrolling and some cleanup
Instead of trying (and failing) to correctly calculate the number of lines on the
screen a given message will need space for, we dynamically set the value both
on initiation of a new line, and whenever that line is printed to the screen
using the print_wrap() function.

This should fix the screen occasionally not scrolling down the correct number of
lines when a new message is printed.
2020-11-24 19:36:03 -05:00
jfreegman
56ba61e061
Cleanup and refactor x11 code
- Deleted X11 code for an unfinished/broken feature
- Rename xtra -> x11focus
- Cleanup the remaining code a bit
2020-11-24 19:31:59 -05:00
jfreegman
898d89e95a
Properly handle failures to convert widechar strings to multibyte 2020-11-24 16:41:42 -05:00
jfreegman
1fd1e27bdf
Remove seconds from default timestamp
Also reduce the --- prefix to one dash before a message. These characters are taking
up valuable real-estate
2020-11-22 18:53:32 -05:00
jfreegman
8e84ac58d4
Implement word wrapping
It's about time
2020-11-22 18:41:12 -05:00
jfreegman
9d65997871
Add notification counters to bottom tab
A counter now increments in the bottom bar for unfocused windows showing how
many unread messages are pending. Tabs with no pending messages show [*]
instead of their index (showing the index is useless and somewhat confusing)
2020-11-21 11:25:41 -05:00
jfreegman
da2889f3ab
Fix UI regression
The conference number needs to be displayed in the tab name
so that you can invite friends to conferences
2020-11-20 02:10:52 -05:00
jfreegman
312b38d253
A few small fixes
- Fix race condition in draw_peer()
- Handle realloc_peer_list() error
- Remove dead code in cmd_conference()
- Reduce scope of a few variable variables
- Fix possible buffer truncation in api.c
2020-11-19 14:23:32 -05:00
jfreegman
0554bf0240
Create backup of duplicate log file instead of deleting it
This case should never occur, but just in case it does it's good to handle it
without any data loss
2020-11-19 14:23:31 -05:00
jfreegman
53a7530e8a
Some UI improvements
- Bottom tab now only shows indices of active chat windows unless focused
- Always focus Home screen on startup instead of the last loaded conference
- Conference tab names are no longer prefixed with the conference number
- Home and Contact tab names are now capitalized
2020-11-19 01:30:30 -05:00
jfreegman
41be04a142
Implement push-to-talk for conference audio 2020-11-18 16:57:26 -05:00
jfreegman
31f36318a2
Add config settings for audio channels 2020-11-18 16:29:01 -05:00
jfreegman
f882fdf608
Use two channels for conference audio 2020-11-17 16:31:17 -05:00
jfreegman
7e1e410307
Refactor logging
- Conference logging now behaves the same as 1-on-1 chats: Instead
  of creating a new log file every time we restat the client
  we use the unique conference ID to keep track of path names.
  This also allows us to load history for saved groups on client startup

- Added a log init function / general code refactor.

- Fixed a bug that caused log files to be created even when logging
  is disabled.
2020-11-17 16:05:20 -05:00
zugz (tox)
c135c812c2
Fix playing unallocated memory on opening audio device 2020-11-16 00:00:00 +00:00
jfreegman
6c239193ab
Fix bug sometimes preventing typing status from being updated 2020-11-15 12:30:26 -05:00
jfreegman
de7db08352
Bump to version 0.9.0 2020-11-14 14:30:56 -05:00
zugz (tox)
ba5ded9bc2
Use compound literals to zero out structs instead of memset 2020-11-14 00:00:05 +00:00
zugz (tox)
4581dee4fc
astyle 2020-11-14 00:00:05 +00:00
zugz (tox)
d75d6e8b60
sort includes 2020-11-14 00:00:05 +00:00
zugz (tox)
142ce642f0
Per-call pending status and state handling
* Proper handling of incoming video calls.
* Add command /vcall for initiating video calls
* Add command /res command to set video resolution
2020-11-14 00:00:10 +00:00
zugz (tox)
7dead5ec96
Implement simplistic VAD 2020-11-14 00:00:01 +00:00
zugz
ddcf224db2
Implement groupAV 2020-11-14 00:00:01 +00:00
zugz
daf794c4a2
Rework audio device handling
We now have at most one input and one output device open at any time,
but can have multiple capture callbacks and multiple output sources.
2020-11-14 00:00:01 +00:00
jfreegman
dac0124f0f
Fix some issues with file transfers
- Fix bug causing failed avatar transfers to be sent as normal file transfers
      when a friend goes offline and comes back online
- Remove some unused members of the FileTransfer struct
- Rename filenum -> filenumber and friendnum -> friendnumber
2020-11-13 19:38:33 -05:00
jfreegman
15b7a30925
Fix some bugs/issues with the message queue
- It's no longer possible for messages to be sent out of order
- Check if logger is enabled before doing pointless API calls
- Fix linked list bug (a part of the code almost never executes)
2020-11-12 11:39:19 -05:00
jfreegman
77ab71f26f
Refactor message queue
We now attempt to send all queued messages per call to cqueue_try_send() instead
of just the oldest message in the queue. This speeds things up substantially.

Also fixed a very unlikely bug where the read receipt might wrap around to zero
which we used as a reserved value for an unsent message
2020-11-11 16:28:50 -05:00
jfreegman
68e1ba312d
Use compound literals to zero out structs instead of memset
This is cleaner and much less prone to bugs
2020-11-10 21:25:27 -05:00
jfreegman
752fc6d619
Fix race condition when window is closed with active notifications
A ToxWindow's notifications need to be halted before the window is freed
2020-11-10 17:20:40 -05:00
jfreegman
16bcb27ca7
Update openal version for macos travis build 2020-11-09 17:29:19 -05:00
jfreegman
71d7d355a6
Use enum to identify window types instead of bool variables 2020-11-09 17:01:22 -05:00
jfreegman
4188b392cc
Rename: groupchats -> conferences
This is in line with the toxcore API naming scheme and is in preparation
for the merge with the new groupchat implementation
2020-11-08 10:08:24 -05:00
jfreegman
811fbfbb1e
Fix char -> widechar comparisons 2020-11-08 00:07:28 -05:00
jfreegman
32eb7d3040
Filter invalid file names for inbound file transfers 2020-11-05 10:55:48 -05:00
jfreegman
42763905d7
Replace deprecated usleep function with nanosleep
usleep was declared obsolete in POSIX.1-2001
2020-11-04 22:05:59 -05:00
jfreegman
f64300d1d6
Close file handlers when inbound file transfer fails 2020-11-03 13:26:23 -05:00
jfreegman
1a723f0e8e
Fix bad behaviour with duplicate file names
If the new path is too long for the buffer we cancel the file transfer
and return an error instead of truncating the file name and continuing.
2020-11-03 13:03:47 -05:00
jfreegman
a86884c40e
Remove legacy code and fix a couple format specifiers
This code was added over 5 years ago and no longer serves a purpose
2020-11-03 01:00:08 -05:00
jfreegman
3f02e119f4
add missing malloc error checks and fix widechar to char comparison 2020-11-03 00:59:28 -05:00
jfreegman
1bbd50aac7
Fix a few issues
- realloc needs to be error checked
- use correct format specifiers
- make sure optarg and DATA_FILE aren't null before using them
2020-11-02 18:08:54 -05:00
jfreegman
e7a0c32a68
Refactor a few complex functions
Also moved some single use functions from misc_tools to their
respective files
2020-11-01 15:55:07 -05:00
jfreegman
7560bc9547
modularize string arrays for line completion
Instead of using various different forms of string arrays and having to handle them
differently for string completion, we now always use char pointer arrays. This allows
us to remove some large stack allocations, remove a bunch of confusing defines that
keep track of global array sizes, and generally unclutters the code so it's easier
to read.
2020-11-01 11:29:51 -05:00
jfreegman
2b43340c90
Convert all variable length arrays to heap allocations
VLA's are inherently unsafe so the safest option is to not use them
2020-11-01 11:29:48 -05:00
jfreegman
ff1620c923
fix invalid usage of stderr and incorrect formatting 2020-11-01 11:19:18 -05:00
jfreegman
1303053a27
Use c99 standard instead of gnu99
No gnu99 extensions are used or will be used
2020-10-29 19:29:28 -04:00
jfreegman
91f194c821
Fix pointer use after free bug
If toxcore fails to end a call we still need to do a cleanup
2020-10-28 23:59:28 -04:00
jfreegman
478762f76c
Dynamically allocate audio frame buffer memory 2020-10-28 23:59:25 -04:00
jfreegman
4d96d6a753
Fix regression related to https lookups
Reducing the buffer size of HTTPS responses broke DHT nodelist fetching. This change
puts the old buffer size back and converts all stack allocations of the read buffer
to heap allocations.
2020-10-27 12:34:12 -04:00
jfreegman
3cdcfbf4e5
Reduce size of some large stack memory allocations 2020-10-25 13:48:14 -04:00
jfreegman
4c302da503
Fix a bunch of Wformat-truncation warnings due to snprintf() misuse 2020-10-24 14:44:41 -04:00
Robin Linden
26b5fe8f9d
fix: Fix incorrect file specified error when building in WSL from CLion 2020-10-24 12:52:43 +02:00
jfreegman
22d60232fb
Bump to version 0.8.4 2020-10-22 22:14:33 -04:00
jfreegman
e428879beb
Fix clashing key bindings
Scrolling the groupchat peer list now uses ctrl+up and down
2020-10-13 19:52:43 -04:00
jfreegman
3015138a5a
Manually attempt to decode input char sequences
This is currently a fallback method for when the terminal doesn't
detect ctrl arrow sequences, but it is generalized for future additions
2020-10-13 16:12:55 -04:00
jfreegman
9c06ad608b
Add ability to skip words in input field with ctrl-left/right arrow 2020-10-10 11:21:15 -04:00
Johannes Heimansberg
015dbd9a96
fix: Fix non-working bell notifications
The problem with the bell notifications only happens when Toxic is
compiled with X11 support, but does not run under X. This commit changes
toxic's behavior such that it behaves identically when not running under an
X session, no matter if it has been compiled with X11 support or not.
2020-08-24 16:36:52 +02:00
jfreegman
a7466c3142
Add option to disable LAN 2020-08-10 21:56:45 -04:00
jfreegman
f012007cc4
A couple small fixes 2020-05-19 21:44:35 -04:00
jfreegman
dcf3baf60f
Make sure logger file is closed after tox_kill 2020-05-18 13:58:55 -04:00
JFreegman
4bda799a4b
Add the ability to log to file (#84) 2020-05-16 23:12:54 -04:00
iphydf
bdeae33d48
Add macOS build.
Lots of features disabled, because I can't get it to work yet. We'll
enable features one by one as we get them to work.
2020-05-05 00:47:08 +01:00
iphydf
47591d5298
chore: Use global release-drafter config. 2020-05-05 00:25:10 +01:00
iphydf
b5ace27a3e
chore: Remove astyle from travis build.
The astyle check is now done by restyled.
2020-05-04 23:50:31 +01:00
iphydf
b334622d36
Add release-drafter config. 2020-05-04 22:01:33 +01:00
jfreegman
4bfb344caa
Add option for toxcore logging in stderr 2020-05-04 16:15:28 -04:00
iphydf
16d96d6faf
Add restyled config for toxic. 2020-05-04 20:54:58 +01:00
iphydf
0ab2bad226
Add CODEOWNERS and settings.yml files. 2020-04-25 03:40:02 +00:00
iphydf
68db926f9f
Check that files are formatted correctly.
Fail the CI build if they are not.
2020-04-23 01:16:57 +00:00
iphydf
b270c1e8b7
Remove extra semicolon in lock/unlock macros.
lock/unlock are always expanded in a context followed by a semicolon.
2020-04-23 01:12:34 +00:00
jfreegman
e7142e49fd
Terminate notify before windows
This fixes a use after free bug
2020-04-22 20:54:53 -04:00
zugz (tox)
610906d07f
fix segfault on starting video 2020-04-17 00:00:00 +00:00
iphydf
6f72a191ba
Revert "Add feature flags and missing #includes."
This reverts commit dd5fa236ae1dbd7451420420b0f40f05708bc3c2.

Also, set `-std=gnu99` in Bazel build.
2020-04-17 19:37:22 +00:00
iphydf
dd5fa236ae
Add feature flags and missing #includes.
These are needed to compile on some strict Linuxes.
2020-04-15 21:34:30 +00:00
Rodrigo Martins
51e1ab94b3
Add QR disabling options to INSTALL.md 2020-04-04 23:20:52 -03:00
jfreegman
ddc8c53abf
Fix unused variable warnings and change all (void)s to UNUSED macro 2020-03-30 16:02:27 -04:00
iphydf
46513017e3
Half-hearted attempt at making toxic work on osx.
Video has no chance without X11 for now.
2020-03-30 18:14:43 +00:00
jfreegman
98cb7f58c0
Fix unused parameter and unused result warnings 2020-03-15 14:57:00 -04:00
iphydf
206bf407fd
Use rules_cc instead of native cc_binary rules. 2020-03-12 12:23:57 +00:00
iphydf
0a8ac4de3b
Fix yamllint warning about missing document start marker.
YAML apparently likes to have this marker, so let's have it.
2020-03-10 14:57:12 +00:00
jfreegman
87d54acad0
Add sponsorship button 2020-03-07 13:19:10 -05:00
iphydf
45ff6d8bac
Migrate to Camel_Case enum types.
UPPER_CASE enum types are deprecated and will be removed in 0.3.0.
2020-03-07 18:11:41 +00:00
jfreegman
437dd8baeb
Some misc fixes 2020-02-29 14:14:56 -05:00
jfreegman
b080236ee5
Fix typo 2020-02-10 17:16:56 -05:00
jfreegman
116bff8cef
format fixes 2019-12-07 23:17:02 -05:00
Rodrigo Martins
ddeca171a0
Add input line text to history on UP and DOWN 2019-12-07 18:29:33 -03:00
jfreegman
127f9462e0
make friend add fail if friend is in the block list 2019-11-16 01:55:47 -05:00
jfreegman
4b5a9abbd4
Fix A/V bug preventing the caller from being properly informed of call termination 2019-07-12 11:51:08 -04:00
JFreegman
bb2257973e
Load conference titles on startup for saved conferences (#43) 2019-06-30 14:51:13 -04:00
jfreegman
12b9cd2386
Fix header issues 2019-03-27 01:38:15 -04:00
jfreegman
2cbe8fa880
Use correct integer types to fix groupchat peer scrolling bug 2019-03-26 23:05:24 -04:00
jfreegman
2e39bee05a
Check for openal lib before attempting to build with video support 2019-03-15 16:05:54 -04:00
jfreegman
05eda76643
Partially fix autocomplete behaviour for input with spaces 2019-02-17 17:25:34 -05:00
Rob Levitsky
f7b73af9a7
Add config option for the notification timeout duration 2018-11-10 08:54:59 -05:00
jfreegman
73aaa44d12
Add config option to set data file auto-save frequency 2018-10-30 18:22:30 -04:00
jfreegman
e4abd8b36b
Bump version to 0.8.3 2018-10-30 18:03:44 -04:00
jfreegman
9e3d4f3889
Check if pointer is null before accessing 2018-10-28 07:09:37 -04:00
jfreegman
b7d67c1d86
re-init AV for unblocked contacts 2018-10-20 02:56:37 -04:00
jfreegman
c4a11f8dc7
Refactor ToxWindows
ToxWindow constructor functions now return pointers instead of structs
ToxWindow windows array now holds pointers instead of structs
Refactor some logic in windows.c pertaining to keeping track of active windows
Use uint8_t for window array indexing
2018-10-19 17:43:06 -04:00
jfreegman
d18cc8cbc2
Fix two memory leaks and properly clean up friendlist window 2018-10-19 17:43:03 -04:00
jfreegman
ce6d4861fb
Fix bug where autocomplete added a forward slash to files with no extension
Also slightly refactored the line complete functions
2018-10-17 18:00:09 -04:00
jfreegman
8f0e6026f0
Add enum for file_type() and a little cleanup 2018-10-17 18:00:08 -04:00
jfreegman
258736995d
Remove ability to set note with status command 2018-10-17 18:00:08 -04:00
jfreegman
56e03a3f8b
No longer require quotes to enclose paths 2018-10-17 18:00:08 -04:00
jfreegman
b6c746b5f5
No longer require quotes for commands that take strings as arguments 2018-10-17 18:00:07 -04:00
jfreegman
03673cbced
Improve readability of INSTALL.md 2018-10-11 14:22:37 -04:00
jfreegman
0fea930c24
Convert deprecated uppercase enums to camelcase 2018-10-10 13:34:17 -04:00
jfreegman
94d22a8853
Allow empty status messages 2018-10-09 18:21:05 -04:00
jfreegman
63cc23401a
Improve readability of defines 2018-10-08 13:39:04 -04:00
Leonid Bobrov
f90a774470
Make Toxic easier to port 2018-10-03 22:00:43 +00:00
jfreegman
e7c5fbc873
Cleanup xtra.c
Privatise some functions that don't need to be public
Fix struct names starting with _ char
Remove unnecessary memset of Xtra struct in init_xtra()
2018-09-27 03:41:58 -04:00
iphydf
d62902ffb3
Use (void) in prototypes instead of ().
Also, removed `__inline` from an extern function (why was it there?).
Also, moved one extern declaration to a header file. There are lots of
these that need to be moved, but one thing at a time.
2018-09-13 23:47:47 +00:00
iphydf
bebff3be0e
Use (void) for empty parameter list in C. 2018-09-08 17:23:07 +00:00
iphydf
2be4847b53
Ignore warning about unused result.
These should be fixed, but for now we leave it as warning, not error.
2018-09-06 13:46:24 +00:00
iphydf
4557614443
Enable .travis.yml check and use non-markdown license. 2018-08-17 23:49:01 +00:00
iphydf
5b30ecf2e4
Use @x11 instead of the longer @x11//:X11 to link against xlib. 2018-08-14 09:55:54 +00:00
iphydf
2413ad2b59
Use bazel import libs instead of global -l flags.
Import libs currently also point to the global system installed versions,
but at least we have the freedom to import them properly later.
2018-08-05 19:17:57 +00:00
iphydf
52855b805a
Add astyle check to travis. 2018-07-18 17:19:43 +00:00
iphydf
20b5e46850
Rename callback implementations to be of the form on_$event.
So it's easy to map from implementation to the event without looking at
the `tox_callback_*` calls.
2018-07-18 17:06:28 +00:00
iphydf
f2b796940e
Add missing braces to if/for/while blocks.
Astyle doesn't quite catch all of them.
2018-07-18 15:56:21 +00:00
jfreegman
a37bf300f9
Update astylerc to match toxcore & reformat all source files 2018-07-18 11:33:16 -04:00
jfreegman
cb524dcbc3 Merge branch 'iphydf-local-libconfig' 2018-07-16 10:18:44 -04:00
iphydf
4144b868ce
Use libconfig built in the WORKSPACE rather than system installed.
Improves hermeticity and reproducibility.
2018-07-15 15:34:19 +00:00
jfreegman
af11f16bef
fix merge mistake take 2 2018-07-07 10:29:12 -04:00
jfreegman
1d27a496ef
fix merge mistake 2018-07-06 15:43:32 -04:00
jfreegman
32bd9dc1a7 Merge branch 'TokTok-master' 2018-07-06 12:35:46 -04:00
iphydf
3cd2bc7e3c
Don't compile A/V code if AUDIO/VIDEO are not #defined. 2018-07-06 15:46:12 +00:00
iphydf
43ca840658
Conditionally compile api.c and python_api.c contents.
Based on `-DPYTHON`, instead of based on which files are listed in the
source list. This simplifies people's lives when compiling from the
command line with `cc *.c`.
2018-07-06 14:42:33 +00:00
iphydf
685837357b
Add bazel build file for toxic. 2018-07-06 14:41:16 +00:00
jfreegman
812a13b0fb Merge branch 'fx-carton-master' 2018-06-17 20:27:57 -04:00
jfreegman
641fa471d2 Merge branch 'master' of https://github.com/fx-carton/toxic into fx-carton-master 2018-06-17 20:23:12 -04:00
jfreegman
8d5755f2d8 Merge branch 'nieldk-master' 2018-06-17 20:21:05 -04:00
jfreegman
af510b6666 Merge branch 'master' of https://github.com/nieldk/toxic into nieldk-master 2018-06-17 20:09:14 -04:00
François-Xavier Carton
46f646afcf Add an option to disable qr codes 2018-06-16 05:07:16 +02:00
jfreegman
68ce17a57f
Temp fix for nick change spam on group join 2018-04-19 22:23:49 -04:00
jfreegman
a69fad15c1
Use default timestamp format if provided one is invalid 2018-04-10 17:47:21 -04:00
Sebastian Schmidt
7621fe9a62 fix macOS build (#494) 2018-03-31 21:10:17 -04:00
Niel Nielsen
f6d9bc3a74
Update check_features.mk
Changed cfg/checks/check_features.mk to enable individual Audio/Video checks by adding proper DISABLE_VI option which takes "0" or "1" for disable/enable video checks/building.
2018-03-19 22:31:31 +01:00
jfreegman
29aea0b42c
Remove libtoxav from install instructions as it's now part of the toxcore lib 2018-03-03 23:55:54 -05:00
jfreegman
815c29ee31
Significantly reduce time before trying to re-send a message with no read receipt
(also some formatting cleanup)
2018-03-03 23:54:12 -05:00
jfreegman
3917f664bf
Bump to v0.8.2 2018-03-01 19:14:14 -05:00
jfreegman
a223329815
Fix persistent groupchat loading 2018-02-27 18:46:56 -05:00
jfreegman
3fec11d5f9
Update readme 2018-02-26 03:03:12 -05:00
jfreegman
221edb0012
add a .travis file and some build fixes 2018-02-26 02:34:38 -05:00
jfreegman
2710ab6034
Re-implement group nick change notifications 2018-02-25 03:43:19 -05:00
jfreegman
bc3ffac0ba
re-add group peer list sorting 2018-02-25 01:21:22 -05:00
jfreegman
29f55c5277
Update API
-Removed usage of deprecated API functions
-Integrated conference changes with a few regressions
2018-02-25 00:00:06 -05:00
jfreegman
a290f0f7f8
Update toxav API calls 2018-02-24 15:38:07 -05:00
jfreegman
5cd196a769
Fix autocomplete bug
Formatting was messed up due to not accounting for null byte in directory list
2018-02-20 20:54:26 -05:00
jfreegman
b14d983a8c
Merge branch 'iphydf-opaque-options' 2018-01-20 15:20:25 -05:00
iphydf
51f1daeec8
Treat Tox_Options as opaque struct: no deref, no alloc.
We allocate it inside toxcore and dereference it inside as well. This
allows us to change the layout of that struct and add new members.
2018-01-20 19:51:13 +00:00
jfreegman
b799c6a8d7
Merge branch 'iphydf-fix-typedefs' 2018-01-20 13:34:53 -05:00
iphydf
b9f9546e2b
Fix typedef enums and potential uninitialised value. 2018-01-20 18:30:35 +00:00
jfreegman
846bc4613e
Fix comment 2017-11-20 07:07:24 -05:00
jfreegman
a5a1f6015d
Merge branch 'calls_fix' 2017-11-20 07:03:22 -05:00
jfreegman
fe6a7074ea
Dynamically allocate audio calls structure
This fixes a bug that caused a segfault when attempting to call a friend with a
friend number above the MAX_CALLS limit
2017-11-20 07:02:56 -05:00
jfreegman
db7c9fe426 Merge branch 'master' of https://github.com/JFreegman/toxic 2017-11-17 18:17:47 -05:00
jfreegman
b1d8ab102f
Bump to version 0.8.1 2017-11-17 17:44:56 -05:00
Mateusz Poszwa
0bd5b4ddee Repair operating system checks (#474) 2017-11-16 16:59:51 -05:00
jfreegman
c387df35f8 Merge branch 'f8l-pkgsrc' 2017-11-16 16:03:20 -05:00
Mateusz Poszwa
351a50c214 Do not assume what is not Linux or a BSD descendant is OSX 2017-11-15 21:02:10 +01:00
jfreegman
93175314b5 Merge branch 'aSourceFish-master' 2017-11-15 02:25:55 -05:00
aSourceFish
b905a1a3c5
One more bit of standard... 2017-11-15 05:56:13 +02:00
aSourceFish
c4386b195f
A bit of standard... 2017-11-15 05:54:46 +02:00
aSourceFish
ed1e617380
Make Toxic compile at NetBSD, STAGE 2 2017-11-15 05:50:00 +02:00
aSourceFish
1382adb1f6
Make Toxic compile at NetBSD, STAGE 1 2017-11-15 05:46:47 +02:00
aSourceFish
ecf1c317b7
Make Toxic compile at NetBSD, STAGE 0 2017-11-15 05:24:19 +02:00
jfreegman
cf0b99f1e5
Merge branch 'aramchandran-master' 2017-11-13 15:37:40 -05:00
Abhishek Ramchandran
3605a296a9
Update install.mk 2017-11-13 13:30:22 -05:00
jfreegman
9375d220f9
Merge branch 'aSourceFish-master' 2017-11-11 16:51:34 -05:00
aSourceFish
8f94b0a218
Shut down the warning at *BSD 2017-11-11 21:17:34 +02:00
aSourceFish
85a0becbf9
Make Toxic compile at OpenBSD 2017-11-11 21:04:45 +02:00
aSourceFish
fec36ad9e6
Make Toxic compile at OpenBSD 2017-11-11 21:03:28 +02:00
jfreegman
ecdf6f01d2
Merge branch 'EnniRosario-refresh_devices' 2017-10-31 16:24:53 -04:00
Enni Rosario
e1bfa30769 Refresh device list on /lsdev. 2017-10-31 18:08:06 +02:00
Enni Rosario
ebcbc7497b Indicate selected device when printing. 2017-10-31 17:45:39 +02:00
jfreegman
e844ece28b
Merge branch 'zugz-reduceRedrawing' 2017-10-29 16:00:46 -04:00
zugz
8508451ba6 avoid unnecessary redrawing 2017-10-29 16:50:42 +01:00
jfreegman
5cc83a7cb5
Merge branch 'patheticpat-fix-tmux' 2017-09-05 17:43:13 -04:00
Michael Kaiser
febc725763 Fix tmux detached detection
The old code failed if the session had a custom name instead of the
default numeric id. To be safe in both cases, look for the session_id in
the tmux list-sessions output.
2017-09-05 12:49:48 +02:00
jfreegman
f2c116feb3
Fix potential string truncations with snprintf 2017-09-01 17:36:17 -04:00
jfreegman
52dd60dc86
Fix potential int truncation and double-check lengths before copy 2017-08-28 19:37:19 -04:00
jfreegman
80c0500299
Fix formatting bug caused by strings containing \r 2017-08-28 18:26:52 -04:00
jfreegman
ab490d28b4
Merge branch 'avoidr-status_cmd_feedback' 2017-08-28 17:13:53 -04:00
avoidr
a9f7f85617 /status: give feedback to user on status change 2017-08-27 12:27:04 +02:00
jfreegman
1bfc1ba371 Merge branch 'Dako300-master' 2017-07-07 20:03:07 -04:00
Daniel Hoffman
2ede39369a added /bitrate 2017-07-07 23:47:59 +00:00
jfreegman
922c184195
Only include python libs when necessary 2017-06-06 19:03:40 -04:00
jfreegman
56a9571509
Make sure message id fits inside a signed int 2017-06-02 01:15:44 -04:00
jfreegman
0136f22076
Fix UI bugs & format
This fixes a bug where lines would sometimes be incorrectly marked as unread, as well as
a bug where inbound messages would sometimes be coloured incorrectly
2017-06-01 16:46:12 -04:00
jfreegman
c4ace288af
Bump to v0.8.0 2017-05-24 15:10:50 -04:00
jfreegman
6d3fbfee59
Merge branch 'TsarFox-master' 2017-05-24 14:57:32 -04:00
=
be5e7906da Fix fortune.py input issues 2017-05-24 10:10:18 -04:00
jakob
369f26932e Fix error messages being printed when autorun_path is unset. 2017-05-23 19:12:53 -04:00
jakob
22ea522baf Add "/run" to autocompleter and fix example Python script. 2017-05-22 20:47:56 -04:00
jakob
4f60d546e6 Disable Python support in the default build 2017-05-21 16:18:39 -04:00
jakob
76d1eafdc0 Change visibility on Python commands list 2017-05-20 08:18:28 -04:00
jakob
37912f2d88 Update INSTALL.md 2017-05-19 21:09:29 -04:00
jfreegman
09710327c5
Merge branch 'Dako300-master' 2017-05-19 20:05:52 -04:00
Daniel Hoffman
acee4615f8 double signal handler prevents accidental closes 2017-05-19 14:38:39 -05:00
jakob
5ed26eda9b Added constants to the Python interface for calls to execute. 2017-05-19 15:35:31 -04:00
jakob
6d2b90ac9f Error reporting on failure of invoke_autoruns and solved issue with call to Py_FinalizeEx 2017-05-18 21:37:28 -04:00
jakob
02ea0fac44 get_status returns a string rather than an integer. 2017-05-17 08:39:29 -04:00
jakob
7d3d129624 Updated code style 2017-05-16 23:19:39 -04:00
jakob
b3ed8bc35c Finalized and documented the Python scripting interface. 2017-05-16 20:31:23 -04:00
jakob
90210daca7 Python interface for getting the user's nickname/status and executing commands 2017-05-15 22:12:28 -04:00
jakob
0e13a1f1bc Implemented a basic Python scripting engine, optional compilation. 2017-05-15 20:29:00 -04:00
nurupo
09e2690211 Fixed INSTALL formatting (#443) 2017-04-12 12:00:43 -04:00
jfreegman
e65e3af274
Merge branch 'peetcamron-fix/fflush-for-musl' 2017-01-28 00:45:28 -05:00
root
c6c60d018e Added some fflush after the printf with no \n so we don't have a blank
screen when compiled with musl.
2017-01-28 00:06:03 -05:00
jfreegman
451d4ced80
Add option that prints toxic and toxcore version 2017-01-25 22:13:59 -05:00
jfreegman
7a7402ff86
Update text files with new toktok toxcore link 2016-12-21 17:08:32 -05:00
jfreegman
600e013adc
Bump to version 0.7.2 2016-12-18 00:11:24 -05:00
jfreegman
1d71e2eb18
Port to toktok-c-toxcore branch 2016-12-18 00:01:51 -05:00
Jfreegman
f858714edd
Fix small nodeslist parsing bug 2016-10-23 12:26:18 -04:00
Jfreegman
4df44a7274 Merge branch 'tharvik-master' 2016-10-18 12:21:58 -04:00
tharvik
a26ed9d28f
add missing implicit include 2016-10-18 09:38:28 +02:00
louisabraham
2bd5083b8f Corrected brew errors (#413)
Corrected brew errors
2016-10-07 13:24:31 -04:00
Jfreegman
8805f694b9
Merge branch 'Ansa89-qr_png' 2016-10-06 11:48:33 -04:00
Ansa89
71040355fd
QR: close file descriptor on error 2016-10-06 11:54:27 +02:00
Ansa89
6bc5d8c543
QR PNG: convert some variables to macros 2016-10-06 11:52:26 +02:00
Jfreegman
abb39ea6b5
Fix a few resource leaks 2016-10-05 15:17:56 -04:00
Jfreegman
15846d2b50 Merge branch 'Ansa89-qr' 2016-10-05 14:58:10 -04:00
Ansa89
958df9f2e8
Add possibility to save QR code in PNG file format 2016-10-05 20:57:50 +02:00
Jfreegman
2fd43aebee Merge branch 'Ansa89-fix_checks' 2016-10-05 12:23:23 -04:00
Ansa89
34c29745cc
Makefile: use correct variable name when checking video libs 2016-10-05 09:09:22 +02:00
Ansa89
da6fe41d75
Makefile: fix video libs check 2016-10-04 10:25:49 +02:00
Thierry Thomas
e17fa89d8f Update misc_tools.c (#408)
* Update misc_tools.c

Fix build on FreeBSD with clang.

Without this patch, compilation fails with these messages:

  CC    misc_tools.o
/usr/ports/net-im/toxic/work/toxic-0.7.1/src/misc_tools.c:479:24: error: variable has incomplete type 'struct sockaddr_in'
    struct sockaddr_in s_addr;
                       ^
/usr/ports/net-im/toxic/work/toxic-0.7.1/src/misc_tools.c:479:12: note: forward declaration of 'struct sockaddr_in'
    struct sockaddr_in s_addr;
           ^
/usr/ports/net-im/toxic/work/toxic-0.7.1/src/misc_tools.c:480:22: error: use of undeclared identifier 'AF_INET'
    return inet_pton(AF_INET, address, &(s_addr.sin_addr)) != 0;
                     ^
2 errors generated.

* Fix build on FreeBSD with clang

Without this patch, compilation fails with these messages:

CC misc_tools.o
/usr/ports/net-im/toxic/work/toxic-0.7.1/src/misc_tools.c:479:24: error: variable has incomplete type 'struct sockaddr_in'
struct sockaddr_in s_addr;
^
/usr/ports/net-im/toxic/work/toxic-0.7.1/src/misc_tools.c:479:12: note: forward declaration of 'struct sockaddr_in'
struct sockaddr_in s_addr;
^
/usr/ports/net-im/toxic/work/toxic-0.7.1/src/misc_tools.c:480:22: error: use of undeclared identifier 'AF_INET'
return inet_pton(AF_INET, address, &(s_addr.sin_addr)) != 0;
^
2 errors generated.
2016-09-25 22:32:17 -04:00
Jfreegman
f056f13329
Astyle everything and add an astyle options script to repo 2016-09-24 21:07:04 -04:00
Jfreegman
3515623159
Bump version to 0.7.1 2016-09-23 13:05:05 -04:00
Jfreegman
2194b9e259
Use time_t instead of uint64_t for timestamps
Also call time() directly from get_unix_time() instead of manually updating the time val.
2016-09-22 18:31:52 -04:00
Jfreegman
c24e1bd2b8
Fix a few A/V race conditions 2016-09-22 18:00:14 -04:00
Jfreegman
38ec96e96a
Thread nodeslist loading
This is necessary because DNS/http lookups block, and can do so for a very long time
2016-09-22 14:09:07 -04:00
Jfreegman
d2b572ede1
Add ipv6 support for bootstrap nodes and refactor parsing code 2016-09-21 21:22:05 -04:00
Jfreegman
703d5419a3
Ignore offline bootstrap nodes, small refactor of Nodes struct 2016-09-21 12:51:57 -04:00
Jfreegman
221d761ff4
Ignore bootstrap nodes that use a domain instead of IP address
Domains cause toxcore to do blocking DNS requests which creates noticable lag
and might (??) leak IP addresses when using a proxy
2016-09-21 00:28:16 -04:00
Jfreegman
151f5f0c51
Add setting to control DHT nodeslist update frequency
Also rename a few things and semi-fix man page format issues
2016-09-20 13:13:12 -04:00
Jfreegman
4f6c603543
Rename DHTnodes to DHTnodes.json 2016-09-20 00:53:53 -04:00
Jfreegman
a009f11c0c
Automatically update DHT nodeslist
List is now automatically fetched from nodes.tox.chat and placed in the
user config directory. The list is updated once every 30 days, and
will attempt to detect problems and re-fetch the list if necessary.

Also fixed a couple file descriptor leaks and cleaned some things up.
2016-09-20 00:00:09 -04:00
Jfreegman
1f8c11a33a
These strlen() calls are unncessary 2016-09-18 11:34:13 -04:00
Jfreegman
5e20e6b279
Switch to using json DHT nodes file
Parsing json manually like this is ugly, but this allows us to use the json formatted nodeslist file
at nodes.tox.chat instead of having to update the list by hand. We could also potentially
use curl to fetch the list and update it automatically.
2016-09-17 21:38:32 -04:00
Jfreegman
1f02bb2be5
Refactor DHT bootstrap code
- Separate node list loading from connecting
- Put code in its own source file
- Rename a few functions
2016-09-17 14:26:23 -04:00
Jfreegman
98154b3cba
Merge branch 'kdhp-master' 2016-09-15 11:27:04 -04:00
Keegan Drake H.P
379ad9e116 Use ALC_ENUMERATE_ALL_EXT when available 2016-09-14 05:43:10 -05:00
JFreegman
cb21672600 Merge pull request #403 from metala/fix-set-video-fmt
Changed video get format to set format
2016-07-28 12:30:28 -04:00
Marin Ivanov
4019395f44 Changed video get format to set format
* Fixes issue #394
* This was obviously meant to set the video format.
2016-07-28 17:58:24 +02:00
JFreegman
ee084c572c Merge pull request #402 from metala/fix-chat-infobox-flicker
Remove chat infobox flicker
2016-07-27 22:38:23 -04:00
Marin Ivanov
41a8401ac5 Merge branch 'master' into fix-chat-infobox-flicker
Fixed cursor position issue
2016-07-27 22:04:41 +02:00
JFreegman
d8a3f7de4c Merge pull request #401 from metala/fix-remote-help-flicker
Remove help window flicker
2016-07-27 12:16:12 -04:00
Marin Ivanov
c425aa2f27 Fixed input lag 2016-07-27 18:06:33 +02:00
Marin Ivanov
94e026d114 Remove chat infobox flicker 2016-07-27 02:39:31 +02:00
Marin Ivanov
f89638635a Remove help window flicker 2016-07-27 02:07:31 +02:00
Jfreegman
402b86687f Merge branch 'mphe-beep' 2016-07-21 11:35:22 -04:00
Marvin Ewald
5b1b420ac0 Add further explanation to the beep_on* options
This also renames beep_on* to bell_on*.
2016-07-21 11:35:09 +02:00
JFreegman
62ec514f17 Merge pull request #400 from Encrypt/master
Added a changelog to the project
2016-07-19 14:04:05 -04:00
Yann Privé
f893dd755f Added a changelog to the project 2016-07-19 00:06:52 +01:00
Marvin Ewald
9aedcf7753 Update docs 2016-07-17 19:22:40 +02:00
Marvin Ewald
d3effa26b5 Add options to enable terminal bell on certain events
Some terminals can mark the terminal window as urgent on bell.
This is useful for window managers that provide a shortcut to jump to an
urgent client.
2016-07-17 19:22:40 +02:00
Jfreegman
2ec180789b
Fix crash on AV error call state during active call 2016-07-11 17:42:57 -04:00
Jfreegman
9f74d3a3a8
Fix memory leak 2016-06-29 21:36:54 -04:00
Jfreegman
9fcbc3bde0
Fix tab-complete bug causing buffer to sometimes clear 2016-06-11 23:49:56 -04:00
Jfreegman
cf16849b37
Dynamically allocate memory for save file instead of using stack 2016-05-03 14:13:16 -04:00
Jfreegman
32442b6286
Disallow ctrl+m keybinding and revert to default settings on invalid bindings
Note: Ctrl+m uses the same control sequence as the enter key on many systems
2016-05-01 14:57:46 -04:00
Jfreegman
50f227418b
Update man pages 2016-04-25 22:04:43 -04:00
Jfreegman
fc06a625a6
Put toxme.io back as it has a new owner 2016-04-25 14:49:23 -04:00
Jfreegman
70bd39eb74
Fix small bug 2016-04-11 18:50:28 -04:00
Jfreegman
4e0e322e32
Fix cross-client audio issue 2016-04-05 00:49:46 -04:00
Jfreegman
e73ac9b6a4
Remove defunct nameserver 2016-03-30 00:30:47 -04:00
Jfreegman
bcda6e476e
Fix bug for real this time 2016-03-12 02:29:59 -05:00
Jfreegman
5b29ce7132
Fix bug preventing friend connection status from changing 2016-03-03 20:49:48 -05:00
Jfreegman
f43f644451
Merge branch 'mall0c-multiline' 2016-02-29 19:22:41 -05:00
Marvin Ewald
d6fdac9739 Fix markup in multiline messages
A '<' or '>' at the beginning of a line will now highlight only this
particular line instead of the whole message.
2016-02-29 01:46:48 +01:00
Marvin Ewald
c6a2bb8a90 Add settings option to set paste-mode key and update docs 2016-02-28 21:53:33 +01:00
Marvin Ewald
04576fea7e Add paste-mode to allow multiline text pasting
Ctrl-T toggles paste mode.
Useful when pasting multiline text because it avoids triggering an
enter keypress after linebreaks.
Instead, every \r is translated to \n which is again translated to a
pilcrow (see previous commit).
The pasted text can then be sent as a whole instead of splitting up in
multiple messages.
2016-02-28 21:40:41 +01:00
Marvin Ewald
e6f839f9ac Enable multiline input
Adds a nonl() call to avoid translation from \r to \n when pressing
enter.
C-J -> \n
Enter -> \r
To allow multiline input, \n chars (e.g. when pressing C-J) are replaced
with a pilcrow. After hitting enter, every pilcrow is substituted with
\n again.
2016-02-28 02:35:36 +01:00
Jfreegman
eb02424f8a
Update DHT nodes list 2016-02-25 19:04:37 -05:00
Jfreegman
2e609c46f6
Remove file transfer timeoutes, and remove a couple unused functions 2016-02-25 17:58:02 -05:00
Jfreegman
a474e3bf39
Add settings option to disable friend connection change notifications 2016-02-25 17:06:49 -05:00
JFreegman
93835f0455 Merge pull request #379 from FreakyPenguin/password_eval
Add password_eval option to skip password prompt
2016-01-19 18:31:04 -05:00
Antoine Kaufmann
ac6d8ff89c Add password_eval option to skip password prompt
Runs a command and uses its output as the password. This can be used for
getting the password from a password manager such as pass.
2016-01-19 13:45:52 -08:00
JFreegman
88e74224ed Merge pull request #374 from quininer/master
sleep use tox_iteration_interval
2016-01-11 04:09:56 -05:00
quininer
deccaec40e fix milliseconds 2015-12-22 10:43:08 +08:00
quininer
4419be36e8 remove useless var 2015-12-21 20:00:48 +08:00
quininer
b34b51e8c1 use tox_iteration_interval 2015-12-21 18:13:03 +08:00
JFreegman
74416b4b58 Merge pull request #373 from wedge-jarrad/master
Fix #372 - can't start with missing ~/.config
2015-12-18 01:11:16 -05:00
Wedge Jarrad
675712cea0 Fix #372 - can't start with missing ~/.config
This block was added in fa0e645. I'm unsure what bug or corner case it
was intended to address but it causes Toxic to exit with an error if
the ~/.config directory doesn't exist. Without this block the ~/.config
directory and tox-specific subdirectories will be created when Toxic
starts.
2015-12-17 18:17:34 -08:00
Jfreegman
36feebfe8d Merge branch 'RomeroMalaquias-master' 2015-12-09 01:32:07 -05:00
Romero Malaquias
3fe9abd84d Avoiding conditional directives that split up parts os statements 2015-12-08 23:13:39 -03:00
Romero Malaquias
fd6432c727 Avoiding conditional directives that split up parts os statements 2015-12-08 23:10:16 -03:00
JFreegman
1feffcc2f0 Merge pull request #369 from nil0x42/master
update doc: DATA_FILE is now `toxic_profile.tox`
2015-12-07 16:11:07 -05:00
nil0x42
6bba3cb9e2 update doc: DATA_FILE is now toxic_profile.tox 2015-12-07 13:38:07 +01:00
Jfreegman
3cb6db3d60
Remove pointless null check 2015-12-05 00:19:11 -05:00
Jfreegman
77238eeadf
Improve file transfer progress bar 2015-12-04 19:41:50 -05:00
JFreegman
88270827a9 Merge pull request #367 from landswellsong/osx-terminal-xtra-fix
Correctly operational from OSX terminals
2015-11-25 03:42:55 -05:00
Oleksiy Protas
aade65bfe1 Correctly operational from OSX terminals 2015-11-25 10:26:12 +02:00
Jfreegman
b24c5d8cf8
Fix AV bug
Pending call now properly hangs up when you use the /hangup command or close the chat window
2015-11-19 23:49:58 -05:00
Jfreegman
9f0feb7223
Allow custom nospam values 2015-11-12 18:03:45 -05:00
Jfreegman
74c1eef1d1
Bump version to 0.7.0 2015-11-12 17:18:37 -05:00
Jfreegman
65c07a57db
Properly close audio devices on quit 2015-11-12 17:14:10 -05:00
Jfreegman
ab99c1ac73
Fix building on FreeBSD (courtesy of thierry-FreeBSD) 2015-11-12 05:04:37 -05:00
Jfreegman
05f5f16af3
Fix various video bugs; it should be working now! 2015-11-12 05:01:28 -05:00
Jfreegman
d16be574f3
Add stack protection compile flag to Makefile 2015-11-10 23:34:46 -05:00
Jfreegman
7e0b8b4870
Slight improvement to qrcode printing 2015-11-09 02:28:41 -05:00
Jfreegman
39c4b7ecdd
Add ability to print your Tox ID's QR code to a file 2015-11-08 22:51:46 -05:00
JFreegman
c5d9aca3e1 Add coverity badge to readme 2015-11-08 03:59:12 -05:00
Jfreegman
fa0e645a79
Fix a bunch of misc bugs and corner cases 2015-11-08 03:57:01 -05:00
Jfreegman
14a8bdb874
Store temp data in same directory as original file 2015-11-07 21:38:32 -05:00
JFreegman
93a73cbef2 Merge pull request #351 from mneumann/fix_build_dragonfly
Fix compile for DragonFlyBSD
2015-11-07 17:26:30 -05:00
Jfreegman
6aab9a79d8
Fix help menu 2015-11-07 01:00:56 -05:00
Jfreegman
dfff777283
Save data in a safer manner
By saving to a temp file then renaming it we avoid the possibility of data corruption
due to an interrupt (hard reboot, power outage etc.)
2015-11-05 17:46:00 -05:00
Jfreegman
a95fc7824c
Fix bug causing profile to be overwritten under a rare condition 2015-11-05 16:15:59 -05:00
Jfreegman
f707dce2da
Disable recv video callback for now 2015-11-05 15:49:35 -05:00
Jfreegman
0d07d14b13
Remove unnecessary/misleading line print 2015-11-05 15:28:24 -05:00
Jfreegman
6cc1525daa
Fix some build issues 2015-11-03 23:04:05 -05:00
Jfreegman
49f5efaab0
A couple audio fixes (ugly but works)
- You will now receive an incoming call even if the caller's chat window is not opened
- Callbacks should all be working now
- Disable video command as video is currently broken
2015-11-03 20:36:41 -05:00
Eniz Vukovic
a5e5e98afc Disabled video calls for the time being 2015-11-03 23:50:01 +01:00
Jfreegman
4ab99c73a0
Merge with master 2015-11-02 15:22:52 -05:00
Jfreegman
e02cf1bb7d
Use proxy for DNS requests when type is SOCKS5 2015-11-02 02:01:17 -05:00
Jfreegman
9751cfc407
Force name lookups through proxy set by client 2015-11-01 21:34:42 -05:00
Jfreegman
36963a5b38
rm redundant error message 2015-10-30 00:10:38 -04:00
Jfreegman
7cf9c37aef
Handle case where system doesn't support any of the specified TLS cipher suites 2015-10-29 20:35:31 -04:00
Jfreegman
2b4b8c0289
Add more descriptive curl errors 2015-10-29 20:16:35 -04:00
Jfreegman
368a1465ec
Use a specified TLS cipher list for https name lookups 2015-10-29 15:13:42 -04:00
Jfreegman
fea317ee24
Remove travis script. Goodbye old friend 2015-10-28 21:46:21 -04:00
Jfreegman
8584feab80
Replace DNS-based username lookups with HTTPS & drop utox.org support 2015-10-28 17:14:17 -04:00
Jfreegman
f7e48d294e
Update README.md 2015-10-23 20:35:15 -04:00
JFreegman
928f25bd89 Update README.md 2015-10-23 20:34:08 -04:00
Jfreegman
941ac1d951
Update DHTnodes 2015-10-23 04:40:33 -04:00
Jfreegman
7af9327b37
Add note about logs not being encrypted 2015-10-22 19:55:48 -04:00
Jfreegman
6b97df2615
Add command to change the Tox ID nospam value 2015-10-22 19:44:05 -04:00
Jfreegman
cea5f1fe04
Fix avatar size limit and fix comment 2015-10-20 22:47:11 -04:00
Jfreegman
abfdbfe468
Fix some new AV api changes 2015-10-20 17:59:14 -04:00
Jfreegman
462cfca175
Merge new AV branch 2015-10-20 17:57:54 -04:00
Jfreegman
db410cb01e
Use profile name that conforms with the standard 2015-10-14 23:09:11 -04:00
Jfreegman
a920f3edfe
Replace toxme.se with toxme.io in DNSservers list and remove hardcoded servers from source 2015-09-12 21:31:19 -04:00
Michael Neumann
2c3921a9fb Fix compile for DragonFlyBSD 2015-09-09 13:23:48 +02:00
Jfreegman
f295352495
Replace instances of unsafe atoi function with safe counterpart 2015-09-02 19:41:21 -04:00
Jfreegman
ffcc804efe
Moved version up 2015-09-01 13:00:56 -04:00
Jfreegman
69be1bc398
Fix nodes parsing bug 2015-08-28 02:44:38 -04:00
Jfreegman
b4464eda4d
Fix more threading issues 2015-08-27 21:29:34 -04:00
Jfreegman
28dd43608d
Fix a few notify/threading bugs and fix DHTnodes loading bug 2015-08-27 15:13:13 -04:00
Jfreegman
11701d22a1
Lots of bug fixes and general code cleanup 2015-08-27 03:38:08 -04:00
cnhenry
4e2db756be Merge remote-tracking branch 'upstream/master' 2015-08-21 00:52:27 -05:00
Jfreegman
19cfe3d393 Display a user warning when log fails to initialize 2015-08-21 00:44:40 -05:00
Jfreegman
c546df3917 Fix some filetransfer issues
- File transfers now timeout properly
- Small refactor related to creating new transfers
2015-08-21 00:44:40 -05:00
Jfreegman
ed0a4fb3b8 simplify timeout function 2015-08-21 00:44:40 -05:00
Khalikin Viachaslau
271ca08eb2 fix a broken link 2015-08-21 00:44:40 -05:00
Jfreegman
0e79b8a076 Update DHTnodes 2015-08-21 00:44:40 -05:00
cnhenry
1606d01158 Implemented video calls for OSX 2015-08-21 00:44:25 -05:00
cnhenry
c8a9ac21f3 Implemented OSX device listing 2015-08-21 00:44:25 -05:00
cnhenry
e91aaf6c73 Refactoring to compliment OSX 2015-08-21 00:44:13 -05:00
cnhenry
619fdc1098 Refactored cmd_video function 2015-08-21 00:44:12 -05:00
cnhenry
b7e613de32 Small fix to video cleanup 2015-08-21 00:44:12 -05:00
cnhenry
929fca3de1 Prevented user from manually closing video windows 2015-08-21 00:44:12 -05:00
cnhenry
b67792f9f2 Clear warnings from device listing fix 2015-08-21 00:44:12 -05:00
cnhenry
96162bf254 Fixed incorrect video device listing 2015-08-21 00:43:47 -05:00
cnhenry
8a66c3fa4c Changed to toggle video command rather than two separate commands 2015-08-21 00:43:47 -05:00
cnhenry
2cdcbc07a7 Fixed video call receiving issues 2015-08-21 00:43:30 -05:00
cnhenry
6e0d19b01d Refactored video calls 2015-08-21 00:42:57 -05:00
cnhenry
ad04fa4dcd Major refactoring and fixes towards AV 2015-08-21 00:42:28 -05:00
cnhenry
c2c612b85a Fixed v4l2 capture crash, and refactored to prepare for new features 2015-08-21 00:40:09 -05:00
cnhenry
d359ba6a54 Fixed YUV stride issues 2015-08-21 00:38:44 -05:00
cnhenry
54e2fe8d6f Implemented video frames ready to send through ToxAV. NOTE: Contains YUV stride issues 2015-08-21 00:37:57 -05:00
cnhenry
53353825e2 Implemented /endvideo command 2015-08-21 00:37:57 -05:00
cnhenry
fcdc8e8b67 Fixed incorrect colors during video capture 2015-08-21 00:37:23 -05:00
cnhenry
9b6efb65de Implemented video preview and preparations for ToxAV 2015-08-21 00:37:23 -05:00
cnhenry
c8ea02376e Progress on video call windows using X11 2015-08-21 00:36:52 -05:00
cnhenry
2369b5e9e2 Modified header files structuring 2015-08-21 00:36:28 -05:00
cnhenry
8f28f1d748 Progress on implementing v4l2 in video_device.* 2015-08-21 00:36:28 -05:00
cnhenry
a33e5f4bec Fixes to av.mk 2015-08-21 00:36:13 -05:00
cnhenry
e0a35a6569 Obtain names of video devices using v4l 2015-08-21 00:36:13 -05:00
cnhenry
9863dfc2ae Began implementing video_device.* 2015-08-21 00:35:55 -05:00
cnhenry
c755247434 Added video_device.h file 2015-08-21 00:35:55 -05:00
Jfreegman
879b2b236e <not having red text 2015-08-21 00:35:55 -05:00
Jfreegman
c6b9a288b6 Send file control cancel on failure to resume transfer 2015-08-21 00:35:55 -05:00
Jfreegman
e9e5b5af8d Fix file transfers breaking when friends go offline 2015-08-21 00:35:55 -05:00
JFreegman
d175ff2480 Remove links to libtoxcore.so from readme 2015-08-21 00:35:55 -05:00
Jfreegman
750258adef fix rare bug preventing toxcore from sleeping 2015-08-21 00:35:55 -05:00
Mykola Orliuk
60b4d62657 Makefile: allow overriding pkg-config 2015-08-21 00:35:55 -05:00
Jfreegman
ea78dca756 Update dht nodes list and fix URL's 2015-08-21 00:35:54 -05:00
Jfreegman
3cb412632b Add option to enable acting as TCP relay server 2015-08-21 00:35:54 -05:00
Jfreegman
8301ab1bc2 Revert commit 312d0c3 (localization/gettext)
There were serious problems with branch merging that need to be resolved first
2015-08-21 00:35:40 -05:00
Jfreegman
b6e90d2ebb update translations 2015-08-21 00:30:55 -05:00
Jfreegman
06c268417f Fix some possible race conditions related to line printing 2015-08-21 00:29:33 -05:00
Jfreegman
1458a6bbc5 s/tox.im/tox.chat/g -- reflect new tox domain 2015-08-21 00:29:32 -05:00
Ansa89
737d29864b Add localization system (gettext) 2015-08-21 00:29:26 -05:00
Ansa89
0a2ad23c15 Add localization system (gettext) 2015-08-21 00:24:02 -05:00
Ansa89
a455c80a1f travis.yml: update dependencies 2015-08-21 00:14:03 -05:00
cnhenry
43bda5f7d9 Refactoring and fix related to invite callback not being fired 2015-08-21 00:14:03 -05:00
cnhenry
f2121fae74 Implemented audio calls using new ToxAV API 2015-08-21 00:14:03 -05:00
cnhenry
3241551cfb Began conversion of audio code to new ToxAV API 2015-08-21 00:14:03 -05:00
cnhenry
6e90072fb8 Implemented OpenCV demo to demonstrate video device listing and set up code structure for video 2015-08-21 00:14:03 -05:00
Jfreegman
ca1fca5aa5 separate bootstrapping and adding TCP relays per toxcore API changes 2015-08-21 00:14:03 -05:00
Jfreegman
ef1068b6aa toxcore API changes to tox_new 2015-08-21 00:14:02 -05:00
Jfreegman
72982cee97 default tox options on initialization 2015-08-21 00:14:02 -05:00
Jfreegman
9a4eaa8693 correctly handle tox_new errors 2015-08-21 00:14:02 -05:00
Jfreegman
64e7553fb0 not clear which error message is given for ipv6 failure 2015-08-21 00:14:02 -05:00
Jfreegman
dd8df1df76 try to fall back to ipv4 if tox fails to init with ipv6 2015-08-21 00:14:02 -05:00
Jfreegman
c8d102b02d null terminate status message 2015-08-21 00:14:02 -05:00
Jfreegman
a3fa7fd524 fix possible segfault 2015-08-21 00:14:02 -05:00
Ansa89
b2ed8c0ead Makefile: try to fix Tox/toxic#307
@henriqueleng please test it and report back if it works for you.
2015-08-21 00:14:02 -05:00
Jfreegman
bbdf4c96b9 fix a few avatar bugs 2015-08-21 00:14:02 -05:00
JFreegman
5496890b34 Update .travis.yml 2015-08-21 00:14:02 -05:00
Ansa89
fd85d8f87b Makefile: add uninstall target 2015-08-21 00:14:02 -05:00
JFreegman
37e7b4c3d3 Update .travis.yml 2015-08-21 00:14:02 -05:00
Jfreegman
92d76c7f99
Display a user warning when log fails to initialize 2015-08-19 00:42:28 -04:00
Jfreegman
2a787c1097
Fix some filetransfer issues
- File transfers now timeout properly
- Small refactor related to creating new transfers
2015-08-18 15:12:48 -04:00
Jfreegman
327259c4c8
simplify timeout function 2015-08-18 01:46:22 -04:00
JFreegman
f173f4275e Merge pull request #350 from vinegret/patch-1
fix a broken link
2015-08-15 12:10:56 -04:00
Khalikin Viachaslau
48eaf8a14f fix a broken link 2015-08-15 15:42:32 +00:00
Jfreegman
083611f18e
Update DHTnodes 2015-08-13 15:03:02 -04:00
Jfreegman
48ffae68a9
<not having red text 2015-08-11 19:22:57 -04:00
Jfreegman
c39f8909cd
Send file control cancel on failure to resume transfer 2015-08-10 20:41:11 -04:00
Jfreegman
32e541bd1c
Fix file transfers breaking when friends go offline 2015-08-10 14:22:13 -04:00
JFreegman
f559bdabfe Remove links to libtoxcore.so from readme 2015-08-08 16:51:04 -04:00
Jfreegman
0047ba0e9f
fix rare bug preventing toxcore from sleeping 2015-08-08 12:55:46 -04:00
Jfreegman
ecefc19b23 Merge branch 'ony-master' 2015-07-14 02:15:38 -04:00
Mykola Orliuk
e83b397494 Makefile: allow overriding pkg-config 2015-07-14 08:27:07 +03:00
Jfreegman
688ea927f8
Update dht nodes list and fix URL's 2015-07-08 22:40:17 -04:00
Jfreegman
904f58c0e8
Add option to enable acting as TCP relay server 2015-07-08 21:01:32 -04:00
Jfreegman
035420e5c7
Revert commit 312d0c3 (localization/gettext)
There were serious problems with branch merging that need to be resolved first
2015-07-04 01:19:16 -04:00
Jfreegman
444d8e7a74
update translations 2015-06-30 23:51:27 -04:00
Jfreegman
84a0276668
Fix some possible race conditions related to line printing 2015-06-30 22:40:45 -04:00
Jfreegman
312d0c3f42 Merge branch 'Ansa89-add_translation' 2015-06-29 03:17:52 -04:00
Jfreegman
d8eca8393c
s/tox.im/tox.chat/g -- reflect new tox domain 2015-06-29 03:16:09 -04:00
Jfreegman
374b78c763
manually fix merge conflicts 2015-06-29 03:11:21 -04:00
mannol
409e4ddd96 Merge pull request #340 from Ansa89/update_travis_deps
travis.yml: update dependencies
2015-06-12 18:23:22 +02:00
Ansa89
1beb35025b travis.yml: update dependencies 2015-06-12 18:22:08 +02:00
Ansa89
51a1c660b4 Add localization system (gettext) 2015-05-30 11:55:59 +02:00
Ansa89
85d3c18ba6 Add localization system (gettext) 2015-05-28 15:50:55 +02:00
Jfreegman
d0a7ca17d2
separate bootstrapping and adding TCP relays per toxcore API changes 2015-05-24 17:56:30 -04:00
Jfreegman
36640224af
toxcore API changes to tox_new 2015-05-24 17:36:13 -04:00
Jfreegman
231078b6b9
default tox options on initialization 2015-05-18 19:52:22 -04:00
Jfreegman
414f58d896
correctly handle tox_new errors 2015-04-14 17:18:09 -04:00
Jfreegman
4d73f8b241
not clear which error message is given for ipv6 failure 2015-04-13 00:58:33 -04:00
Jfreegman
82e76a3b5b
try to fall back to ipv4 if tox fails to init with ipv6 2015-04-13 00:32:35 -04:00
Jfreegman
0bc610e18d
null terminate status message 2015-04-10 00:16:01 -04:00
Jfreegman
02e6d2db3c
fix possible segfault 2015-04-09 02:14:23 -04:00
Ansa89
5a2c341259 Makefile: try to fix Tox/toxic#307
@henriqueleng please test it and report back if it works for you.
2015-04-06 11:44:02 +02:00
Jfreegman
1a7eaeddba
fix a few avatar bugs 2015-04-04 21:15:34 -04:00
JFreegman
f656d0a722 Update .travis.yml 2015-04-04 03:42:43 -04:00
Jfreegman
09c1ad4566 Merge branch 'master' of https://github.com/Tox/toxic 2015-04-04 03:27:27 -04:00
Jfreegman
8b9e34db75 Merge branch 'master' of https://github.com/JFreegman/toxic 2015-04-04 03:27:01 -04:00
Jfreegman
dd9186e834
re-implement avatar setting 2015-04-04 03:26:38 -04:00
mannol
5ff1517b28 Merge pull request #322 from Ansa89/trivial-fix
Makefile: add uninstall target
2015-04-03 15:43:18 +02:00
Ansa89
bbb639c5aa Makefile: add uninstall target 2015-04-03 13:04:28 +02:00
JFreegman
860db2f612 Update .travis.yml 2015-04-02 22:44:19 -04:00
Jfreegman
523f205646
re-implement friendlist last seen 2015-04-02 22:19:09 -04:00
Jfreegman
e998c8a866
fix encryption API breakage 2015-03-31 21:56:11 -04:00
Jfreegman
eaea68c33e
fix bug where contacts would appear online twice in a row 2015-03-31 18:39:42 -04:00
Jfreegman
4780cfeafc
remove non-existant group commands 2015-03-31 17:11:43 -04:00
Jfreegman
bdb0951c84
a few small filetransfer fixes 2015-03-29 19:29:38 -04:00
Jfreegman
e3130c92c0
small fix 2015-03-29 19:26:16 -04:00
Jfreegman
12c880ab51
fix bootstrapping 2015-03-29 19:05:24 -04:00
Jfreegman
522aabd4e4
Refactor and clean up file transfers
(No longer rely on undefined core filenumber property for indexing)
2015-03-29 18:33:51 -04:00
Jfreegman
bf09b3b6c4 Merge branch 'master' of https://github.com/Tox/toxic 2015-03-28 02:58:24 -04:00
Jfreegman
2d3c5c9450
Mostly finished with new API port
- File transfers currently don't support pausing/resuming
- Avatars are not yet done
2015-03-28 02:56:54 -04:00
Jfreegman
ae87b2eb2d
begin port to new API 2015-03-25 22:56:45 -04:00
mannol
c34ecc8dfd Merge pull request #318 from Ansa89/trivial-fix
README.md: fix typo
2015-03-23 15:44:19 +01:00
Ansa89
2c2938c647 README.md: fix typo 2015-03-23 15:36:58 +01:00
JFreegman
22dd883f28 Merge pull request #316 from Ansa89/trivial-fix
Makefile: be less aggressive when cleaning
2015-03-21 14:32:23 -04:00
Ansa89
dfbb1338a5 Makefile: be less aggressive when cleaning 2015-03-21 19:31:00 +01:00
mannol
f8dc82516e Merge pull request #315 from Ansa89/trivial-fix
Move makefile into root directory
2015-03-21 19:25:05 +01:00
Ansa89
59b16f7760 Fix travis build 2015-03-21 18:38:28 +01:00
Ansa89
a11289de79 Move makefile into root directory
Requested by @mannol.
2015-03-21 18:35:40 +01:00
Jfreegman
a64b8cae89 Merge branch 'hardlyeven-master' 2015-03-18 15:51:18 -04:00
Jfreegman
470eaeb97b Merge branch 'master' of https://github.com/hardlyeven/toxic into hardlyeven-master 2015-03-18 15:45:37 -04:00
JFreegman
6503349ed3 Merge pull request #314 from al42and/fd_leak
Fixing couple leaking file descriptors
2015-03-18 15:38:40 -04:00
Andrey Alekseenko
ec23cedc3a Fixing couple leaking file descriptors 2015-03-18 19:28:04 +03:00
jlo
ce1ae1d7dc added tab autocomplete for "/status o" => "/status online" 2015-03-17 14:25:15 -05:00
mannol
6669d5632f Merge pull request #310 from Ansa89/trivial-fix
Some cosmetics changes
2015-03-16 13:26:17 +01:00
Ansa89
59e1114997 Some cosmetics changes 2015-03-16 13:16:03 +01:00
JFreegman
c20510e5aa Merge pull request #308 from henriqueleng/openbsd
Openbsd
2015-03-15 15:52:37 -04:00
Henrique N. Lengler
2b2e746549 added gnumake as dep., because you can't compile with *BSDmake 2015-03-15 16:34:56 -03:00
Henrique N. Lengler
dc5a8d44e5 Add OpenBSD option to Makefile 2015-03-15 16:27:00 -03:00
Jfreegman
090d3339a0
fix auto-away bugs
Manually set aways no longer unaway when they shouldn't, and busy status is no longer overridden
2015-03-13 20:33:23 -04:00
Jfreegman
442d9e22b4
use pthread for mplex detach polling for better portability 2015-03-11 18:38:07 -04:00
fr33domlover
0c39e7b158 Add support for auto-away based on screen attach/detach 2015-03-09 01:38:30 +02:00
JFreegman
3e3f2614b5 Merge pull request #303 from louipc/interface
Add support for custom timestamps in chat and logs.
2015-02-23 22:38:50 -05:00
Loui Chang
53e4b2c971 Add support for custom timestamps in chat and logs.
Internal representations of the time_format setting are replaced by timestamp format strings.
time_format is only used in the setup.

Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2015-02-23 00:46:33 -05:00
mannol
d6c57c7aa3 Merge pull request #302 from Ansa89/trivial-fix
README.md: update download section
2015-02-19 12:49:50 +01:00
Ansa89
3efc984ae9 README.md: update download section 2015-02-18 15:56:19 +01:00
JFreegman
7618a0871a Merge pull request #301 from Ansa89/trivial-fix
Add INSTALL.md
2015-02-17 14:37:17 -05:00
Ansa89
b87f73cc47 Add INSTALL.md 2015-02-17 11:12:58 +01:00
JFreegman
785d39d78f Merge pull request #296 from louipc/interface
Interface
2015-02-13 14:23:44 -05:00
Loui Chang
38a0f6fae4 Make little action indicators on each output line configurable.
Also added a new DISCONNECTION line info type.

Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2015-02-13 02:09:40 -05:00
JFreegman
710be51cad Merge pull request #298 from Ansa89/trivial-fix
travis.yml: use latest libsodium stable
2015-02-11 19:19:47 -05:00
JFreegman
50438425e5 Update README.md 2015-02-11 19:06:40 -05:00
Ansa89
4b4bfe8876 travis.yml: use latest libsodium stable 2015-02-11 10:12:05 +01:00
JFreegman
67da4bdd5b Merge pull request #297 from urras/patch-1
Travis should build with Libsodium stable, fix clang
2015-02-10 14:27:13 -05:00
Urras
e230badb47 Fix Clang
I didn't expect this to work, but it is and I'm not complaining.
2015-02-10 10:01:44 -05:00
Urras
d48d9ed4dc Travis should build with Libsodium stable 2015-02-10 09:47:06 -05:00
Sean
b9fe6bfa10 Merge pull request #280 from DomT4/darwin
Darwin Build
2015-02-09 21:05:10 -08:00
Loui Chang
5cbbb62ce2 Fix whitespace
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2015-02-09 23:33:49 -05:00
JFreegman
3369c9d808 Merge pull request #293 from Spagy/patch-1
Correct filename comment from main.c to toxic.c
2015-02-04 15:47:58 -05:00
Spagy
dfc594f949 Correct filename comment from main.c to toxic.c 2015-02-04 13:56:31 +00:00
Sean Qureshi
d714cda145
Vital commit fixing serious Toxic bug 2015-02-01 17:10:44 -08:00
JFreegman
428e1e4100 Merge pull request #292 from Ansa89/trivial-fix
Update for toxcore API break
2015-02-01 15:16:29 -05:00
Ansa89
2b19f56e63 Update for toxcore API break 2015-02-01 21:09:48 +01:00
JFreegman
4badc983ea Merge pull request #291 from dantok/master
Fix some edge cases when obtaining paths
2015-01-25 15:54:27 -05:00
dantok
c8a4f88ff3 Update configdir.c 2015-01-25 21:53:13 +01:00
dantok
eeeaf8d707 Update autocomplete.c 2015-01-25 21:52:07 +01:00
dantok
37b3b5a5ed Fix an edge case when obtaining home directory.
Make the path to home directory empty before calling get_home_dir(), otherwise if the call fails, the contents are undefined.
2015-01-25 20:49:52 +01:00
dantok
a561ef8c49 Fixed emptying avatar_path if the path is too long. 2015-01-25 20:17:32 +01:00
JFreegman
89f200e870 Merge pull request #290 from urras/master
Update DHT nodes again
2015-01-11 15:11:04 -05:00
urras
2823115a6c
Update DHT nodes again 2015-01-11 15:06:15 -05:00
JFreegman
5599d73760 remove invalid node from nodes list 2015-01-11 14:28:52 -05:00
JFreegman
bac66cb5ad Merge pull request #289 from urras/master
Update DHT node list
2015-01-11 14:16:50 -05:00
urras
61c50972e3
Update DHT node list 2015-01-11 14:06:33 -05:00
Jfreegman
ff0fbbc379
small fix 2015-01-01 12:50:51 -05:00
Jfreegman
4a124dea43 Merge branch 'flussence-master' 2015-01-01 01:56:31 -05:00
Anthony Parsons
e722b665d1
Make "Last seen" handle year rollover correctly 2015-01-01 05:44:18 +00:00
Jfreegman
4365b8d5ad
update man page 2014-12-27 13:17:05 -05:00
Jfreegman
e55e5f3f7e
add HTTP proxy support 2014-12-27 13:12:16 -05:00
Dominyk Tiller
d1036c8538 Darwin Build
Explains/Better Enables building on the OS X Platform. I’ve written a
Darwin.mk file for the purpose, given one is referenced in the Makefile
but doesn’t actually exist yet. I presume this is due to Toxic’s recent
move away from configure scripts?

Anyhow. It’s not perfect, and it could be prettier, but it should fix
2014-12-18 03:49:52 +00:00
Jfreegman
9240f62829 Merge branch 'jdp5087-tour' 2014-12-17 17:35:01 -05:00
Jon Poler
1b89bc9051 Made the keys section of settings_load more readable in settings.c 2014-12-17 12:15:18 -05:00
Jfreegman
7700ef83e0
disable broken callback 2014-12-09 20:30:13 -05:00
Jfreegman
9922b3a4f3
forgot IFDEFs 2014-12-09 18:55:14 -05:00
Jfreegman
d561d2e1ac
fix 2014-12-09 18:35:14 -05:00
Jfreegman
7865cea284
group audio stuff 2014-12-09 18:29:07 -05:00
Jfreegman
424189cad9
small fix 2014-12-07 21:48:29 -05:00
Jfreegman
82aa64e8f7
properly close all groupchats on exit 2014-12-07 13:51:12 -05:00
Jfreegman
a0418520a2 Merge branch 'master' of https://github.com/Tox/toxic 2014-12-07 12:19:14 -05:00
Jfreegman
f451d961bc
close output device on group exit 2014-12-07 12:16:49 -05:00
Sean
a4da9fd49e "Refactor" this super important file 2014-12-07 01:50:39 -08:00
Jfreegman
0a0891fa98
fix building without audio 2014-12-06 13:40:45 -05:00
Jfreegman
9464b369a4
fix possible crash 2014-12-06 13:26:27 -05:00
Jfreegman
47692edee4
update DHTnodes for real 2014-12-05 20:33:13 -05:00
Jfreegman
73c94b25ba
update DHTnodes, fix comment 2014-12-05 20:26:10 -05:00
Jfreegman
ab2ea5936d
correct value 2014-12-05 13:47:47 -05:00
Jfreegman
90985af007
properly handle file pausing 2014-12-05 13:23:45 -05:00
Jfreegman
5aad8764b1
ensure messages in queue are always delivered in order 2014-12-03 22:10:21 -05:00
Jfreegman
5a175f374a
fix file statusbar draw bug 2014-12-03 21:38:37 -05:00
Jfreegman
4acfe84171
remove spammy connection messages 2014-11-30 12:20:01 -05:00
Jfreegman
e995a1cb69
AV api changes 2014-11-30 09:27:45 -05:00
Jfreegman
867f041c23 more group stuff 2014-11-29 09:39:55 -05:00
JFreegman
7e49ba92b2 Merge pull request #283 from stal888/master
Destroy AL context before closing dhndl
2014-11-29 08:18:56 -05:00
A. L'mao
2fa53c0531 Destroy AL context before closing dhndl
fixes seggy on os x, i think
2014-11-28 22:08:31 -08:00
Jfreegman
673800c947
forgot something 2014-11-28 23:51:32 -05:00
Jfreegman
835b821b75
put toxav loop in separate thread 2014-11-28 23:47:22 -05:00
Jfreegman
78587ad20b
disable group audio callback until it works properly 2014-11-26 17:39:02 -05:00
Jfreegman
09bbec79cf
group audio almost works 2014-11-26 15:22:34 -05:00
JFreegman
751b5f9943 only include audio_call.h if audio is defined 2014-11-26 12:24:52 -05:00
Jfreegman
4a337ae3cb update for core audio refactor 2014-11-26 00:57:02 -05:00
Jfreegman
1baeb15073
update DHTnodes 2014-11-20 02:57:42 -05:00
Jfreegman
141b36af04
handle errors for name functions 2014-11-15 22:39:24 -05:00
Jfreegman
4238c20e72
api update 2014-11-15 15:59:19 -05:00
Jfreegman
4e177d60b0
group title fixes and api update 2014-11-15 15:55:45 -05:00
Jfreegman
1bd880708b
a couple formatting fixes 2014-11-14 22:35:23 -05:00
Jfreegman
76c21c8b34
implement group titles 2014-11-14 22:15:59 -05:00
Jfreegman
dd8c2caac7
more prep for audio groups 2014-11-14 20:13:08 -05:00
Jfreegman
7a7e8a7f8d
prep for audio groups 2014-11-11 20:49:05 -05:00
Jfreegman
43f45d67a4
core API update 2014-11-11 18:30:23 -05:00
Jfreegman
adb36a39bb
minor visual adjustment 2014-11-05 18:46:18 -05:00
mannol
5a0d9f5e9f Merge pull request #278 from Ansa89/trivial-fix
Fix Tox/toxic#276
2014-10-30 15:41:17 +01:00
Ansa89
a4e8cb3971 Fix Tox/toxic#276 2014-10-30 15:23:47 +01:00
Sean
e22b7a336c Merge pull request #274 from Ansa89/trivial-fix
Makefile: revert back to mkdir
2014-10-21 06:20:51 -07:00
Ansa89
317fa42b20 Makefile: revert back to mkdir 2014-10-21 11:51:02 +02:00
Sean
884f8dda37 Merge pull request #273 from Ansa89/trivial-fix
Makefile: add toxic.desktop to install target
2014-10-21 01:38:29 -07:00
Ansa89
f5090532fb Makefile: add toxic.desktop to install target 2014-10-21 10:31:30 +02:00
Sean
ae04dd8fa5 Create toxic.desktop 2014-10-20 13:00:14 -07:00
JFreegman
00e4075937 Merge pull request #271 from Ansa89/trivial-fix
Toxic.conf.exmaple: fix sound namefile
2014-10-20 15:35:52 -04:00
Ansa89
d65f3ea58d Fix sound namefile 2014-10-20 10:55:06 +02:00
Jfreegman
008163bf6c
fix 2014-10-18 17:29:23 -04:00
Jfreegman
f09002a49a Merge branch 'Ansa89-trivial-fix' 2014-10-16 14:27:58 -04:00
Ansa89
431290d47a Version: fix revision calculation 2014-10-16 20:26:00 +02:00
mannol
b66874b7b3 Merge pull request #262 from Ansa89/trivial-fix
Version: add revision only if git is available
2014-10-15 14:26:54 +02:00
Ansa89
1b9fd7f936 Install: check if manpages exist 2014-10-15 14:25:14 +02:00
Ansa89
0a1457acde Version: add revision only if git is available 2014-10-15 10:39:49 +02:00
Jfreegman
d2008aa92f
Merge branch 'louipc-new' 2014-10-13 00:16:05 -04:00
Jfreegman
e83356faef Merge branch 'new' of https://github.com/louipc/toxic into louipc-new 2014-10-13 00:14:29 -04:00
Loui Chang
fd4161832b travis.yml: Remove asciidoc
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-10-12 23:35:48 -04:00
Loui Chang
0a132b0eb5 doc: Unlink docs from the rest of the build process.
Since generated man pages are also included, we can't
guarantee proper timestamps. This should fix issues that trigger doc
building when it isn't needed.

Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-10-12 23:21:48 -04:00
Loui Chang
9c7ac9043a prompt: Add version line to startup message.
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-10-12 23:12:56 -04:00
Loui Chang
b86c0d357f Update toxencryptsave api change.
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-10-12 23:04:30 -04:00
mannol
75dd26518f Finished drag and drop support 2014-10-12 23:26:28 +02:00
mannol
2cc261c619 Some random fixups 2014-10-12 22:54:18 +02:00
Jfreegman
f7d46f1100
possibly fix sound notification bug 2014-10-12 01:49:56 -04:00
Jfreegman
be264528d2
possibly fix sound notification bug 2014-10-12 00:28:28 -04:00
mannol
c825adc1e3 Dnd works 2014-10-11 23:53:02 +02:00
Jfreegman
4e9f125e95
core API function name change 2014-10-10 22:44:05 -04:00
JFreegman
d26c8fe447 Merge pull request #264 from zetok/indicator
Change action messages indicator
2014-10-09 16:46:51 -04:00
Jfreegman
e42d635195
non-critical thread failures shouldn't be fatal 2014-10-09 16:39:01 -04:00
Zetok Zalbavar
a32cd1c19b
Change action messages indicator 2014-10-09 21:36:42 +01:00
Jfreegman
14dc02ac83
fix segfault 2014-10-09 15:47:48 -04:00
Jfreegman
e4a28d1839
make groupchat announcements behave properly 2014-10-09 01:39:22 -04:00
Jfreegman
0908920b51
fix segfault 2014-10-08 18:06:15 -04:00
Jfreegman
8a882916fb
fix setting custom keybinding 2014-10-08 15:22:49 -04:00
Jfreegman
55ada8ad2f
fix groupchat resizing when peerlist is off 2014-10-08 14:53:09 -04:00
Jfreegman
2094186c0f
update DHTnodes 2014-10-08 14:44:15 -04:00
Jfreegman
d3a489b756 update settings and docs with peerlist-toggle keybinding 2014-10-08 03:08:08 -04:00
Jfreegman
e6b18231c0
add ability to toggle groupchat peerlist with ctrl-b 2014-10-08 02:45:08 -04:00
Jfreegman
cc0145d561
reduce system calls, increase time between message queue re-send attempts 2014-10-08 01:50:34 -04:00
Jfreegman
9f0daca5eb
filter escape sequences from all inbound nicks and status messages 2014-10-07 16:18:06 -04:00
Jfreegman
1f2bd44dce
don't allow newlines and tabs in nicks 2014-10-07 00:43:03 -04:00
Jfreegman
6492bd12f9
escape newlines in contact names/status messages 2014-10-06 16:23:43 -04:00
Jfreegman
43552161f9
implement word deletion via ^W 2014-10-05 23:12:58 -04:00
Jfreegman
e5d45fdf1d
correct return code check 2014-10-05 02:29:40 -04:00
Jfreegman
bd69c8da18
small fix 2014-10-04 17:01:02 -04:00
Jfreegman
8c3e3ebe24 fix blocklist saving bug 2014-10-03 23:52:54 -04:00
Jfreegman
7eebbd982d fix 2014-10-03 21:12:59 -04:00
Jfreegman
5c66f5c161
fixes 2014-10-03 19:29:12 -04:00
Jfreegman
40f70fc1e3
groupchat fixes 2014-10-03 18:57:32 -04:00
Jfreegman
9cf4427375
core groupchat names should be working 2014-10-03 17:55:36 -04:00
Jfreegman
23cf9686cb
safer string handling 2014-10-03 17:53:50 -04:00
mannol
70add920fe Making progress with dnd 2014-10-03 16:59:32 +02:00
Jfreegman
c56c6cc219
some temporary fixes for new wip groupchats 2014-10-02 23:22:37 -04:00
Jfreegman
e9a0296851
ignore tox_load errors until toxcore is fixed 2014-10-02 22:25:21 -04:00
Jfreegman
de30433e26
better data operation error handling 2014-10-02 02:07:54 -04:00
Jfreegman
fa64fa8b93 replace call sounds
Signed-off-by: Jfreegman <jfreegman@gmail.com>
2014-10-01 19:38:09 -04:00
mannol
50c7942cb5 Started working on dnd for toxic 2014-10-01 23:28:34 +02:00
Jfreegman
e7697b8fba
make ctrl-L force refresh the window 2014-10-01 16:24:36 -04:00
Jfreegman
b46a77f977
forced end of page is not working out 2014-10-01 15:01:23 -04:00
Jfreegman
38909afa89
refine a couple sound effects 2014-10-01 13:46:19 -04:00
Jfreegman
5af561c811 new default sounds; rm unused sounds 2014-10-01 01:16:17 -04:00
Jfreegman
ae984d4f04
don't show version in default status message 2014-09-30 17:02:03 -04:00
Jfreegman
97a8ecd115
small fix and bump version to 0.5.2 2014-09-29 13:56:17 -04:00
JFreegman
64d782569a add asciidoc and libnotify-dev to install script 2014-09-29 01:54:53 -04:00
Jfreegman
6248baf98b
fix segfault 2014-09-29 01:30:22 -04:00
Jfreegman
33cfca7ecc
bug fixes and code cleanup 2014-09-28 17:49:48 -04:00
mannol
a01cc35368 Merge branch 'master' of github.com:Tox/toxic 2014-09-28 16:48:09 +02:00
mannol
b10eebd77e This should fix audio problem 2014-09-28 16:47:31 +02:00
Jfreegman
05661ca9b6
core API update and refactor group invites a bit 2014-09-27 22:50:20 -04:00
mannol
784883f773 What if, like, photosynthesis is a lie?! 2014-09-28 00:13:45 +02:00
Jfreegman
a9e5723ca4 a couple fixes 2014-09-27 03:08:19 -04:00
Jfreegman
95dfea8d29
keep chatlog names consistent with friend name changes 2014-09-27 02:28:11 -04:00
Jfreegman
e574af7d68
fix CPU usage issue regarding audio drivers, courtesy of mannol 2014-09-26 20:32:48 -04:00
JFreegman
2918ca45a2 Merge pull request #255 from Ansa89/trivial-fix
Fix "error: unknown type name 'off_t'"
2014-09-26 13:01:44 -04:00
Ansa89
6ad744f770 Add stdlib.h header to allow off_t type 2014-09-26 10:50:42 +02:00
Ansa89
5b394e6f35 notify.c: better headers order 2014-09-26 10:46:14 +02:00
Jfreegman
940af2c711 a few fixes, update example config file 2014-09-26 03:39:36 -04:00
Jfreegman
544c402f78
implement avatars (setting only) and generalize path tab-complete 2014-09-26 03:10:44 -04:00
Jfreegman
cee9e624b8 more UI changes 2014-09-25 15:23:50 -04:00
Jfreegman
2e65ee3609
a few UI changes 2014-09-25 04:31:45 -04:00
Jfreegman
3a176e1cab
move to page end after pressing return 2014-09-25 00:42:08 -04:00
Jfreegman
00cccad22c a few general fixes 2014-09-24 15:20:15 -04:00
Jfreegman
a432d733d7
use 64-bit off_t for file sizes 2014-09-24 14:23:08 -04:00
Jfreegman
893e88294b
more succinct way to get file sizes 2014-09-24 00:06:02 -04:00
Jfreegman
b071a9e992
more thorough error checking 2014-09-23 22:51:56 -04:00
Jfreegman
48cf4ebf02
fix for issue #254 2014-09-23 21:32:05 -04:00
Jfreegman
773a75b948
update makefile checks 2014-09-22 21:51:55 -04:00
Jfreegman
133c0e8d63
rename reserved identifiers per C standard 2014-09-22 21:24:45 -04:00
Jfreegman
bf54cb36ef set signal handlers at more appropriate places 2014-09-22 20:00:36 -04:00
Jfreegman
032853b5c9
Merge branch 'Pyrohh-master' 2014-09-22 19:41:23 -04:00
Michael Reed
650c13ca7a There's no need for rm -rf, just rm -f 2014-09-22 18:45:45 -04:00
Jfreegman
9d5fe03285
small fix 2014-09-22 18:38:46 -04:00
Jfreegman
c3f68b60d3
bigger log identifiers to reduce chance of collision 2014-09-22 17:34:30 -04:00
Jfreegman
1c16467eb9
don't share chatlogs across data files (changes log naming convention) 2014-09-22 17:09:39 -04:00
Jfreegman
3c74385f5c
use proper variable type for sig handler flags 2014-09-22 14:27:33 -04:00
Jfreegman
c07c0028bb
increase line_info msg buffer size so won't cut off long log lines 2014-09-22 13:49:09 -04:00
Jfreegman
dc3b2e04ab
load chatlog history when opening a chatwindow 2014-09-22 04:29:28 -04:00
JFreegman
7fd3aa9164 Merge pull request #246 from urras/patch-2
Update screenshot
2014-09-21 13:17:13 -04:00
Urras
4c60312e2d Update screenshot 2014-09-21 12:42:04 -04:00
JFreegman
16e29aa4e0 Merge pull request #243 from Ansa89/trivial-fix
Makefile: use single quotes also for PACKAGE_DATADIR
2014-09-19 12:28:32 -04:00
Ansa89
bd7b073155 Makefile: fix typo 2014-09-19 10:47:25 +02:00
Ansa89
f25cf870e6 Makefile: use single quotes also for PACKAGE_DATADIR 2014-09-19 10:45:27 +02:00
Jfreegman
13291d0365
bump version to 0.5.1 2014-09-19 01:24:39 -04:00
Jfreegman
9ee7a48910 add setting to disable welcome message 2014-09-19 01:11:23 -04:00
Jfreegman
daf4614ba6
improve behaviour of misused encryption options 2014-09-19 00:29:30 -04:00
Jfreegman
919d36369c
add option to unencrypt an encrypted data file 2014-09-18 23:50:51 -04:00
Jfreegman
618704df76
remove duplicate DHT node 2014-09-18 22:52:05 -04:00
Jfreegman
9a70dd9651
possibly fix display bug on some platforms 2014-09-18 13:14:15 -04:00
Sean
e2d310b10f Add TCP nodes on 443 2014-09-17 14:00:41 -07:00
Jfreegman
a1015a366a
update DHTnodes, small fixes 2014-09-17 13:52:27 -04:00
mannol
913ec7b3fe Merge pull request #242 from Ansa89/trivial-fix
Usage help: add missing comma
2014-09-16 13:55:20 +02:00
Ansa89
4a52b06954 Usage help: add missing comma 2014-09-16 11:54:58 +02:00
Jfreegman
89f9c07b9e
add confirmation when creating new password 2014-09-15 19:00:36 -04:00
Jfreegman
388d78d11e
add option to encrypt an existing unencrypted data file 2014-09-15 16:17:58 -04:00
Jfreegman
a2a23b3932
password prompt fixes 2014-09-15 04:13:12 -04:00
Jfreegman
f405ae8b42
improvements to password entry screen 2014-09-14 21:49:38 -04:00
Jfreegman
cf3f6750eb
small fix 2014-09-14 18:25:13 -04:00
JFreegman
4de22d067a Update .travis.yml 2014-09-14 18:08:42 -04:00
Jfreegman
51e274ea38
implement data file encryption 2014-09-14 17:46:28 -04:00
Jfreegman
0a6ce62363
don't write unsent messages to log 2014-09-11 01:36:33 -04:00
Jfreegman
13c5de5531
increase time between message send retries 2014-09-10 16:18:37 -04:00
Jfreegman
21f8e7f398
couple small fixes 2014-09-09 15:16:27 -04:00
Jfreegman
bcf4a5af90
message queue improvements 2014-09-09 14:06:28 -04:00
Jfreegman
09f90d095b properly flag lines with unread mark 2014-09-07 22:28:54 -04:00
Jfreegman
416ebc9ab8
another fix 2014-09-07 22:05:17 -04:00
Jfreegman
3ca22aa714
fix 2014-09-07 21:43:16 -04:00
Jfreegman
8dd25e1f0b code cleanup, add delay for unread message notification 2014-09-07 15:08:01 -04:00
Jfreegman
5b9bd603ea
implement read receipts 2014-09-07 02:43:53 -04:00
Jfreegman
3c2c1f15ce
message sending queue for fake offline messaging 2014-09-06 13:18:42 -04:00
JFreegman
6876df4a45 Merge pull request #240 from s3erios/master
Fix some 'clang --analyze' warnings
2014-09-05 13:16:43 -04:00
Andriy Voskoboinyk
1ff97161fb temporarily revert a862874740f7778ea498cdc28220833f6a1a983e. 2014-09-05 14:15:25 +03:00
Andriy Voskoboinyk
667410e879 fix another potential memory leak 2014-09-05 13:17:10 +03:00
Andriy Voskoboinyk
a862874740 mark exit_toxic_* functions as noreturn 2014-09-05 13:15:56 +03:00
Andriy Voskoboinyk
79bde4e5bf fix potential memory leak and move cleanup to the end of the function 2014-09-05 13:02:26 +03:00
Jfreegman
833b724e9f
fix bug 2014-09-04 18:48:55 -04:00
Jfreegman
96b68058bb code cleanup and fix bug that sometimes prevented tab notifications from working 2014-09-04 18:28:20 -04:00
JFreegman
e823233149 Merge pull request #238 from Ansa89/trivial-fix
Addition to Tox/toxic#235
2014-09-04 13:23:33 -04:00
Ansa89
3ac22fafe4 Add info about DISABLE_X11 usage 2014-09-04 19:20:51 +02:00
JFreegman
71f2ac170c Merge pull request #235 from s3erios/master_cfg
Add X11 option
2014-09-04 13:18:46 -04:00
mannol
0ef888eea3 Merge pull request #236 from s3erios/master
Some code simplification
2014-09-04 11:10:55 +02:00
Andriy Voskoboinyk
a9b0028a15 move some code inside _X11 ifdef 2014-09-04 01:41:02 +03:00
Andriy Voskoboinyk
b18e6cff5a move duplicate code into separate function 2014-09-04 01:36:37 +03:00
Andriy Voskoboinyk
424a1c94d9 Add X11 option 2014-09-04 01:19:32 +03:00
Jfreegman
009095af24
slight simplification for command list iteration 2014-09-02 02:23:44 -04:00
Jfreegman
2ce42ab057 bump version to 0.5.0 2014-09-01 18:56:20 -04:00
Jfreegman
934459dea8
show connection change message in chat windows 2014-08-31 14:17:33 -04:00
mannol
52bc874675 Merge pull request #234 from Ansa89/trivial-fix
Cosmetic fixes
2014-08-31 11:26:48 +02:00
Jfreegman
511907fbc5 better way to check if files exist 2014-08-27 22:51:46 -04:00
Jfreegman
155e194174
fix segfault on unknown long option 2014-08-27 14:30:06 -04:00
Jfreegman
b1c7e21ca9
fix possible segfaults 2014-08-27 13:54:02 -04:00
Jfreegman
7edcf6cb45 add setting to set path for chatlogs 2014-08-26 23:56:37 -04:00
Ansa89
9581940cfa Cosmetic fixes 2014-08-26 10:39:43 +02:00
Jfreegman
f2aa57c4fa
additional messages for startup options 2014-08-26 02:28:05 -04:00
Jfreegman
8bf4405fd0
fix error code 2014-08-25 19:55:00 -04:00
Jfreegman
21ef1788ca
print init messages to prompt window intead of stderr 2014-08-25 19:26:41 -04:00
Jfreegman
68f1dffba7
add command to decline friend requests 2014-08-25 14:08:01 -04:00
mannol1
092df2c0e4 Merge pull request #231 from Ansa89/trivial-fix
Reworked manpage build system
2014-08-25 14:12:12 +02:00
Ansa89
691f94c75c README.md: second try 2014-08-25 12:59:34 +02:00
Ansa89
d6d4476e85 README.md: better look 2014-08-25 12:56:14 +02:00
Ansa89
924e8e0860 Reworked manpage build system 2014-08-25 12:54:44 +02:00
JFreegman
53193e933f Merge pull request #230 from louipc/manpage
Manpage
2014-08-25 00:49:31 -04:00
Loui Chang
328587ad9c doc: Make asciidoc extra optional.
Completely separate man page generation from the main build to satisfy
travis-ci behaviour.

Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-24 17:00:25 -04:00
Loui Chang
1a8fdb1b99 Make asciidoc 'optional'
Run `make doc` in the build directory after editing the asciidoc to
regenerate the manpages. Changes to asciidoc source and generated man
pages will need to be commited together.

Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-24 16:34:16 -04:00
Loui Chang
690f0221b5 Add generated man pages.
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-24 00:16:55 -04:00
Loui Chang
e117bd3985 Add Asciidoc to README and travis
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-21 05:00:15 -04:00
Loui Chang
15cc87bffd Remove old man pages.
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-21 04:40:10 -04:00
Loui Chang
97d4c97c52 Generate man pages from asciidoc
Working directly with g/roff is a pain.
Also changed the formatting of toxic.conf.5 a bit.

Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-21 04:39:24 -04:00
JFreegman
c8b22d7e8a Merge pull request #229 from Ansa89/trivial-fix
toxic.conf.example: better formatting
2014-08-20 13:12:41 -04:00
Jfreegman
f48ec4f49b
array bounds fix 2014-08-20 13:10:21 -04:00
Ansa89
d4ce697bd9 toxic.conf.example: better formatting 2014-08-20 12:40:32 +02:00
Jfreegman
bd20513493 a few fixes 2014-08-19 23:41:43 -04:00
Jfreegman
fd3f4eb724 Merge branch 'master' of https://github.com/Tox/toxic 2014-08-19 20:55:38 -04:00
Jfreegman
75e8486061 add command to list pending friend requests, a few related fixes 2014-08-19 20:52:17 -04:00
JFreegman
bd216709fc Merge pull request #226 from Ansa89/freebsd-man
Fix Tox/toxic#222 and reorganize cfg dir
2014-08-19 13:04:52 -04:00
Ansa89
a3a8f7608a Fix Tox/toxic#222 and reorganize cfg dir 2014-08-19 18:22:57 +02:00
Jfreegman
affc88d0a8 error checking for file senders, fixes 2014-08-17 15:32:38 -04:00
Jfreegman
eca4882ce2
transfer progress bar fix 2014-08-17 13:50:22 -04:00
Jfreegman
58b0a04019 separate file transfer updates from callbacks 2014-08-17 00:11:49 -04:00
Jfreegman
b870679f2c
allow resuming of broken file transfers (needs testing) 2014-08-16 17:20:53 -04:00
JFreegman
ae83725cb6 Merge pull request #223 from louipc/master
Add debug flag and update man page.
2014-08-16 02:59:55 -04:00
Loui Chang
595e42b587 Clarify function of -b switch.
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-16 02:35:21 -04:00
Loui Chang
f5401df2c7 doc/toxic: Add missing flags and sort alphabetically.
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-15 19:26:06 -04:00
Loui Chang
3e79a5ca8b Add -b flag for debugging
For now this just prints messages to stderr, so the user should manually
redirect stderr to avoid breaking the ui. This can be later expanded
upon to provide debugging messages in the command window.

Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-15 19:06:16 -04:00
Jfreegman
327081945e update DHTnodes 2014-08-15 18:17:03 -04:00
Jfreegman
68ec484a58
don't allow DNS lookups when using a proxy + forced TCP & fix arg parsing 2014-08-15 15:13:35 -04:00
Jfreegman
1d6ccf56a8
name conflict with core function might cause linking error 2014-08-15 12:22:39 -04:00
Jfreegman
67f637a1e1
redirect stderr before audio init to prevent error spam 2014-08-14 21:31:28 -04:00
JFreegman
5e175d5319 Merge pull request #220 from louipc/master
new tox_bootstrap_from_address() behaviour and a minor ui change
2014-08-14 20:47:17 -04:00
Jfreegman
778db0fece core change: ports no longer in network byte order 2014-08-14 20:38:33 -04:00
Jfreegman
72010dd2e1
allow connections through proxies 2014-08-14 20:31:52 -04:00
Loui Chang
39556b36f3 port is no longer passed in network byte order to tox_bootstrap_from_address()
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-14 20:10:14 -04:00
Loui Chang
dc9ffa6e56 ipv6enabled parameter was removed in toxcore.
Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-14 19:51:52 -04:00
Loui Chang
1e92bb3c2b help: lowercase keybinding hints for clarity.
Seeing the uppercase character I expected it to be the actual key.

Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-14 19:22:59 -04:00
Jfreegman
edbdf2966a
toxcore API update, add option to force TCP connection 2014-08-14 18:45:41 -04:00
JFreegman
3f6fd734d3 Merge pull request #218 from louipc/louipc
toxic.conf.5: Remove default config from man page
2014-08-14 12:05:33 -04:00
Loui Chang
919a06d282 toxic.conf.5: Remove default config from man page
The reference to the config example in the FILES section should be sufficient.

Signed-off-by: Loui Chang <louipc.ist@gmail.com>
2014-08-14 01:13:27 -04:00
Jfreegman
35cc815cdb add option to specify DNSservers path 2014-08-12 22:32:36 -04:00
Jfreegman
a318bdb034
add option to not connect to the DHT network 2014-08-12 18:59:27 -04:00
Jfreegman
d6aaa95b25
ignore invalid file data callbacks 2014-08-12 15:27:42 -04:00
Jfreegman
5718ad52db
a few fixes 2014-08-12 03:01:18 -04:00
Jfreegman
0f4cffbacc
a few dns fixes 2014-08-11 01:59:01 -04:00
Jfreegman
d9a861331f
Use DNS server list instead of hard coding domains/keys 2014-08-10 21:40:19 -04:00
Jfreegman
2f12a8d429 prevent statusmessage from wrapping on prompt screen 2014-08-10 00:37:26 -04:00
Jfreegman
e75cf4f3ad fix bug where tab alert colours weren't being properly prioritized 2014-08-08 13:39:05 -04:00
Jfreegman
bb85f31bb2 convert bytes for file transfer message, general fixes 2014-08-07 19:31:36 -04:00
Jfreegman
396d08f0d2 refactor friend/blocklist, dynamically allocate memory 2014-08-07 13:24:29 -04:00
Jfreegman
6ab184e7ce
file transfer improvements and bug fixes 2014-08-05 17:38:33 -04:00
Jfreegman
fd65fbfd0c
temporarily disabling clang in travis script due to weird errors unrelated to toxic 2014-08-05 00:27:55 -04:00
Jfreegman
637ea0ed55
attempt to fix travis with clang 2014-08-05 00:16:01 -04:00
Jfreegman
dc2d20f4c4
bump version to 0.4.7 2014-08-04 22:28:12 -04:00
mannol1
d712ccc17e Merge pull request #215 from mannol1/master
Fix ringing sounds
2014-08-05 01:41:21 +02:00
mannol
147030e06f Fix ringing sounds 2014-08-05 01:41:06 +02:00
Jfreegman
09fd5cb69f
small fix 2014-08-04 18:04:54 -04:00
Jfreegman
64db9f73a2 update file transfers for core changes 2014-08-04 16:47:45 -04:00
Jfreegman
28633be2dd
a few fixes and improve error messages 2014-08-04 14:35:34 -04:00
Jfreegman
6fdafceda8 add ability to cancel file transfers 2014-08-04 02:03:23 -04:00
Jfreegman
38ed0c86ad
use hangup cmd to cancel outgoing call requests 2014-08-03 23:11:19 -04:00
Jfreegman
ad23816096
fix filetransfer bug 2014-08-03 16:44:21 -04:00
Jfreegman
bc4a730e76 re-adding until better solution found 2014-08-03 15:42:14 -04:00
Jfreegman
79372cc80d
don't show full path when sending files 2014-08-03 15:12:55 -04:00
Jfreegman
c9e4246ac5 Merge branch 'master' of https://github.com/Tox/toxic 2014-08-03 11:54:49 -04:00
JFreegman
dcd6a238b6 Merge pull request #213 from doughdemon/master
Add missing includes
2014-08-03 11:48:03 -04:00
Felix Janda
c49de7733c Add missing includes
Fixes compilation with musl libc
2014-08-03 09:44:48 +02:00
Jfreegman
3fc7c90630
stderr redirect doesn't work as intended, add invalid command message when no sound 2014-08-03 01:31:33 -04:00
Jfreegman
53663a7832
try to end curses session gracefully on SIGSEGV 2014-08-03 00:26:44 -04:00
Jfreegman
c14f2a3fcd put chatlogs in their own directory 2014-08-02 21:03:59 -04:00
Jfreegman
3cbe61e111
fix a few formatting bugs and simplify code a bit 2014-08-02 15:35:57 -04:00
mannol1
fa023c6a99 Merge pull request #211 from mannol1/master
Fix bug
2014-08-02 19:22:45 +02:00
mannol
f98e6bdcb4 Fix bug 2014-08-02 19:21:40 +02:00
Jfreegman
0884954c84
fix data file init bug 2014-08-02 13:04:29 -04:00
mannol1
43727c6730 Merge pull request #210 from mannol1/master
Fresh pack of backdoors
2014-08-02 17:31:36 +02:00
Jfreegman
618b731d5a
fix possible buffer overflow 2014-08-01 23:00:52 -04:00
mannol
46975bf38b Updated with latest core 2014-08-02 02:10:21 +02:00
mannol
8f3989000d Box notifications are like ready 2014-08-02 00:37:02 +02:00
Jfreegman
9fe75fbc47
fix 2014-08-01 15:05:10 -04:00
Jfreegman
c455e79604
dynamically adjust main loop sleep time according to recommended value 2014-08-01 13:56:49 -04:00
Jfreegman
a223545853 close chatwindow if its associated contact is blocked/deleted 2014-07-31 22:05:09 -04:00
Jfreegman
b243f7aa62 Merge branch 'master' of https://github.com/Tox/toxic 2014-07-31 15:13:10 -04:00
Jfreegman
899452d7cd Merge branch 'block' 2014-07-31 15:04:05 -04:00
Jfreegman
af68fa7ee0
endian correctness 2014-07-31 15:02:19 -04:00
Jfreegman
5da789cc37
save last online data in blocked list 2014-07-31 14:53:02 -04:00
stal
7e5b41c8e0 another apple include: <sys/syslimits.h>
for NAME_MAX
2014-07-31 10:52:36 -07:00
Jfreegman
0254596c73
add help menu for friendlist 2014-07-31 13:49:15 -04:00
stal
67c02404b7 alut is not part of OpenAL.framework on OS X
therefore the linux include path works fine
2014-07-31 10:38:04 -07:00
JFreegman
0b5ee7e2c7 Merge pull request #208 from Ansa89/makefile-update
Makefile: refactoring and adding desktop notifications support
2014-07-31 12:51:44 -04:00
Jfreegman
fba0732faa
implement contact blocking 2014-07-31 12:48:49 -04:00
Ansa89
d06086a656 Try to support older versions of OpenAL 2014-07-31 13:14:33 +02:00
Ansa89
e74b678739 check_features.mk: modify string comparison 2014-07-31 11:54:22 +02:00
Ansa89
b62787ce47 Makefile: refactoring and adding desktop notifications support 2014-07-30 14:14:13 +02:00
Jfreegman
75708f7600
couple small fixes 2014-07-30 02:46:08 -04:00
Jfreegman
476dec46b6 add settings to toggle typing notifications for self and others 2014-07-29 20:14:44 -04:00
Jfreegman
973f6206ee
enforce const correctess, fix undefined behaviour with string literals 2014-07-29 14:54:34 -04:00
JFreegman
cbe47b3660 Merge pull request #207 from Ansa89/manpage-update
Update toxic.conf manpage
2014-07-29 11:51:58 -04:00
Ansa89
1c58c339bb Update toxic.conf manpage 2014-07-29 12:07:24 +02:00
Jfreegman
15e91cfa99 formatting, use case-insensitive string compare, use defines for keycodes 2014-07-28 21:47:35 -04:00
Jfreegman
f4fb6ea4fc Merge branch 'gracchus163-master' 2014-07-28 20:45:52 -04:00
matt
0d2ff2c0a8 Fixed toxic.conf.example mistakes 2014-07-29 01:28:10 +01:00
matt
5275da5a6b Merge branch 'keybinds'
configurable keybinds finished and working, merging with master branch
2014-07-29 00:55:39 +01:00
matt
e891b1281b Configurable keybinds implemented and example conf updated 2014-07-29 00:53:44 +01:00
Jfreegman
ca7110b37c
small visual adjustment to progress bar 2014-07-28 19:36:30 -04:00
matt
8960eb98f4 Example conf updated 2014-07-28 22:47:33 +01:00
matt
18610668b8 Human readable config parsing complete, few tests left to confirm 2014-07-28 22:44:12 +01:00
JFreegman
efe61e32e2 Merge pull request #204 from zetok/symbol
Fix ONLINE_CHAR being identical to OFFLINE_CHAR
2014-07-28 13:39:40 -04:00
Zetok Zalbavar
7a7e4f573a Fix ONLINE_CHAR being identical to OFFLINE_CHAR 2014-07-28 18:38:15 +01:00
matt
a7e6ab7758 reads correctly from config file now, need to go through and check each one and then look at usability 2014-07-28 15:19:50 +01:00
matt
a0cde4ae8c Merge remote-tracking branch 'origin/master' into keybinds 2014-07-28 14:06:54 +01:00
JFreegman
7566aa9d26 Merge pull request #205 from loadedice/master
Lowered volume of sounds
2014-07-28 03:14:29 -04:00
joelina
d2332a5b77 Lowered volume of sounds 2014-07-28 16:42:57 +10:00
Jfreegman
94a8ce5aa8
fix buggy path autocomplete behaviour 2014-07-28 01:33:12 -04:00
Jfreegman
b18a67d656 put file senders in a round-robin queue so multiple transfers upload at a uniform pace 2014-07-27 22:27:27 -04:00
mannol1
02708534c0 Merge pull request #200 from mannol1/master
Core adjustments
2014-07-28 01:35:58 +02:00
mannol
d5710d80e0 Upstream adaption 2014-07-28 01:35:40 +02:00
matt
8dcba3219d Merge remote-tracking branch 'origin/master' into keybinds 2014-07-28 00:32:05 +01:00
matt
9f01a45b1f Keybind defaults moved to settings.c; conf keybinds not reading correctly yet 2014-07-28 00:06:25 +01:00
JFreegman
dd2cb93ecc Merge pull request #203 from zetok/manpages
Put man pages in right place by default (#202)
2014-07-27 18:15:32 -04:00
Jfreegman
49538a986c improve file transfer progress line 2014-07-27 18:00:33 -04:00
Zetok Zalbavar
26c2331d0f Put man pages in right place by default (#202) 2014-07-27 21:06:37 +01:00
Jfreegman
a0758643c2
fix blurry screenshot? 2014-07-27 03:36:06 -04:00
Jfreegman
77e152ad36
fix security flaw where untrusted input wasn't being sanitized 2014-07-26 21:22:55 -04:00
mannol
4834642b80 Merge remote-tracking branch 'upstream/master' 2014-07-27 01:50:06 +02:00
mannol
18a6f621f0 Started adding support for popup notifications and adjustments to new core 2014-07-27 01:49:59 +02:00
Jfreegman
3cae1d92cd
change online/offline symbols 2014-07-26 19:16:07 -04:00
Jfreegman
02b192d6ee fix bug and typo 2014-07-25 20:17:22 -04:00
Jfreegman
f630a3e604
fix possible buffer overflows and undefined behaviour 2014-07-25 17:55:21 -04:00
Jfreegman
fb5a9bc043 fix backspace bug, simplify a bit 2014-07-25 15:51:29 -04:00
irungentoo
26ad5a00a3 Fixed out of bounds read. 2014-07-25 15:17:46 -04:00
Jfreegman
18e1f08e31 Merge branch 'master' of https://github.com/Tox/toxic 2014-07-24 23:04:07 -04:00
Jfreegman
b68deef6db allow line_info_add to take formatted strings with variable # of args 2014-07-24 23:03:55 -04:00
mannol1
30ec7debba Merge pull request #199 from mannol1/master
Fixed sounds not playing
2014-07-25 02:13:24 +02:00
mannol
3a1e23a3ff Fixed sounds not playing 2014-07-25 02:12:32 +02:00
mannol1
0887bb7662 Merge pull request #198 from Ansa89/master
README.md: add precompiled binaries
2014-07-24 13:24:51 +02:00
Ansa89
5a55f738a9 README.md: add precompiled binaries 2014-07-24 13:05:56 +02:00
Jfreegman
8d8df585ad
sort directories and skip special symbols for path autocomplete 2014-07-23 18:34:32 -04:00
Jfreegman
8660047ec1
fix small bug, update readme, bump version 2014-07-23 15:15:14 -04:00
Jfreegman
9476db02a9
allow disabling of individual sounds 2014-07-23 14:59:36 -04:00
mannol1
04fbf5f724 Merge pull request #195 from Ansa89/notify-fix
Add hardcoded path for sound notifications
2014-07-23 11:56:20 +02:00
Ansa89
3cc629cbc1 Add hardcoded path for sound notifications 2014-07-23 11:25:38 +02:00
mannol1
50fca4cddf Merge pull request #193 from Ansa89/makefile-fix
Makefile: little refactoring
2014-07-23 03:51:52 +02:00
Jfreegman
a047cead05
fix a few notification issues 2014-07-22 14:38:32 -04:00
Ansa89
1131b73299 Update toxic.conf.5 manpage 2014-07-22 16:38:20 +02:00
Ansa89
196af10d01 Move init and exit in right place 2014-07-22 12:30:35 +02:00
Ansa89
1e0e93e5c6 Makefile: little refactoring 2014-07-22 09:59:44 +02:00
Jfreegman
ac01d6d316 fix config file loading, fix makefile compile errors 2014-07-21 18:57:16 -04:00
mannol1
654e404e0e Merge pull request #190 from mannol1/master
Fixed some build errors
2014-07-21 23:49:08 +02:00
mannol
f0f1138c54 Fixed some build errors 2014-07-21 23:48:39 +02:00
Jfreegman
bc94e08970 sendfile tab-complete for ~/ shortcut 2014-07-21 15:11:30 -04:00
JFreegman
42c3ede963 Merge pull request #188 from Ansa89/makefile-fix
Makefile fix
2014-07-21 13:02:25 -04:00
Ansa89
174568d769 README.md: add dependencies for sound notifications 2014-07-21 14:19:01 +02:00
Ansa89
4587d8ebbd Forgot libalut-dev dependency 2014-07-21 12:50:29 +02:00
Ansa89
98aae242fb Makefile fix 2014-07-21 12:33:19 +02:00
mannol1
7abd8d5ee5 Merge pull request #187 from mannol1/master
Added sound notifications, libconfig support, and more...
2014-07-21 12:08:19 +02:00
mannol
98ac4d7983 Added sound notifications and prepared for later system notifications. Also, now using libconfig for configuration loading. 2014-07-21 03:25:21 +02:00
mannol
933d46553f Added sounds 2014-07-21 01:12:13 +02:00
Jfreegman
7e667a8028 print multiple matches for all tab-complete operations, fix bug when tab-completing at end of line 2014-07-18 13:48:21 -04:00
Jfreegman
d4e41d6053 autocomplete pathnames with spaces 2014-07-18 03:20:40 -04:00
Jfreegman
f30dccf726
return correct value, fix comment 2014-07-18 01:52:33 -04:00
Jfreegman
ea3fcd5b79 auto-completion for paths when sending file & improved auto-complete algorithm to do partial matches 2014-07-18 01:37:33 -04:00
Jfreegman
e61d070def
cleanup/error checks 2014-07-17 03:35:18 -04:00
Jfreegman
b5f34f42a8 small fix 2014-07-16 21:34:50 -04:00
Jfreegman
4426eaddd9
increase max friends 2014-07-16 15:59:54 -04:00
Jfreegman
83f0720a39
another UB fix 2014-07-16 15:55:04 -04:00
Jfreegman
ce4f293574 fix undefined behaviour with string literals 2014-07-16 12:51:07 -04:00
Jfreegman
b23ae5a4c3 add buffer yanking, clean up input functions 2014-07-14 14:44:42 -04:00
Jfreegman
190e1e73e8
change tab names: prompt = home, friends = contacts 2014-07-13 15:34:09 -04:00
Jfreegman
ee67cf0bf1
use full name for log 2014-07-10 02:54:56 -04:00
Jfreegman
aaeb47dc14
create dns loopup threads in detached state & add a few missing error descriptions 2014-07-09 23:40:46 -04:00
Jfreegman
e19b0ed710 delete subwindows before parent window on resize to prevent memory leaks 2014-07-09 22:12:51 -04:00
mannol1
a774121c13 Merge pull request #183 from mannol1/master
Fixes problems with upstream changes
2014-07-10 01:30:17 +02:00
mannol
df676423a7 Fixed conflicts 2014-07-10 01:29:18 +02:00
mannol
cf8dda6b0d Fixes problems with upstream changes 2014-07-10 01:24:14 +02:00
Jfreegman
1ce731471d fix potential race conditions 2014-07-09 02:21:01 -04:00
Jfreegman
f98c77432b
exit toxic properly on ^C 2014-07-08 20:21:51 -04:00
Jfreegman
9fa5a3fdb6
fix window cleanup bugs & give prompt its own cleanup func 2014-07-08 19:24:44 -04:00
Jfreegman
5b9fd70f30
autosave every 60 seconds 2014-07-08 14:46:50 -04:00
Jfreegman
442f68cd31
wrap tox_get_name in function that truncates name if it's too long 2014-07-08 14:31:59 -04:00
JFreegman
e74212cb9e Merge pull request #181 from Ansa89/master
Use long int instead uint64_t
2014-07-08 12:00:48 -04:00
Ansa89
57b52f35b4 Use long int instead uint64_t 2014-07-08 09:39:42 +02:00
Jfreegman
27a31a8399
truncate long chat window names 2014-07-07 19:39:33 -04:00
Jfreegman
f1a3ed379e
fix nick truncating 2014-07-07 19:08:33 -04:00
mannol1
60f9be7234 Merge pull request #180 from Ansa89/master
Forgot about help
2014-07-07 11:10:45 +02:00
Ansa89
dcfb90bc63 Forgot about help 2014-07-07 09:36:29 +02:00
Jfreegman
74b84c4252 some code cleanup 2014-07-07 03:12:47 -04:00
Jfreegman
00e6546f0c
namelength should be signed, -Werror is probably overkill 2014-07-06 22:31:11 -04:00
Jfreegman
a009fbf20c use char instead of uint8_t, fix compiler warnings so toxic compiles with -Wall and -Werror on gcc and clang 2014-07-06 22:16:20 -04:00
mannol1
2ed9448b41 Merge pull request #174 from mannol1/master
Make closing window end call
2014-07-06 22:52:11 +02:00
Jfreegman
1575a40d61
reduce inactive window refresh rate 2014-07-06 16:18:34 -04:00
JFreegman
a784fdf9d5 Merge pull request #179 from Ansa89/master
Add option to disable audio support
2014-07-06 16:16:15 -04:00
Ansa89
612c0e1131 Add freebsd flags for ncursesw 2014-07-06 21:23:58 +02:00
Ansa89
16a82e1897 Add option to disable audio support 2014-07-06 19:57:08 +02:00
Jfreegman
ad14baf601
remove unnecessary memsets 2014-07-06 03:41:48 -04:00
Jfreegman
8b6a5813e6 fix line_info_reset_start() bugs, a few other small fixes/cleanup 2014-07-06 01:48:50 -04:00
irungentoo
f4c76e12f4 A/V api change. 2014-07-05 16:19:38 -04:00
Jfreegman
3fa8c4be0b
small fix 2014-07-05 15:20:33 -04:00
Jfreegman
2f904371ae Merge branch 'master' of https://github.com/Tox/toxic 2014-07-05 14:47:55 -04:00
Jfreegman
455eba3bfd
fix help popup flickering issue on some terminals 2014-07-05 14:46:16 -04:00
JFreegman
48f6a0cd5e fix typo 2014-07-04 14:25:22 -04:00
JFreegman
50a15d2289 update screenshot 2014-07-04 14:21:58 -04:00
Jfreegman
de1e61bd5a code cleanup, improve welcome message 2014-07-04 14:19:20 -04:00
mannol
7fba5a59bf Fixed implicit declaration warning and merge conflict leftover 2014-07-04 18:14:06 +02:00
mannol
3a86ee923e Fixed merge conflicts 2014-07-04 18:05:50 +02:00
mannol
65e726a51a Now closing the window will end the call 2014-07-04 18:04:03 +02:00
JFreegman
91c4414889 update screenshot 2014-07-04 03:35:27 -04:00
Jfreegman
6754741f37
improve /help system and add startup welcome message 2014-07-04 03:24:29 -04:00
Jfreegman
10d0e99d72
core api const-correctness update 2014-07-02 17:30:31 -04:00
Jfreegman
9696acc8bd
remove obsolete unixtime patch 2014-07-02 16:20:03 -04:00
Jfreegman
0f37e50419 groupchat keys can sometimes start with a 0 2014-07-02 14:13:35 -04:00
Jfreegman
95d09e4b75
fix window resizing bug on some platforms and add -O1 optimization flag 2014-07-01 19:39:25 -04:00
Jfreegman
7c71c35797 possibly fix segfault 2014-07-01 15:04:29 -04:00
Jfreegman
893cfaa543
correctly reposition call infobox on resize 2014-07-01 11:17:52 -04:00
Jfreegman
3e22c9b829
allow friendlist to be resized properly 2014-07-01 01:17:31 -04:00
Jfreegman
a968ca2a2e
update toxic version to 0.4.3 2014-07-01 00:11:40 -04:00
Jfreegman
c271622670
fix resizing bugs 2014-06-30 23:56:47 -04:00
Jfreegman
a126f9c1a6 don't excessively update percentage complete line during file transfers 2014-06-30 14:17:07 -04:00
Jfreegman
44d524134f
need mutexes 2014-06-30 11:42:11 -04:00
Jfreegman
7ae807002e file sender thread was a failed experiment - do_file_senders should only be called once per tox_do iteration 2014-06-30 03:03:43 -04:00
Jfreegman
a194f7ad87
add option to use the default locale 2014-06-29 18:14:28 -04:00
Jfreegman
61d3f7e63e
fix tab completion in prompt window 2014-06-29 16:54:27 -04:00
JFreegman
8715e9c41e Merge pull request #170 from Ansa89/patch-1
Manpage fix
2014-06-29 11:58:39 -04:00
Ansa89
5da69e7f56 Manpage fix 2014-06-29 11:48:02 +02:00
Jfreegman
ebc5cd9285
manpage fixes/rm redundant comments & make alerts setting more intuitive 2014-06-28 22:05:05 -04:00
Jfreegman
97536d2a72
add setting option to disable timestamps 2014-06-28 20:33:46 -04:00
Jfreegman
a2e6a25fc8
make prompt window look like chat/groupchat windows (fixes various bugs, allows history scrolling) 2014-06-28 18:40:22 -04:00
Jfreegman
f8998b5891
properly close file senders on exit 2014-06-28 12:55:05 -04:00
JFreegman
8d4f7fc32b Merge pull request #169 from Ansa89/make_help
Add help target and toxic.conf manpage
2014-06-28 12:51:42 -04:00
Ansa89
828b7fb505 Add help target and toxic.conf manpage 2014-06-28 18:40:59 +02:00
Jfreegman
74525bcd14
rm Werror for clang 2014-06-28 12:24:42 -04:00
Jfreegman
33e98fd720
put file senders in one thread due to weird issues & a few fixes 2014-06-28 12:14:43 -04:00
mannol1
134e5873a9 Merge pull request #165 from mannol1/master
Fixed setting buffer to half of the size
2014-06-27 01:46:24 +02:00
mannol
89a95eca16 Fixed setting buffer to half of the size 2014-06-27 01:45:15 +02:00
Jfreegman
d881312e3e should fix the high cpu usage issue 2014-06-26 19:35:12 -04:00
Jfreegman
da65ba4e8d
give file senders their own threads 2014-06-26 18:20:56 -04:00
Jfreegman
e8a39e1722 man page fixes/additions, rm unneeded toxic.conf file from install 2014-06-26 13:22:22 -04:00
Jfreegman
581261afca
fix backspace issue on some platforms 2014-06-26 11:19:51 -04:00
mannol1
8d68b5cc01 Merge pull request #164 from Ansa89/man-page
Add manpage
2014-06-26 14:09:44 +02:00
Ansa89
353be3a7a2 Add manpage 2014-06-26 14:06:22 +02:00
Ansa89
b9af1b3293 Merge pull request #5 from Tox/master
Sync with main project
2014-06-26 13:28:43 +02:00
Jfreegman
09badaa9ee refactor chat window input code, misc fixes 2014-06-26 02:52:01 -04:00
Ansa89
587f6518f7 Merge pull request #4 from Tox/master
Sync with main project
2014-06-25 11:09:59 +02:00
mannol1
6c38e72654 Merge pull request #161 from Ansa89/fix-autoconnect
Try to fix autoconnect
2014-06-25 11:00:45 +02:00
Ansa89
599c2119d5 README.md: better wording 2014-06-25 10:54:05 +02:00
Ansa89
dfd89f2b5c Makefile: fix typo...again 2014-06-25 09:56:31 +02:00
Ansa89
7db3dcbdf6 Makefile: fix typo 2014-06-25 09:53:05 +02:00
Ansa89
5b268a1a6a Try to fix autoconnect (Tox/toxic#158) 2014-06-25 09:13:57 +02:00
Jfreegman
43c1140aa2
improve input scrolling, fix some unicode issues (WIP) 2014-06-24 21:02:16 -04:00
Jfreegman
0bc9725b98
forgot makefile 2014-06-24 17:52:57 -04:00
Jfreegman
ef097757f3 general cleanup: rm unused config.h, add license info to device.c/h, add a couple compiler options and fix warnings 2014-06-24 17:47:35 -04:00
JFreegman
6490fa598c Merge pull request #157 from Ansa89/widechar
Wide characters support
2014-06-24 17:04:21 -04:00
Jfreegman
c41464c990
fix dns compatibility for apple 2014-06-24 13:20:12 -04:00
Ansa89
94d7e3199e Put back license 2014-06-24 17:48:49 +02:00
Ansa89
140dd5e5d3 Put back license 2014-06-24 17:46:52 +02:00
Ansa89
251a81ef43 Create cfg directory 2014-06-24 17:37:11 +02:00
Ansa89
76f81c4d33 Wide characters support and removed unused files 2014-06-24 17:35:23 +02:00
Ansa89
b14a1bb7b9 Merge pull request #3 from Tox/master
Sync with main project
2014-06-24 17:25:25 +02:00
mannol1
5f6f021039 Merge pull request #155 from theGeekPirate/patch-1
Polishing README.md
2014-06-24 15:00:35 +02:00
theGeekPirate
9b69cecfb1 Polishing README.md
- Corrected English phrasing throughout
- Display screenshot on the page instead of a link
- Clarification as to what 'libtoxav' is
- Numeration for compilation steps instead of an unsorted list
- Separated compilation instructions into steps and notes
- Added links for dependencies
2014-06-24 05:54:14 -07:00
mannol1
f75248d177 Merge pull request #153 from Ansa89/master
README.md: add build status
2014-06-24 14:02:01 +02:00
Ansa89
97f8d6c074 README.md: add build status 2014-06-24 13:20:21 +02:00
Ansa89
c29d5d1ca2 Merge pull request #1 from Tox/master
Sync with main project
2014-06-24 12:51:24 +02:00
mannol1
48c272acf8 Merge pull request #152 from Ansa89/without-autotools
Update readme instructions
2014-06-24 12:48:53 +02:00
Ansa89
f66b9137e8 Update README.md 2014-06-24 12:46:18 +02:00
Ansa89
c3dfaa5935 Update README.md 2014-06-24 12:45:14 +02:00
Ansa89
9a9ae03e41 Update .gitignore: revert previous commit 2014-06-24 12:41:49 +02:00
Ansa89
2bbc47d3f7 Update .gitignore: remove autotools 2014-06-24 12:37:43 +02:00
Ansa89
f12b0ee472 Update .gitignore: remove autotools 2014-06-24 12:35:45 +02:00
Ansa89
46e4ddfaf1 Update README.md 2014-06-24 12:30:33 +02:00
Ansa89
449b6fa5ff Update README.md 2014-06-24 12:28:56 +02:00
Ansa89
3913adedb0 Update .travis.yml: cosmetic fixes 2014-06-24 12:06:13 +02:00
mannol1
4cf545d334 Merge pull request #149 from Ansa89/without-autotools
Remove autotools dependency
2014-06-24 12:03:52 +02:00
Ansa89
9225af06b1 Update .travis.yml: moved makefile in "build/" 2014-06-24 11:53:10 +02:00
Ansa89
562483823c Makefile: move to "build/" 2014-06-24 11:53:02 +02:00
Ansa89
57742bcd87 Makefile: use <TAB> instead of <SPACE> 2014-06-24 11:01:32 +02:00
Ansa89
5066ea637b Update .travis.yml: remove autotools 2014-06-24 10:53:24 +02:00
Ansa89
7b8cf65218 Makefile: remove Windows support and bump version 2014-06-24 09:02:06 +02:00
Jfreegman
7ac7713268 improve call duration string & remove a couple unused functions 2014-06-24 02:58:18 -04:00
Jfreegman
490c80dae9 don't allow calls to offline friends 2014-06-23 22:15:39 -04:00
Jfreegman
f324d2d34b some fixups 2014-06-23 21:56:58 -04:00
Jfreegman
f3ee120c48 Merge branch 'master' of https://github.com/Tox/toxic 2014-06-23 18:54:48 -04:00
Jfreegman
63ea6154f4
show info box for audio calls 2014-06-23 18:54:23 -04:00
mannol1
eafa660dee Merge pull request #151 from mannol1/master
Forgot to set index in some callbacks
2014-06-24 00:30:37 +02:00
mannol
2a6a5b13d7 Forgot to set index in some callbacks 2014-06-24 00:30:11 +02:00
Ansa89
47b9648f85 Makefile: fix typo 2014-06-24 00:23:37 +02:00
mannol1
55c05a4092 Merge pull request #150 from mannol1/master
Reverse call_idx and enable running call when devices fail to load
2014-06-24 00:21:22 +02:00
mannol
476b056ed0 make it dynamic 2014-06-24 00:20:44 +02:00
Ansa89
c53600b550 Makefile: add per-system defaults
This is only an empty structure, but I hope it will help for add per-system defaults in future
2014-06-24 00:17:14 +02:00
mannol
f47991e18e Reverse call_idx and enable running call when devices fail to load 2014-06-23 23:57:12 +02:00
Ansa89
773a3f4abf Remove autotools 2014-06-23 23:24:24 +02:00
Ansa89
809f472cb4 Remove autotools 2014-06-23 23:24:03 +02:00
Ansa89
e8ee3d694a Remove autotools 2014-06-23 23:23:41 +02:00
Ansa89
fec501801e Remove autotools 2014-06-23 23:23:17 +02:00
Ansa89
c52fe21237 Remove autotools 2014-06-23 23:23:05 +02:00
Ansa89
f00c218e56 Remove autotools 2014-06-23 23:22:32 +02:00
Ansa89
1daa4c5ca6 Makefile: add toxic version 2014-06-23 22:32:10 +02:00
Ansa89
717f8986cd Makefile: checks for libs 2014-06-23 21:55:32 +02:00
mannol1
65aba6e77d Merge pull request #147 from Ansa89/cast-localtime
Cast localtime
2014-06-23 21:30:19 +02:00
Ansa89
9f8a6a8b6b Use pkg-config for toxcore and toxav 2014-06-23 15:34:32 +02:00
Ansa89
b0bfb13241 Update Makefile
Cosmetic fixes
2014-06-23 14:07:23 +02:00
Ansa89
34102f72a2 Hand-written makefile
Compile toxic without autotools
2014-06-23 11:09:01 +02:00
Ansa89
cb93c6ec65 Cast time to "time_t" 2014-06-23 10:58:24 +02:00
Ansa89
78af10fa1f Cast time to "time_t" 2014-06-23 10:57:27 +02:00
mannol1
52b7719180 Merge pull request #146 from mannol1/master
Changed code a bit and added new features
2014-06-22 21:10:25 +02:00
mannol
48361a003e Merged upstream and other fixes 2014-06-22 21:07:11 +02:00
Jfreegman
34bd4a1c7c
fix a bunch of implicit declarations 2014-06-21 21:41:38 -04:00
mannol
94b271da5d wat 2014-06-22 02:31:24 +02:00
mannol
e47f2c05f3 Added VAD, changed device i/o, mute option, dynamic device changing and more 2014-06-22 02:18:23 +02:00
Jfreegman
6b9ef7e6c9
refactor string funcs 2014-06-21 17:55:01 -04:00
Jfreegman
62239a1fda fix backspace bug 2014-06-21 11:55:32 -04:00
Jfreegman
bba81ac884
fix offset issue 2014-06-20 23:56:59 -04:00
Jfreegman
9f4248b1e1
redesign text input field to scroll horizontally, increase max string size 2014-06-20 23:08:13 -04:00
mannol
e06f0ffb7e Missed device.* 2014-06-21 02:04:25 +02:00
mannol
29b283c176 VAD sort of works 2014-06-21 01:58:00 +02:00
Jfreegman
3e797db16e
various fixes 2014-06-20 14:27:33 -04:00
Jfreegman
034a8f5d8b
code cleanup, improve do_connection 2014-06-19 13:50:41 -04:00
Jfreegman
eb7d910683
add toxme.se to dns3 server list 2014-06-18 20:22:26 -04:00
Jfreegman
85af9f55ba
improve key bindings (I think?) 2014-06-18 20:07:34 -04:00
Jfreegman
ca98b49813
fix scrolling bug 2014-06-18 18:29:07 -04:00
Jfreegman
0cff881d69
small fix 2014-06-18 18:07:51 -04:00
Jfreegman
7eb82a0fe5 bump version to 0.4.1 2014-06-18 16:15:34 -04:00
Jfreegman
58a131426a
better handling of fatal errors 2014-06-18 15:54:05 -04:00
Jfreegman
72e9e7d9c4 add str_to_lower function, ignore DNS domain name case 2014-06-18 13:12:39 -04:00
Jfreegman
fc148be3e2
fix possible segfaults 2014-06-18 12:10:00 -04:00
Jfreegman
bc51714148
exit dns threads with pthread_exit 2014-06-17 19:32:02 -04:00
Jfreegman
b24325d879 threads for DNS lookups 2014-06-17 19:19:48 -04:00
Jfreegman
b480e22a27 don't need this 2014-06-17 19:16:42 -04:00
Jfreegman
afa4bc86e8
.. 2014-06-17 11:47:02 -04:00
JFreegman
6cd2411ec0 Merge pull request #142 from jin-eld/add-libresolv
Add libresolv
2014-06-17 11:39:02 -04:00
jin-eld
6f9ab56493 Remove redundant toxav header check
If pkg-config reports that toxav is there, it should be enough, no extra
checks needed.
2014-06-17 10:22:05 +02:00
jin-eld
485191d185 Add configure checks for libresolv 2014-06-17 10:20:42 +02:00
Jfreegman
1456cef991 implement toxdns3 username lookups 2014-06-17 00:48:30 -04:00
Jfreegman
53cb4b0248
ignore ^C 2014-06-15 15:36:29 -04:00
Jfreegman
2c4f0d593d
fix len values 2014-06-14 14:09:20 -04:00
Jfreegman
499c66f411
include config header 2014-06-14 13:54:21 -04:00
Jfreegman
1b5da956e5 more fixes 2014-06-14 03:00:04 -04:00
Jfreegman
c76b541cb8 Merge branch 'master' of https://github.com/Tox/toxic 2014-06-14 01:55:15 -04:00
Jfreegman
ce2d371c4b more fixes for line printing/scrolling 2014-06-14 01:45:51 -04:00
stal
eefd981572 Merge pull request #141 from jin-eld/openal-sx
Search for OpenAL framework on OSX
2014-06-13 17:39:25 -07:00
jin-eld
9240295724 Search for OpenAL framework on OSX
if pkg-config does not find OpenAL on OSX, do a manual search for the
OpenAL framework.

references #140
2014-06-14 02:29:20 +02:00
Jfreegman
a516724760
fix bug 2014-06-13 19:05:25 -04:00
Jfreegman
a0ef4d752f
small fix 2014-06-13 17:37:11 -04:00
Jfreegman
65ad64bf42
fix some buggy behaviour with scrolling 2014-06-13 15:37:04 -04:00
Jfreegman
b36680d767 fix bug 2014-06-13 03:47:18 -04:00
Jfreegman
24a85df15f remove scroll mode, scroll windows via PageUp/PageDown 2014-06-13 02:10:30 -04:00
Jfreegman
f10ce94f38
api changes 2014-06-11 20:04:20 -04:00
stal
612c6c95eb fix openal includes on mac os
#140
2014-06-11 16:40:43 -07:00
Jfreegman
31a2e648c5
code cleanup 2014-06-11 18:47:18 -04:00
Jfreegman
31acdcada3 reorganize toxic_windows.h into two separate header files, rename main.c to toxic.c 2014-06-11 18:14:12 -04:00
Jfreegman
12e33a1760
drop broken windows support 2014-06-11 14:37:36 -04:00
Jfreegman
328e7f8d57
fix compile error when no audio support 2014-06-10 17:34:15 -04:00
Jfreegman
33000598fc
more intuitive option logic 2014-06-08 01:05:01 -04:00
Jfreegman
6a2ef5cc6c
terminate audio before core on exit 2014-06-07 17:59:17 -04:00
Jfreegman
2a63e62aba
--help message 2014-06-07 17:14:48 -04:00
Jfreegman
935d8f8770
update dhtnodes 2014-06-07 14:50:21 -04:00
Jfreegman
8c5ac1f77d
proper commandline args 2014-06-07 14:36:37 -04:00
Jfreegman
bfa266c604
refactor calling of toxic_string functions 2014-06-06 15:27:06 -04:00
Jfreegman
901ffbc7c0
improve function 2014-06-04 14:41:36 -04:00
Jfreegman
97dedd32fb better fix for trailing spaces issue 2014-06-04 01:19:20 -04:00
Jfreegman
789c491c1e
fix a few file transfer bugs 2014-06-03 16:04:57 -04:00
Jfreegman
4b8dd3ad72
update example conf file 2014-06-03 02:06:37 -04:00
Jfreegman
c2dce960b8
add setting to allow specified download path & some fixes 2014-06-03 02:02:24 -04:00
Jfreegman
f9e15cd60b
no trailing space for command tab-complete 2014-06-02 03:19:59 -04:00
Sean
4d249c5fe3 Bumped to 0.4.0 2014-06-01 14:53:57 -07:00
Jfreegman
7206a9ea73 fix another possible buffer overflow
..
2014-06-01 13:42:42 -04:00
Jfreegman
848b4e9a4c
fix possible buffer overflow 2014-06-01 12:54:45 -04:00
Jfreegman
d65d0a08aa fix chat scroll bug 2014-06-01 03:45:46 -04:00
mannol
7ccf4b6432 Little fix(tm) 2014-05-29 23:42:22 +02:00
mannol
d18ba78d03 Allow toxic to compile without av 2014-05-29 23:25:09 +02:00
Jfreegman
ab1c97fb2b properly set default user settings 2014-05-29 13:58:37 -04:00
Zetok Zalbavar
b0a66706bd Update README.md
Update default example path for Tox libs
2014-05-29 15:04:14 +01:00
Jfreegman
f0962bd060
add setting to control history size 2014-05-25 19:54:34 -04:00
Jfreegman
083ca2f3b7
missing format arg 2014-05-25 13:31:44 -04:00
mannol1
8481b50f97 Merge pull request #132 from Impyy/master
Update audio_call.c
2014-05-25 18:55:40 +02:00
mannol1
a04f7ee661 Merge pull request #130 from mannol1/master
Updated toxic to build against new core.
2014-05-25 18:54:19 +02:00
Imperative
10d47d1ac6 Update audio_call.c
Fixed 2 small typos.
2014-05-24 15:35:10 +02:00
Jfreegman
445f5aa1fd fix possible buffer overflow 2014-05-23 23:52:43 -04:00
Jfreegman
1b49a89c8e
correct inaccuracy 2014-05-20 20:59:43 -04:00
Jfreegman
9bf92d1e48 Merge branch 'master' of https://github.com/Tox/toxic 2014-05-20 19:38:39 -04:00
Jfreegman
da308b2253
fix file transfer bug 2014-05-20 19:36:53 -04:00
mannol
0c834b60f5 Not done yet. 2014-05-16 20:00:01 +02:00
Sean
2cf5430b85 Fixed a "bug" 2014-05-13 10:14:19 -07:00
Sean
30d2a5514e Yup 2014-05-13 10:11:20 -07:00
Sean
1d6a6efb81 Merge FreeBSD fixes upstream 2014-05-08 13:13:33 -07:00
JFreegman
af09961875 Merge pull request #128 from aitjcize/null-term
Fix file sender null terminator.
2014-05-05 15:41:09 -04:00
AZ Huang
a46fe25283 Force terminate filename. 2014-05-06 03:39:09 +08:00
AZ Huang
dfe3f1c4c2 Fix file sender null terminator. 2014-05-06 01:16:59 +08:00
Jfreegman
b969079af5 Merge branch 'master' of https://github.com/Tox/toxic 2014-05-01 04:11:29 -04:00
Jfreegman
2837c5697f
small fix 2014-05-01 04:00:19 -04:00
Sean
820b619847 Update DHTnodes 2014-04-28 00:53:20 -07:00
Jfreegman
6b72ef0720
change a few memcpy's to strcpy to fix possible segfaults 2014-04-26 04:09:51 -04:00
Jfreegman
81125be971
show selected friend's ID at bottom of friendlist 2014-04-24 23:25:38 -04:00
Jfreegman
decc585065 Merge branch 'master' of https://github.com/Tox/toxic 2014-04-22 21:17:28 -04:00
Jfreegman
17ad66346e
make cleaclear command refresh curses 2014-04-22 21:16:35 -04:00
Sean
e0330c984f Update README.md 2014-04-21 16:37:39 -07:00
Jfreegman
3a9056745f Merge branch 'master' of https://github.com/Tox/toxic 2014-04-20 16:43:14 -04:00
Jfreegman
9b997fbf01
fix bug 2014-04-20 16:42:37 -04:00
Sean Qureshi
4cac797b40
General cleanup
Signed-off-by: Sean Qureshi <sean@tox.im>
2014-04-19 14:58:13 -07:00
irungentoo
7f5dc0a756
Removed useless line. 2014-04-19 17:49:19 -04:00
Jfreegman
93d77fdeca
load data before prompt init to fix bug with prompt logging init 2014-04-12 03:54:43 -04:00
Jfreegman
5b3acf3f6b
fix issue where log file cannot be created due to invalid name/path 2014-04-12 03:39:15 -04:00
Jfreegman
a29136d6b7 use toxic settings for colour theme instead of config flag 2014-04-12 03:12:45 -04:00
Jfreegman
4a8db6f098 Merge branch 'terminal_colors' of https://github.com/ooesili/toxic into ooesili-terminal_colors 2014-04-12 03:04:36 -04:00
Jfreegman
766ae685c2
add setting to disable terminal alerts 2014-04-11 21:47:09 -04:00
Jfreegman
e384f87a04
increase line message buffer size 2014-04-10 18:16:27 -04:00
Jfreegman
688564cfc2
merge 2014-04-08 17:23:19 -04:00
Jfreegman
4643996c3a
add audio settings for conf file 2014-04-08 17:20:21 -04:00
mannol1
eef5b4941f Merge pull request #121 from czarkoff/openbsd
Include "pthread.h"
2014-04-08 13:57:07 +02:00
mannol1
4b83df3652 Merge pull request #122 from czarkoff/redeclarations
Drop typedef redeclarations
2014-04-08 13:56:39 +02:00
Dmitrij D. Czarkoff
f54cd87abc Drop typedef redeclarations
C99 doesn't permit redeclaring typedefs in the same scope.
2014-04-08 12:11:10 +02:00
Dmitrij D. Czarkoff
be8a0de38d Include "pthread.h"
It isn't implicit on OpenBSD.
2014-04-08 12:09:42 +02:00
Jfreegman
9fbf7bd1c1 Merge branch 'master' of https://github.com/Tox/toxic 2014-04-08 02:51:22 -04:00
Jfreegman
cd0bccfbeb
remove leading 0 and am/pm for 12 hour timestamp in chat windows 2014-04-08 02:50:56 -04:00
JFreegman
c1cb367acf Update README.md 2014-04-08 02:17:19 -04:00
Jfreegman
de3a28c6e6
create empty config file if none found && make default time 24 hours 2014-04-07 18:16:38 -04:00
Jfreegman
5976d33fef
settings_load needs to be before init_term 2014-04-07 06:22:51 -04:00
Jfreegman
e17b62c98b Merge branch 'master' of https://github.com/Tox/toxic 2014-04-07 06:04:15 -04:00
Jfreegman
92948abcf1 implement basic user settings 2014-04-07 06:03:45 -04:00
mannol1
852c3e89d6 Merge pull request #119 from mannol1/master
Wow
2014-04-07 08:44:53 +02:00
mannol
8ce1a3d3e9 Codec settings and MORE! 2014-04-06 23:56:49 +02:00
mannol
cb9622136c Merge remote-tracking branch 'upstream/master' 2014-04-06 23:26:02 +02:00
mannol
46b57feb2f Codec settings 2014-04-06 23:26:00 +02:00
Jfreegman
a9bcab4aee
fix possible memory leak 2014-04-06 05:20:46 -04:00
Wesley Merkel
0fdb01ff97 Turn off native colours by default 2014-04-05 16:20:35 -06:00
Wesley Merkel
b9290c8a83 Let user disable native colours with ./configure 2014-04-05 13:31:53 -06:00
Jfreegman
246a514e88
fix possible segfault 2014-04-02 18:57:11 -04:00
Jfreegman
20f126e1d8
fix possible segfault 2014-04-02 17:27:07 -04:00
Wesley Merkel
82027a5b4f Use default terminal fg/bg colors when we can. 2014-04-02 14:25:12 -06:00
Jfreegman
3b2010200d
possibly fix scrolling bug 2014-04-02 04:59:51 -04:00
Jfreegman
24cd6d772f
bigger history 2014-04-01 17:42:27 -04:00
Jfreegman
c46676daa5
buffer needs to be empty 2014-04-01 16:32:53 -04:00
Jfreegman
411ae8d0f5
off by 1 error 2014-04-01 04:43:52 -04:00
Jfreegman
e419299487
use correct types 2014-04-01 03:53:12 -04:00
Jfreegman
f3a8ba6ab3 small fix 2014-04-01 03:16:38 -04:00
Jfreegman
6d98f38128
forgot a few string nulls 2014-04-01 02:49:35 -04:00
Jfreegman
08f57de9e0
fix segfault and memory leak 2014-04-01 02:38:32 -04:00
Jfreegman
3b7e161149 don't send null terminated strings, and null terminate all incoming strings 2014-03-31 22:34:05 -04:00
Jfreegman
15815bf4bb
split big function up 2014-03-31 21:26:09 -04:00
Jfreegman
43a5ee2d4f
esc isn't printable 2014-03-30 21:31:20 -04:00
JFreegman
bd817e77f0 Merge pull request #113 from graboy/master
Fixed support for wide characters
2014-03-30 17:22:41 -04:00
Grayson MacKenzie
f8a4312fdd Repaired window switching after widechar fix 2014-03-30 16:42:27 -04:00
Grayson MacKenzie
cce7892d94 Fixed character support 2014-03-30 16:40:13 -04:00
Jfreegman
1420618eb0 small fix 2014-03-30 01:22:40 -04:00
Jfreegman
52d6e8431f
fix 2014-03-29 21:16:25 -04:00
Jfreegman
1b89af9063
null fix 2014-03-29 05:44:20 -04:00
Jfreegman
d873181306
fix scrolling bug 2014-03-29 04:40:35 -04:00
Jfreegman
26640cda14 prevent screen from moving on input when in scroll mode 2014-03-28 19:52:26 -04:00
Jfreegman
21c48bde5c
string safety 2014-03-28 03:46:00 -04:00
Jfreegman
8c071fb208 fix potential segfaults 2014-03-28 01:46:09 -04:00
Jfreegman
b36a8fd8fa show percentage complete for file transfers 2014-03-27 23:05:50 -04:00
Jfreegman
94e936575e
fix memory leaks 2014-03-27 17:59:31 -04:00
Jfreegman
1b3c40b539
put help message in chatwindow box when in scroll mode 2014-03-27 05:08:48 -04:00
Jfreegman
bd5453002e
a few more fixes 2014-03-26 19:14:28 -04:00
Jfreegman
c218e104e7
a few fixes 2014-03-26 05:52:21 -04:00
Sean Qureshi
f6db888808
Merge branch 'master' of https://github.com/stqism/toxic 2014-03-25 19:35:47 -07:00
Sean Qureshi
3a804fefd1
Mention av
Signed-off-by: Sean Qureshi <sean@tox.im>
2014-03-25 19:34:11 -07:00
Sean Qureshi
e0deda27da
Merge branch 'master' of https://github.com/JFreegman/toxic 2014-03-25 19:27:14 -07:00
Jfreegman
bb97f3e543 merge 2014-03-25 22:10:05 -04:00
Jfreegman
92c0f737ac . 2014-03-25 22:02:48 -04:00
Jfreegman
29b549e677 few fixes 2014-03-25 21:43:49 -04:00
Jfreegman
3baa830afb move log struct to proper place 2014-03-25 08:25:10 -04:00
Jfreegman
a5ce17f44e refactor groupchats to allow scrolling 2014-03-25 08:21:50 -04:00
Jfreegman
2f981ecb12 make audio messages compatible with new printing method 2014-03-25 04:39:44 -04:00
Jfreegman
5e941427d3 refactor prompt to allow scrolling 2014-03-25 03:17:22 -04:00
Jfreegman
a40b6b1b1b replace prompt's PromptBuf struct with a ChatContext for compatibility 2014-03-24 07:55:28 -04:00
Jfreegman
e5b6e0ad9f refactor chat history to allow scrolling 2014-03-24 07:18:58 -04:00
Sean Qureshi
5956c6acaf
Merge branch 'master' of https://github.com/mannol1/toxic 2014-03-23 15:32:51 -07:00
mannol
58f33fa1d6 Merge upstream 2014-03-23 22:54:56 +01:00
Jfreegman
7384440a3d small fix 2014-03-21 04:03:07 -04:00
Jfreegman
c1dfb741c9 typging change callback update 2014-03-20 20:59:54 -04:00
JFreegman
25b5545644 Update DHTnodes 2014-03-20 19:11:47 -04:00
Jfreegman
d49e911fe4 type fixes 2014-03-19 03:14:08 -04:00
Jfreegman
50a37495f8 API update 2014-03-18 21:48:26 -04:00
Jfreegman
8bea44a44c properly handle invalid statuses 2014-03-18 19:34:02 -04:00
Jfreegman
3ad82cf3b1 fix bug in issue #104 2014-03-17 22:18:04 -04:00
Jfreegman
99e36195f7 make sure default statusmsg shows correct version 2014-03-17 20:38:30 -04:00
Jfreegman
d03a661635 Merge branch 'master' of https://github.com/Tox/toxic 2014-03-17 19:58:08 -04:00
mannol1
c5c12385ef Merge pull request #103 from mannol1/master
Open devices when call starts instead of keeping them opened all the time
2014-03-18 00:51:41 +01:00
mannol
705a55d1b5 Open devices when call starts instead of keeping them opened all the time 2014-03-18 00:50:15 +01:00
JFreegman
77db725822 Merge pull request #102 from graboy/master
Incorrectly handled error check for widechars
2014-03-16 20:40:26 -04:00
Grayson MacKenzie
e6c68143bd Fixed incorrectly handled error check for longchars 2014-03-16 20:18:31 -04:00
David Mackay
b5cbd8e410 Merge pull request #100 from jin-eld/fix-noav
Fix toxic build when toxav is not available
2014-03-16 19:36:47 +00:00
jin-eld
8024757e57 Fix toxic build when toxav is not available 2014-03-16 20:28:46 +01:00
mannol1
a5a7361370 Merge pull request #99 from jin-eld/issue#98
Add checks for pthreads to the build system
2014-03-16 17:01:24 +01:00
jin-eld
7f70345dae Add checks for pthreads to the build system
pthreads are now required, so add appropriate checks to the build system
and set the compile flags accordingly.

closes #98
2014-03-16 16:55:25 +01:00
Jfreegman
33a4e806e2 handle last online stuff properly & update toxic version 2014-03-16 03:31:48 -04:00
mannol1
1a9cd4cd2c Merge pull request #97 from mannol1/master
Fixes and stuff...
2014-03-15 14:12:02 +01:00
Jfreegman
c055af7348 retain last status on load and some changes to statusbars 2014-03-15 07:40:13 -04:00
Jfreegman
65eb185a9f attempt to make friendlist more visually appealing 2014-03-15 04:14:46 -04:00
Jfreegman
a68fc671e5 show "last seen" time for offline friends 2014-03-14 23:46:24 -04:00
mannol
79fbf0a31f Fixes and stuff... 2014-03-14 23:08:08 +01:00
Jfreegman
d29836845c get unix time more efficiently 2014-03-13 23:56:46 -04:00
Jfreegman
c2d417c78b Merge branch 'master' of https://github.com/Tox/toxic 2014-03-13 23:31:58 -04:00
Jfreegman
d8d198c81c rm unused argument for sort func 2014-03-13 23:30:44 -04:00
Sean Qureshi
bc8b1f170e Revert "Remove all traces of autotools"
This reverts commit 514cf8e460f230cba104573f85dad51d12d9439a.
2014-03-13 09:04:30 -07:00
Sean Qureshi
514cf8e460 Remove all traces of autotools 2014-03-13 09:01:49 -07:00
Jfreegman
ac82961bea fix bug and load previous status messages on boot 2014-03-13 07:34:14 -04:00
Jfreegman
9d52b6ab5d forgot a lock 2014-03-13 06:43:53 -04:00
Jfreegman
aeb70262e0 Merge branch 'master' of https://github.com/Tox/toxic 2014-03-13 06:27:57 -04:00
Jfreegman
f6a85518bc implement multi-threading 2014-03-13 06:06:53 -04:00
Sean
27c5013697 ... 2014-03-12 23:18:46 -07:00
Sean Qureshi
aa53076e11 Add joke unixtime patch 2014-03-12 22:19:21 -07:00
Jfreegman
c37311ae36 an experiment gone horribly wrong 2014-03-12 18:48:25 -04:00
Jfreegman
ce76896eb3 easier way to format timestamps 2014-03-12 03:08:13 -04:00
JFreegman
5e377639c8 Merge pull request #94 from lehitoskin/spellcheck
SPELLING IS FOR FOOLS
2014-03-11 22:57:33 -04:00
Lehi Toskin
93fb9611f7 SPELLING IS FOR FOOLS 2014-03-11 19:54:09 -07:00
Sean
cc3513968e I don't even 2014-03-11 19:30:23 -07:00
Jfreegman
dd697d7af1 Merge branch 'master' of https://github.com/Tox/toxic 2014-03-11 20:00:12 -04:00
Jfreegman
a32d76ed16 fix 2014-03-11 20:00:03 -04:00
mannol1
e6d307f65a Merge pull request #92 from mannol1/master
Fixed segfault
2014-03-12 00:41:43 +01:00
mannol
b210068c1d Fixed segfault 2014-03-12 00:25:13 +01:00
Jfreegman
0151b9b49f rm 'connecting' message and a few small fixes 2014-03-11 18:57:32 -04:00
mannol1
ab0da36cb7 Merge pull request #91 from mannol1/master
This should fix segfault and remove one-line comments
2014-03-11 23:26:51 +01:00
mannol
ed3e9b476d This should fix segfault and remove one-line comments 2014-03-11 23:22:27 +01:00
Sean
7c63bd80d6 Merge pull request #90 from Jman012/master
Fixed another clang issue with bools that broek file sending.
2014-03-11 13:22:07 -07:00
Jman012
9f06331a0b Fixed another clang issue with bools that broek file sending. 2014-03-11 13:11:22 -07:00
Sean
a63cba645f Issue #89 workaround for a toxav_get_peer_id issue 2014-03-11 12:59:12 -07:00
Sean
9d50d52216 What a waste of a commit
Note to self, fixup rebase this before g finds it
2014-03-11 10:24:21 -07:00
Sean
6cb36e71fe I like using entire commits for tiny things 2014-03-11 10:21:35 -07:00
Sean
0b52de3773 Update groupchat.c 2014-03-11 10:19:14 -07:00
Sean
22ac65c4a9 Change John Doe to Anonymous 2014-03-11 10:09:20 -07:00
Sean
3b90c3495f Forgot al 2014-03-10 23:25:59 -07:00
Sean
f4e4fbbef1 Update configure.ac 2014-03-10 21:08:02 -07:00
Sean
6aee8c136b Merge pull request #88 from mannol1/master
Toxic audio support
2014-03-10 21:05:46 -07:00
Sean
2a0740821c Allow AV in Travis 2014-03-10 21:00:53 -07:00
mannol
e6f285adc7 Update with latest core 2014-03-11 01:04:53 +01:00
mannol
a80da2b58f Merge remote-tracking branch 'upstream/master' 2014-03-11 00:58:18 +01:00
mannol
da924f07a9 Updated to latest core 2014-03-11 00:34:18 +01:00
Jman012
e8cd1417b7 Fixed clang error, disabling the execute module. 2014-03-08 23:42:37 -08:00
Jfreegman
d08feb2cc5 simplify popup drawing 2014-03-09 01:02:54 -05:00
Jfreegman
fe0641e981 add popup alert on friend delete 2014-03-08 23:57:21 -05:00
mannol
1fd07837ea Fixed build problems 2014-03-08 16:36:42 +01:00
mannol
6c2ae4ad24 Don't allow changing device while transmission is active 2014-03-08 02:09:11 +01:00
mannol
c678d41709 Now supporting device selection 2014-03-08 01:12:51 +01:00
mannol
63745afe09 Toxic now supports audio calls 2014-03-07 03:27:48 +01:00
mannol
416419a6e7 Toxic now supports audio calls 2014-03-07 03:14:04 +01:00
Jfreegman
33e16fe870 small optimization 2014-03-06 19:39:57 -05:00
mannol1
d712d6c898 Merge pull request #85 from micrictor/master
Fixing fall-back from IPv6 to IPv4
2014-03-05 18:11:55 +01:00
Michael R. Torres
2ae478d546 Fix fall-back from IPv6 to IPv4
Professionalism edits
2014-03-05 07:17:57 -08:00
Jfreegman
4b8de0d16d speed up friendlist loading on startup 2014-03-05 08:01:12 -05:00
Jfreegman
2fcfa954ab move file sender stuff to its own files 2014-03-05 05:06:21 -05:00
Jfreegman
675c8fa89f fix 2014-03-05 03:37:07 -05:00
Jfreegman
d1153f96ca small refactor for incoming file transfers 2014-03-05 03:31:12 -05:00
Michael
2f473300cd Fixing fallback from IPv6 to IPv4 2014-03-05 06:01:10 +00:00
Jfreegman
92d5b2fefc Merge branch 'master' of https://github.com/Tox/toxic 2014-03-04 03:18:59 -05:00
Jfreegman
70f8b103de Merge branch 'master' of https://github.com/JFreegman/toxic 2014-03-04 03:18:01 -05:00
Jfreegman
41292c1ded old server list wasn't being installed; default to DHTnodes in /usr/local/share/toxic 2014-03-04 03:17:48 -05:00
JFreegman
90393f1dba Update README.md 2014-03-04 03:14:25 -05:00
Jfreegman
87bd0f9b34 old server list wasn't being installed; t in DHTnodes in /usr/local/share/toxic 2014-03-04 03:10:07 -05:00
JFreegman
13e67f4ce3 Update README.md 2014-03-04 03:08:04 -05:00
Jfreegman
6c9dbfe3bc Merge branch 'master' of https://github.com/Tox/toxic 2014-03-03 19:23:17 -05:00
Jfreegman
24b763bce6 simplify logging 2014-03-03 19:21:52 -05:00
Sean Qureshi
e41008bd4e Minor fixup 2014-03-03 07:55:10 -08:00
Jfreegman
7f38c3c6e7 add prompt logging support 2014-03-01 18:06:35 -05:00
Jfreegman
7109b8fa18 refactor logging functions to only handle chatlog pointers 2014-03-01 07:10:44 -05:00
Jfreegman
1e503b1080 fix 2014-02-27 23:38:15 -05:00
Jfreegman
4fb82cceaa save logging preference for friend chats and improve log command message 2014-02-27 23:33:00 -05:00
Jfreegman
46b046a209 make C-e and C-aa work like they do in bash and fix/format help messages 2014-02-27 18:55:18 -05:00
Jfreegman
6ee1f1ed0f fix 2014-02-26 21:30:27 -05:00
Jfreegman
044b731089 Fix bug 2014-02-26 21:00:35 -05:00
Jfreegman
d83ef1d8be update help messages 2014-02-26 19:45:11 -05:00
Jfreegman
459eb64dc4 Merge branch 'master' of https://github.com/Tox/toxic 2014-02-26 19:03:15 -05:00
Jfreegman
af5627b050 update to 0.2.7 2014-02-26 19:02:22 -05:00
Jfreegman
9b57c05648 add command to turn logs on/off 2014-02-26 19:00:13 -05:00
Jfreegman
817f763589 give groupchat logs unique names 2014-02-26 17:15:34 -05:00
Jfreegman
8e4db369bc log events 2014-02-26 06:35:19 -05:00
Jfreegman
a61f5f6a6d properly close windows on exit 2014-02-26 05:23:11 -05:00
Jfreegman
5ff7065744 basic logging for groupchats 2014-02-26 03:51:26 -05:00
Jfreegman
831d8e5f24 implement chat logging 2014-02-26 01:51:06 -05:00
JFreegman
6896292c49 Update README.md 2014-02-25 03:07:03 -05:00
Jfreegman
b6613a015f add license info to source files 2014-02-25 02:28:24 -05:00
Jfreegman
2d9f4facf7 connect to limited number of nodes on init instead of all of them 2014-02-24 20:08:51 -05:00
Jfreegman
e7920d1da7 fix connection error codes 2014-02-24 19:41:02 -05:00
Jfreegman
eb09fceed7 fix bug and some cleanup 2014-02-24 19:18:43 -05:00
JFreegman
b308e19e6b Merge pull request #80 from viric/dhtservers
Fallback to loading /usr/share/toxic/DHTservers.
2014-02-24 02:17:14 -05:00
Sean
5867f1a672 Merge pull request #82 from kl4ng/master
down arrow returns empty string if at end of history
2014-02-23 12:49:20 -08:00
kl4ng
5187861b69 down arrow returns empty string if at end of history 2014-02-23 14:22:45 -05:00
Jfreegman
0013dae552 Merge branch 'master' of https://github.com/Tox/toxic 2014-02-23 05:40:21 -05:00
Jfreegman
b018aa384e small fix and don't show typing alert for /commands 2014-02-23 05:38:44 -05:00
Sean
ad8f99dae4 Revert that 2014-02-23 02:19:22 -08:00
Jfreegman
5b9d3f6f62 fix segfault 2014-02-23 05:15:48 -05:00
Sean
93bcecde70 Update README.md 2014-02-23 02:11:51 -08:00
Lluís Batlle i Rossell
6be1c907d9 Fallback to loading /usr/share/toxic/DHTservers.
First try ~/.config/tox/DHTservers, and fallback to the /usr/share
one if the former fails.

This should allow people just starting toxic for the first time to
connect to the DHT.
2014-02-23 09:52:07 +00:00
Sean
9f309ecb96 Move to 0.2.6 2014-02-23 01:37:43 -08:00
Jfreegman
2b707f1d80 implemented typing status 2014-02-23 04:28:33 -05:00
mannol
fd86f01fd0 Started with audio 2014-02-23 00:00:34 +01:00
mannol
e775c51a06 Merge upsteam/master 2014-02-22 23:58:36 +01:00
Jfreegman
6269eafeaa Merge branch 'master' of https://github.com/Tox/toxic 2014-02-22 04:52:08 -05:00
Jfreegman
18b0abe25d merge 2014-02-22 04:51:54 -05:00
Sean
352656230c HOW DO YOU FORGET ABOUT THIS FOR 6 MONTHS??? 2014-02-22 01:51:30 -08:00
Jfreegman
da6ef159e6 null check just incase 2014-02-22 04:50:47 -05:00
Jfreegman
9e2fde8d84 make status message version not hard-coded 2014-02-22 04:46:35 -05:00
Sean
aec16a22a4 Update prompt.c 2014-02-22 01:39:32 -08:00
Sean
3960208fd6 Update configure.ac 2014-02-22 01:25:10 -08:00
Sean
198f9af71d Fine 2014-02-22 01:21:37 -08:00
Sean
61b2a7f0c9 Use ssl 2014-02-22 00:59:33 -08:00
JFreegman
137b8c2412 Merge pull request #78 from kl4ng/master
ncurses libraries README note
2014-02-22 01:13:46 -05:00
Jfreegman
fd3604be44 small fix 2014-02-22 01:04:40 -05:00
kl4ng
c7a2643ee0 added other required package 2014-02-22 00:26:46 -05:00
kl4ng
77875d0ca6 typo 2014-02-22 00:20:29 -05:00
kl4ng
e8a72146b0 added note about ncurses libraries 2014-02-21 23:59:11 -05:00
Jfreegman
a4cb568558 small fix 2014-02-21 22:02:16 -05:00
Jfreegman
9353c2078b Merge branch 'master' of https://github.com/Tox/toxic 2014-02-21 21:30:29 -05:00
Jfreegman
7e23afb57e make friendlist offline statuses bold 2014-02-21 21:24:33 -05:00
Jfreegman
2982dc6ddd show pseudo-unique identifier in friend chat windows 2014-02-21 21:21:12 -05:00
JFreegman
23d47e9539 Merge pull request #77 from alevy/umask
umask such that stored files are u+rw only
2014-02-21 18:31:15 -05:00
Amit Aryeh Levy
a68b733d58 umask such that stored files are u+rw only 2014-02-21 01:25:49 -08:00
Jfreegman
4294e39b49 check connection only once per call 2014-02-21 01:57:13 -05:00
Jfreegman
d9142eb355 restructure main toxic loop 2014-02-21 00:45:29 -05:00
Jfreegman
69c467fa5f rm unnecessary file transfer limit 2014-02-20 07:47:19 -05:00
Jfreegman
eb2d6afa00 make own nick green in groupchats 2014-02-16 23:15:27 -05:00
Jfreegman
5f1ddcf5f6 make error msg more clear for normal users 2014-02-14 05:10:53 -05:00
Jfreegman
07089271cc prompt tab alealert when friend comes online 2014-02-13 06:24:58 -05:00
Jfreegman
c3d2ff6bfb couple fixes 2014-02-11 19:12:26 -05:00
Jfreegman
16b8f85d95 send name instead of full path with file send request 2014-02-11 18:52:04 -05:00
Jfreegman
1f06606c5b enforce toxic max name length in groupchats 2014-02-10 20:13:22 -05:00
Jfreegman
0dd588182b don't alert when you type your own nick in groupchat 2014-02-09 22:55:42 -05:00
Jfreegman
3cd15f3846 show number of online friends 2014-02-07 23:31:35 -05:00
Jfreegman
bd4b430fbb count_friendlist is too inefficient to use that way 2014-02-07 23:28:17 -05:00
Jfreegman
42cd80efe9 use API function for friend count instead of global var 2014-02-07 18:44:10 -05:00
Jfreegman
da99d776df fix 2014-01-30 22:03:26 -05:00
Jfreegman
ebf7d4517f don't modify name list when truncating nicks to fit in groupchat side panel 2014-01-30 22:01:08 -05:00
Jfreegman
a028de17cd how did that get there 2014-01-25 01:04:05 -05:00
Jfreegman
e360d2aa5a Merge branch 'master' of https://github.com/Tox/toxic 2014-01-22 23:30:27 -05:00
Jfreegman
866cafbf1b timestamp for prompt connection and friend request alerts 2014-01-22 23:29:28 -05:00
Sean
d4e8b7de5d Moved to onion routing servers, removed dead ones 2014-01-21 06:53:05 -08:00
Jfreegman
06b09cd981 correct value 2013-12-18 20:18:38 -05:00
Jfreegman
feefecb2ac fix a couple bugs 2013-12-18 20:18:02 -05:00
Jfreegman
d04f5fa102 beep when it should beep 2013-12-15 20:52:10 -05:00
Jfreegman
dfb5b16e7d show friend count and change friend delete key to delete 2013-12-14 19:29:45 -05:00
Jfreegman
14c9599a30 couple fixes 2013-12-14 15:38:21 -05:00
Jfreegman
c371c37bce had the names confused 2013-12-14 01:10:22 -05:00
Jfreegman
6f034d434a this makes more sense 2013-12-14 00:57:46 -05:00
Jfreegman
eb6d832e3e correct usage of wcwidth() 2013-12-14 00:36:58 -05:00
Jfreegman
10ae3865ca improve line history functionality 2013-12-14 00:36:06 -05:00
Jfreegman
34cc4314a5 added groupchat actions 2013-12-13 20:57:32 -05:00
JFreegman
8b1dbd44ba Merge pull request #63 from aitjcize/groupchat-wchar
Fix groupchat cursor movement.
2013-12-11 21:57:27 -08:00
AZ Huang
f3cdb3cd62 Fix groupchat cursor movement. 2013-12-12 13:55:42 +08:00
JFreegman
4dfdfa33a1 Merge pull request #62 from aitjcize/wchar-cursor
Fix wchar cursor movement.
2013-12-11 21:42:27 -08:00
AZ Huang
bc8e737514 Fix wchar cursor movement. 2013-12-12 13:43:29 +08:00
Jfreegman
1dad3711c4 better error handling for failed string conversions 2013-12-12 00:37:29 -05:00
Jfreegman
12e1a60ca3 ugly partial fix for bug 2013-12-11 05:41:02 -05:00
Jfreegman
ff30a29df1 small improvement 2013-12-11 04:49:21 -05:00
Jfreegman
629041d465 simplify code a bit 2013-12-11 03:29:31 -05:00
Jfreegman
83a81f6db6 Merge branch 'master' of https://github.com/Tox/toxic 2013-12-11 00:21:42 -05:00
Jfreegman
9a5a598c5a add line history with up/down keys 2013-12-11 00:10:09 -05:00
irungentoo
d9d4329ccf Merge pull request #61 from naxuroqa/api-update
api update
2013-12-10 17:55:43 -08:00
naxuroqa
ab2be21942 api update to irungentoo/ProjectTox-Core@2d841fb791 2013-12-11 01:51:40 +01:00
Jfreegman
ccc0640dab put string helpers in own file 2013-12-10 03:03:45 -05:00
Jfreegman
44d9f7fe61 busy status mutes beeping 2013-12-09 19:25:09 -05:00
Jfreegman
a833be730f Merge branch 'master' of https://github.com/Tox/toxic 2013-12-09 18:00:35 -05:00
Jfreegman
4065715b78 split lists up so only commands that work in given window autocomplete 2013-12-09 17:56:20 -05:00
JFreegman
f76b672d47 Update README.md 2013-12-09 03:28:20 -05:00
Jfreegman
674aa682e7 implement tab completion for commands 2013-12-08 18:14:57 -05:00
Jfreegman
9c2551b3b9 small fix 2013-12-08 16:10:52 -05:00
Jfreegman
f67725f636 improve tab completion 2013-12-08 15:49:47 -05:00
Jfreegman
5fc14a48db a few aesthetic changes 2013-12-08 05:45:23 -05:00
Jfreegman
df57adcc6d fix memory leaks and safer way to convert strings from wc to mb 2013-12-08 04:16:49 -05:00
Jfreegman
e834821348 replace name_compare with lib function 2013-12-08 01:18:10 -05:00
Jfreegman
b8b032e441 a few fixes, and make tab completion case insensitive 2013-12-08 01:07:22 -05:00
Jfreegman
4c27df32b0 add tab auto-complete function for groupchat names 2013-12-07 22:10:32 -05:00
Jfreegman
3804233c21 didnt mean to change that 2013-12-06 22:07:37 -05:00
Jfreegman
eb9d4361f0 Merge branch 'master' of https://github.com/Tox/toxic 2013-12-06 22:04:28 -05:00
Jfreegman
e224f92210 change keys toctrl-o and p due to weird bug with ctrl-[ 2013-12-06 22:03:35 -05:00
irungentoo
6089f02d57 If IPv6 fails, print something and try IPv4. 2013-12-06 21:43:57 -05:00
Jfreegman
d232538317 make ctrl-] [ keys switch pages 2013-12-06 20:56:30 -05:00
Jfreegman
f942982f4e alert user when name is mentioned in groupchat 2013-12-06 19:41:53 -05:00
Jfreegman
ce45580c83 partially fix bug where input line eats prompt messages 2013-12-06 05:07:35 -05:00
Jfreegman
18a7bbea3d fix 2013-12-05 23:05:16 -05:00
Jfreegman
7a14845790 add line kill and discard ability 2013-12-05 22:55:14 -05:00
Jfreegman
2ad238d69f cchange prompt to $ char and make timestamps blue 2013-12-05 03:29:39 -05:00
Jfreegman
70e8bdb409 fix line scrolling bug 2013-12-05 01:22:02 -05:00
Jfreegman
3740cb6763 fix prompt bug, improve comments, and give prompt its own window struct 2013-12-04 22:33:04 -05:00
Jfreegman
a57f94306a put back prompt char 2013-12-04 18:09:51 -05:00
Jfreegman
e3400e095b a few fixes and update version 2013-12-04 16:21:32 -05:00
Jfreegman
1517cbb6cb allow line editing in prompt window 2013-12-04 16:14:33 -05:00
Jfreegman
424ab7cd10 fix prompt user input mechanics 2013-12-04 03:57:03 -05:00
Jfreegman
a2af0bc047 don't sort after every friend add on statup 2013-12-04 01:08:26 -05:00
Jfreegman
2fde13530b fix bug 2013-12-04 00:44:37 -05:00
Jfreegman
db10c66922 API change 2013-12-03 18:06:28 -05:00
Jfreegman
88ebb06ba5 colour theme changes 2013-12-03 18:01:17 -05:00
Jfreegman
03ef257fdc small fix 2013-12-03 05:18:49 -05:00
Jfreegman
1a86327f9f allow groupchat sidebar to scroll 2013-12-03 03:44:02 -05:00
Jfreegman
ba750753a5 fix for possible divsion by zero 2013-12-02 18:34:14 -05:00
Jfreegman
7a89229375 allow friendlist to scroll up and down if friends overflow the window 2013-12-02 18:23:04 -05:00
JFreegman
81c48f7b2b Merge pull request #60 from aitjcize/ipv4
Add option to switch off ipv6.
2013-12-02 14:37:42 -08:00
AZ Huang
b0c60238f7 Add option to switch off ipv6. 2013-12-02 22:02:34 +08:00
Jfreegman
ca1644c23b fix 2013-12-01 17:08:57 -05:00
Jfreegman
f67cc479ec format consistency 2013-12-01 16:59:46 -05:00
Jfreegman
b1b2cc44df minor improvements 2013-12-01 16:57:05 -05:00
Jfreegman
192a06c4f0 fixed arrow printing bug 2013-12-01 13:25:03 -05:00
Jfreegman
49655e13a0 fix 2013-12-01 03:29:12 -05:00
Jfreegman
5850e1c333 line edit support for home, del and end keys 2013-12-01 02:58:21 -05:00
Jfreegman
37dd2bee2d Merge branch 'master' of https://github.com/Tox/toxic 2013-11-30 22:15:16 -05:00
Jfreegman
bb6b28b7c3 allow line editing via arrow keys in chat/groupchat windows 2013-11-30 22:12:43 -05:00
JFreegman
8f1da153a7 Merge pull request #59 from FullName/path-idx-real-fix
Fix partial fix: A slash in pos 0 still led to read access to pathname[-1].
2013-11-30 16:26:30 -08:00
Coren[m]
4f4a379a01 Fix partial fix: A slash in pos 0 still led to read access to pathname[-1]. 2013-11-30 22:14:09 +01:00
Jfreegman
c25296e65a fixes 2013-11-30 16:09:45 -05:00
Jfreegman
f6a6aecaf5 fix window related bugs and warn user when max window limit has been reached 2013-11-30 05:35:25 -05:00
Jfreegman
8ff907d719 wrong signal 2013-11-29 19:31:47 -05:00
Jfreegman
a02bbfa643 kill file transfer if writing fails 2013-11-29 19:26:59 -05:00
Jfreegman
57c2872b75 try to limit scope of globals 2013-11-29 18:52:21 -05:00
Jfreegman
7ad520f128 reduce syntactic complexity - these don't need to be void 2013-11-29 17:48:08 -05:00
irungentoo
e4e7ed7e4e Merge pull request #58 from aitjcize/api-name
Fix corresponding API name changes in toxcore.
2013-11-29 08:26:53 -08:00
AZ Huang
7ee84ce5e1 Fix typo. 2013-11-29 23:56:42 +08:00
AZ Huang
8c0ad1ef80 Fix corresponding API name changes in toxcore. 2013-11-29 23:14:59 +08:00
irungentoo
4babd53be6 Merge pull request #57 from aitjcize/ret-code-inconsistency
Fix API ret code changes of ToxCore
2013-11-29 07:05:48 -08:00
AZ Huang
e29ce6ab6f Fix API ret code changes of ToxCore 2013-11-29 18:30:40 +08:00
Jfreegman
b909ab37b7 add peer count to sidepanel 2013-11-29 01:30:10 -05:00
Jfreegman
04b394d6dd close file transfers on exit & fixes 2013-11-28 22:28:40 -05:00
Jfreegman
8cf3043dd3 Merge branch 'master' of https://github.com/Tox/toxic 2013-11-28 20:24:58 -05:00
Jfreegman
8584667ec9 don't need that 2013-11-28 20:24:44 -05:00
Jfreegman
d29e5dbe48 fixes 2013-11-28 20:23:37 -05:00
irungentoo
e21e5c18ff Fix possible crash. 2013-11-28 19:52:30 -05:00
Jfreegman
a98ec22fd6 improve window alert functionality 2013-11-28 19:45:28 -05:00
Jfreegman
2057e7bc4f couple fixes 2013-11-28 18:56:56 -05:00
158 changed files with 37713 additions and 3845 deletions

12
.cirrus.yml Normal file
View File

@ -0,0 +1,12 @@
---
bazel-opt_task:
container:
image: toxchat/toktok-stack:latest-release
cpu: 2
memory: 2G
configure_script:
- /src/workspace/tools/inject-repo toxic
test_all_script:
- cd /src/workspace && bazel test -k
--remote_http_cache=http://$CIRRUS_HTTP_CACHE_HOST
//toxic/...

1
.github/CODEOWNERS vendored Normal file
View File

@ -0,0 +1 @@
/.github/ @TokTok/admins

2
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,2 @@
---
github: [JFreegman]

19
.github/settings.yml vendored Normal file
View File

@ -0,0 +1,19 @@
---
_extends: .github
repository:
name: toxic
description: An ncurses-based Tox client
topics: tox, console, chat
branches:
- name: "master"
protection:
required_status_checks:
contexts:
- build
- build-static
- bazel-opt
- Codacy Static Code Analysis
- code-review/reviewable
- infer

125
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,125 @@
name: ci
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install dependencies
run:
sudo apt-get update &&
sudo apt-get install -y --no-install-recommends
libalut-dev
libconfig-dev
libcurl4-gnutls-dev
libmsgpack-dev
libnotify-dev
libopenal-dev
libopus-dev
libqrencode-dev
libsodium-dev
libvpx-dev
libx11-dev
python3-dev
pkg-config &&
git clone --depth=1 --recursive https://github.com/TokTok/c-toxcore &&
cd c-toxcore &&
cmake . -B_build -DBOOTSTRAP_DAEMON=OFF &&
cd _build &&
make -j4 &&
sudo make install
- name: Build toxic
run: make -j4
build-static:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Build minimal static toxic binary
run: docker run --rm
-v /tmp/artifact:/artifact
-v $PWD:/toxic
amd64/alpine:latest
sh -c 'yes | /toxic/script/build-minimal-static-toxic.sh'
- name: Display binary checksum
run: |
tar Jxf /tmp/artifact/toxic-minimal-static-musl_linux_x86-64.tar.xz
sha256sum toxic-minimal-static-musl_linux_x86-64/toxic
infer:
runs-on: ubuntu-latest
container: toxchat/infer
steps:
- name: Install git
run:
apt-get update &&
DEBIAN_FRONTEND=noninteractive
apt-get install -y --no-install-recommends
git
- name: Install dependencies
run:
apt-get update &&
apt-get install -y --no-install-recommends
cmake
g++
libalut-dev
libconfig-dev
libcurl4-gnutls-dev
libmsgpack-dev
libncurses-dev
libnotify-dev
libopenal-dev
libopus-dev
libqrencode-dev
libsodium-dev
libvpx-dev
libx11-dev
make
python3-dev
pkg-config &&
git clone --depth=1 --recursive https://github.com/TokTok/c-toxcore &&
cd c-toxcore &&
cmake . -B_build -DBOOTSTRAP_DAEMON=OFF &&
cd _build &&
make -j4 &&
make install
- uses: actions/checkout@v2
- name: Run infer
run:
infer --no-progress-bar -- cc src/*.c
-fsyntax-only
$(python3-config --includes --ldflags)
$(pkg-config --cflags --libs
freealut
libconfig
libcurl
libnotify
libpng
libqrencode
msgpack
ncurses
openal
python3
toxcore
vpx
x11)
-DAUDIO
-DBOX_NOTIFY
-DGAMES
-DPACKAGE_DATADIR='""'
-DPYTHON
-DQRCODE
-DSOUND_NOTIFY
-DVIDEO
- name: Print log
run:
cat /__w/toxic/toxic/infer-out/report.txt

17
.gitignore vendored
View File

@ -9,19 +9,14 @@
*.app
*.swp
*.la
m4/*
!m4/pkg.m4
configure
configure_aux
Makefile.in
aclocal.m4
config.h*
config.log
config.status
stamp-h1
autom4te.cache
.deps
.libs
*.orig
build/toxic
Makefile
build/*.o
build/*.d
apidoc/python/build
*.vim
*.tox
*.nvim*

4
.restyled.yaml Normal file
View File

@ -0,0 +1,4 @@
---
restylers:
- astyle:
arguments: ["--options=astylerc"]

View File

@ -1,35 +0,0 @@
language: c
compiler:
- gcc
- clang
before_script:
# installing libsodium, needed for Core
- git clone git://github.com/jedisct1/libsodium.git
- cd libsodium
- git checkout tags/0.4.2
- ./autogen.sh
- ./configure && make -j3
- sudo make install
- cd ..
# creating librarys' links and updating cache
- sudo ldconfig
- git clone https://github.com/irungentoo/ProjectTox-Core.git toxcore
- cd toxcore
- autoreconf -i
- ./configure --disable-tests --disable-ntox --disable-dht-bootstrap-daemon
- make -j2
- sudo make install
- cd ..
script:
- autoreconf -i
- ./configure
- make -j2
notifications:
email: false
irc:
channels:
- "chat.freenode.net#tox-dev"
on_success: always
on_failure: always

View File

@ -1 +0,0 @@
See github contributors

52
BUILD.bazel Normal file
View File

@ -0,0 +1,52 @@
load("@rules_cc//cc:defs.bzl", "cc_binary")
load("//tools/project:build_defs.bzl", "project")
package(features = ["layering_check"])
project()
cc_binary(
name = "toxic",
srcs = glob(
[
"src/*.c",
"src/*.h",
],
exclude = ["src/video*"],
) + select({
"//tools/config:linux": glob(["src/video*"]),
"//tools/config:osx": [],
}),
copts = [
"-std=gnu99",
"-DAUDIO",
"-DGAMES",
"-DHAVE_WIDECHAR",
"-DPACKAGE_DATADIR='\"data\"'",
"-DPYTHON",
"-DQRCODE",
] + select({
"//tools/config:linux": ["-DVIDEO"],
"//tools/config:osx": [],
}),
deps = [
"//c-toxcore",
"@curl",
"@libconfig",
"@libqrencode",
"@libvpx",
"@ncurses",
"@openal",
"@python3//:python",
] + select({
"//tools/config:linux": ["@x11"],
"//tools/config:osx": [],
}),
)
sh_test(
name = "toxic_test",
size = "small",
srcs = [":toxic"],
args = ["--help"],
)

365
INSTALL
View File

@ -1,365 +0,0 @@
Installation Instructions
*************************
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
2006, 2007, 2008, 2009 Free Software Foundation, Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without warranty of any kind.
Basic Installation
==================
Briefly, the shell commands `./configure; make; make install' should
configure, build, and install this package. The following
more-detailed instructions are generic; see the `README' file for
instructions specific to this package. Some packages provide this
`INSTALL' file but do not implement all of the features documented
below. The lack of an optional feature in a given package is not
necessarily a bug. More recommendations for GNU packages can be found
in *note Makefile Conventions: (standards)Makefile Conventions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').
It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring. Caching is
disabled by default to prevent problems with accidental use of stale
cache files.
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.
The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'. You need `configure.ac' if
you want to change it or regenerate `configure' using a newer version
of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system.
Running `configure' might take a while. While running, it prints
some messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package, generally using the just-built uninstalled binaries.
4. Type `make install' to install the programs and any data files and
documentation. When installing into a prefix owned by root, it is
recommended that the package be configured and built as a regular
user, and only the `make install' phase executed with root
privileges.
5. Optionally, type `make installcheck' to repeat any self-tests, but
this time using the binaries in their final installed location.
This target does not install anything. Running this target as a
regular user, particularly if the prior `make install' required
root privileges, verifies that the installation completed
correctly.
6. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
7. Often, you can also type `make uninstall' to remove the installed
files again. In practice, not all packages have tested that
uninstallation works correctly, even though it is required by the
GNU Coding Standards.
8. Some packages, particularly those that use Automake, provide `make
distcheck', which can by used by developers to test that all other
targets like `make install' and `make uninstall' work correctly.
This target is generally not run by end users.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. Run `./configure --help'
for details on some of the pertinent environment variables.
You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment. Here
is an example:
./configure CC=c99 CFLAGS=-g LIBS=-lposix
*Note Defining Variables::, for more details.
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you can use GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'. This
is known as a "VPATH" build.
With a non-GNU `make', it is safer to compile the package for one
architecture at a time in the source code directory. After you have
installed the package for one architecture, use `make distclean' before
reconfiguring for another architecture.
On MacOS X 10.5 and later systems, you can create libraries and
executables that work on multiple system types--known as "fat" or
"universal" binaries--by specifying multiple `-arch' options to the
compiler but only a single `-arch' option to the preprocessor. Like
this:
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
CPP="gcc -E" CXXCPP="g++ -E"
This is not guaranteed to produce working output in all cases, you
may have to build one architecture at a time and combine the results
using the `lipo' tool if you have problems.
Installation Names
==================
By default, `make install' installs the package's commands under
`/usr/local/bin', include files under `/usr/local/include', etc. You
can specify an installation prefix other than `/usr/local' by giving
`configure' the option `--prefix=PREFIX', where PREFIX must be an
absolute file name.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
PREFIX as the prefix for installing programs and libraries.
Documentation and other data files still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=DIR' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them. In general, the
default for these options is expressed in terms of `${prefix}', so that
specifying just `--prefix' will affect all of the other directory
specifications that were not explicitly provided.
The most portable way to affect installation locations is to pass the
correct locations to `configure'; however, many packages provide one or
both of the following shortcuts of passing variable assignments to the
`make install' command line to change installation locations without
having to reconfigure or recompile.
The first method involves providing an override variable for each
affected directory. For example, `make install
prefix=/alternate/directory' will choose an alternate location for all
directory configuration variables that were expressed in terms of
`${prefix}'. Any directories that were specified during `configure',
but not in terms of `${prefix}', must each be overridden at install
time for the entire installation to be relocated. The approach of
makefile variable overrides for each directory variable is required by
the GNU Coding Standards, and ideally causes no recompilation.
However, some platforms have known limitations with the semantics of
shared libraries that end up requiring recompilation when using this
method, particularly noticeable in packages that use GNU Libtool.
The second method involves providing the `DESTDIR' variable. For
example, `make install DESTDIR=/alternate/directory' will prepend
`/alternate/directory' before all installation names. The approach of
`DESTDIR' overrides is not required by the GNU Coding Standards, and
does not work on platforms that have drive letters. On the other hand,
it does better at avoiding recompilation issues, and works well even
when some directory options were not specified in terms of `${prefix}'
at `configure' time.
Optional Features
=================
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Some packages offer the ability to configure how verbose the
execution of `make' will be. For these packages, running `./configure
--enable-silent-rules' sets the default to minimal output, which can be
overridden with `make V=1'; while running `./configure
--disable-silent-rules' sets the default to verbose, which can be
overridden with `make V=0'.
Particular systems
==================
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
CC is not installed, it is recommended to use the following options in
order to use an ANSI C compiler:
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
a workaround. If GNU CC is not installed, it is therefore recommended
to try
./configure CC="cc"
and if that doesn't work, try
./configure CC="cc -nodtk"
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
directory contains several dysfunctional programs; working variants of
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
in your `PATH', put it _after_ `/usr/bin'.
On Haiku, software installed for all users goes in `/boot/common',
not `/usr/local'. It is recommended to use the following options:
./configure --prefix=/boot/common
Specifying the System Type
==========================
There may be some features `configure' cannot figure out
automatically, but needs to determine by the type of machine the package
will run on. Usually, assuming the package is built to be run on the
_same_ architectures, `configure' can figure that out, but if it prints
a message saying it cannot guess the machine type, give it the
`--build=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:
CPU-COMPANY-SYSTEM
where SYSTEM can have one of these forms:
OS
KERNEL-OS
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.
If you are _building_ compiler tools for cross-compiling, you should
use the option `--target=TYPE' to select the type of system they will
produce code for.
If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Defining Variables
==================
Variables not defined in a site shell script can be set in the
environment passed to `configure'. However, some packages may run
configure again during the build, and the customized values of these
variables may be lost. In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'. For example:
./configure CC=/usr/local2/bin/gcc
causes the specified `gcc' to be used as the C compiler (unless it is
overridden in the site shell script).
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
an Autoconf bug. Until the bug is fixed you can use this workaround:
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
`configure' Invocation
======================
`configure' recognizes the following options to control how it
operates.
`--help'
`-h'
Print a summary of all of the options to `configure', and exit.
`--help=short'
`--help=recursive'
Print a summary of the options unique to this package's
`configure', and exit. The `short' variant lists options used
only in the top level, while the `recursive' variant lists options
also present in any nested packages.
`--version'
`-V'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`--cache-file=FILE'
Enable the cache: use and save the results of the tests in FILE,
traditionally `config.cache'. FILE defaults to `/dev/null' to
disable caching.
`--config-cache'
`-C'
Alias for `--cache-file=config.cache'.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--prefix=DIR'
Use DIR as the installation prefix. *note Installation Names::
for more details, including other options available for fine-tuning
the installation locations.
`--no-create'
`-n'
Run the configure checks, but stop before creating any output
files.
`configure' also accepts some other, not widely useful, options. Run
`configure --help' for more details.

71
INSTALL.md Normal file
View File

@ -0,0 +1,71 @@
# Installation
* [Dependencies](#dependencies)
* [OS X Notes](#os-x-notes)
* [Compiling](#compiling)
* [Documentation](#documentation)
* [Notes](#notes)
* [Compilation variables](#compilation-variables)
* [Environment variables](#environment-variables)
## Dependencies
| Name | Needed by | Debian package |
|------------------------------------------------------|----------------------------|---------------------|
| [Tox Core](https://github.com/toktok/c-toxcore) | BASE | libtoxcore-dev |
| [NCurses](https://www.gnu.org/software/ncurses) | BASE | libncursesw5-dev |
| [LibConfig](http://www.hyperrealm.com/libconfig) | BASE | libconfig-dev |
| [GNUmake](https://www.gnu.org/software/make) | BASE | make |
| [libcurl](http://curl.haxx.se/) | BASE | libcurl4-openssl-dev|
| [libqrencode](https://fukuchi.org/works/qrencode/) | QRCODE | libqrencode-dev |
| [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 |
| [Python 3](http://www.python.org/) | PYTHON | python3-dev |
| [AsciiDoc](http://asciidoc.org/index.html) | DOCUMENTATION<sup>1</sup> | asciidoc |
<sup>1</sup>: see [Documentation](#documentation)
#### OS X Notes
Using [Homebrew](http://brew.sh):
```
brew install curl qrencode openal-soft freealut libconfig libpng
brew install --HEAD https://raw.githubusercontent.com/Tox/homebrew-tox/master/Formula/libtoxcore.rb
brew install libnotify
export PKG_CONFIG_PATH=/usr/local/opt/openal-soft/lib/pkgconfig
make
```
You can omit `libnotify` if you intend to build without desktop notifications enabled.
## Compiling
```
make
sudo make install
```
#### Documentation
Run `make doc` in the build directory after editing the asciidoc files to regenerate the manpages.<br />
**Note for developers**: asciidoc files and generated manpages will need to be committed together.<br />
**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 `USER_LDFLAGS=""` passed as arguments to make, or as environment variables
* Default compile options can be overridden by using special variables:
* `DISABLE_X11=1` → Disable X11 support (needed for focus tracking)
* `DISABLE_AV=1` → Disable audio call support
* `DISABLE_SOUND_NOTIFY=1` → Disable sound notifications support
* `DISABLE_QRCODE=1` → Disable QR exporting support
* `DISABLE_QRPNG=1` → Disable support for exporting QR as PNG
* `DISABLE_DESKTOP_NOTIFY=1` → Disable desktop notifications support
* `DISABLE_GAMES=1` → Disable support for games
* `ENABLE_PYTHON=1` → Build toxic with Python scripting support
* `ENABLE_RELEASE=1` → Build toxic without debug symbols and with full compiler optimizations
* `ENABLE_ASAN=1` → Build toxic with LLVM Address Sanitizer enabled
* `DESTDIR=""` Specifies the base install directory for binaries and data files (e.g.: DESTDIR="/tmp/build/pkg")
#### Environment variables
* You can use the `CFLAGS` and `LDFLAGS` environment variables to add specific flags to the Makefile
* The `PREFIX` environment variable specifies a base install directory for binaries and data files. This is interchangeable with the `DESTDIR` variable, and is generally used by systems that have the `PREFIX` environment variable set by default.<br />
**Note**: `sudo` does not preserve user environment variables by default on some systems. See the `sudoers` manual for more information.

View File

@ -672,3 +672,4 @@ may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

97
Makefile Normal file
View File

@ -0,0 +1,97 @@
BASE_DIR = $(shell pwd -P)
CFG_DIR = $(BASE_DIR)/cfg
-include $(CFG_DIR)/global_vars.mk
LIBS = toxcore ncursesw libconfig libcurl
CFLAGS ?= -std=c99 -pthread -Wall -Wpedantic -Wunused -fstack-protector-all -Wvla -Wno-missing-braces
CFLAGS += '-DTOXICVER="$(VERSION)"' -DHAVE_WIDECHAR -D_XOPEN_SOURCE_EXTENDED -D_FILE_OFFSET_BITS=64
CFLAGS += '-DPACKAGE_DATADIR="$(abspath $(DATADIR))"'
CFLAGS += ${USER_CFLAGS}
LDFLAGS ?=
LDFLAGS += ${USER_LDFLAGS}
OBJ = autocomplete.o avatars.o bootstrap.o chat.o chat_commands.o conference.o configdir.o curl_util.o execute.o
OBJ += file_transfers.o friendlist.o global_commands.o conference_commands.o groupchats.o groupchat_commands.o help.o
OBJ += input.o line_info.o log.o message_queue.o misc_tools.o name_lookup.o notify.o prompt.o qr_code.o settings.o
OBJ += term_mplex.o toxic.o toxic_strings.o windows.o
# Check if debug build is enabled
RELEASE := $(shell if [ -z "$(ENABLE_RELEASE)" ] || [ "$(ENABLE_RELEASE)" = "0" ] ; then echo disabled ; else echo enabled ; fi)
ifneq ($(RELEASE), enabled)
CFLAGS += -O0 -g -DDEBUG
LDFLAGS += -O0
else
CFLAGS += -O2 -flto
LDFLAGS += -O2 -flto
endif
# Check if LLVM Address Sanitizer is enabled
ASAN := $(shell if [ -z "$(ENABLE_ASAN)" ] || [ "$(ENABLE_ASAN)" = "0" ] ; then echo disabled ; else echo enabled ; fi)
ifneq ($(ASAN), disabled)
CFLAGS += -fsanitize=address -fno-omit-frame-pointer
endif
# Check on wich system we are running
UNAME_S = $(shell uname -s)
ifeq ($(UNAME_S), Linux)
LDFLAGS += -ldl -lrt
endif
ifeq ($(UNAME_S), OpenBSD)
LIBS := $(filter-out ncursesw, $(LIBS))
LDFLAGS += -lncursesw
endif
ifeq ($(UNAME_S), NetBSD)
LIBS := $(filter-out ncursesw, $(LIBS))
LDFLAGS += -lncursesw
endif
ifeq ($(UNAME_S), Darwin)
-include $(CFG_DIR)/systems/Darwin.mk
endif
# Check on which platform we are running
UNAME_M = $(shell uname -m)
ifeq ($(UNAME_M), x86_64)
-include $(CFG_DIR)/platforms/x86_64.mk
endif
ifneq ($(filter %86, $(UNAME_M)),)
-include $(CFG_DIR)/platforms/x86.mk
endif
ifneq ($(filter arm%, $(UNAME_M)),)
-include $(CFG_DIR)/platforms/arm.mk
endif
# Include all needed checks
-include $(CFG_DIR)/checks/check_features.mk
# Fix path for object files
OBJ := $(addprefix $(BUILD_DIR)/, $(OBJ))
# Targets
all: $(BUILD_DIR)/toxic
$(BUILD_DIR)/toxic: $(OBJ)
@echo " LD $(@:$(BUILD_DIR)/%=%)"
@$(CC) $(CFLAGS) -o $(BUILD_DIR)/toxic $(OBJ) $(LDFLAGS)
$(BUILD_DIR)/osx_video.o: $(SRC_DIR)/$(OSX_VIDEO)
@echo " CC $(@:$(BUILD_DIR)/)osx_video.o"
@$(CC) $(CFLAGS) -o $(BUILD_DIR)/osx_video.o -c $(SRC_DIR)/$(OSX_VIDEO)
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
@if [ ! -e $(BUILD_DIR) ]; then \
mkdir -p $(BUILD_DIR) ;\
fi
@echo " CC $(@:$(BUILD_DIR)/%=%)"
@$(CC) $(CFLAGS) -o $(BUILD_DIR)/$*.o -c $(SRC_DIR)/$*.c
@$(CC) -MM $(CFLAGS) $(SRC_DIR)/$*.c >$(BUILD_DIR)/$*.d
clean:
rm -f $(BUILD_DIR)/*.d $(BUILD_DIR)/*.o $(BUILD_DIR)/toxic
-include $(BUILD_DIR)/$(OBJ:.o=.d)
-include $(CFG_DIR)/targets/*.mk
.PHONY: clean all

View File

@ -1,3 +0,0 @@
SUBDIRS = build misc
ACLOCAL_AMFLAGS = -I m4

0
NEWS
View File

1
README
View File

@ -1 +0,0 @@

View File

@ -1,16 +1,27 @@
## Toxic - console client for [Tox](http://tox.im)
<a href="https://scan.coverity.com/projects/toxic-tox">
<img alt="Coverity Scan Build Status"
src="https://scan.coverity.com/projects/4975/badge.svg"/>
</a>
The client formerly resided in the [Tox core repository](https://github.com/irungentoo/ProjectTox-Core) and is now available as a standalone version.
Toxic is a [Tox](https://tox.chat)-based instant messaging and video chat client.
To compile, first generate the configure script by running the ```autoreconf -i``` command.
[![Toxic Screenshot](https://i.imgur.com/TwYA8L0.png "Toxic Home Screen")](https://i.imgur.com/TwYA8L0.png)
Then execute the configure script (you'll probably have to pass it the location of your dependency libraries, i.e.):
## Installation
[See the install instructions](/INSTALL.md)
## 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).
## Troubleshooting
If your default prefix is "/usr/local" and you receive the following:
```
./configure --prefix=/where/to/install --with-libtoxcore-headers=/path/to/ProjectTox-Core/core --with-libtoxcore-libs=/path/to/ProjectTox-Core/build/core --with-libsodium-headers=/path/to/libsodium/include/ --with-libsodium-libs=/path/to/sodiumtest/lib/
error while loading shared libraries: libtoxcore.so.0: cannot open shared object file: No such file or directory
```
*Note:* If your default prefix is /usr/local and you happen to get an error that says "error while loading shared libraries: libtoxcore.so.0: cannot open shared object file: No such file or directory", then you can try running ```sudo ldconfig```. If that doesn't fix it, run:
you can attempt to correct it by running `sudo ldconfig`. If that doesn't work, run:
```
echo '/usr/local/lib/' | sudo tee -a /etc/ld.so.conf.d/locallib.conf
sudo ldconfig
```

20
apidoc/python/Makefile Normal file
View File

@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SPHINXPROJ = toxic_api
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

View File

@ -0,0 +1,154 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# toxic_api documentation build configuration file, created by
# sphinx-quickstart on Tue May 16 08:58:24 2017.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = 'toxic_api'
copyright = '2017, Jakob Kreuze'
author = 'Jakob Kreuze'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.12.0'
# The full version, including alpha/beta/rc tags.
release = '0.12.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = []
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# -- Options for HTMLHelp output ------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'toxic_apidoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'toxic_api.tex', 'toxic\\_api Documentation',
'Jakob Kreuze', 'manual'),
]
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'toxic_api', 'toxic_api Documentation',
[author], 1)
]
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'toxic_api', 'toxic_api Documentation',
author, 'toxic_api', 'One line description of project.',
'Miscellaneous'),
]

View File

@ -0,0 +1,8 @@
============
API Examples
============
Fortune
=======
.. literalinclude:: fortune.py
:language: python

View File

@ -0,0 +1,37 @@
import toxic_api
import random
FORTUNES = [
"A bug in the code is worth two in the documentation.",
"A bug in the hand is better than one as yet undetected.",
"\"A debugged program is one for which you have not yet found the "
"conditions that make it fail.\" -- Jerry Ogdin"
]
def send_fortune(args):
"""Callback function that sends the contact of the current window a
given number of random fortunes.
"""
if len(args) != 1:
toxic_api.display("Only one argument allowed!")
return
try:
count = int(args[0])
except ValueError:
toxic_api.display("Argument must be a number!")
return
if count < 0 or count > 20:
toxic_api.display("Argument is too large!")
return
name = toxic_api.get_nick()
toxic_api.send("%s has decided to send you %d fortunes:" % (name, count))
for _ in range(count):
toxic_api.send(random.choice(FORTUNES))
toxic_api.register("/fortune", "Send a fortune to the contact of the current "
"window", send_fortune)

View File

@ -0,0 +1,9 @@
Toxic Scripting Interface Documentation
=======================================
.. toctree::
:maxdepth: 2
intro
reference
examples

View File

@ -0,0 +1,12 @@
=========================
Toxic Scripting Interface
=========================
A Python scripting interface to `Toxic <https://github.com/JFreegman/toxic>`_.
Getting Started
===============
Toxic is compiled with Python support by default. To access the scripting interface, simply import "toxic_api" in your script.
Scripts can be run by issuing "/run <path>" from toxic, or placing them in the "autorun_path" from your toxic configuration file.

View File

@ -0,0 +1,73 @@
=============
API Reference
=============
Messages
========
.. function:: display(msg)
Display a message to the user through the current window.
:param msg: The message to display.
:type msg: string
:rtype: none
.. function:: send(msg)
Send a message to the user specified by the currently open conversation.
:param msg: The message to display.
:type msg: string
:rtype: none
State
=====
.. function:: get_nick()
Return the user's current nickname.
:rtype: string
.. function:: get_status()
Return a string representing the user's current status. Can be either "online", "away", or "busy".
:rtype: string
.. function:: get_status_message()
Return the user's current status message.
:rtype: string
.. function:: get_all_friends()
Return a list of all the user's friends.
:rtype: list of (string, string) tuples containing the nickname followed by their public key
Commands
========
.. function:: execute(command, class)
Executes the given command. The API exports three constants for the class parameter; GLOBAL_COMMAND, CHAT_COMMAND, and GROUPCHAT_COMMAND.
:param command: The command to execute.
:type command: string
:param class: The class of the command.
:type class: int
:rtype: none
.. function:: register(command, help, callback)
Register a callback to be executed whenever command is run. The callback function will be called with one argument, a list of arguments from when the user calls the command.
:param command: The command to listen for.
:type command: string
:param help: A description of the command to be shown in the help menu.
:type help: string
:param callback: The function to be called.
:type callback: callable
:rtype: none

26
astylerc Normal file
View File

@ -0,0 +1,26 @@
# Bracket Style Options
--style=kr
# Tab Options
--indent=spaces=4
# Indentation Options
--indent-switches
# Padding Options
--pad-header
--break-blocks
--pad-oper
--unpad-paren
--align-pointer=name
--align-reference=name
# Formatting Options
--add-brackets
--convert-tabs
--max-code-length=120
# Other Options
--preserve-date
--formatted
--lineend=linux

View File

@ -1,41 +0,0 @@
#Don't change this unless needed, else you'll break stuff
bin_PROGRAMS = toxic
toxic_SOURCES = $(top_srcdir)/src/main.c \
$(top_srcdir)/src/chat.h \
$(top_srcdir)/src/chat.c \
$(top_srcdir)/src/configdir.h \
$(top_srcdir)/src/configdir.c \
$(top_srcdir)/src/prompt.h \
$(top_srcdir)/src/prompt.c \
$(top_srcdir)/src/friendlist.h \
$(top_srcdir)/src/friendlist.c \
$(top_srcdir)/src/toxic_windows.h \
$(top_srcdir)/src/windows.c \
$(top_srcdir)/src/groupchat.c \
$(top_srcdir)/src/groupchat.h \
$(top_srcdir)/src/global_commands.c \
$(top_srcdir)/src/global_commands.h \
$(top_srcdir)/src/chat_commands.c \
$(top_srcdir)/src/chat_commands.h \
$(top_srcdir)/src/execute.c \
$(top_srcdir)/src/execute.h \
$(top_srcdir)/src/misc_tools.c \
$(top_srcdir)/src/misc_tools.h
toxic_CFLAGS = -I$(top_srcdir) \
$(NCURSES_CFLAGS) \
$(LIBSODIUM_CFLAGS) \
$(LIBTOXCORE_CFLAGS)
toxic_CPPFLAGS = '-DTOXICVER="$(TOXIC_VERSION)"'
toxic_LDADD = $(LIBTOXCORE_LDFLAGS) \
$(LIBSODIUM_LDFLAGS) \
$(NCURSES_LIBS) \
$(LIBTOXCORE_LIBS) \
$(LIBSODIUM_LIBS) \
$(WINSOCK2_LIBS)

22
cfg/checks/audio.mk Normal file
View File

@ -0,0 +1,22 @@
# Variables for audio call support
AUDIO_LIBS = openal
AUDIO_CFLAGS = -DAUDIO
ifneq (, $(findstring audio_device.o, $(OBJ)))
AUDIO_OBJ = audio_call.o
else
AUDIO_OBJ = audio_call.o audio_device.o
endif
# Check if we can build audio support
CHECK_AUDIO_LIBS := $(shell $(PKG_CONFIG) --exists $(AUDIO_LIBS) || echo -n "error")
ifneq ($(CHECK_AUDIO_LIBS), error)
LIBS += $(AUDIO_LIBS)
LDFLAGS += -lm
CFLAGS += $(AUDIO_CFLAGS)
OBJ += $(AUDIO_OBJ)
else ifneq ($(MAKECMDGOALS), clean)
MISSING_AUDIO_LIBS := $(shell for lib in $(AUDIO_LIBS) ; do if ! $(PKG_CONFIG) --exists $$lib ; then echo $$lib ; fi ; done)
$(warning WARNING -- Toxic will be compiled without audio support)
$(warning WARNING -- You need these libraries for audio support)
$(warning WARNING -- $(MISSING_AUDIO_LIBS))
endif

View File

@ -0,0 +1,72 @@
CHECKS_DIR = $(CFG_DIR)/checks
# Check if we want build X11 support
X11 := $(shell if [ -z "$(DISABLE_X11)" ] || [ "$(DISABLE_X11)" = "0" ] ; then echo enabled ; else echo disabled ; fi)
ifneq ($(X11), disabled)
-include $(CHECKS_DIR)/x11.mk
endif
# Check if we want build audio support
AUDIO := $(shell if [ -z "$(DISABLE_AV)" ] || [ "$(DISABLE_AV)" = "0" ] ; then echo enabled ; else echo disabled ; fi)
ifneq ($(AUDIO), disabled)
-include $(CHECKS_DIR)/audio.mk
endif
# Check if we want build video support
VIDEO := $(shell if [ -z "$(DISABLE_VI)" ] || [ "$(DISABLE_VI)" = "0" ] ; then echo enabled ; else echo disabled ; fi)
ifneq ($(X11), disabled)
ifneq ($(AUDIO), disabled)
ifneq ($(VIDEO), disabled)
-include $(CHECKS_DIR)/video.mk
endif
endif
endif
#check if we want to build with game support
GAMES := $(shell if [ -z "$(DISABLE_GAMES)" ] || [ "$(DISABLE_GAMES)" = "0" ] ; then echo enabled ; else echo disabled ; fi)
ifneq ($(GAMES), disabled)
-include $(CHECKS_DIR)/games.mk
endif
# Check if we want build sound notifications support
SND_NOTIFY := $(shell if [ -z "$(DISABLE_SOUND_NOTIFY)" ] || [ "$(DISABLE_SOUND_NOTIFY)" = "0" ] ; then echo enabled ; else echo disabled ; fi)
ifneq ($(SND_NOTIFY), disabled)
-include $(CHECKS_DIR)/sound_notifications.mk
endif
# Check if we want build desktop notifications support
DESK_NOTIFY := $(shell if [ -z "$(DISABLE_DESKTOP_NOTIFY)" ] || [ "$(DISABLE_DESKTOP_NOTIFY)" = "0" ] ; then echo enabled ; else echo disabled ; fi)
ifneq ($(DESK_NOTIFY), disabled)
-include $(CHECKS_DIR)/desktop_notifications.mk
endif
# Check if we want build QR export support
QR_CODE := $(shell if [ -z "$(DISABLE_QRCODE)" ] || [ "$(DISABLE_QRCODE)" = "0" ] ; then echo enabled ; else echo disabled ; fi)
ifneq ($(QR_CODE), disabled)
-include $(CHECKS_DIR)/qr.mk
endif
# Check if we want build QR exported as PNG support
QR_PNG := $(shell if [ -z "$(DISABLE_QRPNG)" ] || [ "$(DISABLE_QRPNG)" = "0" ] ; then echo enabled ; else echo disabled ; fi)
ifneq ($(QR_PNG), disabled)
-include $(CHECKS_DIR)/qr_png.mk
endif
# Check if we want build Python scripting support
PYTHON := $(shell if [ -z "$(ENABLE_PYTHON)" ] || [ "$(ENABLE_PYTHON)" = "0" ] ; then echo disabled ; else echo enabled ; fi)
ifneq ($(PYTHON), disabled)
-include $(CHECKS_DIR)/python.mk
endif
# Check if we can build Toxic
CHECK_LIBS := $(shell $(PKG_CONFIG) --exists $(LIBS) || echo -n "error")
ifneq ($(CHECK_LIBS), error)
CFLAGS += $(shell $(PKG_CONFIG) --cflags $(LIBS))
LDFLAGS += $(shell $(PKG_CONFIG) --libs $(LIBS))
else ifneq ($(MAKECMDGOALS), clean)
MISSING_LIBS := $(shell for lib in $(LIBS) ; do if ! $(PKG_CONFIG) --exists $$lib ; then echo $$lib ; fi ; done)
$(warning ERROR -- Cannot compile Toxic)
$(warning ERROR -- You need these libraries)
$(warning ERROR -- $(MISSING_LIBS))
$(error ERROR)
endif

View File

@ -0,0 +1,15 @@
# Variables for desktop notifications support
DESK_NOTIFY_LIBS = libnotify
DESK_NOTIFY_CFLAGS = -DBOX_NOTIFY
# Check if we can build desktop notifications support
CHECK_DESK_NOTIFY_LIBS := $(shell $(PKG_CONFIG) --exists $(DESK_NOTIFY_LIBS) || echo -n "error")
ifneq ($(CHECK_DESK_NOTIFY_LIBS), error)
LIBS += $(DESK_NOTIFY_LIBS)
CFLAGS += $(DESK_NOTIFY_CFLAGS)
else ifneq ($(MAKECMDGOALS), clean)
MISSING_DESK_NOTIFY_LIBS := $(shell for lib in $(DESK_NOTIFY_LIBS) ; do if ! $(PKG_CONFIG) --exists $$lib ; then echo $$lib ; fi ; done)
$(warning WARNING -- Toxic will be compiled without desktop notifications support)
$(warning WARNING -- You need these libraries for desktop notifications support)
$(warning WARNING -- $(MISSING_DESK_NOTIFY_LIBS))
endif

5
cfg/checks/games.mk Normal file
View File

@ -0,0 +1,5 @@
# Variables for game support
GAMES_CFLAGS = -DGAMES
GAMES_OBJ = game_base.o game_centipede.o game_chess.o game_life.o game_util.o game_snake.o
CFLAGS += $(GAMES_CFLAGS)
OBJ += $(GAMES_OBJ)

15
cfg/checks/python.mk Normal file
View File

@ -0,0 +1,15 @@
# Variables for Python scripting support
PYTHON3_LIBS = python3
PYTHON_CFLAGS = -DPYTHON
PYTHON_OBJ = api.o python_api.o
# Check if we can build Python scripting support
CHECK_PYTHON3_LIBS = $(shell $(PKG_CONFIG) --exists $(PYTHON3_LIBS) || echo -n "error")
ifneq ($(CHECK_PYTHON3_LIBS), error)
LDFLAGS += $(shell python3-config --ldflags)
CFLAGS += $(PYTHON_CFLAGS) $(shell python3-config --includes)
OBJ += $(PYTHON_OBJ)
else ifneq ($(MAKECMDGOALS), clean)
$(warning WARNING -- Toxic will be compiled without Python scripting support)
$(warning WARNING -- You need python3 installed for Python scripting support)
endif

15
cfg/checks/qr.mk Normal file
View File

@ -0,0 +1,15 @@
# Variables for QR export support
QR_LIBS = libqrencode
QR_CFLAGS = -DQRCODE
# Check if we can build QR export support
CHECK_QR_LIBS = $(shell pkg-config --exists $(QR_LIBS) || echo -n "error")
ifneq ($(CHECK_QR_LIBS), error)
LIBS += $(QR_LIBS)
CFLAGS += $(QR_CFLAGS)
else ifneq ($(MAKECMDGOALS), clean)
MISSING_QR_LIBS = $(shell for lib in $(QR_LIBS) ; do if ! $(PKG_CONFIG) --exists $$lib ; then echo $$lib ; fi ; done)
$(warning WARNING -- Toxic will be compiled without QR export support)
$(warning WARNING -- You need these libraries for QR export support)
$(warning WARNING -- $(MISSING_QR_LIBS))
endif

15
cfg/checks/qr_png.mk Normal file
View File

@ -0,0 +1,15 @@
# Variables for QR exported as PNG support
PNG_LIBS = libpng
PNG_CFLAGS = -DQRPNG
# Check if we can build QR exported as PNG support
CHECK_PNG_LIBS = $(shell pkg-config --exists $(PNG_LIBS) || echo -n "error")
ifneq ($(CHECK_PNG_LIBS), error)
LIBS += $(PNG_LIBS)
CFLAGS += $(PNG_CFLAGS)
else ifneq ($(MAKECMDGOALS), clean)
MISSING_PNG_LIBS = $(shell for lib in $(PNG_LIBS) ; do if ! $(PKG_CONFIG) --exists $$lib ; then echo $$lib ; fi ; done)
$(warning WARNING -- Toxic will be compiled without QR exported as PNG support)
$(warning WARNING -- You need these libraries for QR exported as PNG support)
$(warning WARNING -- $(MISSING_PNG_LIBS))
endif

View File

@ -0,0 +1,21 @@
# Variables for sound notifications support
SND_NOTIFY_LIBS = openal freealut
SND_NOTIFY_CFLAGS = -DSOUND_NOTIFY
ifneq (, $(findstring audio_device.o, $(OBJ)))
SND_NOTIFY_OBJ =
else
SND_NOTIFY_OBJ = audio_device.o
endif
# Check if we can build sound notifications support
CHECK_SND_NOTIFY_LIBS = $(shell $(PKG_CONFIG) --exists $(SND_NOTIFY_LIBS) || echo -n "error")
ifneq ($(CHECK_SND_NOTIFY_LIBS), error)
LIBS += $(SND_NOTIFY_LIBS)
CFLAGS += $(SND_NOTIFY_CFLAGS)
OBJ += $(SND_NOTIFY_OBJ)
else ifneq ($(MAKECMDGOALS), clean)
MISSING_SND_NOTIFY_LIBS = $(shell for lib in $(SND_NOTIFY_LIBS) ; do if ! $(PKG_CONFIG) --exists $$lib ; then echo $$lib ; fi ; done)
$(warning WARNING -- Toxic will be compiled without sound notifications support)
$(warning WARNING -- You need these libraries for sound notifications support)
$(warning WARNING -- $(MISSING_SND_NOTIFY_LIBS))
endif

21
cfg/checks/video.mk Normal file
View File

@ -0,0 +1,21 @@
# Variables for video call support
VIDEO_LIBS = openal vpx x11
VIDEO_CFLAGS = -DVIDEO
ifneq (, $(findstring video_device.o, $(OBJ)))
VIDEO_OBJ = video_call.o
else
VIDEO_OBJ = video_call.o video_device.o
endif
# Check if we can build video support
CHECK_VIDEO_LIBS = $(shell $(PKG_CONFIG) --exists $(VIDEO_LIBS) || echo -n "error")
ifneq ($(CHECK_VIDEO_LIBS), error)
LIBS += $(VIDEO_LIBS)
CFLAGS += $(VIDEO_CFLAGS)
OBJ += $(VIDEO_OBJ)
else ifneq ($(MAKECMDGOALS), clean)
MISSING_VIDEO_LIBS = $(shell for lib in $(VIDEO_LIBS) ; do if ! $(PKG_CONFIG) --exists $$lib ; then echo $$lib ; fi ; done)
$(warning WARNING -- Toxic will be compiled without video support)
$(warning WARNING -- You will need these libraries for video support)
$(warning WARNING -- $(MISSING_VIDEO_LIBS))
endif

17
cfg/checks/x11.mk Normal file
View File

@ -0,0 +1,17 @@
# Variables for X11 support
X11_LIBS = x11
X11_CFLAGS = -DX11
X11_OBJ = x11focus.o
# Check if we can build X11 support
CHECK_X11_LIBS = $(shell $(PKG_CONFIG) --exists $(X11_LIBS) || echo -n "error")
ifneq ($(CHECK_X11_LIBS), error)
LIBS += $(X11_LIBS)
CFLAGS += $(X11_CFLAGS)
OBJ += $(X11_OBJ)
else ifneq ($(MAKECMDGOALS), clean)
MISSING_X11_LIBS = $(shell for lib in $(X11_LIBS) ; do if ! $(PKG_CONFIG) --exists $$lib ; then echo $$lib ; fi ; done)
$(warning WARNING -- Toxic will be compiled without x11 support (needed for focus tracking and drag&drop support))
$(warning WARNING -- You need these libraries for x11 support)
$(warning WARNING -- $(MISSING_X11_LIBS))
endif

33
cfg/global_vars.mk Normal file
View File

@ -0,0 +1,33 @@
# Version
TOXIC_VERSION = 0.12.0
REV = $(shell git rev-list HEAD --count 2>/dev/null || echo -n "error")
ifneq (, $(findstring error, $(REV)))
VERSION = $(TOXIC_VERSION)
else
VERSION = $(TOXIC_VERSION)_r$(REV)
endif
# Project directories
BUILD_DIR = $(BASE_DIR)/build
DOC_DIR = $(BASE_DIR)/doc
SRC_DIR = $(BASE_DIR)/src
SND_DIR = $(BASE_DIR)/sounds
MISC_DIR = $(BASE_DIR)/misc
# Project files
MANFILES = toxic.1 toxic.conf.5
DATAFILES = nameservers toxic.conf.example
DESKFILE = toxic.desktop
SNDFILES = ToxicContactOnline.wav ToxicContactOffline.wav ToxicError.wav
SNDFILES += ToxicRecvMessage.wav ToxicOutgoingCall.wav ToxicIncomingCall.wav
SNDFILES += ToxicTransferComplete.wav ToxicTransferStart.wav
# Install directories
PREFIX ?= /usr/local
BINDIR = $(PREFIX)/bin
DATADIR = $(PREFIX)/share/toxic
MANDIR ?= $(PREFIX)/share/man
APPDIR = $(PREFIX)/share/applications
# Platform tools
PKG_CONFIG = pkg-config

4
cfg/platforms/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore

18
cfg/systems/Darwin.mk Normal file
View File

@ -0,0 +1,18 @@
# 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 -ltoxcore -lcurl -lconfig -lqrencode -lpng -lopenal -g
CFLAGS += -I/usr/local/opt/freealut/include/AL -I/usr/local/opt/glib/include/glib-2.0 -g
OSX_LIBRARIES = -lobjc -lresolv
OSX_FRAMEWORKS = -framework Foundation -framework CoreFoundation -framework AVFoundation \
-framework QuartzCore -framework CoreMedia
OSX_VIDEO = osx_video.m
LDFLAGS += $(OSX_LIBRARIES) $(OSX_FRAMEWORKS)
OBJ += osx_video.o

10
cfg/targets/doc.mk Normal file
View File

@ -0,0 +1,10 @@
# Doc target
doc: $(MANFILES:%=$(DOC_DIR)/%)
$(DOC_DIR)/%: $(DOC_DIR)/%.asc
@echo " MAN $(@F)"
@a2x -f manpage -a revdate=$(shell git log -1 --date=short --format="%ad" $<) \
-a manmanual="Toxic Manual" -a mansource=toxic \
-a manversion=__VERSION__ -a datadir=__DATADIR__ $<
.PHONY: doc

38
cfg/targets/help.mk Normal file
View File

@ -0,0 +1,38 @@
# Help target
help:
@echo "-- Targets --"
@echo " all: Build toxic and documentation [DEFAULT]"
@echo " toxic: Build toxic"
@echo " doc: Build documentation"
@echo " install: Build toxic and install it in PREFIX (default PREFIX is \"$(abspath $(PREFIX))\")"
@echo " uninstall: Remove toxic from PREFIX (default PREFIX is \"$(abspath $(PREFIX))\")"
@echo " clean: Remove built files"
@echo " help: This help"
@echo
@echo "-- Variables --"
@echo " DISABLE_X11: Set to \"1\" to force building without X11 support"
@echo " DISABLE_AV: Set to \"1\" to force building without audio call support"
@echo " DISABLE_SOUND_NOTIFY: Set to \"1\" to force building without sound notification support"
@echo " DISABLE_DESKTOP_NOTIFY: Set to \"1\" to force building without desktop notifications support"
@echo " DISABLE_QRCODE: Set to \"1\" to force building without QR export support"
@echo " DISABLE_QRPNG: Set to \"1\" to force building without QR exported as PNG support"
@echo " DISABLE_GAMES: Set to \"1\" to force building without game support"
@echo " ENABLE_PYTHON: Set to \"1\" to enable building with Python scripting support"
@echo " ENABLE_RELEASE: Set to \"1\" to build without debug symbols and with full compiler optimizations"
@echo " ENABLE_ASAN: Set to \"1\" to build with LLVM address sanitizer enabled.
@echo " USER_CFLAGS: Add custom flags to default CFLAGS"
@echo " USER_LDFLAGS: Add custom flags to default LDFLAGS"
@echo " PREFIX: Specify a prefix directory for binaries, data files,... (default is \"$(abspath $(PREFIX))\")"
@echo " DESTDIR: Specify a directory where to store installed files (mainly for packaging purpose)"
@echo " MANDIR: Specify a directory where to store man pages (default is \"$(abspath $(PREFIX)/share/man)\")"
@echo
@echo "-- Environment Variables --"
@echo " CFLAGS: Add custom flags to default CFLAGS"
@echo " LDFLAGS: Add custom flags to default LDFLAGS"
@echo " USER_CFLAGS: Add custom flags to default CFLAGS"
@echo " USER_LDFLAGS: Add custom flags to default LDFLAGS"
@echo " PREFIX: Specify a prefix directory for binaries, data files,... (default is \"$(abspath $(PREFIX))\")"
@echo " DESTDIR: Specify a directory where to store installed files (mainly for packaging purpose)"
@echo " MANDIR: Specify a directory where to store man pages (default is \"$(abspath $(PREFIX)/share/man)\")"
.PHONY: help

41
cfg/targets/install.mk Normal file
View File

@ -0,0 +1,41 @@
# Install target
install: $(BUILD_DIR)/toxic
@echo "Installing toxic executable"
@mkdir -p $(abspath $(DESTDIR)/$(BINDIR))
@install -m 0755 $(BUILD_DIR)/toxic $(abspath $(DESTDIR)/$(BINDIR)/toxic)
@echo "Installing desktop file"
@mkdir -p $(abspath $(DESTDIR)/$(APPDIR))
@install -m 0644 $(MISC_DIR)/$(DESKFILE) $(abspath $(DESTDIR)/$(APPDIR)/$(DESKFILE))
@echo "Installing data files"
@mkdir -p $(abspath $(DESTDIR)/$(DATADIR))
@for f in $(DATAFILES) ; do \
install -m 0644 $(MISC_DIR)/$$f $(abspath $(DESTDIR)/$(DATADIR)/$$f) ;\
file=$(abspath $(DESTDIR)/$(DATADIR)/$$f) ;\
sed -e 's:__DATADIR__:'$(abspath $(DATADIR))':g' $$file > temp_file && \
mv temp_file $$file ;\
done
@mkdir -p $(abspath $(DESTDIR)/$(DATADIR))/sounds
@for f in $(SNDFILES) ; do \
install -m 0644 $(SND_DIR)/$$f $(abspath $(DESTDIR)/$(DATADIR)/sounds/$$f) ;\
done
@echo "Installing man pages"
@mkdir -p $(abspath $(DESTDIR)/$(MANDIR))
@for f in $(MANFILES) ; do \
if [ ! -e "$(DOC_DIR)/$$f" ]; then \
continue ;\
fi ;\
section=$(abspath $(DESTDIR)/$(MANDIR))/man`echo $${f##*.}` ;\
file=$$section/$$f ;\
mkdir -p $$section ;\
install -m 0644 $(DOC_DIR)/$$f $$file ;\
sed -e 's:__VERSION__:'$(VERSION)':g' $$file > temp_file && \
mv temp_file $$file ;\
sed -e 's:__DATADIR__:'$(abspath $(DATADIR))':g' $$file > temp_file && \
mv temp_file $$file ;\
gzip -f -n -9 $$file ;\
done
.PHONY: install

24
cfg/targets/uninstall.mk Normal file
View File

@ -0,0 +1,24 @@
# Uninstall target
uninstall:
@echo "Removing toxic executable"
@rm -f $(abspath $(DESTDIR)/$(BINDIR)/toxic)
@echo "Removing desktop file"
@rm -f $(abspath $(DESTDIR)/$(APPDIR)/$(DESKFILE))
@echo "Removing data files"
@for f in $(DATAFILES) ; do \
rm -f $(abspath $(DESTDIR)/$(DATADIR)/$$f) ;\
done
@for f in $(SNDFILES) ; do \
rm -f $(abspath $(DESTDIR)/$(DATADIR)/sounds/$$f) ;\
done
@echo "Removing man pages"
@for f in $(MANFILES) ; do \
section=$(abspath $(DESTDIR)/$(MANDIR))/man`echo $${f##*.}` ;\
file=$$section/$$f ;\
rm -f $$file $$file.gz ;\
done
.PHONY: uninstall

View File

@ -1,406 +0,0 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.65])
AC_INIT([toxic], [0.2.3], [http://tox.im/])
AC_CONFIG_AUX_DIR(configure_aux)
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([1.10 -Wall])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
AC_CONFIG_MACRO_DIR([m4])
if test "x${prefix}" = "xNONE"; then
prefix="${ac_default_prefix}"
fi
DEPSEARCH=
LIBTOXCORE_SEARCH_HEADERS=
LIBTOXCORE_SEARCH_LIBS=
LIBSODIUM_SEARCH_HEADERS=
LIBSODIUM_SEARCH_LIBS=
LIBTOXCORE_FOUND="no"
NCURSES_FOUND="no"
NCURSES_WIDECHAR_SUPPORT="no"
AC_ARG_WITH(dependency-search,
AC_HELP_STRING([--with-dependency-search=DIR],
[search for dependencies in DIR, i.e. look for libraries in
DIR/lib and for headers in DIR/include]),
[
DEPSEARCH="$withval"
]
)
if test -n "$DEPSEARCH"; then
CFLAGS="$CFLAGS -I$DEPSEARCH/include"
CPPFLAGS="$CPPFLAGS -I$DEPSEARCH/include"
LDFLAGS="$LDFLAGS -L$DEPSEARCH/lib"
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$DEPSEARCH/lib/pkgconfig
fi
AC_ARG_WITH(libtoxcore-headers,
AC_HELP_STRING([--with-libtoxcore-headers=DIR],
[search for libtoxcore header files in DIR/tox]),
[
LIBTOXCORE_SEARCH_HEADERS="$withval"
AC_MSG_NOTICE([Will search for libtoxcore header files in $withval])
]
)
AC_ARG_WITH(libtoxcore-libs,
AC_HELP_STRING([--with-libtoxcore-libs=DIR],
[search for libtoxcore libraries in DIR]),
[
LIBTOXCORE_SEARCH_LIBS="$withval"
AC_MSG_NOTICE([Will search for libtoxcore libraries in $withval])
]
)
AC_ARG_WITH(libsodium-headers,
AC_HELP_STRING([--with-libsodium-headers=DIR],
[search for libsodium header files in DIR]),
[
LIBSODIUM_SEARCH_HEADERS="$withval"
AC_MSG_NOTICE([Will search for libsodium header files in $withval])
]
)
AC_ARG_WITH(libsodium-libs,
AC_HELP_STRING([--with-libsodium-libs=DIR],
[search for libsodium libraries in DIR]),
[
LIBSODIUM_SEARCH_LIBS="$withval"
AC_MSG_NOTICE([Will search for libsodium libraries in $withval])
]
)
WIN32=no
AC_CANONICAL_HOST
case $host_os in
*mingw*)
WIN32="yes"
;;
*freebsd*)
LDFLAGS="$LDFLAGS -L/usr/local/lib"
CFLAGS="$CFLAGS -I/usr/local/include"
CPPFLAGS="$CPPFLAGS -I/usr/local/include"
;;
esac
# Checks for programs.
AC_PROG_CC
AM_PROG_CC_C_O
AC_CHECK_HEADERS(
[limits.h locale.h stdint.h stdlib.h string.h unistd.h wchar.h wctype.h],
[],
[ AC_MSG_ERROR([required header is missing on your system]) ])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_TYPE_SIZE_T
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
AC_TYPE_UINT8_T
# Checks for library functions.
AC_FUNC_MALLOC
AC_CHECK_FUNCS(
[iswprint memmove memset mkdir setlocale strchr strdup],
[],
[ AC_MSG_ERROR([required library function is missing on your system])])
# pkg-config based tests
PKG_PROG_PKG_CONFIG
if test -n "$PKG_CONFIG"; then
if test "x$WIN32" != "xyes"; then
PKG_CHECK_MODULES([NCURSES], [ncursesw],
[
NCURSES_FOUND="yes"
NCURSES_WIDECHAR_SUPPORT="yes"
],
[
NCURSES_WIDECHAR_SUPPORT="no"
PKG_CHECK_MODULES([NCURSES], [ncurses],
[
NCURSES_FOUND="yes"
],
[
AC_MSG_WARN([$NCURSES_PKG_ERRORS])
])
])
fi
else
AC_MSG_WARN([pkg-config was not found on your sytem])
fi
if (test "x$NCURSES_FOUND" = "xno") && (test "x$WIN32" != "xyes"); then
AC_PATH_PROG([CURSES_CONFIG], [ncursesw5-config], [no])
if test "x$CURSES_CONFIG" != "xno"; then
AC_MSG_CHECKING(ncurses cflags)
NCURSES_CFLAGS=`${CURSES_CONFIG} --cflags`
AC_MSG_RESULT($NCURSES_CFLAGS)
AC_MSG_CHECKING(ncurses libraries)
NCURSES_LIBS=`${CURSES_CONFIG} --libs`
AC_MSG_RESULT($NCURSES_LIBS)
AC_SUBST(NCURSES_CFLAGS)
AC_SUBST(NCURSES_LIBS)
NCURSES_FOUND="yes"
NCURSES_WIDECHAR_SUPPORT="yes"
fi
fi
if (test "x$NCURSES_FOUND" = "xno") && (test "x$WIN32" != "xyes"); then
unset ac_cv_path_CURSES_CONFIG
AC_PATH_PROG([CURSES_CONFIG], [ncursesw5.4-config], [no])
if test "x$CURSES_CONFIG" != "xno"; then
AC_MSG_CHECKING(ncurses cflags)
NCURSES_CFLAGS=`${CURSES_CONFIG} --cflags`
AC_MSG_RESULT($NCURSES_CFLAGS)
AC_MSG_CHECKING(ncurses libraries)
NCURSES_LIBS=`${CURSES_CONFIG} --libs`
AC_MSG_RESULT($NCURSES_LIBS)
AC_SUBST(NCURSES_CFLAGS)
AC_SUBST(NCURSES_LIBS)
NCURSES_FOUND="yes"
NCURSES_WIDECHAR_SUPPORT="yes"
fi
fi
if (test "x$NCURSES_FOUND" = "xno") && (test "x$WIN32" != "xyes"); then
unset ac_cv_path_CURSES_CONFIG
AC_PATH_PROG([CURSES_CONFIG], [ncurses5-config], [no])
if test "x$CURSES_CONFIG" != "xno"; then
AC_MSG_CHECKING(ncurses cflags)
NCURSES_CFLAGS=`${CURSES_CONFIG} --cflags`
AC_MSG_RESULT($NCURSES_CFLAGS)
AC_MSG_CHECKING(ncurses libraries)
NCURSES_LIBS=`${CURSES_CONFIG} --libs`
AC_MSG_RESULT($NCURSES_LIBS)
AC_SUBST(NCURSES_CFLAGS)
AC_SUBST(NCURSES_LIBS)
NCURSES_FOUND="yes"
fi
fi
if (test "x$NCURSES_FOUND" = "xno") && (test "x$WIN32" != "xyes"); then
unset ac_cv_path_CURSES_CONFIG
AC_PATH_PROG([CURSES_CONFIG], [ncurses5.4-config], [no])
if test "x$CURSES_CONFIG" != "xno"; then
AC_MSG_CHECKING(ncurses cflags)
NCURSES_CFLAGS=`${CURSES_CONFIG} --cflags`
AC_MSG_RESULT($NCURSES_CFLAGS)
AC_MSG_CHECKING(ncurses libraries)
NCURSES_LIBS=`${CURSES_CONFIG} --libs`
AC_MSG_RESULT($NCURSES_LIBS)
AC_SUBST(NCURSES_CFLAGS)
AC_SUBST(NCURSES_LIBS)
NCURSES_FOUND="yes"
fi
fi
if test "x$NCURSES_FOUND" = "xno"; then
AC_CHECK_HEADER([curses.h],
[],
[
AC_MSG_ERROR([headers for the ncurses library were not found on your system])
]
)
if test "x$WIN32" = "xyes"; then
dnl Check if pdcurses provides wide char support
NCURSES_WIDECHAR_SUPPORT="no"
AC_CHECK_LIB([pdcurses], [clear],
[],
[
AC_MSG_ERROR([required library pdcurses was not found on your system])
]
)
AC_CHECK_LIB(ws2_32, main,
[
WINSOCK2_LIBS="-lws2_32"
AC_SUBST(WINSOCK2_LIBS)
],
[
AC_MSG_ERROR([required library winsock2 was not found on the system, please check your MinGW installation])
]
)
AC_DEFINE([_WIN32_WINNT], [0x501],
[enable getaddrinfo/freeaddrinfo on XP and higher])
else
AC_CHECK_LIB([ncursesw], [wget_wch],
[
NCURSES_WIDECHAR_SUPPORT="yes"
],
[
unset ac_cv_lib_ncursesw_wget_wch
AC_CHECK_LIB([ncursesw], [wget_wch],
[
NCURSES_WIDECHAR_SUPPORT="yes"
],
[
NCURSES_WIDECHAR_SUPPORT="no"
AC_CHECK_LIB([ncurses], [clear],
[],
[
unset ac_cv_lib_ncurses_clear
AC_CHECK_LIB([ncurses], [clear],
[],
[
AC_MSG_ERROR([required library ncurses was not found on your system])
],
[
-ltinfo
]
)
]
)
],
[
-ltinfo
]
)
]
)
fi
fi
if test -n "$PKG_CONFIG"; then
PKG_CHECK_MODULES(LIBTOXCORE, [libtoxcore],
[
LIBTOXCORE_FOUND="yes"
],
[
AC_MSG_WARN([required library libsodium was not found in requested location $LIBSODIUM_SEARCH_LIBS])
])
fi
if test "x$LIBTOXCORE_FOUND" = "xno"; then
LIBSODIUM_LIBS=
LIBSODIUM_LDFLAGS=
LDFLAGS_SAVE="$LDFLAGS"
if test -n "$LIBSODIUM_SEARCH_LIBS"; then
LDFLAGS="$LDFLAGS -L$LIBSODIUM_SEARCH_LIBS"
AC_CHECK_LIB(sodium, randombytes_random,
[
LIBSODIUM_LDFLAGS="-L$LIBSODIUM_SEARCH_LIBS"
LIBSODIUM_LIBS="-lsodium"
],
[
AC_MSG_ERROR([required library libsodium was not found in requested location $LIBSODIUM_SEARCH_LIBS])
]
)
else
AC_CHECK_LIB(sodium, randombytes_random,
[],
[
AC_MSG_ERROR([required library libsodium was not found on your system, please check http://download.libsodium.org/libsodium/releases/])
]
)
fi
LDFLAGS="$LDFLAGS_SAVE"
AC_SUBST(LIBSODIUM_LIBS)
AC_SUBST(LIBSODIUM_LDFLAGS)
LIBTOXCORE_CFLAGS=
CFLAGS_SAVE="$CFLAGS"
CPPFLAGS_SAVE="$CPPFLAGS"
if test -n "$LIBTOXCORE_SEARCH_HEADERS"; then
CFLAGS="$CFLAGS -I$LIBTOXCORE_SEARCH_HEADERS"
CPPFLAGS="$CPPFLAGS -I$LIBTOXCORE_SEARCH_HEADERS"
AC_CHECK_HEADER([tox/tox.h],
[
LIBTOXCORE_CFLAGS="-I$LIBTOXCORE_SEARCH_HEADERS"
],
[
AC_MSG_ERROR([headers for the toxcore library were not found on your system])
]
)
else
AC_CHECK_HEADER([tox/tox.h],
[],
[
AC_MSG_ERROR([headers for the toxcore library were not found on your system])
],
)
fi
CFLAGS="$CFLAGS_SAVE"
CPPFLAGS="$CPPFLAGS_SAVE"
AC_SUBST(LIBTOXCORE_CFLAGS)
LIBTOXCORE_LIBS=
LIBTOXCORE_LDFLAGS=
LDFLAGS_SAVE="$LDFLAGS"
if test -n "$LIBTOXCORE_SEARCH_LIBS"; then
LDFLAGS="$LDFLAGS $LIBSODIUM_LDFLAGS -L$LIBTOXCORE_SEARCH_LIBS"
AC_CHECK_LIB([toxcore], [tox_new],
[
LIBTOXCORE_LDFLAGS="-L$LIBTOXCORE_SEARCH_LIBS"
LIBTOXCORE_LIBS="-ltoxcore"
],
[
AC_MSG_ERROR([required library toxcore was not found on your system])
],
[
$WINSOCK2_LIBS
$LIBSODIUM_LIBS
]
)
else
LDFLAGS="$LDFLAGS $LIBSODIUM_LDFLAGS"
AC_CHECK_LIB([toxcore], [tox_new],
[],
[
AC_MSG_ERROR([required library toxcore was not found on your system])
],
[
$WINSOCK2_LIBS
$LIBSODIUM_LIBS
]
)
fi
LDFLAGS="$LDFLAGS_SAVE"
AC_SUBST(LIBTOXCORE_LIBS)
AC_SUBST(LIBTOXCORE_LDFLAGS)
fi
TOXIC_VERSION="$PACKAGE_VERSION"
AC_PATH_PROG([GIT], [git], [no])
if test "x$GIT" != "xno"; then
if test -d ${srcdir}/.git; then
TOXIC_VERSION="${TOXIC_VERSION}_r`${GIT} rev-list HEAD --count`"
fi
fi
AC_SUBST(TOXIC_VERSION)
eval PACKAGE_DATADIR="${datadir}/${PACKAGE}"
eval PACKAGE_DATADIR="${PACKAGE_DATADIR}"
AC_DEFINE_UNQUOTED(PACKAGE_DATADIR, "$PACKAGE_DATADIR", [toxic data directory])
if test "x$NCURSES_WIDECHAR_SUPPORT" = "xyes"; then
AC_DEFINE([HAVE_WIDECHAR], [1], [ncurses wide char support available])
AC_DEFINE([_XOPEN_SOURCE_EXTENDED], [1],
[enable X/Open Portability Guide functionality])
fi
AC_CONFIG_FILES([Makefile
misc/Makefile
build/Makefile])
AC_OUTPUT

169
doc/toxic.1 Normal file
View File

@ -0,0 +1,169 @@
'\" t
.\" Title: toxic
.\" Author: [see the "AUTHORS" section]
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
.\" Date: 2021-12-05
.\" Manual: Toxic Manual
.\" Source: toxic __VERSION__
.\" Language: English
.\"
.TH "TOXIC" "1" "2021\-12\-05" "toxic __VERSION__" "Toxic Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
toxic \- CLI client for Tox
.SH "SYNOPSIS"
.sp
\fBtoxic\fR [\-f \fIdata\-file\fR] [\-x] [\-4] [\-c \fIconfig\-file\fR] [\-n \fInodes\-file\fR] [\-h]
.SH "DESCRIPTION"
.sp
toxic is an ncurses\-based instant messaging client for Tox which formerly resided in the Tox core repository, and is now available as a standalone application\&.
.SH "OPTIONS"
.PP
\-4, \-\-ipv4
.RS 4
Force IPv4 connection
.RE
.PP
\-b, \-\-debug
.RS 4
Enable stderr for debugging\&. Redirect output to avoid breaking the curses interface and better capture messages\&.
.RE
.PP
\-c, \-\-config config\-file
.RS 4
Use specified
\fIconfig\-file\fR
instead of
\fI~/\&.config/tox/toxic\&.conf\fR
.RE
.PP
\-d, \-\-default\-locale
.RS 4
Use default locale
.RE
.PP
\-e, \-\-encrypt\-data
.RS 4
Encrypt an unencrypted data file\&. An error will occur if this option is used with an encrypted data file\&.
.RE
.PP
\-f, \-\-file data\-file
.RS 4
Use specified
\fIdata\-file\fR
instead of
\fI~/\&.config/tox/toxic_profile\&.tox\fR
.RE
.PP
\-h, \-\-help
.RS 4
Show help message
.RE
.PP
\-l, \-\-logging
.RS 4
Enable toxcore logging to stderr
.RE
.PP
\-n, \-\-nodes nodes\-file
.RS 4
Use specified
\fInodes\-file\fR
for DHT bootstrap nodes instead of
\fI~/\&.config/tox/DHTnodes\&.json\fR
.RE
.PP
\-o, \-\-noconnect
.RS 4
Do not connect to the DHT network
.RE
.PP
\-p, \-\-SOCKS5\-proxy
.RS 4
Use a SOCKS5 proxy: Requires [IP] [port]
.RE
.PP
\-P, \-\-HTTP\-proxy
.RS 4
Use a HTTP proxy: Requires [IP] [port]
.RE
.PP
\-r, \-\-namelist
.RS 4
Use specified nameservers list
.RE
.PP
\-t, \-\-force\-tcp
.RS 4
Force TCP connection (use this with proxies)
.RE
.PP
\-T, \-\-tcp\-relay
.RS 4
Act as a TCP relay server for the network (Note: this uses significantly more bandwidth)
.RE
.PP
\-u, \-\-unencrypt\-data
.RS 4
Unencrypt a data file\&. A warning will appear if this option is used with a data file that is already unencrypted\&.
.RE
.SH "FILES"
.PP
~/\&.config/tox/DHTnodes\&.json
.RS 4
Default location for list of DHT bootstrap nodes (list obtained from
https://nodes\&.tox\&.chat)\&. This list is automatically updated\&. See
\fBtoxic\&.conf\fR(5) for details on controlling the update frequency\&.
.RE
.PP
~/\&.config/tox/toxic_profile\&.tox
.RS 4
Savestate which contains your personal info (nickname, Tox ID, contacts, etc)
.RE
.PP
~/\&.config/tox/toxic\&.conf
.RS 4
Configuration file\&. See
\fBtoxic\&.conf\fR(5) for more details\&.
.RE
.PP
__DATADIR__/toxic\&.conf\&.example
.RS 4
Configuration example\&.
.RE
.SH "BUGS"
.sp
\-Unicode characters with a width larger than 1 column may cause strange behaviour\&.
.sp
\-Screen flickering sometimes occurs on certain terminals\&.
.sp
\-Resizing the terminal window when a game window is open will break things\&.
.SH "LINKS"
.sp
Project page: https://github\&.com/JFreegman/toxic
.sp
Tox development group public key: 360497DA684BCE2A500C1AF9B3A5CE949BBB9F6FB1F91589806FB04CA039E313
.SH "AUTHORS"
.sp
JFreegman <JFreegman@gmail\&.com>
.SH "SEE ALSO"
.sp
\fBtoxic\&.conf\fR(5)

108
doc/toxic.1.asc Normal file
View File

@ -0,0 +1,108 @@
toxic(1)
========
NAME
----
toxic - CLI client for Tox
SYNOPSIS
--------
*toxic* [-f 'data-file'] [-x] [-4] [-c 'config-file'] [-n 'nodes-file'] [-h]
DESCRIPTION
-----------
toxic is an ncurses-based instant messaging client for Tox which formerly
resided in the Tox core repository, and is now available as a standalone
application.
OPTIONS
-------
-4, --ipv4::
Force IPv4 connection
-b, --debug::
Enable stderr for debugging. Redirect output to
avoid breaking the curses interface and better capture messages.
-c, --config config-file::
Use specified 'config-file' instead of '~/.config/tox/toxic.conf'
-d, --default-locale::
Use default locale
-e, --encrypt-data::
Encrypt an unencrypted data file. An error will occur if this option
is used with an encrypted data file.
-f, --file data-file::
Use specified 'data-file' instead of '~/.config/tox/toxic_profile.tox'
-h, --help::
Show help message
-l, --logging::
Enable toxcore logging to stderr
-n, --nodes nodes-file::
Use specified 'nodes-file' for DHT bootstrap nodes instead of '~/.config/tox/DHTnodes.json'
-o, --noconnect::
Do not connect to the DHT network
-p, --SOCKS5-proxy::
Use a SOCKS5 proxy: Requires [IP] [port]
-P, --HTTP-proxy::
Use a HTTP proxy: Requires [IP] [port]
-r, --namelist::
Use specified nameservers list
-t, --force-tcp::
Force TCP connection (use this with proxies)
-T, --tcp-relay::
Act as a TCP relay server for the network (Note: this uses significantly more bandwidth)
-u, --unencrypt-data::
Unencrypt a data file. A warning will appear if this option is used
with a data file that is already unencrypted.
FILES
-----
~/.config/tox/DHTnodes.json::
Default location for list of DHT bootstrap nodes (list obtained from https://nodes.tox.chat).
This list is automatically updated. See *toxic.conf*(5) for details on controlling the update frequency.
~/.config/tox/toxic_profile.tox::
Savestate which contains your personal info (nickname, Tox ID, contacts,
etc)
~/.config/tox/toxic.conf::
Configuration file. See *toxic.conf*(5) for more details.
{datadir}/toxic.conf.example::
Configuration example.
BUGS
----
-Unicode characters with a width larger than 1 column may cause strange
behaviour.
-Screen flickering sometimes occurs on certain terminals.
-Resizing the terminal window when a game window is open will break things.
LINKS
-----
Project page: <https://github.com/JFreegman/toxic>
Tox development group public key: 360497DA684BCE2A500C1AF9B3A5CE949BBB9F6FB1F91589806FB04CA039E313
AUTHORS
-------
JFreegman <JFreegman@gmail.com>
SEE ALSO
--------
*toxic.conf*(5)

430
doc/toxic.conf.5 Normal file
View File

@ -0,0 +1,430 @@
'\" t
.\" Title: toxic.conf
.\" Author: [see the "AUTHORS" section]
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
.\" Date: 2022-06-27
.\" Manual: Toxic Manual
.\" Source: toxic __VERSION__
.\" Language: English
.\"
.TH "TOXIC\&.CONF" "5" "2022\-06\-27" "toxic __VERSION__" "Toxic Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
toxic.conf \- Configuration file for toxic
.SH "SYNOPSIS"
.sp
~/\&.config/tox/toxic\&.conf
.SH "DESCRIPTION"
.sp
The \fItoxic\&.conf\fR file is the main configuration file for \fBtoxic\fR(1) client\&. It uses syntax accepted by \fBlibconfig\fR\&. Lines starting with "//" are comments and will be ignored\&.
.SH "EXAMPLE"
.sp
.if n \{\
.RS 4
.\}
.nf
// Configuration for interface
ui = {
timestamps = true;
alerts = false;
};
// Configuration for audio
audio = {
input_device = 1;
};
.fi
.if n \{\
.RE
.\}
.SH "OPTIONS"
.PP
\fBui\fR
.RS 4
Configuration related to interface elements\&.
.PP
\fBtimestamps\fR
.RS 4
Enable or disable timestamps\&. true or false
.RE
.PP
\fBtime_format\fR
.RS 4
Select between 24 and 12 hour time\&. Specify 24 or 12\&. Setting timestamp_format and log_timestamp_format will override this setting\&.
.RE
.PP
\fBtimestamp_format\fR
.RS 4
Time format string for the interface enclosed by double quotes\&. See
\fBdate\fR(1)
.RE
.PP
\fBlog_timestamp_format\fR
.RS 4
Time format string for logging enclosed by double quotes\&. See
\fBdate\fR(1)
.RE
.PP
\fBalerts\fR
.RS 4
Enable or disable acoustic alerts on events\&. true or false
.RE
.PP
\fBnative_colors\fR
.RS 4
Select between native terminal colors and toxic color theme\&. true or false
.RE
.PP
\fBcolor_bar_bg\fR
.RS 4
set background color of chat status bars\&. (black, white, red, green, blue, cyan, yellow, magenta)
.RE
.PP
\fBcolor_bar_fg\fR
.RS 4
set foreground (text) color of chat status bars\&. (black, white, red, green, blue, cyan, yellow, magenta)
.RE
.PP
\fBcolor_bar_accent\fR
.RS 4
set foreground accent color of chat status bars\&. (black, white, red, green, blue, cyan, yellow, magenta)
.RE
.PP
\fBcolor_bar_notify\fR
.RS 4
set foreground notify (and typing) color in chat status bar\&. (black, white, red, green, blue, cyan, yellow, magenta)
.RE
.PP
\fBautolog\fR
.RS 4
Enable or disable autologging\&. true or false
.RE
.PP
\fBshow_typing_other\fR
.RS 4
Show when others are typing in a 1\-on\-1 chat\&. true or false
.RE
.PP
\fBshow_typing_self\fR
.RS 4
Show others when you\(cqre typing in a 1\-on\-1 chat\&. true or false
.RE
.PP
\fBshow_welcome_msg\fR
.RS 4
Show welcome message on startup\&. true or false
.RE
.PP
\fBshow_connection_msg\fR
.RS 4
Enable friend connection change notifications\&. true or false
.RE
.PP
\fBshow_group_connection_msg\fR
.RS 4
Enable group connection change notifications (does not include quit messages)\&. true or false
.RE
.PP
\fBnodelist_update_freq\fR
.RS 4
How often in days to update the DHT nodes list\&. (integer; 0 to disable)
.RE
.PP
\fBautosave_freq\fR
.RS 4
How often in seconds to auto\-save the Tox data file\&. (integer; 0 to disable)
.RE
.PP
\fBhistory_size\fR
.RS 4
Maximum lines for chat window history\&. Integer value\&. (for example: 700)
.RE
.PP
\fBnotification_timeout\fR
.RS 4
Time in milliseconds to display a notification\&. Integer value\&. (for example: 3000)
.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
.PP
\fBmplex_away\fR
.RS 4
Set user status when attaching and detaching from GNU screen or tmux\&. true or false
.RE
.PP
\fBmplex_away_note\fR
.RS 4
Status message to set when status is set to away due to screen/tmux detach\&. When attaching, the status message is set back to the original value\&.
.RE
.PP
\fBgroup_part_message\fR
.RS 4
Parting message that will be sent to all groupchat peers when you leave the group\&.
.sp
.if n \{\
.RS 4
.\}
.nf
The following options control whether to output a terminal bell on certain events\&.
Some terminals mark the window as urgent when a bell is received\&. Urgent windows are usually highlighted in the taskbar and some window managers even provide shortcuts to jump to the next urgent window\&.
These options don\*(Aqt affect the "alerts" option\&.
.fi
.if n \{\
.RE
.\}
.RE
.PP
\fBbell_on_message\fR
.RS 4
Enable/Disable the terminal bell when receiving a message\&. true or false
.RE
.PP
\fBbell_on_filetrans\fR
.RS 4
Enable/Disable the terminal bell when receiving a filetransfer\&. true or false
.RE
.PP
\fBbell_on_filetrans_accept\fR
.RS 4
Enable/Disable the terminal bell when a filetransfer was accepted\&. true or false
.RE
.PP
\fBbell_on_invite\fR
.RS 4
Enable/Disable the terminal bell when receiving a group/call invite\&. true or false
.RE
.RE
.PP
\fBaudio\fR
.RS 4
Configuration related to audio devices\&.
.PP
\fBinput_device\fR
.RS 4
Audio input device\&. Integer value\&. Number corresponds to
/lsdev in
.RE
.PP
\fBoutput_device\fR
.RS 4
Audio output device\&. Integer value\&. Number corresponds to
/lsdev out
.RE
.PP
\fBVAD_threshold\fR
.RS 4
Voice Activity Detection threshold\&. Float value\&. Recommended values are 1\&.0\-40\&.0
.RE
.PP
\fBconference_audio_channels\fR
.RS 4
Number of channels for conference audio broadcast\&. Integer value\&. 1 (mono) or 2 (stereo)
.RE
.PP
\fBchat_audio_channels\fR
.RS 4
Number of channels for 1\-on\-1 audio broadcast\&. Integer value\&. 1 (mono) or 2 (stereo)
.RE
.PP
\fBpush_to_talk\fR
.RS 4
Enable/Disable Push\-To\-Talk for conference audio chats (active key is F2)\&. true or false
.RE
.RE
.PP
\fBtox\fR
.RS 4
Configuration related to paths\&.
.PP
\fBdownload_path\fR
.RS 4
Default path for downloads\&. String value\&. Absolute path for downloaded files\&.
.RE
.PP
\fBavatar_path\fR
.RS 4
Path for your avatar (file must be a \&.png and cannot exceed 16\&.3 KiB)
.RE
.PP
\fBautorun_path\fR
.RS 4
Path for any scripts that should be run on startup
.RE
.PP
\fBchatlogs_path\fR
.RS 4
Default path for chatlogs\&. String value\&. Absolute path for chatlog files\&.
.RE
.PP
\fBpassword_eval\fR
.RS 4
Replace password prompt by running this command and using its output as the password\&.
.RE
.RE
.PP
\fBsounds\fR
.RS 4
Configuration related to notification sounds\&. Special value "silent" can be used to disable a specific notification\&.
Each value is a string which corresponds to the absolute path of a wav sound file\&.
.PP
\fBnotif_error\fR
.RS 4
Sound to play when an error occurs\&.
.RE
.PP
\fBself_log_in\fR
.RS 4
Sound to play when you log in\&.
.RE
.PP
\fBself_log_out\fR
.RS 4
Sound to play when you log out\&.
.RE
.PP
\fBuser_log_in\fR
.RS 4
Sound to play when a contact become online\&.
.RE
.PP
\fBuser_log_out\fR
.RS 4
Sound to play when a contact become offline\&.
.RE
.PP
\fBcall_incoming\fR
.RS 4
Sound to play when you receive an incoming call\&.
.RE
.PP
\fBcall_outgoing\fR
.RS 4
Sound to play when you start a call\&.
.RE
.PP
\fBgeneric_message\fR
.RS 4
Sound to play when an event occurs\&.
.RE
.PP
\fBtransfer_pending\fR
.RS 4
Sound to play when you receive a file transfer request\&.
.RE
.PP
\fBtransfer_completed\fR
.RS 4
Sound to play when a file transfer is completed\&.
.RE
.RE
.PP
\fBkeys\fR
.RS 4
Configuration related to user interface interaction\&. Currently supported: Ctrl modified keys, Tab, PAGEUP and PAGEDOWN\&.
Each value is a string which corresponds to a key combination\&.
.PP
\fBnext_tab\fR
.RS 4
Key combination to switch next tab\&.
.RE
.PP
\fBprev_tab\fR
.RS 4
Key combination to switch previous tab\&.
.RE
.PP
\fBscroll_line_up\fR
.RS 4
Key combination to scroll one line up\&.
.RE
.PP
\fBscroll_line_down\fR
.RS 4
Key combination to scroll one line down\&.
.RE
.PP
\fBhalf_page_up\fR
.RS 4
Key combination to scroll half page up\&.
.RE
.PP
\fBhalf_page_down\fR
.RS 4
Key combination to scroll half page down\&.
.RE
.PP
\fBpage_bottom\fR
.RS 4
Key combination to scroll to page bottom\&.
.RE
.PP
\fBtoggle_peerlist\fR
.RS 4
Toggle the peer list on and off\&.
.RE
.PP
\fBtoggle_paste_mode\fR
.RS 4
Toggle treating linebreaks as enter key press\&.
.RE
.RE
.SH "FILES"
.PP
~/\&.config/tox/toxic\&.conf
.RS 4
Main configuration file\&.
.RE
.PP
__DATADIR__/toxic\&.conf\&.example
.RS 4
Configuration example\&.
.RE
.SH "RESOURCES"
.sp
Project page: https://github\&.com/JFreegman/toxic
.sp
Tox development group public key: 360497DA684BCE2A500C1AF9B3A5CE949BBB9F6FB1F91589806FB04CA039E313
.SH "AUTHORS"
.sp
JFreegman <JFreegman@gmail\&.com>
.SH "SEE ALSO"
.sp
\fBtoxic\fR(1)

281
doc/toxic.conf.5.asc Normal file
View File

@ -0,0 +1,281 @@
toxic.conf(5)
=============
NAME
----
toxic.conf - Configuration file for toxic
SYNOPSIS
--------
~/.config/tox/toxic.conf
DESCRIPTION
-----------
The 'toxic.conf' file is the main configuration file for *toxic*(1) client.
It uses syntax accepted by *libconfig*.
Lines starting with "//" are comments and will be ignored.
EXAMPLE
-------
----
// Configuration for interface
ui = {
timestamps = true;
alerts = false;
};
// Configuration for audio
audio = {
input_device = 1;
};
----
OPTIONS
-------
*ui*::
Configuration related to interface elements.
*timestamps*;;
Enable or disable timestamps. true or false
*time_format*;;
Select between 24 and 12 hour time. Specify 24 or 12. Setting
timestamp_format and log_timestamp_format will override this setting.
*timestamp_format*;;
Time format string for the interface enclosed by double quotes.
See *date*(1)
*log_timestamp_format*;;
Time format string for logging enclosed by double quotes.
See *date*(1)
*alerts*;;
Enable or disable acoustic alerts on events. true or false
*native_colors*;;
Select between native terminal colors and toxic color theme. true or false
*color_bar_bg*;;
set background color of chat status bars. (black, white, red, green, blue, cyan, yellow, magenta)
*color_bar_fg*;;
set foreground (text) color of chat status bars. (black, white, red, green, blue, cyan, yellow, magenta)
*color_bar_accent*;;
set foreground accent color of chat status bars. (black, white, red, green, blue, cyan, yellow, magenta)
*color_bar_notify*;;
set foreground notify (and typing) color in chat status bar. (black, white, red, green, blue, cyan, yellow, magenta)
*autolog*;;
Enable or disable autologging. true or false
*show_typing_other*;;
Show when others are typing in a 1-on-1 chat. true or false
*show_typing_self*;;
Show others when you're typing in a 1-on-1 chat. true or false
*show_welcome_msg*;;
Show welcome message on startup. true or false
*show_connection_msg*;;
Enable friend connection change notifications. true or false
*show_group_connection_msg*;;
Enable group connection change notifications (does not include quit messages). true or false
*nodelist_update_freq*;;
How often in days to update the DHT nodes list. (integer; 0 to disable)
*autosave_freq*;;
How often in seconds to auto-save the Tox data file. (integer; 0 to disable)
*history_size*;;
Maximum lines for chat window history. Integer value. (for example: 700)
*notification_timeout*;;
Time in milliseconds to display a notification. Integer value. (for example: 3000)
*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.
*mplex_away*;;
Set user status when attaching and detaching from GNU screen or tmux.
true or false
*mplex_away_note*;;
Status message to set when status is set to away due to screen/tmux
detach. When attaching, the status message is set back to the original
value.
*group_part_message*;;
Parting message that will be sent to all groupchat peers when you leave the group.
The following options control whether to output a terminal bell on certain events.
Some terminals mark the window as urgent when a bell is received. Urgent windows are usually highlighted in the taskbar and some window managers even provide shortcuts to jump to the next urgent window.
These options don't affect the "alerts" option.
*bell_on_message*;;
Enable/Disable the terminal bell when receiving a message. true or false
*bell_on_filetrans*;;
Enable/Disable the terminal bell when receiving a filetransfer. true or false
*bell_on_filetrans_accept*;;
Enable/Disable the terminal bell when a filetransfer was accepted. true or false
*bell_on_invite*;;
Enable/Disable the terminal bell when receiving a group/call invite. true or false
*audio*::
Configuration related to audio devices.
*input_device*;;
Audio input device. Integer value. Number corresponds to `/lsdev in`
*output_device*;;
Audio output device. Integer value. Number corresponds to `/lsdev out`
*VAD_threshold*;;
Voice Activity Detection threshold. Float value. Recommended values are
1.0-40.0
*conference_audio_channels*;;
Number of channels for conference audio broadcast. Integer value. 1 (mono) or 2 (stereo)
*chat_audio_channels*;;
Number of channels for 1-on-1 audio broadcast. Integer value. 1 (mono) or 2 (stereo)
*push_to_talk*;;
Enable/Disable Push-To-Talk for conference audio chats (active key is F2). true or false
*tox*::
Configuration related to paths.
*download_path*;;
Default path for downloads. String value. Absolute path for downloaded
files.
*avatar_path*;;
Path for your avatar (file must be a .png and cannot exceed 16.3 KiB)
*autorun_path*;;
Path for any scripts that should be run on startup
*chatlogs_path*;;
Default path for chatlogs. String value. Absolute path for chatlog files.
*password_eval*;;
Replace password prompt by running this command and using its output as
the password.
*sounds*::
Configuration related to notification sounds.
Special value "silent" can be used to disable a specific notification. +
Each value is a string which corresponds to the absolute path of a wav
sound file.
*notif_error*;;
Sound to play when an error occurs.
*self_log_in*;;
Sound to play when you log in.
*self_log_out*;;
Sound to play when you log out.
*user_log_in*;;
Sound to play when a contact become online.
*user_log_out*;;
Sound to play when a contact become offline.
*call_incoming*;;
Sound to play when you receive an incoming call.
*call_outgoing*;;
Sound to play when you start a call.
*generic_message*;;
Sound to play when an event occurs.
*transfer_pending*;;
Sound to play when you receive a file transfer request.
*transfer_completed*;;
Sound to play when a file transfer is completed.
*keys*::
Configuration related to user interface interaction.
Currently supported: Ctrl modified keys, Tab, PAGEUP and PAGEDOWN. +
Each value is a string which corresponds to a key combination.
*next_tab*;;
Key combination to switch next tab.
*prev_tab*;;
Key combination to switch previous tab.
*scroll_line_up*;;
Key combination to scroll one line up.
*scroll_line_down*;;
Key combination to scroll one line down.
*half_page_up*;;
Key combination to scroll half page up.
*half_page_down*;;
Key combination to scroll half page down.
*page_bottom*;;
Key combination to scroll to page bottom.
*toggle_peerlist*;;
Toggle the peer list on and off.
*toggle_paste_mode*;;
Toggle treating linebreaks as enter key press.
FILES
-----
~/.config/tox/toxic.conf::
Main configuration file.
{datadir}/toxic.conf.example::
Configuration example.
RESOURCES
---------
Project page: <https://github.com/JFreegman/toxic>
Tox development group public key: 360497DA684BCE2A500C1AF9B3A5CE949BBB9F6FB1F91589806FB04CA039E313
AUTHORS
-------
JFreegman <JFreegman@gmail.com>
SEE ALSO
--------
*toxic*(1)

199
m4/pkg.m4
View File

@ -1,199 +0,0 @@
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
# serial 1 (pkg-config-0.24)
#
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
#
# This program 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 2 of the License, or
# (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
# ----------------------------------
AC_DEFUN([PKG_PROG_PKG_CONFIG],
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=m4_default([$1], [0.9.0])
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
PKG_CONFIG=""
fi
fi[]dnl
])# PKG_PROG_PKG_CONFIG
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
#
# Check to see whether a particular set of modules exists. Similar
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
#
# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
# only at the first occurence in configure.ac, so if the first place
# it's called might be skipped (such as if it is within an "if", you
# have to call PKG_CHECK_EXISTS manually
# --------------------------------------------------------------
AC_DEFUN([PKG_CHECK_EXISTS],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
if test -n "$PKG_CONFIG" && \
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
m4_default([$2], [:])
m4_ifvaln([$3], [else
$3])dnl
fi])
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
# ---------------------------------------------
m4_define([_PKG_CONFIG],
[if test -n "$$1"; then
pkg_cv_[]$1="$$1"
elif test -n "$PKG_CONFIG"; then
PKG_CHECK_EXISTS([$3],
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes ],
[pkg_failed=yes])
else
pkg_failed=untried
fi[]dnl
])# _PKG_CONFIG
# _PKG_SHORT_ERRORS_SUPPORTED
# -----------------------------
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
_pkg_short_errors_supported=yes
else
_pkg_short_errors_supported=no
fi[]dnl
])# _PKG_SHORT_ERRORS_SUPPORTED
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
# [ACTION-IF-NOT-FOUND])
#
#
# Note that if there is a possibility the first call to
# PKG_CHECK_MODULES might not happen, you should be sure to include an
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
#
#
# --------------------------------------------------------------
AC_DEFUN([PKG_CHECK_MODULES],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
pkg_failed=no
AC_MSG_CHECKING([for $1])
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
and $1[]_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.])
if test $pkg_failed = yes; then
AC_MSG_RESULT([no])
_PKG_SHORT_ERRORS_SUPPORTED
if test $_pkg_short_errors_supported = yes; then
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
else
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
m4_default([$4], [AC_MSG_ERROR(
[Package requirements ($2) were not met:
$$1_PKG_ERRORS
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
_PKG_TEXT])[]dnl
])
elif test $pkg_failed = untried; then
AC_MSG_RESULT([no])
m4_default([$4], [AC_MSG_FAILURE(
[The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
_PKG_TEXT
To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
])
else
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
AC_MSG_RESULT([yes])
$3
fi[]dnl
])# PKG_CHECK_MODULES
# PKG_INSTALLDIR(DIRECTORY)
# -------------------------
# Substitutes the variable pkgconfigdir as the location where a module
# should install pkg-config .pc files. By default the directory is
# $libdir/pkgconfig, but the default can be changed by passing
# DIRECTORY. The user can override through the --with-pkgconfigdir
# parameter.
AC_DEFUN([PKG_INSTALLDIR],
[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
m4_pushdef([pkg_description],
[pkg-config installation directory @<:@]pkg_default[@:>@])
AC_ARG_WITH([pkgconfigdir],
[AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
[with_pkgconfigdir=]pkg_default)
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
m4_popdef([pkg_default])
m4_popdef([pkg_description])
]) dnl PKG_INSTALLDIR
# PKG_NOARCH_INSTALLDIR(DIRECTORY)
# -------------------------
# Substitutes the variable noarch_pkgconfigdir as the location where a
# module should install arch-independent pkg-config .pc files. By
# default the directory is $datadir/pkgconfig, but the default can be
# changed by passing DIRECTORY. The user can override through the
# --with-noarch-pkgconfigdir parameter.
AC_DEFUN([PKG_NOARCH_INSTALLDIR],
[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
m4_pushdef([pkg_description],
[pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
AC_ARG_WITH([noarch-pkgconfigdir],
[AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
[with_noarch_pkgconfigdir=]pkg_default)
AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
m4_popdef([pkg_default])
m4_popdef([pkg_description])
]) dnl PKG_NOARCH_INSTALLDIR

View File

@ -1,6 +0,0 @@
54.215.145.71 33445 6EDDEE2188EF579303C0766B4796DCBA89C93058B6032FEA51593DCD42FB746C
66.175.223.88 33445 B24E2FB924AE66D023FE1E42A2EE3B432010206F751A2FFD3E297383ACF1572E
192.184.81.118 33445 5CD7EB176C19A2FD840406CD56177BB8E75587BB366F7BB3004B19E3EDC04143
192.210.149.121 33445 F404ABAA1C99A9D37D61AB54898F56793E1DEF8BD46B1038B9D822E8460FAB67
198.46.136.167 33445 728925473812C7AAC482BE7250BCCAD0B8CB9F737BF3D42ABD34459C1768F854
95.47.140.214 33445 F4BF7C5A9D0EF4CB684090C38DE937FAE1612021F21FEA4DCBFAC6AAFEF58E68

View File

@ -1 +0,0 @@
dist_pkgdata_DATA = DHTservers

157
misc/toxic.conf.example Normal file
View File

@ -0,0 +1,157 @@
// SAMPLE TOXIC CONFIGURATION
// USES LIBCONFIG-ACCEPTED SYNTAX
ui = {
// true to enable timestamps, false to disable
timestamps=true;
// true to enable acoustic alerts on messages, false to disable
alerts=true;
// Output a bell when receiving a message (see manpage)
bell_on_message=true;
// Output a bell when receiving a filetransfer (see manpage)
bell_on_filetrans=true;
// Don't output a bell when a filetransfer was accepted (see manpage)
bell_on_filetrans_accept=false;
// Output a bell when receiving a group/call invite (see manpage)
bell_on_invite=true;
// true to use native terminal colours, false to use toxic default colour theme
native_colors=false;
// set background color of chat status bars (black, white, red, green, blue, cyan, yellow, magenta)
color_bar_bg="blue";
// set foreground (text) color of chat status bars (black, white, red, green, blue, cyan, yellow, magenta)
color_bar_fg="white";
// set foreground accent color of chat status bars (black, white, red, green, blue, cyan, yellow, magenta)
color_bar_accent="cyan";
// set foreground notify (and typing) color in chat status bar (black, white, red, green, blue, cyan, yellow, magenta)
color_bar_notify="yellow";
// true to enable autologging, false to disable
autolog=false;
// 24 or 12 hour time
time_format=24;
// Timestamp format string according to date/strftime format. Overrides time_format setting
timestamp_format="%H:%M";
// true to show you when others are typing a message in 1-on-1 chats
show_typing_other=true;
// true to show others when you're typing a message in 1-on-1 chats
show_typing_self=true;
// true to show the welcome message on startup
show_welcome_msg=true;
// true to show friend connection change messages on the home screen
show_connection_msg=true;
// true to show peer connection change messages in groups (setting to false does not include user quit messages)
show_group_connection_msg=true;
// How often in days to update the DHT nodes list. (0 to disable updates)
nodeslist_update_freq=7;
// How often in seconds to auto-save the Tox data file. (0 to disable periodic auto-saves)
autosave_freq=600;
// maximum lines for chat window history
history_size=700;
// time in milliseconds to display a notification
notification_timeout=6000;
// 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="-";
// Indicator for special messages.
line_special=">";
// true to change status based on screen/tmux attach/detach, false to disable
mplex_away=true;
// Status message to use when status set to away due to screen/tmux detach
mplex_away_note="Away from keyboard, be back soon!"
// Parting message that will be sent to all groupchat peers when you leave the group
group_part_message="Toxic user signing out"
};
audio = {
// preferred audio input device; numbers correspond to /lsdev in
input_device=2;
// preferred audio output device; numbers correspond to /lsdev out
output_device=0;
// default VAD threshold; float (recommended values are 1.0-40.0)
VAD_threshold=5.0;
// Number of channels to use for conference audio broadcasts; 1 for mono, 2 for stereo.
conference_audio_channels=1;
// Number of channels to use for 1-on-1 audio broadcasts; 1 for mono, 2 for stereo.
chat_audio_channels=2;
// toggle conference push-to-talk
push_to_talk=false;
};
tox = {
// Path for downloaded files
// download_path="/home/USERNAME/Downloads/";
// Path for your avatar (file must be a .png and cannot exceed 64 KiB)
// avatar_path="/home/USERNAME/Pictures/youravatar.png";
// Path for scripts that should be run on startup
// autorun_path="/home/USERNAME/toxic_scripts/";
// Path for chatlogs
// chatlogs_path="/home/USERNAME/toxic_chatlogs/";
};
// To disable a sound set the path to "silent"
sounds = {
error="__DATADIR__/sounds/ToxicError.wav";
user_log_in="__DATADIR__/sounds/ToxicContactOnline.wav";
user_log_out="__DATADIR__/sounds/ToxicContactOffline.wav";
call_incoming="__DATADIR__/sounds/ToxicIncomingCall.wav";
call_outgoing="__DATADIR__/sounds/ToxicOutgoingCall.wav";
generic_message="__DATADIR__/sounds/ToxicRecvMessage.wav";
transfer_pending="__DATADIR__/sounds/ToxicTransferStart.wav";
transfer_completed="__DATADIR__/sounds/ToxicTransferComplete.wav";
};
// Currently supported: Ctrl modified keys, Tab, PAGEUP and PAGEDOWN (case insensitive)
// Note: Ctrl+M does not work
keys = {
next_tab="Ctrl+P";
prev_tab="Ctrl+O";
scroll_line_up="PAGEUP";
scroll_line_down="PAGEDOWN";
half_page_up="Ctrl+F";
half_page_down="Ctrl+V";
page_bottom="Ctrl+H";
toggle_peerlist="Ctrl+B";
toggle_paste_mode="Ctrl+T";
};

11
misc/toxic.desktop Normal file
View File

@ -0,0 +1,11 @@
[Desktop Entry]
Version=1.0
Type=Application
Name=Toxic
Comment=A CLI based Tox client
TryExec=toxic
Exec=toxic
Icon=utilities-terminal
Categories=InstantMessaging;AudioVideo;Network;
Terminal=true
MimeType=x-scheme-handler/tox;

View File

@ -0,0 +1,320 @@
#!/usr/bin/env sh
# MIT License
#
# Copyright (c) 2021-2022 Maxim Biro <nurupo.contributions@gmail.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# Script for building a minimal statically compiled Toxic. While it doesn't
# support X11 integration, video/audio calls, desktop & sound notifications, QR
# codes and Python scripting, it is rather portable.
#
# Run as:
#
# sudo docker run -it --rm \
# -v /tmp/artifact:/artifact \
# -v /home/jfreegman/git/toxic:/toxic \
# amd64/alpine:latest \
# /bin/sh /toxic/script/build-minimal-static-toxic.sh
#
# that would use Toxic code from /home/jfreegman/git/toxic and place the build
# artifact at /tmp/artifact.
#
# You can change between:
# amd64/alpine:latest,
# i386/alpine:latest,
# arm64v8/alpine:latest,
# arm32v7/alpine:latest,
# arm32v6/alpine:latest,
# ppc64le/alpine:latest,
# s390x/alpine:latest,
# etc.
# as long as your system can run foreign architecture binaries, e.g. via qemu
# static bins and binfmt (install qemu-user-static package on Debian/Ubuntu).
#
#
# To debug, run:
#
# sudo docker run -it --rm \
# -v /tmp/artifact:/artifact \
# -v /home/jfreegman/git/toxic:/toxic \
# amd64/alpine:latest \
# /bin/sh
# # sh /toxic/script/build-minimal-static-toxic.sh
set -eu
ARTIFACT_DIR="/artifact"
TOXIC_SRC_DIR="/toxic"
if [ ! -f /etc/os-release ] || ! grep -qi 'Alpine Linux' /etc/os-release
then
echo "Error: This script expects to be run on Alpine Linux."
exit 1
fi
if [ ! -d "$ARTIFACT_DIR" ] || [ ! -d "$TOXIC_SRC_DIR" ]
then
echo "Error: At least one of $ARTIFACT_DIR or $TOXIC_SRC_DIR directories inside the container is missing."
exit 1
fi
if [ "$(id -u)" != "0" ]
then
echo "Error: This script expects to be run as root."
exit 1
fi
set -x
# Use all cores for building
MAKEFLAGS=j$(nproc)
export MAKEFLAGS
check_sha256()
{
if ! ( echo "$1 $2" | sha256sum -cs - )
then
echo "Error: sha256 of $2 doesn't match the known one."
echo "Expected: $1 $2"
echo "Got: $(sha256sum "$2")"
exit 1
else
echo "sha256 matches the expected one: $1"
fi
}
apk update
apk upgrade
apk add \
brotli-dev \
brotli-static \
build-base \
cmake \
git \
libconfig-dev \
libconfig-static \
libsodium-dev \
libsodium-static \
linux-headers \
ncurses-dev \
ncurses-static \
ncurses-terminfo \
ncurses-terminfo-base \
nghttp2-dev \
nghttp2-static \
openssl-dev \
openssl-libs-static \
pkgconf \
wget \
xz \
zlib-dev \
zlib-static
BUILD_DIR="/tmp/build"
mkdir -p "$BUILD_DIR"
# Build Toxcore
cd "$BUILD_DIR"
# The git hash of the c-toxcore version we're using
TOXCORE_VERSION="172f279dc0647a538b30e62c96bab8bb1b0c8960"
# The sha256sum of the c-toxcore tarball for TOXCORE_VERSION
TOXCORE_HASH="9884d4ad9b80917e22495c2ebe7a76c509fb98c61031824562883225e66684ae"
TOXCORE_FILENAME="c-toxcore-$TOXCORE_VERSION.tar.gz"
wget --timeout=10 -O "$TOXCORE_FILENAME" "https://github.com/TokTok/c-toxcore/archive/$TOXCORE_VERSION.tar.gz"
check_sha256 "$TOXCORE_HASH" "$TOXCORE_FILENAME"
tar -o -xf "$TOXCORE_FILENAME"
rm "$TOXCORE_FILENAME"
cd c-toxcore*
mkdir -p "third_party" && cd "third_party"
CMP_VERSION="074e0df43e8a61ea938c4f77f65d1fbccc0c3bf9"
CMP_FILENAME="cmp-$CMP_VERSION.tar.gz"
wget --timeout=10 -O "$CMP_FILENAME" "https://github.com/TokTok/cmp/archive/$CMP_VERSION.tar.gz"
tar -o -xf "$CMP_FILENAME"
mv cmp-*/* 'cmp/'
cd ..
cmake -B_build -H. \
-DUSE_TEST_NETWORK=OFF \
-DENABLE_STATIC=ON \
-DENABLE_SHARED=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TOXAV=OFF \
-DBOOTSTRAP_DAEMON=OFF \
-DDHT_BOOTSTRAP=OFF \
-DCMAKE_INSTALL_PREFIX="$BUILD_DIR/prefix-toxcore"
cmake --build _build --target install
# Build cURL
# While Alpine does provide a static cURL build, it's not built with
# --with-ca-fallback, which is needed for better cross-distro portability.
# Basically, some distros put their ca-certificates in different places, and
# with --with-ca-fallback we or the user can provide the cert bundle file
# location with SSL_CERT_FILE env variable.
cd "$BUILD_DIR"
CURL_VERSION="7.88.1"
CURL_HASH="cdb38b72e36bc5d33d5b8810f8018ece1baa29a8f215b4495e495ded82bbf3c7"
CURL_FILENAME="curl-$CURL_VERSION.tar.gz"
wget --timeout=10 -O "$CURL_FILENAME" "https://curl.haxx.se/download/$CURL_FILENAME"
check_sha256 "$CURL_HASH" "$CURL_FILENAME"
tar -xf curl*.tar.gz
rm curl*.tar.gz
cd curl*
./configure \
--prefix="$BUILD_DIR/prefix-curl" \
--disable-shared \
--enable-static \
--without-ca-bundle \
--without-ca-path \
--with-ca-fallback \
--with-nghttp2 \
--with-brotli \
--with-openssl
make
make install
sed -i 's|-lbrotlidec |-lbrotlidec -lbrotlicommon |g' $BUILD_DIR/prefix-curl/lib/pkgconfig/libcurl.pc
# Build Toxic
cd "$BUILD_DIR"
cp -a "$TOXIC_SRC_DIR" toxic
cd toxic
if [ -z "$(git describe --tags --exact-match HEAD)" ]
then
set +x
echo "Didn't find a git tag on the HEAD commit. You seem to be building an in-development release of Toxic rather than a release version." | fold -sw 80
printf "Do you wish to proceed? (y/N): "
read -r answer
if echo "$answer" | grep -v -iq "^y" ; then
echo "Exiting."
exit 1
fi
set -x
fi
sed -i 's|pkg-config|pkg-config --static|' cfg/global_vars.mk
sed -i 's|<limits.h|<linux/limits.h|' src/*
CFLAGS="-static" PKG_CONFIG_PATH="$BUILD_DIR/prefix-toxcore/lib64/pkgconfig:$BUILD_DIR/prefix-toxcore/lib/pkgconfig:$BUILD_DIR/prefix-curl/lib/pkgconfig" PREFIX="$BUILD_DIR/prefix-toxic" make \
DISABLE_X11=1 \
DISABLE_AV=1 \
DISABLE_SOUND_NOTIFY=1 \
DISABLE_QRCODE=1 \
DISABLE_QRPNG=1 \
DISABLE_DESKTOP_NOTIFY=1 \
ENABLE_PYTHON=0 \
ENABLE_RELEASE=1 \
ENABLE_ASAN=0 \
DISABLE_GAMES=0 \
install
# Prepare the build artifact
PREPARE_ARTIFACT_DIR="$BUILD_DIR/artifact"
cp -a "$BUILD_DIR/prefix-toxic/bin" "$PREPARE_ARTIFACT_DIR"
strip "$PREPARE_ARTIFACT_DIR"/*
cp -a "$BUILD_DIR/toxic/misc"/* "$PREPARE_ARTIFACT_DIR"
mv "$PREPARE_ARTIFACT_DIR/toxic.conf.example" "$PREPARE_ARTIFACT_DIR/toxic.conf"
cp -aL /usr/share/terminfo "$PREPARE_ARTIFACT_DIR"
echo "A minimal statically compiled Toxic.
Doesn't support X11 integration, video/audio calls, desktop & sound
notifications, QR codes and Python scripting.
However, it is rather portable.
Toxic $(git -C "$BUILD_DIR/toxic" describe --tags --exact-match HEAD) ($(git -C "$BUILD_DIR/toxic" rev-parse HEAD))
Build date time: $(TZ=UTC date +"%Y-%m-%dT%H:%M:%S%z")
OS:
$(cat /etc/os-release)
List of self-built software statically compiled into Toxic:
libcurl $CURL_VERSION
libtoxcore $TOXCORE_VERSION
List of OS-packaged software statically compiled into Toxic:
$(apk list -I | grep 'static' | sort -i)
List of all packages installed during the build:
$(apk list -I | sort -i)" > "$PREPARE_ARTIFACT_DIR/build_info"
echo '#!/usr/bin/env sh
DEBIAN_SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
RHEL_SSL_CERT_FILE=/etc/pki/tls/certs/ca-bundle.crt
OPENSUSE_CERT_FILE=/etc/ssl/ca-bundle.pem
if [ ! -f "$SSL_CERT_FILE" ] ; then
if [ -f "$DEBIAN_SSL_CERT_FILE" ] ; then
SSL_CERT_FILE="$DEBIAN_SSL_CERT_FILE"
elif [ -f "$RHEL_SSL_CERT_FILE" ] ; then
SSL_CERT_FILE="$RHEL_SSL_CERT_FILE"
elif [ -f "$OPENSUSE_CERT_FILE" ] ; then
SSL_CERT_FILE="$OPENSUSE_CERT_FILE"
fi
fi
if [ -z "$SSL_CERT_FILE" ] ; then
echo "Warning: Couldn'\''t find the SSL CA certificate store file." | fold -sw 80
echo
echo "Toxic uses HTTPS to download a list of DHT bootstrap nodes in order to connect to the Tox DHT. This functionality is optional, you should be able to use Toxic without it. If you choose to use Toxic without it, you might need to manually enter DHT bootstrap node information using the '\''/connect'\'' command in order to come online." | fold -sw 80
echo
echo "To fix this issue, install SSL CAs as provided by your Linux distribution, e.g. '\''ca-certificates'\'' package on Debian/Ubuntu. If it'\''s already installed and you still see this message, run this script with SSL_CERT_FILE variable set to point to the SSL CA certificate store file location. The file is usually named '\''ca-certificates.crt'\'' or '\''ca-bundle.pem'\''." | fold -sw 80
echo
printf "Do you wish to run Toxic without SSL CA certificate store file found? (y/N): "
read -r answer
if echo "$answer" | grep -v -iq "^y" ; then
echo "Exiting."
exit
fi
fi
cd "$(dirname -- $0)"
SSL_CERT_FILE="$SSL_CERT_FILE" TERMINFO=./terminfo ./toxic -c toxic.conf' > "$PREPARE_ARTIFACT_DIR/run_toxic.sh"
chmod a+x "$PREPARE_ARTIFACT_DIR/run_toxic.sh"
# Tar it
cd "$PREPARE_ARTIFACT_DIR"
cd ..
ARCH="$(tr '_' '-' < /etc/apk/arch)"
ARTIFACT_NAME="toxic-minimal-static-musl_linux_$ARCH"
mv "$PREPARE_ARTIFACT_DIR" "$PREPARE_ARTIFACT_DIR/../$ARTIFACT_NAME"
tar -cJf "$ARTIFACT_NAME.tar.xz" "$ARTIFACT_NAME"
mv "$ARTIFACT_NAME.tar.xz" "$ARTIFACT_DIR"
chmod 777 -R "$ARTIFACT_DIR"

Binary file not shown.

Binary file not shown.

BIN
sounds/ToxicError.wav Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
sounds/ToxicRecvMessage.wav Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

2
sounds/license Normal file
View File

@ -0,0 +1,2 @@
ToxicError.wav, ToxicRecvMessage.wav, ToxicContactOffline.wav, ToxicIncomingCall.wav, ToxicTransferComplete.wav, ToxicContactOnline.wav, ToxicOutgoingCall.wav and ToxicTransferStart.wav
are licensed under the "Creative Commons Attribution 3.0 Unported". All credit attributed to Jfreegman.

View File

@ -1,23 +0,0 @@
cmake_minimum_required(VERSION 2.6.0)
project(toxic C)
execute_process(COMMAND git rev-list HEAD --count OUTPUT_VARIABLE COMMIT)
SET(GCC_COVERAGE_COMPILE_FLAGS '-DTOXICVER="0.1.1_r${COMMIT}"')
add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
set(exe_name toxic)
add_executable(${exe_name}
main.c
windows.c
prompt.c
friendlist.c
dhtstatus.c
chat.c
configdir.c)
include_directories(${CURSES_INCLUDE_DIR})
target_link_libraries(${exe_name}
${CURSES_LIBRARIES})
linkCoreLibraries(${exe_name})

214
src/api.c Normal file
View File

@ -0,0 +1,214 @@
/* api.c
*
*
* Copyright (C) 2017 Jakob Kreuze <jakob@memeware.net>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#include <dirent.h>
#include <stdint.h>
#include <tox/tox.h>
#include "execute.h"
#include "friendlist.h"
#include "line_info.h"
#include "message_queue.h"
#include "misc_tools.h"
#include "settings.h"
#include "toxic_strings.h"
#include "windows.h"
#ifdef PYTHON
#include "python_api.h"
Tox *user_tox;
static WINDOW *cur_window;
static ToxWindow *self_window;
void api_display(const char *const msg)
{
if (msg == NULL) {
return;
}
self_window = get_active_window();
line_info_add(self_window, NULL, NULL, NULL, SYS_MSG, 0, 0, msg);
}
FriendsList api_get_friendslist(void)
{
return Friends;
}
char *api_get_nick(void)
{
size_t len = tox_self_get_name_size(user_tox);
uint8_t *name = malloc(len + 1);
if (name == NULL) {
return NULL;
}
tox_self_get_name(user_tox, name);
name[len] = '\0';
return (char *) name;
}
Tox_User_Status api_get_status(void)
{
return tox_self_get_status(user_tox);
}
char *api_get_status_message(void)
{
size_t len = tox_self_get_status_message_size(user_tox);
uint8_t *status = malloc(len + 1);
if (status == NULL) {
return NULL;
}
tox_self_get_status_message(user_tox, status);
status[len] = '\0';
return (char *) status;
}
void api_send(const char *msg)
{
if (msg == NULL || self_window->chatwin->cqueue == NULL) {
return;
}
char *name = api_get_nick();
if (name == NULL) {
return;
}
self_window = get_active_window();
snprintf((char *) self_window->chatwin->line, sizeof(self_window->chatwin->line), "%s", msg);
add_line_to_hist(self_window->chatwin);
int id = line_info_add(self_window, true, name, NULL, OUT_MSG, 0, 0, "%s", msg);
cqueue_add(self_window->chatwin->cqueue, msg, strlen(msg), OUT_MSG, id);
free(name);
}
void api_execute(const char *input, int mode)
{
self_window = get_active_window();
execute(cur_window, self_window, user_tox, input, mode);
}
int do_plugin_command(int num_args, char (*args)[MAX_STR_SIZE])
{
return do_python_command(num_args, args);
}
int num_registered_handlers(void)
{
return python_num_registered_handlers();
}
int help_max_width(void)
{
return python_help_max_width();
}
void draw_handler_help(WINDOW *win)
{
python_draw_handler_help(win);
}
void cmd_run(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
FILE *fp;
const char *error_str;
cur_window = window;
self_window = self;
if (argc != 1) {
if (argc < 1) {
error_str = "Path must be specified.";
} else {
error_str = "Only one argument allowed.";
}
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, error_str);
return;
}
fp = fopen(argv[1], "r");
if (fp == NULL) {
error_str = "Path does not exist.";
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, error_str);
return;
}
run_python(fp, argv[1]);
fclose(fp);
}
void invoke_autoruns(WINDOW *window, ToxWindow *self)
{
char abspath_buf[PATH_MAX + 256];
char err_buf[PATH_MAX + 128];
if (user_settings->autorun_path[0] == '\0') {
return;
}
DIR *d = opendir(user_settings->autorun_path);
if (d == NULL) {
snprintf(err_buf, sizeof(err_buf), "Autorun path does not exist: %s", user_settings->autorun_path);
api_display(err_buf);
return;
}
struct dirent *dir = NULL;
cur_window = window;
self_window = self;
while ((dir = readdir(d)) != NULL) {
size_t path_len = strlen(dir->d_name);
if (!strcmp(dir->d_name + path_len - 3, ".py")) {
snprintf(abspath_buf, sizeof(abspath_buf), "%s%s", user_settings->autorun_path, dir->d_name);
FILE *fp = fopen(abspath_buf, "r");
if (fp == NULL) {
snprintf(err_buf, sizeof(err_buf), "Invalid path: %s", abspath_buf);
api_display(err_buf);
continue;
}
run_python(fp, abspath_buf);
fclose(fp);
}
}
closedir(d);
}
#endif /* PYTHON */

43
src/api.h Normal file
View File

@ -0,0 +1,43 @@
/* api.h
*
*
* Copyright (C) 2017 Jakob Kreuze <jakob@memeware.net>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef API_H
#define API_H
#include "friendlist.h"
#include "windows.h"
void api_display(const char *const msg);
FriendsList api_get_friendslist(void);
char *api_get_nick(void);
Tox_User_Status api_get_status(void);
char *api_get_status_message(void);
void api_send(const char *msg);
void api_execute(const char *input, int mode);
int do_plugin_command(int num_args, char (*args)[MAX_STR_SIZE]);
int num_registered_handlers(void);
int help_max_width(void);
void draw_handler_help(WINDOW *win);
void invoke_autoruns(WINDOW *w, ToxWindow *self);
void cmd_run(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
#endif /* API_H */

953
src/audio_call.c Normal file
View File

@ -0,0 +1,953 @@
/* audio_call.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 <http://www.gnu.org/licenses/>.
*
*/
#include "audio_call.h"
#include "audio_device.h"
#include "chat_commands.h"
#include "chat.h"
#include "friendlist.h"
#include "global_commands.h"
#include "line_info.h"
#include "misc_tools.h"
#include "notify.h"
#include "settings.h"
#include "toxic.h"
#include "windows.h"
#ifdef AUDIO
#ifdef VIDEO
#include "video_call.h"
#endif /* VIDEO */
#include <assert.h>
#include <curses.h>
#include <pthread.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#ifdef __APPLE__
#include <OpenAL/al.h>
#include <OpenAL/alc.h>
#else
#include <AL/al.h>
#include <AL/alc.h>
/* compatibility with older versions of OpenAL */
#ifndef ALC_ALL_DEVICES_SPECIFIER
#include <AL/alext.h>
#endif /* ALC_ALL_DEVICES_SPECIFIER */
#endif /* __APPLE__ */
struct CallControl CallControl;
void on_call(ToxAV *av, uint32_t friend_number, bool audio_enabled, bool video_enabled,
void *user_data);
void on_call_state(ToxAV *av, uint32_t friend_number, uint32_t state, void *user_data);
void on_audio_receive_frame(ToxAV *av, uint32_t friend_number, int16_t const *pcm, size_t sample_count,
uint8_t channels, uint32_t sampling_rate, void *user_data);
void callback_recv_invite(Tox *m, uint32_t friend_number);
void callback_recv_ringing(uint32_t friend_number);
void callback_recv_starting(uint32_t friend_number);
void callback_recv_ending(uint32_t friend_number);
void callback_call_started(uint32_t friend_number);
void callback_call_canceled(uint32_t friend_number);
void callback_call_rejected(uint32_t friend_number);
void callback_call_ended(uint32_t friend_number);
void write_device_callback(uint32_t friend_number, const int16_t *PCM, uint16_t sample_count, uint8_t channels,
uint32_t sample_rate);
void audio_bit_rate_callback(ToxAV *av, uint32_t friend_number, uint32_t audio_bit_rate, void *user_data);
static void print_err(ToxWindow *self, const char *error_str)
{
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "%s", error_str);
}
ToxAV *init_audio(ToxWindow *self, Tox *tox)
{
Toxav_Err_New error;
CallControl.audio_errors = ae_None;
CallControl.prompt = self;
CallControl.av = toxav_new(tox, &error);
CallControl.audio_enabled = true;
CallControl.default_audio_bit_rate = 64;
CallControl.audio_sample_rate = 48000;
CallControl.audio_frame_duration = 20;
CallControl.audio_channels = user_settings->chat_audio_channels;
CallControl.video_enabled = false;
CallControl.default_video_bit_rate = 0;
CallControl.video_frame_duration = 0;
if (!CallControl.av) {
CallControl.audio_errors |= ae_StartingCoreAudio;
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to init ToxAV");
return NULL;
}
if (init_devices() == de_InternalError) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to init devices");
toxav_kill(CallControl.av);
return CallControl.av = NULL;
}
toxav_callback_call(CallControl.av, on_call, tox);
toxav_callback_call_state(CallControl.av, on_call_state, NULL);
toxav_callback_audio_receive_frame(CallControl.av, on_audio_receive_frame, NULL);
toxav_callback_audio_bit_rate(CallControl.av, audio_bit_rate_callback, NULL);
return CallControl.av;
}
void read_device_callback(const int16_t *captured, uint32_t size, void *data)
{
UNUSED_VAR(size);
Toxav_Err_Send_Frame error;
uint32_t friend_number = *((uint32_t *)data); /* TODO: Or pass an array of call_idx's */
int64_t sample_count = ((int64_t) CallControl.audio_sample_rate) * \
((int64_t) CallControl.audio_frame_duration) / 1000;
if (sample_count <= 0) {
return;
}
toxav_audio_send_frame(CallControl.av, friend_number,
captured, sample_count,
CallControl.audio_channels,
CallControl.audio_sample_rate, &error);
}
void write_device_callback(uint32_t friend_number, const int16_t *PCM, uint16_t sample_count, uint8_t channels,
uint32_t sample_rate)
{
if (CallControl.calls[friend_number].status == cs_Active) {
write_out(CallControl.calls[friend_number].out_idx, PCM, sample_count, channels, sample_rate);
}
}
bool init_call(Call *call)
{
if (call->status != cs_None) {
return false;
}
*call = (struct Call) {
0
};
call->status = cs_Pending;
call->in_idx = -1;
call->out_idx = -1;
call->audio_bit_rate = CallControl.default_audio_bit_rate;
#ifdef VIDEO
call->vin_idx = -1;
call->vout_idx = -1;
call->video_width = CallControl.default_video_width;
call->video_height = CallControl.default_video_height;
call->video_bit_rate = CallControl.default_video_bit_rate;
#endif /* VIDEO */
return true;
}
static bool cancel_call(Call *call)
{
if (call->status != cs_Pending) {
return false;
}
call->status = cs_None;
return true;
}
static int start_transmission(ToxWindow *self, Call *call)
{
if (!self || !CallControl.av) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to prepare audio transmission");
return -1;
}
DeviceError error = open_input_device(&call->in_idx, read_device_callback, &self->num,
CallControl.audio_sample_rate, CallControl.audio_frame_duration, CallControl.audio_channels);
if (error != de_None) {
if (error == de_FailedStart) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to start audio input device");
}
if (error == de_InternalError) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Internal error with opening audio input device");
}
}
if (open_output_device(&call->out_idx,
CallControl.audio_sample_rate, CallControl.audio_frame_duration, CallControl.audio_channels) != de_None) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to open audio output device!");
}
return 0;
}
static void start_call(ToxWindow *self, Call *call)
{
if (call->status != cs_Pending) {
return;
}
if (start_transmission(self, call) != 0) {
return;
}
call->status = cs_Active;
#ifdef VIDEO
if (call->state & TOXAV_FRIEND_CALL_STATE_SENDING_V) {
callback_recv_video_starting(self->num);
}
if (call->video_bit_rate) {
start_video_transmission(self, CallControl.av, call);
}
#endif
}
static int stop_transmission(Call *call, uint32_t friend_number)
{
if (call->status != cs_Active) {
return -1;
}
call->status = cs_None;
if (call->in_idx != -1) {
close_device(input, call->in_idx);
}
if (call->out_idx != -1) {
close_device(output, call->out_idx);
}
Toxav_Err_Call_Control error = TOXAV_ERR_CALL_CONTROL_OK;
if (call->state > TOXAV_FRIEND_CALL_STATE_FINISHED) {
toxav_call_control(CallControl.av, friend_number, TOXAV_CALL_CONTROL_CANCEL, &error);
}
if (error != TOXAV_ERR_CALL_CONTROL_OK) {
return -1;
}
return 0;
}
void terminate_audio(void)
{
for (int i = 0; i < CallControl.max_calls; ++i) {
stop_transmission(&CallControl.calls[i], i);
}
if (CallControl.av) {
toxav_kill(CallControl.av);
}
terminate_devices();
}
/*
* End of transmission
*/
/*
* Callbacks
*/
void on_call(ToxAV *av, uint32_t friend_number, bool audio_enabled, bool video_enabled, void *user_data)
{
UNUSED_VAR(av);
Tox *m = (Tox *) user_data;
Call *call = &CallControl.calls[friend_number];
init_call(call);
call->state = TOXAV_FRIEND_CALL_STATE_ACCEPTING_A | TOXAV_FRIEND_CALL_STATE_ACCEPTING_V;
if (audio_enabled) {
call->state |= TOXAV_FRIEND_CALL_STATE_SENDING_A;
}
if (video_enabled) {
call->state |= TOXAV_FRIEND_CALL_STATE_SENDING_V;
}
callback_recv_invite(m, friend_number);
}
void on_call_state(ToxAV *av, uint32_t friend_number, uint32_t state, void *user_data)
{
UNUSED_VAR(av);
UNUSED_VAR(user_data);
Call *call = &CallControl.calls[friend_number];
if (call->status == cs_None) {
return;
}
call->state = state;
switch (state) {
case TOXAV_FRIEND_CALL_STATE_ERROR:
case TOXAV_FRIEND_CALL_STATE_FINISHED:
if (state == TOXAV_FRIEND_CALL_STATE_ERROR) {
line_info_add(CallControl.prompt, false, NULL, NULL, SYS_MSG, 0, 0, "ToxAV callstate error!");
}
if (call->status == cs_Pending) {
cancel_call(call);
callback_call_rejected(friend_number);
} else {
#ifdef VIDEO
callback_recv_video_end(friend_number);
callback_video_end(friend_number);
#endif /* VIDEO */
stop_transmission(call, friend_number);
callback_call_ended(friend_number);
}
break;
default:
if (call->status == cs_Pending) {
/* Start answered call */
callback_call_started(friend_number);
}
#ifdef VIDEO
/* Handle receiving client video call states */
if (state & TOXAV_FRIEND_CALL_STATE_SENDING_V) {
callback_recv_video_starting(friend_number);
} else {
callback_recv_video_end(friend_number);
}
#endif /* VIDEO */
break;
}
}
void on_audio_receive_frame(ToxAV *av, uint32_t friend_number,
int16_t const *pcm, size_t sample_count,
uint8_t channels, uint32_t sampling_rate, void *user_data)
{
UNUSED_VAR(av);
UNUSED_VAR(user_data);
write_device_callback(friend_number, pcm, sample_count, channels, sampling_rate);
}
void audio_bit_rate_callback(ToxAV *av, uint32_t friend_number, uint32_t audio_bit_rate, void *user_data)
{
UNUSED_VAR(user_data);
Call *call = &CallControl.calls[friend_number];
call->audio_bit_rate = audio_bit_rate;
toxav_audio_set_bit_rate(av, friend_number, audio_bit_rate, NULL);
}
void callback_recv_invite(Tox *m, uint32_t friend_number)
{
if (friend_number >= Friends.max_idx) {
return;
}
if (Friends.list[friend_number].chatwin == -1) {
if (get_num_active_windows() >= MAX_WINDOWS_NUM) {
return;
}
Friends.list[friend_number].chatwin = add_window(m, new_chat(m, Friends.list[friend_number].num));
}
const Call *call = &CallControl.calls[friend_number];
for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onInvite != NULL && windows[i]->num == friend_number) {
windows[i]->onInvite(windows[i], CallControl.av, friend_number, call->state);
}
}
}
void callback_recv_ringing(uint32_t friend_number)
{
const Call *call = &CallControl.calls[friend_number];
for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onRinging != NULL && windows[i]->num == friend_number) {
windows[i]->onRinging(windows[i], CallControl.av, friend_number, call->state);
}
}
}
void callback_recv_starting(uint32_t friend_number)
{
Call *call = &CallControl.calls[friend_number];
for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onStarting != NULL && windows[i]->num == friend_number) {
windows[i]->onStarting(windows[i], CallControl.av, friend_number, call->state);
start_call(windows[i], call);
}
}
}
void callback_recv_ending(uint32_t friend_number)
{
const Call *call = &CallControl.calls[friend_number];
for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onEnding != NULL && windows[i]->num == friend_number) {
windows[i]->onEnding(windows[i], CallControl.av, friend_number, call->state);
}
}
}
void callback_call_started(uint32_t friend_number)
{
Call *call = &CallControl.calls[friend_number];
for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onStart != NULL && windows[i]->num == friend_number) {
windows[i]->onStart(windows[i], CallControl.av, friend_number, call->state);
start_call(windows[i], call);
}
}
}
void callback_call_canceled(uint32_t friend_number)
{
const Call *call = &CallControl.calls[friend_number];
for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onCancel != NULL && windows[i]->num == friend_number) {
windows[i]->onCancel(windows[i], CallControl.av, friend_number, call->state);
}
}
}
void callback_call_rejected(uint32_t friend_number)
{
const Call *call = &CallControl.calls[friend_number];
for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onReject != NULL && windows[i]->num == friend_number) {
windows[i]->onReject(windows[i], CallControl.av, friend_number, call->state);
}
}
}
void callback_call_ended(uint32_t friend_number)
{
const Call *call = &CallControl.calls[friend_number];
for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onEnd != NULL && windows[i]->num == friend_number) {
windows[i]->onEnd(windows[i], CallControl.av, friend_number, call->state);
}
}
}
/*
* End of Callbacks
*/
/*
* Commands from chat_commands.h
*/
void cmd_call(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
UNUSED_VAR(argv);
if (argc != 0) {
print_err(self, "Unknown arguments.");
return;
}
if (!CallControl.av) {
print_err(self, "ToxAV not supported!");
return;
}
if (!self->stb->connection) {
print_err(self, "Friend is offline.");
return;
}
Call *call = &CallControl.calls[self->num];
if (call->status != cs_None) {
print_err(self, "Already calling.");
return;
}
init_call(call);
place_call(self);
}
void cmd_answer(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
UNUSED_VAR(argv);
Toxav_Err_Answer error;
if (argc != 0) {
print_err(self, "Unknown arguments.");
return;
}
if (!CallControl.av) {
print_err(self, "Audio not supported!");
return;
}
Call *call = &CallControl.calls[self->num];
if (call->status != cs_Pending) {
print_err(self, "No incoming call!");
return;
}
toxav_answer(CallControl.av, self->num, call->audio_bit_rate, call->video_bit_rate, &error);
if (error != TOXAV_ERR_ANSWER_OK) {
if (error == TOXAV_ERR_ANSWER_FRIEND_NOT_CALLING) {
print_err(self, "No incoming call!");
} else if (error == TOXAV_ERR_ANSWER_CODEC_INITIALIZATION) {
print_err(self, "Failed to initialize codecs!");
} else if (error == TOXAV_ERR_ANSWER_FRIEND_NOT_FOUND) {
print_err(self, "Friend not found!");
} else if (error == TOXAV_ERR_ANSWER_INVALID_BIT_RATE) {
print_err(self, "Invalid bit rate!");
} else {
print_err(self, "Internal error!");
}
return;
}
/* Callback will print status... */
callback_recv_starting(self->num);
}
void cmd_reject(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
UNUSED_VAR(argv);
if (argc != 0) {
print_err(self, "Unknown arguments.");
return;
}
if (!CallControl.av) {
print_err(self, "Audio not supported!");
return;
}
Call *call = &CallControl.calls[self->num];
if (call->status != cs_Pending) {
print_err(self, "No incoming call!");
return;
}
/* Manually send a cancel call control because call hasn't started */
toxav_call_control(CallControl.av, self->num, TOXAV_CALL_CONTROL_CANCEL, NULL);
cancel_call(call);
/* Callback will print status... */
callback_call_rejected(self->num);
}
void cmd_hangup(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
UNUSED_VAR(argv);
if (!CallControl.av) {
print_err(self, "Audio not supported!");
return;
}
if (argc != 0) {
print_err(self, "Unknown arguments.");
return;
}
Call *call = &CallControl.calls[self->num];
if (call->status == cs_None) {
print_err(self, "Not in a call.");
return;
}
stop_current_call(self);
}
void cmd_list_devices(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
if (argc != 1) {
if (argc < 1) {
print_err(self, "Type must be specified!");
} else {
print_err(self, "Only one argument allowed!");
}
return;
}
DeviceType type;
if (strcasecmp(argv[1], "in") == 0) { /* Input devices */
type = input;
}
else if (strcasecmp(argv[1], "out") == 0) { /* Output devices */
type = output;
}
else {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]);
return;
}
// Refresh device list.
get_al_device_names();
print_al_devices(self, type);
}
/* This changes primary device only */
void cmd_change_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
if (argc != 2) {
if (argc < 1) {
print_err(self, "Type must be specified!");
} else if (argc < 2) {
print_err(self, "Must have id!");
} else {
print_err(self, "Only two arguments allowed!");
}
return;
}
DeviceType type;
if (strcmp(argv[1], "in") == 0) { /* Input devices */
type = input;
}
else if (strcmp(argv[1], "out") == 0) { /* Output devices */
type = output;
}
else {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]);
return;
}
char *end;
long int selection = strtol(argv[2], &end, 10);
if (*end) {
print_err(self, "Invalid input");
return;
}
if (set_al_device(type, selection) == de_InvalidSelection) {
print_err(self, "Invalid selection!");
return;
}
}
void cmd_mute(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
if (argc != 1) {
print_err(self, "Specify type: \"/mute in\" or \"/mute out\".");
return;
}
DeviceType type;
if (strcasecmp(argv[1], "in") == 0) { /* Input devices */
type = input;
}
else if (strcasecmp(argv[1], "out") == 0) { /* Output devices */
type = output;
}
else {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]);
return;
}
/* If call is active, use this_call values */
Call *this_call = &CallControl.calls[self->num];
if (this_call->status == cs_Active) {
if (type == input) {
device_mute(type, this_call->in_idx);
self->chatwin->infobox.in_is_muted = device_is_muted(type, this_call->in_idx);
} else {
device_mute(type, this_call->out_idx);
self->chatwin->infobox.out_is_muted = device_is_muted(type, this_call->out_idx);
}
}
return;
}
void cmd_sense(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
if (argc != 1) {
if (argc < 1) {
print_err(self, "Must have value!");
} else {
print_err(self, "Only two arguments allowed!");
}
return;
}
char *end;
float value = strtof(argv[1], &end);
if (*end) {
print_err(self, "Invalid input");
return;
}
const Call *call = &CallControl.calls[self->num];
/* Call must be active */
if (call->status == cs_Active) {
device_set_VAD_threshold(call->in_idx, value);
self->chatwin->infobox.vad_lvl = value;
}
return;
}
void cmd_bitrate(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
Call *call = &CallControl.calls[self->num];
if (call->status != cs_Active) {
print_err(self, "Must be in a call");
return;
}
if (argc == 0) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0,
"Current audio encoding bitrate: %u", call->audio_bit_rate);
return;
}
if (argc > 1) {
print_err(self, "Too many arguments.");
return;
}
char *end;
const long int bit_rate = strtol(argv[1], &end, 10);
if (*end || bit_rate < 0 || bit_rate > UINT32_MAX) {
print_err(self, "Invalid input");
return;
}
Toxav_Err_Bit_Rate_Set error;
toxav_audio_set_bit_rate(CallControl.av, self->num, bit_rate, &error);
if (error != TOXAV_ERR_BIT_RATE_SET_OK) {
if (error == TOXAV_ERR_BIT_RATE_SET_SYNC) {
print_err(self, "Synchronization error occured");
} else if (error == TOXAV_ERR_BIT_RATE_SET_INVALID_BIT_RATE) {
print_err(self, "Invalid audio bit rate value (valid is 6-510)");
} else if (error == TOXAV_ERR_BIT_RATE_SET_FRIEND_NOT_FOUND) {
print_err(self, "Friend not found");
} else if (error == TOXAV_ERR_BIT_RATE_SET_FRIEND_NOT_IN_CALL) {
print_err(self, "Friend is not in the call");
} else {
print_err(self, "Unknown error");
}
return;
}
call->audio_bit_rate = bit_rate;
return;
}
void place_call(ToxWindow *self)
{
Call *call = &CallControl.calls[self->num];
if (call->status != cs_Pending) {
return;
}
Toxav_Err_Call error;
toxav_call(CallControl.av, self->num, call->audio_bit_rate, call->video_bit_rate, &error);
if (error != TOXAV_ERR_CALL_OK) {
if (error == TOXAV_ERR_CALL_FRIEND_ALREADY_IN_CALL) {
print_err(self, "Already in a call!");
} else if (error == TOXAV_ERR_CALL_MALLOC) {
print_err(self, "Memory allocation issue");
} else if (error == TOXAV_ERR_CALL_FRIEND_NOT_FOUND) {
print_err(self, "Friend number invalid");
} else if (error == TOXAV_ERR_CALL_FRIEND_NOT_CONNECTED) {
print_err(self, "Friend is valid but not currently connected");
} else {
print_err(self, "Internal error!");
}
cancel_call(call);
return;
}
callback_recv_ringing(self->num);
}
void stop_current_call(ToxWindow *self)
{
Call *call = &CallControl.calls[self->num];
if (call->status == cs_Pending) {
toxav_call_control(CallControl.av, self->num, TOXAV_CALL_CONTROL_CANCEL, NULL);
cancel_call(call);
callback_call_canceled(self->num);
} else {
#ifdef VIDEO
callback_recv_video_end(self->num);
callback_video_end(self->num);
#endif /* VIDEO */
stop_transmission(call, self->num);
callback_call_ended(self->num);
}
}
/**
* Reallocates the Calls list according to n.
*/
static void realloc_calls(uint32_t n)
{
if (n == 0) {
free(CallControl.calls);
CallControl.calls = NULL;
return;
}
Call *temp = realloc(CallControl.calls, n * sizeof(Call));
if (temp == NULL) {
exit_toxic_err("failed in realloc_calls", FATALERR_MEMORY);
}
CallControl.calls = temp;
}
/**
* Inits the call structure for a given friend. Called when a friend is added to the friends list.
* Index must be equivalent to the friend's friendlist index.
*/
void init_friend_AV(uint32_t index)
{
if (index == CallControl.max_calls) {
realloc_calls(CallControl.max_calls + 1);
CallControl.calls[CallControl.max_calls] = (Call) {
0
};
++CallControl.max_calls;
}
}
/**
* Deletes a call structure from the Calls list. Called when a friend is deleted from the friends list.
* Index must be equivalent to the size of the Calls list.
*/
void del_friend_AV(uint32_t index)
{
realloc_calls(index);
CallControl.max_calls = index;
}
#endif /* AUDIO */

109
src/audio_call.h Normal file
View File

@ -0,0 +1,109 @@
/* audio_call.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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef AUDIO_CALL_H
#define AUDIO_CALL_H
#include <tox/toxav.h>
#include "audio_device.h"
typedef enum AudioError {
ae_None = 0,
ae_StartingCaptureDevice = 1 << 0,
ae_StartingOutputDevice = 1 << 1,
ae_StartingCoreAudio = 1 << 2
} AudioError;
#ifdef VIDEO
typedef enum VideoError {
ve_None = 0,
ve_StartingCaptureDevice = 1 << 0,
ve_StartingOutputDevice = 1 << 1,
ve_StartingCoreVideo = 1 << 2
} VideoError;
#endif /* VIDEO */
/* Status transitions:
* None -> Pending (call invitation made or received);
* Pending -> None (invitation rejected or failed);
* Pending -> Active (call starts);
* Active -> None (call ends).
*/
typedef enum CallStatus {
cs_None = 0,
cs_Pending,
cs_Active
} CallStatus;
typedef struct Call {
CallStatus status;
uint32_t state; /* ToxAV call state, valid when `status == cs_Active` */
uint32_t in_idx, out_idx; /* Audio device index, or -1 if not open */
uint32_t audio_bit_rate; /* Bit rate for sending audio */
uint32_t vin_idx, vout_idx; /* Video device index, or -1 if not open */
uint32_t video_width, video_height;
uint32_t video_bit_rate; /* Bit rate for sending video; 0 for no video */
} Call;
struct CallControl {
AudioError audio_errors;
#ifdef VIDEO
VideoError video_errors;
#endif /* VIDEO */
ToxAV *av;
ToxWindow *prompt;
Call *calls;
uint32_t max_calls;
bool audio_enabled;
bool video_enabled;
int32_t audio_frame_duration;
uint32_t audio_sample_rate;
uint8_t audio_channels;
uint32_t default_audio_bit_rate;
int32_t video_frame_duration;
uint32_t default_video_width, default_video_height;
uint32_t default_video_bit_rate;
};
extern struct CallControl CallControl;
/* You will have to pass pointer to first member of 'windows' declared in windows.c */
ToxAV *init_audio(ToxWindow *self, Tox *tox);
void terminate_audio(void);
bool init_call(Call *call);
void place_call(ToxWindow *self);
void stop_current_call(ToxWindow *self);
void init_friend_AV(uint32_t index);
void del_friend_AV(uint32_t index);
#endif /* AUDIO_CALL_H */

788
src/audio_device.c Normal file
View File

@ -0,0 +1,788 @@
/* audio_device.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 <http://www.gnu.org/licenses/>.
*
*/
#include "audio_device.h"
#include "line_info.h"
#include "misc_tools.h"
#include "settings.h"
#include <AL/al.h>
#include <AL/alc.h>
/* compatibility with older versions of OpenAL */
#ifndef ALC_ALL_DEVICES_SPECIFIER
#include <AL/alext.h>
#endif /* ALC_ALL_DEVICES_SPECIFIER */
#include <assert.h>
#include <math.h>
#include <pthread.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
extern struct user_settings *user_settings;
extern struct Winthread Winthread;
typedef struct FrameInfo {
uint32_t samples_per_frame;
uint32_t sample_rate;
bool stereo;
} FrameInfo;
/* A virtual input/output device, abstracting the currently selected openal
* device (which may change during the lifetime of the virtual device).
* We refer to a virtual device as a "device", and refer to an underlying
* openal device as an "al_device".
* Multiple virtual devices may be open at once; the callback of each virtual
* input device has data captured from the input al_device passed to it, and
* each virtual output device acts as a source for the output al_device.
*/
typedef struct Device {
bool active;
bool muted;
FrameInfo frame_info;
// used only by input devices:
DataHandleCallback cb;
void *cb_data;
float VAD_threshold;
uint32_t VAD_samples_remaining;
// used only by output devices:
uint32_t source;
uint32_t buffers[OPENAL_BUFS];
bool source_open;
} Device;
typedef struct AudioState {
ALCdevice *al_device[2];
Device devices[2][MAX_DEVICES];
uint32_t num_devices[2];
FrameInfo capture_frame_info;
float input_volume;
// mutexes to prevent changes to input resp. output devices and al_devices
// during poll_input iterations resp. calls to write_out;
// mutex[input] also used to lock input_volume which poll_input writes to.
pthread_mutex_t mutex[2];
// TODO: unused
const char *default_al_device_name[2]; /* Default devices */
const char *al_device_names[2][MAX_OPENAL_DEVICES]; /* Available devices */
uint32_t num_al_devices[2];
char *current_al_device_name[2];
} AudioState;
static AudioState *audio_state;
static void lock(DeviceType type)
{
pthread_mutex_lock(&audio_state->mutex[type]);
}
static void unlock(DeviceType type)
{
pthread_mutex_unlock(&audio_state->mutex[type]);
}
static bool thread_running = true,
thread_paused = true; /* Thread control */
#ifdef AUDIO
static void *poll_input(void *);
#endif
static uint32_t sound_mode(bool stereo)
{
return stereo ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16;
}
static uint32_t sample_size(bool stereo)
{
return stereo ? 4 : 2;
}
DeviceError init_devices(void)
{
audio_state = calloc(1, sizeof(AudioState));
if (audio_state == NULL) {
return de_InternalError;
}
get_al_device_names();
for (DeviceType type = input; type <= output; ++type) {
audio_state->al_device[type] = NULL;
if (pthread_mutex_init(&audio_state->mutex[type], NULL) != 0) {
return de_InternalError;
}
}
#ifdef AUDIO
// Start poll thread
pthread_t thread_id;
if (pthread_create(&thread_id, NULL, poll_input, NULL) != 0
|| pthread_detach(thread_id) != 0) {
return de_InternalError;
}
#endif
return de_None;
}
DeviceError terminate_devices(void)
{
lock(input);
thread_running = false;
unlock(input);
sleep_thread(20000L);
for (DeviceType type = input; type <= output; ++type) {
if (pthread_mutex_destroy(&audio_state->mutex[type]) != 0) {
return de_InternalError;
}
if (audio_state->current_al_device_name[type] != NULL) {
free(audio_state->current_al_device_name[type]);
}
}
free(audio_state);
return de_None;
}
void get_al_device_names(void)
{
const char *stringed_device_list;
for (DeviceType type = input; type <= output; ++type) {
audio_state->num_al_devices[type] = 0;
if (type == input) {
stringed_device_list = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER);
} else {
if (alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT") != AL_FALSE) {
stringed_device_list = alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER);
} else {
stringed_device_list = alcGetString(NULL, ALC_DEVICE_SPECIFIER);
}
}
if (stringed_device_list != NULL) {
audio_state->default_al_device_name[type] = alcGetString(NULL,
type == input ? ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER : ALC_DEFAULT_DEVICE_SPECIFIER);
for (; *stringed_device_list != '\0'
&& audio_state->num_al_devices[type] < MAX_OPENAL_DEVICES; ++audio_state->num_al_devices[type]) {
audio_state->al_device_names[type][audio_state->num_al_devices[type]] = stringed_device_list;
stringed_device_list += strlen(stringed_device_list) + 1;
}
}
}
}
DeviceError device_mute(DeviceType type, uint32_t device_idx)
{
if (device_idx >= MAX_DEVICES) {
return de_InvalidSelection;
}
Device *device = &audio_state->devices[type][device_idx];
if (!device->active) {
return de_DeviceNotActive;
}
lock(type);
device->muted = !device->muted;
unlock(type);
return de_None;
}
bool device_is_muted(DeviceType type, uint32_t device_idx)
{
if (device_idx >= MAX_DEVICES) {
return false;
}
Device *device = &audio_state->devices[type][device_idx];
if (!device->active) {
return false;
}
return device->muted;
}
DeviceError device_set_VAD_threshold(uint32_t device_idx, float value)
{
if (device_idx >= MAX_DEVICES) {
return de_InvalidSelection;
}
Device *device = &audio_state->devices[input][device_idx];
if (!device->active) {
return de_DeviceNotActive;
}
if (value <= 0.0f) {
value = 0.0f;
}
lock(input);
device->VAD_threshold = value;
unlock(input);
return de_None;
}
float device_get_VAD_threshold(uint32_t device_idx)
{
if (device_idx >= MAX_DEVICES) {
return 0.0;
}
Device *device = &audio_state->devices[input][device_idx];
if (!device->active) {
return 0.0;
}
return device->VAD_threshold;
}
DeviceError set_source_position(uint32_t device_idx, float x, float y, float z)
{
if (device_idx >= MAX_DEVICES) {
return de_InvalidSelection;
}
Device *device = &audio_state->devices[output][device_idx];
if (!device->active) {
return de_DeviceNotActive;
}
lock(output);
alSource3f(device->source, AL_POSITION, x, y, z);
unlock(output);
if (!audio_state->al_device[output] || alcGetError(audio_state->al_device[output]) != AL_NO_ERROR) {
return de_AlError;
}
return de_None;
}
static DeviceError close_al_device(DeviceType type)
{
if (audio_state->al_device[type] == NULL) {
return de_None;
}
if (type == input) {
if (!alcCaptureCloseDevice(audio_state->al_device[type])) {
return de_AlError;
}
thread_paused = true;
} else {
ALCcontext *context = alcGetCurrentContext();
alcMakeContextCurrent(NULL);
alcDestroyContext(context);
if (!alcCloseDevice(audio_state->al_device[type])) {
return de_AlError;
}
}
audio_state->al_device[type] = NULL;
return de_None;
}
static DeviceError open_al_device(DeviceType type, FrameInfo frame_info)
{
audio_state->al_device[type] = type == input
? alcCaptureOpenDevice(audio_state->current_al_device_name[type],
frame_info.sample_rate, sound_mode(frame_info.stereo), frame_info.samples_per_frame * 2)
: alcOpenDevice(audio_state->current_al_device_name[type]);
if (audio_state->al_device[type] == NULL) {
return de_FailedStart;
}
if (type == input) {
alcCaptureStart(audio_state->al_device[type]);
thread_paused = false;
audio_state->capture_frame_info = frame_info;
} else {
alcMakeContextCurrent(alcCreateContext(audio_state->al_device[type], NULL));
}
if (alcGetError(audio_state->al_device[type]) != AL_NO_ERROR) {
close_al_device(type);
return de_AlError;
}
return de_None;
}
static void close_source(Device *device)
{
if (device->source_open) {
alDeleteSources(1, &device->source);
alDeleteBuffers(OPENAL_BUFS, device->buffers);
device->source_open = false;
}
}
static DeviceError open_source(Device *device)
{
alGenBuffers(OPENAL_BUFS, device->buffers);
if (alcGetError(audio_state->al_device[output]) != AL_NO_ERROR) {
return de_FailedStart;
}
alGenSources((uint32_t)1, &device->source);
if (alcGetError(audio_state->al_device[output]) != AL_NO_ERROR) {
alDeleteBuffers(OPENAL_BUFS, device->buffers);
return de_FailedStart;
}
device->source_open = true;
alSourcei(device->source, AL_LOOPING, AL_FALSE);
const uint32_t frame_size = device->frame_info.samples_per_frame * sample_size(device->frame_info.stereo);
size_t zeros_size = frame_size * sizeof(uint16_t);
uint16_t *zeros = calloc(1, zeros_size);
if (zeros == NULL) {
close_source(device);
return de_FailedStart;
}
for (int i = 0; i < OPENAL_BUFS; ++i) {
alBufferData(device->buffers[i], sound_mode(device->frame_info.stereo), zeros,
zeros_size, device->frame_info.sample_rate);
}
free(zeros);
alSourceQueueBuffers(device->source, OPENAL_BUFS, device->buffers);
alSourcePlay(device->source);
if (alcGetError(audio_state->al_device[output]) != AL_NO_ERROR) {
close_source(device);
return de_FailedStart;
}
return de_None;
}
DeviceError set_al_device(DeviceType type, int32_t selection)
{
if (audio_state->num_al_devices[type] <= selection || selection < 0) {
return de_InvalidSelection;
}
const char *name = audio_state->al_device_names[type][selection];
char **cur_name = &audio_state->current_al_device_name[type];
if (*cur_name != NULL) {
free(*cur_name);
}
*cur_name = malloc(strlen(name) + 1);
if (*cur_name == NULL) {
return de_InternalError;
}
strcpy(*cur_name, name);
if (audio_state->num_devices[type] > 0) {
// close any existing al_device and try to open new one, reopening existing sources
lock(type);
if (type == output) {
for (int i = 0; i < MAX_DEVICES; i++) {
Device *device = &audio_state->devices[type][i];
if (device->active) {
close_source(device);
}
}
}
close_al_device(type);
DeviceError err = open_al_device(type, audio_state->capture_frame_info);
if (err != de_None) {
unlock(type);
return err;
}
if (type == output) {
for (int i = 0; i < MAX_DEVICES; i++) {
Device *device = &audio_state->devices[type][i];
if (device->active) {
open_source(device);
}
}
}
unlock(type);
}
return de_None;
}
static DeviceError open_device(DeviceType type, uint32_t *device_idx, DataHandleCallback cb, void *cb_data,
uint32_t sample_rate, uint32_t frame_duration, uint8_t channels)
{
if (channels != 1 && channels != 2) {
return de_UnsupportedMode;
}
const uint32_t samples_per_frame = (sample_rate * frame_duration / 1000);
FrameInfo frame_info = {samples_per_frame, sample_rate, channels == 2};
uint32_t i;
for (i = 0; i < MAX_DEVICES && audio_state->devices[type][i].active; ++i);
if (i == MAX_DEVICES) {
return de_AllDevicesBusy;
}
*device_idx = i;
lock(type);
if (audio_state->al_device[type] == NULL) {
DeviceError err = open_al_device(type, frame_info);
if (err != de_None) {
unlock(type);
return err;
}
} else if (type == input) {
// Use previously set frame info on existing capture device
frame_info = audio_state->capture_frame_info;
}
Device *device = &audio_state->devices[type][i];
device->active = true;
++audio_state->num_devices[type];
device->muted = false;
device->frame_info = frame_info;
if (type == input) {
device->cb = cb;
device->cb_data = cb_data;
#ifdef AUDIO
if (user_settings->VAD_threshold >= 0.0) {
device->VAD_threshold = user_settings->VAD_threshold;
}
#else
device->VAD_threshold = 0.0f;
#endif
} else {
if (open_source(device) != de_None) {
device->active = false;
--audio_state->num_devices[type];
unlock(type);
return de_FailedStart;
}
}
unlock(type);
return de_None;
}
DeviceError open_input_device(uint32_t *device_idx, DataHandleCallback cb, void *cb_data, uint32_t sample_rate,
uint32_t frame_duration, uint8_t channels)
{
return open_device(input, device_idx, cb, cb_data, sample_rate, frame_duration, channels);
}
DeviceError open_output_device(uint32_t *device_idx, uint32_t sample_rate, uint32_t frame_duration, uint8_t channels)
{
return open_device(output, device_idx, 0, 0, sample_rate, frame_duration, channels);
}
DeviceError close_device(DeviceType type, uint32_t device_idx)
{
if (device_idx >= MAX_DEVICES) {
return de_InvalidSelection;
}
lock(type);
Device *device = &audio_state->devices[type][device_idx];
if (!device->active) {
unlock(type);
return de_DeviceNotActive;
}
if (type == output) {
close_source(device);
}
device->active = false;
--audio_state->num_devices[type];
DeviceError err = de_None;
if (audio_state->num_devices[type] == 0) {
err = close_al_device(type);
}
unlock(type);
return err;
}
DeviceError write_out(uint32_t device_idx, const int16_t *data, uint32_t sample_count, uint8_t channels,
uint32_t sample_rate)
{
if (device_idx >= MAX_DEVICES) {
return de_InvalidSelection;
}
lock(output);
Device *device = &audio_state->devices[output][device_idx];
if (!device->active || device->muted) {
unlock(output);
return de_DeviceNotActive;
}
ALuint bufid;
ALint processed, queued;
alGetSourcei(device->source, AL_BUFFERS_PROCESSED, &processed);
alGetSourcei(device->source, AL_BUFFERS_QUEUED, &queued);
if (audio_state->al_device[output] == NULL || alcGetError(audio_state->al_device[output]) != AL_NO_ERROR) {
unlock(output);
return de_AlError;
}
if (processed) {
ALuint *bufids = malloc(processed * sizeof(ALuint));
if (bufids == NULL) {
unlock(output);
return de_InternalError;
}
alSourceUnqueueBuffers(device->source, processed, bufids);
alDeleteBuffers(processed - 1, bufids + 1);
bufid = bufids[0];
free(bufids);
} else if (queued < 16) {
alGenBuffers(1, &bufid);
} else {
unlock(output);
return de_Busy;
}
const bool stereo = channels == 2;
alBufferData(bufid, sound_mode(stereo), data,
sample_count * sample_size(stereo),
sample_rate);
alSourceQueueBuffers(device->source, 1, &bufid);
ALint state;
alGetSourcei(device->source, AL_SOURCE_STATE, &state);
if (state != AL_PLAYING) {
alSourcePlay(device->source);
}
unlock(output);
return de_None;
}
#ifdef AUDIO
/* Adapted from qtox,
* Copyright © 2014-2019 by The qTox Project Contributors
*
* return normalized volume of buffer in range 0.0-100.0
*/
float volume(int16_t *frame, uint32_t samples)
{
float sum_of_squares = 0;
for (uint32_t i = 0; i < samples; i++) {
const float sample = (float)(frame[i]) / INT16_MAX;
sum_of_squares += powf(sample, 2);
}
const float root_mean_square = sqrtf(sum_of_squares / samples);
const float root_two = 1.414213562;
// normalizedVolume == 1.0 corresponds to a sine wave of maximal amplitude
const float normalized_volume = root_mean_square * root_two;
return 100.0f * fminf(1.0f, normalized_volume);
}
// Time in ms for which we continue to capture audio after VAD is triggered:
#define VAD_TIME 250
#define FRAME_BUF_SIZE 16000
static void *poll_input(void *arg)
{
UNUSED_VAR(arg);
int16_t *frame_buf = malloc(FRAME_BUF_SIZE * sizeof(int16_t));
if (frame_buf == NULL) {
exit_toxic_err("failed in thread_poll", FATALERR_MEMORY);
}
while (1) {
lock(input);
if (!thread_running) {
free(frame_buf);
unlock(input);
break;
}
if (thread_paused) {
unlock(input);
sleep_thread(10000L);
continue;
}
if (audio_state->al_device[input] != NULL) {
int32_t available_samples;
alcGetIntegerv(audio_state->al_device[input], ALC_CAPTURE_SAMPLES, sizeof(int32_t), &available_samples);
const uint32_t f_size = audio_state->capture_frame_info.samples_per_frame;
if (available_samples >= f_size && f_size <= FRAME_BUF_SIZE) {
alcCaptureSamples(audio_state->al_device[input], frame_buf, f_size);
unlock(input);
pthread_mutex_lock(&Winthread.lock);
lock(input);
float frame_volume = volume(frame_buf, f_size);
audio_state->input_volume = frame_volume;
for (int i = 0; i < MAX_DEVICES; i++) {
Device *device = &audio_state->devices[input][i];
if (device->VAD_threshold != 0.0f) {
if (frame_volume >= device->VAD_threshold) {
device->VAD_samples_remaining = VAD_TIME * (audio_state->capture_frame_info.sample_rate / 1000);
} else if (device->VAD_samples_remaining < f_size) {
continue;
} else {
device->VAD_samples_remaining -= f_size;
}
}
if (device->active && !device->muted && device->cb) {
device->cb(frame_buf, f_size, device->cb_data);
}
}
pthread_mutex_unlock(&Winthread.lock);
}
}
unlock(input);
sleep_thread(5000L);
}
pthread_exit(NULL);
}
#endif
float get_input_volume(void)
{
float ret = 0.0f;
if (audio_state->al_device[input] != NULL) {
lock(input);
ret = audio_state->input_volume;
unlock(input);
}
return ret;
}
void print_al_devices(ToxWindow *self, DeviceType type)
{
for (int i = 0; i < audio_state->num_al_devices[type]; ++i) {
line_info_add(self, false, NULL, NULL, SYS_MSG,
audio_state->current_al_device_name[type]
&& strcmp(audio_state->current_al_device_name[type], audio_state->al_device_names[type][i]) == 0 ? 1 : 0,
0, "%d: %s", i, audio_state->al_device_names[type][i]);
}
return;
}
DeviceError selection_valid(DeviceType type, int32_t selection)
{
return (audio_state->num_al_devices[type] <= selection || selection < 0) ? de_InvalidSelection : de_None;
}

95
src/audio_device.h Normal file
View File

@ -0,0 +1,95 @@
/* audio_device.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 <http://www.gnu.org/licenses/>.
*
*/
/*
* You can have multiple sources (Input devices) but only one output device.
* Pass buffers to output device via write();
* Read from running input device(s) via select()/callback combo.
*/
#ifndef AUDIO_DEVICE_H
#define AUDIO_DEVICE_H
#define OPENAL_BUFS 5
#define MAX_OPENAL_DEVICES 32
#define MAX_DEVICES 32
#include "windows.h"
typedef enum DeviceType {
input,
output,
} DeviceType;
typedef enum DeviceError {
de_None,
de_InternalError = -1,
de_InvalidSelection = -2,
de_FailedStart = -3,
de_Busy = -4,
de_AllDevicesBusy = -5,
de_DeviceNotActive = -6,
de_BufferError = -7,
de_UnsupportedMode = -8,
de_AlError = -9,
} DeviceError;
typedef void (*DataHandleCallback)(const int16_t *, uint32_t size, void *data);
DeviceError init_devices(void);
void get_al_device_names(void);
DeviceError terminate_devices(void);
/* toggle device mute */
DeviceError device_mute(DeviceType type, uint32_t device_idx);
bool device_is_muted(DeviceType type, uint32_t device_idx);
DeviceError device_set_VAD_threshold(uint32_t device_idx, float value);
float device_get_VAD_threshold(uint32_t device_idx);
DeviceError set_source_position(uint32_t device_idx, float x, float y, float z);
DeviceError set_al_device(DeviceType type, int32_t selection);
/* Start device */
DeviceError open_input_device(uint32_t *device_idx, DataHandleCallback cb, void *cb_data,
uint32_t sample_rate, uint32_t frame_duration, uint8_t channels);
DeviceError open_output_device(uint32_t *device_idx, uint32_t sample_rate, uint32_t frame_duration, uint8_t channels);
/* Stop device */
DeviceError close_device(DeviceType type, uint32_t device_idx);
/* Write data to output device */
DeviceError write_out(uint32_t device_idx, const int16_t *data, uint32_t length, uint8_t channels,
uint32_t sample_rate);
/* return current input volume as float in range 0.0-100.0 */
float get_input_volume(void);
void print_al_devices(ToxWindow *self, DeviceType type);
DeviceError selection_valid(DeviceType type, int32_t selection);
#endif /* AUDIO_DEVICE_H */

393
src/autocomplete.c Normal file
View File

@ -0,0 +1,393 @@
/* autocomplete.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 <http://www.gnu.org/licenses/>.
*
*/
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#ifdef __APPLE__
#include <sys/types.h>
#include <sys/dir.h>
#else
#include <dirent.h>
#endif /* __APPLE__ */
#include "configdir.h"
#include "execute.h"
#include "line_info.h"
#include "misc_tools.h"
#include "toxic.h"
#include "windows.h"
static void print_ac_matches(ToxWindow *self, Tox *m, char **list, size_t n_matches)
{
if (m) {
execute(self->chatwin->history, self, m, "/clear", GLOBAL_COMMAND_MODE);
}
for (size_t i = 0; i < n_matches; ++i) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "%s", list[i]);
}
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "");
}
/* puts match in match buffer. if more than one match, add first n chars that are identical.
* e.g. if matches contains: [foo, foobar, foe] we put fo in match.
*
* Returns the length of the match.
*/
static size_t get_str_match(ToxWindow *self, char *match, size_t match_sz, const char *const *matches, size_t n_items,
size_t max_size)
{
UNUSED_VAR(self);
if (n_items == 1) {
return snprintf(match, match_sz, "%s", matches[0]);
}
for (size_t i = 0; i < max_size; ++i) {
char ch1 = matches[0][i];
for (size_t j = 0; j < n_items; ++j) {
char ch2 = matches[j][i];
if (ch1 != ch2 || !ch1) {
snprintf(match, match_sz, "%s", matches[0]);
match[i] = '\0';
return i;
}
}
}
return snprintf(match, match_sz, "%s", matches[0]);
}
/*
* Looks for all instances in list that begin with the last entered word in line according to pos,
* then fills line with the complete word. e.g. "Hello jo" would complete the line
* with "Hello john". If multiple matches, prints out all the matches and semi-completes line.
*
* `list` is a pointer to `n_items` strings. Each string in the list must be <= MAX_STR_SIZE.
*
* dir_search should be true if the line being completed is a file path.
*
* Returns the difference between the old len and new len of line on success.
* Returns -1 on error.
*
* Note: This function should not be called directly. Use complete_line() and complete_path() instead.
*/
static int complete_line_helper(ToxWindow *self, const char *const *list, const size_t n_items, bool dir_search)
{
ChatContext *ctx = self->chatwin;
if (ctx->pos <= 0 || ctx->len <= 0 || ctx->pos > ctx->len) {
return -1;
}
if (ctx->len >= MAX_STR_SIZE) {
return -1;
}
const char *endchrs = " ";
char ubuf[MAX_STR_SIZE];
/* work with multibyte string copy of buf for simplicity */
if (wcs_to_mbs_buf(ubuf, ctx->line, sizeof(ubuf)) == -1) {
return -1;
}
/* isolate substring from space behind pos to pos */
char tmp[MAX_STR_SIZE];
memcpy(tmp, ubuf, ctx->pos);
tmp[ctx->pos] = 0;
const char *s = dir_search ? strchr(tmp, ' ') : strrchr(tmp, ' ');
char *sub = calloc(1, strlen(ubuf) + 1);
if (sub == NULL) {
exit_toxic_err("failed in complete_line_helper", FATALERR_MEMORY);
}
if (!s && !dir_search) {
strcpy(sub, tmp);
if (sub[0] != '/') {
endchrs = ": ";
}
} else if (s) {
strcpy(sub, &s[1]);
if (dir_search) {
int sub_len = strlen(sub);
int si = char_rfind(sub, '/', sub_len);
if (si || *sub == '/') {
memmove(sub, &sub[si + 1], sub_len - si);
}
}
}
if (!sub[0] && !(dir_search && n_items == 1)) {
free(sub);
return 0;
}
int s_len = strlen(sub);
size_t n_matches = 0;
char **matches = (char **) malloc_ptr_array(n_items, MAX_STR_SIZE);
if (matches == NULL) {
free(sub);
return -1;
}
/* put all list matches in matches array */
for (size_t i = 0; i < n_items; ++i) {
if (strncmp(list[i], sub, s_len) == 0) {
snprintf(matches[n_matches++], MAX_STR_SIZE, "%s", list[i]);
}
}
free(sub);
if (!n_matches) {
free_ptr_array((void **) matches);
return -1;
}
if (!dir_search && n_matches > 1) {
print_ac_matches(self, NULL, matches, n_matches);
}
char match[MAX_STR_SIZE];
size_t match_len = get_str_match(self, match, sizeof(match), (const char *const *) matches, n_matches, MAX_STR_SIZE);
free_ptr_array((void **) matches);
if (match_len == 0) {
return 0;
}
if (dir_search) {
if (n_matches == 1) {
endchrs = char_rfind(match, '.', match_len) ? "" : "/";
} else {
endchrs = "";
}
} else if (n_matches > 1) {
endchrs = "";
}
/* put match in correct spot in buf and append endchars */
int n_endchrs = strlen(endchrs);
int strt = ctx->pos - s_len;
int diff = match_len - s_len + n_endchrs;
if (ctx->len + diff >= MAX_STR_SIZE) {
return -1;
}
char tmpend[MAX_STR_SIZE];
snprintf(tmpend, sizeof(tmpend), "%s", &ubuf[ctx->pos]);
if (match_len + n_endchrs + strlen(tmpend) >= sizeof(ubuf)) {
return -1;
}
strcpy(&ubuf[strt], match);
/* If path points to a file with no extension don't append a forward slash */
if (dir_search && *endchrs == '/') {
const char *path_start = strchr(ubuf + 1, '/');
if (!path_start) {
path_start = strchr(ubuf + 1, ' ');
if (!path_start) {
return -1;
}
}
if (strlen(path_start) < 2) {
return -1;
}
++path_start;
if (file_type(path_start) == FILE_TYPE_REGULAR) {
endchrs = "";
diff -= n_endchrs;
}
}
strcpy(&ubuf[strt + match_len], endchrs);
strcpy(&ubuf[strt + match_len + n_endchrs], tmpend);
/* convert to widechar and copy back to original buf */
wchar_t newbuf[MAX_STR_SIZE];
if (mbs_to_wcs_buf(newbuf, ubuf, sizeof(newbuf) / sizeof(wchar_t)) == -1) {
return -1;
}
wcscpy(ctx->line, newbuf);
ctx->len += diff;
ctx->pos += diff;
return diff;
}
int complete_line(ToxWindow *self, const char *const *list, size_t n_items)
{
return complete_line_helper(self, list, n_items, false);
}
static int complete_path(ToxWindow *self, const char *const *list, const size_t n_items)
{
return complete_line_helper(self, list, n_items, true);
}
/* Transforms a tab complete starting with the shorthand "~" into the full home directory. */
static void complete_home_dir(ToxWindow *self, char *path, int pathsize, const char *cmd, int cmdlen)
{
ChatContext *ctx = self->chatwin;
char homedir[MAX_STR_SIZE] = {0};
get_home_dir(homedir, sizeof(homedir));
char newline[MAX_STR_SIZE + 1];
snprintf(newline, sizeof(newline), "%s %s%s", cmd, homedir, path + 1);
snprintf(path, pathsize, "%s", &newline[cmdlen - 1]);
wchar_t wline[MAX_STR_SIZE];
if (mbs_to_wcs_buf(wline, newline, sizeof(wline) / sizeof(wchar_t)) == -1) {
return;
}
int newlen = wcslen(wline);
if (ctx->len + newlen >= MAX_STR_SIZE) {
return;
}
wmemcpy(ctx->line, wline, newlen + 1);
ctx->pos = newlen;
ctx->len = ctx->pos;
}
/*
* Return true if the first `p_len` chars in `s` are equal to `p` and `s` is a valid directory name.
*/
static bool is_partial_match(const char *s, const char *p, size_t p_len)
{
if (s == NULL || p == NULL) {
return false;
}
return strncmp(s, p, p_len) == 0 && strcmp(".", s) != 0 && strcmp("..", s) != 0;
}
/* Attempts to match /command "<incomplete-dir>" line to matching directories.
* If there is only one match the line is auto-completed.
*
* Returns the diff between old len and new len of ctx->line on success.
* Returns -1 if no matches or more than one match.
*/
#define MAX_DIRS 75
int dir_match(ToxWindow *self, Tox *m, const wchar_t *line, const wchar_t *cmd)
{
char b_path[MAX_STR_SIZE + 1];
char b_name[MAX_STR_SIZE + 1];
char b_cmd[MAX_STR_SIZE];
const wchar_t *tmpline = &line[wcslen(cmd) + 1]; /* start after "/command " */
if (wcs_to_mbs_buf(b_path, tmpline, sizeof(b_path) - 1) == -1) {
return -1;
}
if (wcs_to_mbs_buf(b_cmd, cmd, sizeof(b_cmd)) == -1) {
return -1;
}
if (b_path[0] == '~') {
complete_home_dir(self, b_path, sizeof(b_path) - 1, b_cmd, strlen(b_cmd) + 2);
}
int si = char_rfind(b_path, '/', strlen(b_path));
if (!b_path[0]) { /* list everything in pwd */
b_path[0] = '.';
b_path[1] = '\0';
} else if (!si && b_path[0] != '/') { /* look for matches in pwd */
memmove(b_path + 1, b_path, sizeof(b_path) - 1);
b_path[0] = '.';
}
snprintf(b_name, sizeof(b_name), "%s", &b_path[si + 1]);
b_path[si + 1] = '\0';
size_t b_name_len = strlen(b_name);
DIR *dp = opendir(b_path);
if (dp == NULL) {
return -1;
}
char **dirnames = (char **) malloc_ptr_array(MAX_DIRS, NAME_MAX + 1);
if (dirnames == NULL) {
closedir(dp);
return -1;
}
struct dirent *entry;
int dircount = 0;
while ((entry = readdir(dp)) && dircount < MAX_DIRS) {
if (is_partial_match(entry->d_name, b_name, b_name_len)) {
snprintf(dirnames[dircount], NAME_MAX + 1, "%s", entry->d_name);
++dircount;
}
}
closedir(dp);
if (dircount == 0) {
free_ptr_array((void **) dirnames);
return -1;
}
if (dircount > 1) {
qsort(dirnames, dircount, sizeof(char *), qsort_ptr_char_array_helper);
print_ac_matches(self, m, dirnames, dircount);
}
int ret = complete_path(self, (const char *const *) dirnames, dircount);
free_ptr_array((void **) dirnames);
return ret;
}

52
src/autocomplete.h Normal file
View File

@ -0,0 +1,52 @@
/* autocomplete.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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef AUTOCOMPLETE_H
#define AUTOCOMPLETE_H
#include "windows.h"
/*
* Looks for all instances in list that begin with the last entered word in line according to pos,
* then fills line with the complete word. e.g. "Hello jo" would complete the line
* with "Hello john". If multiple matches, prints out all the matches and semi-completes line.
*
* `list` is a pointer to `n_items` strings.
*
* dir_search should be true if the line being completed is a file path.
*
* Returns the difference between the old len and new len of line on success.
* Returns -1 on error.
*
* Note: This function should not be called directly. Use complete_line() and complete_path() instead.
*/
int complete_line(ToxWindow *self, const char **list, size_t n_items);
/* Attempts to match /command "<incomplete-dir>" line to matching directories.
* If there is only one match the line is auto-completed.
*
* Returns the diff between old len and new len of ctx->line on success.
* Returns -1 if no matches or more than one match.
*/
int dir_match(ToxWindow *self, Tox *m, const wchar_t *line, const wchar_t *cmd);
#endif /* AUTOCOMPLETE_H */

262
src/avatars.c Normal file
View File

@ -0,0 +1,262 @@
/* avatars.c
*
*
* Copyright (C) 2015 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 <http://www.gnu.org/licenses/>.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "avatars.h"
#include "file_transfers.h"
#include "friendlist.h"
#include "misc_tools.h"
extern FriendsList Friends;
static struct Avatar {
char name[TOX_MAX_FILENAME_LENGTH + 1];
size_t name_len;
char path[PATH_MAX + 1];
size_t path_len;
off_t size;
} Avatar;
/* Compares the first size bytes of fp to signature.
*
* Returns 0 if they are the same
* Returns 1 if they differ
* Returns -1 on error.
*
* On success this function will seek back to the beginning of fp.
*/
static int check_file_signature(const unsigned char *signature, size_t size, FILE *fp)
{
char *buf = malloc(size);
if (buf == NULL) {
return -1;
}
if (fread(buf, size, 1, fp) != 1) {
free(buf);
return -1;
}
int ret = memcmp(signature, buf, size);
free(buf);
if (fseek(fp, 0L, SEEK_SET) == -1) {
return -1;
}
return ret == 0 ? 0 : 1;
}
static void avatar_clear(void)
{
Avatar = (struct Avatar) {
0
};
}
/* Sends avatar to friendnumber.
*
* Returns 0 on success.
* Returns -1 on failure.
*/
int avatar_send(Tox *m, uint32_t friendnumber)
{
Tox_Err_File_Send err;
uint32_t filenumber = tox_file_send(m, friendnumber, TOX_FILE_KIND_AVATAR, (size_t) Avatar.size,
NULL, (uint8_t *) Avatar.name, Avatar.name_len, &err);
if (Avatar.size == 0) {
return 0;
}
if (err != TOX_ERR_FILE_SEND_OK) {
fprintf(stderr, "tox_file_send failed for friendnumber %u (error %d)\n", friendnumber, err);
return -1;
}
struct FileTransfer *ft = new_file_transfer(NULL, friendnumber, filenumber, FILE_TRANSFER_SEND, TOX_FILE_KIND_AVATAR);
if (!ft) {
return -1;
}
ft->file = fopen(Avatar.path, "r");
if (ft->file == NULL) {
return -1;
}
snprintf(ft->file_name, sizeof(ft->file_name), "%s", Avatar.name);
ft->file_size = Avatar.size;
return 0;
}
/* Sends avatar to all friends */
static void avatar_send_all(Tox *m)
{
for (size_t i = 0; i < Friends.max_idx; ++i) {
if (Friends.list[i].connection_status != TOX_CONNECTION_NONE) {
avatar_send(m, Friends.list[i].num);
}
}
}
/* Sets avatar to path and sends it to all online contacts.
*
* Returns 0 on success.
* Returns -1 on failure.
*/
int avatar_set(Tox *m, const char *path, size_t path_len)
{
if (path_len == 0 || path_len >= sizeof(Avatar.path)) {
return -1;
}
FILE *fp = fopen(path, "rb");
if (fp == NULL) {
return -1;
}
unsigned char PNG_signature[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
if (check_file_signature(PNG_signature, sizeof(PNG_signature), fp) != 0) {
fclose(fp);
return -1;
}
fclose(fp);
off_t size = file_size(path);
if (size == 0 || size > MAX_AVATAR_FILE_SIZE) {
return -1;
}
get_file_name(Avatar.name, sizeof(Avatar.name), path);
Avatar.name_len = strlen(Avatar.name);
snprintf(Avatar.path, sizeof(Avatar.path), "%s", path);
Avatar.path_len = path_len;
Avatar.size = size;
avatar_send_all(m);
return 0;
}
/* Unsets avatar and sends to all online contacts.
*
* Returns 0 on success.
* Returns -1 on failure.
*/
void avatar_unset(Tox *m)
{
avatar_clear();
avatar_send_all(m);
}
void on_avatar_friend_connection_status(Tox *m, uint32_t friendnumber, Tox_Connection connection_status)
{
if (connection_status == TOX_CONNECTION_NONE) {
kill_avatar_file_transfers_friend(m, friendnumber);
}
}
void on_avatar_file_control(Tox *m, struct FileTransfer *ft, Tox_File_Control control)
{
switch (control) {
case TOX_FILE_CONTROL_RESUME:
if (ft->state == FILE_TRANSFER_PENDING) {
ft->state = FILE_TRANSFER_STARTED;
} else if (ft->state == FILE_TRANSFER_PAUSED) {
ft->state = FILE_TRANSFER_STARTED;
}
break;
case TOX_FILE_CONTROL_PAUSE:
ft->state = FILE_TRANSFER_PAUSED;
break;
case TOX_FILE_CONTROL_CANCEL:
close_file_transfer(NULL, m, ft, -1, NULL, silent);
break;
}
}
void on_avatar_chunk_request(Tox *m, struct FileTransfer *ft, uint64_t position, size_t length)
{
if (ft->state != FILE_TRANSFER_STARTED) {
return;
}
if (length == 0) {
close_file_transfer(NULL, m, ft, -1, NULL, silent);
return;
}
if (ft->file == NULL) {
close_file_transfer(NULL, m, ft, TOX_FILE_CONTROL_CANCEL, NULL, silent);
return;
}
if (ft->position != position) {
if (fseek(ft->file, position, SEEK_SET) == -1) {
close_file_transfer(NULL, m, ft, TOX_FILE_CONTROL_CANCEL, NULL, silent);
return;
}
ft->position = position;
}
uint8_t *send_data = malloc(length);
if (send_data == NULL) {
close_file_transfer(NULL, m, ft, TOX_FILE_CONTROL_CANCEL, NULL, silent);
return;
}
size_t send_length = fread(send_data, 1, length, ft->file);
if (send_length != length) {
close_file_transfer(NULL, m, ft, TOX_FILE_CONTROL_CANCEL, NULL, silent);
free(send_data);
return;
}
Tox_Err_File_Send_Chunk err;
tox_file_send_chunk(m, ft->friendnumber, ft->filenumber, position, send_data, send_length, &err);
free(send_data);
if (err != TOX_ERR_FILE_SEND_CHUNK_OK) {
fprintf(stderr, "tox_file_send_chunk failed in avatar callback (error %d)\n", err);
}
ft->position += send_length;
}

55
src/avatars.h Normal file
View File

@ -0,0 +1,55 @@
/* avatars.h
*
*
* Copyright (C) 2015 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef AVATARS_H
#define AVATARS_H
#include "file_transfers.h"
#define MAX_AVATAR_FILE_SIZE 65536
/* Sends avatar to friendnum.
*
* Returns 0 on success.
* Returns -1 on failure.
*/
int avatar_send(Tox *m, uint32_t friendnum);
/* Sets avatar to path and sends it to all online contacts.
*
* Returns 0 on success.
* Returns -1 on failure.
*/
int avatar_set(Tox *m, const char *path, size_t length);
/* Unsets avatar and sends to all online contacts.
*
* Returns 0 on success.
* Returns -1 on failure.
*/
void avatar_unset(Tox *m);
void on_avatar_chunk_request(Tox *m, struct FileTransfer *ft, uint64_t position, size_t length);
void on_avatar_file_control(Tox *m, struct FileTransfer *ft, Tox_File_Control control);
void on_avatar_friend_connection_status(Tox *m, uint32_t friendnumber, Tox_Connection connection_status);
#endif /* AVATARS_H */

634
src/bootstrap.c Normal file
View File

@ -0,0 +1,634 @@
/* bootstrap.c
*
*
* Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
*
*/
#include <arpa/inet.h>
#include <limits.h>
#include <netinet/in.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <curl/curl.h>
#include <tox/tox.h>
#include "configdir.h"
#include "curl_util.h"
#include "line_info.h"
#include "misc_tools.h"
#include "prompt.h"
#include "settings.h"
#include "windows.h"
extern struct user_settings *user_settings;
/* URL that we get the JSON encoded nodes list from. */
#define NODES_LIST_URL "https://nodes.tox.chat/json"
#define DEFAULT_NODES_FILENAME "DHTnodes.json"
/* Time to wait between bootstrap attempts */
#define TRY_BOOTSTRAP_INTERVAL 5
/* Number of nodes to bootstrap to per try */
#define NUM_BOOTSTRAP_NODES 5
/* Number of seconds since last successful ping before we consider a node offline */
#define NODE_OFFLINE_TIMOUT (60*60*24*2)
#define IP_MAX_SIZE 45
#define IP_MIN_SIZE 7
#define LAST_SCAN_JSON_KEY "\"last_scan\":"
#define LAST_SCAN_JSON_KEY_LEN (sizeof(LAST_SCAN_JSON_KEY) - 1)
#define IPV4_JSON_KEY "\"ipv4\":\""
#define IPV4_JSON_KEY_LEN (sizeof(IPV4_JSON_KEY) - 1)
#define IPV6_JSON_KEY "\"ipv6\":\""
#define IPV6_JSON_KEY_LEN (sizeof(IPV6_JSON_KEY) - 1)
#define PORT_JSON_KEY "\"port\":"
#define PORT_JSON_KEY_LEN (sizeof(PORT_JSON_KEY) - 1)
#define PK_JSON_KEY "\"public_key\":\""
#define PK_JSON_KEY_LEN (sizeof(PK_JSON_KEY) - 1)
#define LAST_PING_JSON_KEY "\"last_ping\":"
#define LAST_PING_JSON_KEY_LEN (sizeof(LAST_PING_JSON_KEY) - 1)
/* Maximum allowable size of the nodes list */
#define MAX_NODELIST_SIZE (MAX_RECV_CURL_DATA_SIZE)
static struct Thread_Data {
pthread_t tid;
pthread_attr_t attr;
pthread_mutex_t lock;
volatile bool active;
} thread_data;
#define MAX_NODES 50
struct Node {
char ip4[IP_MAX_SIZE + 1];
bool have_ip4;
char ip6[IP_MAX_SIZE + 1];
bool have_ip6;
char key[TOX_PUBLIC_KEY_SIZE];
uint16_t port;
};
static struct DHT_Nodes {
struct Node list[MAX_NODES];
size_t count;
time_t last_updated;
} Nodes;
/* Return true if address appears to be a valid ipv4 address. */
static bool is_ip4_address(const char *address)
{
struct sockaddr_in s_addr;
return inet_pton(AF_INET, address, &(s_addr.sin_addr)) != 0;
}
/* Return true if address roughly appears to be a valid ipv6 address.
*
* TODO: Improve this function (inet_pton behaves strangely with ipv6).
* for now the only guarantee is that it won't return true if the
* address is a domain or ipv4 address, and should only be used if you're
* reasonably sure that the address is one of the three (ipv4, ipv6 or a domain).
*/
static bool is_ip6_address(const char *address)
{
size_t num_colons = 0;
char ch = 0;
for (size_t i = 0; (ch = address[i]); ++i) {
if (ch == '.') {
return false;
}
if (ch == ':') {
++num_colons;
}
}
return num_colons > 1 && num_colons < 8;
}
/* Determine if a node is offline by comparing the age of the nodeslist
* to the last time the node was successfully pinged.
*/
static bool node_is_offline(unsigned long long int last_ping)
{
return last_ping + NODE_OFFLINE_TIMOUT <= last_ping;
}
/* Return true if nodeslist pointed to by fp needs to be updated.
* This will be the case if the file is empty, has an invalid format,
* or if the file is older than the given timeout.
*/
static bool nodeslist_needs_update(const char *nodes_path)
{
if (user_settings->nodeslist_update_freq <= 0) {
return false;
}
FILE *fp = fopen(nodes_path, "r+");
if (fp == NULL) {
return false;
}
/* last_scan value should be at beginning of file */
char line[LAST_SCAN_JSON_KEY_LEN + 32];
if (fgets(line, sizeof(line), fp) == NULL) {
fclose(fp);
return true;
}
fclose(fp);
const char *last_scan_val = strstr(line, LAST_SCAN_JSON_KEY);
if (last_scan_val == NULL) {
return true;
}
long long int last_scan = strtoll(last_scan_val + LAST_SCAN_JSON_KEY_LEN, NULL, 10);
pthread_mutex_lock(&thread_data.lock);
Nodes.last_updated = last_scan;
pthread_mutex_unlock(&thread_data.lock);
pthread_mutex_lock(&Winthread.lock);
bool is_timeout = timed_out(last_scan, user_settings->nodeslist_update_freq * 24 * 60 * 60);
pthread_mutex_unlock(&Winthread.lock);
if (is_timeout) {
return true;
}
return false;
}
/* Fetches the JSON encoded DHT nodeslist from NODES_LIST_URL.
*
* Return 0 on success.
* Return -1 on failure.
*/
static int curl_fetch_nodes_JSON(struct Recv_Curl_Data *recv_data)
{
CURL *c_handle = curl_easy_init();
if (c_handle == NULL) {
return -1;
}
int err = -1;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, "charsets: utf-8");
curl_easy_setopt(c_handle, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(c_handle, CURLOPT_URL, NODES_LIST_URL);
curl_easy_setopt(c_handle, CURLOPT_WRITEFUNCTION, curl_cb_write_data);
curl_easy_setopt(c_handle, CURLOPT_WRITEDATA, recv_data);
curl_easy_setopt(c_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
curl_easy_setopt(c_handle, CURLOPT_HTTPGET, 1L);
int proxy_ret = set_curl_proxy(c_handle, arg_opts.proxy_address, arg_opts.proxy_port, arg_opts.proxy_type);
if (proxy_ret != 0) {
fprintf(stderr, "set_curl_proxy() failed with error %d\n", proxy_ret);
goto on_exit;
}
int ret = curl_easy_setopt(c_handle, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
if (ret != CURLE_OK) {
fprintf(stderr, "TLSv1.2 could not be set (libcurl error %d)", ret);
goto on_exit;
}
ret = curl_easy_setopt(c_handle, CURLOPT_SSL_CIPHER_LIST, TLS_CIPHER_SUITE_LIST);
if (ret != CURLE_OK) {
fprintf(stderr, "Failed to set TLS cipher list (libcurl error %d)", ret);
goto on_exit;
}
ret = curl_easy_perform(c_handle);
if (ret != CURLE_OK) {
/* If system doesn't support any of the specified ciphers suites, fall back to default */
if (ret == CURLE_SSL_CIPHER) {
curl_easy_setopt(c_handle, CURLOPT_SSL_CIPHER_LIST, NULL);
ret = curl_easy_perform(c_handle);
}
if (ret != CURLE_OK) {
fprintf(stderr, "HTTPS lookup error (libcurl error %d)\n", ret);
goto on_exit;
}
}
err = 0;
on_exit:
curl_slist_free_all(headers);
curl_easy_cleanup(c_handle);
return err;
}
/* Attempts to update the DHT nodeslist.
*
* Return 1 if list was updated successfully.
* Return 0 if list does not need to be updated.
* Return -1 if file cannot be opened.
* Return -2 if http lookup failed.
* Return -3 if http reponse was empty.
* Return -4 if data could not be written to disk.
* Return -5 if memory allocation fails.
*/
static int update_DHT_nodeslist(const char *nodes_path)
{
if (!nodeslist_needs_update(nodes_path)) {
return 0;
}
FILE *fp = fopen(nodes_path, "r+");
if (fp == NULL) {
return -1;
}
struct Recv_Curl_Data *recv_data = calloc(1, sizeof(struct Recv_Curl_Data));
if (recv_data == NULL) {
fclose(fp);
return -5;
}
if (curl_fetch_nodes_JSON(recv_data) == -1) {
free(recv_data);
fclose(fp);
return -2;
}
if (recv_data->length == 0) {
free(recv_data);
fclose(fp);
return -3;
}
if (fwrite(recv_data->data, recv_data->length, 1, fp) != 1) {
free(recv_data);
fclose(fp);
return -4;
}
free(recv_data);
fclose(fp);
return 1;
}
static void get_nodeslist_path(char *buf, size_t buf_size)
{
char *config_dir = NULL;
if (arg_opts.nodes_path[0]) {
snprintf(buf, buf_size, "%s", arg_opts.nodes_path);
} else if ((config_dir = get_user_config_dir()) != NULL) {
snprintf(buf, buf_size, "%s%s%s", config_dir, CONFIGDIR, DEFAULT_NODES_FILENAME);
free(config_dir);
} else {
snprintf(buf, buf_size, "%s", DEFAULT_NODES_FILENAME);
}
}
/* Return true if json encoded string s contains a valid IP address and puts address in ip_buf.
*
* ip_type should be set to 1 for ipv4 address, or 0 for ipv6 addresses.
* ip_buf must have room for at least IP_MAX_SIZE + 1 bytes.
*/
static bool extract_val_ip(const char *s, char *ip_buf, unsigned short int ip_type)
{
int ip_len = char_find(0, s, '"');
if (ip_len < IP_MIN_SIZE || ip_len > IP_MAX_SIZE) {
return false;
}
memcpy(ip_buf, s, ip_len);
ip_buf[ip_len] = 0;
return (ip_type == 1) ? is_ip4_address(ip_buf) : is_ip6_address(ip_buf);
}
/* Extracts the port from json encoded string s.
*
* Return port number on success.
* Return 0 on failure.
*/
static uint16_t extract_val_port(const char *s)
{
long int port = strtol(s, NULL, 10);
return (port > 0 && port <= MAX_PORT_RANGE) ? port : 0;
}
/* Extracts the last pinged value from json encoded string s.
*
* Return timestamp on success.
* Return -1 on failure.
*/
static long long int extract_val_last_pinged(const char *s)
{
long long int last_pinged = strtoll(s, NULL, 10);
return (last_pinged <= 0) ? -1 : last_pinged;
}
/* Extracts DHT public key from json encoded string s and puts key in key_buf.
* key_buf must have room for at least TOX_PUBLIC_KEY_SIZE * 2 + 1 bytes.
*
* Return number of bytes copied to key_buf on success.
* Return -1 on failure.
*/
static int extract_val_pk(const char *s, char *key_buf, size_t buf_length)
{
if (buf_length < TOX_PUBLIC_KEY_SIZE * 2 + 1) {
return -1;
}
int key_len = char_find(0, s, '"');
if (key_len != TOX_PUBLIC_KEY_SIZE * 2) {
return -1;
}
memcpy(key_buf, s, key_len);
key_buf[key_len] = 0;
return key_len;
}
/* Extracts values from json formatted string, validats them, and puts them in node.
*
* Return 0 on success.
* Return -1 if line is empty.
* Return -2 if line does not appear to be a valid nodes list entry.
* Return -3 if node appears to be offline.
* Return -4 if entry does not contain either a valid ipv4 or ipv6 address.
* Return -5 if port value is invalid.
* Return -6 if public key is invalid.
*/
static int extract_node(const char *line, struct Node *node)
{
if (!line) {
return -1;
}
const char *ip4_start = strstr(line, IPV4_JSON_KEY);
const char *ip6_start = strstr(line, IPV6_JSON_KEY);
const char *port_start = strstr(line, PORT_JSON_KEY);
const char *key_start = strstr(line, PK_JSON_KEY);
const char *last_pinged_str = strstr(line, LAST_PING_JSON_KEY);
if (!ip4_start || !ip6_start || !port_start || !key_start || !last_pinged_str) {
return -2;
}
long long int last_pinged = extract_val_last_pinged(last_pinged_str + LAST_PING_JSON_KEY_LEN);
if (last_pinged <= 0 || node_is_offline(last_pinged)) {
return -3;
}
char ip4_string[IP_MAX_SIZE + 1];
bool have_ip4 = extract_val_ip(ip4_start + IPV4_JSON_KEY_LEN, ip4_string, 1);
char ip6_string[IP_MAX_SIZE + 1];
bool have_ip6 = extract_val_ip(ip6_start + IPV6_JSON_KEY_LEN, ip6_string, 0);
if (!have_ip6 && !have_ip4) {
return -4;
}
uint16_t port = extract_val_port(port_start + PORT_JSON_KEY_LEN);
if (port == 0) {
return -5;
}
char key_string[TOX_PUBLIC_KEY_SIZE * 2 + 1];
int key_len = extract_val_pk(key_start + PK_JSON_KEY_LEN, key_string, sizeof(key_string));
if (key_len == -1) {
return -6;
}
if (tox_pk_string_to_bytes(key_string, key_len, node->key, sizeof(node->key)) == -1) {
return -6;
}
if (have_ip4) {
snprintf(node->ip4, sizeof(node->ip4), "%s", ip4_string);
node->have_ip4 = true;
}
if (have_ip6) {
snprintf(node->ip6, sizeof(node->ip6), "%s", ip6_string);
node->have_ip6 = true;
}
node->port = port;
return 0;
}
/* Loads the DHT nodeslist to memory from json encoded nodes file. */
void *load_nodeslist_thread(void *data)
{
UNUSED_VAR(data);
char nodes_path[PATH_MAX];
get_nodeslist_path(nodes_path, sizeof(nodes_path));
FILE *fp = NULL;
if (!file_exists(nodes_path)) {
if ((fp = fopen(nodes_path, "w+")) == NULL) {
fprintf(stderr, "nodeslist load error: failed to create file '%s'\n", nodes_path);
goto on_exit;
}
} else if ((fp = fopen(nodes_path, "r+")) == NULL) {
fprintf(stderr, "nodeslist load error: failed to open file '%s'\n", nodes_path);
goto on_exit;
}
int update_err = update_DHT_nodeslist(nodes_path);
if (update_err < 0) {
fprintf(stderr, "update_DHT_nodeslist() failed with error %d\n", update_err);
}
char line[MAX_NODELIST_SIZE + 1];
if (fgets(line, sizeof(line), fp) == NULL) {
fclose(fp);
fprintf(stderr, "nodeslist load error: file empty.\n");
goto on_exit;
}
size_t idx = 0;
const char *line_start = line;
while ((line_start = strstr(line_start + 1, IPV4_JSON_KEY))) {
pthread_mutex_lock(&thread_data.lock);
idx = Nodes.count;
if (idx >= MAX_NODES) {
pthread_mutex_unlock(&thread_data.lock);
break;
}
if (extract_node(line_start, &Nodes.list[idx]) == 0) {
++Nodes.count;
}
pthread_mutex_unlock(&thread_data.lock);
}
/* If nodeslist does not contain any valid entries we set the last_scan value
* to 0 so that it will fetch a new list the next time this function is called.
*/
if (Nodes.count == 0) {
const char *s = "{\"last_scan\":0}";
rewind(fp);
fwrite(s, strlen(s), 1, fp); // Not much we can do if it fails
fclose(fp);
fprintf(stderr, "nodeslist load error: List did not contain any valid entries.\n");
goto on_exit;
}
fclose(fp);
on_exit:
thread_data.active = false;
pthread_attr_destroy(&thread_data.attr);
pthread_exit(0);
}
/* Creates a new thread that will load the DHT nodeslist to memory
* from json encoded nodes file obtained at NODES_LIST_URL. Only one
* thread may run at a time.
*
* Return 0 on success.
* Return -1 if a thread is already active.
* Return -2 if mutex fails to init.
* Return -3 if pthread attribute fails to init.
* Return -4 if pthread fails to set detached state.
* Return -5 if thread creation fails.
*/
int load_DHT_nodeslist(void)
{
if (thread_data.active) {
return -1;
}
if (pthread_mutex_init(&thread_data.lock, NULL) != 0) {
return -2;
}
if (pthread_attr_init(&thread_data.attr) != 0) {
return -3;
}
if (pthread_attr_setdetachstate(&thread_data.attr, PTHREAD_CREATE_DETACHED) != 0) {
return -4;
}
thread_data.active = true;
if (pthread_create(&thread_data.tid, &thread_data.attr, load_nodeslist_thread, NULL) != 0) {
thread_data.active = false;
return -5;
}
return 0;
}
/* Connects to NUM_BOOTSTRAP_NODES random DHT nodes listed in the DHTnodes file. */
static void DHT_bootstrap(Tox *m)
{
pthread_mutex_lock(&thread_data.lock);
size_t num_nodes = Nodes.count;
pthread_mutex_unlock(&thread_data.lock);
if (num_nodes == 0) {
return;
}
size_t i;
pthread_mutex_lock(&thread_data.lock);
for (i = 0; i < NUM_BOOTSTRAP_NODES; ++i) {
struct Node *node = &Nodes.list[rand() % Nodes.count];
const char *addr = node->have_ip4 ? node->ip4 : node->ip6;
if (!addr) {
continue;
}
Tox_Err_Bootstrap err;
tox_bootstrap(m, addr, node->port, (uint8_t *) node->key, &err);
if (err != TOX_ERR_BOOTSTRAP_OK) {
fprintf(stderr, "Failed to bootstrap %s:%d\n", addr, node->port);
}
tox_add_tcp_relay(m, addr, node->port, (uint8_t *) node->key, &err);
if (err != TOX_ERR_BOOTSTRAP_OK) {
fprintf(stderr, "Failed to add TCP relay %s:%d\n", addr, node->port);
}
}
pthread_mutex_unlock(&thread_data.lock);
}
/* Manages connection to the Tox DHT network. */
void do_tox_connection(Tox *m)
{
static time_t last_bootstrap_time = 0;
bool connected = prompt_selfConnectionStatus() != TOX_CONNECTION_NONE;
if (!connected && timed_out(last_bootstrap_time, TRY_BOOTSTRAP_INTERVAL)) {
DHT_bootstrap(m);
last_bootstrap_time = get_unix_time();
}
}

42
src/bootstrap.h Normal file
View File

@ -0,0 +1,42 @@
/* bootstrap.h
*
*
* Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef BOOTSTRAP_H
#define BOOTSTRAP_H
/* Manages connection to the Tox DHT network. */
void do_tox_connection(Tox *m);
/* Creates a new thread that will load the DHT nodeslist to memory
* from json encoded nodes file obtained at NODES_LIST_URL. Only one
* thread may run at a time.
*
* Return 0 on success.
* Return -1 if a thread is already active.
* Return -2 if mutex fails to init.
* Return -3 if pthread attribute fails to init.
* Return -4 if pthread fails to set detached state.
* Return -5 if thread creation fails.
*/
int load_DHT_nodeslist(void);
#endif /* BOOTSTRAP_H */

1825
src/chat.c

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,35 @@
#ifndef CHAT_H_6489PZ13
#define CHAT_H_6489PZ13
/* chat.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 <http://www.gnu.org/licenses/>.
*
*/
#include "toxic_windows.h"
#ifndef CHAT_H
#define CHAT_H
ToxWindow new_chat(Tox *m, int friendnum);
#include "toxic.h"
#include "windows.h"
#endif /* end of include guard: CHAT_H_6489PZ13 */
/* set CTRL to -1 if we don't want to send a control signal.
set msg to NULL if we don't want to display a message */
void chat_close_file_receiver(Tox *m, int filenum, int friendnum, int CTRL);
void kill_chat_window(ToxWindow *self, Tox *m);
ToxWindow *new_chat(Tox *m, int32_t friendnum);
#endif /* end of include guard: CHAT_H */

View File

@ -1,191 +1,506 @@
/*
* Toxic -- Tox Curses Client
/* chat_commands.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 <http://www.gnu.org/licenses/>.
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include "toxic_windows.h"
#include "chat.h"
#include "conference.h"
#include "execute.h"
#include "file_transfers.h"
#include "friendlist.h"
#include "line_info.h"
#include "groupchats.h"
#include "misc_tools.h"
#include "toxic.h"
#include "windows.h"
extern ToxWindow *prompt;
extern int num_groupchats;
extern FriendsList Friends;
void cmd_chat_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
void cmd_cancelfile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
wattron(window, COLOR_PAIR(CYAN) | A_BOLD);
wprintw(window, "Chat commands:\n");
wattroff(window, A_BOLD);
UNUSED_VAR(window);
wprintw(window, " /status <type> <msg> : Set your status with optional note\n");
wprintw(window, " /note <msg> : Set a personal note\n");
wprintw(window, " /nick <nick> : Set your nickname\n");
wprintw(window, " /invite <n> : Invite friend to a group chat\n");
wprintw(window, " /me <action> : Do an action\n");
wprintw(window, " /myid : Print your ID\n");
wprintw(window, " /join : Join a pending group chat\n");
wprintw(window, " /clear : Clear the screen\n");
wprintw(window, " /close : Close the current chat window\n");
wprintw(window, " /sendfile <filepath> : Send a file\n");
wprintw(window, " /savefile <n> : Receive a file\n");
wprintw(window, " /quit or /exit : Exit Toxic\n");
wprintw(window, " /help : Print this message again\n");
if (argc < 2) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Requires type in|out and the file ID.");
return;
}
wattron(window, A_BOLD);
wprintw(window, "\n * Argument messages must be enclosed in quotation marks.\n");
wattroff(window, A_BOLD);
char msg[MAX_STR_SIZE];
const char *inoutstr = argv[1];
long int idx = strtol(argv[2], NULL, 10);
wattroff(window, COLOR_PAIR(CYAN));
if ((idx == 0 && strcmp(argv[2], "0")) || idx >= MAX_FILES || idx < 0) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invalid file ID.");
return;
}
// first check transfer queue
if (file_send_queue_remove(self->num, idx) == 0) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Pending file transfer removed from queue");
return;
}
FileTransfer *ft = NULL;
/* cancel an incoming file transfer */
if (strcasecmp(inoutstr, "in") == 0) {
ft = get_file_transfer_struct_index(self->num, idx, FILE_TRANSFER_RECV);
} else if (strcasecmp(inoutstr, "out") == 0) {
ft = get_file_transfer_struct_index(self->num, idx, FILE_TRANSFER_SEND);
} else {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Type must be 'in' or 'out'.");
return;
}
if (!ft) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invalid file ID.");
return;
}
if (ft->state == FILE_TRANSFER_INACTIVE) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invalid file ID.");
return;
}
snprintf(msg, sizeof(msg), "File transfer for '%s' aborted.", ft->file_name);
close_file_transfer(self, m, ft, TOX_FILE_CONTROL_CANCEL, msg, silent);
}
void cmd_groupinvite(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
void cmd_conference_invite(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
if (argc < 1) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Conference number required.");
return;
}
long int conferencenum = strtol(argv[1], NULL, 10);
if ((conferencenum == 0 && strcmp(argv[1], "0")) || conferencenum < 0 || conferencenum == LONG_MAX) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invalid conference number.");
return;
}
Tox_Err_Conference_Invite err;
if (!tox_conference_invite(m, self->num, conferencenum, &err)) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to invite contact to conference (error %d)", err);
return;
}
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invited contact to Conference %ld.", conferencenum);
}
void cmd_conference_join(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(argc);
UNUSED_VAR(argv);
if (get_num_active_windows() >= MAX_WINDOWS_NUM) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, RED, " * Warning: Too many windows are open.");
return;
}
const char *conferencekey = Friends.list[self->num].conference_invite.key;
uint16_t length = Friends.list[self->num].conference_invite.length;
uint8_t type = Friends.list[self->num].conference_invite.type;
if (!Friends.list[self->num].conference_invite.pending) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "No pending conference invite.");
return;
}
uint32_t conferencenum;
if (type == TOX_CONFERENCE_TYPE_TEXT) {
Tox_Err_Conference_Join err;
conferencenum = tox_conference_join(m, self->num, (const uint8_t *) conferencekey, length, &err);
if (err != TOX_ERR_CONFERENCE_JOIN_OK) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Conference instance failed to initialize (error %d)", err);
return;
}
} else if (type == TOX_CONFERENCE_TYPE_AV) {
#ifdef AUDIO
conferencenum = toxav_join_av_groupchat(m, self->num, (const uint8_t *) conferencekey, length,
audio_conference_callback, NULL);
if (conferencenum == (uint32_t) -1) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Audio conference instance failed to initialize");
return;
}
#else
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Audio support disabled by compile-time option.");
return;
#endif
} else {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Unknown conference type %d", type);
return;
}
if (init_conference_win(m, conferencenum, type, NULL, 0) == -1) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Conference window failed to initialize.");
tox_conference_delete(m, conferencenum, NULL);
return;
}
#ifdef AUDIO
if (type == TOX_CONFERENCE_TYPE_AV) {
if (!init_conference_audio_input(m, conferencenum)) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Audio capture failed; use \"/audio on\" to try again.");
}
}
#endif
}
void cmd_group_accept(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
if (get_num_active_windows() >= MAX_WINDOWS_NUM) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, RED, " * Warning: Too many windows are open.");
return;
}
if (Friends.list[self->num].group_invite.length == 0) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "No pending group invite");
return;
}
const char *passwd = NULL;
uint16_t passwd_len = 0;
if (argc > 0) {
passwd = argv[1];
passwd_len = strlen(passwd);
}
size_t nick_len = tox_self_get_name_size(m);
char self_nick[TOX_MAX_NAME_LENGTH + 1];
tox_self_get_name(m, (uint8_t *) self_nick);
self_nick[nick_len] = '\0';
Tox_Err_Group_Invite_Accept err;
uint32_t groupnumber = tox_group_invite_accept(m, self->num, Friends.list[self->num].group_invite.data,
Friends.list[self->num].group_invite.length, (const uint8_t *) self_nick, nick_len,
(const uint8_t *) passwd, passwd_len, &err);
if (err != TOX_ERR_GROUP_INVITE_ACCEPT_OK) {
if (err == TOX_ERR_GROUP_INVITE_ACCEPT_TOO_LONG) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to join group: Password too long.");
} else {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to join group (error %d).", err);
}
return;
}
if (init_groupchat_win(m, groupnumber, NULL, 0, Group_Join_Type_Join) == -1) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Group chat window failed to initialize.");
tox_group_leave(m, groupnumber, NULL, 0, NULL);
return;
}
}
void cmd_group_invite(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
if (argc < 1) {
wprintw(window, "Invalid syntax.\n");
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Group number required.");
return;
}
int groupnum = atoi(argv[1]);
int groupnumber = atoi(argv[1]);
if (groupnum == 0 && strcmp(argv[1], "0")) { /* atoi returns 0 value on invalid input */
wprintw(window, "Invalid syntax.\n");
if (groupnumber == 0 && strcmp(argv[1], "0")) { /* atoi returns 0 value on invalid input */
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invalid group number.");
return;
}
if (tox_invite_friend(m, self->num, groupnum) == -1) {
wprintw(window, "Failed to invite friend.\n");
Tox_Err_Group_Invite_Friend err;
if (!tox_group_invite_friend(m, groupnumber, self->num, &err)) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to invite contact to group (error %d).", err);
return;
}
wprintw(window, "Invited friend to group chat %d.\n", groupnum);
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invited contact to Group %d.", groupnumber);
}
void cmd_join_group(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
#ifdef GAMES
void cmd_game_join(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
if (num_groupchats >= MAX_GROUPCHAT_NUM) {
wprintw(window, "Maximum number of group chats has been reached.\n");
UNUSED_VAR(window);
UNUSED_VAR(m);
if (!Friends.list[self->num].game_invite.pending) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "No pending game invite.");
return;
}
uint8_t *groupkey = friends[self->num].pending_groupchat;
if (groupkey[0] == '\0') {
wprintw(window, "No pending group chat invite.\n");
if (get_num_active_windows() >= MAX_WINDOWS_NUM) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, RED, " * Warning: Too many windows are open.");
return;
}
int groupnum = tox_join_groupchat(m, self->num, groupkey);
GameType type = Friends.list[self->num].game_invite.type;
uint32_t id = Friends.list[self->num].game_invite.id;
uint8_t *data = Friends.list[self->num].game_invite.data;
size_t length = Friends.list[self->num].game_invite.data_length;
if (groupnum == -1) {
wprintw(window, "Group chat instance failed to initialize.\n");
int ret = game_initialize(self, m, type, id, data, length);
switch (ret) {
case 0: {
free(data);
Friends.list[self->num].game_invite.data = NULL;
Friends.list[self->num].game_invite.pending = false;
break;
}
case -1: {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Window is too small. Try enlarging your window.");
return;
}
if (init_groupchat_win(prompt, m, groupnum) == -1) {
wprintw(window, "Group chat window failed to initialize.\n");
tox_del_groupchat(m, groupnum);
case -2: {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Game failed to initialize (network error)");
return;
}
default: {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Game failed to initialize (error %d)", ret);
return;
}
}
}
#endif // GAMES
void cmd_savefile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
if (argc != 1) {
wprintw(window, "Invalid syntax.\n");
UNUSED_VAR(window);
if (argc < 1) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "File ID required.");
return;
}
uint8_t filenum = atoi(argv[1]);
long int idx = strtol(argv[1], NULL, 10);
if ((filenum == 0 && strcmp(argv[1], "0")) || filenum >= MAX_FILES) {
wprintw(window, "No pending file transfers with that number.\n");
if ((idx == 0 && strcmp(argv[1], "0")) || idx < 0 || idx >= MAX_FILES) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "No pending file transfers with that ID.");
return;
}
if (!friends[self->num].file_receiver.pending[filenum]) {
wprintw(window, "No pending file transfers with that number.\n");
FileTransfer *ft = get_file_transfer_struct_index(self->num, idx, FILE_TRANSFER_RECV);
if (!ft) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "No pending file transfers with that ID.");
return;
}
uint8_t *filename = friends[self->num].file_receiver.filenames[filenum];
if (ft->state != FILE_TRANSFER_PENDING) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "No pending file transfers with that ID.");
return;
}
if (tox_file_sendcontrol(m, self->num, 1, filenum, TOX_FILECONTROL_ACCEPT, 0, 0))
wprintw(window, "Accepted file transfer %u. Saving file as: '%s'\n", filenum, filename);
else
wprintw(window, "File transfer failed.\n");
if ((ft->file = fopen(ft->file_path, "a")) == NULL) {
const char *msg = "File transfer failed: Invalid download path.";
close_file_transfer(self, m, ft, TOX_FILE_CONTROL_CANCEL, msg, notif_error);
return;
}
friends[self->num].file_receiver.pending[filenum] = false;
Tox_Err_File_Control err;
tox_file_control(m, self->num, ft->filenumber, TOX_FILE_CONTROL_RESUME, &err);
if (err != TOX_ERR_FILE_CONTROL_OK) {
goto on_recv_error;
}
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Saving file [%ld] as: '%s'", idx, ft->file_path);
/* prep progress bar line */
char progline[MAX_STR_SIZE];
init_progress_bar(progline);
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "%s", progline);
ft->line_id = self->chatwin->hst->line_end->id + 2;
ft->state = FILE_TRANSFER_STARTED;
return;
on_recv_error:
switch (err) {
case TOX_ERR_FILE_CONTROL_FRIEND_NOT_FOUND:
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "File transfer failed: Friend not found.");
return;
case TOX_ERR_FILE_CONTROL_FRIEND_NOT_CONNECTED:
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "File transfer failed: Friend is not online.");
return;
case TOX_ERR_FILE_CONTROL_NOT_FOUND:
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "File transfer failed: Invalid filenumber.");
return;
case TOX_ERR_FILE_CONTROL_SENDQ:
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "File transfer failed: Connection error.");
return;
default:
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "File transfer failed (error %d)\n", err);
return;
}
}
void cmd_sendfile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
if (num_file_senders >= MAX_FILES) {
wprintw(window,"Please wait for some of your outgoing file transfers to complete.\n");
return;
}
UNUSED_VAR(window);
const char *errmsg = NULL;
if (argc < 1) {
wprintw(window, "Invalid syntax.\n");
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "File path required.");
return;
}
uint8_t *path = argv[1];
if (path[0] != '\"') {
wprintw(window, "File path must be enclosed in quotes.\n");
return;
}
path[strlen(++path)-1] = L'\0';
char path[MAX_STR_SIZE];
snprintf(path, sizeof(path), "%s", argv[1]);
int path_len = strlen(path);
if (path_len > MAX_STR_SIZE) {
wprintw(window, "File path exceeds character limit.\n");
if (path_len >= MAX_STR_SIZE) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "File path exceeds character limit.");
return;
}
FILE *file_to_send = fopen(path, "r");
if (file_to_send == NULL) {
wprintw(window, "File '%s' not found.\n", path);
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "File `%s` not found.", path);
return;
}
fseek(file_to_send, 0, SEEK_END);
uint64_t filesize = ftell(file_to_send);
fseek(file_to_send, 0, SEEK_SET);
off_t filesize = file_size(path);
int filenum = tox_new_filesender(m, self->num, filesize, path, path_len + 1);
if (filenum == -1) {
wprintw(window, "Error sending file.\n");
if (filesize == 0) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invalid file.");
fclose(file_to_send);
return;
}
int i;
char file_name[TOX_MAX_FILENAME_LENGTH];
size_t namelen = get_file_name(file_name, sizeof(file_name), path);
for (i = 0; i < MAX_FILES; ++i) {
if (!file_senders[i].active) {
memcpy(file_senders[i].pathname, path, path_len + 1);
file_senders[i].active = true;
file_senders[i].toxwin = self;
file_senders[i].file = file_to_send;
file_senders[i].filenum = (uint8_t) filenum;
file_senders[i].friendnum = self->num;
file_senders[i].timestamp = (uint64_t)time(NULL);
file_senders[i].piecelen = fread(file_senders[i].nextpiece, 1,
tox_filedata_size(m, self->num), file_to_send);
Tox_Err_File_Send err;
uint32_t filenum = tox_file_send(m, self->num, TOX_FILE_KIND_DATA, (uint64_t) filesize, NULL,
(uint8_t *) file_name, namelen, &err);
wprintw(window, "Sending file: '%s'\n", path);
if (err != TOX_ERR_FILE_SEND_OK) {
goto on_send_error;
}
if (i == num_file_senders)
++num_file_senders;
FileTransfer *ft = new_file_transfer(self, self->num, filenum, FILE_TRANSFER_SEND, TOX_FILE_KIND_DATA);
if (!ft) {
err = TOX_ERR_FILE_SEND_TOO_MANY;
goto on_send_error;
}
memcpy(ft->file_name, file_name, namelen + 1);
ft->file = file_to_send;
ft->file_size = filesize;
tox_file_get_file_id(m, self->num, filenum, ft->file_id, NULL);
char sizestr[32];
bytes_convert_str(sizestr, sizeof(sizestr), filesize);
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Sending file [%d]: '%s' (%s)", filenum, file_name, sizestr);
return;
on_send_error:
fclose(file_to_send);
switch (err) {
case TOX_ERR_FILE_SEND_FRIEND_NOT_FOUND: {
errmsg = "File transfer failed: Invalid friend.";
break;
}
case TOX_ERR_FILE_SEND_FRIEND_NOT_CONNECTED: {
int queue_idx = file_send_queue_add(self->num, path, path_len);
char msg[MAX_STR_SIZE];
switch (queue_idx) {
case -1: {
snprintf(msg, sizeof(msg), "Invalid file name: path is null or length is zero.");
break;
}
case -2: {
snprintf(msg, sizeof(msg), "File name is too long.");
break;
}
case -3: {
snprintf(msg, sizeof(msg), "File send queue is full.");
break;
}
default: {
snprintf(msg, sizeof(msg), "File transfer queued. Type \"/cancel out %d\" to cancel.", queue_idx);
break;
}
}
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "%s", msg);
return;
}
case TOX_ERR_FILE_SEND_NAME_TOO_LONG: {
errmsg = "File transfer failed: Filename is too long.";
break;
}
case TOX_ERR_FILE_SEND_TOO_MANY: {
errmsg = "File transfer failed: Too many concurrent file transfers.";
break;
}
default: {
errmsg = "File transfer failed.";
break;
}
}
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "%s", errmsg);
tox_file_control(m, self->num, filenum, TOX_FILE_CONTROL_CANCEL, NULL);
}

View File

@ -1,9 +1,56 @@
/*
* Toxic -- Tox Curses Client
/* chat_commands.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 <http://www.gnu.org/licenses/>.
*
*/
void cmd_chat_help(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_groupinvite(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_join_group(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
#ifndef CHAT_COMMANDS_H
#define CHAT_COMMANDS_H
#include "toxic.h"
#include "windows.h"
void cmd_cancelfile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_conference_invite(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_conference_join(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_group_accept(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_group_invite(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_game_join(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_savefile(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_sendfile(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
#ifdef AUDIO
void cmd_call(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_answer(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_reject(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_hangup(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_cancel(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_ccur_device(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_mute(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_sense(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_bitrate(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
#endif /* AUDIO */
#ifdef VIDEO
void cmd_vcall(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_video(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_res(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]);
#endif /* VIDEO */
#endif /* CHAT_COMMANDS_H */

1432
src/conference.c Normal file

File diff suppressed because it is too large Load Diff

118
src/conference.h Normal file
View File

@ -0,0 +1,118 @@
/* conference.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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef CONFERENCE_H
#define CONFERENCE_H
#include "toxic.h"
#include "windows.h"
#define CONFERENCE_MAX_TITLE_LENGTH TOX_MAX_NAME_LENGTH
#define SIDEBAR_WIDTH 16
typedef struct ConferencePeer {
bool active;
uint8_t pubkey[TOX_PUBLIC_KEY_SIZE];
uint32_t peernum; /* index in chat->peer_list */
char name[TOX_MAX_NAME_LENGTH];
size_t name_length;
bool sending_audio;
uint32_t audio_out_idx;
time_t last_audio_time;
} ConferencePeer;
typedef struct AudioInputCallbackData {
Tox *tox;
uint32_t conferencenum;
} AudioInputCallbackData;
#define PUBKEY_STRING_SIZE (2 * TOX_PUBLIC_KEY_SIZE + 1)
typedef struct NameListEntry {
char name[TOX_MAX_NAME_LENGTH];
char pubkey_str[PUBKEY_STRING_SIZE];
uint32_t peernum;
} NameListEntry;
typedef struct {
int chatwin;
bool active;
uint8_t type;
int side_pos; /* current position of the sidebar - used for scrolling up and down */
time_t start_time;
char title[CONFERENCE_MAX_TITLE_LENGTH + 1];
size_t title_length;
ConferencePeer *peer_list;
uint32_t max_idx;
NameListEntry *name_list;
uint32_t num_peers;
bool push_to_talk_enabled;
time_t ptt_last_pushed;
bool audio_enabled;
time_t last_sent_audio;
uint32_t audio_in_idx;
AudioInputCallbackData audio_input_callback_data;
} ConferenceChat;
/* Frees all Toxic associated data structures for a conference (does not call tox_conference_delete() ) */
void free_conference(ToxWindow *self, uint32_t conferencenum);
int init_conference_win(Tox *m, uint32_t conferencenum, uint8_t type, const char *title, size_t length);
/* destroys and re-creates conference window with or without the peerlist */
void redraw_conference_win(ToxWindow *self);
void conference_set_title(ToxWindow *self, uint32_t conferencesnum, const char *title, size_t length);
void conference_rename_log_path(Tox *m, uint32_t conferencenum, const char *new_title);
int conference_enable_logging(ToxWindow *self, Tox *m, uint32_t conferencenum, struct chatlog *log);
/* Puts `(NameListEntry *)`s in `entries` for each matched peer, up to a maximum
* of `maxpeers`.
* Maches each peer whose name or pubkey begins with `prefix`.
* If `prefix` is exactly the pubkey of a peer, matches only that peer.
* return number of entries placed in `entries`.
*/
uint32_t get_name_list_entries_by_prefix(uint32_t conferencenum, const char *prefix, NameListEntry **entries,
uint32_t maxpeers);
bool init_conference_audio_input(Tox *tox, uint32_t conferencenum);
bool enable_conference_audio(ToxWindow *self, Tox *tox, uint32_t conferencenum);
bool disable_conference_audio(ToxWindow *self, Tox *tox, uint32_t conferencenum);
bool toggle_conference_push_to_talk(uint32_t conferencenum, bool enabled);
void audio_conference_callback(void *tox, uint32_t conferencenum, uint32_t peernum,
const int16_t *pcm, unsigned int samples, uint8_t channels, uint32_t
sample_rate, void *userdata);
bool conference_mute_self(uint32_t conferencenum);
bool conference_mute_peer(const Tox *m, uint32_t conferencenum, uint32_t peernum);
bool conference_set_VAD_threshold(uint32_t conferencenum, float threshold);
float conference_get_VAD_threshold(uint32_t conferencenum);
#endif /* CONFERENCE_H */

210
src/conference_commands.c Normal file
View File

@ -0,0 +1,210 @@
/* conference_commands.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 <http://www.gnu.org/licenses/>.
*
*/
#include <stdlib.h>
#include <string.h>
#include "conference.h"
#include "line_info.h"
#include "log.h"
#include "misc_tools.h"
#include "toxic.h"
#include "windows.h"
static void print_err(ToxWindow *self, const char *error_str)
{
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "%s", error_str);
}
void cmd_conference_set_title(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
Tox_Err_Conference_Title err;
char title[CONFERENCE_MAX_TITLE_LENGTH + 1];
if (argc < 1) {
size_t tlen = tox_conference_get_title_size(m, self->num, &err);
if (err != TOX_ERR_CONFERENCE_TITLE_OK || tlen >= sizeof(title)) {
print_err(self, "Title is not set");
return;
}
if (!tox_conference_get_title(m, self->num, (uint8_t *) title, &err)) {
print_err(self, "Title is not set");
return;
}
title[tlen] = '\0';
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Title is set to: %s", title);
return;
}
size_t len = strlen(argv[1]);
if (len >= sizeof(title)) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to set title: max length exceeded.");
return;
}
snprintf(title, sizeof(title), "%s", argv[1]);
if (!tox_conference_set_title(m, self->num, (uint8_t *) title, len, &err)) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Failed to set title (error %d)", err);
return;
}
conference_rename_log_path(m, self->num, title); // must be called first
conference_set_title(self, self->num, title, len);
char selfnick[TOX_MAX_NAME_LENGTH];
tox_self_get_name(m, (uint8_t *) selfnick);
size_t sn_len = tox_self_get_name_size(m);
selfnick[sn_len] = '\0';
line_info_add(self, true, selfnick, NULL, NAME_CHANGE, 0, 0, " set the conference title to: %s", title);
char tmp_event[MAX_STR_SIZE + 20];
snprintf(tmp_event, sizeof(tmp_event), "set title to %s", title);
write_to_log(tmp_event, selfnick, self->chatwin->log, true);
}
#ifdef AUDIO
void cmd_enable_audio(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
bool enable;
if (argc == 1 && !strcasecmp(argv[1], "on")) {
enable = true;
} else if (argc == 1 && !strcasecmp(argv[1], "off")) {
enable = false;
} else {
print_err(self, "Please specify: on | off");
return;
}
if (enable ? enable_conference_audio(self, m, self->num) : disable_conference_audio(self, m, self->num)) {
print_err(self, enable ? "Enabled conference audio. Use the '/ptt' command to toggle Push-To-Talk."
: "Disabled conference audio");
} else {
print_err(self, enable ? "Failed to enable audio" : "Failed to disable audio");
}
}
void cmd_conference_mute(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
if (argc < 1) {
if (conference_mute_self(self->num)) {
print_err(self, "Toggled self audio mute status");
} else {
print_err(self, "No audio input to mute");
}
} else {
NameListEntry *entries[16];
uint32_t n = get_name_list_entries_by_prefix(self->num, argv[1], entries, 16);
if (n == 0) {
print_err(self, "No such peer");
return;
}
if (n > 1) {
print_err(self, "Multiple matching peers (use /mute [public key] to disambiguate):");
for (uint32_t i = 0; i < n; ++i) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "%s: %s", entries[i]->pubkey_str, entries[i]->name);
}
return;
}
if (conference_mute_peer(m, self->num, entries[0]->peernum)) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Toggled audio mute status of %s", entries[0]->name);
} else {
print_err(self, "Peer is not on the call");
}
}
}
void cmd_conference_sense(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
if (argc == 0) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Current VAD threshold: %.1f",
(double) conference_get_VAD_threshold(self->num));
return;
}
if (argc > 1) {
print_err(self, "Only one argument allowed.");
return;
}
char *end;
float value = strtof(argv[1], &end);
if (*end) {
print_err(self, "Invalid input");
return;
}
if (conference_set_VAD_threshold(self->num, value)) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Set VAD threshold to %.1f", (double) value);
} else {
print_err(self, "Failed to set conference audio input sensitivity.");
}
}
void cmd_conference_push_to_talk(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
{
UNUSED_VAR(window);
UNUSED_VAR(m);
bool enable;
if (argc == 1 && !strcasecmp(argv[1], "on")) {
enable = true;
} else if (argc == 1 && !strcasecmp(argv[1], "off")) {
enable = false;
} else {
print_err(self, "Please specify: on | off");
return;
}
if (!toggle_conference_push_to_talk(self->num, enable)) {
print_err(self, "Failed to toggle push to talk.");
return;
}
print_err(self, enable ? "Push-To-Talk is enabled. Push F2 to activate" : "Push-To-Talk is disabled");
}
#endif /* AUDIO */

36
src/conference_commands.h Normal file
View File

@ -0,0 +1,36 @@
/* conference_commands.h
*
*
* Copyright (C) 2020 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef CONFERENCE_COMMANDS_H
#define CONFERENCE_COMMANDS_H
#include "toxic.h"
#include "windows.h"
void cmd_conference_set_title(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_enable_audio(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_conference_mute(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_conference_sense(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
void cmd_conference_push_to_talk(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
#endif /* CONFERENCE_COMMANDS_H */

View File

@ -1,100 +1,78 @@
/*
* Copyright (C) 2013 Tox project All Rights Reserved.
/* configdir.c
*
* This file is part of Tox.
*
* Tox is free software: you can redistribute it and/or modify
* 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.
*
* Tox is distributed in the hope that it will be useful,
* 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 Tox. If not, see <http://www.gnu.org/licenses/>.
* along with Toxic. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#ifdef _WIN32
#include <shlobj.h>
#include <direct.h>
#else /* WIN32 */
#include <unistd.h>
#include <pwd.h>
#endif /* WIN32 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include "configdir.h"
#include "misc_tools.h"
#include "toxic.h"
/* get the user's home directory. */
void get_home_dir(char *home, int size)
{
struct passwd pwd;
struct passwd *pwdbuf;
const char *hmstr;
char buf[NSS_BUFLEN_PASSWD];
int rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf);
if (rc == 0) {
hmstr = pwd.pw_dir;
} else {
hmstr = getenv("HOME");
if (hmstr == NULL) {
return;
}
snprintf(buf, sizeof(buf), "%s", hmstr);
hmstr = buf;
}
snprintf(home, size, "%s", hmstr);
}
/**
* @brief Get the users config directory.
* @brief Get the user's config directory.
*
* This is without a trailing slash.
* This is without a trailing slash. Resulting string must be freed.
*
* @return The users config dir or NULL on error.
*/
char *get_user_config_dir(void)
{
char *user_config_dir;
#ifdef _WIN32
#warning Please fix configdir for Win32
return NULL;
#if 0
char appdata[MAX_PATH];
BOOL ok;
char home[NSS_BUFLEN_PASSWD] = {0};
get_home_dir(home, sizeof(home));
ok = SHGetSpecialFolderPathA(NULL, appdata, CSIDL_PROFILE, TRUE);
if (!ok) {
return NULL;
}
user_config_dir = strdup(appdata);
return user_config_dir;
#endif
#else /* WIN32 */
#ifndef NSS_BUFLEN_PASSWD
#define NSS_BUFLEN_PASSWD 4096
#endif /* NSS_BUFLEN_PASSWD */
struct passwd pwd;
struct passwd *pwdbuf;
const char *home;
char buf[NSS_BUFLEN_PASSWD];
size_t len;
int rc;
rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf);
if (rc == 0) {
home = pwd.pw_dir;
} else {
home = getenv("HOME");
if (home == NULL) {
return NULL;
}
/* env variables can be tainted */
snprintf(buf, sizeof(buf), "%s", home);
home = buf;
}
char *user_config_dir = NULL;
size_t len = 0;
# if defined(__APPLE__)
len = strlen(home) + strlen("/Library/Application Support") + 1;
@ -107,8 +85,9 @@ char *get_user_config_dir(void)
snprintf(user_config_dir, len, "%s/Library/Application Support", home);
# else /* __APPLE__ */
const char *tmp;
if (!(tmp = getenv("XDG_CONFIG_HOME"))) {
const char *tmp = getenv("XDG_CONFIG_HOME");
if (tmp == NULL) {
len = strlen(home) + strlen("/.config") + 1;
user_config_dir = malloc(len);
@ -124,56 +103,52 @@ char *get_user_config_dir(void)
# endif /* __APPLE__ */
return user_config_dir;
#undef NSS_BUFLEN_PASSWD
#endif /* WIN32 */
}
/*
* Creates the config directory.
/* Creates the config and chatlog directories.
*
* Returns 0 on success.
* Returns -1 on failure.
*/
int create_user_config_dir(char *path)
int create_user_config_dirs(char *path)
{
#ifdef _WIN32
#warning Please fix configdir for Win32
return -1;
#if 0
char *fullpath = malloc(strlen(path) + strlen(CONFIGDIR) + 1);
strcpy(fullpath, path);
strcat(fullpath, CONFIGDIR);
mkdir_err = _mkdir(fullpath);
struct __stat64 buf;
if (mkdir_err && (errno != EEXIST || _wstat64(fullpath, &buf) || !S_ISDIR(buf.st_mode))) {
free(fullpath);
return -1;
}
free(fullpath);
#endif
#else
int mkdir_err;
mkdir_err = mkdir(path, 0700);
struct stat buf;
int mkdir_err = mkdir(path, 0700);
if (mkdir_err && (errno != EEXIST || stat(path, &buf) || !S_ISDIR(buf.st_mode))) {
return -1;
}
char *fullpath = malloc(strlen(path) + strlen(CONFIGDIR) + 1);
char *logpath = malloc(strlen(path) + strlen(LOGDIR) + 1);
if (fullpath == NULL || logpath == NULL) {
exit_toxic_err("failed in load_data_structures", FATALERR_MEMORY);
}
strcpy(fullpath, path);
strcat(fullpath, CONFIGDIR);
strcpy(logpath, path);
strcat(logpath, LOGDIR);
mkdir_err = mkdir(fullpath, 0700);
if (mkdir_err && (errno != EEXIST || stat(fullpath, &buf) || !S_ISDIR(buf.st_mode))) {
free(fullpath);
free(logpath);
return -1;
}
mkdir_err = mkdir(logpath, 0700);
if (mkdir_err && (errno != EEXIST || stat(logpath, &buf) || !S_ISDIR(buf.st_mode))) {
free(fullpath);
free(logpath);
return -1;
}
free(logpath);
free(fullpath);
return 0;
#endif
}

View File

@ -1,33 +1,56 @@
/*
* Copyright (C) 2013 Tox project All Rights Reserved.
/* configdir.h
*
* This file is part of Tox.
*
* Tox is free software: you can redistribute it and/or modify
* 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.
*
* Tox is distributed in the hope that it will be useful,
* 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 Tox. If not, see <http://www.gnu.org/licenses/>.
* along with Toxic. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifdef _win32
#define CONFIGDIR "\\tox\\"
#else
#define CONFIGDIR "/tox/"
#ifndef CONFIGDIR_H
#define CONFIGDIR_H
#ifndef NSS_BUFLEN_PASSWD
#define NSS_BUFLEN_PASSWD 4096
#endif
#define CONFIGDIR "/tox/"
#define LOGDIR "/tox/chatlogs/"
#ifndef S_ISDIR
#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
#endif
/**
* @brief Get the user's config directory.
*
* This is without a trailing slash. Resulting string must be freed.
*
* @return The users config dir or NULL on error.
*/
char *get_user_config_dir(void);
int create_user_config_dir(char *path);
/* get the user's home directory. */
void get_home_dir(char *home, int size);
/* Creates the config and chatlog directories.
*
* Returns 0 on success.
* Returns -1 on failure.
*/
int create_user_config_dirs(char *path);
#endif /* CONFIGDIR_H */

94
src/curl_util.c Normal file
View File

@ -0,0 +1,94 @@
/* curl_util.c
*
*
* Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
*
*/
#include <stdint.h>
#include <string.h>
#include <curl/curl.h>
#include <tox/tox.h>
#include "curl_util.h"
/* Sets proxy info for given CURL handler.
*
* Returns 0 on success or if no proxy is set by the client.
* Returns -1 if proxy info is invalid.
* Returns an int > 0 on curl error (see: https://curl.haxx.se/libcurl/c/libcurl-errors.html)
*/
int set_curl_proxy(CURL *c_handle, const char *proxy_address, uint16_t port, uint8_t proxy_type)
{
if (proxy_type == TOX_PROXY_TYPE_NONE) {
return 0;
}
if (proxy_address == NULL || port == 0) {
return -1;
}
int ret = curl_easy_setopt(c_handle, CURLOPT_PROXYPORT, (long) port);
if (ret != CURLE_OK) {
return ret;
}
long int type = proxy_type == TOX_PROXY_TYPE_SOCKS5 ? CURLPROXY_SOCKS5_HOSTNAME : CURLPROXY_HTTP;
ret = curl_easy_setopt(c_handle, CURLOPT_PROXYTYPE, type);
if (ret != CURLE_OK) {
return ret;
}
ret = curl_easy_setopt(c_handle, CURLOPT_PROXY, proxy_address);
if (ret != CURLE_OK) {
return ret;
}
return 0;
}
/* Callback function for CURL to write received data.
*
* This function will append data from an http request to the data buffer
* until the request is complete or the buffer is full. Buffer will be null terminated.
*
* Returns number of bytes received from http request on success (don't change this).
* Returns 0 if data exceeds buffer size.
*/
size_t curl_cb_write_data(void *data, size_t size, size_t nmemb, void *user_pointer)
{
struct Recv_Curl_Data *recv_data = (struct Recv_Curl_Data *) user_pointer;
size_t length = size * nmemb;
size_t total_size = length + recv_data->length;
if (total_size > MAX_RECV_CURL_DATA_SIZE) {
return 0;
}
memcpy(recv_data->data + recv_data->length, data, length);
recv_data->data[total_size] = '\0';
recv_data->length += length;
return length;
}

57
src/curl_util.h Normal file
View File

@ -0,0 +1,57 @@
/* curl_util.h
*
*
* Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef CURL_UTIL_H
#define CURL_UTIL_H
#include <stdint.h>
/* List based on Mozilla's recommended configurations for modern browsers */
#define TLS_CIPHER_SUITE_LIST "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK"
/* Max size of an http response that we can store in Recv_Data */
#define MAX_RECV_CURL_DATA_SIZE 32767
/* Holds data received from curl lookup */
struct Recv_Curl_Data {
char data[MAX_RECV_CURL_DATA_SIZE + 1]; /* Data received from curl write data callback */
size_t length; /* Total number of bytes written to data buffer (doesn't include null) */
};
/* Sets proxy info for given CURL handler.
*
* Returns 0 on success or if no proxy is set by the client.
* Returns -1 if proxy info is invalid.
* Returns an int > 0 on curl error (see: https://curl.haxx.se/libcurl/c/libcurl-errors.html)
*/
int set_curl_proxy(CURL *c_handle, const char *proxy_address, uint16_t port, uint8_t proxy_type);
/* Callback function for CURL to write received data.
*
* This function will append data from an http request to the data buffer
* until the request is complete or the buffer is full. Buffer will be null terminated.
*
* Returns size of bytes written to the data buffer.
*/
size_t curl_cb_write_data(void *data, size_t size, size_t nmemb, void *user_pointer);
#endif /* CURL_UTIL_H */

View File

@ -1,92 +1,262 @@
/*
* Toxic -- Tox Curses Client
/* execute.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 <http://www.gnu.org/licenses/>.
*
*/
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "toxic_windows.h"
#include "execute.h"
#include "api.h"
#include "chat_commands.h"
#include "execute.h"
#include "global_commands.h"
#include "conference_commands.h"
#include "groupchat_commands.h"
#include "line_info.h"
#include "misc_tools.h"
#include "notify.h"
#include "toxic.h"
#include "windows.h"
struct cmd_func {
const char *name;
void (*func)(WINDOW *w, ToxWindow *, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
};
#define GLOBAL_NUM_COMMANDS 13
static struct cmd_func global_commands[] = {
{ "/accept", cmd_accept },
{ "/add", cmd_add },
{ "/avatar", cmd_avatar },
{ "/clear", cmd_clear },
{ "/connect", cmd_connect },
{ "/decline", cmd_decline },
{ "/exit", cmd_quit },
{ "/groupchat", cmd_groupchat },
{ "/conference", cmd_conference },
{ "/group", cmd_groupchat },
#ifdef GAMES
{ "/game", cmd_game },
#endif
{ "/help", cmd_prompt_help },
{ "/join", cmd_join },
{ "/log", cmd_log },
{ "/myid", cmd_myid },
#ifdef QRCODE
{ "/myqr", cmd_myqr },
#endif /* QRCODE */
{ "/nick", cmd_nick },
{ "/note", cmd_note },
{ "/nospam", cmd_nospam },
{ "/q", cmd_quit },
{ "/quit", cmd_quit },
{ "/requests", cmd_requests },
{ "/status", cmd_status },
#ifdef AUDIO
{ "/lsdev", cmd_list_devices },
{ "/sdev", cmd_change_device },
#endif /* AUDIO */
#ifdef VIDEO
{ "/lsvdev", cmd_list_video_devices },
{ "/svdev", cmd_change_video_device },
#endif /* VIDEO */
#ifdef PYTHON
{ "/run", cmd_run },
#endif /* PYTHON */
{ NULL, NULL },
};
#define CHAT_NUM_COMMANDS 5
static struct cmd_func chat_commands[] = {
{ "/help", cmd_chat_help },
{ "/invite", cmd_groupinvite },
{ "/join", cmd_join_group },
{ "/cancel", cmd_cancelfile },
{ "/cinvite", cmd_conference_invite },
{ "/cjoin", cmd_conference_join },
{ "/gaccept", cmd_group_accept },
{ "/invite", cmd_group_invite },
#ifdef GAMES
{ "/play", cmd_game_join },
#endif
{ "/savefile", cmd_savefile },
{ "/sendfile", cmd_sendfile },
#ifdef AUDIO
{ "/call", cmd_call },
{ "/answer", cmd_answer },
{ "/reject", cmd_reject },
{ "/hangup", cmd_hangup },
{ "/mute", cmd_mute },
{ "/sense", cmd_sense },
{ "/bitrate", cmd_bitrate },
#endif /* AUDIO */
#ifdef VIDEO
{ "/vcall", cmd_vcall },
{ "/video", cmd_video },
{ "/res", cmd_res },
#endif /* VIDEO */
{ NULL, NULL },
};
/* Parses input command and puts args into arg array.
Returns number of arguments on success, -1 on failure. */
static int parse_command(WINDOW *w, char *cmd, char (*args)[MAX_STR_SIZE])
static struct cmd_func conference_commands[] = {
{ "/title", cmd_conference_set_title },
#ifdef AUDIO
{ "/audio", cmd_enable_audio },
{ "/mute", cmd_conference_mute },
{ "/ptt", cmd_conference_push_to_talk },
{ "/sense", cmd_conference_sense },
#endif /* AUDIO */
{ NULL, NULL },
};
static struct cmd_func groupchat_commands[] = {
{ "/chatid", cmd_chatid },
{ "/disconnect", cmd_disconnect },
{ "/ignore", cmd_ignore },
{ "/kick", cmd_kick },
{ "/list", cmd_list },
{ "/locktopic", cmd_set_topic_lock },
{ "/mod", cmd_mod },
{ "/nick", cmd_group_nick },
{ "/passwd", cmd_set_passwd },
{ "/peerlimit", cmd_set_peerlimit },
{ "/privacy", cmd_set_privacy },
{ "/rejoin", cmd_rejoin },
{ "/silence", cmd_silence },
{ "/topic", cmd_set_topic },
{ "/unignore", cmd_unignore },
{ "/unmod", cmd_unmod },
{ "/unsilence", cmd_unsilence },
{ "/voice", cmd_set_voice },
{ "/whois", cmd_whois },
{ NULL, NULL },
};
/* Special commands are commands that only take one argument even if it contains spaces */
static const char special_commands[][MAX_CMDNAME_SIZE] = {
"/add",
"/avatar",
"/gaccept",
"/group",
"/ignore",
"/kick",
"/mod",
"/nick",
"/note",
"/passwd",
"/silence",
"/topic",
"/unignore",
"/unmod",
"/unsilence",
"/whois",
#ifdef PYTHON
"/run",
#endif /* PYTHON */
"/sendfile",
"/title",
"/mute",
"",
};
/* Returns true if input command is in the special_commands array. */
static bool is_special_command(const char *input)
{
const int s = char_find(0, input, ' ');
for (int i = 0; special_commands[i][0] != '\0'; ++i) {
if (strncmp(input, special_commands[i], s) == 0) {
return true;
}
}
return false;
}
/* Parses commands in the special_commands array. Unlike parse_command, this function
* does not split the input string at spaces.
*
* Returns the number of arguments.
*/
static int parse_special_command(const char *input, char (*args)[MAX_STR_SIZE])
{
int len = strlen(input);
int s = char_find(0, input, ' ');
memcpy(args[0], input, s);
args[0][s++] = '\0'; // increment to remove space after "/command "
if (s >= len) {
return 1; // No additional args
}
memcpy(args[1], input + s, len - s);
args[1][len - s] = '\0';
return 2;
}
/* Parses input command and puts args into arg array.
*
* Returns the number of arguments.
*/
static int parse_command(const char *input, char (*args)[MAX_STR_SIZE])
{
if (is_special_command(input)) {
return parse_special_command(input, args);
}
char *cmd = strdup(input);
if (cmd == NULL) {
exit_toxic_err("failed in parse_command", FATALERR_MEMORY);
}
int num_args = 0;
bool cmd_end = false; // flags when we get to the end of cmd
char *end; // points to the end of the current arg
/* characters wrapped in double quotes count as one arg */
while (!cmd_end && num_args < MAX_NUM_ARGS) {
if (*cmd == '\"') {
end = strchr(cmd+1, '\"');
while (num_args < MAX_NUM_ARGS) {
int i = char_find(0, cmd, ' '); // index of last char in an argument
memcpy(args[num_args], cmd, i);
args[num_args++][i] = '\0';
if (end++ == NULL) { /* Increment past the end quote */
wprintw(w, "Invalid argument. Did you forget a closing \"?\n");
return -1;
if (cmd[i] == '\0') { // no more args
break;
}
cmd_end = *end == '\0';
} else {
end = strchr(cmd, ' ');
cmd_end = end == NULL;
}
if (!cmd_end)
*end++ = '\0'; /* mark end of current argument */
/* Copy from start of current arg to where we just inserted the null byte */
strcpy(args[num_args++], cmd);
cmd = end;
char tmp[MAX_STR_SIZE];
snprintf(tmp, sizeof(tmp), "%s", &cmd[i + 1]);
strcpy(cmd, tmp); // tmp will always fit inside cmd
}
free(cmd);
return num_args;
}
/* Matches command to respective function. Returns 0 on match, 1 on no match */
static int do_command(WINDOW *w, ToxWindow *self, Tox *m, int num_args, int num_cmds,
struct cmd_func *commands, char (*args)[MAX_STR_SIZE])
/* Matches command to respective function.
*
* Returns 0 on match.
* Returns 1 on no match
*/
static int do_command(WINDOW *w, ToxWindow *self, Tox *m, int num_args, struct cmd_func *commands,
char (*args)[MAX_STR_SIZE])
{
int i;
for (i = 0; i < num_cmds; ++i) {
for (size_t i = 0; commands[i].name != NULL; ++i) {
if (strcmp(args[0], commands[i].name) == 0) {
(commands[i].func)(w, self, m, num_args-1, args);
(commands[i].func)(w, self, m, num_args - 1, args);
return 0;
}
}
@ -94,33 +264,61 @@ static int do_command(WINDOW *w, ToxWindow *self, Tox *m, int num_args, int num_
return 1;
}
void execute(WINDOW* w, ToxWindow *self, Tox *m, char *cmd, int mode)
void execute(WINDOW *w, ToxWindow *self, Tox *m, const char *input, int mode)
{
if (string_is_empty(cmd))
if (string_is_empty(input)) {
return;
}
char args[MAX_NUM_ARGS][MAX_STR_SIZE] = {0};
int num_args = parse_command(w, cmd, args);
char args[MAX_NUM_ARGS][MAX_STR_SIZE];
int num_args = parse_command(input, args);
if (num_args == -1)
if (num_args <= 0) {
return;
}
/* Try to match input command to command functions. If non-global command mode is specified,
try specified mode's commands first, then upon failure try global commands.
Note: Global commands must come last in case of duplicate command names */
* try specified mode's commands first, then upon failure try global commands.
*
* Note: Global commands must come last in case of duplicate command names
*/
switch (mode) {
case CHAT_COMMAND_MODE:
if (do_command(w, self, m, num_args, CHAT_NUM_COMMANDS, chat_commands, args) == 0)
case CHAT_COMMAND_MODE: {
if (do_command(w, self, m, num_args, chat_commands, args) == 0) {
return;
break;
}
case GROUPCHAT_COMMAND_MODE:
break;
}
if (do_command(w, self, m, num_args, GLOBAL_NUM_COMMANDS, global_commands, args) == 0)
case CONFERENCE_COMMAND_MODE: {
if (do_command(w, self, m, num_args, conference_commands, args) == 0) {
return;
}
wprintw(w, "Invalid command.\n");
break;
}
case GROUPCHAT_COMMAND_MODE: {
if (do_command(w, self, m, num_args, groupchat_commands, args) == 0) {
return;
}
break;
}
}
if (do_command(w, self, m, num_args, global_commands, args) == 0) {
return;
}
#ifdef PYTHON
if (do_plugin_command(num_args, args) == 0) {
return;
}
#endif
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Invalid command.");
}

View File

@ -1,13 +1,40 @@
/*
* Toxic -- Tox Curses Client
/* execute.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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef EXECUTE_H
#define EXECUTE_H
#include "toxic.h"
#include "windows.h"
#define MAX_NUM_ARGS 4 /* Includes command */
enum {
GLOBAL_COMMAND_MODE,
CHAT_COMMAND_MODE,
CONFERENCE_COMMAND_MODE,
GROUPCHAT_COMMAND_MODE,
};
void execute(WINDOW *w, ToxWindow *self, Tox *m, char *cmd, int mode);
void execute(WINDOW *w, ToxWindow *self, Tox *m, const char *input, int mode);
#endif /* EXECUTE_H */

421
src/file_transfers.c Normal file
View File

@ -0,0 +1,421 @@
/* file_transfers.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 <http://www.gnu.org/licenses/>.
*
*/
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "execute.h"
#include "file_transfers.h"
#include "friendlist.h"
#include "line_info.h"
#include "misc_tools.h"
#include "notify.h"
#include "toxic.h"
#include "windows.h"
extern FriendsList Friends;
/* number of "#"'s in file transfer progress bar. Keep well below MAX_STR_SIZE */
#define NUM_PROG_MARKS 50
#define STR_BUF_SIZE 30
/* creates initial progress line that will be updated during file transfer.
Assumes progline has room for at least MAX_STR_SIZE bytes */
void init_progress_bar(char *progline)
{
strcpy(progline, "0% [");
for (size_t i = 0; i < NUM_PROG_MARKS; ++i) {
strcat(progline, "-");
}
strcat(progline, "] 0.0 B/s");
}
/* prints a progress bar for file transfers. */
void print_progress_bar(ToxWindow *self, double bps, double pct_done, uint32_t line_id)
{
if (bps < 0 || pct_done < 0 || pct_done > 100) {
return;
}
char pct_str[STR_BUF_SIZE];
snprintf(pct_str, sizeof(pct_str), "%.1f%%", pct_done);
char bps_str[STR_BUF_SIZE];
bytes_convert_str(bps_str, sizeof(bps_str), bps);
char prog_line[NUM_PROG_MARKS + 1];
prog_line[0] = 0;
int n = pct_done / (100 / NUM_PROG_MARKS);
int i, j;
for (i = 0; i < n; ++i) {
strcat(prog_line, "=");
}
if (pct_done < 100) {
strcpy(prog_line + n, ">");
}
for (j = i; j < NUM_PROG_MARKS - 1; ++j) {
strcat(prog_line, "-");
}
size_t line_buf_size = strlen(pct_str) + NUM_PROG_MARKS + strlen(bps_str) + 7;
char *full_line = malloc(line_buf_size);
if (full_line == NULL) {
return;
}
snprintf(full_line, line_buf_size, "%s [%s] %s/s", pct_str, prog_line, bps_str);
line_info_set(self, line_id, full_line);
free(full_line);
}
static void refresh_progress_helper(ToxWindow *self, FileTransfer *ft)
{
if (ft->state == FILE_TRANSFER_INACTIVE) {
return;
}
/* Timeout must be set to 1 second to show correct bytes per second */
if (!timed_out(ft->last_line_progress, 1)) {
return;
}
double remain = ft->file_size - ft->position;
double pct_done = remain > 0 ? (1 - (remain / ft->file_size)) * 100 : 100;
print_progress_bar(self, ft->bps, pct_done, ft->line_id);
ft->bps = 0;
ft->last_line_progress = get_unix_time();
}
/* refreshes active file transfer status bars.
*
* Return true if there is at least one active file transfer in either direction.
*/
bool refresh_file_transfer_progress(ToxWindow *self, uint32_t friendnumber)
{
bool active = false;
for (size_t i = 0; i < MAX_FILES; ++i) {
FileTransfer *ft_r = &Friends.list[friendnumber].file_receiver[i];
FileTransfer *ft_s = &Friends.list[friendnumber].file_sender[i];
refresh_progress_helper(self, ft_r);
refresh_progress_helper(self, ft_s);
if (ft_r->state != FILE_TRANSFER_INACTIVE || ft_s->state != FILE_TRANSFER_INACTIVE) {
active = true;
}
}
return active;
}
static void clear_file_transfer(FileTransfer *ft)
{
*ft = (FileTransfer) {
0
};
}
/* Returns a pointer to friendnumber's FileTransfer struct associated with filenumber.
* Returns NULL if filenumber is invalid.
*/
FileTransfer *get_file_transfer_struct(uint32_t friendnumber, uint32_t filenumber)
{
for (size_t i = 0; i < MAX_FILES; ++i) {
FileTransfer *ft_send = &Friends.list[friendnumber].file_sender[i];
if (ft_send->state != FILE_TRANSFER_INACTIVE && ft_send->filenumber == filenumber) {
return ft_send;
}
FileTransfer *ft_recv = &Friends.list[friendnumber].file_receiver[i];
if (ft_recv->state != FILE_TRANSFER_INACTIVE && ft_recv->filenumber == filenumber) {
return ft_recv;
}
}
return NULL;
}
/* Returns a pointer to the FileTransfer struct associated with index with the direction specified.
* Returns NULL on failure.
*/
FileTransfer *get_file_transfer_struct_index(uint32_t friendnumber, uint32_t index,
FILE_TRANSFER_DIRECTION direction)
{
if (direction != FILE_TRANSFER_RECV && direction != FILE_TRANSFER_SEND) {
return NULL;
}
for (size_t i = 0; i < MAX_FILES; ++i) {
FileTransfer *ft = direction == FILE_TRANSFER_SEND ?
&Friends.list[friendnumber].file_sender[i] :
&Friends.list[friendnumber].file_receiver[i];
if (ft->state != FILE_TRANSFER_INACTIVE && ft->index == index) {
return ft;
}
}
return NULL;
}
/* Returns a pointer to an unused file sender.
* Returns NULL if all file senders are in use.
*/
static FileTransfer *new_file_sender(ToxWindow *window, uint32_t friendnumber, uint32_t filenumber, uint8_t type)
{
for (size_t i = 0; i < MAX_FILES; ++i) {
FileTransfer *ft = &Friends.list[friendnumber].file_sender[i];
if (ft->state == FILE_TRANSFER_INACTIVE) {
clear_file_transfer(ft);
ft->window = window;
ft->index = i;
ft->friendnumber = friendnumber;
ft->filenumber = filenumber;
ft->file_type = type;
ft->state = FILE_TRANSFER_PENDING;
return ft;
}
}
return NULL;
}
/* Returns a pointer to an unused file receiver.
* Returns NULL if all file receivers are in use.
*/
static FileTransfer *new_file_receiver(ToxWindow *window, uint32_t friendnumber, uint32_t filenumber,
uint8_t type)
{
for (size_t i = 0; i < MAX_FILES; ++i) {
FileTransfer *ft = &Friends.list[friendnumber].file_receiver[i];
if (ft->state == FILE_TRANSFER_INACTIVE) {
clear_file_transfer(ft);
ft->window = window;
ft->index = i;
ft->friendnumber = friendnumber;
ft->filenumber = filenumber;
ft->file_type = type;
ft->state = FILE_TRANSFER_PENDING;
return ft;
}
}
return NULL;
}
/* Initializes an unused file transfer and returns its pointer.
* Returns NULL on failure.
*/
FileTransfer *new_file_transfer(ToxWindow *window, uint32_t friendnumber, uint32_t filenumber,
FILE_TRANSFER_DIRECTION direction, uint8_t type)
{
if (direction == FILE_TRANSFER_RECV) {
return new_file_receiver(window, friendnumber, filenumber, type);
}
if (direction == FILE_TRANSFER_SEND) {
return new_file_sender(window, friendnumber, filenumber, type);
}
return NULL;
}
int file_send_queue_add(uint32_t friendnumber, const char *file_path, size_t length)
{
if (length == 0 || file_path == NULL) {
return -1;
}
if (length > TOX_MAX_FILENAME_LENGTH) {
return -2;
}
for (size_t i = 0; i < MAX_FILES; ++i) {
PendingFileTransfer *pending_slot = &Friends.list[friendnumber].file_send_queue[i];
if (pending_slot->pending) {
continue;
}
pending_slot->pending = true;
memcpy(pending_slot->file_path, file_path, length);
pending_slot->file_path[length] = 0;
pending_slot->length = length;
return i;
}
return -3;
}
#define FILE_TRANSFER_SEND_CMD "/sendfile "
#define FILE_TRANSFER_SEND_LEN (sizeof(FILE_TRANSFER_SEND_CMD) - 1)
void file_send_queue_check(ToxWindow *self, Tox *m, uint32_t friendnumber)
{
for (size_t i = 0; i < MAX_FILES; ++i) {
PendingFileTransfer *pending_slot = &Friends.list[friendnumber].file_send_queue[i];
if (!pending_slot->pending) {
continue;
}
char command[TOX_MAX_FILENAME_LENGTH + FILE_TRANSFER_SEND_LEN + 1];
snprintf(command, sizeof(command), "%s%s", FILE_TRANSFER_SEND_CMD, pending_slot->file_path);
execute(self->window, self, m, command, CHAT_COMMAND_MODE);
*pending_slot = (PendingFileTransfer) {
0,
};
}
}
int file_send_queue_remove(uint32_t friendnumber, size_t index)
{
if (index >= MAX_FILES) {
return -1;
}
PendingFileTransfer *pending_slot = &Friends.list[friendnumber].file_send_queue[index];
if (!pending_slot->pending) {
return -1;
}
*pending_slot = (PendingFileTransfer) {
0,
};
return 0;
}
/* Closes file transfer ft.
*
* Set CTRL to -1 if we don't want to send a control signal.
* Set message or self to NULL if we don't want to display a message.
*/
void close_file_transfer(ToxWindow *self, Tox *m, FileTransfer *ft, int CTRL, const char *message,
Notification sound_type)
{
if (!ft) {
return;
}
if (ft->state == FILE_TRANSFER_INACTIVE) {
return;
}
if (ft->file) {
fclose(ft->file);
}
if (CTRL >= 0) {
Tox_Err_File_Control err;
if (!tox_file_control(m, ft->friendnumber, ft->filenumber, (Tox_File_Control) CTRL, &err)) {
fprintf(stderr, "Failed to cancel file transfer: %d\n", err);
}
}
if (message && self) {
if (self->active_box != -1 && sound_type != silent) {
box_notify2(self, sound_type, NT_NOFOCUS | NT_WNDALERT_2, self->active_box, "%s", message);
} else {
box_notify(self, sound_type, NT_NOFOCUS | NT_WNDALERT_2, &self->active_box, self->name, "%s", message);
}
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "%s", message);
}
clear_file_transfer(ft);
}
/* Kills active outgoing avatar file transfers for friendnumber */
void kill_avatar_file_transfers_friend(Tox *m, uint32_t friendnumber)
{
for (size_t i = 0; i < MAX_FILES; ++i) {
FileTransfer *ft = &Friends.list[friendnumber].file_sender[i];
if (ft->file_type == TOX_FILE_KIND_AVATAR) {
close_file_transfer(NULL, m, ft, TOX_FILE_CONTROL_CANCEL, NULL, silent);
}
}
}
/* Kills all active file transfers for friendnumber */
void kill_all_file_transfers_friend(Tox *m, uint32_t friendnumber)
{
for (size_t i = 0; i < MAX_FILES; ++i) {
close_file_transfer(NULL, m, &Friends.list[friendnumber].file_sender[i], TOX_FILE_CONTROL_CANCEL, NULL, silent);
close_file_transfer(NULL, m, &Friends.list[friendnumber].file_receiver[i], TOX_FILE_CONTROL_CANCEL, NULL, silent);
file_send_queue_remove(friendnumber, i);
}
}
void kill_all_file_transfers(Tox *m)
{
for (size_t i = 0; i < Friends.max_idx; ++i) {
kill_all_file_transfers_friend(m, Friends.list[i].num);
}
}
bool file_transfer_recv_path_exists(const char *path)
{
for (size_t friendnumber = 0; friendnumber < Friends.max_idx; ++friendnumber) {
if (!Friends.list[friendnumber].active) {
continue;
}
for (size_t i = 0; i < MAX_FILES; ++i) {
FileTransfer *ft = &Friends.list[friendnumber].file_receiver[i];
if (ft->state == FILE_TRANSFER_INACTIVE) {
continue;
}
if (strcmp(path, ft->file_path) == 0) {
return true;
}
}
}
return false;
}

151
src/file_transfers.h Normal file
View File

@ -0,0 +1,151 @@
/* file_transfers.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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef FILE_TRANSFERS_H
#define FILE_TRANSFERS_H
#include <limits.h>
#include "notify.h"
#include "toxic.h"
#include "windows.h"
#define KiB (uint32_t) 1024
#define MiB (uint32_t) (1024 << 10) /* 1024^2 */
#define GiB (uint32_t) (1024 << 20) /* 1024^3 */
#define MAX_FILES 32
typedef enum FILE_TRANSFER_STATE {
FILE_TRANSFER_INACTIVE,
FILE_TRANSFER_PAUSED,
FILE_TRANSFER_PENDING,
FILE_TRANSFER_STARTED,
} FILE_TRANSFER_STATE;
typedef enum FILE_TRANSFER_DIRECTION {
FILE_TRANSFER_SEND,
FILE_TRANSFER_RECV
} FILE_TRANSFER_DIRECTION;
typedef struct FileTransfer {
ToxWindow *window;
FILE *file;
FILE_TRANSFER_STATE state;
uint8_t file_type;
char file_name[TOX_MAX_FILENAME_LENGTH + 1];
char file_path[PATH_MAX + 1]; /* Not used by senders */
double bps;
uint32_t filenumber;
uint32_t friendnumber;
size_t index;
uint64_t file_size;
uint64_t position;
time_t last_line_progress; /* The last time we updated the progress bar */
uint32_t line_id;
uint8_t file_id[TOX_FILE_ID_LENGTH];
} FileTransfer;
typedef struct PendingFileTransfer {
char file_path[TOX_MAX_FILENAME_LENGTH + 1];
size_t length;
uint32_t friendnumber;
bool pending;
} PendingFileTransfer;
/* creates initial progress line that will be updated during file transfer.
progline must be at lesat MAX_STR_SIZE bytes */
void init_progress_bar(char *progline);
/* prints a progress bar for file transfers */
void print_progress_bar(ToxWindow *self, double pct_done, double bps, uint32_t line_id);
/* refreshes active file transfer status bars.
*
* Return true if there is at least one active file transfer in either direction.
*/
bool refresh_file_transfer_progress(ToxWindow *self, uint32_t friendnumber);
/* Returns a pointer to friendnumber's FileTransfer struct associated with filenumber.
* Returns NULL if filenumber is invalid.
*/
struct FileTransfer *get_file_transfer_struct(uint32_t friendnumber, uint32_t filenumber);
/* Returns a pointer to the FileTransfer struct associated with index with the direction specified.
* Returns NULL on failure.
*/
struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnumber, uint32_t index,
FILE_TRANSFER_DIRECTION direction);
/* Initializes an unused file transfer and returns its pointer.
* Returns NULL on failure.
*/
struct FileTransfer *new_file_transfer(ToxWindow *window, uint32_t friendnumber, uint32_t filenumber,
FILE_TRANSFER_DIRECTION direction, uint8_t type);
/* Adds a file designated by `file_path` of length `length` to the file transfer queue.
*
* Items in this queue will be automatically sent to the contact designated by `friendnumber`
* as soon as they appear online. The item will then be removed from the queue whether
* or not the transfer successfully initiates.
*
* If the ToxWindow associated with this friend is closed, all queued items will be
* discarded.
*
* Return the queue index on success.
* Return -1 if the length is invalid.
* Return -2 if the send queue is full.
*/
int file_send_queue_add(uint32_t friendnumber, const char *file_path, size_t length);
/* Initiates all file transfers from the file send queue for friend designated by `friendnumber`. */
void file_send_queue_check(ToxWindow *self, Tox *m, uint32_t friendnumber);
/* Removes the `index`-th item from the file send queue for `friendnumber`.
*
* Return 0 if a pending transfer was successfully removed
* Return -1 if index does not designate a pending file transfer.
*/
int file_send_queue_remove(uint32_t friendnumber, size_t index);
/* Closes file transfer ft.
*
* Set CTRL to -1 if we don't want to send a control signal.
* Set message or self to NULL if we don't want to display a message.
*/
void close_file_transfer(ToxWindow *self, Tox *m, struct FileTransfer *ft, int CTRL, const char *message,
Notification sound_type);
/* Kills active outgoing avatar file transfers for friendnumber */
void kill_avatar_file_transfers_friend(Tox *m, uint32_t friendnumber);
/* Kills all active file transfers for friendnumber */
void kill_all_file_transfers_friend(Tox *m, uint32_t friendnumber);
void kill_all_file_transfers(Tox *m);
/* Return true if any pending or active file receiver has the path `path`. */
bool file_transfer_recv_path_exists(const char *path);
#endif /* FILE_TRANSFERS_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,134 @@
#ifndef FRIENDLIST_H_53I41IM
#define FRIENDLIST_H_53I41IM
/* friendlist.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 <http://www.gnu.org/licenses/>.
*
*/
#include "toxic_windows.h"
#ifndef FRIENDLIST_H
#define FRIENDLIST_H
ToxWindow new_friendlist(void);
void disable_chatwin(int f_num);
#include <time.h>
#include "file_transfers.h"
#include "toxic.h"
#include "windows.h"
#ifdef GAMES
#include "game_base.h"
#endif
struct LastOnline {
uint64_t last_on;
struct tm tm;
char hour_min_str[TIME_STR_SIZE]; /* holds 12/24-hour time string e.g. "10:43 PM" */
};
struct ConferenceInvite {
char *key;
uint16_t length;
uint8_t type;
bool pending;
};
struct GroupInvite {
uint8_t *data;
uint16_t length;
};
#ifdef GAMES
struct GameInvite {
uint8_t *data;
size_t data_length;
GameType type;
uint32_t id;
bool pending;
};
#endif // GAMES
typedef struct {
char name[TOXIC_MAX_NAME_LENGTH + 1];
uint16_t namelength;
char statusmsg[TOX_MAX_STATUS_MESSAGE_LENGTH + 1];
size_t statusmsg_len;
char pub_key[TOX_PUBLIC_KEY_SIZE];
uint32_t num;
int chatwin;
bool active;
Tox_Connection connection_status;
bool is_typing;
bool logging_on; /* saves preference for friend irrespective of global settings */
Tox_User_Status status;
struct LastOnline last_online;
#ifdef GAMES
struct GameInvite game_invite;
#endif
struct ConferenceInvite conference_invite;
struct GroupInvite group_invite;
struct FileTransfer file_receiver[MAX_FILES];
struct FileTransfer file_sender[MAX_FILES];
PendingFileTransfer file_send_queue[MAX_FILES];
} ToxicFriend;
typedef struct {
char name[TOXIC_MAX_NAME_LENGTH + 1];
uint16_t namelength;
char pub_key[TOX_PUBLIC_KEY_SIZE];
uint32_t num;
bool active;
uint64_t last_on;
} BlockedFriend;
typedef struct {
int num_selected;
size_t num_friends;
size_t num_online;
size_t max_idx; /* 1 + the index of the last friend in list */
uint32_t *index;
ToxicFriend *list;
} FriendsList;
extern FriendsList Friends;
ToxWindow *new_friendlist(void);
void friendlist_onInit(ToxWindow *self, Tox *m);
void disable_chatwin(uint32_t f_num);
int get_friendnum(uint8_t *name);
int load_blocklist(char *data);
void kill_friendlist(ToxWindow *self);
void friendlist_onFriendAdded(ToxWindow *self, Tox *m, uint32_t num, bool sort);
Tox_User_Status get_friend_status(uint32_t friendnumber);
Tox_Connection get_friend_connection_status(uint32_t friendnumber);
/* sorts friendlist_index first by connection status then alphabetically */
void sort_friendlist_index(void);
#endif /* end of include guard: FRIENDLIST_H_53I41IM */
/*
* Returns true if friend associated with `public_key` is in the block list.
*
* `public_key` must be at least TOX_PUBLIC_KEY_SIZE bytes.
*/
bool friend_is_blocked(const char *public_key);
#endif /* end of include guard: FRIENDLIST_H */

1140
src/game_base.c Normal file

File diff suppressed because it is too large Load Diff

400
src/game_base.h Normal file
View File

@ -0,0 +1,400 @@
/* game_base.h
*
*
* Copyright (C) 2020 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef GAME_BASE
#define GAME_BASE
#include <ncurses.h>
#include <time.h>
#include <tox/tox.h>
#include "game_util.h"
#include "windows.h"
#define GAME_BORDER_COLOUR BAR_SOLID
/* Max size of a default square game window */
#define GAME_MAX_SQUARE_Y_DEFAULT 26
#define GAME_MAX_SQUARE_X_DEFAULT (GAME_MAX_SQUARE_Y_DEFAULT * 2)
/* Max size of a large square game window */
#define GAME_MAX_SQUARE_Y_LARGE 52
#define GAME_MAX_SQUARE_X_LARGE (GAME_MAX_SQUARE_Y_LARGE * 2)
/* Max size of a default size rectangle game window */
#define GAME_MAX_RECT_Y_DEFAULT 24
#define GAME_MAX_RECT_X_DEFAULT (GAME_MAX_RECT_Y_DEFAULT * 4)
/* Max size of a large rectangle game window */
#define GAME_MAX_RECT_Y_LARGE 52
#define GAME_MAX_RECT_X_LARGE (GAME_MAX_RECT_Y_LARGE * 4)
/* Maximum length of a game message set with game_set_message() */
#define GAME_MAX_MESSAGE_SIZE 64
/* Default number of seconds a game message is displayed for */
#define GAME_MESSAGE_DEFAULT_TIMEOUT 3
/***** START NETWORKING CONSTANTS *****/
/* Header starts after custom packet type byte. Comprised of: NetworkVersion (1b) + GameType (1b) + id (4b) */
#define GAME_PACKET_HEADER_SIZE (1 + 1 + sizeof(uint32_t))
/* Max size of a game packet including the header */
#define GAME_MAX_PACKET_SIZE 1024
/* Max size of a game packet payload */
#define GAME_MAX_DATA_SIZE (GAME_MAX_PACKET_SIZE - GAME_PACKET_HEADER_SIZE - 1)
/* Current version of networking protocol */
#define GAME_NETWORKING_VERSION 0x01
/***** END NETWORKING CONSTANTS *****/
typedef void cb_game_update_state(GameData *game, void *cb_data);
typedef void cb_game_render_window(GameData *game, WINDOW *window, void *cb_data);
typedef void cb_game_kill(GameData *game, void *cb_data);
typedef void cb_game_pause(GameData *game, bool is_paused, void *cb_data);
typedef void cb_game_key_press(GameData *game, int key, void *cb_data);
typedef void cb_game_on_packet(GameData *game, const uint8_t *data, size_t length, void *cb_data);
typedef enum GamePacketType {
GP_Invite = 0u,
GP_Data,
} GamePacketType;
typedef enum GameWindowShape {
GW_ShapeSquare = 0u,
GW_ShapeSquareLarge,
GW_ShapeRectangle,
GW_ShapeRectangleLarge,
GW_ShapeInvalid,
} GameWindowShape;
typedef enum GameStatus {
GS_None = 0u,
GS_Paused,
GS_Running,
GS_Finished,
GS_Invalid,
} GameStatus;
typedef enum GameType {
GT_Centipede = 0u,
GT_Chess,
GT_Life,
GT_Snake,
GT_Invalid,
} GameType;
typedef struct GameMessage {
char message[GAME_MAX_MESSAGE_SIZE + 1];
size_t length;
const Coords *coords; // pointer to coords so we can track movement
Coords original_coords; // static coords at time of being set
time_t timeout;
time_t set_time;
int attributes;
int colour;
Direction direction;
bool sticky;
bool priority;
} GameMessage;
struct GameData {
TIME_MS last_frame_time;
TIME_MS update_interval; // determines the refresh rate (lower means faster)
long int score;
size_t high_score;
int lives;
size_t level;
GameStatus status;
GameType type;
bool is_multiplayer;
bool show_lives;
bool show_score;
bool show_high_score;
bool show_level;
GameMessage *messages;
size_t messages_size;
int game_max_x; // max dimensions of game window
int game_max_y;
int parent_max_x; // max dimensions of parent window
int parent_max_y;
int window_id;
WINDOW *window;
Tox *tox; // must be locked with Winthread mutex
GameWindowShape window_shape;
uint32_t id; // indentifies multiplayer instance
uint32_t friend_number; // friendnumber associated with parent window
cb_game_update_state *cb_game_update_state;
void *cb_game_update_state_data;
cb_game_render_window *cb_game_render_window;
void *cb_game_render_window_data;
cb_game_kill *cb_game_kill;
void *cb_game_kill_data;
cb_game_pause *cb_game_pause;
void *cb_game_pause_data;
cb_game_key_press *cb_game_key_press;
void *cb_game_key_press_data;
cb_game_on_packet *cb_game_on_packet;
void *cb_game_on_packet_data;
};
/*
* Sets the callback for game state updates.
*/
void game_set_cb_update_state(GameData *game, cb_game_update_state *func, void *cb_data);
/*
* Sets the callback for frame rendering.
*/
void game_set_cb_render_window(GameData *game, cb_game_render_window *func, void *cb_data);
/*
* Sets the callback for game termination.
*/
void game_set_cb_kill(GameData *game, cb_game_kill *func, void *cb_data);
/*
* Sets the callback for the game pause event.
*/
void game_set_cb_on_pause(GameData *game, cb_game_pause *func, void *cb_data);
/*
* Sets the callback for the key press event.
*/
void game_set_cb_on_keypress(GameData *game, cb_game_key_press *func, void *cb_data);
/*
* Sets the callback for the game packet event.
*/
void game_set_cb_on_packet(GameData *game, cb_game_on_packet *func, void *cb_data);
/*
* Initializes game instance.
*
* `type` must be a valid GameType.
*
* `id` should be a unique integer to indentify the game instance. If we're being invited to a game
* this identifier should be sent via the invite packet.
*
* if `multiplayer_data` is non-null this indicates that we accepted a game invite from a contact.
* The data contains any information we need to initialize the game state.
*
* Return 0 on success.
* Return -1 if screen is too small.
* Return -2 on network related error.
* Return -3 if multiplayer game is being initialized outside of a contact's window.
* Return -4 on other failure.
*/
int game_initialize(const ToxWindow *self, Tox *m, GameType type, uint32_t id, const uint8_t *multiplayer_data,
size_t length);
/*
* Sets game window to `shape`.
*
* This must be called on game initialization.
*
* Return 0 on success.
* Return -1 if window is too small or shape is invalid.
* Return -2 if function is called while the game state is valid.
*/
int game_set_window_shape(GameData *game, GameWindowShape shape);
/*
* Returns the GameType associated with `game_string`.
*/
GameType game_get_type(const char *game_string);
/*
* Returns the name represented as a string associated with `type`.
*/
const char *game_get_name_string(GameType type);
/*
* Prints all available games to window associated with `self`.
*/
void game_list_print(ToxWindow *self);
/*
* Return true if game `type` has a multiplayer mode.
*/
bool game_type_is_multiplayer(GameType type);
/*
* Returns true if coordinates designated by `x` and `y` are within the game window boundaries.
*/
bool game_coordinates_in_bounds(const GameData *game, int x, int y);
/*
* Put random coordinates that fit within the game window in `coords`.
*/
void game_random_coords(const GameData *game, Coords *coords);
/*
* Gets the current max dimensions of the game window.
*/
void game_max_x_y(const GameData *game, int *x, int *y);
/*
* Returns the respective coordinate boundary of the game window.
*/
int game_y_bottom_bound(const GameData *game);
int game_y_top_bound(const GameData *game);
int game_x_right_bound(const GameData *game);
int game_x_left_bound(const GameData *game);
/*
* Toggle whether the respective game info is shown around the game window.
*/
void game_show_score(GameData *game, bool show_score);
void game_show_high_score(GameData *game, bool show_high_score);
void game_show_lives(GameData *game, bool show_lives);
void game_show_level(GameData *game, bool show_level);
/*
* Sends a notification to the window associated with `game`.
*
* `message` - the notification message that will be displayed.
*/
void game_window_notify(const GameData *game, const char *message);
/*
* Updates game score.
*/
void game_update_score(GameData *game, long int points);
/*
* Sets game score to `val`.
*/
void game_set_score(GameData *game, long int score);
/*
* Returns the game's current score.
*/
long int game_get_score(const GameData *game);
/*
* Increments level.
*
* This function should be called on initialization if game wishes to display level.
*/
void game_increment_level(GameData *game);
/*
* Updates lives with `amount`.
*
* If lives becomes negative the lives counter will not be drawn.
*/
void game_update_lives(GameData *game, int amount);
/*
* Returns the remaining number of lives for the game.
*/
int game_get_lives(const GameData *game);
/*
* Returns the current level.
*/
size_t game_get_current_level(const GameData *game);
/*
* Sets the game status to `status`.
*/
void game_set_status(GameData *game, GameStatus status);
/*
* Sets the game base update interval.
*
* Lower values of `update_interval` make the game faster, where 1 is the fastest and 50 is slowest.
* If this function is never called the game chooses a reasonable default.
*/
void game_set_update_interval(GameData *game, TIME_MS update_interval);
/*
* Creates a message `message` of size `length` to be displayed at `coords` for `timeout` seconds.
*
* Message must be no greater than GAME_MAX_MESSAGE_SIZE bytes in length.
*
* If `sticky` is true the message will follow coords if they move.
*
* If `dir` is a valid direction, the message will be positioned a few squares away from `coords`
* so as to not overlap with its associated object.
*
* If `timeout` is zero, the default timeout value will be used.
*
* If `priority` true, messages will be printed on top of game objects.
*
* Return 0 on success.
* Return -1 on failure.
*/
int game_set_message(GameData *game, const char *message, size_t length, Direction dir, int attributes, int colour,
time_t timeout, const Coords *coords, bool sticky, bool priority);
/*
* Returns true if game should update an object's state according to its last moved time and current speed.
*
* This is used to independently control the speed of various game objects.
*/
bool game_do_object_state_update(const GameData *game, TIME_MS current_time, TIME_MS last_moved_time, TIME_MS speed);
/*
* Returns the current wall time in milliseconds.
*/
TIME_MS get_time_millis(void);
/*
* Ends game associated with `self` and cleans up.
*/
void game_kill(ToxWindow *self);
/*
* Sends a packet containing payload `data` of size `length` to the friendnumber associated with the game's
* parent window.
*
* `length` must not exceed GAME_MAX_DATA_SIZE bytes.
*
* `packet_type` should be GP_Invite for an invite packet or GP_Data for all other game data.
*/
int game_packet_send(const GameData *game, const uint8_t *data, size_t length, GamePacketType packet_type);
#endif // GAME_BASE

1750
src/game_centipede.c Normal file

File diff suppressed because it is too large Load Diff

30
src/game_centipede.h Normal file
View File

@ -0,0 +1,30 @@
/* game_centipede.h
*
*
* Copyright (C) 2020 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef GAME_CENTIPEDE
#define GAME_CENTIPEDE
#include "game_base.h"
int centipede_initialize(GameData *game);
#endif // GAME_CENTIPEDE

Some files were not shown because too many files have changed in this diff Show More