From f056f13329eb6150a543265054b97ca0ca9fe13f Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Sat, 24 Sep 2016 21:07:04 -0400 Subject: [PATCH] Astyle everything and add an astyle options script to repo --- astylerc | 11 +++ src/audio_call.c | 81 ++++++++++++--------- src/audio_device.c | 93 ++++++++++++++---------- src/audio_device.h | 20 +++--- src/autocomplete.c | 11 +-- src/avatars.c | 2 + src/bootstrap.c | 2 + src/chat.c | 39 +++++----- src/chat_commands.c | 15 ++-- src/execute.c | 1 + src/file_transfers.c | 6 +- src/file_transfers.h | 2 +- src/friendlist.c | 22 ++++-- src/global_commands.c | 20 ++++-- src/groupchat.c | 19 +++-- src/help.c | 4 +- src/input.c | 4 +- src/line_info.c | 41 +++++------ src/log.c | 1 + src/misc_tools.c | 18 ++--- src/name_lookup.c | 8 +++ src/notify.c | 164 ++++++++++++++++++++++++++---------------- src/notify.h | 18 ++--- src/osx_video.h | 9 ++- src/osx_video.m | 104 +++++++++++++++++---------- src/prompt.c | 18 ++--- src/settings.c | 159 ++++++++++++++++++++++------------------ src/term_mplex.c | 51 ++++++++----- src/toxic.c | 33 ++++++--- src/toxic.h | 12 ++-- src/toxic_strings.c | 14 ++-- src/toxic_strings.h | 2 +- src/video_call.c | 59 +++++++-------- src/video_device.c | 134 +++++++++++++++++++++------------- src/video_device.h | 19 ++--- src/windows.c | 8 ++- src/xtra.c | 61 ++++++++-------- src/xtra.h | 4 +- 38 files changed, 775 insertions(+), 514 deletions(-) create mode 100644 astylerc diff --git a/astylerc b/astylerc new file mode 100644 index 0000000..dd738b7 --- /dev/null +++ b/astylerc @@ -0,0 +1,11 @@ +--style=kr + --pad-header + --max-code-length=120 + --convert-tabs + --indent-switches + --pad-oper + --align-pointer=name + --align-reference=name + --preserve-date + --lineend=linux + --break-blocks \ No newline at end of file diff --git a/src/audio_call.c b/src/audio_call.c index f238460..62c0fd8 100644 --- a/src/audio_call.c +++ b/src/audio_call.c @@ -61,7 +61,7 @@ extern FriendsList Friends; #define frame_size (CallControl.audio_sample_rate * CallControl.audio_frame_duration / 1000) -static int set_call(Call* call, bool start) +static int set_call(Call *call, bool start) { call->in_idx = -1; call->out_idx = -1; @@ -75,17 +75,18 @@ static int set_call(Call* call, bool start) if ( pthread_mutex_init(&call->mutex, NULL) != 0 ) return -1; - } - else { + } else { call->ttid = 0; + if ( pthread_mutex_destroy(&call->mutex) != 0 ) - return -1; + return -1; } return 0; } -void call_cb ( ToxAV *av, uint32_t friend_number, bool audio_enabled, bool video_enabled, void *user_data ); +void call_cb ( ToxAV *av, uint32_t friend_number, bool audio_enabled, bool video_enabled, + void *user_data ); void callstate_cb ( ToxAV *av, uint32_t friend_number, uint32_t state, void *user_data ); void receive_audio_frame_cb ( ToxAV *av, uint32_t friend_number, int16_t const *pcm, size_t sample_count, uint8_t channels, uint32_t sampling_rate, void *user_data ); @@ -103,7 +104,7 @@ 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, +void write_device_callback( uint32_t friend_number, const int16_t *PCM, uint16_t sample_count, uint8_t channels, uint32_t sample_rate ); static void print_err (ToxWindow *self, const char *error_str) @@ -158,6 +159,7 @@ ToxAV *init_audio(ToxWindow *self, Tox *tox) void terminate_audio() { int i; + for (i = 0; i < MAX_CALLS; ++i) stop_transmission(&CallControl.calls[i], i); @@ -167,7 +169,7 @@ void terminate_audio() terminate_devices(); } -void read_device_callback(const int16_t* captured, uint32_t size, void* data) +void read_device_callback(const int16_t *captured, uint32_t size, void *data) { TOXAV_ERR_SEND_FRAME error; uint32_t friend_number = *((uint32_t *)data); /* TODO: Or pass an array of call_idx's */ @@ -175,13 +177,13 @@ void read_device_callback(const int16_t* captured, uint32_t size, void* data) ((int64_t) CallControl.audio_frame_duration) / 1000; if ( sample_count <= 0 || toxav_audio_send_frame(CallControl.av, friend_number, - captured, sample_count, - CallControl.audio_channels, - CallControl.audio_sample_rate, &error) == false ) - {} + captured, sample_count, + CallControl.audio_channels, + CallControl.audio_sample_rate, &error) == false ) { + } } -void write_device_callback(uint32_t friend_number, const int16_t* PCM, uint16_t sample_count, uint8_t channels, +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].ttas ) @@ -199,7 +201,7 @@ int start_transmission(ToxWindow *self, Call *call) return -1; DeviceError error = open_primary_device(input, &call->in_idx, - CallControl.audio_sample_rate, CallControl.audio_frame_duration, CallControl.audio_channels); + CallControl.audio_sample_rate, CallControl.audio_frame_duration, CallControl.audio_channels); if ( error != de_None ) { if ( error == de_FailedStart) @@ -210,12 +212,12 @@ int start_transmission(ToxWindow *self, Call *call) } if ( register_device_callback(self->num, call->in_idx, - read_device_callback, &self->num, true) != de_None) + read_device_callback, &self->num, true) != de_None) /* Set VAD as true for all; TODO: Make it more dynamic */ line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to register input handler!"); if ( open_primary_device(output, &call->out_idx, - CallControl.audio_sample_rate, CallControl.audio_frame_duration, CallControl.audio_channels) != de_None ) { + CallControl.audio_sample_rate, CallControl.audio_frame_duration, CallControl.audio_channels) != de_None ) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to open output device!"); call->has_output = 0; } @@ -286,7 +288,8 @@ void callstate_cb(ToxAV *av, uint32_t friend_number, uint32_t state, void *user_ callback_call_ended(friend_number); CallControl.pending_call = false; - break; + break; + case ( TOXAV_FRIEND_CALL_STATE_FINISHED ): if ( CallControl.pending_call ) callback_call_rejected(friend_number); @@ -304,7 +307,8 @@ void callstate_cb(ToxAV *av, uint32_t friend_number, uint32_t state, void *user_ CallControl.call_state = 0; CallControl.pending_call = false; - break; + break; + default: if ( CallControl.pending_call ) { /* Start answered call */ @@ -313,6 +317,7 @@ void callstate_cb(ToxAV *av, uint32_t friend_number, uint32_t state, void *user_ } else { #ifdef VIDEO + /* Handle receiving client video call states */ if ( state & TOXAV_FRIEND_CALL_STATE_SENDING_V ) callback_recv_video_starting(friend_number); @@ -322,13 +327,13 @@ void callstate_cb(ToxAV *av, uint32_t friend_number, uint32_t state, void *user_ #endif /* VIDEO */ } - break; + break; } } void receive_audio_frame_cb(ToxAV *av, uint32_t friend_number, - int16_t const *pcm, size_t sample_count, - uint8_t channels, uint32_t sampling_rate, void *user_data) + int16_t const *pcm, size_t sample_count, + uint8_t channels, uint32_t sampling_rate, void *user_data) { write_device_callback(friend_number, pcm, sample_count, channels, sampling_rate); } @@ -373,12 +378,14 @@ void callback_recv_ringing(uint32_t friend_number) } void callback_recv_starting(uint32_t friend_number) { - ToxWindow* windows = CallControl.prompt; + ToxWindow *windows = CallControl.prompt; int i; + for (i = 0; i < MAX_WINDOWS_NUM; ++i) { if ( windows[i].onStarting != NULL && windows[i].num == friend_number ) { windows[i].onStarting(&windows[i], CallControl.av, friend_number, CallControl.call_state); + if ( 0 != start_transmission(&windows[i], &CallControl.calls[friend_number]) ) /* YEAH! */ line_info_add(&windows[i], NULL, NULL, NULL, SYS_MSG, 0, 0 , "Error starting transmission!"); @@ -399,12 +406,14 @@ void callback_recv_ending(uint32_t friend_number) } void callback_call_started(uint32_t friend_number) { - ToxWindow* windows = CallControl.prompt; + ToxWindow *windows = CallControl.prompt; int i; + for (i = 0; i < MAX_WINDOWS_NUM; ++i) if ( windows[i].onStart != NULL && windows[i].num == friend_number ) { windows[i].onStart(&windows[i], CallControl.av, friend_number, CallControl.call_state); + if ( 0 != start_transmission(&windows[i], &CallControl.calls[friend_number]) ) {/* YEAH! */ line_info_add(&windows[i], NULL, NULL, NULL, SYS_MSG, 0, 0, "Error starting transmission!"); return; @@ -479,6 +488,7 @@ void cmd_call(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA } toxav_call(CallControl.av, self->num, CallControl.audio_bit_rate, CallControl.video_bit_rate, &error); + if ( error != TOXAV_ERR_CALL_OK ) { if ( error == TOXAV_ERR_CALL_FRIEND_ALREADY_IN_CALL ) error_str = "Already in a call!"; else if ( error == TOXAV_ERR_CALL_MALLOC ) error_str = "Memory allocation issue"; @@ -518,6 +528,7 @@ void cmd_answer(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[ } toxav_answer(CallControl.av, self->num, CallControl.audio_bit_rate, CallControl.video_bit_rate, &error); + if ( error != TOXAV_ERR_ANSWER_OK ) { if ( error == TOXAV_ERR_ANSWER_FRIEND_NOT_CALLING ) error_str = "No incoming call!"; else if ( error == TOXAV_ERR_ANSWER_CODEC_INITIALIZATION ) error_str = "Failed to initialize codecs!"; @@ -664,7 +675,7 @@ void cmd_change_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, char ( } if ( set_primary_device(type, selection) == de_InvalidSelection ) { - error_str="Invalid selection!"; + error_str = "Invalid selection!"; goto on_error; } @@ -708,13 +719,14 @@ void cmd_ccur_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*a } if ( selection_valid(type, selection) == de_InvalidSelection ) { - error_str="Invalid selection!"; + error_str = "Invalid selection!"; goto on_error; } /* If call is active, change device */ if ( self->is_call ) { - Call* this_call = &CallControl.calls[self->num]; + Call *this_call = &CallControl.calls[self->num]; + if ( this_call->ttas ) { @@ -722,15 +734,14 @@ void cmd_ccur_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*a pthread_mutex_lock(&this_call->mutex); close_device(output, this_call->out_idx); this_call->has_output = open_device(output, selection, &this_call->out_idx, - CallControl.audio_sample_rate, CallControl.audio_frame_duration, CallControl.audio_channels) - == de_None ? 1 : 0; + CallControl.audio_sample_rate, CallControl.audio_frame_duration, CallControl.audio_channels) + == de_None ? 1 : 0; pthread_mutex_unlock(&this_call->mutex); - } - else { + } else { /* TODO: check for failure */ close_device(input, this_call->in_idx); open_device(input, selection, &this_call->in_idx, CallControl.audio_sample_rate, - CallControl.audio_frame_duration, CallControl.audio_channels); + CallControl.audio_frame_duration, CallControl.audio_channels); /* Set VAD as true for all; TODO: Make it more dynamic */ register_device_callback(self->num, this_call->in_idx, read_device_callback, &self->num, true); } @@ -740,7 +751,7 @@ void cmd_ccur_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*a self->device_selection[type] = selection; return; - on_error: +on_error: print_err (self, error_str); } @@ -771,9 +782,10 @@ void cmd_mute(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA /* If call is active, use this_call values */ if ( self->is_call ) { - Call* this_call = &CallControl.calls[self->num]; + Call *this_call = &CallControl.calls[self->num]; pthread_mutex_lock(&this_call->mutex); + if ( type == input ) { device_mute(type, this_call->in_idx); self->chatwin->infobox.in_is_muted ^= 1; @@ -781,12 +793,13 @@ void cmd_mute(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA device_mute(type, this_call->out_idx); self->chatwin->infobox.out_is_muted ^= 1; } + pthread_mutex_unlock(&this_call->mutex); } return; - on_error: +on_error: print_err (self, error_str); } @@ -822,7 +835,7 @@ on_error: } -void stop_current_call(ToxWindow* self) +void stop_current_call(ToxWindow *self) { if ( CallControl.pending_call ) { toxav_call_control(CallControl.av, self->num, TOXAV_CALL_CONTROL_CANCEL, NULL); diff --git a/src/audio_device.c b/src/audio_device.c index 6ff8f80..7586293 100644 --- a/src/audio_device.c +++ b/src/audio_device.c @@ -56,7 +56,7 @@ typedef struct Device { ALCdevice *dhndl; /* Handle of device selected/opened */ ALCcontext *ctx; /* Device context */ DataHandleCallback cb; /* Use this to handle data from input device usually */ - void* cb_data; /* Data to be passed to callback */ + void *cb_data; /* Data to be passed to callback */ int32_t friend_number; /* ToxAV friend number */ uint32_t source, buffers[OPENAL_BUFS]; /* Playback source/buffers */ @@ -80,7 +80,7 @@ Device *running[2][MAX_DEVICES] = {{NULL}}; /* Running devices */ uint32_t primary_device[2]; /* Primary device */ #ifdef AUDIO -static ToxAV* av = NULL; +static ToxAV *av = NULL; #endif /* AUDIO */ /* q_mutex */ @@ -90,12 +90,12 @@ pthread_mutex_t mutex; bool thread_running = true, - thread_paused = true; /* Thread control */ + thread_paused = true; /* Thread control */ -void* thread_poll(void*); +void *thread_poll(void *); /* Meet devices */ #ifdef AUDIO -DeviceError init_devices(ToxAV* av_) +DeviceError init_devices(ToxAV *av_) #else DeviceError init_devices() #endif /* AUDIO */ @@ -103,6 +103,7 @@ DeviceError init_devices() const char *stringed_device_list; size[input] = 0; + if ( (stringed_device_list = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER)) ) { ddevice_names[input] = alcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER); @@ -113,10 +114,12 @@ DeviceError init_devices() } size[output] = 0; + 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) { ddevice_names[output] = alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); @@ -131,6 +134,7 @@ DeviceError init_devices() return de_InternalError; pthread_t thread_id; + if ( pthread_create(&thread_id, NULL, thread_poll, NULL) != 0 || pthread_detach(thread_id) != 0) return de_InternalError; @@ -159,9 +163,10 @@ DeviceError terminate_devices() DeviceError device_mute(DeviceType type, uint32_t device_idx) { if (device_idx >= MAX_DEVICES) return de_InvalidSelection; + lock; - Device* device = running[type][device_idx]; + Device *device = running[type][device_idx]; if (!device) { unlock; @@ -178,9 +183,10 @@ DeviceError device_mute(DeviceType type, uint32_t device_idx) DeviceError device_set_VAD_treshold(uint32_t device_idx, float value) { if (device_idx >= MAX_DEVICES) return de_InvalidSelection; + lock; - Device* device = running[input][device_idx]; + Device *device = running[input][device_idx]; if (!device) { unlock; @@ -198,12 +204,14 @@ DeviceError device_set_VAD_treshold(uint32_t device_idx, float value) DeviceError set_primary_device(DeviceType type, int32_t selection) { if (size[type] <= selection || selection < 0) return de_InvalidSelection; + primary_device[type] = selection; return de_None; } -DeviceError open_primary_device(DeviceType type, uint32_t* device_idx, uint32_t sample_rate, uint32_t frame_duration, uint8_t channels) +DeviceError open_primary_device(DeviceType type, uint32_t *device_idx, uint32_t sample_rate, uint32_t frame_duration, + uint8_t channels) { return open_device(type, primary_device[type], device_idx, sample_rate, frame_duration, channels); } @@ -214,7 +222,8 @@ void get_primary_device_name(DeviceType type, char *buf, int size) } // TODO: generate buffers separately -DeviceError open_device(DeviceType type, int32_t selection, uint32_t* device_idx, uint32_t sample_rate, uint32_t frame_duration, uint8_t channels) +DeviceError open_device(DeviceType type, int32_t selection, uint32_t *device_idx, uint32_t sample_rate, + uint32_t frame_duration, uint8_t channels) { if (size[type] <= selection || selection < 0) return de_InvalidSelection; @@ -225,10 +234,13 @@ DeviceError open_device(DeviceType type, int32_t selection, uint32_t* device_idx const uint32_t frame_size = (sample_rate * frame_duration / 1000); uint32_t i; + for (i = 0; i < MAX_DEVICES && running[type][i] != NULL; ++i); - if (i == MAX_DEVICES) { unlock; return de_AllDevicesBusy; } - else *device_idx = i; + if (i == MAX_DEVICES) { + unlock; + return de_AllDevicesBusy; + } else *device_idx = i; for (i = 0; i < MAX_DEVICES; i ++) { /* Check if any device has the same selection */ if ( running[type][i] && running[type][i]->selection == selection ) { @@ -242,7 +254,7 @@ DeviceError open_device(DeviceType type, int32_t selection, uint32_t* device_idx } } - Device* device = running[type][*device_idx] = calloc(1, sizeof(Device)); + Device *device = running[type][*device_idx] = calloc(1, sizeof(Device)); device->selection = selection; device->sample_rate = sample_rate; @@ -258,12 +270,12 @@ DeviceError open_device(DeviceType type, int32_t selection, uint32_t* device_idx if (type == input) { device->dhndl = alcCaptureOpenDevice(devices_names[type][selection], sample_rate, device->sound_mode, frame_size * 2); - #ifdef AUDIO +#ifdef AUDIO device->VAD_treshold = user_settings->VAD_treshold; - #endif - } - else { +#endif + } else { device->dhndl = alcOpenDevice(devices_names[type][selection]); + if ( !device->dhndl ) { free(device); running[type][*device_idx] = NULL; @@ -279,10 +291,10 @@ DeviceError open_device(DeviceType type, int32_t selection, uint32_t* device_idx alSourcei(device->source, AL_LOOPING, AL_FALSE); uint16_t zeros[frame_size]; - memset(zeros, 0, frame_size*2); + memset(zeros, 0, frame_size * 2); for ( i = 0; i < OPENAL_BUFS; ++i ) { - alBufferData(device->buffers[i], device->sound_mode, zeros, frame_size*2, sample_rate); + alBufferData(device->buffers[i], device->sound_mode, zeros, frame_size * 2, sample_rate); } alSourceQueueBuffers(device->source, OPENAL_BUFS, device->buffers); @@ -310,7 +322,7 @@ DeviceError close_device(DeviceType type, uint32_t device_idx) if (device_idx >= MAX_DEVICES) return de_InvalidSelection; lock; - Device* device = running[type][device_idx]; + Device *device = running[type][device_idx]; DeviceError rc = de_None; if (!device) { @@ -323,27 +335,28 @@ DeviceError close_device(DeviceType type, uint32_t device_idx) if ( !device->ref_count ) { if (type == input) { if ( !alcCaptureCloseDevice(device->dhndl) ) rc = de_AlError; - } - else { + } else { if (alcGetCurrentContext() != device->ctx) alcMakeContextCurrent(device->ctx); alDeleteSources(1, &device->source); alDeleteBuffers(OPENAL_BUFS, device->buffers); alcMakeContextCurrent(NULL); + if ( device->ctx ) alcDestroyContext(device->ctx); + if ( !alcCloseDevice(device->dhndl) ) rc = de_AlError; } free(device); - } - else device->ref_count--; + } else device->ref_count--; unlock; return rc; } -DeviceError register_device_callback( int32_t friend_number, uint32_t device_idx, DataHandleCallback callback, void* data, bool enable_VAD) +DeviceError register_device_callback( int32_t friend_number, uint32_t device_idx, DataHandleCallback callback, + void *data, bool enable_VAD) { if (size[input] <= device_idx || !running[input][device_idx] || running[input][device_idx]->dhndl == NULL) return de_InvalidSelection; @@ -358,12 +371,12 @@ DeviceError register_device_callback( int32_t friend_number, uint32_t device_idx return de_None; } -inline__ DeviceError write_out(uint32_t device_idx, const int16_t* data, uint32_t sample_count, uint8_t channels, +inline__ 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; - Device* device = running[output][device_idx]; + Device *device = running[output][device_idx]; if (!device || device->muted) return de_DeviceNotActive; @@ -375,33 +388,33 @@ inline__ DeviceError write_out(uint32_t device_idx, const int16_t* data, uint32_ alGetSourcei(device->source, AL_BUFFERS_PROCESSED, &processed); alGetSourcei(device->source, AL_BUFFERS_QUEUED, &queued); - if(processed) { + if (processed) { ALuint bufids[processed]; alSourceUnqueueBuffers(device->source, processed, bufids); alDeleteBuffers(processed - 1, bufids + 1); bufid = bufids[0]; - } - else if(queued < 16) alGenBuffers(1, &bufid); + } else if (queued < 16) alGenBuffers(1, &bufid); else { pthread_mutex_unlock(device->mutex); return de_Busy; } - alBufferData(bufid, channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, data, sample_count * 2 * channels, sample_rate); + alBufferData(bufid, channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, data, sample_count * 2 * channels, + sample_rate); alSourceQueueBuffers(device->source, 1, &bufid); ALint state; alGetSourcei(device->source, AL_SOURCE_STATE, &state); - if(state != AL_PLAYING) alSourcePlay(device->source); + if (state != AL_PLAYING) alSourcePlay(device->source); pthread_mutex_unlock(device->mutex); return de_None; } -void* thread_poll (void* arg) // TODO: maybe use thread for every input source +void *thread_poll (void *arg) // TODO: maybe use thread for every input source { /* * NOTE: We only need to poll input devices for data. @@ -411,9 +424,9 @@ void* thread_poll (void* arg) // TODO: maybe use thread for every input source int32_t sample = 0; - while (1) - { + while (1) { lock; + if (!thread_running) { unlock; break; @@ -422,7 +435,7 @@ void* thread_poll (void* arg) // TODO: maybe use thread for every input source bool paused = thread_paused; unlock; - /* Wait for unpause. */ + /* Wait for unpause. */ if (paused) { usleep(10000); } @@ -430,6 +443,7 @@ void* thread_poll (void* arg) // TODO: maybe use thread for every input source else { for (i = 0; i < size[input]; ++i) { lock; + if (running[input][i] != NULL) { alcGetIntegerv(running[input][i]->dhndl, ALC_CAPTURE_SAMPLES, sizeof(int32_t), &sample); @@ -439,7 +453,8 @@ void* thread_poll (void* arg) // TODO: maybe use thread for every input source unlock; continue; } - Device* device = running[input][i]; + + Device *device = running[input][i]; int16_t frame[16000]; alcCaptureSamples(device->dhndl, frame, f_size); @@ -451,8 +466,10 @@ void* thread_poll (void* arg) // TODO: maybe use thread for every input source if ( device->cb ) device->cb(frame, f_size, device->cb_data); } + unlock; } + usleep(5000); } } @@ -460,7 +477,7 @@ void* thread_poll (void* arg) // TODO: maybe use thread for every input source pthread_exit(NULL); } -void print_devices(ToxWindow* self, DeviceType type) +void print_devices(ToxWindow *self, DeviceType type) { int i; @@ -475,7 +492,7 @@ DeviceError selection_valid(DeviceType type, int32_t selection) return (size[type] <= selection || selection < 0) ? de_InvalidSelection : de_None; } -void* get_device_callback_data(uint32_t device_idx) +void *get_device_callback_data(uint32_t device_idx) { if (size[input] <= device_idx || !running[input][device_idx] || running[input][device_idx]->dhndl == NULL) return NULL; diff --git a/src/audio_device.h b/src/audio_device.h index 34d1ecc..9b73791 100644 --- a/src/audio_device.h +++ b/src/audio_device.h @@ -52,11 +52,11 @@ typedef enum DeviceError { de_AlError = -9, } DeviceError; -typedef void (*DataHandleCallback) (const int16_t*, uint32_t size, void* data); +typedef void (*DataHandleCallback) (const int16_t *, uint32_t size, void *data); #ifdef AUDIO -DeviceError init_devices(ToxAV* av); +DeviceError init_devices(ToxAV *av); #else DeviceError init_devices(); #endif /* AUDIO */ @@ -64,8 +64,9 @@ DeviceError init_devices(); DeviceError terminate_devices(); /* Callback handles ready data from INPUT device */ -DeviceError register_device_callback(int32_t friend_number, uint32_t device_idx, DataHandleCallback callback, void* data, bool enable_VAD); -void* get_device_callback_data(uint32_t device_idx); +DeviceError register_device_callback(int32_t friend_number, uint32_t device_idx, DataHandleCallback callback, + void *data, bool enable_VAD); +void *get_device_callback_data(uint32_t device_idx); /* toggle device mute */ DeviceError device_mute(DeviceType type, uint32_t device_idx); @@ -75,16 +76,19 @@ DeviceError device_set_VAD_treshold(uint32_t device_idx, float value); #endif DeviceError set_primary_device(DeviceType type, int32_t selection); -DeviceError open_primary_device(DeviceType type, uint32_t* device_idx, uint32_t sample_rate, uint32_t frame_duration, uint8_t channels); +DeviceError open_primary_device(DeviceType type, uint32_t *device_idx, uint32_t sample_rate, uint32_t frame_duration, + uint8_t channels); /* Start device */ -DeviceError open_device(DeviceType type, int32_t selection, uint32_t* device_idx, uint32_t sample_rate, uint32_t frame_duration, uint8_t channels); +DeviceError open_device(DeviceType type, int32_t selection, 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 device */ -DeviceError write_out(uint32_t device_idx, const int16_t* data, uint32_t length, uint8_t channels, uint32_t sample_rate); +DeviceError write_out(uint32_t device_idx, const int16_t *data, uint32_t length, uint8_t channels, + uint32_t sample_rate); -void print_devices(ToxWindow* self, DeviceType type); +void print_devices(ToxWindow *self, DeviceType type); void get_primary_device_name(DeviceType type, char *buf, int size); DeviceError selection_valid(DeviceType type, int32_t selection); diff --git a/src/autocomplete.c b/src/autocomplete.c index 4c0113d..52a1934 100644 --- a/src/autocomplete.c +++ b/src/autocomplete.c @@ -25,10 +25,10 @@ #include #ifdef __APPLE__ - #include - #include +#include +#include #else - #include +#include #endif /* ifdef __APPLE__ */ #include "windows.h" @@ -108,7 +108,7 @@ int complete_line(ToxWindow *self, const void *list, int n_items, int size) /* TODO: generalize this */ bool dir_search = !strncmp(ubuf, "/sendfile", strlen("/sendfile")) - || !strncmp(ubuf, "/avatar", strlen("/avatar")); + || !strncmp(ubuf, "/avatar", strlen("/avatar")); /* isolate substring from space behind pos to pos */ char tmp[MAX_STR_SIZE]; @@ -185,6 +185,7 @@ int complete_line(ToxWindow *self, const void *list, int n_items, int size) 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; @@ -288,7 +289,7 @@ int dir_match(ToxWindow *self, Tox *m, const wchar_t *line, const wchar_t *cmd) while ((entry = readdir(dp)) && dircount < MAX_DIRS) { if (strncmp(entry->d_name, b_name, b_name_len) == 0 - && strcmp(".", entry->d_name) && strcmp("..", entry->d_name)) { + && strcmp(".", entry->d_name) && strcmp("..", entry->d_name)) { snprintf(dirnames[dircount], sizeof(dirnames[dircount]), "%s", entry->d_name); ++dircount; } diff --git a/src/avatars.c b/src/avatars.c index d58b27e..8d01f36 100644 --- a/src/avatars.c +++ b/src/avatars.c @@ -55,6 +55,7 @@ int avatar_send(Tox *m, uint32_t friendnum) TOX_ERR_FILE_SEND err; uint32_t filenum = tox_file_send(m, friendnum, TOX_FILE_KIND_AVATAR, (size_t) Avatar.size, NULL, (uint8_t *) Avatar.name, Avatar.name_len, &err); + if (Avatar.size == 0) return 0; @@ -150,6 +151,7 @@ void on_avatar_file_control(Tox *m, struct FileTransfer *ft, TOX_FILE_CONTROL co } else if (ft->state == FILE_TRANSFER_PAUSED) { ft->state = FILE_TRANSFER_STARTED; } + break; case TOX_FILE_CONTROL_PAUSE: diff --git a/src/bootstrap.c b/src/bootstrap.c index f46f942..f93f204 100644 --- a/src/bootstrap.c +++ b/src/bootstrap.c @@ -251,6 +251,7 @@ static int update_DHT_nodeslist(const char *nodes_path) } struct Recv_Curl_Data recv_data; + memset(&recv_data, 0, sizeof(struct Recv_Curl_Data)); if (curl_fetch_nodes_JSON(&recv_data) == -1) { @@ -523,6 +524,7 @@ int load_DHT_nodeslist(void) } thread_data.active = true; + if (pthread_create(&thread_data.tid, &thread_data.attr, load_nodeslist_thread, NULL) != 0) { thread_data.active = false; return -5; diff --git a/src/chat.c b/src/chat.c index 2438ae4..1838737 100644 --- a/src/chat.c +++ b/src/chat.c @@ -48,9 +48,9 @@ #include "message_queue.h" #ifdef AUDIO - #include "audio_call.h" +#include "audio_call.h" #ifdef VIDEO - #include "video_call.h" +#include "video_call.h" #endif /* VIDEO */ #endif /* AUDIO */ @@ -152,7 +152,7 @@ void kill_chat_window(ToxWindow *self, Tox *m) } static void recv_message_helper(ToxWindow *self, Tox *m, uint32_t num, const char *msg, size_t len, - const char *nick, const char *timefrmt) + const char *nick, const char *timefrmt) { ChatContext *ctx = self->chatwin; @@ -161,10 +161,10 @@ static void recv_message_helper(ToxWindow *self, Tox *m, uint32_t num, const cha if (self->active_box != -1) box_notify2(self, generic_message, NT_WNDALERT_1 | NT_NOFOCUS | user_settings->bell_on_message, - self->active_box, "%s", msg); + self->active_box, "%s", msg); else box_notify(self, generic_message, NT_WNDALERT_1 | NT_NOFOCUS | user_settings->bell_on_message, - &self->active_box, nick, "%s", msg); + &self->active_box, nick, "%s", msg); } static void recv_action_helper(ToxWindow *self, Tox *m, uint32_t num, const char *action, size_t len, @@ -177,10 +177,10 @@ static void recv_action_helper(ToxWindow *self, Tox *m, uint32_t num, const char if (self->active_box != -1) box_notify2(self, generic_message, NT_WNDALERT_1 | NT_NOFOCUS | user_settings->bell_on_message, - self->active_box, "* %s %s", nick, action ); + self->active_box, "* %s %s", nick, action ); else box_notify(self, generic_message, NT_WNDALERT_1 | NT_NOFOCUS | user_settings->bell_on_message, - &self->active_box, self->name, "* %s %s", nick, action ); + &self->active_box, self->name, "* %s %s", nick, action ); } static void chat_onMessage(ToxWindow *self, Tox *m, uint32_t num, TOX_MESSAGE_TYPE type, const char *msg, size_t len) @@ -454,7 +454,7 @@ static void chat_onFileControl(ToxWindow *self, Tox *m, uint32_t friendnum, uint if (ft->state == FILE_TRANSFER_PENDING) { ft->state = FILE_TRANSFER_STARTED; line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "File transfer [%d] for '%s' accepted.", - ft->index, ft->file_name); + ft->index, ft->file_name); char progline[MAX_STR_SIZE]; init_progress_bar(progline); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s", progline); @@ -466,10 +466,12 @@ static void chat_onFileControl(ToxWindow *self, Tox *m, uint32_t friendnum, uint break; } + case TOX_FILE_CONTROL_PAUSE: { ft->state = FILE_TRANSFER_PAUSED; break; } + case TOX_FILE_CONTROL_CANCEL: { snprintf(msg, sizeof(msg), "File transfer for '%s' was aborted.", ft->file_name); close_file_transfer(self, m, ft, -1, msg, notif_error); @@ -601,10 +603,10 @@ static void chat_onFileRecv(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_ if (self->active_box != -1) box_notify2(self, transfer_pending, NT_WNDALERT_0 | NT_NOFOCUS | user_settings->bell_on_filetrans, - self->active_box, "Incoming file: %s", filename ); + self->active_box, "Incoming file: %s", filename ); else box_notify(self, transfer_pending, NT_WNDALERT_0 | NT_NOFOCUS | user_settings->bell_on_filetrans, - &self->active_box, self->name, "Incoming file: %s", filename ); + &self->active_box, self->name, "Incoming file: %s", filename ); } static void chat_onGroupInvite(ToxWindow *self, Tox *m, int32_t friendnumber, uint8_t type, const char *group_pub_key, @@ -671,8 +673,10 @@ void chat_onRinging (ToxWindow *self, ToxAV *av, uint32_t friend_number, int sta line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Ringing...type \"/hangup\" to cancel it."); #ifdef SOUND_NOTIFY + if (self->ringing_sound == -1) sound_notify(self, call_outgoing, NT_LOOP, &self->ringing_sound); + #endif /* SOUND_NOTIFY */ } @@ -927,11 +931,11 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) diff = dir_match(self, m, ctx->line, L"/sendfile"); } else if (wcsncmp(ctx->line, L"/avatar \"", wcslen(L"/avatar \"")) == 0) { diff = dir_match(self, m, ctx->line, L"/avatar"); - } else if (wcsncmp(ctx->line, L"/status ", wcslen(L"/status ")) == 0){ + } else if (wcsncmp(ctx->line, L"/status ", wcslen(L"/status ")) == 0) { const char status_cmd_list[3][8] = { - {"online"}, - {"away"}, - {"busy"}, + {"online"}, + {"away"}, + {"busy"}, }; diff = complete_line(self, status_cmd_list, 3, 8); } else { @@ -950,8 +954,7 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) } else if (key == '\r') { rm_trailing_spaces_buf(ctx); - if (!wstring_is_empty(ctx->line)) - { + if (!wstring_is_empty(ctx->line)) { add_line_to_hist(ctx); wstrsubst(ctx->line, L'¶', L'\n'); @@ -1029,9 +1032,11 @@ static void chat_onDraw(ToxWindow *self, Tox *m) case TOX_USER_STATUS_NONE: colour = GREEN; break; + case TOX_USER_STATUS_AWAY: colour = YELLOW; break; + case TOX_USER_STATUS_BUSY: colour = RED; break; @@ -1107,9 +1112,11 @@ static void chat_onDraw(ToxWindow *self, Tox *m) wnoutrefresh(self->window); #ifdef AUDIO + if (ctx->infobox.active) { draw_infobox(self); } + #endif if (self->help->active) diff --git a/src/chat_commands.c b/src/chat_commands.c index 523ad60..6ed5f05 100644 --- a/src/chat_commands.c +++ b/src/chat_commands.c @@ -120,11 +120,12 @@ void cmd_join_group(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*ar if (type == TOX_GROUPCHAT_TYPE_TEXT) groupnum = tox_join_groupchat(m, self->num, (uint8_t *) groupkey, length); -/*#ifdef AUDIO - else - groupnum = toxav_join_av_groupchat(m, self->num, (uint8_t *) groupkey, length, - NULL, NULL); -#endif*/ + + /*#ifdef AUDIO + else + groupnum = toxav_join_av_groupchat(m, self->num, (uint8_t *) groupkey, length, + NULL, NULL); + #endif*/ if (groupnum == -1) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Group chat instance failed to initialize."); @@ -190,6 +191,7 @@ void cmd_savefile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv return; on_recv_error: + switch (err) { case TOX_ERR_FILE_CONTROL_FRIEND_NOT_FOUND: line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "File transfer failed: Friend not found."); @@ -258,7 +260,7 @@ void cmd_sendfile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv 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); + (uint8_t *) file_name, namelen, &err); if (err != TOX_ERR_FILE_SEND_OK) goto on_send_error; @@ -282,6 +284,7 @@ void cmd_sendfile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv return; on_send_error: + switch (err) { case TOX_ERR_FILE_SEND_FRIEND_NOT_FOUND: errmsg = "File transfer failed: Invalid friend."; diff --git a/src/execute.c b/src/execute.c index 6483782..b0d3d9d 100644 --- a/src/execute.c +++ b/src/execute.c @@ -186,6 +186,7 @@ void execute(WINDOW *w, ToxWindow *self, Tox *m, const char *input, int mode) case GROUPCHAT_COMMAND_MODE: if (do_command(w, self, m, num_args, group_commands, args) == 0) return; + break; } diff --git a/src/file_transfers.c b/src/file_transfers.c index ad71c9e..f3bc42b 100644 --- a/src/file_transfers.c +++ b/src/file_transfers.c @@ -136,7 +136,7 @@ struct FileTransfer *get_file_transfer_struct(uint32_t friendnum, uint32_t filen * Returns NULL on failure. */ struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnum, uint32_t index, - FILE_TRANSFER_DIRECTION direction) + FILE_TRANSFER_DIRECTION direction) { if (direction != FILE_TRANSFER_RECV && direction != FILE_TRANSFER_SEND) return NULL; @@ -145,8 +145,8 @@ struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnum, uint32_t for (i = 0; i < MAX_FILES; ++i) { struct FileTransfer *ft = direction == FILE_TRANSFER_SEND ? - &Friends.list[friendnum].file_sender[i] : - &Friends.list[friendnum].file_receiver[i]; + &Friends.list[friendnum].file_sender[i] : + &Friends.list[friendnum].file_receiver[i]; if (ft->state != FILE_TRANSFER_INACTIVE && ft->index == index) return ft; diff --git a/src/file_transfers.h b/src/file_transfers.h index 6f58204..51104ef 100644 --- a/src/file_transfers.h +++ b/src/file_transfers.h @@ -87,7 +87,7 @@ struct FileTransfer *get_file_transfer_struct(uint32_t friendnum, uint32_t filen * Returns NULL on failure. */ struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnum, uint32_t index, - FILE_TRANSFER_DIRECTION direction); + FILE_TRANSFER_DIRECTION direction); /* Initializes an unused file transfer and returns its pointer. * Returns NULL on failure. diff --git a/src/friendlist.c b/src/friendlist.c index ae9e98f..7dce1a6 100644 --- a/src/friendlist.c +++ b/src/friendlist.c @@ -317,7 +317,7 @@ static void sort_blocklist_index(void) static void update_friend_last_online(uint32_t num, time_t timestamp) { Friends.list[num].last_online.last_on = timestamp; - Friends.list[num].last_online.tm = *localtime((const time_t*)×tamp); + Friends.list[num].last_online.tm = *localtime((const time_t *)×tamp); /* if the format changes make sure TIME_STR_SIZE is the correct size */ const char *t = user_settings->timestamp_format; @@ -538,7 +538,7 @@ static void friendlist_onGroupInvite(ToxWindow *self, Tox *m, int32_t num, uint8 get_nick_truncate(m, nick, num); line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, RED, - "* Group chat invite from %s failed: too many windows are open.", nick); + "* Group chat invite from %s failed: too many windows are open.", nick); sound_notify(prompt, notif_error, NT_WNDALERT_1, NULL); } @@ -560,6 +560,7 @@ static void select_friend(ToxWindow *self, wint_t key, int *selected, int num) static void delete_friend(Tox *m, uint32_t f_num) { TOX_ERR_FRIEND_DELETE err; + if (tox_friend_delete(m, f_num, &err) != true) { fprintf(stderr, "tox_friend_delete failed with error %d\n", err); return; @@ -645,10 +646,12 @@ static void draw_del_popup(void) wattron(PendingDelete.popup, A_BOLD); pthread_mutex_lock(&Winthread.lock); + if (blocklist_view == 0) wprintw(PendingDelete.popup, "%s", Friends.list[PendingDelete.num].name); else wprintw(PendingDelete.popup, "%s", Blocked.list[PendingDelete.num].name); + pthread_mutex_unlock(&Winthread.lock); wattroff(PendingDelete.popup, A_BOLD); @@ -799,6 +802,7 @@ static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) block_friend(m, f); else unblock_friend(m, f); + break; case KEY_RIGHT: @@ -811,6 +815,7 @@ static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) select_friend(self, key, &Friends.num_selected, Friends.num_friends); else select_friend(self, key, &Blocked.num_selected, Blocked.num_blocked); + break; } } @@ -970,9 +975,11 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) case TOX_USER_STATUS_NONE: colour = GREEN; break; + case TOX_USER_STATUS_AWAY: colour = YELLOW; break; + case TOX_USER_STATUS_BUSY: colour = RED; break; @@ -1054,9 +1061,9 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) pthread_mutex_lock(&Winthread.lock); int day_dist = ( - cur_loc_tm.tm_yday - Friends.list[f].last_online.tm.tm_yday - + ((cur_loc_tm.tm_year - Friends.list[f].last_online.tm.tm_year) * 365) - ); + cur_loc_tm.tm_yday - Friends.list[f].last_online.tm.tm_yday + + ((cur_loc_tm.tm_year - Friends.list[f].last_online.tm.tm_year) * 365) + ); const char *hourmin = Friends.list[f].last_online.hour_min_str; pthread_mutex_unlock(&Winthread.lock); @@ -1112,7 +1119,8 @@ void disable_chatwin(uint32_t f_num) static void friendlist_onAV(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) { assert(0); - if( friend_number >= Friends.max_idx) + + if ( friend_number >= Friends.max_idx) return; assert(0); @@ -1120,7 +1128,7 @@ static void friendlist_onAV(ToxWindow *self, ToxAV *av, uint32_t friend_number, if (Friends.list[friend_number].chatwin == -1) { if (get_num_active_windows() < MAX_WINDOWS_NUM) { - if(state != TOXAV_FRIEND_CALL_STATE_FINISHED) { + if (state != TOXAV_FRIEND_CALL_STATE_FINISHED) { Friends.list[friend_number].chatwin = add_window(m, new_chat(m, Friends.list[friend_number].num)); set_active_window(Friends.list[friend_number].chatwin); } diff --git a/src/global_commands.c b/src/global_commands.c index 29ba6e4..a153c87 100644 --- a/src/global_commands.c +++ b/src/global_commands.c @@ -130,7 +130,8 @@ void cmd_add_helper(ToxWindow *self, Tox *m, const char *id_bin, const char *msg break; case TOX_ERR_FRIEND_ADD_NULL: - /* fallthrough */ + + /* fallthrough */ default: errmsg = "Faile to add friend: Unknown error."; break; @@ -260,6 +261,7 @@ void cmd_connect(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv) } char key_binary[TOX_PUBLIC_KEY_SIZE * 2 + 1]; + if (hex_string_to_bin(ascii_key, strlen(ascii_key), key_binary, TOX_PUBLIC_KEY_SIZE) == -1) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid key."); return; @@ -281,6 +283,7 @@ void cmd_connect(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv) case TOX_ERR_BOOTSTRAP_NULL: line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Bootstrap failed."); break; + default: break; } @@ -345,10 +348,11 @@ void cmd_groupchat(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*arg if (type == TOX_GROUPCHAT_TYPE_TEXT) groupnum = tox_add_groupchat(m); -/*#ifdef AUDIO - else - groupnum = toxav_add_av_groupchat(m, NULL, NULL); -#endif*/ + + /*#ifdef AUDIO + else + groupnum = toxav_add_av_groupchat(m, NULL, NULL); + #endif*/ if (groupnum == -1) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Group chat instance failed to initialize."); @@ -543,8 +547,10 @@ void cmd_nospam(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[ line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Your new Tox ID is:"); cmd_myid(window, self, m, 0, NULL); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, ""); - line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Any services that relied on your old ID will need to be updated manually."); - line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "If you ever want your old Tox ID back, type '/nospam %X'", old_nospam); + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, + "Any services that relied on your old ID will need to be updated manually."); + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "If you ever want your old Tox ID back, type '/nospam %X'", + old_nospam); } void cmd_prompt_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) diff --git a/src/groupchat.c b/src/groupchat.c index 4b12113..649b130 100644 --- a/src/groupchat.c +++ b/src/groupchat.c @@ -135,16 +135,18 @@ int init_groupchat_win(ToxWindow *prompt, Tox *m, int groupnum, uint8_t type) groupchats[i].oldpeer_name_lengths = malloc(sizeof(uint16_t)); if (groupchats[i].peer_names == NULL || groupchats[i].oldpeer_names == NULL - || groupchats[i].peer_name_lengths == NULL || groupchats[i].oldpeer_name_lengths == NULL) + || groupchats[i].peer_name_lengths == NULL || groupchats[i].oldpeer_name_lengths == NULL) exit_toxic_err("failed in init_groupchat_win", FATALERR_MEMORY); memcpy(&groupchats[i].oldpeer_names[0], UNKNOWN_NAME, sizeof(UNKNOWN_NAME)); groupchats[i].oldpeer_name_lengths[0] = (uint16_t) strlen(UNKNOWN_NAME); #ifdef AUDIO + if (type == TOX_GROUPCHAT_TYPE_AV) if (group_audio_open_out_device(i) == -1) fprintf(stderr, "Group Audio failed to init\n"); + #endif /* AUDIO */ set_active_window(groupchats[i].chatwin); @@ -266,8 +268,7 @@ static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, int groupnum, int box_silent_notify(self, NT_NOFOCUS, &self->active_box, self->name, "%s %s", nick, msg); nick_clr = RED; - } - else { + } else { sound_notify(self, silent, NT_WNDALERT_1, NULL); } @@ -302,8 +303,7 @@ static void groupchat_onGroupAction(ToxWindow *self, Tox *m, int groupnum, int p box_silent_notify2(self, NT_NOFOCUS, self->active_box, "* %s %s", nick, action ); else box_silent_notify(self, NT_NOFOCUS, &self->active_box, self->name, "* %s %s", nick, action); - } - else { + } else { sound_notify(self, silent, NT_WNDALERT_1, NULL); } @@ -315,7 +315,7 @@ static void groupchat_onGroupAction(ToxWindow *self, Tox *m, int groupnum, int p } static void groupchat_onGroupTitleChange(ToxWindow *self, Tox *m, int groupnum, int peernum, const char *title, - uint8_t length) + uint8_t length) { ChatContext *ctx = self->chatwin; @@ -357,7 +357,7 @@ static void copy_peernames(int gnum, uint8_t peerlist[][TOX_MAX_NAME_LENGTH], ui groupchats[gnum].oldpeer_name_lengths = malloc(sizeof(uint16_t) * npeers); if (groupchats[gnum].peer_names == NULL || groupchats[gnum].oldpeer_names == NULL - || groupchats[gnum].peer_name_lengths == NULL || groupchats[gnum].oldpeer_name_lengths == NULL) { + || groupchats[gnum].peer_name_lengths == NULL || groupchats[gnum].oldpeer_name_lengths == NULL) { exit_toxic_err("failed in copy_peernames", FATALERR_MEMORY); } @@ -365,7 +365,7 @@ static void copy_peernames(int gnum, uint8_t peerlist[][TOX_MAX_NAME_LENGTH], ui int i; for (i = 0; i < npeers; ++i) { - if (!lengths[i]) { + if (!lengths[i]) { memcpy(&groupchats[gnum].peer_names[i * N], UNKNOWN_NAME, u_len); groupchats[gnum].peer_names[i * N + u_len] = '\0'; groupchats[gnum].peer_name_lengths[i] = u_len; @@ -621,8 +621,7 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) } else if (key == '\r') { rm_trailing_spaces_buf(ctx); - if (!wstring_is_empty(ctx->line)) - { + if (!wstring_is_empty(ctx->line)) { add_line_to_hist(ctx); wstrsubst(ctx->line, L'¶', L'\n'); diff --git a/src/help.c b/src/help.c index 86d48b1..ced0747 100644 --- a/src/help.c +++ b/src/help.c @@ -298,7 +298,7 @@ static void help_draw_contacts(ToxWindow *self) void help_onKey(ToxWindow *self, wint_t key) { - switch(key) { + switch (key) { case 'x': case T_KEY_ESC: help_exit(self); @@ -352,7 +352,7 @@ void help_onDraw(ToxWindow *self) { curs_set(0); - switch(self->help->type) { + switch (self->help->type) { case HELP_MENU: help_draw_menu(self); return; diff --git a/src/input.c b/src/input.c index 649dad9..26c0326 100644 --- a/src/input.c +++ b/src/input.c @@ -275,9 +275,9 @@ bool input_handle(ToxWindow *self, wint_t key, int x, int y, int mx_x, int mx_y) self->show_peerlist ^= 1; redraw_groupchat_win(self); } + match = true; - } - else if (key == user_settings->key_toggle_pastemode) { + } else if (key == user_settings->key_toggle_pastemode) { self->chatwin->pastemode ^= 1; match = true; } diff --git a/src/line_info.c b/src/line_info.c index 0ad2c6c..66d8fba 100644 --- a/src/line_info.c +++ b/src/line_info.c @@ -158,13 +158,15 @@ void line_info_add(ToxWindow *self, const char *timestr, const char *name1, cons /* for type-specific formatting in print function */ switch (type) { case IN_ACTION: - /* fallthrough */ + + /* fallthrough */ case OUT_ACTION: len += strlen(user_settings->line_normal) + 2; break; case IN_MSG: - /* fallthrough */ + + /* fallthrough */ case OUT_MSG: len += strlen(user_settings->line_normal) + 3; break; @@ -304,9 +306,11 @@ void line_info_print(ToxWindow *self) switch (type) { case OUT_MSG: - /* fallthrough */ + + /* fallthrough */ case OUT_MSG_READ: - /* fallthrough */ + + /* fallthrough */ case IN_MSG: wattron(win, COLOR_PAIR(BLUE)); wprintw(win, "%s ", line->timestr); @@ -323,10 +327,10 @@ void line_info_print(ToxWindow *self) wprintw(win, "%s %s: ", user_settings->line_normal, line->name1); wattroff(win, COLOR_PAIR(nameclr)); - char* msg = line->msg; - while (msg) - { - char* line = strsep(&msg, "\n"); + char *msg = line->msg; + + while (msg) { + char *line = strsep(&msg, "\n"); if (line[0] == '>') wattron(win, COLOR_PAIR(GREEN)); @@ -360,9 +364,11 @@ void line_info_print(ToxWindow *self) break; case OUT_ACTION_READ: - /* fallthrough */ + + /* fallthrough */ case OUT_ACTION: - /* fallthrough */ + + /* fallthrough */ case IN_ACTION: wattron(win, COLOR_PAIR(BLUE)); wprintw(win, "%s ", line->timestr); @@ -548,20 +554,15 @@ bool line_info_onKey(ToxWindow *self, wint_t key) if (key == user_settings->key_half_page_up) { line_info_page_up(self, hst); - } - else if (key == user_settings->key_half_page_down) { + } else if (key == user_settings->key_half_page_down) { line_info_page_down(self, hst); - } - else if (key == user_settings->key_scroll_line_up) { + } else if (key == user_settings->key_scroll_line_up) { line_info_scroll_up(hst); - } - else if (key == user_settings->key_scroll_line_down) { + } else if (key == user_settings->key_scroll_line_down) { line_info_scroll_down(hst); - } - else if (key == user_settings->key_page_bottom) { + } else if (key == user_settings->key_page_bottom) { line_info_reset_start(self, hst); - } - else { + } else { match = false; } diff --git a/src/log.c b/src/log.c index 2d48dbc..24ef560 100644 --- a/src/log.c +++ b/src/log.c @@ -262,6 +262,7 @@ int rename_logfile(char *src, char *dest, const char *selfkey, const char *other return 0; on_error: + if (log_on) log_enable(src, selfkey, otherkey, log, LOG_CHAT); diff --git a/src/misc_tools.c b/src/misc_tools.c index d74875a..a07a863 100644 --- a/src/misc_tools.c +++ b/src/misc_tools.c @@ -70,7 +70,7 @@ struct tm *get_time(void) { struct tm *timeinfo; time_t t = get_unix_time(); - timeinfo = localtime((const time_t*) &t); + timeinfo = localtime((const time_t *) &t); return timeinfo; } @@ -156,7 +156,7 @@ int bin_id_to_string(const char *bin_id, size_t bin_id_size, char *output, size_ size_t i; for (i = 0; i < TOX_ADDRESS_SIZE; ++i) - snprintf(&output[i*2], output_size - (i * 2), "%02X", bin_id[i] & 0xff); + snprintf(&output[i * 2], output_size - (i * 2), "%02X", bin_id[i] & 0xff); return 0; } @@ -187,7 +187,7 @@ int mbs_to_wcs_buf(wchar_t *buf, const char *string, size_t n) if (n < len) return -1; - if ((len = mbstowcs(buf, string, n)) == (size_t) -1) + if ((len = mbstowcs(buf, string, n)) == (size_t) - 1) return -1; return len; @@ -201,7 +201,7 @@ int wcs_to_mbs_buf(char *buf, const wchar_t *string, size_t n) if (n < len) return -1; - if ((len = wcstombs(buf, string, n)) == (size_t) -1) + if ((len = wcstombs(buf, string, n)) == (size_t) - 1) return -1; return len; @@ -228,11 +228,11 @@ int valid_nick(const char *nick) for (i = 0; nick[i]; ++i) { if ((nick[i] == ' ' && nick[i + 1] == ' ') - || nick[i] == '/' - || nick[i] == '\n' - || nick[i] == '\t' - || nick[i] == '\v' - || nick[i] == '\r') + || nick[i] == '/' + || nick[i] == '\n' + || nick[i] == '\t' + || nick[i] == '\v' + || nick[i] == '\r') return 0; } diff --git a/src/name_lookup.c b/src/name_lookup.c index 4b88068..2b68bb4 100644 --- a/src/name_lookup.c +++ b/src/name_lookup.c @@ -249,21 +249,29 @@ void *lookup_thread_func(void *data) } struct Recv_Curl_Data recv_data; + memset(&recv_data, 0, sizeof(struct Recv_Curl_Data)); char post_data[MAX_STR_SIZE]; + snprintf(post_data, sizeof(post_data), "{\"action\": 3, \"name\": \"%s\"}", name); 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, real_domain); + 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_POSTFIELDS, post_data); int proxy_ret = set_curl_proxy(c_handle, arg_opts.proxy_address, arg_opts.proxy_port, arg_opts.proxy_type); diff --git a/src/notify.c b/src/notify.c index 2d2cec0..eaed79e 100644 --- a/src/notify.c +++ b/src/notify.c @@ -38,24 +38,24 @@ #include "xtra.h" #if defined(AUDIO) || defined(SOUND_NOTIFY) - #ifdef __APPLE__ - #include - #include - #else - #include - #include - /* compatibility with older versions of OpenAL */ - #ifndef ALC_ALL_DEVICES_SPECIFIER - #include - #endif - #endif - #ifdef SOUND_NOTIFY - #include /* freealut packet */ - #endif +#ifdef __APPLE__ +#include +#include +#else +#include +#include +/* compatibility with older versions of OpenAL */ +#ifndef ALC_ALL_DEVICES_SPECIFIER +#include +#endif +#endif +#ifdef SOUND_NOTIFY +#include /* freealut packet */ +#endif #endif /* AUDIO */ #ifdef BOX_NOTIFY - #include +#include #endif #define MAX_BOX_MSG_LEN 127 @@ -75,7 +75,7 @@ struct Control { #ifdef SOUND_NOTIFY uint32_t device_idx; /* index of output device */ - char* sounds[SOUNDS_SIZE]; + char *sounds[SOUNDS_SIZE]; #endif /* SOUND_NOTIFY */ } Control = {0}; @@ -88,7 +88,7 @@ struct _ActiveNotifications { bool active; int *id_indicator; #ifdef BOX_NOTIFY - NotifyNotification* box; + NotifyNotification *box; char messages[MAX_BOX_MSG_LEN + 1][MAX_BOX_MSG_LEN + 1]; char title[64]; size_t size; @@ -188,15 +188,17 @@ void graceful_clear() for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) { if (actives[i].active) { - #ifdef BOX_NOTIFY +#ifdef BOX_NOTIFY + if (actives[i].box) { - GError* ignore; + GError *ignore; notify_notification_close(actives[i].box, &ignore); actives[i].box = NULL; } - #endif - if(actives[i].id_indicator) +#endif + + if (actives[i].id_indicator) *actives[i].id_indicator = -1; /* reset indicator value */ if ( actives[i].looping ) { @@ -221,11 +223,11 @@ void graceful_clear() control_unlock(); } -void* do_playing(void* _p) +void *do_playing(void *_p) { (void)_p; - while(true) { + while (true) { control_lock(); if (!Control.poll_active) { @@ -240,59 +242,67 @@ void* do_playing(void* _p) for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) { if (actives[i].looping) has_looping = true; + test_active_notify = actives[i].active && !actives[i].looping; - #ifdef BOX_NOTIFY - test_active_notify = test_active_notify && !actives[i].box; - #endif +#ifdef BOX_NOTIFY + test_active_notify = test_active_notify && !actives[i].box; +#endif + if (test_active_notify) { - if(actives[i].id_indicator) + if (actives[i].id_indicator) *actives[i].id_indicator = -1; /* reset indicator value */ if (!is_playing(actives[i].source)) { - /* Close */ + /* Close */ alSourceStop(actives[i].source); alDeleteSources(1, &actives[i].source); alDeleteBuffers(1, &actives[i].buffer); memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); } } - #ifdef BOX_NOTIFY - else if (actives[i].box && time(NULL) >= actives[i].n_timeout) - { - GError* ignore; + +#ifdef BOX_NOTIFY + else if (actives[i].box && time(NULL) >= actives[i].n_timeout) { + GError *ignore; notify_notification_close(actives[i].box, &ignore); actives[i].box = NULL; - if(actives[i].id_indicator) + + if (actives[i].id_indicator) *actives[i].id_indicator = -1; /* reset indicator value */ if (!actives[i].looping && !is_playing(actives[i].source)) { - /* stop source if not looping or playing, just terminate box */ + /* stop source if not looping or playing, just terminate box */ alSourceStop(actives[i].source); alDeleteSources(1, &actives[i].source); alDeleteBuffers(1, &actives[i].buffer); memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); } } - #endif + +#endif } /* device is opened and no activity in under DEVICE_COOLDOWN time, close device*/ if (device_opened && !has_looping && - (time(NULL) - last_opened_update) > DEVICE_COOLDOWN) { + (time(NULL) - last_opened_update) > DEVICE_COOLDOWN) { m_close_device(); } + has_looping = false; control_unlock(); usleep(10000); } + pthread_exit(NULL); } int play_source(uint32_t source, uint32_t buffer, bool looping) { int i = 0; + for (; i < ACTIVE_NOTIFS_MAX && actives[i].active; i ++); + if ( i == ACTIVE_NOTIFS_MAX ) { return -1; /* Full */ } @@ -308,11 +318,11 @@ int play_source(uint32_t source, uint32_t buffer, bool looping) } #elif BOX_NOTIFY -void* do_playing(void* _p) +void *do_playing(void *_p) { (void)_p; - while(true) { + while (true) { control_lock(); if (!Control.poll_active) { @@ -323,20 +333,22 @@ void* do_playing(void* _p) int i; for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) { - if (actives[i].box && time(NULL) >= actives[i].n_timeout) - { - GError* ignore; + if (actives[i].box && time(NULL) >= actives[i].n_timeout) { + GError *ignore; notify_notification_close(actives[i].box, &ignore); actives[i].box = NULL; - if(actives[i].id_indicator) + + if (actives[i].id_indicator) *actives[i].id_indicator = -1; /* reset indicator value */ memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); } } + control_unlock(); usleep(10000); } + pthread_exit(NULL); } @@ -347,7 +359,7 @@ void graceful_clear() for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) { if (actives[i].box) { - GError* ignore; + GError *ignore; notify_notification_close(actives[i].box, &ignore); actives[i].box = NULL; } @@ -378,6 +390,7 @@ int init_notify(int login_cooldown, int notification_timeout) #endif /* SOUND_NOTIFY */ #if defined(SOUND_NOTIFY) || defined(BOX_NOTIFY) + if (pthread_mutex_init(Control.poll_mutex, NULL) != 0) return -1; @@ -419,7 +432,9 @@ void terminate_notify() #ifdef SOUND_NOTIFY int i = 0; + for (; i < SOUNDS_SIZE; i ++) free(Control.sounds[i]); + alutExit(); #endif /* SOUND_NOTIFY */ @@ -429,7 +444,7 @@ void terminate_notify() } #ifdef SOUND_NOTIFY -int set_sound(Notification sound, const char* value) +int set_sound(Notification sound, const char *value) { if (sound == silent) return 0; @@ -457,10 +472,11 @@ int play_sound_internal(Notification what, bool loop) alSourcei(source, AL_LOOPING, loop); int rc = play_source(source, buffer, loop); + if (rc < 0) { alSourceStop(source); alDeleteSources(1, &source); - alDeleteBuffers(1,&buffer); + alDeleteBuffers(1, &buffer); return -1; } @@ -472,6 +488,7 @@ int play_notify_sound(Notification notif, uint64_t flags) int rc = -1; if (flags & NT_BEEP) beep(); + if (notif != silent) { if ( !Control.poll_active || !Control.sounds[notif] ) return -1; @@ -487,17 +504,21 @@ void stop_sound(int id) { if (id >= 0 && id < ACTIVE_NOTIFS_MAX && actives[id].looping && actives[id].active ) { #ifdef BOX_NOTIFY + if (actives[id].box) { - GError* ignore; + GError *ignore; notify_notification_close(actives[id].box, &ignore); } + #endif + if (actives[id].id_indicator) *actives[id].id_indicator = -1; + // alSourcei(actives[id].source, AL_LOOPING, false); alSourceStop(actives[id].source); alDeleteSources(1, &actives[id].source); - alDeleteBuffers(1,&actives[id].buffer); + alDeleteBuffers(1, &actives[id].buffer); memset(&actives[id], 0, sizeof(struct _ActiveNotifications)); } } @@ -508,6 +529,7 @@ static int m_play_sound(Notification notif, uint64_t flags) #ifdef SOUND_NOTIFY return play_notify_sound(notif, flags); #else + if (notif != silent) beep(); @@ -516,12 +538,12 @@ static int m_play_sound(Notification notif, uint64_t flags) } #ifdef BOX_NOTIFY -void m_notify_action(NotifyNotification *box, char *action, void* data) +void m_notify_action(NotifyNotification *box, char *action, void *data) { } #endif -int sound_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_indicator) +int sound_notify(ToxWindow *self, Notification notif, uint64_t flags, int *id_indicator) { tab_notify(self, flags); @@ -540,6 +562,7 @@ int sound_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_in if (id == -1) { for (id = 0; id < ACTIVE_NOTIFS_MAX && actives[id].box; id++); + if ( id == ACTIVE_NOTIFS_MAX ) { control_unlock(); return -1; /* Full */ @@ -558,7 +581,7 @@ int sound_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_in return id; } -int sound_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id) +int sound_notify2(ToxWindow *self, Notification notif, uint64_t flags, int id) { tab_notify(self, flags); @@ -566,6 +589,7 @@ int sound_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id) return -1; if (id < 0 || id >= ACTIVE_NOTIFS_MAX) return -1; + #ifdef SOUND_NOTIFY control_lock(); @@ -578,7 +602,7 @@ int sound_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id) alSourceStop(actives[id].source); alDeleteSources(1, &actives[id].source); - alDeleteBuffers(1,&actives[id].buffer); + alDeleteBuffers(1, &actives[id].buffer); alGenSources(1, &actives[id].source); alGenBuffers(1, &actives[id].buffer); @@ -592,6 +616,7 @@ int sound_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id) return id; #else + if (notif != silent) beep(); @@ -599,7 +624,8 @@ int sound_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id) #endif /* SOUND_NOTIFY */ } -int box_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_indicator, const char* title, const char* format, ...) +int box_notify(ToxWindow *self, Notification notif, uint64_t flags, int *id_indicator, const char *title, + const char *format, ...) { if (notifications_are_disabled(flags)) { tab_notify(self, flags); @@ -613,9 +639,11 @@ int box_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_indi control_lock(); #ifdef SOUND_NOTIFY + if (id == -1) { /* Could not play */ for (id = 0; id < ACTIVE_NOTIFS_MAX && actives[id].active; id ++); + if ( id == ACTIVE_NOTIFS_MAX ) { control_unlock(); return -1; /* Full */ @@ -623,17 +651,23 @@ int box_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_indi actives[id].active = 1; actives[id].id_indicator = id_indicator; + if (id_indicator) *id_indicator = id; } + #else + if (id == -1) return -1; + #endif /* SOUND_NOTIFY */ snprintf(actives[id].title, sizeof(actives[id].title), "%s", title); + if (strlen(title) > 23) strcpy(actives[id].title + 20, "..."); - va_list __ARGS__; va_start (__ARGS__, format); + va_list __ARGS__; + va_start (__ARGS__, format); vsnprintf (actives[id].messages[0], MAX_BOX_MSG_LEN, format, __ARGS__); va_end (__ARGS__); @@ -656,7 +690,7 @@ int box_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_indi #endif /* BOX_NOTIFY */ } -int box_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id, const char* format, ...) +int box_notify2(ToxWindow *self, Notification notif, uint64_t flags, int id, const char *format, ...) { if (notifications_are_disabled(flags)) { tab_notify(self, flags); @@ -675,7 +709,8 @@ int box_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id, con return -1; } - va_list __ARGS__; va_start (__ARGS__, format); + va_list __ARGS__; + va_start (__ARGS__, format); vsnprintf (actives[id].messages[actives[id].size], MAX_BOX_MSG_LEN, format, __ARGS__); va_end (__ARGS__); @@ -688,7 +723,8 @@ int box_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id, con char formated[128 * 129] = {'\0'}; int i = 0; - for (; i 23) strcpy(actives[id].title + 20, "..."); - va_list __ARGS__; va_start (__ARGS__, format); + va_list __ARGS__; + va_start (__ARGS__, format); vsnprintf (actives[id].messages[0], MAX_BOX_MSG_LEN, format, __ARGS__); va_end (__ARGS__); @@ -756,7 +796,7 @@ int box_silent_notify(ToxWindow* self, uint64_t flags, int* id_indicator, const #endif } -int box_silent_notify2(ToxWindow* self, uint64_t flags, int id, const char* format, ...) +int box_silent_notify2(ToxWindow *self, uint64_t flags, int id, const char *format, ...) { tab_notify(self, flags); @@ -772,7 +812,8 @@ int box_silent_notify2(ToxWindow* self, uint64_t flags, int id, const char* form } - va_list __ARGS__; va_start (__ARGS__, format); + va_list __ARGS__; + va_start (__ARGS__, format); vsnprintf (actives[id].messages[actives[id].size], MAX_BOX_MSG_LEN, format, __ARGS__); va_end (__ARGS__); @@ -785,7 +826,8 @@ int box_silent_notify2(ToxWindow* self, uint64_t flags, int id, const char* form char formated[128 * 129] = {'\0'}; int i = 0; - for (; i #include "windows.h" -typedef enum _Notification -{ +typedef enum _Notification { silent = -1, notif_error, self_log_in, @@ -63,18 +62,19 @@ typedef enum _Flags { int init_notify(int login_cooldown, int notification_timeout); void terminate_notify(); -int sound_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_indicator); -int sound_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id); +int sound_notify(ToxWindow *self, Notification notif, uint64_t flags, int *id_indicator); +int sound_notify2(ToxWindow *self, Notification notif, uint64_t flags, int id); void stop_sound(int id); -int box_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_indicator, const char* title, const char* format, ...); -int box_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id, const char* format, ...); -int box_silent_notify(ToxWindow* self, uint64_t flags, int* id_indicator, const char* title, const char* format, ...); -int box_silent_notify2(ToxWindow* self, uint64_t flags, int id, const char* format, ...); +int box_notify(ToxWindow *self, Notification notif, uint64_t flags, int *id_indicator, const char *title, + const char *format, ...); +int box_notify2(ToxWindow *self, Notification notif, uint64_t flags, int id, const char *format, ...); +int box_silent_notify(ToxWindow *self, uint64_t flags, int *id_indicator, const char *title, const char *format, ...); +int box_silent_notify2(ToxWindow *self, uint64_t flags, int id, const char *format, ...); #ifdef SOUND_NOTIFY -int set_sound(Notification sound, const char* value); +int set_sound(Notification sound, const char *value); #endif /* SOUND_NOTIFY */ #endif /* NOTIFY_H */ diff --git a/src/osx_video.h b/src/osx_video.h index fce78fe..413ba32 100644 --- a/src/osx_video.h +++ b/src/osx_video.h @@ -31,13 +31,16 @@ #endif /* __OBJC__ */ #define RELEASE_CHK(func, obj) if ((obj))\ - func((obj)); + func((obj)); void bgrtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t *rgb, uint16_t width, uint16_t height); #ifdef __OBJC__ -@interface OSXVideo : NSObject -- (instancetype)initWithDeviceNames:(char **)device_names AmtDevices:(int *)size; +@interface OSXVideo : +NSObject +- (instancetype)initWithDeviceNames: +(char **)device_names AmtDevices: +(int *)size; @end #endif /* __OBJC__ */ diff --git a/src/osx_video.m b/src/osx_video.m index befbc4c..b745675 100644 --- a/src/osx_video.m +++ b/src/osx_video.m @@ -44,19 +44,19 @@ static uint8_t rgb_to_y(int r, int g, int b) { int y = ((9798 * r + 19235 * g + 3736 * b) >> 15); - return y>255? 255 : y<0 ? 0 : y; + return y > 255 ? 255 : y < 0 ? 0 : y; } static uint8_t rgb_to_u(int r, int g, int b) { int u = ((-5538 * r + -10846 * g + 16351 * b) >> 15) + 128; - return u>255? 255 : u<0 ? 0 : u; + return u > 255 ? 255 : u < 0 ? 0 : u; } static uint8_t rgb_to_v(int r, int g, int b) { int v = ((16351 * r + -13697 * g + -2664 * b) >> 15) + 128; - return v>255? 255 : v<0 ? 0 : v; + return v > 255 ? 255 : v < 0 ? 0 : v; } void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t *rgb, uint16_t width, uint16_t height) @@ -65,9 +65,10 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t uint8_t *p; uint8_t r, g, b; - for(y = 0; y != height; y += 2) { + for (y = 0; y != height; y += 2) { p = rgb; - for(x = 0; x != width; x++) { + + for (x = 0; x != width; x++) { b = *rgb++; g = *rgb++; r = *rgb++; @@ -76,7 +77,7 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t *plane_y++ = rgb_to_y(r, g, b); } - for(x = 0; x != width / 2; x++) { + for (x = 0; x != width / 2; x++) { b = *rgb++; g = *rgb++; r = *rgb++; @@ -91,9 +92,12 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t *plane_y++ = rgb_to_y(r, g, b); - b = ((int)b + (int)*(rgb - 8) + (int)*p + (int)*(p + 4) + 2) / 4; p++; - g = ((int)g + (int)*(rgb - 7) + (int)*p + (int)*(p + 4) + 2) / 4; p++; - r = ((int)r + (int)*(rgb - 6) + (int)*p + (int)*(p + 4) + 2) / 4; p++; + b = ((int)b + (int) * (rgb - 8) + (int) * p + (int) * (p + 4) + 2) / 4; + p++; + g = ((int)g + (int) * (rgb - 7) + (int) * p + (int) * (p + 4) + 2) / 4; + p++; + r = ((int)r + (int) * (rgb - 6) + (int) * p + (int) * (p + 4) + 2) / 4; + p++; p++; *plane_u++ = rgb_to_u(r, g, b); @@ -122,22 +126,26 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t BOOL _shouldMangleDimensions; } -- (instancetype)initWithDeviceNames: (char **)device_names AmtDevices: (int *)size { +- (instancetype)initWithDeviceNames: +(char **)device_names AmtDevices: +(int *)size { _session = [[AVCaptureSession alloc] init]; - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; +NSArray *devices = [AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo]; int i; + for (i = 0; i < [devices count]; ++i) { - AVCaptureDevice *device = [devices objectAtIndex:i]; +AVCaptureDevice *device = [devices objectAtIndex: i]; char *video_input_name; NSString *localizedName = [device localizedName]; - video_input_name = (char*)malloc(strlen([localizedName cStringUsingEncoding:NSUTF8StringEncoding]) + 1); - strcpy(video_input_name, (char*)[localizedName cStringUsingEncoding:NSUTF8StringEncoding]); +video_input_name = (char *)malloc(strlen([localizedName cStringUsingEncoding: NSUTF8StringEncoding]) + 1); +strcpy(video_input_name, (char *)[localizedName cStringUsingEncoding: NSUTF8StringEncoding]); device_names[i] = video_input_name; } if ( i <= 0 ) return nil; + *size = i; return self; @@ -151,14 +159,17 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t [super dealloc]; } -- (int)openVideoDeviceIndex: (uint32_t)device_idx Width: (uint16_t *)width Height: (uint16_t *)height { +- (int)openVideoDeviceIndex: +(uint32_t)device_idx Width: +(uint16_t *)width Height: +(uint16_t *)height { pthread_mutex_init(&_frameLock, NULL); pthread_mutex_lock(&_frameLock); _processingQueue = dispatch_queue_create("Toxic processing queue", DISPATCH_QUEUE_SERIAL); - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; - AVCaptureDevice *device = [devices objectAtIndex:device_idx]; +NSArray *devices = [AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo]; +AVCaptureDevice *device = [devices objectAtIndex: device_idx]; NSError *error = NULL; - AVCaptureInput *input = [[AVCaptureDeviceInput alloc] initWithDevice:device error:&error]; +AVCaptureInput *input = [[AVCaptureDeviceInput alloc] initWithDevice: device error: &error]; if ( error != NULL ) { [input release]; @@ -166,7 +177,7 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t } [_session beginConfiguration]; - [_session addInput:input]; +[_session addInput: input]; //_session.sessionPreset = AVCaptureSessionPreset640x480; //*width = 640; //*height = 480; @@ -176,8 +187,9 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t [device release]; /* Obtain device resolution */ - AVCaptureInputPort *port = [input.ports objectAtIndex:0]; + AVCaptureInputPort *port = [input.ports objectAtIndex: 0]; CMFormatDescriptionRef format_description = port.formatDescription; + if ( format_description ) { CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(format_description); *width = dimensions.width; @@ -188,36 +200,44 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t } _linkerVideo = [[AVCaptureVideoDataOutput alloc] init]; - [_linkerVideo setSampleBufferDelegate:self queue:_processingQueue]; +[_linkerVideo setSampleBufferDelegate: self queue: _processingQueue]; + // TODO possibly get a better pixel format if (_shouldMangleDimensions) { - [_linkerVideo setVideoSettings:@{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA), - (id)kCVPixelBufferWidthKey: @640, - (id)kCVPixelBufferHeightKey: @480}]; +[_linkerVideo setVideoSettings: @ { +(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA), +(id)kCVPixelBufferWidthKey: @640, +(id)kCVPixelBufferHeightKey: @480 + }]; } else { - [_linkerVideo setVideoSettings:@{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)}]; +[_linkerVideo setVideoSettings: @{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)}]; } - [_session addOutput:_linkerVideo]; +[_session addOutput: _linkerVideo]; [_session startRunning]; pthread_mutex_unlock(&_frameLock); return 0; } -- (void)closeVideoDeviceIndex: (uint32_t)device_idx { - NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; - AVCaptureDevice *device = [devices objectAtIndex:device_idx]; +- (void)closeVideoDeviceIndex: +(uint32_t)device_idx { +NSArray *devices = [AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo]; +AVCaptureDevice *device = [devices objectAtIndex: device_idx]; NSError *error = NULL; - AVCaptureInput *input = [[AVCaptureDeviceInput alloc] initWithDevice:device error:&error]; +AVCaptureInput *input = [[AVCaptureDeviceInput alloc] initWithDevice: device error: &error]; [_session stopRunning]; - [_session removeOutput:_linkerVideo]; - [_session removeInput:input]; +[_session removeOutput: _linkerVideo]; +[_session removeInput: input]; [_linkerVideo release]; } -- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { +- (void)captureOutput: +(AVCaptureOutput *)captureOutput didOutputSampleBuffer: +(CMSampleBufferRef)sampleBuffer fromConnection: +(AVCaptureConnection *)connection { pthread_mutex_lock(&_frameLock); CVImageBufferRef img = CMSampleBufferGetImageBuffer(sampleBuffer); + if (!img) { NSLog(@"Toxic WARNING: Bad sampleBuffer from AVfoundation!"); } else { @@ -231,7 +251,12 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t pthread_mutex_unlock(&_frameLock); } -- (int)getVideoFrameY: (uint8_t *)y U: (uint8_t *)u V: (uint8_t *)v Width: (uint16_t *)width Height: (uint16_t *)height { +- (int)getVideoFrameY: +(uint8_t *)y U: +(uint8_t *)u V: +(uint8_t *)v Width: +(uint16_t *)width Height: +(uint16_t *)height { if (!_currentFrame) { return -1; } @@ -240,6 +265,7 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t CFRetain(_currentFrame); CFTypeID imageType = CFGetTypeID(_currentFrame); + if (imageType == CVPixelBufferGetTypeID()) { // TODO maybe handle other formats bgrxtoyuv420(y, u, v, CVPixelBufferGetBaseAddress(_currentFrame), *width, *height); @@ -263,11 +289,11 @@ void bgrxtoyuv420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, uint8_t /* * C-interface for OSXVideo */ -static OSXVideo* _OSXVideo = nil; +static OSXVideo *_OSXVideo = nil; int osx_video_init(char **device_names, int *size) { - _OSXVideo = [[OSXVideo alloc] initWithDeviceNames: device_names AmtDevices: size]; +_OSXVideo = [[OSXVideo alloc] initWithDeviceNames: device_names AmtDevices: size]; if ( _OSXVideo == nil ) return -1; @@ -286,12 +312,12 @@ int osx_video_open_device(uint32_t selection, uint16_t *width, uint16_t *height) if ( _OSXVideo == nil ) return -1; - return [_OSXVideo openVideoDeviceIndex: selection Width: width Height: height]; +return [_OSXVideo openVideoDeviceIndex: selection Width: width Height: height]; } void osx_video_close_device(uint32_t device_idx) { - [_OSXVideo closeVideoDeviceIndex: device_idx]; +[_OSXVideo closeVideoDeviceIndex: device_idx]; } int osx_video_read_device(uint8_t *y, uint8_t *u, uint8_t *v, uint16_t *width, uint16_t *height) @@ -299,7 +325,7 @@ int osx_video_read_device(uint8_t *y, uint8_t *u, uint8_t *v, uint16_t *width, u if ( _OSXVideo == nil ) return -1; - return [_OSXVideo getVideoFrameY: y U: u V: v Width: width Height: height]; +return [_OSXVideo getVideoFrameY: y U: u V: v Width: width Height: height]; } /* * End of C-interface for OSXVideo diff --git a/src/prompt.c b/src/prompt.c index 4b8c978..ceb5062 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -214,11 +214,11 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) if (wcsncmp(ctx->line, L"/avatar \"", wcslen(L"/avatar \"")) == 0) diff = dir_match(self, m, ctx->line, L"/avatar"); - else if (wcsncmp(ctx->line, L"/status ", wcslen(L"/status ")) == 0){ + else if (wcsncmp(ctx->line, L"/status ", wcslen(L"/status ")) == 0) { const char status_cmd_list[3][8] = { - {"online"}, - {"away"}, - {"busy"}, + {"online"}, + {"away"}, + {"busy"}, }; diff = complete_line(self, status_cmd_list, 3, 8); } else @@ -238,8 +238,7 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) } else if (key == '\r') { rm_trailing_spaces_buf(ctx); - if (!wstring_is_empty(ctx->line)) - { + if (!wstring_is_empty(ctx->line)) { add_line_to_hist(ctx); wstrsubst(ctx->line, L'¶', L'\n'); @@ -301,10 +300,12 @@ static void prompt_onDraw(ToxWindow *self, Tox *m) status_text = "Online"; colour = GREEN; break; + case TOX_USER_STATUS_AWAY: status_text = "Away"; colour = YELLOW; break; + case TOX_USER_STATUS_BUSY: status_text = "Busy"; colour = RED; @@ -335,7 +336,7 @@ static void prompt_onDraw(ToxWindow *self, Tox *m) pthread_mutex_lock(&Winthread.lock); size_t slen = tox_self_get_status_message_size(m); - tox_self_get_status_message (m, (uint8_t*) statusmsg); + tox_self_get_status_message (m, (uint8_t *) statusmsg); statusmsg[slen] = '\0'; snprintf(statusbar->statusmsg, sizeof(statusbar->statusmsg), "%s", statusmsg); statusbar->statusmsg_len = strlen(statusbar->statusmsg); @@ -404,8 +405,7 @@ static void prompt_onConnectionChange(ToxWindow *self, Tox *m, uint32_t friendnu else box_notify(self, user_log_in, NT_WNDALERT_2 | NT_NOTIFWND | NT_RESTOL, &self->active_box, "Toxic", "%s has come online", nick ); - } - else if (connection_status == TOX_CONNECTION_NONE) { + } else if (connection_status == TOX_CONNECTION_NONE) { msg = "has gone offline"; line_info_add(self, timefrmt, nick, NULL, DISCONNECTION, 0, RED, msg); write_to_log(msg, nick, ctx->log, true); diff --git a/src/settings.c b/src/settings.c index 3e8e8df..6979337 100644 --- a/src/settings.c +++ b/src/settings.c @@ -32,45 +32,45 @@ #include "misc_tools.h" #ifdef AUDIO - #include "audio_device.h" +#include "audio_device.h" #endif /* AUDIO */ #include "settings.h" #include "line_info.h" #ifndef PACKAGE_DATADIR - #define PACKAGE_DATADIR "." +#define PACKAGE_DATADIR "." #endif #define NO_SOUND "silent" static struct ui_strings { - const char* self; - const char* timestamps; - const char* time_format; - const char* timestamp_format; - const char* log_timestamp_format; - const char* alerts; - const char* bell_on_message; - const char* bell_on_filetrans; - const char* bell_on_filetrans_accept; - const char* bell_on_invite; - const char* native_colors; - const char* autolog; - const char* history_size; - const char* show_typing_self; - const char* show_typing_other; - const char* show_welcome_msg; - const char* show_connection_msg; - const char* nodeslist_update_freq; + const char *self; + const char *timestamps; + const char *time_format; + const char *timestamp_format; + const char *log_timestamp_format; + const char *alerts; + const char *bell_on_message; + const char *bell_on_filetrans; + const char *bell_on_filetrans_accept; + const char *bell_on_invite; + const char *native_colors; + const char *autolog; + const char *history_size; + const char *show_typing_self; + const char *show_typing_other; + const char *show_welcome_msg; + const char *show_connection_msg; + const char *nodeslist_update_freq; - const char* line_join; - const char* line_quit; - const char* line_alert; - const char* line_normal; + const char *line_join; + const char *line_quit; + const char *line_alert; + const char *line_normal; - const char* mplex_away; - const char* mplex_away_note; + const char *mplex_away; + const char *mplex_away_note; } ui_strings = { "ui", "timestamps", @@ -98,7 +98,7 @@ static struct ui_strings { "mplex_away_note", }; -static void ui_defaults(struct user_settings* settings) +static void ui_defaults(struct user_settings *settings) { settings->timestamps = TIMESTAMPS_ON; snprintf(settings->timestamp_format, sizeof(settings->timestamp_format), "%s", TIMESTAMP_DEFAULT); @@ -131,18 +131,18 @@ static void ui_defaults(struct user_settings* settings) } static const struct keys_strings { - const char* self; - const char* next_tab; - const char* prev_tab; - const char* scroll_line_up; - const char* scroll_line_down; - const char* half_page_up; - const char* half_page_down; - const char* page_bottom; - const char* peer_list_up; - const char* peer_list_down; - const char* toggle_peerlist; - const char* toggle_pastemode; + const char *self; + const char *next_tab; + const char *prev_tab; + const char *scroll_line_up; + const char *scroll_line_down; + const char *half_page_up; + const char *half_page_down; + const char *page_bottom; + const char *peer_list_up; + const char *peer_list_down; + const char *toggle_peerlist; + const char *toggle_pastemode; } key_strings = { "keys", "next_tab", @@ -159,7 +159,7 @@ static const struct keys_strings { }; /* defines from toxic.h */ -static void key_defaults(struct user_settings* settings) +static void key_defaults(struct user_settings *settings) { settings->key_next_tab = T_KEY_NEXT; settings->key_prev_tab = T_KEY_PREV; @@ -175,11 +175,11 @@ static void key_defaults(struct user_settings* settings) } static const struct tox_strings { - const char* self; - const char* download_path; - const char* chatlogs_path; - const char* avatar_path; - const char* password_eval; + const char *self; + const char *download_path; + const char *chatlogs_path; + const char *avatar_path; + const char *password_eval; } tox_strings = { "tox", "download_path", @@ -188,7 +188,7 @@ static const struct tox_strings { "password_eval", }; -static void tox_defaults(struct user_settings* settings) +static void tox_defaults(struct user_settings *settings) { strcpy(settings->download_path, ""); strcpy(settings->chatlogs_path, ""); @@ -198,10 +198,10 @@ static void tox_defaults(struct user_settings* settings) #ifdef AUDIO static const struct audio_strings { - const char* self; - const char* input_device; - const char* output_device; - const char* VAD_treshold; + const char *self; + const char *input_device; + const char *output_device; + const char *VAD_treshold; } audio_strings = { "audio", "input_device", @@ -209,7 +209,7 @@ static const struct audio_strings { "VAD_treshold", }; -static void audio_defaults(struct user_settings* settings) +static void audio_defaults(struct user_settings *settings) { settings->audio_in_dev = 0; settings->audio_out_dev = 0; @@ -219,17 +219,17 @@ static void audio_defaults(struct user_settings* settings) #ifdef SOUND_NOTIFY static const struct sound_strings { - const char* self; - const char* notif_error; - const char* self_log_in; - const char* self_log_out; - const char* user_log_in; - const char* user_log_out; - const char* call_incoming; - const char* call_outgoing; - const char* generic_message; - const char* transfer_pending; - const char* transfer_completed; + const char *self; + const char *notif_error; + const char *self_log_in; + const char *self_log_out; + const char *user_log_in; + const char *user_log_out; + const char *call_incoming; + const char *call_outgoing; + const char *generic_message; + const char *transfer_pending; + const char *transfer_completed; } sound_strings = { "sounds", "notif_error", @@ -245,11 +245,12 @@ static const struct sound_strings { }; #endif -static int key_parse(const char **bind) { +static int key_parse(const char **bind) +{ int len = strlen(*bind); if (len > 5) { - if(strncasecmp(*bind, "ctrl+", 5) == 0 && toupper(bind[0][5]) != 'M') /* ctrl+m cannot be used */ + if (strncasecmp(*bind, "ctrl+", 5) == 0 && toupper(bind[0][5]) != 'M') /* ctrl+m cannot be used */ return toupper(bind[0][5]) - 'A' + 1; } @@ -262,7 +263,8 @@ static int key_parse(const char **bind) { return -1; } -static void set_key_binding(int *key, const char **bind) { +static void set_key_binding(int *key, const char **bind) +{ int code = key_parse(bind); if (code != -1) { @@ -318,6 +320,7 @@ int settings_load(struct user_settings *s, const char *patharg) config_setting_lookup_bool(setting, ui_strings.timestamps, &s->timestamps); int time = 24; + if ( config_setting_lookup_int(setting, ui_strings.time_format, &time) ) { if (time == 12) { snprintf(s->timestamp_format, sizeof(s->timestamp_format), "%s", "%I:%M:%S %p"); @@ -338,12 +341,15 @@ int settings_load(struct user_settings *s, const char *patharg) if (config_setting_lookup_bool(setting, ui_strings.bell_on_message, &s->bell_on_message)) { s->bell_on_message = s->bell_on_message ? NT_BEEP : 0; } + if (config_setting_lookup_bool(setting, ui_strings.bell_on_filetrans, &s->bell_on_filetrans)) { s->bell_on_filetrans = s->bell_on_filetrans ? NT_BEEP : 0; } + if (config_setting_lookup_bool(setting, ui_strings.bell_on_filetrans_accept, &s->bell_on_filetrans_accept)) { s->bell_on_filetrans_accept = s->bell_on_filetrans_accept ? NT_BEEP : 0; } + if (config_setting_lookup_bool(setting, ui_strings.bell_on_invite, &s->bell_on_invite)) { s->bell_on_invite = s->bell_on_invite ? NT_BEEP : 0; } @@ -361,12 +367,15 @@ int settings_load(struct user_settings *s, const char *patharg) if ( config_setting_lookup_string(setting, ui_strings.line_join, &str) ) { snprintf(s->line_join, sizeof(s->line_join), "%s", str); } + if ( config_setting_lookup_string(setting, ui_strings.line_quit, &str) ) { snprintf(s->line_quit, sizeof(s->line_quit), "%s", str); } + if ( config_setting_lookup_string(setting, ui_strings.line_alert, &str) ) { snprintf(s->line_alert, sizeof(s->line_alert), "%s", str); } + if ( config_setting_lookup_string(setting, ui_strings.line_normal, &str) ) { snprintf(s->line_normal, sizeof(s->line_normal), "%s", str); } @@ -420,32 +429,44 @@ int settings_load(struct user_settings *s, const char *patharg) /* keys */ if ((setting = config_lookup(cfg, key_strings.self)) != NULL) { - const char* tmp = NULL; + const char *tmp = NULL; + if (config_setting_lookup_string(setting, key_strings.next_tab, &tmp)) set_key_binding(&s->key_next_tab, &tmp); + if (config_setting_lookup_string(setting, key_strings.prev_tab, &tmp)) set_key_binding(&s->key_prev_tab, &tmp); + if (config_setting_lookup_string(setting, key_strings.scroll_line_up, &tmp)) set_key_binding(&s->key_scroll_line_up, &tmp); + if (config_setting_lookup_string(setting, key_strings.scroll_line_down, &tmp)) set_key_binding(&s->key_scroll_line_down, &tmp); + if (config_setting_lookup_string(setting, key_strings.half_page_up, &tmp)) set_key_binding(&s->key_half_page_up, &tmp); + if (config_setting_lookup_string(setting, key_strings.half_page_down, &tmp)) set_key_binding(&s->key_half_page_down, &tmp); + if (config_setting_lookup_string(setting, key_strings.page_bottom, &tmp)) set_key_binding(&s->key_page_bottom, &tmp); + if (config_setting_lookup_string(setting, key_strings.peer_list_up, &tmp)) set_key_binding(&s->key_peer_list_up, &tmp); + if (config_setting_lookup_string(setting, key_strings.peer_list_down, &tmp)) set_key_binding(&s->key_peer_list_down, &tmp); + if (config_setting_lookup_string(setting, key_strings.toggle_peerlist, &tmp)) set_key_binding(&s->key_toggle_peerlist, &tmp); + if (config_setting_lookup_string(setting, key_strings.toggle_pastemode, &tmp)) set_key_binding(&s->key_toggle_pastemode, &tmp); } #ifdef AUDIO + if ((setting = config_lookup(cfg, audio_strings.self)) != NULL) { config_setting_lookup_int(setting, audio_strings.input_device, &s->audio_in_dev); s->audio_in_dev = s->audio_in_dev < 0 || s->audio_in_dev > MAX_DEVICES ? 0 : s->audio_in_dev; @@ -455,9 +476,11 @@ int settings_load(struct user_settings *s, const char *patharg) config_setting_lookup_float(setting, audio_strings.VAD_treshold, &s->VAD_treshold); } + #endif #ifdef SOUND_NOTIFY + if ((setting = config_lookup(cfg, sound_strings.self)) != NULL) { if ( (config_setting_lookup_string(setting, sound_strings.notif_error, &str) != CONFIG_TRUE) || !set_sound(notif_error, str) ) { @@ -506,8 +529,7 @@ int settings_load(struct user_settings *s, const char *patharg) if (str && strcasecmp(str, NO_SOUND) != 0) set_sound(transfer_completed, PACKAGE_DATADIR "/sounds/ToxicTransferComplete.wav"); } - } - else { + } else { set_sound(notif_error, PACKAGE_DATADIR "/sounds/ToxicError.wav"); set_sound(user_log_in, PACKAGE_DATADIR "/sounds/ToxicContactOnline.wav"); set_sound(user_log_out, PACKAGE_DATADIR "/sounds/ToxicContactOffline.wav"); @@ -517,6 +539,7 @@ int settings_load(struct user_settings *s, const char *patharg) set_sound(transfer_pending, PACKAGE_DATADIR "/sounds/ToxicTransferStart.wav"); set_sound(transfer_completed, PACKAGE_DATADIR "/sounds/ToxicTransferComplete.wav"); } + #endif config_destroy(cfg); diff --git a/src/term_mplex.c b/src/term_mplex.c index 35bf082..505586f 100644 --- a/src/term_mplex.c +++ b/src/term_mplex.c @@ -52,8 +52,7 @@ extern struct Winthread Winthread; #define PATH_SEP_S "/" #define PATH_SEP_C '/' -typedef enum -{ +typedef enum { MPLEX_NONE, MPLEX_SCREEN, MPLEX_TMUX, @@ -97,13 +96,14 @@ static char *read_into_dyn_buffer (FILE *stream) char *dyn_buffer = NULL; int dyn_buffer_size = 1; /* account for the \0 */ - while ((input_ptr = fgets (buffer, BUFFER_SIZE, stream)) != NULL) - { + while ((input_ptr = fgets (buffer, BUFFER_SIZE, stream)) != NULL) { int length = dyn_buffer_size + strlen (input_ptr); + if (dyn_buffer) - dyn_buffer = (char*) realloc (dyn_buffer, length); + dyn_buffer = (char *) realloc (dyn_buffer, length); else - dyn_buffer = (char*) malloc (length); + dyn_buffer = (char *) malloc (length); + strcpy (dyn_buffer + dyn_buffer_size - 1, input_ptr); dyn_buffer_size = length; } @@ -116,26 +116,29 @@ static char *extract_socket_path (const char *info) const char *search_str = " Socket"; const char *pos = strstr (info, search_str); char *end = NULL; - char* path = NULL; + char *path = NULL; if (!pos) return NULL; pos += strlen (search_str); pos = strchr (pos, PATH_SEP_C); + if (!pos) return NULL; end = strchr (pos, '\n'); + if (!end) return NULL; *end = '\0'; end = strrchr (pos, '.'); + if (!end) return NULL; - path = (char*) malloc (end - pos + 1); + path = (char *) malloc (end - pos + 1); *end = '\0'; return strcpy (path, pos); } @@ -147,14 +150,17 @@ static int detect_gnu_screen () char *dyn_buffer = NULL; socket_name = getenv ("STY"); + if (!socket_name) goto nomplex; session_info_stream = popen ("env LC_ALL=C screen -ls", "r"); + if (!session_info_stream) goto nomplex; dyn_buffer = read_into_dyn_buffer (session_info_stream); + if (!dyn_buffer) goto nomplex; @@ -162,6 +168,7 @@ static int detect_gnu_screen () session_info_stream = NULL; socket_path = extract_socket_path (dyn_buffer); + if (!socket_path) goto nomplex; @@ -181,23 +188,29 @@ static int detect_gnu_screen () return 1; nomplex: + if (session_info_stream) pclose (session_info_stream); + if (dyn_buffer) free (dyn_buffer); + if (socket_path) free(socket_path); + return 0; } static int detect_tmux () { char *tmux_env = getenv ("TMUX"), *pos; + if (!tmux_env) return 0; /* find second separator */ pos = strrchr (tmux_env, ','); + if (!pos) return 0; @@ -230,6 +243,7 @@ static int gnu_screen_is_detached () return 0; struct stat sb; + if (stat (mplex_data, &sb) != 0) return 0; @@ -257,10 +271,12 @@ static int tmux_is_detached () const int numstr_len = strlen (mplex_data); session_info_stream = popen ("env LC_ALL=C tmux list-sessions", "r"); + if (!session_info_stream) goto fail; dyn_buffer = read_into_dyn_buffer (session_info_stream); + if (!dyn_buffer) goto fail; @@ -268,7 +284,7 @@ static int tmux_is_detached () session_info_stream = NULL; /* prepare search string, for finding the current session's entry */ - search_str = (char*) malloc (numstr_len + 4); + search_str = (char *) malloc (numstr_len + 4); search_str[0] = '\n'; strcpy (search_str + 1, mplex_data); strcat (search_str, ": "); @@ -295,12 +311,16 @@ static int tmux_is_detached () return attached_pos == NULL || attached_pos > nl_pos; fail: + if (session_info_stream) pclose (session_info_stream); + if (dyn_buffer) free (dyn_buffer); + if (search_str) free (search_str); + return 0; } @@ -332,26 +352,21 @@ static void mplex_timer_handler (Tox *m) current_status = tox_self_get_status (m); pthread_mutex_unlock (&Winthread.lock); - if (auto_away_active && current_status == TOX_USER_STATUS_AWAY && !detached) - { + if (auto_away_active && current_status == TOX_USER_STATUS_AWAY && !detached) { auto_away_active = false; new_status = prev_status; new_note = prev_note; - } - else - if (current_status == TOX_USER_STATUS_NONE && detached) - { + } else if (current_status == TOX_USER_STATUS_NONE && detached) { auto_away_active = true; prev_status = current_status; new_status = TOX_USER_STATUS_AWAY; pthread_mutex_lock (&Winthread.lock); size_t slen = tox_self_get_status_message_size(m); - tox_self_get_status_message (m, (uint8_t*) prev_note); + tox_self_get_status_message (m, (uint8_t *) prev_note); prev_note[slen] = '\0'; pthread_mutex_unlock (&Winthread.lock); new_note = user_settings->mplex_away_note; - } - else + } else return; char argv[3][MAX_STR_SIZE]; diff --git a/src/toxic.c b/src/toxic.c index ba3aee4..6699872 100644 --- a/src/toxic.c +++ b/src/toxic.c @@ -64,7 +64,7 @@ #include "bootstrap.h" #ifdef X11 - #include "xtra.h" +#include "xtra.h" #endif #ifdef AUDIO @@ -76,7 +76,7 @@ ToxAV *av; #endif /* AUDIO */ #ifndef PACKAGE_DATADIR - #define PACKAGE_DATADIR "." +#define PACKAGE_DATADIR "." #endif /* Export for use in Callbacks */ @@ -320,8 +320,10 @@ static int password_prompt(char *buf, int size) /* eat overflowed stdin and return error */ if (buf[--len] != '\n') { int ch; + while ((ch = getchar()) != '\n' && ch > 0) ; + return 0; } @@ -338,6 +340,7 @@ static int password_eval(char *buf, int size) /* Run password_eval command */ FILE *f = popen(user_settings->password_eval, "r"); + if (f == NULL) { fprintf(stderr, "Executing password_eval failed\n"); return 0; @@ -345,6 +348,7 @@ static int password_eval(char *buf, int size) /* Get output from command */ char *ret = fgets(buf, size, f); + if (ret == NULL) { fprintf(stderr, "Reading password from password_eval command failed\n"); pclose(f); @@ -353,6 +357,7 @@ static int password_eval(char *buf, int size) /* Get exit status */ int status = pclose(f); + if (status != 0) { fprintf(stderr, "password_eval command returned error %d\n", status); return 0; @@ -360,6 +365,7 @@ static int password_eval(char *buf, int size) /* Removez whitespace or \n at end */ int i, len = strlen(buf); + for (i = len - 1; i > 0 && isspace(buf[i]); i--) { buf[i] = 0; len--; @@ -378,7 +384,7 @@ static void first_time_encrypt(const char *msg) printf("%s ", msg); if (!strcasecmp(ch, "y\n") || !strcasecmp(ch, "n\n") || !strcasecmp(ch, "yes\n") - || !strcasecmp(ch, "no\n") || !strcasecmp(ch, "q\n")) + || !strcasecmp(ch, "no\n") || !strcasecmp(ch, "q\n")) break; } while (fgets(ch, sizeof(ch), stdin)); @@ -612,6 +618,7 @@ static Tox *load_tox(char *data_path, struct Tox_Options *tox_opts, TOX_ERR_NEW size_t pwlen = 0; int pweval = user_settings->password_eval[0]; + if (!pweval) { system("clear"); // TODO: is this portable? printf("Enter password (q to quit) "); @@ -626,6 +633,7 @@ static Tox *load_tox(char *data_path, struct Tox_Options *tox_opts, TOX_ERR_NEW } else { pwlen = password_prompt(user_password.pass, sizeof(user_password.pass)); } + user_password.len = pwlen; if (strcasecmp(user_password.pass, "q") == 0) { @@ -785,7 +793,7 @@ void *thread_cqueue(void *data) ToxWindow *toxwin = get_window_ptr(i); if (toxwin != NULL && toxwin->is_chat - && tox_friend_get_connection_status(m, toxwin->num, NULL) != TOX_CONNECTION_NONE) + && tox_friend_get_connection_status(m, toxwin->num, NULL) != TOX_CONNECTION_NONE) cqueue_try_send(toxwin, m); } @@ -933,10 +941,10 @@ static void parse_args(int argc, char *argv[]) arg_opts.proxy_type = TOX_PROXY_TYPE_SOCKS5; snprintf(arg_opts.proxy_address, sizeof(arg_opts.proxy_address), "%s", optarg); - if (++optind > argc || argv[optind-1][0] == '-') + if (++optind > argc || argv[optind - 1][0] == '-') exit_toxic_err("Proxy error", FATALERR_PROXY); - port = strtol(argv[optind-1], NULL, 10); + port = strtol(argv[optind - 1], NULL, 10); if (port <= 0 || port > MAX_PORT_RANGE) exit_toxic_err("Proxy error", FATALERR_PROXY); @@ -948,10 +956,10 @@ static void parse_args(int argc, char *argv[]) arg_opts.proxy_type = TOX_PROXY_TYPE_HTTP; snprintf(arg_opts.proxy_address, sizeof(arg_opts.proxy_address), "%s", optarg); - if (++optind > argc || argv[optind-1][0] == '-') + if (++optind > argc || argv[optind - 1][0] == '-') exit_toxic_err("Proxy error", FATALERR_PROXY); - port = strtol(argv[optind-1], NULL, 10); + port = strtol(argv[optind - 1], NULL, 10); if (port <= 0 || port > MAX_PORT_RANGE) exit_toxic_err("Proxy error", FATALERR_PROXY); @@ -1077,7 +1085,7 @@ static void init_default_data_files(void) // this doesn't do anything (yet) #ifdef X11 -void DnD_callback(const char* asdv, DropType dt) +void DnD_callback(const char *asdv, DropType dt) { // if (dt != DT_plain) // return; @@ -1124,7 +1132,7 @@ int main(int argc, char **argv) const char *p = arg_opts.config_path[0] ? arg_opts.config_path : NULL; if (settings_load(user_settings, p) == -1) { - queue_init_message("Failed to load user settings"); + queue_init_message("Failed to load user settings"); } int curl_init = curl_global_init(CURL_GLOBAL_ALL); @@ -1139,8 +1147,10 @@ int main(int argc, char **argv) } #ifdef X11 + if (init_xtra(DnD_callback) == -1) queue_init_message("X failed to initialize"); + #endif Tox *m = load_toxic(DATA_FILE); @@ -1182,6 +1192,7 @@ int main(int argc, char **argv) set_primary_device(output, user_settings->audio_out_dev); #elif SOUND_NOTIFY + if ( init_devices() == de_InternalError ) queue_init_message("Failed to init audio devices"); @@ -1219,8 +1230,10 @@ int main(int argc, char **argv) if (timed_out(last_save, AUTOSAVE_FREQ)) { pthread_mutex_lock(&Winthread.lock); + if (store_data(m, DATA_FILE) != 0) line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, RED, "WARNING: Failed to save to data file"); + pthread_mutex_unlock(&Winthread.lock); last_save = cur_time; diff --git a/src/toxic.h b/src/toxic.h index affa748..ba093b3 100644 --- a/src/toxic.h +++ b/src/toxic.h @@ -107,7 +107,8 @@ int store_data(Tox *m, const char *path); /* callbacks */ void on_request(Tox *m, const uint8_t *public_key, const uint8_t *data, size_t length, void *userdata); void on_connectionchange(Tox *m, uint32_t friendnumber, TOX_CONNECTION status, void *userdata); -void on_message(Tox *m, uint32_t friendnumber, TOX_MESSAGE_TYPE type, const uint8_t *string, size_t length, void *userdata); +void on_message(Tox *m, uint32_t friendnumber, TOX_MESSAGE_TYPE type, const uint8_t *string, size_t length, + void *userdata); void on_action(Tox *m, uint32_t friendnumber, const uint8_t *string, size_t length, void *userdata); void on_nickchange(Tox *m, uint32_t friendnumber, const uint8_t *string, size_t length, void *userdata); void on_statuschange(Tox *m, uint32_t friendnumber, TOX_USER_STATUS status, void *userdata); @@ -115,10 +116,13 @@ void on_statusmessagechange(Tox *m, uint32_t friendnumber, const uint8_t *string void on_friendadded(Tox *m, uint32_t friendnumber, bool sort); void on_groupmessage(Tox *m, int groupnumber, int peernumber, const uint8_t *message, uint16_t length, void *userdata); void on_groupaction(Tox *m, int groupnumber, int peernumber, const uint8_t *action, uint16_t length, void *userdata); -void on_groupinvite(Tox *m, int32_t friendnumber, uint8_t type, const uint8_t *group_pub_key, uint16_t length, void *userdata); +void on_groupinvite(Tox *m, int32_t friendnumber, uint8_t type, const uint8_t *group_pub_key, uint16_t length, + void *userdata); void on_group_namelistchange(Tox *m, int groupnumber, int peernumber, uint8_t change, void *userdata); -void on_group_titlechange(Tox *m, int groupnumber, int peernumber, const uint8_t *title, uint8_t length, void *userdata); -void on_file_chunk_request(Tox *m, uint32_t friendnumber, uint32_t filenumber, uint64_t position, size_t length, void *userdata); +void on_group_titlechange(Tox *m, int groupnumber, int peernumber, const uint8_t *title, uint8_t length, + void *userdata); +void on_file_chunk_request(Tox *m, uint32_t friendnumber, uint32_t filenumber, uint64_t position, size_t length, + void *userdata); void on_file_recv_chunk(Tox *m, uint32_t friendnumber, uint32_t filenumber, uint64_t position, const uint8_t *data, size_t length, void *userdata); void on_file_control (Tox *m, uint32_t friendnumber, uint32_t filenumber, TOX_FILE_CONTROL control, void *userdata); diff --git a/src/toxic_strings.c b/src/toxic_strings.c index e17c5bb..cd93ecd 100644 --- a/src/toxic_strings.c +++ b/src/toxic_strings.c @@ -136,13 +136,13 @@ int del_word_buf(ChatContext *ctx) int i = ctx->pos, count = 0; /* traverse past empty space */ - while (i > 0 && ctx->line[i-1] == L' ') { + while (i > 0 && ctx->line[i - 1] == L' ') { ++count; --i; } /* traverse past last entered word */ - while (i > 0 && ctx->line[i-1] != L' ') { + while (i > 0 && ctx->line[i - 1] != L' ') { ++count; --i; } @@ -243,18 +243,20 @@ void fetch_hist_item(ChatContext *ctx, int key_dir) ctx->len = h_len; } -void strsubst(char* str, char old, char new) +void strsubst(char *str, char old, char new) { int i; + for (i = 0; str[i] != '\0'; ++i) if (str[i] == old) - str[i] = new; + str[i] = new; } -void wstrsubst(wchar_t* str, wchar_t old, wchar_t new) +void wstrsubst(wchar_t *str, wchar_t old, wchar_t new) { int i; + for (i = 0; str[i] != L'\0'; ++i) if (str[i] == old) - str[i] = new; + str[i] = new; } diff --git a/src/toxic_strings.h b/src/toxic_strings.h index c9e402c..11e7c1b 100644 --- a/src/toxic_strings.h +++ b/src/toxic_strings.h @@ -49,7 +49,7 @@ void reset_buf(ChatContext *ctx); Return 0 on success, -1 if yank buffer is empty or too long */ int yank_buf(ChatContext *ctx); -/* Deletes all characters from line starting at pos and going backwards +/* Deletes all characters from line starting at pos and going backwards until we find a space or run out of characters. Return 0 on success, -1 if no line or already at the beginning */ int del_word_buf(ChatContext *ctx); diff --git a/src/video_call.c b/src/video_call.c index 7a3282b..c04f943 100644 --- a/src/video_call.c +++ b/src/video_call.c @@ -40,13 +40,13 @@ #define default_video_bit_rate 5000 void receive_video_frame_cb( ToxAV *av, uint32_t friend_number, - uint16_t width, uint16_t height, - uint8_t const *y, uint8_t const *u, uint8_t const *v, - int32_t ystride, int32_t ustride, int32_t vstride, - void *user_data ); + uint16_t width, uint16_t height, + uint8_t const *y, uint8_t const *u, uint8_t const *v, + int32_t ystride, int32_t ustride, int32_t vstride, + void *user_data ); void video_bit_rate_status_cb( ToxAV *av, uint32_t friend_number, uint32_t audio_bit_rate, - uint32_t video_bit_rate, void *user_data); + uint32_t video_bit_rate, void *user_data); static void print_err (ToxWindow *self, const char *error_str) { @@ -82,22 +82,24 @@ ToxAV *init_video(ToxWindow *self, Tox *tox) void terminate_video() { int i; + for (i = 0; i < MAX_CALLS; ++i) { - Call* this_call = &CallControl.calls[i]; + Call *this_call = &CallControl.calls[i]; stop_video_transmission(this_call, i); - if( this_call->vout_idx != -1 ) + if ( this_call->vout_idx != -1 ) close_video_device(vdt_output, this_call->vout_idx); } terminate_video_devices(); } -void read_video_device_callback(int16_t width, int16_t height, const uint8_t* y, const uint8_t* u, const uint8_t* v, void* data) +void read_video_device_callback(int16_t width, int16_t height, const uint8_t *y, const uint8_t *u, const uint8_t *v, + void *data) { - uint32_t friend_number = *((uint32_t*)data); /* TODO: Or pass an array of call_idx's */ - Call* this_call = &CallControl.calls[friend_number]; + uint32_t friend_number = *((uint32_t *)data); /* TODO: Or pass an array of call_idx's */ + Call *this_call = &CallControl.calls[friend_number]; TOXAV_ERR_SEND_FRAME error; /* Drop frame if video sending is disabled */ @@ -117,9 +119,9 @@ void read_video_device_callback(int16_t width, int16_t height, const uint8_t* y, } void write_video_device_callback(uint32_t friend_number, uint16_t width, uint16_t height, - uint8_t const *y, uint8_t const *u, uint8_t const *v, - int32_t ystride, int32_t ustride, int32_t vstride, - void *user_data) + uint8_t const *y, uint8_t const *u, uint8_t const *v, + int32_t ystride, int32_t ustride, int32_t vstride, + void *user_data) { write_video_out(width, height, y, u, v, ystride, ustride, vstride, user_data); } @@ -175,16 +177,16 @@ int stop_video_transmission(Call *call, int friend_number) * Callbacks */ void receive_video_frame_cb(ToxAV *av, uint32_t friend_number, - uint16_t width, uint16_t height, - uint8_t const *y, uint8_t const *u, uint8_t const *v, - int32_t ystride, int32_t ustride, int32_t vstride, - void *user_data) + uint16_t width, uint16_t height, + uint8_t const *y, uint8_t const *u, uint8_t const *v, + int32_t ystride, int32_t ustride, int32_t vstride, + void *user_data) { write_video_device_callback(friend_number, width, height, y, u, v, ystride, ustride, vstride, user_data); } void video_bit_rate_status_cb(ToxAV *av, uint32_t friend_number, uint32_t audio_bit_rate, - uint32_t video_bit_rate, void *user_data) + uint32_t video_bit_rate, void *user_data) { CallControl.video_bit_rate = video_bit_rate; toxav_bit_rate_set(CallControl.av, friend_number, -1, CallControl.video_bit_rate, NULL); @@ -192,7 +194,7 @@ void video_bit_rate_status_cb(ToxAV *av, uint32_t friend_number, uint32_t audio_ void callback_recv_video_starting(uint32_t friend_number) { - Call* this_call = &CallControl.calls[friend_number]; + Call *this_call = &CallControl.calls[friend_number]; if ( this_call->vout_idx != -1 ) return; @@ -201,21 +203,22 @@ void callback_recv_video_starting(uint32_t friend_number) } void callback_recv_video_end(uint32_t friend_number) { - Call* this_call = &CallControl.calls[friend_number]; + Call *this_call = &CallControl.calls[friend_number]; close_video_device(vdt_output, this_call->vout_idx); this_call->vout_idx = -1; } void callback_video_starting(uint32_t friend_number) { - ToxWindow* windows = CallControl.prompt; - Call* this_call = &CallControl.calls[friend_number]; + ToxWindow *windows = CallControl.prompt; + Call *this_call = &CallControl.calls[friend_number]; TOXAV_ERR_CALL_CONTROL error = TOXAV_ERR_CALL_CONTROL_OK; toxav_call_control(CallControl.av, friend_number, TOXAV_CALL_CONTROL_SHOW_VIDEO, &error); if (error == TOXAV_ERR_CALL_CONTROL_OK) { size_t i; + for (i = 0; i < MAX_WINDOWS_NUM; ++i) { if ( windows[i].is_call && windows[i].num == friend_number ) { if ( 0 != start_video_transmission(&windows[i], CallControl.av, this_call) ) { @@ -244,7 +247,7 @@ void callback_video_end(uint32_t friend_number) void cmd_video(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { const char *error_str; - Call* this_call = &CallControl.calls[self->num]; + Call *this_call = &CallControl.calls[self->num]; if ( argc != 0 ) { error_str = "Unknown arguments."; @@ -387,18 +390,18 @@ void cmd_ccur_video_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, ch } if ( video_selection_valid(type, selection) == vde_InvalidSelection ) { - error_str="Invalid selection!"; + error_str = "Invalid selection!"; goto on_error; } /* If call is active, change device */ if ( self->is_call ) { - Call* this_call = &CallControl.calls[self->num]; + Call *this_call = &CallControl.calls[self->num]; + if ( this_call->ttas ) { if ( type == vdt_output ) { - } - else { + } else { /* TODO: check for failure */ close_video_device(vdt_input, this_call->vin_idx); open_video_device(vdt_input, selection, &this_call->vin_idx); @@ -410,7 +413,7 @@ void cmd_ccur_video_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, ch self->video_device_selection[type] = selection; return; - on_error: +on_error: print_err (self, error_str); } diff --git a/src/video_device.c b/src/video_device.c index 7f2227e..4a47853 100644 --- a/src/video_device.c +++ b/src/video_device.c @@ -62,7 +62,7 @@ struct VideoBuffer { typedef struct VideoDevice { VideoDataHandleCallback cb; /* Use this to handle data from input device usually */ - void* cb_data; /* Data to be passed to callback */ + void *cb_data; /* Data to be passed to callback */ int32_t friend_number; /* ToxAV friend number */ #if defined(__linux__) || defined(__FreeBSD__) @@ -93,7 +93,7 @@ VideoDevice *video_devices_running[2][MAX_DEVICES] = {{NULL}}; /* Running de uint32_t primary_video_device[2]; /* Primary device */ #ifdef VIDEO -static ToxAV* av = NULL; +static ToxAV *av = NULL; #endif /* VIDEO */ /* q_mutex */ @@ -102,15 +102,16 @@ static ToxAV* av = NULL; pthread_mutex_t video_mutex; bool video_thread_running = true, - video_thread_paused = true; /* Thread control */ + video_thread_paused = true; /* Thread control */ -void* video_thread_poll(void*); +void *video_thread_poll(void *); static void yuv420tobgr(uint16_t width, uint16_t height, const uint8_t *y, - const uint8_t *u, const uint8_t *v, unsigned int ystride, - unsigned int ustride, unsigned int vstride, uint8_t *out) + const uint8_t *u, const uint8_t *v, unsigned int ystride, + unsigned int ustride, unsigned int vstride, uint8_t *out) { unsigned long int i, j; + for (i = 0; i < height; ++i) { for (j = 0; j < width; ++j) { uint8_t *point = out + 4 * ((i * width) + j); @@ -123,9 +124,9 @@ static void yuv420tobgr(uint16_t width, uint16_t height, const uint8_t *y, int g = (298 * (t_y - 16) - 100 * (t_u - 128) - 208 * (t_v - 128) + 128) >> 8; int b = (298 * (t_y - 16) + 516 * (t_u - 128) + 128) >> 8; - point[2] = r>255? 255 : r<0 ? 0 : r; - point[1] = g>255? 255 : g<0 ? 0 : g; - point[0] = b>255? 255 : b<0 ? 0 : b; + point[2] = r > 255 ? 255 : r < 0 ? 0 : r; + point[1] = g > 255 ? 255 : g < 0 ? 0 : g; + point[0] = b > 255 ? 255 : b < 0 ? 0 : b; point[3] = ~0; } } @@ -133,11 +134,13 @@ static void yuv420tobgr(uint16_t width, uint16_t height, const uint8_t *y, #if defined(__linux__) || defined(__FreeBSD__) static void yuv422to420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, - uint8_t *input, uint16_t width, uint16_t height) + uint8_t *input, uint16_t width, uint16_t height) { uint8_t *end = input + width * height * 2; + while (input != end) { uint8_t *line_end = input + width * 2; + while (input != line_end) { *plane_y++ = *input++; *plane_u++ = *input++; @@ -146,6 +149,7 @@ static void yuv422to420(uint8_t *plane_y, uint8_t *plane_u, uint8_t *plane_v, } line_end = input + width * 2; + while (input != line_end) { *plane_y++ = *input++; input++;//u @@ -170,7 +174,7 @@ static int xioctl(int fh, unsigned long request, void *arg) /* Meet devices */ #ifdef VIDEO -VideoDeviceError init_video_devices(ToxAV* av_) +VideoDeviceError init_video_devices(ToxAV *av_) #else VideoDeviceError init_video_devices() #endif /* VIDEO */ @@ -178,31 +182,34 @@ VideoDeviceError init_video_devices() size[vdt_input] = 0; #if defined(__linux__) || defined(__FreeBSD__) + for (; size[vdt_input] <= MAX_DEVICES; ++size[vdt_input]) { int fd; char device_address[] = "/dev/videoXX"; snprintf(device_address + 10, sizeof(char) * strlen(device_address) - 10, "%i", size[vdt_input]); fd = open(device_address, O_RDWR | O_NONBLOCK, 0); + if ( fd == -1 ) { break; } else { struct v4l2_capability cap; - char* video_input_name; + char *video_input_name; /* Query V4L for capture capabilities */ if ( -1 != ioctl(fd, VIDIOC_QUERYCAP, &cap) ) { - video_input_name = (char*)malloc(strlen((const char*)cap.card) + strlen(device_address) + 4); - strcpy(video_input_name, (char*)cap.card); + video_input_name = (char *)malloc(strlen((const char *)cap.card) + strlen(device_address) + 4); + strcpy(video_input_name, (char *)cap.card); strcat(video_input_name, " ("); - strcat(video_input_name, (char*)device_address); + strcat(video_input_name, (char *)device_address); strcat(video_input_name, ")"); } else { - video_input_name = (char*)malloc(strlen(device_address) + 3); + video_input_name = (char *)malloc(strlen(device_address) + 3); strcpy(video_input_name, "("); strcat(video_input_name, device_address); strcat(video_input_name, ")"); } + video_devices_names[vdt_input][size[vdt_input]] = video_input_name; close(fd); @@ -210,12 +217,14 @@ VideoDeviceError init_video_devices() } #else /* __OSX__ */ - if( osx_video_init((char**)video_devices_names[vdt_input], &size[vdt_input]) != 0 ) + + if ( osx_video_init((char **)video_devices_names[vdt_input], &size[vdt_input]) != 0 ) return vde_InternalError; + #endif size[vdt_output] = 1; - char* video_output_name = "Toxic Video Receiver"; + char *video_output_name = "Toxic Video Receiver"; video_devices_names[vdt_output][0] = video_output_name; // Start poll thread @@ -223,6 +232,7 @@ VideoDeviceError init_video_devices() return vde_InternalError; pthread_t thread_id; + if ( pthread_create(&thread_id, NULL, video_thread_poll, NULL) != 0 || pthread_detach(thread_id) != 0 ) return vde_InternalError; @@ -243,8 +253,9 @@ VideoDeviceError terminate_video_devices() usleep(20000); int i; + for (i = 0; i < size[vdt_input]; ++i) { - free((void*)video_devices_names[vdt_input][i]); + free((void *)video_devices_names[vdt_input][i]); } if ( pthread_mutex_destroy(&video_mutex) != 0 ) @@ -258,14 +269,19 @@ VideoDeviceError terminate_video_devices() } VideoDeviceError register_video_device_callback(int32_t friend_number, uint32_t device_idx, - VideoDataHandleCallback callback, void* data) + VideoDataHandleCallback callback, void *data) { #if defined(__linux__) || defined(__FreeBSD__) - if ( size[vdt_input] <= device_idx || !video_devices_running[vdt_input][device_idx] || !video_devices_running[vdt_input][device_idx]->fd ) + + if ( size[vdt_input] <= device_idx || !video_devices_running[vdt_input][device_idx] + || !video_devices_running[vdt_input][device_idx]->fd ) return vde_InvalidSelection; + #else /* __OSX__ */ + if ( size[vdt_input] <= device_idx || !video_devices_running[vdt_input][device_idx] ) return vde_InvalidSelection; + #endif lock; @@ -286,7 +302,7 @@ VideoDeviceError set_primary_video_device(VideoDeviceType type, int32_t selectio return vde_None; } -VideoDeviceError open_primary_video_device(VideoDeviceType type, uint32_t* device_idx) +VideoDeviceError open_primary_video_device(VideoDeviceType type, uint32_t *device_idx) { return open_video_device(type, primary_video_device[type], device_idx); } @@ -296,7 +312,7 @@ void get_primary_video_device_name(VideoDeviceType type, char *buf, int size) memcpy(buf, dvideo_device_names[type], size); } -VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint32_t* device_idx) +VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint32_t *device_idx) { if ( size[type] <= selection || selection < 0 ) return vde_InvalidSelection; @@ -327,7 +343,7 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint } } - VideoDevice* device = video_devices_running[type][temp_idx] = calloc(1, sizeof(VideoDevice)); + VideoDevice *device = video_devices_running[type][temp_idx] = calloc(1, sizeof(VideoDevice)); device->selection = selection; if ( pthread_mutex_init(device->mutex, NULL) != 0 ) { @@ -345,6 +361,7 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint snprintf(device_address + 10 , sizeof(device_address) - 10, "%i", selection); device->fd = open(device_address, O_RDWR); + if ( device->fd == -1 ) { unlock; return vde_FailedStart; @@ -352,6 +369,7 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint /* Obtain video device capabilities */ struct v4l2_capability cap; + if ( -1 == xioctl(device->fd, VIDIOC_QUERYCAP, &cap) ) { close(device->fd); free(device); @@ -365,7 +383,8 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; - if( -1 == xioctl(device->fd, VIDIOC_S_FMT, &fmt) ) { + + if ( -1 == xioctl(device->fd, VIDIOC_S_FMT, &fmt) ) { close(device->fd); free(device); unlock; @@ -381,6 +400,7 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint req.count = 4; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; + if ( -1 == xioctl(device->fd, VIDIOC_REQBUFS, &req) ) { close(device->fd); free(device); @@ -414,20 +434,22 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint device->buffers[i].length = buf.length; device->buffers[i].start = mmap(NULL /* start anywhere */, - buf.length, - PROT_READ | PROT_WRITE /* required */, - MAP_SHARED /* recommended */, - device->fd, buf.m.offset); + buf.length, + PROT_READ | PROT_WRITE /* required */, + MAP_SHARED /* recommended */, + device->fd, buf.m.offset); if ( MAP_FAILED == device->buffers[i].start ) { for (i = 0; i < buf.index; ++i) munmap(device->buffers[i].start, device->buffers[i].length); + close(device->fd); free(device); unlock; return vde_FailedStart; } } + device->n_buffers = i; enum v4l2_buf_type type; @@ -443,6 +465,7 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint if ( -1 == xioctl(device->fd, VIDIOC_QBUF, &buf) ) { for (i = 0; i < device->n_buffers; ++i) munmap(device->buffers[i].start, device->buffers[i].length); + close(device->fd); free(device); unlock; @@ -460,11 +483,13 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint } #else /* __OSX__ */ + if ( osx_video_open_device(selection, &device->video_width, &device->video_height) != 0 ) { free(device); unlock; return vde_FailedStart; } + #endif /* Create X11 window associated to device */ @@ -477,15 +502,15 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint int screen = DefaultScreen(device->x_display); if ( !(device->x_window = XCreateSimpleWindow(device->x_display, RootWindow(device->x_display, screen), 0, 0, - device->video_width, device->video_height, 0, BlackPixel(device->x_display, screen), - BlackPixel(device->x_display, screen))) ) { + device->video_width, device->video_height, 0, BlackPixel(device->x_display, screen), + BlackPixel(device->x_display, screen))) ) { close_video_device(vdt_input, temp_idx); unlock; return vde_FailedStart; } XStoreName(device->x_display, device->x_window, "Video Preview"); - XSelectInput(device->x_display, device->x_window, ExposureMask|ButtonPressMask|KeyPressMask); + XSelectInput(device->x_display, device->x_window, ExposureMask | ButtonPressMask | KeyPressMask); if ( (device->x_gc = DefaultGC(device->x_display, screen)) == NULL ) { close_video_device(vdt_input, temp_idx); @@ -517,14 +542,14 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint int screen = DefaultScreen(device->x_display); if ( !(device->x_window = XCreateSimpleWindow(device->x_display, RootWindow(device->x_display, screen), 0, 0, - 100, 100, 0, BlackPixel(device->x_display, screen), BlackPixel(device->x_display, screen))) ) { + 100, 100, 0, BlackPixel(device->x_display, screen), BlackPixel(device->x_display, screen))) ) { close_video_device(vdt_output, temp_idx); unlock; return vde_FailedStart; } XStoreName(device->x_display, device->x_window, "Video Receive"); - XSelectInput(device->x_display, device->x_window, ExposureMask|ButtonPressMask|KeyPressMask); + XSelectInput(device->x_display, device->x_window, ExposureMask | ButtonPressMask | KeyPressMask); if ( (device->x_gc = DefaultGC(device->x_display, screen)) == NULL ) { close_video_device(vdt_output, temp_idx); @@ -551,15 +576,15 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint } __inline VideoDeviceError write_video_out(uint16_t width, uint16_t height, - uint8_t const *y, uint8_t const *u, uint8_t const *v, - int32_t ystride, int32_t ustride, int32_t vstride, - void *user_data) + uint8_t const *y, uint8_t const *u, uint8_t const *v, + int32_t ystride, int32_t ustride, int32_t vstride, + void *user_data) { - VideoDevice* device = video_devices_running[vdt_output][0]; + VideoDevice *device = video_devices_running[vdt_output][0]; if ( !device ) return vde_DeviceNotActive; - if( !device->x_window ) return vde_DeviceNotActive; + if ( !device->x_window ) return vde_DeviceNotActive; pthread_mutex_lock(device->mutex); @@ -594,7 +619,7 @@ __inline VideoDeviceError write_video_out(uint16_t width, uint16_t height, .red_mask = 0xFF0000, .green_mask = 0xFF00, .blue_mask = 0xFF, - .data = (char*)img_data + .data = (char *)img_data }; /* Render image data */ @@ -609,7 +634,7 @@ __inline VideoDeviceError write_video_out(uint16_t width, uint16_t height, return vde_None; } -void* video_thread_poll (void* arg) // TODO: maybe use thread for every input source +void *video_thread_poll (void *arg) // TODO: maybe use thread for every input source { /* * NOTE: We only need to poll input devices for data. @@ -619,19 +644,22 @@ void* video_thread_poll (void* arg) // TODO: maybe use thread for every input so while (1) { lock; + if (!video_thread_running) { unlock; break; } + unlock; if ( video_thread_paused ) usleep(10000); /* Wait for unpause. */ else { for (i = 0; i < size[vdt_input]; ++i) { lock; + if ( video_devices_running[vdt_input][i] != NULL ) { /* Obtain frame image data from device buffers */ - VideoDevice* device = video_devices_running[vdt_input][i]; + VideoDevice *device = video_devices_running[vdt_input][i]; uint16_t video_width = device->video_width; uint16_t video_height = device->video_height; uint8_t *y = device->input.planes[0]; @@ -650,16 +678,18 @@ void* video_thread_poll (void* arg) // TODO: maybe use thread for every input so continue; } - void *data = (void*)device->buffers[buf.index].start; + void *data = (void *)device->buffers[buf.index].start; /* Convert frame image data to YUV420 for ToxAV */ yuv422to420(y, u, v, data, video_width, video_height); #else /* __OSX__*/ + if ( osx_video_read_device(y, u, v, &video_width, &video_height) != 0 ) { unlock; continue; } + #endif /* Send frame data to friend through ToxAV */ @@ -669,7 +699,7 @@ void* video_thread_poll (void* arg) // TODO: maybe use thread for every input so /* Convert YUV420 data to BGR */ uint8_t *img_data = malloc(video_width * video_height * 4); yuv420tobgr(video_width, video_height, y, u, v, - video_width, video_width/2, video_width/2, img_data); + video_width, video_width / 2, video_width / 2, img_data); /* Allocate image data in X11 */ XImage image = { @@ -685,7 +715,7 @@ void* video_thread_poll (void* arg) // TODO: maybe use thread for every input so .red_mask = 0xFF0000, .green_mask = 0xFF00, .blue_mask = 0xFF, - .data = (char*)img_data + .data = (char *)img_data }; /* Render image data */ @@ -697,15 +727,19 @@ void* video_thread_poll (void* arg) // TODO: maybe use thread for every input so free(img_data); #if defined(__linux__) || defined(__FreeBSD__) + if ( -1 == xioctl(device->fd, VIDIOC_QBUF, &buf) ) { unlock; continue; } + #endif /* __linux__ */ } + unlock; } + usleep(1000 * 1000 / 24); } } @@ -733,13 +767,16 @@ VideoDeviceError close_video_device(VideoDeviceType type, uint32_t device_idx) if ( type == vdt_input ) { #if defined(__linux__) || defined(__FreeBSD__) enum v4l2_buf_type buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - if( -1 == xioctl(device->fd, VIDIOC_STREAMOFF, &buf_type) ) {} + + if ( -1 == xioctl(device->fd, VIDIOC_STREAMOFF, &buf_type) ) {} int i; + for (i = 0; i < device->n_buffers; ++i) { if ( -1 == munmap(device->buffers[i].start, device->buffers[i].length) ) { } } + close(device->fd); #else /* __OSX__ */ @@ -765,14 +802,13 @@ VideoDeviceError close_video_device(VideoDeviceType type, uint32_t device_idx) free(device); } - } - else device->ref_count--; + } else device->ref_count--; unlock; return rc; } -void print_video_devices(ToxWindow* self, VideoDeviceType type) +void print_video_devices(ToxWindow *self, VideoDeviceType type) { int i; diff --git a/src/video_device.h b/src/video_device.h index c32cffc..ed84e53 100644 --- a/src/video_device.h +++ b/src/video_device.h @@ -45,10 +45,11 @@ typedef enum VideoDeviceError { vde_CaptureError = -9, } VideoDeviceError; -typedef void (*VideoDataHandleCallback) (int16_t width, int16_t height, const uint8_t* y, const uint8_t* u, const uint8_t* v, void* data); +typedef void (*VideoDataHandleCallback) (int16_t width, int16_t height, const uint8_t *y, const uint8_t *u, + const uint8_t *v, void *data); #ifdef VIDEO -VideoDeviceError init_video_devices(ToxAV* av); +VideoDeviceError init_video_devices(ToxAV *av); #else VideoDeviceError init_video_devices(); #endif /* VIDEO */ @@ -56,20 +57,22 @@ VideoDeviceError init_video_devices(); VideoDeviceError terminate_video_devices(); /* Callback handles ready data from INPUT device */ -VideoDeviceError register_video_device_callback(int32_t call_idx, uint32_t device_idx, VideoDataHandleCallback callback, void* data); -void* get_video_device_callback_data(uint32_t device_idx); +VideoDeviceError register_video_device_callback(int32_t call_idx, uint32_t device_idx, VideoDataHandleCallback callback, + void *data); +void *get_video_device_callback_data(uint32_t device_idx); VideoDeviceError set_primary_video_device(VideoDeviceType type, int32_t selection); -VideoDeviceError open_primary_video_device(VideoDeviceType type, uint32_t* device_idx); +VideoDeviceError open_primary_video_device(VideoDeviceType type, uint32_t *device_idx); /* Start device */ -VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint32_t* device_idx); +VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint32_t *device_idx); /* Stop device */ VideoDeviceError close_video_device(VideoDeviceType type, uint32_t device_idx); /* Write data to device */ -VideoDeviceError write_video_out(uint16_t width, uint16_t height, uint8_t const *y, uint8_t const *u, uint8_t const *v, int32_t ystride, int32_t ustride, int32_t vstride, void *user_data); +VideoDeviceError write_video_out(uint16_t width, uint16_t height, uint8_t const *y, uint8_t const *u, uint8_t const *v, + int32_t ystride, int32_t ustride, int32_t vstride, void *user_data); -void print_video_devices(ToxWindow* self, VideoDeviceType type); +void print_video_devices(ToxWindow *self, VideoDeviceType type); void get_primary_video_device_name(VideoDeviceType type, char *buf, int size); VideoDeviceError video_selection_valid(VideoDeviceType type, int32_t selection); diff --git a/src/windows.c b/src/windows.c index 5414b4b..5b233be 100644 --- a/src/windows.c +++ b/src/windows.c @@ -445,10 +445,12 @@ void on_window_resize(void) } #ifdef AUDIO + if (w->chatwin->infobox.active) { delwin(w->chatwin->infobox.win); w->chatwin->infobox.win = newwin(INFOBOX_HEIGHT, INFOBOX_WIDTH + 1, 1, x2 - INFOBOX_WIDTH); } + #endif /* AUDIO */ scrollok(w->chatwin->history, 0); @@ -458,20 +460,24 @@ void on_window_resize(void) static void draw_window_tab(ToxWindow *toxwin) { pthread_mutex_lock(&Winthread.lock); + if (toxwin->alert != WINDOW_ALERT_NONE) attron(COLOR_PAIR(toxwin->alert)); + pthread_mutex_unlock(&Winthread.lock); clrtoeol(); printw(" [%s]", toxwin->name); pthread_mutex_lock(&Winthread.lock); + if (toxwin->alert != WINDOW_ALERT_NONE) attroff(COLOR_PAIR(toxwin->alert)); + pthread_mutex_unlock(&Winthread.lock); } static void draw_bar(void) { - int y,x; + int y, x; // save current cursor position getyx(active_window->window, y, x); diff --git a/src/xtra.c b/src/xtra.c index 1ff34bd..77c625d 100644 --- a/src/xtra.c +++ b/src/xtra.c @@ -57,8 +57,7 @@ struct _Xtra { Atom expecting_type; } Xtra; -typedef struct _Property -{ +typedef struct _Property { unsigned char *data; int read_format; unsigned long read_num; @@ -97,21 +96,23 @@ Property read_property(Window s, Atom p) Atom get_dnd_type(long *a, int l) { int i = 0; + for (; i < l; i ++) { if (a[i] != XtraNil) return a[i]; /* Get first valid */ } + return XtraNil; } /* TODO maybe support only certain types in the future */ -static void handle_xdnd_enter(XClientMessageEvent* e) +static void handle_xdnd_enter(XClientMessageEvent *e) { Xtra.handling_version = (e->data.l[1] >> 24); if ((e->data.l[1] & 1)) { // Fetch the list of possible conversions Property p = read_property(e->data.l[0], XdndTypeList); - Xtra.expecting_type = get_dnd_type((long*)p.data, p.read_num); + Xtra.expecting_type = get_dnd_type((long *)p.data, p.read_num); XFree(p.data); } else { // Use the available list @@ -119,7 +120,7 @@ static void handle_xdnd_enter(XClientMessageEvent* e) } } -static void handle_xdnd_position(XClientMessageEvent* e) +static void handle_xdnd_position(XClientMessageEvent *e) { XEvent ev = { .xclient = { @@ -143,7 +144,7 @@ static void handle_xdnd_position(XClientMessageEvent* e) XFlush(Xtra.display); } -static void handle_xdnd_drop(XClientMessageEvent* e) +static void handle_xdnd_drop(XClientMessageEvent *e) { /* Not expecting any type */ if (Xtra.expecting_type == XtraNil) { @@ -172,7 +173,7 @@ static void handle_xdnd_drop(XClientMessageEvent* e) } } -static void handle_xdnd_selection(XSelectionEvent* e) +static void handle_xdnd_selection(XSelectionEvent *e) { /* DnD succesfully finished, send finished and call callback */ XEvent ev = { @@ -199,12 +200,12 @@ static void handle_xdnd_selection(XSelectionEvent* e) /* Call callback for every entry */ - if (Xtra.on_drop && p.read_num) - { + if (Xtra.on_drop && p.read_num) { char *sptr; char *str = strtok_r((char *) p.data, "\n\r", &sptr); if (str) Xtra.on_drop(str, dt); + while ((str = strtok_r(NULL, "\n\r", &sptr))) Xtra.on_drop(str, dt); } @@ -212,7 +213,7 @@ static void handle_xdnd_selection(XSelectionEvent* e) if (p.data) XFree(p.data); } -void *event_loop(void* p) +void *event_loop(void *p) { /* Handle events like a real nigga */ @@ -221,30 +222,27 @@ void *event_loop(void* p) XEvent event; int pending; - while (Xtra.display) - { + while (Xtra.display) { /* NEEDMOEVENTSFODEMPROGRAMS */ XLockDisplay(Xtra.display); - if((pending = XPending(Xtra.display))) XNextEvent(Xtra.display, &event); - if (!pending) - { + if ((pending = XPending(Xtra.display))) XNextEvent(Xtra.display, &event); + + if (!pending) { XUnlockDisplay(Xtra.display); usleep(10000); continue; } - if (event.type == ClientMessage) - { + if (event.type == ClientMessage) { Atom type = event.xclient.message_type; if (type == XdndEnter) handle_xdnd_enter(&event.xclient); else if (type == XdndPosition) handle_xdnd_position(&event.xclient); else if (type == XdndDrop) handle_xdnd_drop(&event.xclient); else if (type == XtraTerminate) break; - } - else if (event.type == SelectionNotify) handle_xdnd_selection(&event.xselection); + } else if (event.type == SelectionNotify) handle_xdnd_selection(&event.xselection); /* AINNOBODYCANHANDLEDEMEVENTS*/ else XSendEvent(Xtra.display, Xtra.terminal_window, 0, 0, &event); @@ -256,6 +254,7 @@ void *event_loop(void* p) * otherwise HEWUSAGUDBOI happens */ if (Xtra.display) XCloseDisplay(Xtra.display); + return (Xtra.display = NULL); } @@ -267,6 +266,7 @@ int init_xtra(drop_callback d) else Xtra.on_drop = d; XInitThreads(); + if ( !(Xtra.display = XOpenDisplay(NULL))) return -1; Xtra.terminal_window = focused_window_id(); @@ -274,7 +274,7 @@ int init_xtra(drop_callback d) /* OSX: if focused window is 0, it means toxic is ran from * native terminal and not X11 terminal window, silently exit */ if (!Xtra.terminal_window) - return 0; + return 0; { /* Create an invisible window which will act as proxy for the DnD operation. */ @@ -300,15 +300,15 @@ int init_xtra(drop_callback d) &root, &x, &y, &wht, &hht, &b, &d); if (! (Xtra.proxy_window = XCreateWindow - (Xtra.display, Xtra.terminal_window, /* Parent */ - 0, 0, /* Position */ - wht, hht, /* Width + height */ - 0, /* Border width */ - CopyFromParent, /* Depth */ - InputOnly, /* Class */ - CopyFromParent, /* Visual */ - CWEventMask | CWCursor, /* Value mask */ - &attr)) ) /* Attributes for value mask */ + (Xtra.display, Xtra.terminal_window, /* Parent */ + 0, 0, /* Position */ + wht, hht, /* Width + height */ + 0, /* Border width */ + CopyFromParent, /* Depth */ + InputOnly, /* Class */ + CopyFromParent, /* Visual */ + CWEventMask | CWCursor, /* Value mask */ + &attr)) ) /* Attributes for value mask */ return -1; } @@ -335,9 +335,10 @@ int init_xtra(drop_callback d) XA_ATOM, 32, PropModeReplace, - (unsigned char*)&XdndVersion, 1); + (unsigned char *)&XdndVersion, 1); pthread_t id; + if (pthread_create(&id, NULL, event_loop, NULL) != 0) return -1; diff --git a/src/xtra.h b/src/xtra.h index 59038de..ba380f2 100644 --- a/src/xtra.h +++ b/src/xtra.h @@ -28,10 +28,10 @@ typedef enum { DT_plain, DT_file_list -} +} DropType; -typedef void (*drop_callback) (const char*, DropType); +typedef void (*drop_callback) (const char *, DropType); int init_xtra(drop_callback d); void terminate_xtra();