mirror of
				https://github.com/Tha14/toxic.git
				synced 2025-10-31 18:56:51 +01:00 
			
		
		
		
	Update astylerc to match toxcore & reformat all source files
This commit is contained in:
		
							
								
								
									
										23
									
								
								astylerc
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								astylerc
									
									
									
									
									
								
							| @@ -1,11 +1,26 @@ | |||||||
|  | # Bracket Style Options | ||||||
| --style=kr | --style=kr | ||||||
|         --pad-header |  | ||||||
|         --max-code-length=120 | # Tab Options | ||||||
|                           --convert-tabs | --indent=spaces=4 | ||||||
|  |  | ||||||
|  | # Indentation Options | ||||||
| --indent-switches | --indent-switches | ||||||
|  |  | ||||||
|  | # Padding Options | ||||||
|  | --pad-header | ||||||
|  | --break-blocks | ||||||
| --pad-oper | --pad-oper | ||||||
|  | --unpad-paren | ||||||
| --align-pointer=name | --align-pointer=name | ||||||
| --align-reference=name | --align-reference=name | ||||||
|  |  | ||||||
|  | # Formatting Options | ||||||
|  | --add-brackets | ||||||
|  | --convert-tabs | ||||||
|  | --max-code-length=120 | ||||||
|  |  | ||||||
|  | # Other Options | ||||||
| --preserve-date | --preserve-date | ||||||
|  | --formatted | ||||||
| --lineend=linux | --lineend=linux | ||||||
|                                                   --break-blocks |  | ||||||
							
								
								
									
										25
									
								
								src/api.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								src/api.c
									
									
									
									
									
								
							| @@ -46,8 +46,9 @@ extern struct user_settings *user_settings; | |||||||
|  |  | ||||||
| void api_display(const char *const msg) | void api_display(const char *const msg) | ||||||
| { | { | ||||||
|     if (msg == NULL) |     if (msg == NULL) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     self_window = get_active_window(); |     self_window = get_active_window(); | ||||||
|     line_info_add(self_window, NULL, NULL, NULL, SYS_MSG, 0, 0, msg); |     line_info_add(self_window, NULL, NULL, NULL, SYS_MSG, 0, 0, msg); | ||||||
| @@ -63,8 +64,9 @@ char *api_get_nick(void) | |||||||
|     size_t   len  = tox_self_get_name_size(user_tox); |     size_t   len  = tox_self_get_name_size(user_tox); | ||||||
|     uint8_t *name = malloc(len + 1); |     uint8_t *name = malloc(len + 1); | ||||||
|  |  | ||||||
|     if (name == NULL) |     if (name == NULL) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     tox_self_get_name(user_tox, name); |     tox_self_get_name(user_tox, name); | ||||||
|     name[len] = '\0'; |     name[len] = '\0'; | ||||||
| @@ -81,8 +83,9 @@ char *api_get_status_message(void) | |||||||
|     size_t   len    = tox_self_get_status_message_size(user_tox); |     size_t   len    = tox_self_get_status_message_size(user_tox); | ||||||
|     uint8_t *status = malloc(len + 1); |     uint8_t *status = malloc(len + 1); | ||||||
|  |  | ||||||
|     if (status == NULL) |     if (status == NULL) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     tox_self_get_status_message(user_tox, status); |     tox_self_get_status_message(user_tox, status); | ||||||
|     status[len] = '\0'; |     status[len] = '\0'; | ||||||
| @@ -91,14 +94,16 @@ char *api_get_status_message(void) | |||||||
|  |  | ||||||
| void api_send(const char *msg) | void api_send(const char *msg) | ||||||
| { | { | ||||||
|     if (msg == NULL || self_window->chatwin->cqueue == NULL) |     if (msg == NULL || self_window->chatwin->cqueue == NULL) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char *name = api_get_nick(); |     char *name = api_get_nick(); | ||||||
|     char  timefrmt[TIME_STR_SIZE]; |     char  timefrmt[TIME_STR_SIZE]; | ||||||
|  |  | ||||||
|     if (name == NULL) |     if (name == NULL) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     self_window = get_active_window(); |     self_window = get_active_window(); | ||||||
|     get_time_str(timefrmt, sizeof(timefrmt)); |     get_time_str(timefrmt, sizeof(timefrmt)); | ||||||
| @@ -145,8 +150,11 @@ void cmd_run(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX | |||||||
|     self_window = self; |     self_window = self; | ||||||
|  |  | ||||||
|     if (argc != 1) { |     if (argc != 1) { | ||||||
|         if ( argc < 1 ) error_str = "Path must be specified!"; |         if (argc < 1) { | ||||||
|         else error_str = "Only one argument allowed!"; |             error_str = "Path must be specified!"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Only one argument allowed!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, error_str); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, error_str); | ||||||
|         return; |         return; | ||||||
| @@ -173,8 +181,9 @@ void invoke_autoruns(WINDOW *window, ToxWindow *self) | |||||||
|     DIR    *d; |     DIR    *d; | ||||||
|     FILE   *fp; |     FILE   *fp; | ||||||
|  |  | ||||||
|     if (user_settings->autorun_path[0] == '\0') |     if (user_settings->autorun_path[0] == '\0') { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     d = opendir(user_settings->autorun_path); |     d = opendir(user_settings->autorun_path); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										154
									
								
								src/audio_call.c
									
									
									
									
									
								
							
							
						
						
									
										154
									
								
								src/audio_call.c
									
									
									
									
									
								
							| @@ -76,14 +76,16 @@ static int set_call(Call *call, bool start) | |||||||
|     if (start) { |     if (start) { | ||||||
|         call->ttas = true; |         call->ttas = true; | ||||||
|  |  | ||||||
|         if ( pthread_mutex_init(&call->mutex, NULL) != 0 ) |         if (pthread_mutex_init(&call->mutex, NULL) != 0) { | ||||||
|             return -1; |             return -1; | ||||||
|  |         } | ||||||
|     } else { |     } else { | ||||||
|         call->ttid = 0; |         call->ttid = 0; | ||||||
|  |  | ||||||
|         if ( pthread_mutex_destroy(&call->mutex) != 0 ) |         if (pthread_mutex_destroy(&call->mutex) != 0) { | ||||||
|             return -1; |             return -1; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @@ -161,11 +163,13 @@ void terminate_audio() | |||||||
| { | { | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < CallControl.max_calls; ++i) |     for (i = 0; i < CallControl.max_calls; ++i) { | ||||||
|         stop_transmission(&CallControl.calls[i], i); |         stop_transmission(&CallControl.calls[i], i); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if ( CallControl.av ) |     if (CallControl.av) { | ||||||
|         toxav_kill(CallControl.av); |         toxav_kill(CallControl.av); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     terminate_devices(); |     terminate_devices(); | ||||||
| } | } | ||||||
| @@ -187,9 +191,10 @@ void read_device_callback(const int16_t *captured, uint32_t size, void *data) | |||||||
| 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) |                            uint32_t sample_rate) | ||||||
| { | { | ||||||
|     if ( CallControl.calls[friend_number].ttas ) |     if (CallControl.calls[friend_number].ttas) { | ||||||
|         write_out(CallControl.calls[friend_number].out_idx, PCM, sample_count, channels, sample_rate); |         write_out(CallControl.calls[friend_number].out_idx, PCM, sample_count, channels, sample_rate); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| int start_transmission(ToxWindow *self, Call *call) | int start_transmission(ToxWindow *self, Call *call) | ||||||
| { | { | ||||||
| @@ -198,24 +203,29 @@ int start_transmission(ToxWindow *self, Call *call) | |||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (set_call(call, true) == -1) |     if (set_call(call, true) == -1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     DeviceError error = open_primary_device(input, &call->in_idx, |     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_None) { | ||||||
|         if ( error == de_FailedStart) |         if (error == de_FailedStart) { | ||||||
|             line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to start input device"); |             line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to start input device"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if ( error == de_InternalError ) |         if (error == de_InternalError) { | ||||||
|             line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Internal error with opening input device"); |             line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Internal error with opening input device"); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (register_device_callback(self->num, call->in_idx, |     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 */ |         /* 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!"); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to register input handler!"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (open_primary_device(output, &call->out_idx, |     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) { | ||||||
| @@ -231,20 +241,24 @@ int stop_transmission(Call *call, uint32_t friend_number) | |||||||
|     if (call->ttas) { |     if (call->ttas) { | ||||||
|         TOXAV_ERR_CALL_CONTROL error = TOXAV_ERR_CALL_CONTROL_OK; |         TOXAV_ERR_CALL_CONTROL error = TOXAV_ERR_CALL_CONTROL_OK; | ||||||
|  |  | ||||||
|         if ( CallControl.call_state > TOXAV_FRIEND_CALL_STATE_FINISHED ) |         if (CallControl.call_state > TOXAV_FRIEND_CALL_STATE_FINISHED) { | ||||||
|             toxav_call_control(CallControl.av, friend_number, TOXAV_CALL_CONTROL_CANCEL, &error); |             toxav_call_control(CallControl.av, friend_number, TOXAV_CALL_CONTROL_CANCEL, &error); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (error == TOXAV_ERR_CALL_CONTROL_OK) { |         if (error == TOXAV_ERR_CALL_CONTROL_OK) { | ||||||
|             call->ttas = false; |             call->ttas = false; | ||||||
|  |  | ||||||
|             if ( call->in_idx != -1 ) |             if (call->in_idx != -1) { | ||||||
|                 close_device(input, call->in_idx); |                 close_device(input, call->in_idx); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if ( call->out_idx != -1 ) |             if (call->out_idx != -1) { | ||||||
|                 close_device(output, call->out_idx); |                 close_device(output, call->out_idx); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if ( set_call(call, false) == -1 ) |             if (set_call(call, false) == -1) { | ||||||
|                 return -1; |                 return -1; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             return 0; |             return 0; | ||||||
|         } else { |         } else { | ||||||
| @@ -292,10 +306,11 @@ void callstate_cb(ToxAV *av, uint32_t friend_number, uint32_t state, void *user_ | |||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         case (TOXAV_FRIEND_CALL_STATE_FINISHED): |         case (TOXAV_FRIEND_CALL_STATE_FINISHED): | ||||||
|             if ( CallControl.pending_call ) |             if (CallControl.pending_call) { | ||||||
|                 callback_call_rejected(friend_number); |                 callback_call_rejected(friend_number); | ||||||
|             else |             } else { | ||||||
|                 callback_call_ended(friend_number); |                 callback_call_ended(friend_number); | ||||||
|  |             } | ||||||
|  |  | ||||||
| #ifdef VIDEO | #ifdef VIDEO | ||||||
|             callback_recv_video_end(friend_number); |             callback_recv_video_end(friend_number); | ||||||
| @@ -320,10 +335,11 @@ void callstate_cb(ToxAV *av, uint32_t friend_number, uint32_t state, void *user_ | |||||||
| #ifdef VIDEO | #ifdef VIDEO | ||||||
|  |  | ||||||
|                 /* Handle receiving client video call states */ |                 /* Handle receiving client video call states */ | ||||||
|                 if ( state & TOXAV_FRIEND_CALL_STATE_SENDING_V ) |                 if (state & TOXAV_FRIEND_CALL_STATE_SENDING_V) { | ||||||
|                     callback_recv_video_starting(friend_number); |                     callback_recv_video_starting(friend_number); | ||||||
|                 else if ( state & ~TOXAV_FRIEND_CALL_STATE_SENDING_V ) |                 } else if (state & ~TOXAV_FRIEND_CALL_STATE_SENDING_V) { | ||||||
|                     callback_recv_video_end(friend_number); |                     callback_recv_video_end(friend_number); | ||||||
|  |                 } | ||||||
|  |  | ||||||
| #endif /* VIDEO */ | #endif /* VIDEO */ | ||||||
|             } |             } | ||||||
| @@ -347,12 +363,14 @@ void audio_bit_rate_status_cb(ToxAV *av, uint32_t friend_number, uint32_t audio_ | |||||||
|  |  | ||||||
| void callback_recv_invite(Tox *m, uint32_t friend_number) | void callback_recv_invite(Tox *m, uint32_t friend_number) | ||||||
| { | { | ||||||
|     if (friend_number >= Friends.max_idx) |     if (friend_number >= Friends.max_idx) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (Friends.list[friend_number].chatwin == -1) { |     if (Friends.list[friend_number].chatwin == -1) { | ||||||
|         if (get_num_active_windows() >= MAX_WINDOWS_NUM) |         if (get_num_active_windows() >= MAX_WINDOWS_NUM) { | ||||||
|             return; |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         Friends.list[friend_number].chatwin = add_window(m, new_chat(m, Friends.list[friend_number].num)); |         Friends.list[friend_number].chatwin = add_window(m, new_chat(m, Friends.list[friend_number].num)); | ||||||
|     } |     } | ||||||
| @@ -387,8 +405,9 @@ void callback_recv_starting(uint32_t friend_number) | |||||||
|         if (windows[i].onStarting != NULL && windows[i].num == friend_number) { |         if (windows[i].onStarting != NULL && windows[i].num == friend_number) { | ||||||
|             windows[i].onStarting(&windows[i], CallControl.av, friend_number, CallControl.call_state); |             windows[i].onStarting(&windows[i], CallControl.av, friend_number, CallControl.call_state); | ||||||
|  |  | ||||||
|             if ( 0 != start_transmission(&windows[i], &CallControl.calls[friend_number]) ) /* YEAH! */ |             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!"); |                 line_info_add(&windows[i], NULL, NULL, NULL, SYS_MSG, 0, 0, "Error starting transmission!"); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| @@ -491,11 +510,17 @@ 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); |     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_OK) { | ||||||
|         if ( error == TOXAV_ERR_CALL_FRIEND_ALREADY_IN_CALL ) error_str = "Already in a call!"; |         if (error == TOXAV_ERR_CALL_FRIEND_ALREADY_IN_CALL) { | ||||||
|         else if ( error == TOXAV_ERR_CALL_MALLOC ) error_str = "Memory allocation issue"; |             error_str = "Already in a call!"; | ||||||
|         else if ( error == TOXAV_ERR_CALL_FRIEND_NOT_FOUND ) error_str = "Friend number invalid"; |         } else if (error == TOXAV_ERR_CALL_MALLOC) { | ||||||
|         else if ( error == TOXAV_ERR_CALL_FRIEND_NOT_CONNECTED ) error_str = "Friend is valid but not currently connected"; |             error_str = "Memory allocation issue"; | ||||||
|         else error_str = "Internal error!"; |         } else if (error == TOXAV_ERR_CALL_FRIEND_NOT_FOUND) { | ||||||
|  |             error_str = "Friend number invalid"; | ||||||
|  |         } else if (error == TOXAV_ERR_CALL_FRIEND_NOT_CONNECTED) { | ||||||
|  |             error_str = "Friend is valid but not currently connected"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Internal error!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
| @@ -531,11 +556,17 @@ 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); |     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_OK) { | ||||||
|         if ( error == TOXAV_ERR_ANSWER_FRIEND_NOT_CALLING ) error_str = "No incoming call!"; |         if (error == TOXAV_ERR_ANSWER_FRIEND_NOT_CALLING) { | ||||||
|         else if ( error == TOXAV_ERR_ANSWER_CODEC_INITIALIZATION ) error_str = "Failed to initialize codecs!"; |             error_str = "No incoming call!"; | ||||||
|         else if ( error == TOXAV_ERR_ANSWER_FRIEND_NOT_FOUND ) error_str = "Friend not found!"; |         } else if (error == TOXAV_ERR_ANSWER_CODEC_INITIALIZATION) { | ||||||
|         else if ( error == TOXAV_ERR_ANSWER_INVALID_BIT_RATE ) error_str = "Invalid bit rate!"; |             error_str = "Failed to initialize codecs!"; | ||||||
|         else error_str = "Internal error!"; |         } else if (error == TOXAV_ERR_ANSWER_FRIEND_NOT_FOUND) { | ||||||
|  |             error_str = "Friend not found!"; | ||||||
|  |         } else if (error == TOXAV_ERR_ANSWER_INVALID_BIT_RATE) { | ||||||
|  |             error_str = "Invalid bit rate!"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Internal error!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
| @@ -614,19 +645,24 @@ void cmd_list_devices(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (* | |||||||
|     const char *error_str; |     const char *error_str; | ||||||
|  |  | ||||||
|     if (argc != 1) { |     if (argc != 1) { | ||||||
|         if ( argc < 1 ) error_str = "Type must be specified!"; |         if (argc < 1) { | ||||||
|         else error_str = "Only one argument allowed!"; |             error_str = "Type must be specified!"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Only one argument allowed!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     DeviceType type; |     DeviceType type; | ||||||
|  |  | ||||||
|     if ( strcasecmp(argv[1], "in") == 0 ) /* Input devices */ |     if (strcasecmp(argv[1], "in") == 0) { /* Input devices */ | ||||||
|         type = input; |         type = input; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else if ( strcasecmp(argv[1], "out") == 0 ) /* Output devices */ |     else if (strcasecmp(argv[1], "out") == 0) { /* Output devices */ | ||||||
|         type = output; |         type = output; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else { |     else { | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); | ||||||
| @@ -649,20 +685,26 @@ void cmd_change_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, char ( | |||||||
|     const char *error_str; |     const char *error_str; | ||||||
|  |  | ||||||
|     if (argc != 2) { |     if (argc != 2) { | ||||||
|         if ( argc < 1 ) error_str = "Type must be specified!"; |         if (argc < 1) { | ||||||
|         else if ( argc < 2 ) error_str = "Must have id!"; |             error_str = "Type must be specified!"; | ||||||
|         else error_str = "Only two arguments allowed!"; |         } else if (argc < 2) { | ||||||
|  |             error_str = "Must have id!"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Only two arguments allowed!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     DeviceType type; |     DeviceType type; | ||||||
|  |  | ||||||
|     if ( strcmp(argv[1], "in") == 0 ) /* Input devices */ |     if (strcmp(argv[1], "in") == 0) { /* Input devices */ | ||||||
|         type = input; |         type = input; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else if ( strcmp(argv[1], "out") == 0 ) /* Output devices */ |     else if (strcmp(argv[1], "out") == 0) { /* Output devices */ | ||||||
|         type = output; |         type = output; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else { |     else { | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); | ||||||
| @@ -693,20 +735,26 @@ void cmd_ccur_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*a | |||||||
|     const char *error_str; |     const char *error_str; | ||||||
|  |  | ||||||
|     if (argc != 2) { |     if (argc != 2) { | ||||||
|         if ( argc < 1 ) error_str = "Type must be specified!"; |         if (argc < 1) { | ||||||
|         else if ( argc < 2 ) error_str = "Must have id!"; |             error_str = "Type must be specified!"; | ||||||
|         else error_str = "Only two arguments allowed!"; |         } else if (argc < 2) { | ||||||
|  |             error_str = "Must have id!"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Only two arguments allowed!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     DeviceType type; |     DeviceType type; | ||||||
|  |  | ||||||
|     if ( strcmp(argv[1], "in") == 0 ) /* Input devices */ |     if (strcmp(argv[1], "in") == 0) { /* Input devices */ | ||||||
|         type = input; |         type = input; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else if ( strcmp(argv[1], "out") == 0 ) /* Output devices */ |     else if (strcmp(argv[1], "out") == 0) { /* Output devices */ | ||||||
|         type = output; |         type = output; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else { |     else { | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); | ||||||
| @@ -764,19 +812,24 @@ void cmd_mute(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA | |||||||
|     const char *error_str; |     const char *error_str; | ||||||
|  |  | ||||||
|     if (argc != 1) { |     if (argc != 1) { | ||||||
|         if ( argc < 1 ) error_str = "Type must be specified!"; |         if (argc < 1) { | ||||||
|         else error_str = "Only two arguments allowed!"; |             error_str = "Type must be specified!"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Only two arguments allowed!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     DeviceType type; |     DeviceType type; | ||||||
|  |  | ||||||
|     if ( strcasecmp(argv[1], "in") == 0 ) /* Input devices */ |     if (strcasecmp(argv[1], "in") == 0) { /* Input devices */ | ||||||
|         type = input; |         type = input; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else if ( strcasecmp(argv[1], "out") == 0 ) /* Output devices */ |     else if (strcasecmp(argv[1], "out") == 0) { /* Output devices */ | ||||||
|         type = output; |         type = output; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else { |     else { | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); | ||||||
| @@ -812,8 +865,11 @@ void cmd_sense(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[M | |||||||
|     const char *error_str; |     const char *error_str; | ||||||
|  |  | ||||||
|     if (argc != 1) { |     if (argc != 1) { | ||||||
|         if ( argc < 1 ) error_str = "Must have value!"; |         if (argc < 1) { | ||||||
|         else error_str = "Only two arguments allowed!"; |             error_str = "Must have value!"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Only two arguments allowed!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -103,13 +103,15 @@ DeviceError init_devices() | |||||||
|     get_devices_names(); |     get_devices_names(); | ||||||
|  |  | ||||||
|     // Start poll thread |     // Start poll thread | ||||||
|     if (pthread_mutex_init(&mutex, NULL) != 0) |     if (pthread_mutex_init(&mutex, NULL) != 0) { | ||||||
|         return de_InternalError; |         return de_InternalError; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pthread_t thread_id; |     pthread_t thread_id; | ||||||
|  |  | ||||||
|     if ( pthread_create(&thread_id, NULL, thread_poll, NULL) != 0 || pthread_detach(thread_id) != 0) |     if (pthread_create(&thread_id, NULL, thread_poll, NULL) != 0 || pthread_detach(thread_id) != 0) { | ||||||
|         return de_InternalError; |         return de_InternalError; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #ifdef AUDIO | #ifdef AUDIO | ||||||
|     av = av_; |     av = av_; | ||||||
| @@ -127,8 +129,9 @@ DeviceError terminate_devices() | |||||||
|  |  | ||||||
|     usleep(20000); |     usleep(20000); | ||||||
|  |  | ||||||
|     if (pthread_mutex_destroy(&mutex) != 0) |     if (pthread_mutex_destroy(&mutex) != 0) { | ||||||
|         return (DeviceError) de_InternalError; |         return (DeviceError) de_InternalError; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return (DeviceError) de_None; |     return (DeviceError) de_None; | ||||||
| } | } | ||||||
| @@ -151,10 +154,11 @@ void get_devices_names() | |||||||
|  |  | ||||||
|     size[output] = 0; |     size[output] = 0; | ||||||
|  |  | ||||||
|     if (alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT") != AL_FALSE) |     if (alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT") != AL_FALSE) { | ||||||
|         stringed_device_list = alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER); |         stringed_device_list = alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER); | ||||||
|     else |     } else { | ||||||
|         stringed_device_list = alcGetString(NULL, ALC_DEVICE_SPECIFIER); |         stringed_device_list = alcGetString(NULL, ALC_DEVICE_SPECIFIER); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (stringed_device_list) { |     if (stringed_device_list) { | ||||||
|         ddevice_names[output] = alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); |         ddevice_names[output] = alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); | ||||||
| @@ -168,7 +172,9 @@ void get_devices_names() | |||||||
|  |  | ||||||
| DeviceError device_mute(DeviceType type, uint32_t device_idx) | DeviceError device_mute(DeviceType type, uint32_t device_idx) | ||||||
| { | { | ||||||
|     if (device_idx >= MAX_DEVICES) return de_InvalidSelection; |     if (device_idx >= MAX_DEVICES) { | ||||||
|  |         return de_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     lock; |     lock; | ||||||
|  |  | ||||||
| @@ -188,7 +194,9 @@ DeviceError device_mute(DeviceType type, uint32_t device_idx) | |||||||
| #ifdef AUDIO | #ifdef AUDIO | ||||||
| DeviceError device_set_VAD_treshold(uint32_t device_idx, float value) | DeviceError device_set_VAD_treshold(uint32_t device_idx, float value) | ||||||
| { | { | ||||||
|     if (device_idx >= MAX_DEVICES) return de_InvalidSelection; |     if (device_idx >= MAX_DEVICES) { | ||||||
|  |         return de_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     lock; |     lock; | ||||||
|  |  | ||||||
| @@ -209,7 +217,9 @@ DeviceError device_set_VAD_treshold(uint32_t device_idx, float value) | |||||||
|  |  | ||||||
| DeviceError set_primary_device(DeviceType type, int32_t selection) | DeviceError set_primary_device(DeviceType type, int32_t selection) | ||||||
| { | { | ||||||
|     if (size[type] <= selection || selection < 0) return de_InvalidSelection; |     if (size[type] <= selection || selection < 0) { | ||||||
|  |         return de_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     primary_device[type] = selection; |     primary_device[type] = selection; | ||||||
|  |  | ||||||
| @@ -231,9 +241,13 @@ void get_primary_device_name(DeviceType type, char *buf, int size) | |||||||
| DeviceError open_device(DeviceType type, int32_t selection, uint32_t *device_idx, uint32_t sample_rate, | DeviceError open_device(DeviceType type, int32_t selection, uint32_t *device_idx, uint32_t sample_rate, | ||||||
|                         uint32_t frame_duration, uint8_t channels) |                         uint32_t frame_duration, uint8_t channels) | ||||||
| { | { | ||||||
|     if (size[type] <= selection || selection < 0) return de_InvalidSelection; |     if (size[type] <= selection || selection < 0) { | ||||||
|  |         return de_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (channels != 1 && channels != 2) return de_UnsupportedMode; |     if (channels != 1 && channels != 2) { | ||||||
|  |         return de_UnsupportedMode; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     lock; |     lock; | ||||||
|  |  | ||||||
| @@ -246,7 +260,9 @@ DeviceError open_device(DeviceType type, int32_t selection, uint32_t *device_idx | |||||||
|     if (i == MAX_DEVICES) { |     if (i == MAX_DEVICES) { | ||||||
|         unlock; |         unlock; | ||||||
|         return de_AllDevicesBusy; |         return de_AllDevicesBusy; | ||||||
|     } else *device_idx = i; |     } else { | ||||||
|  |         *device_idx = i; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_DEVICES; i ++) { /* Check if any device has the same selection */ |     for (i = 0; i < MAX_DEVICES; i ++) { /* Check if any device has the same selection */ | ||||||
|         if (running[type][i] && running[type][i]->selection == selection) { |         if (running[type][i] && running[type][i]->selection == selection) { | ||||||
| @@ -325,7 +341,9 @@ DeviceError open_device(DeviceType type, int32_t selection, uint32_t *device_idx | |||||||
|  |  | ||||||
| DeviceError close_device(DeviceType type, uint32_t device_idx) | DeviceError close_device(DeviceType type, uint32_t device_idx) | ||||||
| { | { | ||||||
|     if (device_idx >= MAX_DEVICES) return de_InvalidSelection; |     if (device_idx >= MAX_DEVICES) { | ||||||
|  |         return de_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     lock; |     lock; | ||||||
|     Device *device = running[type][device_idx]; |     Device *device = running[type][device_idx]; | ||||||
| @@ -340,22 +358,32 @@ DeviceError close_device(DeviceType type, uint32_t device_idx) | |||||||
|  |  | ||||||
|     if (!device->ref_count) { |     if (!device->ref_count) { | ||||||
|         if (type == input) { |         if (type == input) { | ||||||
|             if ( !alcCaptureCloseDevice(device->dhndl) ) rc = de_AlError; |             if (!alcCaptureCloseDevice(device->dhndl)) { | ||||||
|  |                 rc = de_AlError; | ||||||
|  |             } | ||||||
|         } else { |         } else { | ||||||
|             if (alcGetCurrentContext() != device->ctx) alcMakeContextCurrent(device->ctx); |             if (alcGetCurrentContext() != device->ctx) { | ||||||
|  |                 alcMakeContextCurrent(device->ctx); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             alDeleteSources(1, &device->source); |             alDeleteSources(1, &device->source); | ||||||
|             alDeleteBuffers(OPENAL_BUFS, device->buffers); |             alDeleteBuffers(OPENAL_BUFS, device->buffers); | ||||||
|  |  | ||||||
|             alcMakeContextCurrent(NULL); |             alcMakeContextCurrent(NULL); | ||||||
|  |  | ||||||
|             if ( device->ctx ) alcDestroyContext(device->ctx); |             if (device->ctx) { | ||||||
|  |                 alcDestroyContext(device->ctx); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if ( !alcCloseDevice(device->dhndl) ) rc = de_AlError; |             if (!alcCloseDevice(device->dhndl)) { | ||||||
|  |                 rc = de_AlError; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         free(device); |         free(device); | ||||||
|     } else device->ref_count--; |     } else { | ||||||
|  |         device->ref_count--; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     unlock; |     unlock; | ||||||
|     return rc; |     return rc; | ||||||
| @@ -364,8 +392,9 @@ DeviceError close_device(DeviceType type, uint32_t device_idx) | |||||||
| DeviceError register_device_callback(int32_t friend_number, uint32_t device_idx, DataHandleCallback callback, | DeviceError register_device_callback(int32_t friend_number, uint32_t device_idx, DataHandleCallback callback, | ||||||
|                                      void *data, bool enable_VAD) |                                      void *data, bool enable_VAD) | ||||||
| { | { | ||||||
|     if (size[input] <= device_idx || !running[input][device_idx] || running[input][device_idx]->dhndl == NULL) |     if (size[input] <= device_idx || !running[input][device_idx] || running[input][device_idx]->dhndl == NULL) { | ||||||
|         return de_InvalidSelection; |         return de_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     lock; |     lock; | ||||||
|     running[input][device_idx]->cb = callback; |     running[input][device_idx]->cb = callback; | ||||||
| @@ -380,11 +409,15 @@ DeviceError register_device_callback( int32_t friend_number, uint32_t device_idx | |||||||
| 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) |                                uint32_t sample_rate) | ||||||
| { | { | ||||||
|     if (device_idx >= MAX_DEVICES) return de_InvalidSelection; |     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; |     if (!device || device->muted) { | ||||||
|  |         return de_DeviceNotActive; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pthread_mutex_lock(device->mutex); |     pthread_mutex_lock(device->mutex); | ||||||
|  |  | ||||||
| @@ -399,8 +432,9 @@ inline__ DeviceError write_out(uint32_t device_idx, const int16_t *data, uint32_ | |||||||
|         alSourceUnqueueBuffers(device->source, processed, bufids); |         alSourceUnqueueBuffers(device->source, processed, bufids); | ||||||
|         alDeleteBuffers(processed - 1, bufids + 1); |         alDeleteBuffers(processed - 1, bufids + 1); | ||||||
|         bufid = bufids[0]; |         bufid = bufids[0]; | ||||||
|     } else if (queued < 16) alGenBuffers(1, &bufid); |     } else if (queued < 16) { | ||||||
|     else { |         alGenBuffers(1, &bufid); | ||||||
|  |     } else { | ||||||
|         pthread_mutex_unlock(device->mutex); |         pthread_mutex_unlock(device->mutex); | ||||||
|         return de_Busy; |         return de_Busy; | ||||||
|     } |     } | ||||||
| @@ -413,7 +447,9 @@ inline__ DeviceError write_out(uint32_t device_idx, const int16_t *data, uint32_ | |||||||
|     ALint state; |     ALint state; | ||||||
|     alGetSourcei(device->source, AL_SOURCE_STATE, &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); |     pthread_mutex_unlock(device->mutex); | ||||||
| @@ -470,7 +506,9 @@ void *thread_poll (void *arg) // TODO: maybe use thread for every input source | |||||||
|                         continue; |                         continue; | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     if ( device->cb ) device->cb(frame, f_size, device->cb_data); |                     if (device->cb) { | ||||||
|  |                         device->cb(frame, f_size, device->cb_data); | ||||||
|  |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 unlock; |                 unlock; | ||||||
| @@ -502,8 +540,9 @@ DeviceError selection_valid(DeviceType type, int32_t selection) | |||||||
|  |  | ||||||
| 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) |     if (size[input] <= device_idx || !running[input][device_idx] || running[input][device_idx]->dhndl == NULL) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return running[input][device_idx]->cb_data; |     return running[input][device_idx]->cb_data; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -97,16 +97,18 @@ int complete_line(ToxWindow *self, const void *list, size_t n_items, size_t size | |||||||
| { | { | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
|     if (ctx->pos <= 0 || ctx->len <= 0 || ctx->pos > ctx->len || ctx->len >= MAX_STR_SIZE || size > MAX_STR_SIZE) |     if (ctx->pos <= 0 || ctx->len <= 0 || ctx->pos > ctx->len || ctx->len >= MAX_STR_SIZE || size > MAX_STR_SIZE) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     const char *L = (char *) list; |     const char *L = (char *) list; | ||||||
|     const char *endchrs = " "; |     const char *endchrs = " "; | ||||||
|     char ubuf[MAX_STR_SIZE]; |     char ubuf[MAX_STR_SIZE]; | ||||||
|  |  | ||||||
|     /* work with multibyte string copy of buf for simplicity */ |     /* work with multibyte string copy of buf for simplicity */ | ||||||
|     if (wcs_to_mbs_buf(ubuf, ctx->line, sizeof(ubuf)) == -1) |     if (wcs_to_mbs_buf(ubuf, ctx->line, sizeof(ubuf)) == -1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* TODO: generalize this */ |     /* TODO: generalize this */ | ||||||
|     bool dir_search =    !strncmp(ubuf, "/sendfile", strlen("/sendfile")) |     bool dir_search =    !strncmp(ubuf, "/sendfile", strlen("/sendfile")) | ||||||
| @@ -124,14 +126,16 @@ int complete_line(ToxWindow *self, const void *list, size_t n_items, size_t size | |||||||
|     const char *s = dir_search ? strchr(tmp, '\"') : strrchr(tmp, ' '); |     const char *s = dir_search ? strchr(tmp, '\"') : strrchr(tmp, ' '); | ||||||
|     char *sub = calloc(1, strlen(ubuf) + 1); |     char *sub = calloc(1, strlen(ubuf) + 1); | ||||||
|  |  | ||||||
|     if (sub == NULL) |     if (sub == NULL) { | ||||||
|         exit_toxic_err("failed in complete_line", FATALERR_MEMORY); |         exit_toxic_err("failed in complete_line", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!s && !dir_search) { |     if (!s && !dir_search) { | ||||||
|         strcpy(sub, tmp); |         strcpy(sub, tmp); | ||||||
|  |  | ||||||
|         if (sub[0] != '/') |         if (sub[0] != '/') { | ||||||
|             endchrs = ": "; |             endchrs = ": "; | ||||||
|  |         } | ||||||
|     } else if (s) { |     } else if (s) { | ||||||
|         strcpy(sub, &s[1]); |         strcpy(sub, &s[1]); | ||||||
|  |  | ||||||
| @@ -139,10 +143,11 @@ int complete_line(ToxWindow *self, const void *list, size_t n_items, size_t size | |||||||
|             int sub_len = strlen(sub); |             int sub_len = strlen(sub); | ||||||
|             int si = char_rfind(sub, '/', sub_len); |             int si = char_rfind(sub, '/', sub_len); | ||||||
|  |  | ||||||
|             if (si || *sub == '/') |             if (si || *sub == '/') { | ||||||
|                 memmove(sub, &sub[si + 1], sub_len - si); |                 memmove(sub, &sub[si + 1], sub_len - si); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!sub[0]) { |     if (!sub[0]) { | ||||||
|         free(sub); |         free(sub); | ||||||
| @@ -159,17 +164,20 @@ int complete_line(ToxWindow *self, const void *list, size_t n_items, size_t size | |||||||
|         char str[MAX_CMDNAME_SIZE + 1]; |         char str[MAX_CMDNAME_SIZE + 1]; | ||||||
|         snprintf(str, sizeof(str), "%s", &L[i * size]); |         snprintf(str, sizeof(str), "%s", &L[i * size]); | ||||||
|  |  | ||||||
|         if (strncasecmp(str, sub, s_len) == 0) |         if (strncasecmp(str, sub, s_len) == 0) { | ||||||
|             strcpy(matches[n_matches++], str); |             strcpy(matches[n_matches++], str); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     free(sub); |     free(sub); | ||||||
|  |  | ||||||
|     if (!n_matches) |     if (!n_matches) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!dir_search && n_matches > 1) |     if (!dir_search && n_matches > 1) { | ||||||
|         print_matches(self, NULL, matches, n_matches, MAX_STR_SIZE); |         print_matches(self, NULL, matches, n_matches, MAX_STR_SIZE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char match[MAX_STR_SIZE]; |     char match[MAX_STR_SIZE]; | ||||||
|     size_t match_len = get_str_match(self, match, sizeof(match), matches, n_matches); |     size_t match_len = get_str_match(self, match, sizeof(match), matches, n_matches); | ||||||
| @@ -179,10 +187,11 @@ int complete_line(ToxWindow *self, const void *list, size_t n_items, size_t size | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (dir_search) { |     if (dir_search) { | ||||||
|         if (n_matches == 1) |         if (n_matches == 1) { | ||||||
|             endchrs = char_rfind(match, '.', match_len) ? "\"" : "/"; |             endchrs = char_rfind(match, '.', match_len) ? "\"" : "/"; | ||||||
|         else |         } else { | ||||||
|             endchrs = ""; |             endchrs = ""; | ||||||
|  |         } | ||||||
|     } else if (n_matches > 1) { |     } else if (n_matches > 1) { | ||||||
|         endchrs = ""; |         endchrs = ""; | ||||||
|     } |     } | ||||||
| @@ -192,8 +201,9 @@ int complete_line(ToxWindow *self, const void *list, size_t n_items, size_t size | |||||||
|     int strt = ctx->pos - s_len; |     int strt = ctx->pos - s_len; | ||||||
|     int diff = match_len - s_len + n_endchrs; |     int diff = match_len - s_len + n_endchrs; | ||||||
|  |  | ||||||
|     if (ctx->len + diff >= MAX_STR_SIZE) |     if (ctx->len + diff >= MAX_STR_SIZE) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char tmpend[MAX_STR_SIZE]; |     char tmpend[MAX_STR_SIZE]; | ||||||
|     snprintf(tmpend, sizeof(tmpend), "%s", &ubuf[ctx->pos]); |     snprintf(tmpend, sizeof(tmpend), "%s", &ubuf[ctx->pos]); | ||||||
| @@ -235,13 +245,15 @@ static void complt_home_dir(ToxWindow *self, char *path, int pathsize, const cha | |||||||
|  |  | ||||||
|     wchar_t wline[MAX_STR_SIZE]; |     wchar_t wline[MAX_STR_SIZE]; | ||||||
|  |  | ||||||
|     if (mbs_to_wcs_buf(wline, newline, sizeof(wline) / sizeof(wchar_t)) == -1) |     if (mbs_to_wcs_buf(wline, newline, sizeof(wline) / sizeof(wchar_t)) == -1) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int newlen = wcslen(wline); |     int newlen = wcslen(wline); | ||||||
|  |  | ||||||
|     if (ctx->len + newlen >= MAX_STR_SIZE) |     if (ctx->len + newlen >= MAX_STR_SIZE) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wmemcpy(ctx->line, wline, newlen + 1); |     wmemcpy(ctx->line, wline, newlen + 1); | ||||||
|     ctx->pos = newlen; |     ctx->pos = newlen; | ||||||
| @@ -261,14 +273,17 @@ int dir_match(ToxWindow *self, Tox *m, const wchar_t *line, const wchar_t *cmd) | |||||||
|     char b_cmd[MAX_STR_SIZE]; |     char b_cmd[MAX_STR_SIZE]; | ||||||
|     const wchar_t *tmpline = &line[wcslen(cmd) + 2];   /* start after "/command \"" */ |     const wchar_t *tmpline = &line[wcslen(cmd) + 2];   /* start after "/command \"" */ | ||||||
|  |  | ||||||
|     if (wcs_to_mbs_buf(b_path, tmpline, sizeof(b_path)) == -1) |     if (wcs_to_mbs_buf(b_path, tmpline, sizeof(b_path)) == -1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (wcs_to_mbs_buf(b_cmd, cmd, sizeof(b_cmd)) == -1) |     if (wcs_to_mbs_buf(b_cmd, cmd, sizeof(b_cmd)) == -1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (b_path[0] == '~') |     if (b_path[0] == '~') { | ||||||
|         complt_home_dir(self, b_path, sizeof(b_path), b_cmd, strlen(b_cmd) + 2); |         complt_home_dir(self, b_path, sizeof(b_path), b_cmd, strlen(b_cmd) + 2); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int si = char_rfind(b_path, '/', strlen(b_path)); |     int si = char_rfind(b_path, '/', strlen(b_path)); | ||||||
|  |  | ||||||
| @@ -286,8 +301,9 @@ int dir_match(ToxWindow *self, Tox *m, const wchar_t *line, const wchar_t *cmd) | |||||||
|     int b_name_len = strlen(b_name); |     int b_name_len = strlen(b_name); | ||||||
|     DIR *dp = opendir(b_path); |     DIR *dp = opendir(b_path); | ||||||
|  |  | ||||||
|     if (dp == NULL) |     if (dp == NULL) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char dirnames[MAX_DIRS][NAME_MAX + 1]; |     char dirnames[MAX_DIRS][NAME_MAX + 1]; | ||||||
|     struct dirent *entry; |     struct dirent *entry; | ||||||
| @@ -303,8 +319,9 @@ int dir_match(ToxWindow *self, Tox *m, const wchar_t *line, const wchar_t *cmd) | |||||||
|  |  | ||||||
|     closedir(dp); |     closedir(dp); | ||||||
|  |  | ||||||
|     if (dircount == 0) |     if (dircount == 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (dircount > 1) { |     if (dircount > 1) { | ||||||
|         qsort(dirnames, dircount, NAME_MAX + 1, qsort_strcasecmp_hlpr); |         qsort(dirnames, dircount, NAME_MAX + 1, qsort_strcasecmp_hlpr); | ||||||
|   | |||||||
| @@ -56,8 +56,9 @@ int avatar_send(Tox *m, uint32_t friendnum) | |||||||
|     uint32_t filenum = tox_file_send(m, friendnum, TOX_FILE_KIND_AVATAR, (size_t) Avatar.size, |     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); |                                      NULL, (uint8_t *) Avatar.name, Avatar.name_len, &err); | ||||||
|  |  | ||||||
|     if (Avatar.size == 0) |     if (Avatar.size == 0) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (err != TOX_ERR_FILE_SEND_OK) { |     if (err != TOX_ERR_FILE_SEND_OK) { | ||||||
|         fprintf(stderr, "tox_file_send failed for friendnumber %d (error %d)\n", friendnum, err); |         fprintf(stderr, "tox_file_send failed for friendnumber %d (error %d)\n", friendnum, err); | ||||||
| @@ -66,13 +67,15 @@ int avatar_send(Tox *m, uint32_t friendnum) | |||||||
|  |  | ||||||
|     struct FileTransfer *ft = new_file_transfer(NULL, friendnum, filenum, FILE_TRANSFER_SEND, TOX_FILE_KIND_AVATAR); |     struct FileTransfer *ft = new_file_transfer(NULL, friendnum, filenum, FILE_TRANSFER_SEND, TOX_FILE_KIND_AVATAR); | ||||||
|  |  | ||||||
|     if (!ft) |     if (!ft) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ft->file = fopen(Avatar.path, "r"); |     ft->file = fopen(Avatar.path, "r"); | ||||||
|  |  | ||||||
|     if (ft->file == NULL) |     if (ft->file == NULL) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     snprintf(ft->file_name, sizeof(ft->file_name), "%s", Avatar.name); |     snprintf(ft->file_name, sizeof(ft->file_name), "%s", Avatar.name); | ||||||
|     ft->file_size = Avatar.size; |     ft->file_size = Avatar.size; | ||||||
| @@ -86,10 +89,11 @@ static void avatar_send_all(Tox *m) | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < Friends.max_idx; ++i) { |     for (i = 0; i < Friends.max_idx; ++i) { | ||||||
|         if (Friends.list[i].connection_status != TOX_CONNECTION_NONE) |         if (Friends.list[i].connection_status != TOX_CONNECTION_NONE) { | ||||||
|             avatar_send(m, Friends.list[i].num); |             avatar_send(m, Friends.list[i].num); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* Sets avatar to path and sends it to all online contacts. | /* Sets avatar to path and sends it to all online contacts. | ||||||
|  * |  * | ||||||
| @@ -98,13 +102,15 @@ static void avatar_send_all(Tox *m) | |||||||
|  */ |  */ | ||||||
| int avatar_set(Tox *m, const char *path, size_t path_len) | int avatar_set(Tox *m, const char *path, size_t path_len) | ||||||
| { | { | ||||||
|     if (path_len == 0 || path_len >= sizeof(Avatar.path)) |     if (path_len == 0 || path_len >= sizeof(Avatar.path)) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     FILE *fp = fopen(path, "rb"); |     FILE *fp = fopen(path, "rb"); | ||||||
|  |  | ||||||
|     if (fp == NULL) |     if (fp == NULL) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char PNG_signature[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; |     char PNG_signature[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; | ||||||
|  |  | ||||||
| @@ -117,8 +123,9 @@ int avatar_set(Tox *m, const char *path, size_t path_len) | |||||||
|  |  | ||||||
|     off_t size = file_size(path); |     off_t size = file_size(path); | ||||||
|  |  | ||||||
|     if (size == 0 || size > MAX_AVATAR_FILE_SIZE) |     if (size == 0 || size > MAX_AVATAR_FILE_SIZE) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     get_file_name(Avatar.name, sizeof(Avatar.name), path); |     get_file_name(Avatar.name, sizeof(Avatar.name), path); | ||||||
|     Avatar.name_len = strlen(Avatar.name); |     Avatar.name_len = strlen(Avatar.name); | ||||||
| @@ -166,8 +173,9 @@ void on_avatar_file_control(Tox *m, struct FileTransfer *ft, TOX_FILE_CONTROL co | |||||||
|  |  | ||||||
| void on_avatar_chunk_request(Tox *m, struct FileTransfer *ft, uint64_t position, size_t length) | void on_avatar_chunk_request(Tox *m, struct FileTransfer *ft, uint64_t position, size_t length) | ||||||
| { | { | ||||||
|     if (ft->state != FILE_TRANSFER_STARTED) |     if (ft->state != FILE_TRANSFER_STARTED) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (length == 0) { |     if (length == 0) { | ||||||
|         close_file_transfer(NULL, m, ft, -1, NULL, silent); |         close_file_transfer(NULL, m, ft, -1, NULL, silent); | ||||||
| @@ -199,8 +207,9 @@ void on_avatar_chunk_request(Tox *m, struct FileTransfer *ft, uint64_t position, | |||||||
|     TOX_ERR_FILE_SEND_CHUNK err; |     TOX_ERR_FILE_SEND_CHUNK err; | ||||||
|     tox_file_send_chunk(m, ft->friendnum, ft->filenum, position, send_data, send_length, &err); |     tox_file_send_chunk(m, ft->friendnum, ft->filenum, position, send_data, send_length, &err); | ||||||
|  |  | ||||||
|     if (err != TOX_ERR_FILE_SEND_CHUNK_OK) |     if (err != TOX_ERR_FILE_SEND_CHUNK_OK) { | ||||||
|         fprintf(stderr, "tox_file_send_chunk failed in avatar callback (error %d)\n", err); |         fprintf(stderr, "tox_file_send_chunk failed in avatar callback (error %d)\n", err); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ft->position += send_length; |     ft->position += send_length; | ||||||
|     ft->last_keep_alive = get_unix_time(); |     ft->last_keep_alive = get_unix_time(); | ||||||
|   | |||||||
							
								
								
									
										210
									
								
								src/chat.c
									
									
									
									
									
								
							
							
						
						
									
										210
									
								
								src/chat.c
									
									
									
									
									
								
							| @@ -132,8 +132,9 @@ static const char chat_cmd_list[AC_NUM_CHAT_COMMANDS][MAX_CMDNAME_SIZE] = { | |||||||
|  |  | ||||||
| static void set_self_typingstatus(ToxWindow *self, Tox *m, bool is_typing) | static void set_self_typingstatus(ToxWindow *self, Tox *m, bool is_typing) | ||||||
| { | { | ||||||
|     if (user_settings->show_typing_self == SHOW_TYPING_OFF) |     if (user_settings->show_typing_self == SHOW_TYPING_OFF) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
| @@ -205,8 +206,9 @@ static void recv_action_helper(ToxWindow *self, Tox *m, uint32_t num, const char | |||||||
|  |  | ||||||
| static void chat_onMessage(ToxWindow *self, Tox *m, uint32_t num, TOX_MESSAGE_TYPE type, const char *msg, size_t len) | static void chat_onMessage(ToxWindow *self, Tox *m, uint32_t num, TOX_MESSAGE_TYPE type, const char *msg, size_t len) | ||||||
| { | { | ||||||
|     if (self->num != num) |     if (self->num != num) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char nick[TOX_MAX_NAME_LENGTH]; |     char nick[TOX_MAX_NAME_LENGTH]; | ||||||
|     get_nick_truncate(m, nick, num); |     get_nick_truncate(m, nick, num); | ||||||
| @@ -214,20 +216,23 @@ static void chat_onMessage(ToxWindow *self, Tox *m, uint32_t num, TOX_MESSAGE_TY | |||||||
|     char timefrmt[TIME_STR_SIZE]; |     char timefrmt[TIME_STR_SIZE]; | ||||||
|     get_time_str(timefrmt, sizeof(timefrmt)); |     get_time_str(timefrmt, sizeof(timefrmt)); | ||||||
|  |  | ||||||
|     if (type == TOX_MESSAGE_TYPE_NORMAL) |     if (type == TOX_MESSAGE_TYPE_NORMAL) { | ||||||
|         return recv_message_helper(self, m, num, msg, len, nick, timefrmt); |         return recv_message_helper(self, m, num, msg, len, nick, timefrmt); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (type == TOX_MESSAGE_TYPE_ACTION) |     if (type == TOX_MESSAGE_TYPE_ACTION) { | ||||||
|         return recv_action_helper(self, m, num, msg, len, nick, timefrmt); |         return recv_action_helper(self, m, num, msg, len, nick, timefrmt); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| static void chat_pause_file_transfers(Tox *m, uint32_t friendnum); | static void chat_pause_file_transfers(Tox *m, uint32_t friendnum); | ||||||
| static void chat_resume_file_senders(ToxWindow *self, Tox *m, uint32_t fnum); | static void chat_resume_file_senders(ToxWindow *self, Tox *m, uint32_t fnum); | ||||||
|  |  | ||||||
| static void chat_onConnectionChange(ToxWindow *self, Tox *m, uint32_t num, TOX_CONNECTION connection_status) | static void chat_onConnectionChange(ToxWindow *self, Tox *m, uint32_t num, TOX_CONNECTION connection_status) | ||||||
| { | { | ||||||
|     if (self->num != num) |     if (self->num != num) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     StatusBar *statusbar = self->stb; |     StatusBar *statusbar = self->stb; | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
| @@ -255,8 +260,9 @@ static void chat_onConnectionChange(ToxWindow *self, Tox *m, uint32_t num, TOX_C | |||||||
|     } else if (connection_status == TOX_CONNECTION_NONE) { |     } else if (connection_status == TOX_CONNECTION_NONE) { | ||||||
|         Friends.list[num].is_typing = false; |         Friends.list[num].is_typing = false; | ||||||
|  |  | ||||||
|         if (self->chatwin->self_is_typing) |         if (self->chatwin->self_is_typing) { | ||||||
|             set_self_typingstatus(self, m, 0); |             set_self_typingstatus(self, m, 0); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         chat_pause_file_transfers(m, num); |         chat_pause_file_transfers(m, num); | ||||||
|  |  | ||||||
| @@ -268,16 +274,18 @@ static void chat_onConnectionChange(ToxWindow *self, Tox *m, uint32_t num, TOX_C | |||||||
|  |  | ||||||
| static void chat_onTypingChange(ToxWindow *self, Tox *m, uint32_t num, bool is_typing) | static void chat_onTypingChange(ToxWindow *self, Tox *m, uint32_t num, bool is_typing) | ||||||
| { | { | ||||||
|     if (self->num != num) |     if (self->num != num) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Friends.list[num].is_typing = is_typing; |     Friends.list[num].is_typing = is_typing; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void chat_onNickChange(ToxWindow *self, Tox *m, uint32_t num, const char *nick, size_t length) | static void chat_onNickChange(ToxWindow *self, Tox *m, uint32_t num, const char *nick, size_t length) | ||||||
| { | { | ||||||
|     if (self->num != num) |     if (self->num != num) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     StatusBar *statusbar = self->stb; |     StatusBar *statusbar = self->stb; | ||||||
|  |  | ||||||
| @@ -290,8 +298,9 @@ static void chat_onNickChange(ToxWindow *self, Tox *m, uint32_t num, const char | |||||||
|  |  | ||||||
| static void chat_onStatusChange(ToxWindow *self, Tox *m, uint32_t num, TOX_USER_STATUS status) | static void chat_onStatusChange(ToxWindow *self, Tox *m, uint32_t num, TOX_USER_STATUS status) | ||||||
| { | { | ||||||
|     if (self->num != num) |     if (self->num != num) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     StatusBar *statusbar = self->stb; |     StatusBar *statusbar = self->stb; | ||||||
|     statusbar->status = status; |     statusbar->status = status; | ||||||
| @@ -299,8 +308,9 @@ static void chat_onStatusChange(ToxWindow *self, Tox *m, uint32_t num, TOX_USER_ | |||||||
|  |  | ||||||
| static void chat_onStatusMessageChange(ToxWindow *self, uint32_t num, const char *status, size_t length) | static void chat_onStatusMessageChange(ToxWindow *self, uint32_t num, const char *status, size_t length) | ||||||
| { | { | ||||||
|     if (self->num != num) |     if (self->num != num) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     StatusBar *statusbar = self->stb; |     StatusBar *statusbar = self->stb; | ||||||
|  |  | ||||||
| @@ -321,13 +331,15 @@ static void chat_pause_file_transfers(Tox *m, uint32_t friendnum) | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_FILES; ++i) { |     for (i = 0; i < MAX_FILES; ++i) { | ||||||
|         if (friend->file_sender[i].state >= FILE_TRANSFER_STARTED) |         if (friend->file_sender[i].state >= FILE_TRANSFER_STARTED) { | ||||||
|             friend->file_sender[i].state = FILE_TRANSFER_PAUSED; |             friend->file_sender[i].state = FILE_TRANSFER_PAUSED; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (friend->file_receiver[i].state >= FILE_TRANSFER_STARTED) |         if (friend->file_receiver[i].state >= FILE_TRANSFER_STARTED) { | ||||||
|             friend->file_receiver[i].state = FILE_TRANSFER_PAUSED; |             friend->file_receiver[i].state = FILE_TRANSFER_PAUSED; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* Tries to resume broken file senders. Called when a friend comes online */ | /* Tries to resume broken file senders. Called when a friend comes online */ | ||||||
| static void chat_resume_file_senders(ToxWindow *self, Tox *m, uint32_t friendnum) | static void chat_resume_file_senders(ToxWindow *self, Tox *m, uint32_t friendnum) | ||||||
| @@ -337,8 +349,9 @@ static void chat_resume_file_senders(ToxWindow *self, Tox *m, uint32_t friendnum | |||||||
|     for (i = 0; i < MAX_FILES; ++i) { |     for (i = 0; i < MAX_FILES; ++i) { | ||||||
|         struct FileTransfer *ft = &Friends.list[friendnum].file_sender[i]; |         struct FileTransfer *ft = &Friends.list[friendnum].file_sender[i]; | ||||||
|  |  | ||||||
|         if (ft->state != FILE_TRANSFER_PAUSED) |         if (ft->state != FILE_TRANSFER_PAUSED) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         TOX_ERR_FILE_SEND err; |         TOX_ERR_FILE_SEND err; | ||||||
|         ft->filenum = tox_file_send(m, friendnum, TOX_FILE_KIND_DATA, ft->file_size, ft->file_id, |         ft->filenum = tox_file_send(m, friendnum, TOX_FILE_KIND_DATA, ft->file_size, ft->file_id, | ||||||
| @@ -356,16 +369,19 @@ static void chat_resume_file_senders(ToxWindow *self, Tox *m, uint32_t friendnum | |||||||
| static void chat_onFileChunkRequest(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, uint64_t position, | static void chat_onFileChunkRequest(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, uint64_t position, | ||||||
|                                     size_t length) |                                     size_t length) | ||||||
| { | { | ||||||
|     if (friendnum != self->num) |     if (friendnum != self->num) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); |     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); | ||||||
|  |  | ||||||
|     if (!ft) |     if (!ft) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ft->state != FILE_TRANSFER_STARTED) |     if (ft->state != FILE_TRANSFER_STARTED) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char msg[MAX_STR_SIZE]; |     char msg[MAX_STR_SIZE]; | ||||||
|  |  | ||||||
| @@ -404,8 +420,9 @@ static void chat_onFileChunkRequest(ToxWindow *self, Tox *m, uint32_t friendnum, | |||||||
|     TOX_ERR_FILE_SEND_CHUNK err; |     TOX_ERR_FILE_SEND_CHUNK err; | ||||||
|     tox_file_send_chunk(m, ft->friendnum, ft->filenum, position, send_data, send_length, &err); |     tox_file_send_chunk(m, ft->friendnum, ft->filenum, position, send_data, send_length, &err); | ||||||
|  |  | ||||||
|     if (err != TOX_ERR_FILE_SEND_CHUNK_OK) |     if (err != TOX_ERR_FILE_SEND_CHUNK_OK) { | ||||||
|         fprintf(stderr, "tox_file_send_chunk failed in chat callback (error %d)\n", err); |         fprintf(stderr, "tox_file_send_chunk failed in chat callback (error %d)\n", err); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ft->position += send_length; |     ft->position += send_length; | ||||||
|     ft->bps += send_length; |     ft->bps += send_length; | ||||||
| @@ -415,16 +432,19 @@ static void chat_onFileChunkRequest(ToxWindow *self, Tox *m, uint32_t friendnum, | |||||||
| static void chat_onFileRecvChunk(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, uint64_t position, | static void chat_onFileRecvChunk(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, uint64_t position, | ||||||
|                                  const char *data, size_t length) |                                  const char *data, size_t length) | ||||||
| { | { | ||||||
|     if (friendnum != self->num) |     if (friendnum != self->num) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); |     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); | ||||||
|  |  | ||||||
|     if (!ft) |     if (!ft) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ft->state != FILE_TRANSFER_STARTED) |     if (ft->state != FILE_TRANSFER_STARTED) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char msg[MAX_STR_SIZE]; |     char msg[MAX_STR_SIZE]; | ||||||
|  |  | ||||||
| @@ -454,13 +474,15 @@ static void chat_onFileRecvChunk(ToxWindow *self, Tox *m, uint32_t friendnum, ui | |||||||
|  |  | ||||||
| static void chat_onFileControl(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, TOX_FILE_CONTROL control) | static void chat_onFileControl(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, TOX_FILE_CONTROL control) | ||||||
| { | { | ||||||
|     if (friendnum != self->num) |     if (friendnum != self->num) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); |     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); | ||||||
|  |  | ||||||
|     if (!ft) |     if (!ft) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char msg[MAX_STR_SIZE]; |     char msg[MAX_STR_SIZE]; | ||||||
|  |  | ||||||
| @@ -507,8 +529,9 @@ static bool chat_resume_broken_ft(ToxWindow *self, Tox *m, uint32_t friendnum, u | |||||||
|     char msg[MAX_STR_SIZE]; |     char msg[MAX_STR_SIZE]; | ||||||
|     uint8_t file_id[TOX_FILE_ID_LENGTH]; |     uint8_t file_id[TOX_FILE_ID_LENGTH]; | ||||||
|  |  | ||||||
|     if (!tox_file_get_file_id(m, friendnum, filenum, file_id, NULL)) |     if (!tox_file_get_file_id(m, friendnum, filenum, file_id, NULL)) { | ||||||
|         return false; |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     bool resuming = false; |     bool resuming = false; | ||||||
|     struct FileTransfer *ft = NULL; |     struct FileTransfer *ft = NULL; | ||||||
| @@ -517,8 +540,9 @@ static bool chat_resume_broken_ft(ToxWindow *self, Tox *m, uint32_t friendnum, u | |||||||
|     for (i = 0; i < MAX_FILES; ++i) { |     for (i = 0; i < MAX_FILES; ++i) { | ||||||
|         ft = &Friends.list[friendnum].file_receiver[i]; |         ft = &Friends.list[friendnum].file_receiver[i]; | ||||||
|  |  | ||||||
|         if (ft->state == FILE_TRANSFER_INACTIVE) |         if (ft->state == FILE_TRANSFER_INACTIVE) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (memcmp(ft->file_id, file_id, TOX_FILE_ID_LENGTH) == 0) { |         if (memcmp(ft->file_id, file_id, TOX_FILE_ID_LENGTH) == 0) { | ||||||
|             ft->filenum = filenum; |             ft->filenum = filenum; | ||||||
| @@ -529,14 +553,17 @@ static bool chat_resume_broken_ft(ToxWindow *self, Tox *m, uint32_t friendnum, u | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!resuming || !ft) |     if (!resuming || !ft) { | ||||||
|         return false; |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!tox_file_seek(m, ft->friendnum, ft->filenum, ft->position, NULL)) |     if (!tox_file_seek(m, ft->friendnum, ft->filenum, ft->position, NULL)) { | ||||||
|         goto on_error; |         goto on_error; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!tox_file_control(m, ft->friendnum, ft->filenum, TOX_FILE_CONTROL_RESUME, NULL)) |     if (!tox_file_control(m, ft->friendnum, ft->filenum, TOX_FILE_CONTROL_RESUME, NULL)) { | ||||||
|         goto on_error; |         goto on_error; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return true; |     return true; | ||||||
|  |  | ||||||
| @@ -549,12 +576,14 @@ on_error: | |||||||
| static void chat_onFileRecv(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, uint64_t file_size, | static void chat_onFileRecv(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, uint64_t file_size, | ||||||
|                             const char *filename, size_t name_length) |                             const char *filename, size_t name_length) | ||||||
| { | { | ||||||
|     if (self->num != friendnum) |     if (self->num != friendnum) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* first check if we need to resume a broken transfer */ |     /* first check if we need to resume a broken transfer */ | ||||||
|     if (chat_resume_broken_ft(self, m, friendnum, filenum)) |     if (chat_resume_broken_ft(self, m, friendnum, filenum)) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct FileTransfer *ft = new_file_transfer(self, friendnum, filenum, FILE_TRANSFER_RECV, TOX_FILE_KIND_DATA); |     struct FileTransfer *ft = new_file_transfer(self, friendnum, filenum, FILE_TRANSFER_RECV, TOX_FILE_KIND_DATA); | ||||||
|  |  | ||||||
| @@ -630,16 +659,19 @@ static void chat_onFileRecv(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_ | |||||||
| static void chat_onGroupInvite(ToxWindow *self, Tox *m, int32_t friendnumber, uint8_t type, const char *group_pub_key, | static void chat_onGroupInvite(ToxWindow *self, Tox *m, int32_t friendnumber, uint8_t type, const char *group_pub_key, | ||||||
|                                uint16_t length) |                                uint16_t length) | ||||||
| { | { | ||||||
|     if (self->num != friendnumber) |     if (self->num != friendnumber) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (Friends.list[friendnumber].group_invite.key != NULL) |     if (Friends.list[friendnumber].group_invite.key != NULL) { | ||||||
|         free(Friends.list[friendnumber].group_invite.key); |         free(Friends.list[friendnumber].group_invite.key); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char *k = malloc(length); |     char *k = malloc(length); | ||||||
|  |  | ||||||
|     if (k == NULL) |     if (k == NULL) { | ||||||
|         exit_toxic_err("Failed in chat_onGroupInvite", FATALERR_MEMORY); |         exit_toxic_err("Failed in chat_onGroupInvite", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     memcpy(k, group_pub_key, length); |     memcpy(k, group_pub_key, length); | ||||||
|     Friends.list[friendnumber].group_invite.key = k; |     Friends.list[friendnumber].group_invite.key = k; | ||||||
| @@ -652,10 +684,11 @@ static void chat_onGroupInvite(ToxWindow *self, Tox *m, int32_t friendnumber, ui | |||||||
|     char name[TOX_MAX_NAME_LENGTH]; |     char name[TOX_MAX_NAME_LENGTH]; | ||||||
|     get_nick_truncate(m, name, friendnumber); |     get_nick_truncate(m, name, friendnumber); | ||||||
|  |  | ||||||
|     if (self->active_box != -1) |     if (self->active_box != -1) { | ||||||
|         box_silent_notify2(self, NT_WNDALERT_2 | NT_NOFOCUS, self->active_box, "invites you to join group chat"); |         box_silent_notify2(self, NT_WNDALERT_2 | NT_NOFOCUS, self->active_box, "invites you to join group chat"); | ||||||
|     else |     } else { | ||||||
|         box_silent_notify(self, NT_WNDALERT_2 | NT_NOFOCUS, &self->active_box, name, "invites you to join group chat"); |         box_silent_notify(self, NT_WNDALERT_2 | NT_NOFOCUS, &self->active_box, name, "invites you to join group chat"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s has invited you to a group chat.", name); |     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s has invited you to a group chat.", name); | ||||||
|     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Type \"/join\" to join the chat."); |     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Type \"/join\" to join the chat."); | ||||||
| @@ -666,42 +699,48 @@ static void chat_onGroupInvite(ToxWindow *self, Tox *m, int32_t friendnumber, ui | |||||||
|  |  | ||||||
| void chat_onInvite(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | void chat_onInvite(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | ||||||
| { | { | ||||||
|     if (!self || self->num != friend_number) |     if (!self || self->num != friend_number) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* call is flagged active here */ |     /* call is flagged active here */ | ||||||
|     self->is_call = true; |     self->is_call = true; | ||||||
|  |  | ||||||
|     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Incoming audio call! Type: \"/answer\" or \"/reject\""); |     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Incoming audio call! Type: \"/answer\" or \"/reject\""); | ||||||
|  |  | ||||||
|     if (self->ringing_sound == -1) |     if (self->ringing_sound == -1) { | ||||||
|         sound_notify(self, call_incoming, NT_LOOP | user_settings->bell_on_invite, &self->ringing_sound); |         sound_notify(self, call_incoming, NT_LOOP | user_settings->bell_on_invite, &self->ringing_sound); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (self->active_box != -1) |     if (self->active_box != -1) { | ||||||
|         box_silent_notify2(self, NT_NOFOCUS | NT_WNDALERT_0, self->active_box, "Incoming audio call!"); |         box_silent_notify2(self, NT_NOFOCUS | NT_WNDALERT_0, self->active_box, "Incoming audio call!"); | ||||||
|     else |     } else { | ||||||
|         box_silent_notify(self, NT_NOFOCUS | NT_WNDALERT_0, &self->active_box, self->name, "Incoming audio call!"); |         box_silent_notify(self, NT_NOFOCUS | NT_WNDALERT_0, &self->active_box, self->name, "Incoming audio call!"); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void chat_onRinging(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | void chat_onRinging(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | ||||||
| { | { | ||||||
|     if (!self || self->num != friend_number) |     if (!self || self->num != friend_number) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Ringing...type \"/hangup\" to cancel it."); |     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Ringing...type \"/hangup\" to cancel it."); | ||||||
|  |  | ||||||
| #ifdef SOUND_NOTIFY | #ifdef SOUND_NOTIFY | ||||||
|  |  | ||||||
|     if (self->ringing_sound == -1) |     if (self->ringing_sound == -1) { | ||||||
|         sound_notify(self, call_outgoing, NT_LOOP, &self->ringing_sound); |         sound_notify(self, call_outgoing, NT_LOOP, &self->ringing_sound); | ||||||
|  |     } | ||||||
|  |  | ||||||
| #endif /* SOUND_NOTIFY */ | #endif /* SOUND_NOTIFY */ | ||||||
| } | } | ||||||
|  |  | ||||||
| void chat_onStarting(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | void chat_onStarting(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | ||||||
| { | { | ||||||
|     if (!self || self->num != friend_number) |     if (!self || self->num != friend_number) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     init_infobox(self); |     init_infobox(self); | ||||||
|  |  | ||||||
| @@ -717,8 +756,9 @@ void chat_onStarting (ToxWindow *self, ToxAV *av, uint32_t friend_number, int st | |||||||
|  |  | ||||||
| void chat_onEnding(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | void chat_onEnding(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | ||||||
| { | { | ||||||
|     if (!self || self->num != friend_number) |     if (!self || self->num != friend_number) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     kill_infobox(self); |     kill_infobox(self); | ||||||
|     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Call ended!"); |     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Call ended!"); | ||||||
| @@ -732,8 +772,9 @@ void chat_onEnding (ToxWindow *self, ToxAV *av, uint32_t friend_number, int stat | |||||||
|  |  | ||||||
| void chat_onError(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | void chat_onError(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | ||||||
| { | { | ||||||
|     if (!self || self->num != friend_number) |     if (!self || self->num != friend_number) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     self->is_call = false; |     self->is_call = false; | ||||||
|     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Error!"); |     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Error!"); | ||||||
| @@ -745,8 +786,9 @@ void chat_onError (ToxWindow *self, ToxAV *av, uint32_t friend_number, int state | |||||||
|  |  | ||||||
| void chat_onStart(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | void chat_onStart(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | ||||||
| { | { | ||||||
|     if (!self || self->num != friend_number) |     if (!self || self->num != friend_number) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* call is flagged active here */ |     /* call is flagged active here */ | ||||||
|     self->is_call = true; |     self->is_call = true; | ||||||
| @@ -762,8 +804,9 @@ void chat_onStart (ToxWindow *self, ToxAV *av, uint32_t friend_number, int state | |||||||
|  |  | ||||||
| void chat_onCancel(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | void chat_onCancel(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | ||||||
| { | { | ||||||
|     if (!self || self->num != friend_number) |     if (!self || self->num != friend_number) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     self->is_call = false; |     self->is_call = false; | ||||||
|     kill_infobox(self); |     kill_infobox(self); | ||||||
| @@ -776,8 +819,9 @@ void chat_onCancel (ToxWindow *self, ToxAV *av, uint32_t friend_number, int stat | |||||||
|  |  | ||||||
| void chat_onReject(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | void chat_onReject(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | ||||||
| { | { | ||||||
|     if (!self  || self->num != friend_number) |     if (!self  || self->num != friend_number) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Rejected!"); |     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Rejected!"); | ||||||
|     self->is_call = false; |     self->is_call = false; | ||||||
| @@ -789,8 +833,9 @@ void chat_onReject (ToxWindow *self, ToxAV *av, uint32_t friend_number, int stat | |||||||
|  |  | ||||||
| void chat_onEnd(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | void chat_onEnd(ToxWindow *self, ToxAV *av, uint32_t friend_number, int state) | ||||||
| { | { | ||||||
|     if (!self || self->num != friend_number) |     if (!self || self->num != friend_number) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     kill_infobox(self); |     kill_infobox(self); | ||||||
|     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Call ended!"); |     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Call ended!"); | ||||||
| @@ -808,8 +853,9 @@ static void init_infobox(ToxWindow *self) | |||||||
|     int x2, y2; |     int x2, y2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (y2 <= 0 || x2 <= 0) |     if (y2 <= 0 || x2 <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     (void) y2; |     (void) y2; | ||||||
|  |  | ||||||
| @@ -826,8 +872,9 @@ static void kill_infobox(ToxWindow *self) | |||||||
| { | { | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
|     if (!ctx->infobox.win) |     if (!ctx->infobox.win) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     delwin(ctx->infobox.win); |     delwin(ctx->infobox.win); | ||||||
|     memset(&ctx->infobox, 0, sizeof(struct infobox)); |     memset(&ctx->infobox, 0, sizeof(struct infobox)); | ||||||
| @@ -838,20 +885,23 @@ static void draw_infobox(ToxWindow *self) | |||||||
| { | { | ||||||
|     struct infobox *infobox = &self->chatwin->infobox; |     struct infobox *infobox = &self->chatwin->infobox; | ||||||
|  |  | ||||||
|     if (infobox->win == NULL) |     if (infobox->win == NULL) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int x2, y2; |     int x2, y2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (x2 < INFOBOX_WIDTH || y2 < INFOBOX_HEIGHT) |     if (x2 < INFOBOX_WIDTH || y2 < INFOBOX_HEIGHT) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     time_t curtime = get_unix_time(); |     time_t curtime = get_unix_time(); | ||||||
|  |  | ||||||
|     /* update elapsed time string once per second */ |     /* update elapsed time string once per second */ | ||||||
|     if (curtime > infobox->lastupdate) |     if (curtime > infobox->lastupdate) { | ||||||
|         get_elapsed_time_str(infobox->timestr, sizeof(infobox->timestr), curtime - infobox->starttime); |         get_elapsed_time_str(infobox->timestr, sizeof(infobox->timestr), curtime - infobox->starttime); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     infobox->lastupdate = curtime; |     infobox->lastupdate = curtime; | ||||||
|  |  | ||||||
| @@ -891,8 +941,9 @@ static void draw_infobox(ToxWindow *self) | |||||||
|  |  | ||||||
| static void send_action(ToxWindow *self, ChatContext *ctx, Tox *m, char *action) | static void send_action(ToxWindow *self, ChatContext *ctx, Tox *m, char *action) | ||||||
| { | { | ||||||
|     if (action == NULL) |     if (action == NULL) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char selfname[TOX_MAX_NAME_LENGTH]; |     char selfname[TOX_MAX_NAME_LENGTH]; | ||||||
|     tox_self_get_name(m, (uint8_t *) selfname); |     tox_self_get_name(m, (uint8_t *) selfname); | ||||||
| @@ -916,11 +967,13 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|     getyx(self->window, y, x); |     getyx(self->window, y, x); | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (y2 <= 0 || x2 <= 0) |     if (y2 <= 0 || x2 <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ctx->pastemode && key == '\r') |     if (ctx->pastemode && key == '\r') { | ||||||
|         key = '\n'; |         key = '\n'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (self->help->active) { |     if (self->help->active) { | ||||||
|         help_onKey(self, key); |         help_onKey(self, key); | ||||||
| @@ -930,14 +983,16 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|     if (ltr || key == '\n') {    /* char is printable */ |     if (ltr || key == '\n') {    /* char is printable */ | ||||||
|         input_new_char(self, key, x, y, x2, y2); |         input_new_char(self, key, x, y, x2, y2); | ||||||
|  |  | ||||||
|         if (ctx->line[0] != '/' && !ctx->self_is_typing && statusbar->connection != TOX_CONNECTION_NONE) |         if (ctx->line[0] != '/' && !ctx->self_is_typing && statusbar->connection != TOX_CONNECTION_NONE) { | ||||||
|             set_self_typingstatus(self, m, 1); |             set_self_typingstatus(self, m, 1); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (line_info_onKey(self, key)) |     if (line_info_onKey(self, key)) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     input_handle(self, key, x, y, x2, y2); |     input_handle(self, key, x, y, x2, y2); | ||||||
|  |  | ||||||
| @@ -988,8 +1043,9 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|  |  | ||||||
|             char line[MAX_STR_SIZE] = {0}; |             char line[MAX_STR_SIZE] = {0}; | ||||||
|  |  | ||||||
|             if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1) |             if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1) { | ||||||
|                 memset(&line, 0, sizeof(line)); |                 memset(&line, 0, sizeof(line)); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if (line[0] == '/') { |             if (line[0] == '/') { | ||||||
|                 if (strcmp(line, "/close") == 0) { |                 if (strcmp(line, "/close") == 0) { | ||||||
| @@ -1020,17 +1076,19 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|         reset_buf(ctx); |         reset_buf(ctx); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (ctx->len <= 0 && ctx->self_is_typing) |     if (ctx->len <= 0 && ctx->self_is_typing) { | ||||||
|         set_self_typingstatus(self, m, 0); |         set_self_typingstatus(self, m, 0); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| static void chat_onDraw(ToxWindow *self, Tox *m) | static void chat_onDraw(ToxWindow *self, Tox *m) | ||||||
| { | { | ||||||
|     int x2, y2; |     int x2, y2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (y2 <= 0 || x2 <= 0) |     if (y2 <= 0 || x2 <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
| @@ -1042,8 +1100,9 @@ static void chat_onDraw(ToxWindow *self, Tox *m) | |||||||
|  |  | ||||||
|     curs_set(1); |     curs_set(1); | ||||||
|  |  | ||||||
|     if (ctx->len > 0) |     if (ctx->len > 0) { | ||||||
|         mvwprintw(ctx->linewin, 1, 0, "%ls", &ctx->line[ctx->start]); |         mvwprintw(ctx->linewin, 1, 0, "%ls", &ctx->line[ctx->start]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* Draw status bar */ |     /* Draw status bar */ | ||||||
|     StatusBar *statusbar = self->stb; |     StatusBar *statusbar = self->stb; | ||||||
| @@ -1073,15 +1132,17 @@ static void chat_onDraw(ToxWindow *self, Tox *m) | |||||||
|         wprintw(statusbar->topline, " %s", ONLINE_CHAR); |         wprintw(statusbar->topline, " %s", ONLINE_CHAR); | ||||||
|         wattroff(statusbar->topline, COLOR_PAIR(colour) | A_BOLD); |         wattroff(statusbar->topline, COLOR_PAIR(colour) | A_BOLD); | ||||||
|  |  | ||||||
|         if (Friends.list[self->num].is_typing) |         if (Friends.list[self->num].is_typing) { | ||||||
|             wattron(statusbar->topline, COLOR_PAIR(YELLOW)); |             wattron(statusbar->topline, COLOR_PAIR(YELLOW)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         wattron(statusbar->topline, A_BOLD); |         wattron(statusbar->topline, A_BOLD); | ||||||
|         wprintw(statusbar->topline, " %s ", statusbar->nick); |         wprintw(statusbar->topline, " %s ", statusbar->nick); | ||||||
|         wattroff(statusbar->topline, A_BOLD); |         wattroff(statusbar->topline, A_BOLD); | ||||||
|  |  | ||||||
|         if (Friends.list[self->num].is_typing) |         if (Friends.list[self->num].is_typing) { | ||||||
|             wattroff(statusbar->topline, COLOR_PAIR(YELLOW)); |             wattroff(statusbar->topline, COLOR_PAIR(YELLOW)); | ||||||
|  |         } | ||||||
|     } else { |     } else { | ||||||
|         wprintw(statusbar->topline, " %s", OFFLINE_CHAR); |         wprintw(statusbar->topline, " %s", OFFLINE_CHAR); | ||||||
|         wattron(statusbar->topline, A_BOLD); |         wattron(statusbar->topline, A_BOLD); | ||||||
| @@ -1114,8 +1175,9 @@ static void chat_onDraw(ToxWindow *self, Tox *m) | |||||||
|         statusbar->statusmsg_len = maxlen; |         statusbar->statusmsg_len = maxlen; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (statusbar->statusmsg[0]) |     if (statusbar->statusmsg[0]) { | ||||||
|         wprintw(statusbar->topline, ": %s ", statusbar->statusmsg); |         wprintw(statusbar->topline, ": %s ", statusbar->statusmsg); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wclrtoeol(statusbar->topline); |     wclrtoeol(statusbar->topline); | ||||||
|     wmove(statusbar->topline, 0, x2 - (KEY_IDENT_DIGITS * 2) - 3); |     wmove(statusbar->topline, 0, x2 - (KEY_IDENT_DIGITS * 2) - 3); | ||||||
| @@ -1123,8 +1185,9 @@ static void chat_onDraw(ToxWindow *self, Tox *m) | |||||||
|  |  | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < KEY_IDENT_DIGITS; ++i) |     for (i = 0; i < KEY_IDENT_DIGITS; ++i) { | ||||||
|         wprintw(statusbar->topline, "%02X", Friends.list[self->num].pub_key[i] & 0xff); |         wprintw(statusbar->topline, "%02X", Friends.list[self->num].pub_key[i] & 0xff); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wprintw(statusbar->topline, "}\n"); |     wprintw(statusbar->topline, "}\n"); | ||||||
|  |  | ||||||
| @@ -1146,8 +1209,9 @@ static void chat_onDraw(ToxWindow *self, Tox *m) | |||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     if (self->help->active) |     if (self->help->active) { | ||||||
|         help_onDraw(self); |         help_onDraw(self); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pthread_mutex_lock(&Winthread.lock); |     pthread_mutex_lock(&Winthread.lock); | ||||||
|     refresh_file_transfer_progress(self, m, self->num); |     refresh_file_transfer_progress(self, m, self->num); | ||||||
| @@ -1160,8 +1224,9 @@ static void chat_onInit(ToxWindow *self, Tox *m) | |||||||
|     int x2, y2; |     int x2, y2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (y2 <= 0 || x2 <= 0) |     if (y2 <= 0 || x2 <= 0) { | ||||||
|         exit_toxic_err("failed in chat_onInit", FATALERR_CURSES); |         exit_toxic_err("failed in chat_onInit", FATALERR_CURSES); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     self->x = x2; |     self->x = x2; | ||||||
|  |  | ||||||
| @@ -1196,8 +1261,9 @@ static void chat_onInit(ToxWindow *self, Tox *m) | |||||||
|     ctx->log = calloc(1, sizeof(struct chatlog)); |     ctx->log = calloc(1, sizeof(struct chatlog)); | ||||||
|     ctx->cqueue = calloc(1, sizeof(struct chat_queue)); |     ctx->cqueue = calloc(1, sizeof(struct chat_queue)); | ||||||
|  |  | ||||||
|     if (ctx->log == NULL || ctx->hst == NULL || ctx->cqueue == NULL) |     if (ctx->log == NULL || ctx->hst == NULL || ctx->cqueue == NULL) { | ||||||
|         exit_toxic_err("failed in chat_onInit", FATALERR_MEMORY); |         exit_toxic_err("failed in chat_onInit", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     line_info_init(ctx->hst); |     line_info_init(ctx->hst); | ||||||
|  |  | ||||||
| @@ -1207,10 +1273,11 @@ static void chat_onInit(ToxWindow *self, Tox *m) | |||||||
|     int log_ret = log_enable(nick, myid, Friends.list[self->num].pub_key, ctx->log, LOG_CHAT); |     int log_ret = log_enable(nick, myid, Friends.list[self->num].pub_key, ctx->log, LOG_CHAT); | ||||||
|     load_chat_history(self, ctx->log); |     load_chat_history(self, ctx->log); | ||||||
|  |  | ||||||
|     if (!Friends.list[self->num].logging_on) |     if (!Friends.list[self->num].logging_on) { | ||||||
|         log_disable(ctx->log); |         log_disable(ctx->log); | ||||||
|     else if (log_ret == -1) |     } else if (log_ret == -1) { | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Warning: Log failed to initialize."); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Warning: Log failed to initialize."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     execute(ctx->history, self, m, "/log", GLOBAL_COMMAND_MODE); |     execute(ctx->history, self, m, "/log", GLOBAL_COMMAND_MODE); | ||||||
|  |  | ||||||
| @@ -1268,8 +1335,9 @@ ToxWindow new_chat(Tox *m, uint32_t friendnum) | |||||||
|     StatusBar *stb = calloc(1, sizeof(StatusBar)); |     StatusBar *stb = calloc(1, sizeof(StatusBar)); | ||||||
|     Help *help = calloc(1, sizeof(Help)); |     Help *help = calloc(1, sizeof(Help)); | ||||||
|  |  | ||||||
|     if (stb == NULL || chatwin == NULL || help == NULL) |     if (stb == NULL || chatwin == NULL || help == NULL) { | ||||||
|         exit_toxic_err("failed in new_chat", FATALERR_MEMORY); |         exit_toxic_err("failed in new_chat", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ret.chatwin = chatwin; |     ret.chatwin = chatwin; | ||||||
|     ret.stb = stb; |     ret.stb = stb; | ||||||
|   | |||||||
| @@ -175,8 +175,9 @@ void cmd_savefile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv | |||||||
|     TOX_ERR_FILE_CONTROL err; |     TOX_ERR_FILE_CONTROL err; | ||||||
|     tox_file_control(m, self->num, ft->filenum, TOX_FILE_CONTROL_RESUME, &err); |     tox_file_control(m, self->num, ft->filenum, TOX_FILE_CONTROL_RESUME, &err); | ||||||
|  |  | ||||||
|     if (err != TOX_ERR_FILE_CONTROL_OK) |     if (err != TOX_ERR_FILE_CONTROL_OK) { | ||||||
|         goto on_recv_error; |         goto on_recv_error; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Saving file [%d] as: '%s'", idx, ft->file_path); |     line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Saving file [%d] as: '%s'", idx, ft->file_path); | ||||||
|  |  | ||||||
| @@ -262,8 +263,9 @@ void cmd_sendfile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv | |||||||
|     uint32_t filenum = tox_file_send(m, self->num, TOX_FILE_KIND_DATA, (uint64_t) filesize, NULL, |     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) |     if (err != TOX_ERR_FILE_SEND_OK) { | ||||||
|         goto on_send_error; |         goto on_send_error; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct FileTransfer *ft = new_file_transfer(self, self->num, filenum, FILE_TRANSFER_SEND, TOX_FILE_KIND_DATA); |     struct FileTransfer *ft = new_file_transfer(self, self->num, filenum, FILE_TRANSFER_SEND, TOX_FILE_KIND_DATA); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -48,8 +48,9 @@ void get_home_dir(char *home, int size) | |||||||
|     } else { |     } else { | ||||||
|         hmstr = getenv("HOME"); |         hmstr = getenv("HOME"); | ||||||
|  |  | ||||||
|         if (hmstr == NULL) |         if (hmstr == NULL) { | ||||||
|             return; |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         snprintf(buf, sizeof(buf), "%s", hmstr); |         snprintf(buf, sizeof(buf), "%s", hmstr); | ||||||
|         hmstr = buf; |         hmstr = buf; | ||||||
| @@ -77,8 +78,9 @@ char *get_user_config_dir(void) | |||||||
|     len = strlen(home) + strlen("/Library/Application Support") + 1; |     len = strlen(home) + strlen("/Library/Application Support") + 1; | ||||||
|     user_config_dir = malloc(len); |     user_config_dir = malloc(len); | ||||||
|  |  | ||||||
|     if (user_config_dir == NULL) |     if (user_config_dir == NULL) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     snprintf(user_config_dir, len, "%s/Library/Application Support", home); |     snprintf(user_config_dir, len, "%s/Library/Application Support", home); | ||||||
| # else /* __APPLE__ */ | # else /* __APPLE__ */ | ||||||
| @@ -89,8 +91,9 @@ char *get_user_config_dir(void) | |||||||
|         len = strlen(home) + strlen("/.config") + 1; |         len = strlen(home) + strlen("/.config") + 1; | ||||||
|         user_config_dir = malloc(len); |         user_config_dir = malloc(len); | ||||||
|  |  | ||||||
|         if (user_config_dir == NULL) |         if (user_config_dir == NULL) { | ||||||
|             return NULL; |             return NULL; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         snprintf(user_config_dir, len, "%s/.config", home); |         snprintf(user_config_dir, len, "%s/.config", home); | ||||||
|     } else { |     } else { | ||||||
| @@ -112,14 +115,16 @@ int create_user_config_dirs(char *path) | |||||||
|     struct stat buf; |     struct stat buf; | ||||||
|     int mkdir_err = mkdir(path, 0700); |     int mkdir_err = mkdir(path, 0700); | ||||||
|  |  | ||||||
|     if (mkdir_err && (errno != EEXIST || stat(path, &buf) || !S_ISDIR(buf.st_mode))) |     if (mkdir_err && (errno != EEXIST || stat(path, &buf) || !S_ISDIR(buf.st_mode))) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char *fullpath = malloc(strlen(path) + strlen(CONFIGDIR) + 1); |     char *fullpath = malloc(strlen(path) + strlen(CONFIGDIR) + 1); | ||||||
|     char *logpath = malloc(strlen(path) + strlen(LOGDIR) + 1); |     char *logpath = malloc(strlen(path) + strlen(LOGDIR) + 1); | ||||||
|  |  | ||||||
|     if (fullpath == NULL || logpath == NULL) |     if (fullpath == NULL || logpath == NULL) { | ||||||
|         exit_toxic_err("failed in load_data_structures", FATALERR_MEMORY); |         exit_toxic_err("failed in load_data_structures", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     strcpy(fullpath, path); |     strcpy(fullpath, path); | ||||||
|     strcat(fullpath, CONFIGDIR); |     strcat(fullpath, CONFIGDIR); | ||||||
|   | |||||||
| @@ -36,8 +36,9 @@ | |||||||
|  */ |  */ | ||||||
| int set_curl_proxy(CURL *c_handle, const char *proxy_address, uint16_t port, uint8_t proxy_type) | int set_curl_proxy(CURL *c_handle, const char *proxy_address, uint16_t port, uint8_t proxy_type) | ||||||
| { | { | ||||||
|     if (proxy_type == TOX_PROXY_TYPE_NONE) |     if (proxy_type == TOX_PROXY_TYPE_NONE) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (proxy_address == NULL || port == 0) { |     if (proxy_address == NULL || port == 0) { | ||||||
|         return -1; |         return -1; | ||||||
|   | |||||||
| @@ -113,8 +113,9 @@ static int parse_command(WINDOW *w, ToxWindow *self, const char *input, char (*a | |||||||
| { | { | ||||||
|     char *cmd = strdup(input); |     char *cmd = strdup(input); | ||||||
|  |  | ||||||
|     if (cmd == NULL) |     if (cmd == NULL) { | ||||||
|         exit_toxic_err("failed in parse_command", FATALERR_MEMORY); |         exit_toxic_err("failed in parse_command", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int num_args = 0; |     int num_args = 0; | ||||||
|     int i = 0;    /* index of last char in an argument */ |     int i = 0;    /* index of last char in an argument */ | ||||||
| @@ -140,8 +141,9 @@ static int parse_command(WINDOW *w, ToxWindow *self, const char *input, char (*a | |||||||
|         memcpy(args[num_args], cmd, i + qt_ofst); |         memcpy(args[num_args], cmd, i + qt_ofst); | ||||||
|         args[num_args++][i + qt_ofst] = '\0'; |         args[num_args++][i + qt_ofst] = '\0'; | ||||||
|  |  | ||||||
|         if (cmd[i] == '\0')    /* no more args */ |         if (cmd[i] == '\0') {  /* no more args */ | ||||||
|             break; |             break; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         char tmp[MAX_STR_SIZE]; |         char tmp[MAX_STR_SIZE]; | ||||||
|         snprintf(tmp, sizeof(tmp), "%s", &cmd[i + 1]); |         snprintf(tmp, sizeof(tmp), "%s", &cmd[i + 1]); | ||||||
| @@ -170,14 +172,16 @@ static int do_command(WINDOW *w, ToxWindow *self, Tox *m, int num_args, struct c | |||||||
|  |  | ||||||
| void execute(WINDOW *w, ToxWindow *self, Tox *m, const char *input, int mode) | void execute(WINDOW *w, ToxWindow *self, Tox *m, const char *input, int mode) | ||||||
| { | { | ||||||
|     if (string_is_empty(input)) |     if (string_is_empty(input)) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char args[MAX_NUM_ARGS][MAX_STR_SIZE]; |     char args[MAX_NUM_ARGS][MAX_STR_SIZE]; | ||||||
|     int num_args = parse_command(w, self, input, args); |     int num_args = parse_command(w, self, input, args); | ||||||
|  |  | ||||||
|     if (num_args == -1) |     if (num_args == -1) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* Try to match input command to command functions. If non-global command mode is specified, |     /* Try to match input command to command functions. If non-global command mode is specified, | ||||||
|        try specified mode's commands first, then upon failure try global commands. |        try specified mode's commands first, then upon failure try global commands. | ||||||
| @@ -185,25 +189,29 @@ void execute(WINDOW *w, ToxWindow *self, Tox *m, const char *input, int mode) | |||||||
|        Note: Global commands must come last in case of duplicate command names */ |        Note: Global commands must come last in case of duplicate command names */ | ||||||
|     switch (mode) { |     switch (mode) { | ||||||
|         case CHAT_COMMAND_MODE: |         case CHAT_COMMAND_MODE: | ||||||
|             if (do_command(w, self, m, num_args, chat_commands, args) == 0) |             if (do_command(w, self, m, num_args, chat_commands, args) == 0) { | ||||||
|                 return; |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         case GROUPCHAT_COMMAND_MODE: |         case GROUPCHAT_COMMAND_MODE: | ||||||
|             if (do_command(w, self, m, num_args, group_commands, args) == 0) |             if (do_command(w, self, m, num_args, group_commands, args) == 0) { | ||||||
|                 return; |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             break; |             break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (do_command(w, self, m, num_args, global_commands, args) == 0) |     if (do_command(w, self, m, num_args, global_commands, args) == 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #ifdef PYTHON | #ifdef PYTHON | ||||||
|  |  | ||||||
|     if (do_plugin_command(num_args, args) == 0) |     if (do_plugin_command(num_args, args) == 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -45,8 +45,9 @@ void init_progress_bar(char *progline) | |||||||
|     strcpy(progline, "0% ["); |     strcpy(progline, "0% ["); | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < NUM_PROG_MARKS; ++i) |     for (i = 0; i < NUM_PROG_MARKS; ++i) { | ||||||
|         strcat(progline, "-"); |         strcat(progline, "-"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     strcat(progline, "] 0.0 B/s"); |     strcat(progline, "] 0.0 B/s"); | ||||||
| } | } | ||||||
| @@ -54,8 +55,9 @@ void init_progress_bar(char *progline) | |||||||
| /* prints a progress bar for file transfers. */ | /* prints a progress bar for file transfers. */ | ||||||
| void print_progress_bar(ToxWindow *self, double bps, double pct_done, uint32_t line_id) | void print_progress_bar(ToxWindow *self, double bps, double pct_done, uint32_t line_id) | ||||||
| { | { | ||||||
|     if (bps < 0 || pct_done < 0 || pct_done > 100) |     if (bps < 0 || pct_done < 0 || pct_done > 100) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char pct_str[24]; |     char pct_str[24]; | ||||||
|     snprintf(pct_str, sizeof(pct_str), "%.1f%%", pct_done); |     snprintf(pct_str, sizeof(pct_str), "%.1f%%", pct_done); | ||||||
| @@ -67,14 +69,17 @@ void print_progress_bar(ToxWindow *self, double bps, double pct_done, uint32_t l | |||||||
|     int n = pct_done / (100 / NUM_PROG_MARKS); |     int n = pct_done / (100 / NUM_PROG_MARKS); | ||||||
|     int i, j; |     int i, j; | ||||||
|  |  | ||||||
|     for (i = 0; i < n; ++i) |     for (i = 0; i < n; ++i) { | ||||||
|         strcat(prog_line, "="); |         strcat(prog_line, "="); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (pct_done < 100) |     if (pct_done < 100) { | ||||||
|         strcpy(prog_line + n, ">"); |         strcpy(prog_line + n, ">"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     for (j = i; j < NUM_PROG_MARKS - 1; ++j) |     for (j = i; j < NUM_PROG_MARKS - 1; ++j) { | ||||||
|         strcat(prog_line, "-"); |         strcat(prog_line, "-"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char full_line[strlen(pct_str) + NUM_PROG_MARKS + strlen(bps_str) + 7]; |     char full_line[strlen(pct_str) + NUM_PROG_MARKS + strlen(bps_str) + 7]; | ||||||
|     snprintf(full_line, sizeof(full_line), "%s [%s] %s/s", pct_str, prog_line, bps_str); |     snprintf(full_line, sizeof(full_line), "%s [%s] %s/s", pct_str, prog_line, bps_str); | ||||||
| @@ -84,12 +89,14 @@ void print_progress_bar(ToxWindow *self, double bps, double pct_done, uint32_t l | |||||||
|  |  | ||||||
| static void refresh_progress_helper(ToxWindow *self, Tox *m, struct FileTransfer *ft) | static void refresh_progress_helper(ToxWindow *self, Tox *m, struct FileTransfer *ft) | ||||||
| { | { | ||||||
|     if (ft->state == FILE_TRANSFER_INACTIVE) |     if (ft->state == FILE_TRANSFER_INACTIVE) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* Timeout must be set to 1 second to show correct bytes per second */ |     /* Timeout must be set to 1 second to show correct bytes per second */ | ||||||
|     if (!timed_out(ft->last_line_progress, 1)) |     if (!timed_out(ft->last_line_progress, 1)) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     double remain = ft->file_size - ft->position; |     double remain = ft->file_size - ft->position; | ||||||
|     double pct_done = remain > 0 ? (1 - (remain / ft->file_size)) * 100 : 100; |     double pct_done = remain > 0 ? (1 - (remain / ft->file_size)) * 100 : 100; | ||||||
| @@ -120,14 +127,16 @@ struct FileTransfer *get_file_transfer_struct(uint32_t friendnum, uint32_t filen | |||||||
|     for (i = 0; i < MAX_FILES; ++i) { |     for (i = 0; i < MAX_FILES; ++i) { | ||||||
|         struct FileTransfer *ft_send = &Friends.list[friendnum].file_sender[i]; |         struct FileTransfer *ft_send = &Friends.list[friendnum].file_sender[i]; | ||||||
|  |  | ||||||
|         if (ft_send->state != FILE_TRANSFER_INACTIVE && ft_send->filenum == filenum) |         if (ft_send->state != FILE_TRANSFER_INACTIVE && ft_send->filenum == filenum) { | ||||||
|             return ft_send; |             return ft_send; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         struct FileTransfer *ft_recv = &Friends.list[friendnum].file_receiver[i]; |         struct FileTransfer *ft_recv = &Friends.list[friendnum].file_receiver[i]; | ||||||
|  |  | ||||||
|         if (ft_recv->state != FILE_TRANSFER_INACTIVE && ft_recv->filenum == filenum) |         if (ft_recv->state != FILE_TRANSFER_INACTIVE && ft_recv->filenum == filenum) { | ||||||
|             return ft_recv; |             return ft_recv; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
| @@ -138,8 +147,9 @@ struct FileTransfer *get_file_transfer_struct(uint32_t friendnum, uint32_t filen | |||||||
| struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnum, uint32_t index, | 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) |     if (direction != FILE_TRANSFER_RECV && direction != FILE_TRANSFER_SEND) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
| @@ -148,9 +158,10 @@ struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnum, uint32_t | |||||||
|                                       &Friends.list[friendnum].file_sender[i] : |                                       &Friends.list[friendnum].file_sender[i] : | ||||||
|                                       &Friends.list[friendnum].file_receiver[i]; |                                       &Friends.list[friendnum].file_receiver[i]; | ||||||
|  |  | ||||||
|         if (ft->state != FILE_TRANSFER_INACTIVE && ft->index == index) |         if (ft->state != FILE_TRANSFER_INACTIVE && ft->index == index) { | ||||||
|             return ft; |             return ft; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
| @@ -215,11 +226,13 @@ static struct FileTransfer *new_file_receiver(ToxWindow *window, uint32_t friend | |||||||
| struct FileTransfer *new_file_transfer(ToxWindow *window, uint32_t friendnum, uint32_t filenum, | struct FileTransfer *new_file_transfer(ToxWindow *window, uint32_t friendnum, uint32_t filenum, | ||||||
|                                        FILE_TRANSFER_DIRECTION direction, uint8_t type) |                                        FILE_TRANSFER_DIRECTION direction, uint8_t type) | ||||||
| { | { | ||||||
|     if (direction == FILE_TRANSFER_RECV) |     if (direction == FILE_TRANSFER_RECV) { | ||||||
|         return new_file_receiver(window, friendnum, filenum, type); |         return new_file_receiver(window, friendnum, filenum, type); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (direction == FILE_TRANSFER_SEND) |     if (direction == FILE_TRANSFER_SEND) { | ||||||
|         return new_file_sender(window, friendnum, filenum, type); |         return new_file_sender(window, friendnum, filenum, type); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
| @@ -233,23 +246,28 @@ struct FileTransfer *new_file_transfer(ToxWindow *window, uint32_t friendnum, ui | |||||||
| void close_file_transfer(ToxWindow *self, Tox *m, struct FileTransfer *ft, int CTRL, const char *message, | void close_file_transfer(ToxWindow *self, Tox *m, struct FileTransfer *ft, int CTRL, const char *message, | ||||||
|                          Notification sound_type) |                          Notification sound_type) | ||||||
| { | { | ||||||
|     if (!ft) |     if (!ft) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ft->state == FILE_TRANSFER_INACTIVE) |     if (ft->state == FILE_TRANSFER_INACTIVE) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ft->file) |     if (ft->file) { | ||||||
|         fclose(ft->file); |         fclose(ft->file); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (CTRL >= 0) |     if (CTRL >= 0) { | ||||||
|         tox_file_control(m, ft->friendnum, ft->filenum, (TOX_FILE_CONTROL) CTRL, NULL); |         tox_file_control(m, ft->friendnum, ft->filenum, (TOX_FILE_CONTROL) CTRL, NULL); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (message && self) { |     if (message && self) { | ||||||
|         if (self->active_box != -1 && sound_type != silent) |         if (self->active_box != -1 && sound_type != silent) { | ||||||
|             box_notify2(self, sound_type, NT_NOFOCUS | NT_WNDALERT_2, self->active_box, "%s", message); |             box_notify2(self, sound_type, NT_NOFOCUS | NT_WNDALERT_2, self->active_box, "%s", message); | ||||||
|         else |         } else { | ||||||
|             box_notify(self, sound_type, NT_NOFOCUS | NT_WNDALERT_2, &self->active_box, self->name, "%s", message); |             box_notify(self, sound_type, NT_NOFOCUS | NT_WNDALERT_2, &self->active_box, self->name, "%s", message); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s", message); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s", message); | ||||||
|     } |     } | ||||||
| @@ -272,6 +290,7 @@ void kill_all_file_transfers(Tox *m) | |||||||
| { | { | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < Friends.max_idx; ++i) |     for (i = 0; i < Friends.max_idx; ++i) { | ||||||
|         kill_all_file_transfers_friend(m, Friends.list[i].num); |         kill_all_file_transfers_friend(m, Friends.list[i].num); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										197
									
								
								src/friendlist.c
									
									
									
									
									
								
							
							
						
						
									
										197
									
								
								src/friendlist.c
									
									
									
									
									
								
							| @@ -84,8 +84,9 @@ static void realloc_friends(int n) | |||||||
|     ToxicFriend *f = realloc(Friends.list, n * sizeof(ToxicFriend)); |     ToxicFriend *f = realloc(Friends.list, n * sizeof(ToxicFriend)); | ||||||
|     uint32_t *f_idx = realloc(Friends.index, n * sizeof(uint32_t)); |     uint32_t *f_idx = realloc(Friends.index, n * sizeof(uint32_t)); | ||||||
|  |  | ||||||
|     if (f == NULL || f_idx == NULL) |     if (f == NULL || f_idx == NULL) { | ||||||
|         exit_toxic_err("failed in realloc_friends", FATALERR_MEMORY); |         exit_toxic_err("failed in realloc_friends", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Friends.list = f; |     Friends.list = f; | ||||||
|     Friends.index = f_idx; |     Friends.index = f_idx; | ||||||
| @@ -104,8 +105,9 @@ static void realloc_blocklist(int n) | |||||||
|     BlockedFriend *b = realloc(Blocked.list, n * sizeof(BlockedFriend)); |     BlockedFriend *b = realloc(Blocked.list, n * sizeof(BlockedFriend)); | ||||||
|     uint32_t *b_idx = realloc(Blocked.index, n * sizeof(uint32_t)); |     uint32_t *b_idx = realloc(Blocked.index, n * sizeof(uint32_t)); | ||||||
|  |  | ||||||
|     if (b == NULL || b_idx == NULL) |     if (b == NULL || b_idx == NULL) { | ||||||
|         exit_toxic_err("failed in realloc_blocklist", FATALERR_MEMORY); |         exit_toxic_err("failed in realloc_blocklist", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Blocked.list = b; |     Blocked.list = b; | ||||||
|     Blocked.index = b_idx; |     Blocked.index = b_idx; | ||||||
| @@ -116,9 +118,10 @@ void kill_friendlist(void) | |||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < Friends.max_idx; ++i) { |     for (i = 0; i < Friends.max_idx; ++i) { | ||||||
|         if (Friends.list[i].active && Friends.list[i].group_invite.key != NULL) |         if (Friends.list[i].active && Friends.list[i].group_invite.key != NULL) { | ||||||
|             free(Friends.list[i].group_invite.key); |             free(Friends.list[i].group_invite.key); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     realloc_blocklist(0); |     realloc_blocklist(0); | ||||||
|     realloc_friends(0); |     realloc_friends(0); | ||||||
| @@ -215,13 +218,15 @@ static void sort_blocklist_index(void); | |||||||
|  |  | ||||||
| int load_blocklist(char *path) | int load_blocklist(char *path) | ||||||
| { | { | ||||||
|     if (path == NULL) |     if (path == NULL) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     FILE *fp = fopen(path, "rb"); |     FILE *fp = fopen(path, "rb"); | ||||||
|  |  | ||||||
|     if (fp == NULL) |     if (fp == NULL) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     off_t len = file_size(path); |     off_t len = file_size(path); | ||||||
|  |  | ||||||
| @@ -298,9 +303,10 @@ void sort_friendlist_index(void) | |||||||
|     uint32_t n = 0; |     uint32_t n = 0; | ||||||
|  |  | ||||||
|     for (i = 0; i < Friends.max_idx; ++i) { |     for (i = 0; i < Friends.max_idx; ++i) { | ||||||
|         if (Friends.list[i].active) |         if (Friends.list[i].active) { | ||||||
|             Friends.index[n++] = Friends.list[i].num; |             Friends.index[n++] = Friends.list[i].num; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     qsort(Friends.index, Friends.num_friends, sizeof(uint32_t), index_name_cmp); |     qsort(Friends.index, Friends.num_friends, sizeof(uint32_t), index_name_cmp); | ||||||
| } | } | ||||||
| @@ -316,9 +322,10 @@ static void sort_blocklist_index(void) | |||||||
|     uint32_t n = 0; |     uint32_t n = 0; | ||||||
|  |  | ||||||
|     for (i = 0; i < Blocked.max_idx; ++i) { |     for (i = 0; i < Blocked.max_idx; ++i) { | ||||||
|         if (Blocked.list[i].active) |         if (Blocked.list[i].active) { | ||||||
|             Blocked.index[n++] = Blocked.list[i].num; |             Blocked.index[n++] = Blocked.list[i].num; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     qsort(Blocked.index, Blocked.num_blocked, sizeof(uint32_t), index_name_cmp_block); |     qsort(Blocked.index, Blocked.num_blocked, sizeof(uint32_t), index_name_cmp_block); | ||||||
| } | } | ||||||
| @@ -337,11 +344,13 @@ static void update_friend_last_online(uint32_t num, time_t timestamp) | |||||||
| static void friendlist_onMessage(ToxWindow *self, Tox *m, uint32_t num, TOX_MESSAGE_TYPE type, const char *str, | static void friendlist_onMessage(ToxWindow *self, Tox *m, uint32_t num, TOX_MESSAGE_TYPE type, const char *str, | ||||||
|                                  size_t length) |                                  size_t length) | ||||||
| { | { | ||||||
|     if (num >= Friends.max_idx) |     if (num >= Friends.max_idx) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (Friends.list[num].chatwin != -1) |     if (Friends.list[num].chatwin != -1) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (get_num_active_windows() < MAX_WINDOWS_NUM) { |     if (get_num_active_windows() < MAX_WINDOWS_NUM) { | ||||||
|         Friends.list[num].chatwin = add_window(m, new_chat(m, Friends.list[num].num)); |         Friends.list[num].chatwin = add_window(m, new_chat(m, Friends.list[num].num)); | ||||||
| @@ -361,17 +370,19 @@ static void friendlist_onMessage(ToxWindow *self, Tox *m, uint32_t num, TOX_MESS | |||||||
|  |  | ||||||
| static void friendlist_onConnectionChange(ToxWindow *self, Tox *m, uint32_t num, TOX_CONNECTION connection_status) | static void friendlist_onConnectionChange(ToxWindow *self, Tox *m, uint32_t num, TOX_CONNECTION connection_status) | ||||||
| { | { | ||||||
|     if (num >= Friends.max_idx) |     if (num >= Friends.max_idx) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (connection_status == TOX_CONNECTION_NONE) { |     if (connection_status == TOX_CONNECTION_NONE) { | ||||||
|         --Friends.num_online; |         --Friends.num_online; | ||||||
|     } else if (Friends.list[num].connection_status == TOX_CONNECTION_NONE) { |     } else if (Friends.list[num].connection_status == TOX_CONNECTION_NONE) { | ||||||
|         ++Friends.num_online; |         ++Friends.num_online; | ||||||
|  |  | ||||||
|         if (avatar_send(m, num) == -1) |         if (avatar_send(m, num) == -1) { | ||||||
|             fprintf(stderr, "avatar_send failed for friend %d\n", num); |             fprintf(stderr, "avatar_send failed for friend %d\n", num); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Friends.list[num].connection_status = connection_status; |     Friends.list[num].connection_status = connection_status; | ||||||
|     update_friend_last_online(num, get_unix_time()); |     update_friend_last_online(num, get_unix_time()); | ||||||
| @@ -381,8 +392,9 @@ static void friendlist_onConnectionChange(ToxWindow *self, Tox *m, uint32_t num, | |||||||
|  |  | ||||||
| static void friendlist_onNickChange(ToxWindow *self, Tox *m, uint32_t num, const char *nick, size_t length) | static void friendlist_onNickChange(ToxWindow *self, Tox *m, uint32_t num, const char *nick, size_t length) | ||||||
| { | { | ||||||
|     if (num >= Friends.max_idx) |     if (num >= Friends.max_idx) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* save old name for log renaming */ |     /* save old name for log renaming */ | ||||||
|     char oldname[TOXIC_MAX_NAME_LENGTH + 1]; |     char oldname[TOXIC_MAX_NAME_LENGTH + 1]; | ||||||
| @@ -398,24 +410,27 @@ static void friendlist_onNickChange(ToxWindow *self, Tox *m, uint32_t num, const | |||||||
|     strcpy(newnamecpy, Friends.list[num].name); |     strcpy(newnamecpy, Friends.list[num].name); | ||||||
|     tox_self_get_address(m, (uint8_t *) myid); |     tox_self_get_address(m, (uint8_t *) myid); | ||||||
|  |  | ||||||
|     if (strcmp(oldname, newnamecpy) != 0) |     if (strcmp(oldname, newnamecpy) != 0) { | ||||||
|         rename_logfile(oldname, newnamecpy, myid, Friends.list[num].pub_key, Friends.list[num].chatwin); |         rename_logfile(oldname, newnamecpy, myid, Friends.list[num].pub_key, Friends.list[num].chatwin); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     sort_friendlist_index(); |     sort_friendlist_index(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void friendlist_onStatusChange(ToxWindow *self, Tox *m, uint32_t num, TOX_USER_STATUS status) | static void friendlist_onStatusChange(ToxWindow *self, Tox *m, uint32_t num, TOX_USER_STATUS status) | ||||||
| { | { | ||||||
|     if (num >= Friends.max_idx) |     if (num >= Friends.max_idx) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Friends.list[num].status = status; |     Friends.list[num].status = status; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void friendlist_onStatusMessageChange(ToxWindow *self, uint32_t num, const char *note, size_t length) | static void friendlist_onStatusMessageChange(ToxWindow *self, uint32_t num, const char *note, size_t length) | ||||||
| { | { | ||||||
|     if (length > TOX_MAX_STATUS_MESSAGE_LENGTH || num >= Friends.max_idx) |     if (length > TOX_MAX_STATUS_MESSAGE_LENGTH || num >= Friends.max_idx) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     snprintf(Friends.list[num].statusmsg, sizeof(Friends.list[num].statusmsg), "%s", note); |     snprintf(Friends.list[num].statusmsg, sizeof(Friends.list[num].statusmsg), "%s", note); | ||||||
|     Friends.list[num].statusmsg_len = strlen(Friends.list[num].statusmsg); |     Friends.list[num].statusmsg_len = strlen(Friends.list[num].statusmsg); | ||||||
| @@ -429,8 +444,9 @@ void friendlist_onFriendAdded(ToxWindow *self, Tox *m, uint32_t num, bool sort) | |||||||
|     uint32_t i; |     uint32_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i <= Friends.max_idx; ++i) { |     for (i = 0; i <= Friends.max_idx; ++i) { | ||||||
|         if (Friends.list[i].active) |         if (Friends.list[i].active) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         ++Friends.num_friends; |         ++Friends.num_friends; | ||||||
|  |  | ||||||
| @@ -444,14 +460,16 @@ void friendlist_onFriendAdded(ToxWindow *self, Tox *m, uint32_t num, bool sort) | |||||||
|         TOX_ERR_FRIEND_GET_PUBLIC_KEY pkerr; |         TOX_ERR_FRIEND_GET_PUBLIC_KEY pkerr; | ||||||
|         tox_friend_get_public_key(m, num, (uint8_t *) Friends.list[i].pub_key, &pkerr); |         tox_friend_get_public_key(m, num, (uint8_t *) Friends.list[i].pub_key, &pkerr); | ||||||
|  |  | ||||||
|         if (pkerr != TOX_ERR_FRIEND_GET_PUBLIC_KEY_OK) |         if (pkerr != TOX_ERR_FRIEND_GET_PUBLIC_KEY_OK) { | ||||||
|             fprintf(stderr, "tox_friend_get_public_key failed (error %d)\n", pkerr); |             fprintf(stderr, "tox_friend_get_public_key failed (error %d)\n", pkerr); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         TOX_ERR_FRIEND_GET_LAST_ONLINE loerr; |         TOX_ERR_FRIEND_GET_LAST_ONLINE loerr; | ||||||
|         time_t t = tox_friend_get_last_online(m, num, &loerr); |         time_t t = tox_friend_get_last_online(m, num, &loerr); | ||||||
|  |  | ||||||
|         if (loerr != TOX_ERR_FRIEND_GET_LAST_ONLINE_OK) |         if (loerr != TOX_ERR_FRIEND_GET_LAST_ONLINE_OK) { | ||||||
|             t = 0; |             t = 0; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         update_friend_last_online(i, t); |         update_friend_last_online(i, t); | ||||||
|  |  | ||||||
| @@ -460,11 +478,13 @@ void friendlist_onFriendAdded(ToxWindow *self, Tox *m, uint32_t num, bool sort) | |||||||
|         snprintf(Friends.list[i].name, sizeof(Friends.list[i].name), "%s", tempname); |         snprintf(Friends.list[i].name, sizeof(Friends.list[i].name), "%s", tempname); | ||||||
|         Friends.list[i].namelength = strlen(Friends.list[i].name); |         Friends.list[i].namelength = strlen(Friends.list[i].name); | ||||||
|  |  | ||||||
|         if (i == Friends.max_idx) |         if (i == Friends.max_idx) { | ||||||
|             ++Friends.max_idx; |             ++Friends.max_idx; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (sort) |         if (sort) { | ||||||
|             sort_friendlist_index(); |             sort_friendlist_index(); | ||||||
|  |         } | ||||||
|  |  | ||||||
| #ifdef AUDIO | #ifdef AUDIO | ||||||
|         init_friend_AV(i); |         init_friend_AV(i); | ||||||
| @@ -483,8 +503,9 @@ static void friendlist_add_blocked(Tox *m, uint32_t fnum, uint32_t bnum) | |||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i <= Friends.max_idx; ++i) { |     for (i = 0; i <= Friends.max_idx; ++i) { | ||||||
|         if (Friends.list[i].active) |         if (Friends.list[i].active) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         ++Friends.num_friends; |         ++Friends.num_friends; | ||||||
|  |  | ||||||
| @@ -498,8 +519,9 @@ static void friendlist_add_blocked(Tox *m, uint32_t fnum, uint32_t bnum) | |||||||
|         memcpy(Friends.list[i].name, Blocked.list[bnum].name, Friends.list[i].namelength + 1); |         memcpy(Friends.list[i].name, Blocked.list[bnum].name, Friends.list[i].namelength + 1); | ||||||
|         memcpy(Friends.list[i].pub_key, Blocked.list[bnum].pub_key, TOX_PUBLIC_KEY_SIZE); |         memcpy(Friends.list[i].pub_key, Blocked.list[bnum].pub_key, TOX_PUBLIC_KEY_SIZE); | ||||||
|  |  | ||||||
|         if (i == Friends.max_idx) |         if (i == Friends.max_idx) { | ||||||
|             ++Friends.max_idx; |             ++Friends.max_idx; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         sort_blocklist_index(); |         sort_blocklist_index(); | ||||||
|         sort_friendlist_index(); |         sort_friendlist_index(); | ||||||
| @@ -511,11 +533,13 @@ static void friendlist_add_blocked(Tox *m, uint32_t fnum, uint32_t bnum) | |||||||
| static void friendlist_onFileRecv(ToxWindow *self, Tox *m, uint32_t num, uint32_t filenum, | static void friendlist_onFileRecv(ToxWindow *self, Tox *m, uint32_t num, uint32_t filenum, | ||||||
|                                   uint64_t file_size, const char *filename, size_t name_length) |                                   uint64_t file_size, const char *filename, size_t name_length) | ||||||
| { | { | ||||||
|     if (num >= Friends.max_idx) |     if (num >= Friends.max_idx) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (Friends.list[num].chatwin != -1) |     if (Friends.list[num].chatwin != -1) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (get_num_active_windows() < MAX_WINDOWS_NUM) { |     if (get_num_active_windows() < MAX_WINDOWS_NUM) { | ||||||
|         Friends.list[num].chatwin = add_window(m, new_chat(m, Friends.list[num].num)); |         Friends.list[num].chatwin = add_window(m, new_chat(m, Friends.list[num].num)); | ||||||
| @@ -536,11 +560,13 @@ static void friendlist_onFileRecv(ToxWindow *self, Tox *m, uint32_t num, uint32_ | |||||||
| static void friendlist_onGroupInvite(ToxWindow *self, Tox *m, int32_t num, uint8_t type, const char *group_pub_key, | static void friendlist_onGroupInvite(ToxWindow *self, Tox *m, int32_t num, uint8_t type, const char *group_pub_key, | ||||||
|                                      uint16_t length) |                                      uint16_t length) | ||||||
| { | { | ||||||
|     if (num >= Friends.max_idx) |     if (num >= Friends.max_idx) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (Friends.list[num].chatwin != -1) |     if (Friends.list[num].chatwin != -1) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (get_num_active_windows() < MAX_WINDOWS_NUM) { |     if (get_num_active_windows() < MAX_WINDOWS_NUM) { | ||||||
|         Friends.list[num].chatwin = add_window(m, new_chat(m, Friends.list[num].num)); |         Friends.list[num].chatwin = add_window(m, new_chat(m, Friends.list[num].num)); | ||||||
| @@ -559,12 +585,14 @@ static void friendlist_onGroupInvite(ToxWindow *self, Tox *m, int32_t num, uint8 | |||||||
| /* move friendlist/blocklist cursor up and down */ | /* move friendlist/blocklist cursor up and down */ | ||||||
| static void select_friend(ToxWindow *self, wint_t key, int *selected, int num) | static void select_friend(ToxWindow *self, wint_t key, int *selected, int num) | ||||||
| { | { | ||||||
|     if (num <= 0) |     if (num <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (key == KEY_UP) { |     if (key == KEY_UP) { | ||||||
|         if (--(*selected) < 0) |         if (--(*selected) < 0) { | ||||||
|             *selected = num - 1; |             *selected = num - 1; | ||||||
|  |         } | ||||||
|     } else if (key == KEY_DOWN) { |     } else if (key == KEY_DOWN) { | ||||||
|         *selected = (*selected + 1) % num; |         *selected = (*selected + 1) % num; | ||||||
|     } |     } | ||||||
| @@ -581,8 +609,9 @@ static void delete_friend(Tox *m, uint32_t f_num) | |||||||
|  |  | ||||||
|     --Friends.num_friends; |     --Friends.num_friends; | ||||||
|  |  | ||||||
|     if (Friends.list[f_num].connection_status != TOX_CONNECTION_NONE) |     if (Friends.list[f_num].connection_status != TOX_CONNECTION_NONE) { | ||||||
|         --Friends.num_online; |         --Friends.num_online; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* close friend's chatwindow if it's currently open */ |     /* close friend's chatwindow if it's currently open */ | ||||||
|     if (Friends.list[f_num].chatwin >= 0) { |     if (Friends.list[f_num].chatwin >= 0) { | ||||||
| @@ -594,17 +623,19 @@ static void delete_friend(Tox *m, uint32_t f_num) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (Friends.list[f_num].group_invite.key != NULL) |     if (Friends.list[f_num].group_invite.key != NULL) { | ||||||
|         free(Friends.list[f_num].group_invite.key); |         free(Friends.list[f_num].group_invite.key); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     memset(&Friends.list[f_num], 0, sizeof(ToxicFriend)); |     memset(&Friends.list[f_num], 0, sizeof(ToxicFriend)); | ||||||
|  |  | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = Friends.max_idx; i > 0; --i) { |     for (i = Friends.max_idx; i > 0; --i) { | ||||||
|         if (Friends.list[i - 1].active) |         if (Friends.list[i - 1].active) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Friends.max_idx = i; |     Friends.max_idx = i; | ||||||
|     realloc_friends(i); |     realloc_friends(i); | ||||||
| @@ -614,8 +645,9 @@ static void delete_friend(Tox *m, uint32_t f_num) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     /* make sure num_selected stays within Friends.num_friends range */ |     /* make sure num_selected stays within Friends.num_friends range */ | ||||||
|     if (Friends.num_friends && Friends.num_selected == Friends.num_friends) |     if (Friends.num_friends && Friends.num_selected == Friends.num_friends) { | ||||||
|         --Friends.num_selected; |         --Friends.num_selected; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     store_data(m, DATA_FILE); |     store_data(m, DATA_FILE); | ||||||
| } | } | ||||||
| @@ -651,8 +683,9 @@ static void del_friend_deactivate(ToxWindow *self, Tox *m, wint_t key) | |||||||
|  |  | ||||||
| static void draw_del_popup(void) | static void draw_del_popup(void) | ||||||
| { | { | ||||||
|     if (!PendingDelete.active) |     if (!PendingDelete.active) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wattron(PendingDelete.popup, A_BOLD); |     wattron(PendingDelete.popup, A_BOLD); | ||||||
|     box(PendingDelete.popup, ACS_VLINE, ACS_HLINE); |     box(PendingDelete.popup, ACS_VLINE, ACS_HLINE); | ||||||
| @@ -664,10 +697,11 @@ static void draw_del_popup(void) | |||||||
|  |  | ||||||
|     pthread_mutex_lock(&Winthread.lock); |     pthread_mutex_lock(&Winthread.lock); | ||||||
|  |  | ||||||
|     if (blocklist_view == 0) |     if (blocklist_view == 0) { | ||||||
|         wprintw(PendingDelete.popup, "%s", Friends.list[PendingDelete.num].name); |         wprintw(PendingDelete.popup, "%s", Friends.list[PendingDelete.num].name); | ||||||
|     else |     } else { | ||||||
|         wprintw(PendingDelete.popup, "%s", Blocked.list[PendingDelete.num].name); |         wprintw(PendingDelete.popup, "%s", Blocked.list[PendingDelete.num].name); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pthread_mutex_unlock(&Winthread.lock); |     pthread_mutex_unlock(&Winthread.lock); | ||||||
|  |  | ||||||
| @@ -685,24 +719,27 @@ static void delete_blocked_friend(uint32_t bnum) | |||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = Blocked.max_idx; i > 0; --i) { |     for (i = Blocked.max_idx; i > 0; --i) { | ||||||
|         if (Blocked.list[i - 1].active) |         if (Blocked.list[i - 1].active) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     --Blocked.num_blocked; |     --Blocked.num_blocked; | ||||||
|     Blocked.max_idx = i; |     Blocked.max_idx = i; | ||||||
|     realloc_blocklist(i); |     realloc_blocklist(i); | ||||||
|     save_blocklist(BLOCK_FILE); |     save_blocklist(BLOCK_FILE); | ||||||
|  |  | ||||||
|     if (Blocked.num_blocked && Blocked.num_selected == Blocked.num_blocked) |     if (Blocked.num_blocked && Blocked.num_selected == Blocked.num_blocked) { | ||||||
|         --Blocked.num_selected; |         --Blocked.num_selected; | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* deletes contact from friendlist and puts in blocklist */ | /* deletes contact from friendlist and puts in blocklist */ | ||||||
| void block_friend(Tox *m, uint32_t fnum) | void block_friend(Tox *m, uint32_t fnum) | ||||||
| { | { | ||||||
|     if (Friends.num_friends <= 0) |     if (Friends.num_friends <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     realloc_blocklist(Blocked.max_idx + 1); |     realloc_blocklist(Blocked.max_idx + 1); | ||||||
|     memset(&Blocked.list[Blocked.max_idx], 0, sizeof(BlockedFriend)); |     memset(&Blocked.list[Blocked.max_idx], 0, sizeof(BlockedFriend)); | ||||||
| @@ -710,8 +747,9 @@ void block_friend(Tox *m, uint32_t fnum) | |||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i <= Blocked.max_idx; ++i) { |     for (i = 0; i <= Blocked.max_idx; ++i) { | ||||||
|         if (Blocked.list[i].active) |         if (Blocked.list[i].active) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         Blocked.list[i].active = true; |         Blocked.list[i].active = true; | ||||||
|         Blocked.list[i].num = i; |         Blocked.list[i].num = i; | ||||||
| @@ -722,8 +760,9 @@ void block_friend(Tox *m, uint32_t fnum) | |||||||
|  |  | ||||||
|         ++Blocked.num_blocked; |         ++Blocked.num_blocked; | ||||||
|  |  | ||||||
|         if (i == Blocked.max_idx) |         if (i == Blocked.max_idx) { | ||||||
|             ++Blocked.max_idx; |             ++Blocked.max_idx; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         delete_friend(m, fnum); |         delete_friend(m, fnum); | ||||||
|         save_blocklist(BLOCK_FILE); |         save_blocklist(BLOCK_FILE); | ||||||
| @@ -737,8 +776,9 @@ void block_friend(Tox *m, uint32_t fnum) | |||||||
| /* removes friend from blocklist, puts back in friendlist */ | /* removes friend from blocklist, puts back in friendlist */ | ||||||
| static void unblock_friend(Tox *m, uint32_t bnum) | static void unblock_friend(Tox *m, uint32_t bnum) | ||||||
| { | { | ||||||
|     if (Blocked.num_blocked <= 0) |     if (Blocked.num_blocked <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     TOX_ERR_FRIEND_ADD err; |     TOX_ERR_FRIEND_ADD err; | ||||||
|     uint32_t friendnum = tox_friend_add_norequest(m, (uint8_t *) Blocked.list[bnum].pub_key, &err); |     uint32_t friendnum = tox_friend_add_norequest(m, (uint8_t *) Blocked.list[bnum].pub_key, &err); | ||||||
| @@ -767,34 +807,40 @@ static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!blocklist_view && !Friends.num_friends && (key != KEY_RIGHT && key != KEY_LEFT)) |     if (!blocklist_view && !Friends.num_friends && (key != KEY_RIGHT && key != KEY_LEFT)) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (blocklist_view && !Blocked.num_blocked && (key != KEY_RIGHT && key != KEY_LEFT)) |     if (blocklist_view && !Blocked.num_blocked && (key != KEY_RIGHT && key != KEY_LEFT)) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int f = 0; |     int f = 0; | ||||||
|  |  | ||||||
|     if (blocklist_view == 1 && Blocked.num_blocked) |     if (blocklist_view == 1 && Blocked.num_blocked) { | ||||||
|         f = Blocked.index[Blocked.num_selected]; |         f = Blocked.index[Blocked.num_selected]; | ||||||
|     else if (Friends.num_friends) |     } else if (Friends.num_friends) { | ||||||
|         f = Friends.index[Friends.num_selected]; |         f = Friends.index[Friends.num_selected]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* lock screen and force decision on deletion popup */ |     /* lock screen and force decision on deletion popup */ | ||||||
|     if (PendingDelete.active) { |     if (PendingDelete.active) { | ||||||
|         if (key == 'y' || key == 'n') |         if (key == 'y' || key == 'n') { | ||||||
|             del_friend_deactivate(self, m, key); |             del_friend_deactivate(self, m, key); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (key == ltr) |     if (key == ltr) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     switch (key) { |     switch (key) { | ||||||
|         case '\r': |         case '\r': | ||||||
|             if (blocklist_view) |             if (blocklist_view) { | ||||||
|                 break; |                 break; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             /* Jump to chat window if already open */ |             /* Jump to chat window if already open */ | ||||||
|             if (Friends.list[f].chatwin != -1) { |             if (Friends.list[f].chatwin != -1) { | ||||||
| @@ -815,10 +861,11 @@ static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         case 'b': |         case 'b': | ||||||
|             if (!blocklist_view) |             if (!blocklist_view) { | ||||||
|                 block_friend(m, f); |                 block_friend(m, f); | ||||||
|             else |             } else { | ||||||
|                 unblock_friend(m, f); |                 unblock_friend(m, f); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
| @@ -828,10 +875,11 @@ static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         default: |         default: | ||||||
|             if (blocklist_view == 0) |             if (blocklist_view == 0) { | ||||||
|                 select_friend(self, key, &Friends.num_selected, Friends.num_friends); |                 select_friend(self, key, &Friends.num_selected, Friends.num_friends); | ||||||
|             else |             } else { | ||||||
|                 select_friend(self, key, &Blocked.num_selected, Blocked.num_blocked); |                 select_friend(self, key, &Blocked.num_selected, Blocked.num_blocked); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             break; |             break; | ||||||
|     } |     } | ||||||
| @@ -846,8 +894,9 @@ static void blocklist_onDraw(ToxWindow *self, Tox *m, int y2, int x2) | |||||||
|     wattroff(self->window, A_BOLD); |     wattroff(self->window, A_BOLD); | ||||||
|     wprintw(self->window, "%d\n\n", Blocked.num_blocked); |     wprintw(self->window, "%d\n\n", Blocked.num_blocked); | ||||||
|  |  | ||||||
|     if ((y2 - FLIST_OFST) <= 0) |     if ((y2 - FLIST_OFST) <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     uint32_t selected_num = 0; |     uint32_t selected_num = 0; | ||||||
|  |  | ||||||
| @@ -876,16 +925,18 @@ static void blocklist_onDraw(ToxWindow *self, Tox *m, int y2, int x2) | |||||||
|         wprintw(self->window, "x"); |         wprintw(self->window, "x"); | ||||||
|         wattroff(self->window, COLOR_PAIR(RED)); |         wattroff(self->window, COLOR_PAIR(RED)); | ||||||
|  |  | ||||||
|         if (f_selected) |         if (f_selected) { | ||||||
|             wattron(self->window, COLOR_PAIR(BLUE)); |             wattron(self->window, COLOR_PAIR(BLUE)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         wattron(self->window, A_BOLD); |         wattron(self->window, A_BOLD); | ||||||
|         wprintw(self->window, " %s\n", Blocked.list[f].name); |         wprintw(self->window, " %s\n", Blocked.list[f].name); | ||||||
|         wattroff(self->window, A_BOLD); |         wattroff(self->window, A_BOLD); | ||||||
|  |  | ||||||
|         if (f_selected) |         if (f_selected) { | ||||||
|             wattroff(self->window, COLOR_PAIR(BLUE)); |             wattroff(self->window, COLOR_PAIR(BLUE)); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wprintw(self->window, "\n"); |     wprintw(self->window, "\n"); | ||||||
|     self->x = x2; |     self->x = x2; | ||||||
| @@ -899,16 +950,18 @@ static void blocklist_onDraw(ToxWindow *self, Tox *m, int y2, int x2) | |||||||
|  |  | ||||||
|         int i; |         int i; | ||||||
|  |  | ||||||
|         for (i = 0; i < TOX_PUBLIC_KEY_SIZE; ++i) |         for (i = 0; i < TOX_PUBLIC_KEY_SIZE; ++i) { | ||||||
|             wprintw(self->window, "%02X", Blocked.list[selected_num].pub_key[i] & 0xff); |             wprintw(self->window, "%02X", Blocked.list[selected_num].pub_key[i] & 0xff); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wnoutrefresh(self->window); |     wnoutrefresh(self->window); | ||||||
|     draw_del_popup(); |     draw_del_popup(); | ||||||
|  |  | ||||||
|     if (self->help->active) |     if (self->help->active) { | ||||||
|         help_onDraw(self); |         help_onDraw(self); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| static void friendlist_onDraw(ToxWindow *self, Tox *m) | static void friendlist_onDraw(ToxWindow *self, Tox *m) | ||||||
| { | { | ||||||
| @@ -941,8 +994,9 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) | |||||||
|  |  | ||||||
|     wprintw(self->window, "%d/%d \n\n", Friends.num_online, Friends.num_friends); |     wprintw(self->window, "%d/%d \n\n", Friends.num_online, Friends.num_friends); | ||||||
|  |  | ||||||
|     if ((y2 - FLIST_OFST) <= 0) |     if ((y2 - FLIST_OFST) <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     uint32_t selected_num = 0; |     uint32_t selected_num = 0; | ||||||
|  |  | ||||||
| @@ -1006,8 +1060,9 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) | |||||||
|                 wprintw(self->window, "%s ", ONLINE_CHAR); |                 wprintw(self->window, "%s ", ONLINE_CHAR); | ||||||
|                 wattroff(self->window, COLOR_PAIR(colour) | A_BOLD); |                 wattroff(self->window, COLOR_PAIR(colour) | A_BOLD); | ||||||
|  |  | ||||||
|                 if (f_selected) |                 if (f_selected) { | ||||||
|                     wattron(self->window, COLOR_PAIR(BLUE)); |                     wattron(self->window, COLOR_PAIR(BLUE)); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 wattron(self->window, A_BOLD); |                 wattron(self->window, A_BOLD); | ||||||
|                 pthread_mutex_lock(&Winthread.lock); |                 pthread_mutex_lock(&Winthread.lock); | ||||||
| @@ -1015,8 +1070,9 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) | |||||||
|                 pthread_mutex_unlock(&Winthread.lock); |                 pthread_mutex_unlock(&Winthread.lock); | ||||||
|                 wattroff(self->window, A_BOLD); |                 wattroff(self->window, A_BOLD); | ||||||
|  |  | ||||||
|                 if (f_selected) |                 if (f_selected) { | ||||||
|                     wattroff(self->window, COLOR_PAIR(BLUE)); |                     wattroff(self->window, COLOR_PAIR(BLUE)); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 /* Reset Friends.list[f].statusmsg on window resize */ |                 /* Reset Friends.list[f].statusmsg on window resize */ | ||||||
|                 if (fix_statuses) { |                 if (fix_statuses) { | ||||||
| @@ -1049,8 +1105,9 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) | |||||||
|                     Friends.list[f].statusmsg_len = maxlen; |                     Friends.list[f].statusmsg_len = maxlen; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 if (Friends.list[f].statusmsg_len > 0) |                 if (Friends.list[f].statusmsg_len > 0) { | ||||||
|                     wprintw(self->window, " %s", Friends.list[f].statusmsg); |                     wprintw(self->window, " %s", Friends.list[f].statusmsg); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 pthread_mutex_unlock(&Winthread.lock); |                 pthread_mutex_unlock(&Winthread.lock); | ||||||
|  |  | ||||||
| @@ -1058,8 +1115,9 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) | |||||||
|             } else { |             } else { | ||||||
|                 wprintw(self->window, "%s ", OFFLINE_CHAR); |                 wprintw(self->window, "%s ", OFFLINE_CHAR); | ||||||
|  |  | ||||||
|                 if (f_selected) |                 if (f_selected) { | ||||||
|                     wattron(self->window, COLOR_PAIR(BLUE)); |                     wattron(self->window, COLOR_PAIR(BLUE)); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 wattron(self->window, A_BOLD); |                 wattron(self->window, A_BOLD); | ||||||
|                 pthread_mutex_lock(&Winthread.lock); |                 pthread_mutex_lock(&Winthread.lock); | ||||||
| @@ -1067,8 +1125,9 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) | |||||||
|                 pthread_mutex_unlock(&Winthread.lock); |                 pthread_mutex_unlock(&Winthread.lock); | ||||||
|                 wattroff(self->window, A_BOLD); |                 wattroff(self->window, A_BOLD); | ||||||
|  |  | ||||||
|                 if (f_selected) |                 if (f_selected) { | ||||||
|                     wattroff(self->window, COLOR_PAIR(BLUE)); |                     wattroff(self->window, COLOR_PAIR(BLUE)); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 pthread_mutex_lock(&Winthread.lock); |                 pthread_mutex_lock(&Winthread.lock); | ||||||
|                 time_t last_seen = Friends.list[f].last_online.last_on; |                 time_t last_seen = Friends.list[f].last_online.last_on; | ||||||
| @@ -1116,16 +1175,18 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m) | |||||||
|  |  | ||||||
|         int i; |         int i; | ||||||
|  |  | ||||||
|         for (i = 0; i < TOX_PUBLIC_KEY_SIZE; ++i) |         for (i = 0; i < TOX_PUBLIC_KEY_SIZE; ++i) { | ||||||
|             wprintw(self->window, "%02X", Friends.list[selected_num].pub_key[i] & 0xff); |             wprintw(self->window, "%02X", Friends.list[selected_num].pub_key[i] & 0xff); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wnoutrefresh(self->window); |     wnoutrefresh(self->window); | ||||||
|     draw_del_popup(); |     draw_del_popup(); | ||||||
|  |  | ||||||
|     if (self->help->active) |     if (self->help->active) { | ||||||
|         help_onDraw(self); |         help_onDraw(self); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void disable_chatwin(uint32_t f_num) | void disable_chatwin(uint32_t f_num) | ||||||
| { | { | ||||||
| @@ -1137,8 +1198,9 @@ static void friendlist_onAV(ToxWindow *self, ToxAV *av, uint32_t friend_number, | |||||||
| { | { | ||||||
|     assert(0); |     assert(0); | ||||||
|  |  | ||||||
|     if ( friend_number >= Friends.max_idx) |     if (friend_number >= Friends.max_idx) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     assert(0); |     assert(0); | ||||||
|     Tox *m = toxav_get_tox(av); |     Tox *m = toxav_get_tox(av); | ||||||
| @@ -1214,8 +1276,9 @@ ToxWindow new_friendlist(void) | |||||||
|  |  | ||||||
|     Help *help = calloc(1, sizeof(Help)); |     Help *help = calloc(1, sizeof(Help)); | ||||||
|  |  | ||||||
|     if (help == NULL) |     if (help == NULL) { | ||||||
|         exit_toxic_err("failed in new_friendlist", FATALERR_MEMORY); |         exit_toxic_err("failed in new_friendlist", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ret.help = help; |     ret.help = help; | ||||||
|     strcpy(ret.name, "contacts"); |     strcpy(ret.name, "contacts"); | ||||||
|   | |||||||
| @@ -79,9 +79,10 @@ void cmd_accept(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[ | |||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = FrndRequests.max_idx; i > 0; --i) { |     for (i = FrndRequests.max_idx; i > 0; --i) { | ||||||
|         if (FrndRequests.request[i - 1].active) |         if (FrndRequests.request[i - 1].active) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     FrndRequests.max_idx = i; |     FrndRequests.max_idx = i; | ||||||
|     --FrndRequests.num_requests; |     --FrndRequests.num_requests; | ||||||
| @@ -313,9 +314,10 @@ void cmd_decline(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv) | |||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = FrndRequests.max_idx; i > 0; --i) { |     for (i = FrndRequests.max_idx; i > 0; --i) { | ||||||
|         if (FrndRequests.request[i - 1].active) |         if (FrndRequests.request[i - 1].active) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     FrndRequests.max_idx = i; |     FrndRequests.max_idx = i; | ||||||
|     --FrndRequests.num_requests; |     --FrndRequests.num_requests; | ||||||
| @@ -335,11 +337,11 @@ void cmd_groupchat(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*arg | |||||||
|  |  | ||||||
|     uint8_t type; |     uint8_t type; | ||||||
|  |  | ||||||
|     if (!strcasecmp(argv[1], "audio")) |     if (!strcasecmp(argv[1], "audio")) { | ||||||
|         type = TOX_CONFERENCE_TYPE_AV; |         type = TOX_CONFERENCE_TYPE_AV; | ||||||
|     else if (!strcasecmp(argv[1], "text")) |     } else if (!strcasecmp(argv[1], "text")) { | ||||||
|         type = TOX_CONFERENCE_TYPE_TEXT; |         type = TOX_CONFERENCE_TYPE_TEXT; | ||||||
|     else { |     } else { | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Valid group types are: text | audio"); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Valid group types are: text | audio"); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| @@ -373,10 +375,11 @@ void cmd_log(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX | |||||||
|     struct chatlog *log = self->chatwin->log; |     struct chatlog *log = self->chatwin->log; | ||||||
|  |  | ||||||
|     if (argc == 0) { |     if (argc == 0) { | ||||||
|         if (log->log_on) |         if (log->log_on) { | ||||||
|             msg = "Logging for this window is ON; type \"/log off\" to disable. (Logs are not encrypted)"; |             msg = "Logging for this window is ON; type \"/log off\" to disable. (Logs are not encrypted)"; | ||||||
|         else |         } else { | ||||||
|             msg = "Logging for this window is OFF; type \"/log on\" to enable."; |             msg = "Logging for this window is OFF; type \"/log on\" to enable."; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, msg); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, msg); | ||||||
|         return; |         return; | ||||||
| @@ -403,8 +406,9 @@ void cmd_log(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX | |||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, msg); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, msg); | ||||||
|         return; |         return; | ||||||
|     } else if (!strcmp(swch, "0") || !strcmp(swch, "off")) { |     } else if (!strcmp(swch, "0") || !strcmp(swch, "off")) { | ||||||
|         if (self->is_chat) |         if (self->is_chat) { | ||||||
|             Friends.list[self->num].logging_on = false; |             Friends.list[self->num].logging_on = false; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         log_disable(log); |         log_disable(log); | ||||||
|  |  | ||||||
| @@ -592,8 +596,9 @@ void cmd_requests(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv | |||||||
|     int count = 0; |     int count = 0; | ||||||
|  |  | ||||||
|     for (i = 0; i < FrndRequests.max_idx; ++i) { |     for (i = 0; i < FrndRequests.max_idx; ++i) { | ||||||
|         if (!FrndRequests.request[i].active) |         if (!FrndRequests.request[i].active) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         char id[TOX_PUBLIC_KEY_SIZE * 2 + 1] = {0}; |         char id[TOX_PUBLIC_KEY_SIZE * 2 + 1] = {0}; | ||||||
|  |  | ||||||
| @@ -606,10 +611,11 @@ void cmd_requests(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv | |||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%d : %s", i, id); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%d : %s", i, id); | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s", FrndRequests.request[i].msg); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s", FrndRequests.request[i].msg); | ||||||
|  |  | ||||||
|         if (++count < FrndRequests.num_requests) |         if (++count < FrndRequests.num_requests) { | ||||||
|             line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, ""); |             line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, ""); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void cmd_status(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) | void cmd_status(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) | ||||||
| { | { | ||||||
| @@ -629,13 +635,13 @@ void cmd_status(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[ | |||||||
|     const char *status_str = argv[1]; |     const char *status_str = argv[1]; | ||||||
|     TOX_USER_STATUS status; |     TOX_USER_STATUS status; | ||||||
|  |  | ||||||
|     if (!strcasecmp(status_str, "online")) |     if (!strcasecmp(status_str, "online")) { | ||||||
|         status = TOX_USER_STATUS_NONE; |         status = TOX_USER_STATUS_NONE; | ||||||
|     else if (!strcasecmp(status_str, "away")) |     } else if (!strcasecmp(status_str, "away")) { | ||||||
|         status = TOX_USER_STATUS_AWAY; |         status = TOX_USER_STATUS_AWAY; | ||||||
|     else if (!strcasecmp(status_str, "busy")) |     } else if (!strcasecmp(status_str, "busy")) { | ||||||
|         status = TOX_USER_STATUS_BUSY; |         status = TOX_USER_STATUS_BUSY; | ||||||
|     else { |     } else { | ||||||
|         errmsg = "Invalid status. Valid statuses are: online, busy and away."; |         errmsg = "Invalid status. Valid statuses are: online, busy and away."; | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, errmsg); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, errmsg); | ||||||
|         goto finish; |         goto finish; | ||||||
|   | |||||||
| @@ -132,8 +132,9 @@ int init_groupchat_win(ToxWindow *prompt, Tox *m, uint32_t groupnum, uint8_t typ | |||||||
|  |  | ||||||
|             set_active_window(groupchats[i].chatwin); |             set_active_window(groupchats[i].chatwin); | ||||||
|  |  | ||||||
|             if (i == max_groupchat_index) |             if (i == max_groupchat_index) { | ||||||
|                 ++max_groupchat_index; |                 ++max_groupchat_index; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
| @@ -166,9 +167,10 @@ void free_groupchat(ToxWindow *self, Tox *m, uint32_t groupnum) | |||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = max_groupchat_index; i > 0; --i) { |     for (i = max_groupchat_index; i > 0; --i) { | ||||||
|         if (groupchats[i - 1].active) |         if (groupchats[i - 1].active) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     max_groupchat_index = i; |     max_groupchat_index = i; | ||||||
|     kill_groupchat_window(self); |     kill_groupchat_window(self); | ||||||
| @@ -193,8 +195,9 @@ void redraw_groupchat_win(ToxWindow *self) | |||||||
|     getmaxyx(stdscr, y2, x2); |     getmaxyx(stdscr, y2, x2); | ||||||
|     y2 -= 2; |     y2 -= 2; | ||||||
|  |  | ||||||
|     if (y2 <= 0 || x2 <= 0) |     if (y2 <= 0 || x2 <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ctx->sidebar) { |     if (ctx->sidebar) { | ||||||
|         delwin(ctx->sidebar); |         delwin(ctx->sidebar); | ||||||
| @@ -222,8 +225,9 @@ void redraw_groupchat_win(ToxWindow *self) | |||||||
| static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peernum, | static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peernum, | ||||||
|                                      TOX_MESSAGE_TYPE type, const char *msg, size_t len) |                                      TOX_MESSAGE_TYPE type, const char *msg, size_t len) | ||||||
| { | { | ||||||
|     if (self->num != groupnum) |     if (self->num != groupnum) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
| @@ -242,10 +246,11 @@ static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, uint32_t groupnum, | |||||||
|     if (strcasestr(msg, selfnick) && strcmp(selfnick, nick)) { |     if (strcasestr(msg, selfnick) && strcmp(selfnick, nick)) { | ||||||
|         sound_notify(self, generic_message, NT_WNDALERT_0 | user_settings->bell_on_message, NULL); |         sound_notify(self, generic_message, NT_WNDALERT_0 | user_settings->bell_on_message, NULL); | ||||||
|  |  | ||||||
|         if (self->active_box != -1) |         if (self->active_box != -1) { | ||||||
|             box_silent_notify2(self, NT_NOFOCUS, self->active_box, "%s %s", nick, msg); |             box_silent_notify2(self, NT_NOFOCUS, self->active_box, "%s %s", nick, msg); | ||||||
|         else |         } else { | ||||||
|             box_silent_notify(self, NT_NOFOCUS, &self->active_box, self->name, "%s %s", nick, msg); |             box_silent_notify(self, NT_NOFOCUS, &self->active_box, self->name, "%s %s", nick, msg); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         nick_clr = RED; |         nick_clr = RED; | ||||||
|     } else { |     } else { | ||||||
| @@ -265,8 +270,9 @@ static void groupchat_onGroupTitleChange(ToxWindow *self, Tox *m, uint32_t group | |||||||
| { | { | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
|     if (self->num != groupnum) |     if (self->num != groupnum) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     set_window_title(self, title, length); |     set_window_title(self, title, length); | ||||||
|  |  | ||||||
| @@ -274,8 +280,9 @@ static void groupchat_onGroupTitleChange(ToxWindow *self, Tox *m, uint32_t group | |||||||
|     get_time_str(timefrmt, sizeof(timefrmt)); |     get_time_str(timefrmt, sizeof(timefrmt)); | ||||||
|  |  | ||||||
|     /* don't announce title when we join the room */ |     /* don't announce title when we join the room */ | ||||||
|     if (!timed_out(groupchats[self->num].start_time, GROUP_EVENT_WAIT)) |     if (!timed_out(groupchats[self->num].start_time, GROUP_EVENT_WAIT)) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char nick[TOX_MAX_NAME_LENGTH]; |     char nick[TOX_MAX_NAME_LENGTH]; | ||||||
|     get_group_nick_truncate(m, nick, peernum, groupnum); |     get_group_nick_truncate(m, nick, peernum, groupnum); | ||||||
| @@ -383,11 +390,13 @@ static void update_peer_list(Tox *m, uint32_t groupnum, uint32_t num_peers) | |||||||
|  |  | ||||||
| static void groupchat_onGroupNameListChange(ToxWindow *self, Tox *m, uint32_t groupnum) | static void groupchat_onGroupNameListChange(ToxWindow *self, Tox *m, uint32_t groupnum) | ||||||
| { | { | ||||||
|     if (self->num != groupnum) |     if (self->num != groupnum) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (groupnum > max_groupchat_index) |     if (groupnum > max_groupchat_index) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     GroupChat *chat = &groupchats[groupnum]; |     GroupChat *chat = &groupchats[groupnum]; | ||||||
|     TOX_ERR_CONFERENCE_PEER_QUERY err; |     TOX_ERR_CONFERENCE_PEER_QUERY err; | ||||||
| @@ -464,27 +473,31 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|     getyx(self->window, y, x); |     getyx(self->window, y, x); | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (x2 <= 0 || y2 <= 0) |     if (x2 <= 0 || y2 <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (self->help->active) { |     if (self->help->active) { | ||||||
|         help_onKey(self, key); |         help_onKey(self, key); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (ctx->pastemode && key == '\r') |     if (ctx->pastemode && key == '\r') { | ||||||
|         key = '\n'; |         key = '\n'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ltr || key == '\n') {    /* char is printable */ |     if (ltr || key == '\n') {    /* char is printable */ | ||||||
|         input_new_char(self, key, x, y, x2, y2); |         input_new_char(self, key, x, y, x2, y2); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (line_info_onKey(self, key)) |     if (line_info_onKey(self, key)) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (input_handle(self, key, x, y, x2, y2)) |     if (input_handle(self, key, x, y, x2, y2)) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (key == '\t') {  /* TAB key: auto-completes peer name or command */ |     if (key == '\t') {  /* TAB key: auto-completes peer name or command */ | ||||||
|         if (ctx->len > 0) { |         if (ctx->len > 0) { | ||||||
| @@ -523,11 +536,13 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|     } else if (key == user_settings->key_peer_list_down) {    /* Scroll peerlist up and down one position */ |     } else if (key == user_settings->key_peer_list_down) {    /* Scroll peerlist up and down one position */ | ||||||
|         int L = y2 - CHATBOX_HEIGHT - SDBAR_OFST; |         int L = y2 - CHATBOX_HEIGHT - SDBAR_OFST; | ||||||
|  |  | ||||||
|         if (groupchats[self->num].side_pos < groupchats[self->num].num_peers - L) |         if (groupchats[self->num].side_pos < groupchats[self->num].num_peers - L) { | ||||||
|             ++groupchats[self->num].side_pos; |             ++groupchats[self->num].side_pos; | ||||||
|  |         } | ||||||
|     } else if (key == user_settings->key_peer_list_up) { |     } else if (key == user_settings->key_peer_list_up) { | ||||||
|         if (groupchats[self->num].side_pos > 0) |         if (groupchats[self->num].side_pos > 0) { | ||||||
|             --groupchats[self->num].side_pos; |             --groupchats[self->num].side_pos; | ||||||
|  |         } | ||||||
|     } else if (key == '\r') { |     } else if (key == '\r') { | ||||||
|         rm_trailing_spaces_buf(ctx); |         rm_trailing_spaces_buf(ctx); | ||||||
|  |  | ||||||
| @@ -538,8 +553,9 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|  |  | ||||||
|             char line[MAX_STR_SIZE]; |             char line[MAX_STR_SIZE]; | ||||||
|  |  | ||||||
|             if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1) |             if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1) { | ||||||
|                 memset(&line, 0, sizeof(line)); |                 memset(&line, 0, sizeof(line)); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if (line[0] == '/') { |             if (line[0] == '/') { | ||||||
|                 if (strcmp(line, "/close") == 0) { |                 if (strcmp(line, "/close") == 0) { | ||||||
| @@ -570,8 +586,9 @@ static void groupchat_onDraw(ToxWindow *self, Tox *m) | |||||||
|     int x2, y2; |     int x2, y2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (x2 <= 0 || y2 <= 0) |     if (x2 <= 0 || y2 <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
| @@ -583,8 +600,9 @@ static void groupchat_onDraw(ToxWindow *self, Tox *m) | |||||||
|  |  | ||||||
|     curs_set(1); |     curs_set(1); | ||||||
|  |  | ||||||
|     if (ctx->len > 0) |     if (ctx->len > 0) { | ||||||
|         mvwprintw(ctx->linewin, 1, 0, "%ls", &ctx->line[ctx->start]); |         mvwprintw(ctx->linewin, 1, 0, "%ls", &ctx->line[ctx->start]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wclear(ctx->sidebar); |     wclear(ctx->sidebar); | ||||||
|     mvwhline(self->window, y2 - CHATBOX_HEIGHT, 0, ACS_HLINE, x2); |     mvwhline(self->window, y2 - CHATBOX_HEIGHT, 0, ACS_HLINE, x2); | ||||||
| @@ -637,17 +655,19 @@ static void groupchat_onDraw(ToxWindow *self, Tox *m) | |||||||
|  |  | ||||||
|     wnoutrefresh(self->window); |     wnoutrefresh(self->window); | ||||||
|  |  | ||||||
|     if (self->help->active) |     if (self->help->active) { | ||||||
|         help_onDraw(self); |         help_onDraw(self); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| static void groupchat_onInit(ToxWindow *self, Tox *m) | static void groupchat_onInit(ToxWindow *self, Tox *m) | ||||||
| { | { | ||||||
|     int x2, y2; |     int x2, y2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (x2 <= 0 || y2 <= 0) |     if (x2 <= 0 || y2 <= 0) { | ||||||
|         exit_toxic_err("failed in groupchat_onInit", FATALERR_CURSES); |         exit_toxic_err("failed in groupchat_onInit", FATALERR_CURSES); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
| @@ -658,8 +678,9 @@ static void groupchat_onInit(ToxWindow *self, Tox *m) | |||||||
|     ctx->hst = calloc(1, sizeof(struct history)); |     ctx->hst = calloc(1, sizeof(struct history)); | ||||||
|     ctx->log = calloc(1, sizeof(struct chatlog)); |     ctx->log = calloc(1, sizeof(struct chatlog)); | ||||||
|  |  | ||||||
|     if (ctx->log == NULL || ctx->hst == NULL) |     if (ctx->log == NULL || ctx->hst == NULL) { | ||||||
|         exit_toxic_err("failed in groupchat_onInit", FATALERR_MEMORY); |         exit_toxic_err("failed in groupchat_onInit", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     line_info_init(ctx->hst); |     line_info_init(ctx->hst); | ||||||
|  |  | ||||||
| @@ -667,9 +688,10 @@ static void groupchat_onInit(ToxWindow *self, Tox *m) | |||||||
|         char myid[TOX_ADDRESS_SIZE]; |         char myid[TOX_ADDRESS_SIZE]; | ||||||
|         tox_self_get_address(m, (uint8_t *) myid); |         tox_self_get_address(m, (uint8_t *) myid); | ||||||
|  |  | ||||||
|         if (log_enable(self->name, myid, NULL, ctx->log, LOG_GROUP) == -1) |         if (log_enable(self->name, myid, NULL, ctx->log, LOG_GROUP) == -1) { | ||||||
|             line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Warning: Log failed to initialize."); |             line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Warning: Log failed to initialize."); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     execute(ctx->history, self, m, "/log", GLOBAL_COMMAND_MODE); |     execute(ctx->history, self, m, "/log", GLOBAL_COMMAND_MODE); | ||||||
|  |  | ||||||
| @@ -698,8 +720,9 @@ ToxWindow new_group_chat(Tox *m, uint32_t groupnum) | |||||||
|     ChatContext *chatwin = calloc(1, sizeof(ChatContext)); |     ChatContext *chatwin = calloc(1, sizeof(ChatContext)); | ||||||
|     Help *help = calloc(1, sizeof(Help)); |     Help *help = calloc(1, sizeof(Help)); | ||||||
|  |  | ||||||
|     if (chatwin == NULL || help == NULL) |     if (chatwin == NULL || help == NULL) { | ||||||
|         exit_toxic_err("failed in new_group_chat", FATALERR_MEMORY); |         exit_toxic_err("failed in new_group_chat", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ret.chatwin = chatwin; |     ret.chatwin = chatwin; | ||||||
|     ret.help = help; |     ret.help = help; | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								src/help.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/help.c
									
									
									
									
									
								
							| @@ -40,14 +40,16 @@ | |||||||
|  |  | ||||||
| void help_init_menu(ToxWindow *self) | void help_init_menu(ToxWindow *self) | ||||||
| { | { | ||||||
|     if (self->help->win) |     if (self->help->win) { | ||||||
|         delwin(self->help->win); |         delwin(self->help->win); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int y2, x2; |     int y2, x2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (y2 < HELP_MENU_HEIGHT || x2 < HELP_MENU_WIDTH) |     if (y2 < HELP_MENU_HEIGHT || x2 < HELP_MENU_WIDTH) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     self->help->win = newwin(HELP_MENU_HEIGHT, HELP_MENU_WIDTH, 3, 3); |     self->help->win = newwin(HELP_MENU_HEIGHT, HELP_MENU_WIDTH, 3, 3); | ||||||
|     self->help->active = true; |     self->help->active = true; | ||||||
| @@ -62,14 +64,16 @@ static void help_exit(ToxWindow *self) | |||||||
|  |  | ||||||
| static void help_init_window(ToxWindow *self, int height, int width) | static void help_init_window(ToxWindow *self, int height, int width) | ||||||
| { | { | ||||||
|     if (self->help->win) |     if (self->help->win) { | ||||||
|         delwin(self->help->win); |         delwin(self->help->win); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int y2, x2; |     int y2, x2; | ||||||
|     getmaxyx(stdscr, y2, x2); |     getmaxyx(stdscr, y2, x2); | ||||||
|  |  | ||||||
|     if (y2 <= 0 || x2 <= 0) |     if (y2 <= 0 || x2 <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     height = MIN(height, y2); |     height = MIN(height, y2); | ||||||
|     width = MIN(width, x2); |     width = MIN(width, x2); | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								src/input.c
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								src/input.c
									
									
									
									
									
								
							| @@ -43,8 +43,9 @@ void input_new_char(ToxWindow *self, wint_t key, int x, int y, int mx_x, int mx_ | |||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
|     /* this is the only place we need to do this check */ |     /* this is the only place we need to do this check */ | ||||||
|     if (key == '\n') |     if (key == '\n') { | ||||||
|         key = L'¶'; |         key = L'¶'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int cur_len = wcwidth(key); |     int cur_len = wcwidth(key); | ||||||
|  |  | ||||||
| @@ -77,18 +78,20 @@ static void input_backspace(ToxWindow *self, int x, int mx_x) | |||||||
|     int cur_len = ctx->pos > 0 ? wcwidth(ctx->line[ctx->pos - 1]) : 0; |     int cur_len = ctx->pos > 0 ? wcwidth(ctx->line[ctx->pos - 1]) : 0; | ||||||
|     int s_len = ctx->start > 0 ? wcwidth(ctx->line[ctx->start - 1]) : 0; |     int s_len = ctx->start > 0 ? wcwidth(ctx->line[ctx->start - 1]) : 0; | ||||||
|  |  | ||||||
|     if (ctx->start && (x >= mx_x - cur_len)) |     if (ctx->start && (x >= mx_x - cur_len)) { | ||||||
|         ctx->start = MAX(0, ctx->start - 1 + (s_len - cur_len)); |         ctx->start = MAX(0, ctx->start - 1 + (s_len - cur_len)); | ||||||
|     else if (ctx->start) |     } else if (ctx->start) { | ||||||
|         ctx->start = MAX(0, ctx->start - cur_len); |         ctx->start = MAX(0, ctx->start - cur_len); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* delete a char via delete key from input field and buffer */ | /* delete a char via delete key from input field and buffer */ | ||||||
| static void input_delete(ToxWindow *self) | static void input_delete(ToxWindow *self) | ||||||
| { | { | ||||||
|     if (del_char_buf_frnt(self->chatwin) == -1) |     if (del_char_buf_frnt(self->chatwin) == -1) { | ||||||
|         sound_notify(self, notif_error, 0, NULL); |         sound_notify(self, notif_error, 0, NULL); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* delete last typed word */ | /* delete last typed word */ | ||||||
| static void input_del_word(ToxWindow *self, int x, int mx_x) | static void input_del_word(ToxWindow *self, int x, int mx_x) | ||||||
| @@ -104,16 +107,18 @@ static void input_del_word(ToxWindow *self, int x, int mx_x) | |||||||
| /* deletes entire line before cursor from input field and buffer */ | /* deletes entire line before cursor from input field and buffer */ | ||||||
| static void input_discard(ToxWindow *self) | static void input_discard(ToxWindow *self) | ||||||
| { | { | ||||||
|     if (discard_buf(self->chatwin) == -1) |     if (discard_buf(self->chatwin) == -1) { | ||||||
|         sound_notify(self, notif_error, 0, NULL); |         sound_notify(self, notif_error, 0, NULL); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* deletes entire line after cursor from input field and buffer */ | /* deletes entire line after cursor from input field and buffer */ | ||||||
| static void input_kill(ChatContext *ctx) | static void input_kill(ChatContext *ctx) | ||||||
| { | { | ||||||
|     if (kill_buf(ctx) == -1) |     if (kill_buf(ctx) == -1) { | ||||||
|         sound_notify(NULL, notif_error, NT_ALWAYS, NULL); |         sound_notify(NULL, notif_error, NT_ALWAYS, NULL); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| static void input_yank(ToxWindow *self, int x, int mx_x) | static void input_yank(ToxWindow *self, int x, int mx_x) | ||||||
| { | { | ||||||
| @@ -149,8 +154,9 @@ static void input_mv_home(ToxWindow *self) | |||||||
| { | { | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
|     if (ctx->pos <= 0) |     if (ctx->pos <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ctx->pos = 0; |     ctx->pos = 0; | ||||||
|     ctx->start = 0; |     ctx->start = 0; | ||||||
| @@ -161,27 +167,30 @@ static void input_mv_left(ToxWindow *self, int x, int mx_x) | |||||||
| { | { | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
|     if (ctx->pos <= 0) |     if (ctx->pos <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int cur_len = ctx->pos > 0 ? wcwidth(ctx->line[ctx->pos - 1]) : 0; |     int cur_len = ctx->pos > 0 ? wcwidth(ctx->line[ctx->pos - 1]) : 0; | ||||||
|     int s_len = ctx->start > 0 ? wcwidth(ctx->line[ctx->start - 1]) : 0; |     int s_len = ctx->start > 0 ? wcwidth(ctx->line[ctx->start - 1]) : 0; | ||||||
|  |  | ||||||
|     --ctx->pos; |     --ctx->pos; | ||||||
|  |  | ||||||
|     if (ctx->start && (x >= mx_x - cur_len)) |     if (ctx->start && (x >= mx_x - cur_len)) { | ||||||
|         ctx->start = MAX(0, ctx->start - 1 + (s_len - cur_len)); |         ctx->start = MAX(0, ctx->start - 1 + (s_len - cur_len)); | ||||||
|     else if (ctx->start) |     } else if (ctx->start) { | ||||||
|         ctx->start = MAX(0, ctx->start - cur_len); |         ctx->start = MAX(0, ctx->start - cur_len); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* moves cursor/line position right in input field and buffer */ | /* moves cursor/line position right in input field and buffer */ | ||||||
| static void input_mv_right(ToxWindow *self, int x, int mx_x) | static void input_mv_right(ToxWindow *self, int x, int mx_x) | ||||||
| { | { | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
|     if (ctx->pos >= ctx->len) |     if (ctx->pos >= ctx->len) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ++ctx->pos; |     ++ctx->pos; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										105
									
								
								src/line_info.c
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								src/line_info.c
									
									
									
									
									
								
							| @@ -40,8 +40,9 @@ void line_info_init(struct history *hst) | |||||||
| { | { | ||||||
|     hst->line_root = calloc(1, sizeof(struct line_info)); |     hst->line_root = calloc(1, sizeof(struct line_info)); | ||||||
|  |  | ||||||
|     if (hst->line_root == NULL) |     if (hst->line_root == NULL) { | ||||||
|         exit_toxic_err("failed in line_info_init", FATALERR_MEMORY); |         exit_toxic_err("failed in line_info_init", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     hst->line_start = hst->line_root; |     hst->line_start = hst->line_root; | ||||||
|     hst->line_end = hst->line_start; |     hst->line_end = hst->line_start; | ||||||
| @@ -53,8 +54,9 @@ void line_info_reset_start(ToxWindow *self, struct history *hst) | |||||||
| { | { | ||||||
|     struct line_info *line = hst->line_end; |     struct line_info *line = hst->line_end; | ||||||
|  |  | ||||||
|     if (line->prev == NULL) |     if (line->prev == NULL) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int y2, x2; |     int y2, x2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
| @@ -88,9 +90,10 @@ void line_info_cleanup(struct history *hst) | |||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < hst->queue_sz; ++i) { |     for (i = 0; i < hst->queue_sz; ++i) { | ||||||
|         if (hst->queue[i]) |         if (hst->queue[i]) { | ||||||
|             free(hst->queue[i]); |             free(hst->queue[i]); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     free(hst); |     free(hst); | ||||||
| } | } | ||||||
| @@ -114,15 +117,17 @@ static void line_info_root_fwd(struct history *hst) | |||||||
| /* returns ptr to queue item 0 and removes it from queue. Returns NULL if queue is empty. */ | /* returns ptr to queue item 0 and removes it from queue. Returns NULL if queue is empty. */ | ||||||
| static struct line_info *line_info_ret_queue(struct history *hst) | static struct line_info *line_info_ret_queue(struct history *hst) | ||||||
| { | { | ||||||
|     if (hst->queue_sz <= 0) |     if (hst->queue_sz <= 0) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct line_info *line = hst->queue[0]; |     struct line_info *line = hst->queue[0]; | ||||||
|  |  | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < hst->queue_sz; ++i) |     for (i = 0; i < hst->queue_sz; ++i) { | ||||||
|         hst->queue[i] = hst->queue[i + 1]; |         hst->queue[i] = hst->queue[i + 1]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     --hst->queue_sz; |     --hst->queue_sz; | ||||||
|  |  | ||||||
| @@ -137,18 +142,21 @@ static struct line_info *line_info_ret_queue(struct history *hst) | |||||||
| int line_info_add(ToxWindow *self, const char *timestr, const char *name1, const char *name2, uint8_t type, | int line_info_add(ToxWindow *self, const char *timestr, const char *name1, const char *name2, uint8_t type, | ||||||
|                   uint8_t bold, uint8_t colour, const char *msg, ...) |                   uint8_t bold, uint8_t colour, const char *msg, ...) | ||||||
| { | { | ||||||
|     if (!self) |     if (!self) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct history *hst = self->chatwin->hst; |     struct history *hst = self->chatwin->hst; | ||||||
|  |  | ||||||
|     if (hst->queue_sz >= MAX_LINE_INFO_QUEUE) |     if (hst->queue_sz >= MAX_LINE_INFO_QUEUE) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct line_info *new_line = calloc(1, sizeof(struct line_info)); |     struct line_info *new_line = calloc(1, sizeof(struct line_info)); | ||||||
|  |  | ||||||
|     if (new_line == NULL) |     if (new_line == NULL) { | ||||||
|         exit_toxic_err("failed in line_info_add", FATALERR_MEMORY); |         exit_toxic_err("failed in line_info_add", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char frmt_msg[MAX_LINE_INFO_MSG_SIZE] = {0}; |     char frmt_msg[MAX_LINE_INFO_MSG_SIZE] = {0}; | ||||||
|  |  | ||||||
| @@ -206,10 +214,11 @@ int line_info_add(ToxWindow *self, const char *timestr, const char *name1, const | |||||||
|         int i; |         int i; | ||||||
|  |  | ||||||
|         for (i = 0; frmt_msg[i]; ++i) { |         for (i = 0; frmt_msg[i]; ++i) { | ||||||
|             if (frmt_msg[i] == '\n') |             if (frmt_msg[i] == '\n') { | ||||||
|                 ++new_line->newlines; |                 ++new_line->newlines; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (timestr) { |     if (timestr) { | ||||||
|         snprintf(new_line->timestr, sizeof(new_line->timestr), "%s", timestr); |         snprintf(new_line->timestr, sizeof(new_line->timestr), "%s", timestr); | ||||||
| @@ -245,11 +254,13 @@ static void line_info_check_queue(ToxWindow *self) | |||||||
|     struct history *hst = self->chatwin->hst; |     struct history *hst = self->chatwin->hst; | ||||||
|     struct line_info *line = line_info_ret_queue(hst); |     struct line_info *line = line_info_ret_queue(hst); | ||||||
|  |  | ||||||
|     if (line == NULL) |     if (line == NULL) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (hst->start_id > user_settings->history_size) |     if (hst->start_id > user_settings->history_size) { | ||||||
|         line_info_root_fwd(hst); |         line_info_root_fwd(hst); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     line->prev = hst->line_end; |     line->prev = hst->line_end; | ||||||
|     hst->line_end->next = line; |     hst->line_end->next = line; | ||||||
| @@ -261,8 +272,9 @@ static void line_info_check_queue(ToxWindow *self) | |||||||
|     getyx(self->chatwin->history, y, x); |     getyx(self->chatwin->history, y, x); | ||||||
|     (void) x; |     (void) x; | ||||||
|  |  | ||||||
|     if (x2 <= SIDEBAR_WIDTH) |     if (x2 <= SIDEBAR_WIDTH) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int offst = self->show_peerlist ? SIDEBAR_WIDTH : 0;   /* offset width of groupchat sidebar */ |     int offst = self->show_peerlist ? SIDEBAR_WIDTH : 0;   /* offset width of groupchat sidebar */ | ||||||
|     int lines = 1 + line->newlines + (line->len / (x2 - offst)); |     int lines = 1 + line->newlines + (line->len / (x2 - offst)); | ||||||
| @@ -284,8 +296,9 @@ void line_info_print(ToxWindow *self) | |||||||
| { | { | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
|     if (ctx == NULL) |     if (ctx == NULL) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct history *hst = ctx->hst; |     struct history *hst = ctx->hst; | ||||||
|  |  | ||||||
| @@ -293,19 +306,25 @@ void line_info_print(ToxWindow *self) | |||||||
|     line_info_check_queue(self); |     line_info_check_queue(self); | ||||||
|  |  | ||||||
|     WINDOW *win = ctx->history; |     WINDOW *win = ctx->history; | ||||||
|  |  | ||||||
|     wclear(win); |     wclear(win); | ||||||
|  |  | ||||||
|     int y2, x2; |     int y2, x2; | ||||||
|  |  | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (x2 <= SIDEBAR_WIDTH) |     if (x2 <= SIDEBAR_WIDTH) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (self->is_groupchat) |     if (self->is_groupchat) { | ||||||
|         wmove(win, 0, 0); |         wmove(win, 0, 0); | ||||||
|     else |     } else { | ||||||
|         wmove(win, 2, 0); |         wmove(win, 2, 0); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct line_info *line = hst->line_start->next; |     struct line_info *line = hst->line_start->next; | ||||||
|  |  | ||||||
|     int numlines = 0; |     int numlines = 0; | ||||||
|  |  | ||||||
|     while (line && numlines++ <= y2) { |     while (line && numlines++ <= y2) { | ||||||
| @@ -325,10 +344,11 @@ void line_info_print(ToxWindow *self) | |||||||
|  |  | ||||||
|                 int nameclr = GREEN; |                 int nameclr = GREEN; | ||||||
|  |  | ||||||
|                 if (line->colour) |                 if (line->colour) { | ||||||
|                     nameclr = line->colour; |                     nameclr = line->colour; | ||||||
|                 else if (type == IN_MSG) |                 } else if (type == IN_MSG) { | ||||||
|                     nameclr = CYAN; |                     nameclr = CYAN; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 wattron(win, COLOR_PAIR(nameclr)); |                 wattron(win, COLOR_PAIR(nameclr)); | ||||||
|                 wprintw(win, "%s %s: ", user_settings->line_normal, line->name1); |                 wprintw(win, "%s %s: ", user_settings->line_normal, line->name1); | ||||||
| @@ -339,22 +359,25 @@ void line_info_print(ToxWindow *self) | |||||||
|                 while (msg) { |                 while (msg) { | ||||||
|                     char *line = strsep(&msg, "\n"); |                     char *line = strsep(&msg, "\n"); | ||||||
|  |  | ||||||
|                     if (line[0] == '>') |                     if (line[0] == '>') { | ||||||
|                         wattron(win, COLOR_PAIR(GREEN)); |                         wattron(win, COLOR_PAIR(GREEN)); | ||||||
|                     else if (line[0] == '<') |                     } else if (line[0] == '<') { | ||||||
|                         wattron(win, COLOR_PAIR(RED)); |                         wattron(win, COLOR_PAIR(RED)); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|                     wprintw(win, "%s%c", line, msg ? '\n' : '\0'); |                     wprintw(win, "%s%c", line, msg ? '\n' : '\0'); | ||||||
|  |  | ||||||
|                     if (line[0] == '>') |                     if (line[0] == '>') { | ||||||
|                         wattroff(win, COLOR_PAIR(GREEN)); |                         wattroff(win, COLOR_PAIR(GREEN)); | ||||||
|                     else if (line[0] == '<') |                     } else if (line[0] == '<') { | ||||||
|                         wattroff(win, COLOR_PAIR(RED)); |                         wattroff(win, COLOR_PAIR(RED)); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|                     // change the \0 set by strsep back to \n |                     // change the \0 set by strsep back to \n | ||||||
|                     if (msg) |                     if (msg) { | ||||||
|                         msg[-1] = '\n'; |                         msg[-1] = '\n'; | ||||||
|                     } |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 if (type == OUT_MSG && timed_out(line->timestamp, NOREAD_FLAG_TIMEOUT)) { |                 if (type == OUT_MSG && timed_out(line->timestamp, NOREAD_FLAG_TIMEOUT)) { | ||||||
|                     wattron(win, COLOR_PAIR(RED)); |                     wattron(win, COLOR_PAIR(RED)); | ||||||
| @@ -406,19 +429,23 @@ void line_info_print(ToxWindow *self) | |||||||
|                     wattroff(win, COLOR_PAIR(BLUE)); |                     wattroff(win, COLOR_PAIR(BLUE)); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 if (line->bold) |                 if (line->bold) { | ||||||
|                     wattron(win, A_BOLD); |                     wattron(win, A_BOLD); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 if (line->colour) |                 if (line->colour) { | ||||||
|                     wattron(win, COLOR_PAIR(line->colour)); |                     wattron(win, COLOR_PAIR(line->colour)); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 wprintw(win, "%s\n", line->msg); |                 wprintw(win, "%s\n", line->msg); | ||||||
|  |  | ||||||
|                 if (line->bold) |                 if (line->bold) { | ||||||
|                     wattroff(win, A_BOLD); |                     wattroff(win, A_BOLD); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 if (line->colour) |                 if (line->colour) { | ||||||
|                     wattroff(win, COLOR_PAIR(line->colour)); |                     wattroff(win, COLOR_PAIR(line->colour)); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
| @@ -427,8 +454,9 @@ void line_info_print(ToxWindow *self) | |||||||
|                 wprintw(win, "$ "); |                 wprintw(win, "$ "); | ||||||
|                 wattroff(win, COLOR_PAIR(GREEN)); |                 wattroff(win, COLOR_PAIR(GREEN)); | ||||||
|  |  | ||||||
|                 if (line->msg[0]) |                 if (line->msg[0]) { | ||||||
|                     wprintw(win, "%s", line->msg); |                     wprintw(win, "%s", line->msg); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 wprintw(win, "\n"); |                 wprintw(win, "\n"); | ||||||
|                 break; |                 break; | ||||||
| @@ -492,9 +520,10 @@ void line_info_print(ToxWindow *self) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* keep calling until queue is empty */ |     /* keep calling until queue is empty */ | ||||||
|     if (hst->queue_sz > 0) |     if (hst->queue_sz > 0) { | ||||||
|         line_info_print(self); |         line_info_print(self); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* puts msg in specified line_info msg buffer */ | /* puts msg in specified line_info msg buffer */ | ||||||
| void line_info_set(ToxWindow *self, uint32_t id, char *msg) | void line_info_set(ToxWindow *self, uint32_t id, char *msg) | ||||||
| @@ -518,16 +547,20 @@ void line_info_set(ToxWindow *self, uint32_t id, char *msg) | |||||||
|  |  | ||||||
| static void line_info_scroll_up(struct history *hst) | static void line_info_scroll_up(struct history *hst) | ||||||
| { | { | ||||||
|     if (hst->line_start->prev) |     if (hst->line_start->prev) { | ||||||
|         hst->line_start = hst->line_start->prev; |         hst->line_start = hst->line_start->prev; | ||||||
|     else sound_notify(NULL, notif_error, NT_ALWAYS, NULL); |     } else { | ||||||
|  |         sound_notify(NULL, notif_error, NT_ALWAYS, NULL); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void line_info_scroll_down(struct history *hst) | static void line_info_scroll_down(struct history *hst) | ||||||
| { | { | ||||||
|     if (hst->line_start->next) |     if (hst->line_start->next) { | ||||||
|         hst->line_start = hst->line_start->next; |         hst->line_start = hst->line_start->next; | ||||||
|     else sound_notify(NULL, notif_error, NT_ALWAYS, NULL); |     } else { | ||||||
|  |         sound_notify(NULL, notif_error, NT_ALWAYS, NULL); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void line_info_page_up(ToxWindow *self, struct history *hst) | static void line_info_page_up(ToxWindow *self, struct history *hst) | ||||||
| @@ -538,9 +571,10 @@ static void line_info_page_up(ToxWindow *self, struct history *hst) | |||||||
|     int jump_dist = y2 / 2; |     int jump_dist = y2 / 2; | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < jump_dist && hst->line_start->prev; ++i) |     for (i = 0; i < jump_dist && hst->line_start->prev; ++i) { | ||||||
|         hst->line_start = hst->line_start->prev; |         hst->line_start = hst->line_start->prev; | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| static void line_info_page_down(ToxWindow *self, struct history *hst) | static void line_info_page_down(ToxWindow *self, struct history *hst) | ||||||
| { | { | ||||||
| @@ -550,9 +584,10 @@ static void line_info_page_down(ToxWindow *self, struct history *hst) | |||||||
|     int jump_dist = y2 / 2; |     int jump_dist = y2 / 2; | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < jump_dist && hst->line_start->next; ++i) |     for (i = 0; i < jump_dist && hst->line_start->next; ++i) { | ||||||
|         hst->line_start = hst->line_start->next; |         hst->line_start = hst->line_start->next; | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| bool line_info_onKey(ToxWindow *self, wint_t key) | bool line_info_onKey(ToxWindow *self, wint_t key) | ||||||
| { | { | ||||||
|   | |||||||
							
								
								
									
										64
									
								
								src/log.c
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								src/log.c
									
									
									
									
									
								
							| @@ -45,8 +45,9 @@ extern struct user_settings *user_settings; | |||||||
|    Returns 0 on success, -1 if the path is too long */ |    Returns 0 on success, -1 if the path is too long */ | ||||||
| static int get_log_path(char *dest, int destsize, char *name, const char *selfkey, const char *otherkey, int logtype) | static int get_log_path(char *dest, int destsize, char *name, const char *selfkey, const char *otherkey, int logtype) | ||||||
| { | { | ||||||
|     if (!valid_nick(name)) |     if (!valid_nick(name)) { | ||||||
|         name = UNKNOWN_NAME; |         name = UNKNOWN_NAME; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     const char *namedash = logtype == LOG_PROMPT ? "" : "-"; |     const char *namedash = logtype == LOG_PROMPT ? "" : "-"; | ||||||
|     const char *set_path = user_settings->chatlogs_path; |     const char *set_path = user_settings->chatlogs_path; | ||||||
| @@ -85,10 +86,11 @@ static int get_log_path(char *dest, int destsize, char *name, const char *selfke | |||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!string_is_empty(set_path)) |     if (!string_is_empty(set_path)) { | ||||||
|         snprintf(dest, destsize, "%s%s-%s%s%s.log", set_path, self_id, name, namedash, other_id); |         snprintf(dest, destsize, "%s%s-%s%s%s.log", set_path, self_id, name, namedash, other_id); | ||||||
|     else |     } else { | ||||||
|         snprintf(dest, destsize, "%s%s%s-%s%s%s.log", user_config_dir, LOGDIR, self_id, name, namedash, other_id); |         snprintf(dest, destsize, "%s%s%s-%s%s%s.log", user_config_dir, LOGDIR, self_id, name, namedash, other_id); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     free(user_config_dir); |     free(user_config_dir); | ||||||
|  |  | ||||||
| @@ -98,19 +100,22 @@ static int get_log_path(char *dest, int destsize, char *name, const char *selfke | |||||||
| /* Opens log file or creates a new one */ | /* Opens log file or creates a new one */ | ||||||
| static int init_logging_session(char *name, const char *selfkey, const char *otherkey, struct chatlog *log, int logtype) | static int init_logging_session(char *name, const char *selfkey, const char *otherkey, struct chatlog *log, int logtype) | ||||||
| { | { | ||||||
|     if (selfkey == NULL || (logtype == LOG_CHAT && otherkey == NULL)) |     if (selfkey == NULL || (logtype == LOG_CHAT && otherkey == NULL)) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char log_path[MAX_STR_SIZE]; |     char log_path[MAX_STR_SIZE]; | ||||||
|  |  | ||||||
|     if (get_log_path(log_path, sizeof(log_path), name, selfkey, otherkey, logtype) == -1) |     if (get_log_path(log_path, sizeof(log_path), name, selfkey, otherkey, logtype) == -1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     log->file = fopen(log_path, "a+"); |     log->file = fopen(log_path, "a+"); | ||||||
|     snprintf(log->path, sizeof(log->path), "%s", log_path); |     snprintf(log->path, sizeof(log->path), "%s", log_path); | ||||||
|  |  | ||||||
|     if (log->file == NULL) |     if (log->file == NULL) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @@ -119,8 +124,9 @@ static int init_logging_session(char *name, const char *selfkey, const char *oth | |||||||
|  |  | ||||||
| void write_to_log(const char *msg, const char *name, struct chatlog *log, bool event) | void write_to_log(const char *msg, const char *name, struct chatlog *log, bool event) | ||||||
| { | { | ||||||
|     if (!log->log_on) |     if (!log->log_on) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (log->file == NULL) { |     if (log->file == NULL) { | ||||||
|         log->log_on = false; |         log->log_on = false; | ||||||
| @@ -129,10 +135,11 @@ void write_to_log(const char *msg, const char *name, struct chatlog *log, bool e | |||||||
|  |  | ||||||
|     char name_frmt[TOXIC_MAX_NAME_LENGTH + 3]; |     char name_frmt[TOXIC_MAX_NAME_LENGTH + 3]; | ||||||
|  |  | ||||||
|     if (event) |     if (event) { | ||||||
|         snprintf(name_frmt, sizeof(name_frmt), "* %s", name); |         snprintf(name_frmt, sizeof(name_frmt), "* %s", name); | ||||||
|     else |     } else { | ||||||
|         snprintf(name_frmt, sizeof(name_frmt), "%s:", name); |         snprintf(name_frmt, sizeof(name_frmt), "%s:", name); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     const char *t = user_settings->log_timestamp_format; |     const char *t = user_settings->log_timestamp_format; | ||||||
|     char s[MAX_STR_SIZE]; |     char s[MAX_STR_SIZE]; | ||||||
| @@ -147,8 +154,9 @@ void write_to_log(const char *msg, const char *name, struct chatlog *log, bool e | |||||||
|  |  | ||||||
| void log_disable(struct chatlog *log) | void log_disable(struct chatlog *log) | ||||||
| { | { | ||||||
|     if (log->file != NULL) |     if (log->file != NULL) { | ||||||
|         fclose(log->file); |         fclose(log->file); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     memset(log, 0, sizeof(struct chatlog)); |     memset(log, 0, sizeof(struct chatlog)); | ||||||
| } | } | ||||||
| @@ -157,8 +165,9 @@ int log_enable(char *name, const char *selfkey, const char *otherkey, struct cha | |||||||
| { | { | ||||||
|     log->log_on = true; |     log->log_on = true; | ||||||
|  |  | ||||||
|     if (log->file != NULL) |     if (log->file != NULL) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (init_logging_session(name, selfkey, otherkey, log, logtype) == -1) { |     if (init_logging_session(name, selfkey, otherkey, log, logtype) == -1) { | ||||||
|         log_disable(log); |         log_disable(log); | ||||||
| @@ -171,18 +180,21 @@ int log_enable(char *name, const char *selfkey, const char *otherkey, struct cha | |||||||
| /* Loads previous history from chat log */ | /* Loads previous history from chat log */ | ||||||
| void load_chat_history(ToxWindow *self, struct chatlog *log) | void load_chat_history(ToxWindow *self, struct chatlog *log) | ||||||
| { | { | ||||||
|     if (log->file == NULL) |     if (log->file == NULL) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     off_t sz = file_size(log->path); |     off_t sz = file_size(log->path); | ||||||
|  |  | ||||||
|     if (sz <= 0) |     if (sz <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char *hstbuf = malloc(sz + 1); |     char *hstbuf = malloc(sz + 1); | ||||||
|  |  | ||||||
|     if (hstbuf == NULL) |     if (hstbuf == NULL) { | ||||||
|         exit_toxic_err("failed in load_chat_history", FATALERR_MEMORY); |         exit_toxic_err("failed in load_chat_history", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (fseek(log->file, 0L, SEEK_SET) == -1) { |     if (fseek(log->file, 0L, SEEK_SET) == -1) { | ||||||
|         free(hstbuf); |         free(hstbuf); | ||||||
| @@ -204,9 +216,10 @@ void load_chat_history(ToxWindow *self, struct chatlog *log) | |||||||
|  |  | ||||||
|     /* start at end and backtrace L lines or to the beginning of buffer */ |     /* start at end and backtrace L lines or to the beginning of buffer */ | ||||||
|     for (start = sz - 1; start >= 0 && count < L; --start) { |     for (start = sz - 1; start >= 0 && count < L; --start) { | ||||||
|         if (hstbuf[start] == '\n') |         if (hstbuf[start] == '\n') { | ||||||
|             ++count; |             ++count; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     const char *line = strtok(&hstbuf[start + 1], "\n"); |     const char *line = strtok(&hstbuf[start + 1], "\n"); | ||||||
|  |  | ||||||
| @@ -238,33 +251,40 @@ int rename_logfile(char *src, char *dest, const char *selfkey, const char *other | |||||||
|         log_on = log->log_on; |         log_on = log->log_on; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (log_on) |     if (log_on) { | ||||||
|         log_disable(log); |         log_disable(log); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char newpath[MAX_STR_SIZE]; |     char newpath[MAX_STR_SIZE]; | ||||||
|     char oldpath[MAX_STR_SIZE]; |     char oldpath[MAX_STR_SIZE]; | ||||||
|  |  | ||||||
|     if (get_log_path(oldpath, sizeof(oldpath), src, selfkey, otherkey, LOG_CHAT) == -1) |     if (get_log_path(oldpath, sizeof(oldpath), src, selfkey, otherkey, LOG_CHAT) == -1) { | ||||||
|         goto on_error; |         goto on_error; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!file_exists(oldpath)) |     if (!file_exists(oldpath)) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (get_log_path(newpath, sizeof(newpath), dest, selfkey, otherkey, LOG_CHAT) == -1) |     if (get_log_path(newpath, sizeof(newpath), dest, selfkey, otherkey, LOG_CHAT) == -1) { | ||||||
|         goto on_error; |         goto on_error; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (rename(oldpath, newpath) != 0) |     if (rename(oldpath, newpath) != 0) { | ||||||
|         goto on_error; |         goto on_error; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (log_on) |     if (log_on) { | ||||||
|         log_enable(dest, selfkey, otherkey, log, LOG_CHAT); |         log_enable(dest, selfkey, otherkey, log, LOG_CHAT); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
|  |  | ||||||
| on_error: | on_error: | ||||||
|  |  | ||||||
|     if (log_on) |     if (log_on) { | ||||||
|         log_enable(src, selfkey, otherkey, log, LOG_CHAT); |         log_enable(src, selfkey, otherkey, log, LOG_CHAT); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -50,8 +50,9 @@ void cqueue_add(struct chat_queue *q, const char *msg, size_t len, uint8_t type, | |||||||
|  |  | ||||||
|     struct cqueue_msg *new_m = malloc(sizeof(struct cqueue_msg)); |     struct cqueue_msg *new_m = malloc(sizeof(struct cqueue_msg)); | ||||||
|  |  | ||||||
|     if (new_m == NULL) |     if (new_m == NULL) { | ||||||
|         exit_toxic_err("failed in cqueue_message", FATALERR_MEMORY); |         exit_toxic_err("failed in cqueue_message", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     snprintf(new_m->message, sizeof(new_m->message), "%s", msg); |     snprintf(new_m->message, sizeof(new_m->message), "%s", msg); | ||||||
|     new_m->len = len; |     new_m->len = len; | ||||||
| @@ -118,8 +119,9 @@ void cqueue_remove(ToxWindow *self, Tox *m, uint32_t receipt) | |||||||
|         struct cqueue_msg *next = msg->next; |         struct cqueue_msg *next = msg->next; | ||||||
|  |  | ||||||
|         if (msg->prev == NULL) {    /* root */ |         if (msg->prev == NULL) {    /* root */ | ||||||
|             if (next) |             if (next) { | ||||||
|                 next->prev = NULL; |                 next->prev = NULL; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             free(msg); |             free(msg); | ||||||
|             q->root = next; |             q->root = next; | ||||||
|   | |||||||
| @@ -93,20 +93,22 @@ void get_time_str(char *buf, int bufsize) | |||||||
| /* Converts seconds to string in format HH:mm:ss; truncates hours and minutes when necessary */ | /* Converts seconds to string in format HH:mm:ss; truncates hours and minutes when necessary */ | ||||||
| void get_elapsed_time_str(char *buf, int bufsize, time_t secs) | void get_elapsed_time_str(char *buf, int bufsize, time_t secs) | ||||||
| { | { | ||||||
|     if (!secs) |     if (!secs) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     long int seconds = secs % 60; |     long int seconds = secs % 60; | ||||||
|     long int minutes = (secs % 3600) / 60; |     long int minutes = (secs % 3600) / 60; | ||||||
|     long int hours = secs / 3600; |     long int hours = secs / 3600; | ||||||
|  |  | ||||||
|     if (!minutes && !hours) |     if (!minutes && !hours) { | ||||||
|         snprintf(buf, bufsize, "%.2ld", seconds); |         snprintf(buf, bufsize, "%.2ld", seconds); | ||||||
|     else if (!hours) |     } else if (!hours) { | ||||||
|         snprintf(buf, bufsize, "%ld:%.2ld", minutes, seconds); |         snprintf(buf, bufsize, "%ld:%.2ld", minutes, seconds); | ||||||
|     else |     } else { | ||||||
|         snprintf(buf, bufsize, "%ld:%.2ld:%.2ld", hours, minutes, seconds); |         snprintf(buf, bufsize, "%ld:%.2ld:%.2ld", hours, minutes, seconds); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Converts a hexidecimal string of length hex_len to binary format and puts the result in output. |  * Converts a hexidecimal string of length hex_len to binary format and puts the result in output. | ||||||
| @@ -117,8 +119,9 @@ void get_elapsed_time_str(char *buf, int bufsize, time_t secs) | |||||||
|  */ |  */ | ||||||
| int hex_string_to_bin(const char *hex_string, size_t hex_len, char *output, size_t output_size) | int hex_string_to_bin(const char *hex_string, size_t hex_len, char *output, size_t output_size) | ||||||
| { | { | ||||||
|     if (output_size == 0 || hex_len != output_size * 2) |     if (output_size == 0 || hex_len != output_size * 2) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     for (size_t i = 0; i < output_size; ++i) { |     for (size_t i = 0; i < output_size; ++i) { | ||||||
|         sscanf(hex_string, "%2hhx", &output[i]); |         sscanf(hex_string, "%2hhx", &output[i]); | ||||||
| @@ -130,8 +133,9 @@ int hex_string_to_bin(const char *hex_string, size_t hex_len, char *output, size | |||||||
|  |  | ||||||
| int hex_string_to_bytes(char *buf, int size, const char *keystr) | int hex_string_to_bytes(char *buf, int size, const char *keystr) | ||||||
| { | { | ||||||
|     if (size % 2 != 0) |     if (size % 2 != 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int i, res; |     int i, res; | ||||||
|     const char *pos = keystr; |     const char *pos = keystr; | ||||||
| @@ -140,9 +144,10 @@ int hex_string_to_bytes(char *buf, int size, const char *keystr) | |||||||
|         res = sscanf(pos, "%2hhx", &buf[i]); |         res = sscanf(pos, "%2hhx", &buf[i]); | ||||||
|         pos += 2; |         pos += 2; | ||||||
|  |  | ||||||
|         if (res == EOF || res < 1) |         if (res == EOF || res < 1) { | ||||||
|             return -1; |             return -1; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @@ -154,13 +159,15 @@ int hex_string_to_bytes(char *buf, int size, const char *keystr) | |||||||
|  */ |  */ | ||||||
| int bin_id_to_string(const char *bin_id, size_t bin_id_size, char *output, size_t output_size) | int bin_id_to_string(const char *bin_id, size_t bin_id_size, char *output, size_t output_size) | ||||||
| { | { | ||||||
|     if (bin_id_size != TOX_ADDRESS_SIZE || output_size < (TOX_ADDRESS_SIZE * 2 + 1)) |     if (bin_id_size != TOX_ADDRESS_SIZE || output_size < (TOX_ADDRESS_SIZE * 2 + 1)) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < TOX_ADDRESS_SIZE; ++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; |     return 0; | ||||||
| } | } | ||||||
| @@ -168,8 +175,9 @@ int bin_id_to_string(const char *bin_id, size_t bin_id_size, char *output, size_ | |||||||
| /* Returns 1 if the string is empty, 0 otherwise */ | /* Returns 1 if the string is empty, 0 otherwise */ | ||||||
| int string_is_empty(const char *string) | int string_is_empty(const char *string) | ||||||
| { | { | ||||||
|     if (!string) |     if (!string) { | ||||||
|         return true; |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return string[0] == '\0'; |     return string[0] == '\0'; | ||||||
| } | } | ||||||
| @@ -177,8 +185,9 @@ int string_is_empty(const char *string) | |||||||
| /* Returns 1 if the string is empty, 0 otherwise */ | /* Returns 1 if the string is empty, 0 otherwise */ | ||||||
| int wstring_is_empty(const wchar_t *string) | int wstring_is_empty(const wchar_t *string) | ||||||
| { | { | ||||||
|     if (!string) |     if (!string) { | ||||||
|         return true; |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return string[0] == L'\0'; |     return string[0] == L'\0'; | ||||||
| } | } | ||||||
| @@ -188,11 +197,13 @@ int mbs_to_wcs_buf(wchar_t *buf, const char *string, size_t n) | |||||||
| { | { | ||||||
|     size_t len = mbstowcs(NULL, string, 0) + 1; |     size_t len = mbstowcs(NULL, string, 0) + 1; | ||||||
|  |  | ||||||
|     if (n < len) |     if (n < len) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if ((len = mbstowcs(buf, string, n)) == (size_t) - 1) |     if ((len = mbstowcs(buf, string, n)) == (size_t) - 1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return len; |     return len; | ||||||
| } | } | ||||||
| @@ -202,11 +213,13 @@ int wcs_to_mbs_buf(char *buf, const wchar_t *string, size_t n) | |||||||
| { | { | ||||||
|     size_t len = wcstombs(NULL, string, 0) + 1; |     size_t len = wcstombs(NULL, string, 0) + 1; | ||||||
|  |  | ||||||
|     if (n < len) |     if (n < len) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if ((len = wcstombs(buf, string, n)) == (size_t) - 1) |     if ((len = wcstombs(buf, string, n)) == (size_t) - 1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return len; |     return len; | ||||||
| } | } | ||||||
| @@ -225,8 +238,9 @@ int qsort_strcasecmp_hlpr(const void *str1, const void *str2) | |||||||
|       - must not contain a newline or tab seqeunce */ |       - must not contain a newline or tab seqeunce */ | ||||||
| int valid_nick(const char *nick) | int valid_nick(const char *nick) | ||||||
| { | { | ||||||
|     if (!nick[0] || nick[0] == ' ') |     if (!nick[0] || nick[0] == ' ') { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
| @@ -238,8 +252,10 @@ int valid_nick(const char *nick) | |||||||
|                 || nick[i] == '\v' |                 || nick[i] == '\v' | ||||||
|                 || nick[i] == '\r') |                 || nick[i] == '\r') | ||||||
|  |  | ||||||
|  |         { | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
| @@ -250,10 +266,11 @@ void filter_str(char *str, size_t len) | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < len; ++i) { |     for (i = 0; i < len; ++i) { | ||||||
|         if (str[i] == '\n' || str[i] == '\r' || str[i] == '\t' || str[i] == '\v' || str[i] == '\0') |         if (str[i] == '\n' || str[i] == '\r' || str[i] == '\t' || str[i] == '\v' || str[i] == '\0') { | ||||||
|             str[i] = ' '; |             str[i] = ' '; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* gets base file name from path or original file name if no path is supplied. | /* gets base file name from path or original file name if no path is supplied. | ||||||
|  * Returns the file name length |  * Returns the file name length | ||||||
| @@ -263,23 +280,27 @@ size_t get_file_name(char *namebuf, size_t bufsize, const char *pathname) | |||||||
|     int len = strlen(pathname) - 1; |     int len = strlen(pathname) - 1; | ||||||
|     char *path = strdup(pathname); |     char *path = strdup(pathname); | ||||||
|  |  | ||||||
|     if (path == NULL) |     if (path == NULL) { | ||||||
|         exit_toxic_err("failed in get_file_name", FATALERR_MEMORY); |         exit_toxic_err("failed in get_file_name", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     while (len >= 0 && pathname[len] == '/') |     while (len >= 0 && pathname[len] == '/') { | ||||||
|         path[len--] = '\0'; |         path[len--] = '\0'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char *finalname = strdup(path); |     char *finalname = strdup(path); | ||||||
|  |  | ||||||
|     if (finalname == NULL) |     if (finalname == NULL) { | ||||||
|         exit_toxic_err("failed in get_file_name", FATALERR_MEMORY); |         exit_toxic_err("failed in get_file_name", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     const char *basenm = strrchr(path, '/'); |     const char *basenm = strrchr(path, '/'); | ||||||
|  |  | ||||||
|     if (basenm != NULL) { |     if (basenm != NULL) { | ||||||
|         if (basenm[1]) |         if (basenm[1]) { | ||||||
|             strcpy(finalname, &basenm[1]); |             strcpy(finalname, &basenm[1]); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     snprintf(namebuf, bufsize, "%s", finalname); |     snprintf(namebuf, bufsize, "%s", finalname); | ||||||
|     free(finalname); |     free(finalname); | ||||||
| @@ -295,13 +316,15 @@ size_t get_file_name(char *namebuf, size_t bufsize, const char *pathname) | |||||||
|  */ |  */ | ||||||
| size_t get_base_dir(const char *path, size_t path_len, char *dir) | size_t get_base_dir(const char *path, size_t path_len, char *dir) | ||||||
| { | { | ||||||
|     if (path_len == 0 || path == NULL) |     if (path_len == 0 || path == NULL) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     size_t dir_len = char_rfind(path, '/', path_len); |     size_t dir_len = char_rfind(path, '/', path_len); | ||||||
|  |  | ||||||
|     if (dir_len != 0 && dir_len < path_len) |     if (dir_len != 0 && dir_len < path_len) { | ||||||
|         ++dir_len;    /* Leave trailing slash */ |         ++dir_len;    /* Leave trailing slash */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|     memcpy(dir, path, dir_len); |     memcpy(dir, path, dir_len); | ||||||
|     dir[dir_len] = '\0'; |     dir[dir_len] = '\0'; | ||||||
| @@ -314,9 +337,10 @@ void str_to_lower(char *str) | |||||||
| { | { | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; str[i]; ++i) |     for (i = 0; str[i]; ++i) { | ||||||
|         str[i] = tolower(str[i]); |         str[i] = tolower(str[i]); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* puts friendnum's nick in buf, truncating at TOXIC_MAX_NAME_LENGTH if necessary. | /* puts friendnum's nick in buf, truncating at TOXIC_MAX_NAME_LENGTH if necessary. | ||||||
|    if toxcore API call fails, put UNKNOWN_NAME in buf |    if toxcore API call fails, put UNKNOWN_NAME in buf | ||||||
| @@ -401,9 +425,10 @@ int char_find(int idx, const char *s, char ch) | |||||||
|     int i = idx; |     int i = idx; | ||||||
|  |  | ||||||
|     for (i = idx; s[i]; ++i) { |     for (i = idx; s[i]; ++i) { | ||||||
|         if (s[i] == ch) |         if (s[i] == ch) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return i; |     return i; | ||||||
| } | } | ||||||
| @@ -419,9 +444,10 @@ int char_rfind(const char *s, char ch, int len) | |||||||
|     int i = 0; |     int i = 0; | ||||||
|  |  | ||||||
|     for (i = len; i > 0; --i) { |     for (i = len; i > 0; --i) { | ||||||
|         if (s[i] == ch) |         if (s[i] == ch) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return i; |     return i; | ||||||
| } | } | ||||||
| @@ -460,8 +486,9 @@ off_t file_size(const char *path) | |||||||
| { | { | ||||||
|     struct stat st; |     struct stat st; | ||||||
|  |  | ||||||
|     if (stat(path, &st) == -1) |     if (stat(path, &st) == -1) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return st.st_size; |     return st.st_size; | ||||||
| } | } | ||||||
| @@ -474,13 +501,15 @@ int check_file_signature(const char *signature, size_t size, FILE *fp) | |||||||
| { | { | ||||||
|     char buf[size]; |     char buf[size]; | ||||||
|  |  | ||||||
|     if (fread(buf, size, 1, fp) != 1) |     if (fread(buf, size, 1, fp) != 1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int ret = memcmp(signature, buf, size); |     int ret = memcmp(signature, buf, size); | ||||||
|  |  | ||||||
|     if (fseek(fp, 0L, SEEK_SET) == -1) |     if (fseek(fp, 0L, SEEK_SET) == -1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return ret == 0 ? 0 : 1; |     return ret == 0 ? 0 : 1; | ||||||
| } | } | ||||||
| @@ -490,10 +519,11 @@ void set_window_title(ToxWindow *self, const char *title, int len) | |||||||
| { | { | ||||||
|     char cpy[TOXIC_MAX_NAME_LENGTH + 1]; |     char cpy[TOXIC_MAX_NAME_LENGTH + 1]; | ||||||
|  |  | ||||||
|     if (self->is_groupchat)   /* keep groupnumber in title */ |     if (self->is_groupchat) { /* keep groupnumber in title */ | ||||||
|         snprintf(cpy, sizeof(cpy), "%d %s", self->num, title); |         snprintf(cpy, sizeof(cpy), "%d %s", self->num, title); | ||||||
|     else |     } else { | ||||||
|         snprintf(cpy, sizeof(cpy), "%s", title); |         snprintf(cpy, sizeof(cpy), "%s", title); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (len > MAX_WINDOW_NAME_LENGTH) { |     if (len > MAX_WINDOW_NAME_LENGTH) { | ||||||
|         strcpy(&cpy[MAX_WINDOW_NAME_LENGTH - 3], "..."); |         strcpy(&cpy[MAX_WINDOW_NAME_LENGTH - 3], "..."); | ||||||
|   | |||||||
| @@ -97,42 +97,49 @@ static int load_nameserver_list(const char *path) | |||||||
| { | { | ||||||
|     FILE *fp = fopen(path, "r"); |     FILE *fp = fopen(path, "r"); | ||||||
|  |  | ||||||
|     if (fp == NULL) |     if (fp == NULL) { | ||||||
|         return -2; |         return -2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char line[MAX_SERVER_LINE]; |     char line[MAX_SERVER_LINE]; | ||||||
|  |  | ||||||
|     while (fgets(line, sizeof(line), fp) && Nameservers.lines < MAX_SERVERS) { |     while (fgets(line, sizeof(line), fp) && Nameservers.lines < MAX_SERVERS) { | ||||||
|         int linelen = strlen(line); |         int linelen = strlen(line); | ||||||
|  |  | ||||||
|         if (linelen < SERVER_KEY_SIZE * 2 + 5) |         if (linelen < SERVER_KEY_SIZE * 2 + 5) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (line[linelen - 1] == '\n') |         if (line[linelen - 1] == '\n') { | ||||||
|             line[--linelen] = '\0'; |             line[--linelen] = '\0'; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         const char *name = strtok(line, " "); |         const char *name = strtok(line, " "); | ||||||
|         const char *keystr = strtok(NULL, " "); |         const char *keystr = strtok(NULL, " "); | ||||||
|  |  | ||||||
|         if (name == NULL || keystr == NULL) |         if (name == NULL || keystr == NULL) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (strlen(keystr) != SERVER_KEY_SIZE * 2) |         if (strlen(keystr) != SERVER_KEY_SIZE * 2) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         snprintf(Nameservers.names[Nameservers.lines], sizeof(Nameservers.names[Nameservers.lines]), "%s", name); |         snprintf(Nameservers.names[Nameservers.lines], sizeof(Nameservers.names[Nameservers.lines]), "%s", name); | ||||||
|         int res = hex_string_to_bytes(Nameservers.keys[Nameservers.lines], SERVER_KEY_SIZE, keystr); |         int res = hex_string_to_bytes(Nameservers.keys[Nameservers.lines], SERVER_KEY_SIZE, keystr); | ||||||
|  |  | ||||||
|         if (res == -1) |         if (res == -1) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         ++Nameservers.lines; |         ++Nameservers.lines; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fclose(fp); |     fclose(fp); | ||||||
|  |  | ||||||
|     if (Nameservers.lines < 1) |     if (Nameservers.lines < 1) { | ||||||
|         return -3; |         return -3; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @@ -145,8 +152,9 @@ static int load_nameserver_list(const char *path) | |||||||
|  */ |  */ | ||||||
| static int parse_addr(const char *addr, char *namebuf, size_t namebuf_sz, char *dombuf, size_t dombuf_sz) | static int parse_addr(const char *addr, char *namebuf, size_t namebuf_sz, char *dombuf, size_t dombuf_sz) | ||||||
| { | { | ||||||
|     if (strlen(addr) >= (MAX_STR_SIZE - strlen(NAMESERVER_API_PATH))) |     if (strlen(addr) >= (MAX_STR_SIZE - strlen(NAMESERVER_API_PATH))) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char tmpaddr[MAX_STR_SIZE]; |     char tmpaddr[MAX_STR_SIZE]; | ||||||
|     char *tmpname = NULL; |     char *tmpname = NULL; | ||||||
| @@ -156,8 +164,9 @@ static int parse_addr(const char *addr, char *namebuf, size_t namebuf_sz, char * | |||||||
|     tmpname = strtok(tmpaddr, "@"); |     tmpname = strtok(tmpaddr, "@"); | ||||||
|     tmpdom = strtok(NULL, ""); |     tmpdom = strtok(NULL, ""); | ||||||
|  |  | ||||||
|     if (tmpname == NULL || tmpdom == NULL) |     if (tmpname == NULL || tmpdom == NULL) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     str_to_lower(tmpdom); |     str_to_lower(tmpdom); | ||||||
|     snprintf(namebuf, namebuf_sz, "%s", tmpname); |     snprintf(namebuf, namebuf_sz, "%s", tmpname); | ||||||
| @@ -197,23 +206,27 @@ static int process_response(struct Recv_Curl_Data *recv_data) | |||||||
| { | { | ||||||
|     size_t prefix_size = strlen(ID_PREFIX); |     size_t prefix_size = strlen(ID_PREFIX); | ||||||
|  |  | ||||||
|     if (recv_data->length < TOX_ADDRESS_SIZE * 2 + prefix_size) |     if (recv_data->length < TOX_ADDRESS_SIZE * 2 + prefix_size) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     const char *IDstart = strstr(recv_data->data, ID_PREFIX); |     const char *IDstart = strstr(recv_data->data, ID_PREFIX); | ||||||
|  |  | ||||||
|     if (IDstart == NULL) |     if (IDstart == NULL) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (strlen(IDstart) < TOX_ADDRESS_SIZE * 2 + prefix_size) |     if (strlen(IDstart) < TOX_ADDRESS_SIZE * 2 + prefix_size) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char ID_string[TOX_ADDRESS_SIZE * 2 + 1]; |     char ID_string[TOX_ADDRESS_SIZE * 2 + 1]; | ||||||
|     memcpy(ID_string, IDstart + prefix_size, TOX_ADDRESS_SIZE * 2); |     memcpy(ID_string, IDstart + prefix_size, TOX_ADDRESS_SIZE * 2); | ||||||
|     ID_string[TOX_ADDRESS_SIZE * 2] = 0; |     ID_string[TOX_ADDRESS_SIZE * 2] = 0; | ||||||
|  |  | ||||||
|     if (hex_string_to_bin(ID_string, strlen(ID_string), t_data.id_bin, sizeof(t_data.id_bin)) == -1) |     if (hex_string_to_bin(ID_string, strlen(ID_string), t_data.id_bin, sizeof(t_data.id_bin)) == -1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @@ -234,10 +247,11 @@ void *lookup_thread_func(void *data) | |||||||
|     char real_domain[MAX_DOMAIN_SIZE]; |     char real_domain[MAX_DOMAIN_SIZE]; | ||||||
|  |  | ||||||
|     if (!get_domain_match(nameserver_key, real_domain, sizeof(real_domain), input_domain)) { |     if (!get_domain_match(nameserver_key, real_domain, sizeof(real_domain), input_domain)) { | ||||||
|         if (!strcasecmp(input_domain, "utox.org")) |         if (!strcasecmp(input_domain, "utox.org")) { | ||||||
|             lookup_error(self, "utox.org uses deprecated DNS-based lookups and is no longer supported by Toxic."); |             lookup_error(self, "utox.org uses deprecated DNS-based lookups and is no longer supported by Toxic."); | ||||||
|         else |         } else { | ||||||
|             lookup_error(self, "Name server domain not found."); |             lookup_error(self, "Name server domain not found."); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         kill_lookup_thread(); |         kill_lookup_thread(); | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										124
									
								
								src/notify.c
									
									
									
									
									
								
							
							
						
						
									
										124
									
								
								src/notify.c
									
									
									
									
									
								
							| @@ -104,21 +104,24 @@ struct _ActiveNotifications { | |||||||
| /* coloured tab notifications: primary notification type */ | /* coloured tab notifications: primary notification type */ | ||||||
| static void tab_notify(ToxWindow *self, uint64_t flags) | static void tab_notify(ToxWindow *self, uint64_t flags) | ||||||
| { | { | ||||||
|     if (self == NULL) |     if (self == NULL) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (flags & NT_WNDALERT_0) |     if (flags & NT_WNDALERT_0) { | ||||||
|         self->alert = WINDOW_ALERT_0; |         self->alert = WINDOW_ALERT_0; | ||||||
|     else if ( (flags & NT_WNDALERT_1) && (!self->alert || self->alert > WINDOW_ALERT_0) ) |     } else if ((flags & NT_WNDALERT_1) && (!self->alert || self->alert > WINDOW_ALERT_0)) { | ||||||
|         self->alert = WINDOW_ALERT_1; |         self->alert = WINDOW_ALERT_1; | ||||||
|     else if ( (flags & NT_WNDALERT_2) && (!self->alert || self->alert > WINDOW_ALERT_1) ) |     } else if ((flags & NT_WNDALERT_2) && (!self->alert || self->alert > WINDOW_ALERT_1)) { | ||||||
|         self->alert = WINDOW_ALERT_2; |         self->alert = WINDOW_ALERT_2; | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| static bool notifications_are_disabled(uint64_t flags) | static bool notifications_are_disabled(uint64_t flags) | ||||||
| { | { | ||||||
|     if (user_settings->alerts != ALERTS_ENABLED) |     if (user_settings->alerts != ALERTS_ENABLED) { | ||||||
|         return true; |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     bool res = (flags & NT_RESTOL) && (Control.cooldown > get_unix_time()); |     bool res = (flags & NT_RESTOL) && (Control.cooldown > get_unix_time()); | ||||||
| #ifdef X11 | #ifdef X11 | ||||||
| @@ -161,7 +164,9 @@ void m_open_device() | |||||||
| { | { | ||||||
|     last_opened_update = get_unix_time(); |     last_opened_update = get_unix_time(); | ||||||
|  |  | ||||||
|     if (device_opened) return; |     if (device_opened) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* Blah error check */ |     /* Blah error check */ | ||||||
|     open_primary_device(output, &Control.device_idx, 48000, 20, 1); |     open_primary_device(output, &Control.device_idx, 48000, 20, 1); | ||||||
| @@ -171,7 +176,9 @@ void m_open_device() | |||||||
|  |  | ||||||
| void m_close_device() | void m_close_device() | ||||||
| { | { | ||||||
|     if (!device_opened) return; |     if (!device_opened) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     close_device(output, Control.device_idx); |     close_device(output, Control.device_idx); | ||||||
|  |  | ||||||
| @@ -198,15 +205,18 @@ void graceful_clear() | |||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|                 if (actives[i].id_indicator) |                 if (actives[i].id_indicator) { | ||||||
|                     *actives[i].id_indicator = -1;    /* reset indicator value */ |                     *actives[i].id_indicator = -1;    /* reset indicator value */ | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 if (actives[i].looping) { |                 if (actives[i].looping) { | ||||||
|                     stop_sound(i); |                     stop_sound(i); | ||||||
|                 } else { |                 } else { | ||||||
|                     if (!is_playing(actives[i].source)) |                     if (!is_playing(actives[i].source)) { | ||||||
|                         memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); |                         memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); | ||||||
|                     else break; |                     } else { | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -241,7 +251,9 @@ void *do_playing(void *_p) | |||||||
|  |  | ||||||
|         for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) { |         for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) { | ||||||
|  |  | ||||||
|             if (actives[i].looping) has_looping = true; |             if (actives[i].looping) { | ||||||
|  |                 has_looping = true; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             test_active_notify = actives[i].active && !actives[i].looping; |             test_active_notify = actives[i].active && !actives[i].looping; | ||||||
| #ifdef BOX_NOTIFY | #ifdef BOX_NOTIFY | ||||||
| @@ -249,8 +261,9 @@ void *do_playing(void *_p) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|             if (test_active_notify) { |             if (test_active_notify) { | ||||||
|                 if (actives[i].id_indicator) |                 if (actives[i].id_indicator) { | ||||||
|                     *actives[i].id_indicator = -1;    /* reset indicator value */ |                     *actives[i].id_indicator = -1;    /* reset indicator value */ | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 if (!is_playing(actives[i].source)) { |                 if (!is_playing(actives[i].source)) { | ||||||
|                     /* Close */ |                     /* Close */ | ||||||
| @@ -267,8 +280,9 @@ void *do_playing(void *_p) | |||||||
|                 notify_notification_close(actives[i].box, &ignore); |                 notify_notification_close(actives[i].box, &ignore); | ||||||
|                 actives[i].box = NULL; |                 actives[i].box = NULL; | ||||||
|  |  | ||||||
|                 if (actives[i].id_indicator) |                 if (actives[i].id_indicator) { | ||||||
|                     *actives[i].id_indicator = -1;    /* reset indicator value */ |                     *actives[i].id_indicator = -1;    /* reset indicator value */ | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 if (!actives[i].looping && !is_playing(actives[i].source)) { |                 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 */ | ||||||
| @@ -338,8 +352,9 @@ void *do_playing(void *_p) | |||||||
|                 notify_notification_close(actives[i].box, &ignore); |                 notify_notification_close(actives[i].box, &ignore); | ||||||
|                 actives[i].box = NULL; |                 actives[i].box = NULL; | ||||||
|  |  | ||||||
|                 if (actives[i].id_indicator) |                 if (actives[i].id_indicator) { | ||||||
|                     *actives[i].id_indicator = -1;    /* reset indicator value */ |                     *actives[i].id_indicator = -1;    /* reset indicator value */ | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); |                 memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); | ||||||
|             } |             } | ||||||
| @@ -364,8 +379,9 @@ void graceful_clear() | |||||||
|             actives[i].box = NULL; |             actives[i].box = NULL; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (actives[i].id_indicator) |         if (actives[i].id_indicator) { | ||||||
|             *actives[i].id_indicator = -1;    /* reset indicator value */ |             *actives[i].id_indicator = -1;    /* reset indicator value */ | ||||||
|  |         } | ||||||
|  |  | ||||||
|         memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); |         memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); | ||||||
|     } |     } | ||||||
| @@ -391,8 +407,9 @@ int init_notify(int login_cooldown, int notification_timeout) | |||||||
|  |  | ||||||
| #if defined(SOUND_NOTIFY) || defined(BOX_NOTIFY) | #if defined(SOUND_NOTIFY) || defined(BOX_NOTIFY) | ||||||
|  |  | ||||||
|     if (pthread_mutex_init(Control.poll_mutex, NULL) != 0) |     if (pthread_mutex_init(Control.poll_mutex, NULL) != 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Control.poll_active = 1; |     Control.poll_active = 1; | ||||||
|     pthread_t thread; |     pthread_t thread; | ||||||
| @@ -433,7 +450,9 @@ void terminate_notify() | |||||||
| #ifdef SOUND_NOTIFY | #ifdef SOUND_NOTIFY | ||||||
|     int i = 0; |     int i = 0; | ||||||
|  |  | ||||||
|     for (; i < SOUNDS_SIZE; i ++) free(Control.sounds[i]); |     for (; i < SOUNDS_SIZE; i ++) { | ||||||
|  |         free(Control.sounds[i]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     alutExit(); |     alutExit(); | ||||||
| #endif /* SOUND_NOTIFY */ | #endif /* SOUND_NOTIFY */ | ||||||
| @@ -446,7 +465,9 @@ void terminate_notify() | |||||||
| #ifdef SOUND_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; |     if (sound == silent) { | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     free(Control.sounds[sound]); |     free(Control.sounds[sound]); | ||||||
|  |  | ||||||
| @@ -487,11 +508,14 @@ int play_notify_sound(Notification notif, uint64_t flags) | |||||||
| { | { | ||||||
|     int rc = -1; |     int rc = -1; | ||||||
|  |  | ||||||
|     if (flags & NT_BEEP) beep(); |     if (flags & NT_BEEP) { | ||||||
|  |         beep(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (notif != silent) { |     if (notif != silent) { | ||||||
|         if ( !Control.poll_active || !Control.sounds[notif] ) |         if (!Control.poll_active || !Control.sounds[notif]) { | ||||||
|             return -1; |             return -1; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         rc = play_sound_internal(notif, flags & NT_LOOP ? 1 : 0); |         rc = play_sound_internal(notif, flags & NT_LOOP ? 1 : 0); | ||||||
|     } |     } | ||||||
| @@ -512,8 +536,9 @@ void stop_sound(int id) | |||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|         if (actives[id].id_indicator) |         if (actives[id].id_indicator) { | ||||||
|             *actives[id].id_indicator = -1; |             *actives[id].id_indicator = -1; | ||||||
|  |         } | ||||||
|  |  | ||||||
| //         alSourcei(actives[id].source, AL_LOOPING, false); | //         alSourcei(actives[id].source, AL_LOOPING, false); | ||||||
|         alSourceStop(actives[id].source); |         alSourceStop(actives[id].source); | ||||||
| @@ -530,8 +555,9 @@ static int m_play_sound(Notification notif, uint64_t flags) | |||||||
|     return play_notify_sound(notif, flags); |     return play_notify_sound(notif, flags); | ||||||
| #else | #else | ||||||
|  |  | ||||||
|     if (notif != silent) |     if (notif != silent) { | ||||||
|         beep(); |         beep(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return -1; |     return -1; | ||||||
| #endif /* SOUND_NOTIFY */ | #endif /* SOUND_NOTIFY */ | ||||||
| @@ -547,16 +573,18 @@ int sound_notify(ToxWindow *self, Notification notif, uint64_t flags, int *id_in | |||||||
| { | { | ||||||
|     tab_notify(self, flags); |     tab_notify(self, flags); | ||||||
|  |  | ||||||
|     if (notifications_are_disabled(flags)) |     if (notifications_are_disabled(flags)) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int id = -1; |     int id = -1; | ||||||
|     control_lock(); |     control_lock(); | ||||||
|  |  | ||||||
|     if (self && (!self->stb || self->stb->status != TOX_USER_STATUS_BUSY)) |     if (self && (!self->stb || self->stb->status != TOX_USER_STATUS_BUSY)) { | ||||||
|         id = m_play_sound(notif, flags); |         id = m_play_sound(notif, flags); | ||||||
|     else if (flags & NT_ALWAYS) |     } else if (flags & NT_ALWAYS) { | ||||||
|         id = m_play_sound(notif, flags); |         id = m_play_sound(notif, flags); | ||||||
|  |     } | ||||||
|  |  | ||||||
| #if defined(BOX_NOTIFY) && !defined(SOUND_NOTIFY) | #if defined(BOX_NOTIFY) && !defined(SOUND_NOTIFY) | ||||||
|  |  | ||||||
| @@ -585,10 +613,13 @@ int sound_notify2(ToxWindow *self, Notification notif, uint64_t flags, int id) | |||||||
| { | { | ||||||
|     tab_notify(self, flags); |     tab_notify(self, flags); | ||||||
|  |  | ||||||
|     if (notifications_are_disabled(flags)) |     if (notifications_are_disabled(flags)) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (id < 0 || id >= ACTIVE_NOTIFS_MAX) return -1; |     if (id < 0 || id >= ACTIVE_NOTIFS_MAX) { | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #ifdef SOUND_NOTIFY | #ifdef SOUND_NOTIFY | ||||||
|     control_lock(); |     control_lock(); | ||||||
| @@ -617,8 +648,9 @@ int sound_notify2(ToxWindow *self, Notification notif, uint64_t flags, int id) | |||||||
|     return id; |     return id; | ||||||
| #else | #else | ||||||
|  |  | ||||||
|     if (notif != silent) |     if (notif != silent) { | ||||||
|         beep(); |         beep(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| #endif /* SOUND_NOTIFY */ | #endif /* SOUND_NOTIFY */ | ||||||
| @@ -652,27 +684,33 @@ int box_notify(ToxWindow *self, Notification notif, uint64_t flags, int *id_indi | |||||||
|         actives[id].active = 1; |         actives[id].active = 1; | ||||||
|         actives[id].id_indicator = id_indicator; |         actives[id].id_indicator = id_indicator; | ||||||
|  |  | ||||||
|         if (id_indicator) *id_indicator = id; |         if (id_indicator) { | ||||||
|  |             *id_indicator = id; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| #else | #else | ||||||
|  |  | ||||||
|     if (id == -1) |     if (id == -1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #endif    /* SOUND_NOTIFY */ | #endif    /* SOUND_NOTIFY */ | ||||||
|  |  | ||||||
|     snprintf(actives[id].title, sizeof(actives[id].title), "%s", title); |     snprintf(actives[id].title, sizeof(actives[id].title), "%s", title); | ||||||
|  |  | ||||||
|     if (strlen(title) > 23) strcpy(actives[id].title + 20, "..."); |     if (strlen(title) > 23) { | ||||||
|  |         strcpy(actives[id].title + 20, "..."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     va_list __ARGS__; |     va_list __ARGS__; | ||||||
|     va_start(__ARGS__, format); |     va_start(__ARGS__, format); | ||||||
|     vsnprintf(actives[id].messages[0], MAX_BOX_MSG_LEN, format, __ARGS__); |     vsnprintf(actives[id].messages[0], MAX_BOX_MSG_LEN, format, __ARGS__); | ||||||
|     va_end(__ARGS__); |     va_end(__ARGS__); | ||||||
|  |  | ||||||
|     if (strlen(actives[id].messages[0]) > MAX_BOX_MSG_LEN - 3) |     if (strlen(actives[id].messages[0]) > MAX_BOX_MSG_LEN - 3) { | ||||||
|         strcpy(actives[id].messages[0] + MAX_BOX_MSG_LEN - 3, "..."); |         strcpy(actives[id].messages[0] + MAX_BOX_MSG_LEN - 3, "..."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     actives[id].box = notify_notification_new(actives[id].title, actives[id].messages[0], NULL); |     actives[id].box = notify_notification_new(actives[id].title, actives[id].messages[0], NULL); | ||||||
|     actives[id].size++; |     actives[id].size++; | ||||||
| @@ -699,8 +737,9 @@ int box_notify2(ToxWindow *self, Notification notif, uint64_t flags, int id, con | |||||||
|  |  | ||||||
| #ifdef BOX_NOTIFY | #ifdef BOX_NOTIFY | ||||||
|  |  | ||||||
|     if (sound_notify2(self, notif, flags, id) == -1) |     if (sound_notify2(self, notif, flags, id) == -1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     control_lock(); |     control_lock(); | ||||||
|  |  | ||||||
| @@ -714,8 +753,9 @@ int box_notify2(ToxWindow *self, Notification notif, uint64_t flags, int id, con | |||||||
|     vsnprintf(actives[id].messages[actives[id].size], MAX_BOX_MSG_LEN, format, __ARGS__); |     vsnprintf(actives[id].messages[actives[id].size], MAX_BOX_MSG_LEN, format, __ARGS__); | ||||||
|     va_end(__ARGS__); |     va_end(__ARGS__); | ||||||
|  |  | ||||||
|     if (strlen(actives[id].messages[actives[id].size]) > MAX_BOX_MSG_LEN - 3) |     if (strlen(actives[id].messages[actives[id].size]) > MAX_BOX_MSG_LEN - 3) { | ||||||
|         strcpy(actives[id].messages[actives[id].size] + MAX_BOX_MSG_LEN - 3, "..."); |         strcpy(actives[id].messages[actives[id].size] + MAX_BOX_MSG_LEN - 3, "..."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     actives[id].size++; |     actives[id].size++; | ||||||
|     actives[id].n_timeout = get_unix_time() + Control.notif_timeout / 1000; |     actives[id].n_timeout = get_unix_time() + Control.notif_timeout / 1000; | ||||||
| @@ -746,8 +786,9 @@ int box_silent_notify(ToxWindow *self, uint64_t flags, int *id_indicator, const | |||||||
| { | { | ||||||
|     tab_notify(self, flags); |     tab_notify(self, flags); | ||||||
|  |  | ||||||
|     if (notifications_are_disabled(flags)) |     if (notifications_are_disabled(flags)) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #ifdef BOX_NOTIFY | #ifdef BOX_NOTIFY | ||||||
|  |  | ||||||
| @@ -769,15 +810,18 @@ int box_silent_notify(ToxWindow *self, uint64_t flags, int *id_indicator, const | |||||||
|  |  | ||||||
|     snprintf(actives[id].title, sizeof(actives[id].title), "%s", title); |     snprintf(actives[id].title, sizeof(actives[id].title), "%s", title); | ||||||
|  |  | ||||||
|     if (strlen(title) > 23) strcpy(actives[id].title + 20, "..."); |     if (strlen(title) > 23) { | ||||||
|  |         strcpy(actives[id].title + 20, "..."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     va_list __ARGS__; |     va_list __ARGS__; | ||||||
|     va_start(__ARGS__, format); |     va_start(__ARGS__, format); | ||||||
|     vsnprintf(actives[id].messages[0], MAX_BOX_MSG_LEN, format, __ARGS__); |     vsnprintf(actives[id].messages[0], MAX_BOX_MSG_LEN, format, __ARGS__); | ||||||
|     va_end(__ARGS__); |     va_end(__ARGS__); | ||||||
|  |  | ||||||
|     if (strlen(actives[id].messages[0]) > MAX_BOX_MSG_LEN - 3) |     if (strlen(actives[id].messages[0]) > MAX_BOX_MSG_LEN - 3) { | ||||||
|         strcpy(actives[id].messages[0] + MAX_BOX_MSG_LEN - 3, "..."); |         strcpy(actives[id].messages[0] + MAX_BOX_MSG_LEN - 3, "..."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     actives[id].active = 1; |     actives[id].active = 1; | ||||||
|     actives[id].box = notify_notification_new(actives[id].title, actives[id].messages[0], NULL); |     actives[id].box = notify_notification_new(actives[id].title, actives[id].messages[0], NULL); | ||||||
| @@ -800,8 +844,9 @@ int box_silent_notify2(ToxWindow *self, uint64_t flags, int id, const char *form | |||||||
| { | { | ||||||
|     tab_notify(self, flags); |     tab_notify(self, flags); | ||||||
|  |  | ||||||
|     if (notifications_are_disabled(flags)) |     if (notifications_are_disabled(flags)) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #ifdef BOX_NOTIFY | #ifdef BOX_NOTIFY | ||||||
|     control_lock(); |     control_lock(); | ||||||
| @@ -817,8 +862,9 @@ int box_silent_notify2(ToxWindow *self, uint64_t flags, int id, const char *form | |||||||
|     vsnprintf(actives[id].messages[actives[id].size], MAX_BOX_MSG_LEN, format, __ARGS__); |     vsnprintf(actives[id].messages[actives[id].size], MAX_BOX_MSG_LEN, format, __ARGS__); | ||||||
|     va_end(__ARGS__); |     va_end(__ARGS__); | ||||||
|  |  | ||||||
|     if (strlen(actives[id].messages[actives[id].size]) > MAX_BOX_MSG_LEN - 3) |     if (strlen(actives[id].messages[actives[id].size]) > MAX_BOX_MSG_LEN - 3) { | ||||||
|         strcpy(actives[id].messages[actives[id].size] + MAX_BOX_MSG_LEN - 3, "..."); |         strcpy(actives[id].messages[actives[id].size] + MAX_BOX_MSG_LEN - 3, "..."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     actives[id].size ++; |     actives[id].size ++; | ||||||
|     actives[id].n_timeout = get_unix_time() + Control.notif_timeout / 1000; |     actives[id].n_timeout = get_unix_time() + Control.notif_timeout / 1000; | ||||||
|   | |||||||
							
								
								
									
										63
									
								
								src/prompt.c
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								src/prompt.c
									
									
									
									
									
								
							| @@ -162,9 +162,10 @@ void prompt_update_statusmessage(ToxWindow *prompt, Tox *m, const char *statusms | |||||||
|     TOX_ERR_SET_INFO err; |     TOX_ERR_SET_INFO err; | ||||||
|     tox_self_set_status_message(m, (uint8_t *) statusmsg, len, &err); |     tox_self_set_status_message(m, (uint8_t *) statusmsg, len, &err); | ||||||
|  |  | ||||||
|     if (err != TOX_ERR_SET_INFO_OK) |     if (err != TOX_ERR_SET_INFO_OK) { | ||||||
|         line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set note (error %d)\n", err); |         line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to set note (error %d)\n", err); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* Updates own status in prompt statusbar */ | /* Updates own status in prompt statusbar */ | ||||||
| void prompt_update_status(ToxWindow *prompt, TOX_USER_STATUS status) | void prompt_update_status(ToxWindow *prompt, TOX_USER_STATUS status) | ||||||
| @@ -184,8 +185,9 @@ TOX_CONNECTION prompt_selfConnectionStatus(void) | |||||||
|    Returns request number on success, -1 if queue is full. */ |    Returns request number on success, -1 if queue is full. */ | ||||||
| static int add_friend_request(const char *public_key, const char *data) | static int add_friend_request(const char *public_key, const char *data) | ||||||
| { | { | ||||||
|     if (FrndRequests.max_idx >= MAX_FRIEND_REQUESTS) |     if (FrndRequests.max_idx >= MAX_FRIEND_REQUESTS) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
| @@ -195,8 +197,9 @@ static int add_friend_request(const char *public_key, const char *data) | |||||||
|             memcpy(FrndRequests.request[i].key, public_key, TOX_PUBLIC_KEY_SIZE); |             memcpy(FrndRequests.request[i].key, public_key, TOX_PUBLIC_KEY_SIZE); | ||||||
|             snprintf(FrndRequests.request[i].msg, sizeof(FrndRequests.request[i].msg), "%s", data); |             snprintf(FrndRequests.request[i].msg, sizeof(FrndRequests.request[i].msg), "%s", data); | ||||||
|  |  | ||||||
|             if (i == FrndRequests.max_idx) |             if (i == FrndRequests.max_idx) { | ||||||
|                 ++FrndRequests.max_idx; |                 ++FrndRequests.max_idx; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             ++FrndRequests.num_requests; |             ++FrndRequests.num_requests; | ||||||
|  |  | ||||||
| @@ -215,11 +218,13 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|     getyx(self->window, y, x); |     getyx(self->window, y, x); | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (x2 <= 0 || y2 <= 0) |     if (x2 <= 0 || y2 <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ctx->pastemode && key == '\r') |     if (ctx->pastemode && key == '\r') { | ||||||
|         key = '\n'; |         key = '\n'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* ignore non-menu related input if active */ |     /* ignore non-menu related input if active */ | ||||||
|     if (self->help->active) { |     if (self->help->active) { | ||||||
| @@ -232,8 +237,9 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (line_info_onKey(self, key)) |     if (line_info_onKey(self, key)) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     input_handle(self, key, x, y, x2, y2); |     input_handle(self, key, x, y, x2, y2); | ||||||
|  |  | ||||||
| @@ -241,12 +247,14 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|         if (ctx->len > 1 && ctx->line[0] == '/') { |         if (ctx->len > 1 && ctx->line[0] == '/') { | ||||||
|             int diff = -1; |             int diff = -1; | ||||||
|  |  | ||||||
|             if (wcsncmp(ctx->line, L"/avatar \"", wcslen(L"/avatar \"")) == 0) |             if (wcsncmp(ctx->line, L"/avatar \"", wcslen(L"/avatar \"")) == 0) { | ||||||
|                 diff = dir_match(self, m, ctx->line, L"/avatar"); |                 diff = dir_match(self, m, ctx->line, L"/avatar"); | ||||||
|  |             } | ||||||
|  |  | ||||||
| #ifdef PYTHON | #ifdef PYTHON | ||||||
|             else if (wcsncmp(ctx->line, L"/run \"", wcslen(L"/run \"")) == 0) |             else if (wcsncmp(ctx->line, L"/run \"", wcslen(L"/run \"")) == 0) { | ||||||
|                 diff = dir_match(self, m, ctx->line, L"/run"); |                 diff = dir_match(self, m, ctx->line, L"/run"); | ||||||
|  |             } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -257,8 +265,9 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|                     {"busy"}, |                     {"busy"}, | ||||||
|                 }; |                 }; | ||||||
|                 diff = complete_line(self, status_cmd_list, 3, 8); |                 diff = complete_line(self, status_cmd_list, 3, 8); | ||||||
|             } else |             } else { | ||||||
|                 diff = complete_line(self, glob_cmd_list, AC_NUM_GLOB_COMMANDS, MAX_CMDNAME_SIZE); |                 diff = complete_line(self, glob_cmd_list, AC_NUM_GLOB_COMMANDS, MAX_CMDNAME_SIZE); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if (diff != -1) { |             if (diff != -1) { | ||||||
|                 if (x + diff > x2 - 1) { |                 if (x + diff > x2 - 1) { | ||||||
| @@ -280,8 +289,9 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) | |||||||
|  |  | ||||||
|             char line[MAX_STR_SIZE] = {0}; |             char line[MAX_STR_SIZE] = {0}; | ||||||
|  |  | ||||||
|             if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1) |             if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1) { | ||||||
|                 memset(&line, 0, sizeof(line)); |                 memset(&line, 0, sizeof(line)); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             line_info_add(self, NULL, NULL, NULL, PROMPT, 0, 0, "%s", line); |             line_info_add(self, NULL, NULL, NULL, PROMPT, 0, 0, "%s", line); | ||||||
|             execute(ctx->history, self, m, line, GLOBAL_COMMAND_MODE); |             execute(ctx->history, self, m, line, GLOBAL_COMMAND_MODE); | ||||||
| @@ -298,8 +308,9 @@ static void prompt_onDraw(ToxWindow *self, Tox *m) | |||||||
|     int x2, y2; |     int x2, y2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (y2 <= 0 || x2 <= 0) |     if (y2 <= 0 || x2 <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|  |  | ||||||
| @@ -311,8 +322,9 @@ static void prompt_onDraw(ToxWindow *self, Tox *m) | |||||||
|  |  | ||||||
|     curs_set(1); |     curs_set(1); | ||||||
|  |  | ||||||
|     if (ctx->len > 0) |     if (ctx->len > 0) { | ||||||
|         mvwprintw(ctx->linewin, 1, 0, "%ls", &ctx->line[ctx->start]); |         mvwprintw(ctx->linewin, 1, 0, "%ls", &ctx->line[ctx->start]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     StatusBar *statusbar = self->stb; |     StatusBar *statusbar = self->stb; | ||||||
|  |  | ||||||
| @@ -392,8 +404,9 @@ static void prompt_onDraw(ToxWindow *self, Tox *m) | |||||||
|         statusbar->statusmsg_len = maxlen; |         statusbar->statusmsg_len = maxlen; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (statusbar->statusmsg[0]) |     if (statusbar->statusmsg[0]) { | ||||||
|         wprintw(statusbar->topline, " : %s", statusbar->statusmsg); |         wprintw(statusbar->topline, " : %s", statusbar->statusmsg); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pthread_mutex_unlock(&Winthread.lock); |     pthread_mutex_unlock(&Winthread.lock); | ||||||
|  |  | ||||||
| @@ -408,9 +421,10 @@ static void prompt_onDraw(ToxWindow *self, Tox *m) | |||||||
|  |  | ||||||
|     wnoutrefresh(self->window); |     wnoutrefresh(self->window); | ||||||
|  |  | ||||||
|     if (self->help->active) |     if (self->help->active) { | ||||||
|         help_onDraw(self); |         help_onDraw(self); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| static void prompt_onConnectionChange(ToxWindow *self, Tox *m, uint32_t friendnum, TOX_CONNECTION connection_status) | static void prompt_onConnectionChange(ToxWindow *self, Tox *m, uint32_t friendnum, TOX_CONNECTION connection_status) | ||||||
| { | { | ||||||
| @@ -419,8 +433,9 @@ static void prompt_onConnectionChange(ToxWindow *self, Tox *m, uint32_t friendnu | |||||||
|     char nick[TOX_MAX_NAME_LENGTH] = {0};    /* stop removing this initiation */ |     char nick[TOX_MAX_NAME_LENGTH] = {0};    /* stop removing this initiation */ | ||||||
|     get_nick_truncate(m, nick, friendnum); |     get_nick_truncate(m, nick, friendnum); | ||||||
|  |  | ||||||
|     if (!nick[0]) |     if (!nick[0]) { | ||||||
|         snprintf(nick, sizeof(nick), "%s", UNKNOWN_NAME); |         snprintf(nick, sizeof(nick), "%s", UNKNOWN_NAME); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char timefrmt[TIME_STR_SIZE]; |     char timefrmt[TIME_STR_SIZE]; | ||||||
|     get_time_str(timefrmt, sizeof(timefrmt)); |     get_time_str(timefrmt, sizeof(timefrmt)); | ||||||
| @@ -482,8 +497,9 @@ void prompt_init_statusbar(ToxWindow *self, Tox *m) | |||||||
|     int x2, y2; |     int x2, y2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (y2 <= 0 || x2 <= 0) |     if (y2 <= 0 || x2 <= 0) { | ||||||
|         exit_toxic_err("failed in prompt_init_statusbar", FATALERR_CURSES); |         exit_toxic_err("failed in prompt_init_statusbar", FATALERR_CURSES); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     (void) y2; |     (void) y2; | ||||||
|  |  | ||||||
| @@ -542,8 +558,9 @@ static void prompt_onInit(ToxWindow *self, Tox *m) | |||||||
|     int y2, x2; |     int y2, x2; | ||||||
|     getmaxyx(self->window, y2, x2); |     getmaxyx(self->window, y2, x2); | ||||||
|  |  | ||||||
|     if (y2 <= 0 || x2 <= 0) |     if (y2 <= 0 || x2 <= 0) { | ||||||
|         exit_toxic_err("failed in prompt_onInit", FATALERR_CURSES); |         exit_toxic_err("failed in prompt_onInit", FATALERR_CURSES); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ChatContext *ctx = self->chatwin; |     ChatContext *ctx = self->chatwin; | ||||||
|     ctx->history = subwin(self->window, y2 - CHATBOX_HEIGHT + 1, x2, 0, 0); |     ctx->history = subwin(self->window, y2 - CHATBOX_HEIGHT + 1, x2, 0, 0); | ||||||
| @@ -552,8 +569,9 @@ static void prompt_onInit(ToxWindow *self, Tox *m) | |||||||
|     ctx->log = calloc(1, sizeof(struct chatlog)); |     ctx->log = calloc(1, sizeof(struct chatlog)); | ||||||
|     ctx->hst = calloc(1, sizeof(struct history)); |     ctx->hst = calloc(1, sizeof(struct history)); | ||||||
|  |  | ||||||
|     if (ctx->log == NULL || ctx->hst == NULL) |     if (ctx->log == NULL || ctx->hst == NULL) { | ||||||
|         exit_toxic_err("failed in prompt_onInit", FATALERR_MEMORY); |         exit_toxic_err("failed in prompt_onInit", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     line_info_init(ctx->hst); |     line_info_init(ctx->hst); | ||||||
|  |  | ||||||
| @@ -561,16 +579,18 @@ static void prompt_onInit(ToxWindow *self, Tox *m) | |||||||
|         char myid[TOX_ADDRESS_SIZE]; |         char myid[TOX_ADDRESS_SIZE]; | ||||||
|         tox_self_get_address(m, (uint8_t *) myid); |         tox_self_get_address(m, (uint8_t *) myid); | ||||||
|  |  | ||||||
|         if (log_enable(self->name, myid, NULL, ctx->log, LOG_PROMPT) == -1) |         if (log_enable(self->name, myid, NULL, ctx->log, LOG_PROMPT) == -1) { | ||||||
|             line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Warning: Log failed to initialize."); |             line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Warning: Log failed to initialize."); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     scrollok(ctx->history, 0); |     scrollok(ctx->history, 0); | ||||||
|     wmove(self->window, y2 - CURS_Y_OFFSET, 0); |     wmove(self->window, y2 - CURS_Y_OFFSET, 0); | ||||||
|  |  | ||||||
|     if (user_settings->show_welcome_msg == SHOW_WELCOME_MSG_ON) |     if (user_settings->show_welcome_msg == SHOW_WELCOME_MSG_ON) { | ||||||
|         print_welcome_msg(self); |         print_welcome_msg(self); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| ToxWindow new_prompt(void) | ToxWindow new_prompt(void) | ||||||
| { | { | ||||||
| @@ -593,8 +613,9 @@ ToxWindow new_prompt(void) | |||||||
|     StatusBar *stb = calloc(1, sizeof(StatusBar)); |     StatusBar *stb = calloc(1, sizeof(StatusBar)); | ||||||
|     Help *help = calloc(1, sizeof(Help)); |     Help *help = calloc(1, sizeof(Help)); | ||||||
|  |  | ||||||
|     if (stb == NULL || chatwin == NULL || help == NULL) |     if (stb == NULL || chatwin == NULL || help == NULL) { | ||||||
|         exit_toxic_err("failed in new_prompt", FATALERR_MEMORY); |         exit_toxic_err("failed in new_prompt", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ret.chatwin = chatwin; |     ret.chatwin = chatwin; | ||||||
|     ret.stb = stb; |     ret.stb = stb; | ||||||
|   | |||||||
| @@ -39,8 +39,9 @@ static PyObject *python_api_display(PyObject *self, PyObject *args) | |||||||
| { | { | ||||||
|     const char *msg; |     const char *msg; | ||||||
|  |  | ||||||
|     if (!PyArg_ParseTuple(args, "s", &msg)) |     if (!PyArg_ParseTuple(args, "s", &msg)) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     api_display(msg); |     api_display(msg); | ||||||
|     return Py_None; |     return Py_None; | ||||||
| @@ -51,13 +52,15 @@ static PyObject *python_api_get_nick(PyObject *self, PyObject *args) | |||||||
|     char     *name; |     char     *name; | ||||||
|     PyObject *ret; |     PyObject *ret; | ||||||
|  |  | ||||||
|     if (!PyArg_ParseTuple(args, "")) |     if (!PyArg_ParseTuple(args, "")) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     name = api_get_nick(); |     name = api_get_nick(); | ||||||
|  |  | ||||||
|     if (name == NULL) |     if (name == NULL) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ret  = Py_BuildValue("s", name); |     ret  = Py_BuildValue("s", name); | ||||||
|     free(name); |     free(name); | ||||||
| @@ -68,8 +71,9 @@ static PyObject *python_api_get_status(PyObject *self, PyObject *args) | |||||||
| { | { | ||||||
|     PyObject        *ret = NULL; |     PyObject        *ret = NULL; | ||||||
|  |  | ||||||
|     if (!PyArg_ParseTuple(args, "")) |     if (!PyArg_ParseTuple(args, "")) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     switch (api_get_status()) { |     switch (api_get_status()) { | ||||||
|         case TOX_USER_STATUS_NONE: |         case TOX_USER_STATUS_NONE: | ||||||
| @@ -93,13 +97,15 @@ static PyObject *python_api_get_status_message(PyObject *self, PyObject *args) | |||||||
|     char     *status; |     char     *status; | ||||||
|     PyObject *ret; |     PyObject *ret; | ||||||
|  |  | ||||||
|     if (!PyArg_ParseTuple(args, "")) |     if (!PyArg_ParseTuple(args, "")) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     status = api_get_status_message(); |     status = api_get_status_message(); | ||||||
|  |  | ||||||
|     if (status == NULL) |     if (status == NULL) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ret    = Py_BuildValue("s", status); |     ret    = Py_BuildValue("s", status); | ||||||
|     free(status); |     free(status); | ||||||
| @@ -113,15 +119,17 @@ static PyObject *python_api_get_all_friends(PyObject *self, PyObject *args) | |||||||
|     PyObject    *cur, *ret; |     PyObject    *cur, *ret; | ||||||
|     char         pubkey_buf[TOX_PUBLIC_KEY_SIZE * 2 + 1]; |     char         pubkey_buf[TOX_PUBLIC_KEY_SIZE * 2 + 1]; | ||||||
|  |  | ||||||
|     if (!PyArg_ParseTuple(args, "")) |     if (!PyArg_ParseTuple(args, "")) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     friends = api_get_friendslist(); |     friends = api_get_friendslist(); | ||||||
|     ret     = PyList_New(0); |     ret     = PyList_New(0); | ||||||
|  |  | ||||||
|     for (i = 0; i < friends.num_friends; i++) { |     for (i = 0; i < friends.num_friends; i++) { | ||||||
|         for (ii = 0; ii < TOX_PUBLIC_KEY_SIZE; ii++) |         for (ii = 0; ii < TOX_PUBLIC_KEY_SIZE; ii++) { | ||||||
|             snprintf(pubkey_buf + ii * 2, 3, "%02X", friends.list[i].pub_key[ii] & 0xff); |             snprintf(pubkey_buf + ii * 2, 3, "%02X", friends.list[i].pub_key[ii] & 0xff); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         pubkey_buf[TOX_PUBLIC_KEY_SIZE * 2] = '\0'; |         pubkey_buf[TOX_PUBLIC_KEY_SIZE * 2] = '\0'; | ||||||
|         cur = Py_BuildValue("(s,s)", friends.list[i].name, pubkey_buf); |         cur = Py_BuildValue("(s,s)", friends.list[i].name, pubkey_buf); | ||||||
| @@ -135,8 +143,9 @@ static PyObject *python_api_send(PyObject *self, PyObject *args) | |||||||
| { | { | ||||||
|     const char *msg; |     const char *msg; | ||||||
|  |  | ||||||
|     if (!PyArg_ParseTuple(args, "s", &msg)) |     if (!PyArg_ParseTuple(args, "s", &msg)) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     api_send(msg); |     api_send(msg); | ||||||
|     return Py_None; |     return Py_None; | ||||||
| @@ -147,8 +156,9 @@ static PyObject *python_api_execute(PyObject *self, PyObject *args) | |||||||
|     int         mode; |     int         mode; | ||||||
|     const char *command; |     const char *command; | ||||||
|  |  | ||||||
|     if (!PyArg_ParseTuple(args, "si", &command, &mode)) |     if (!PyArg_ParseTuple(args, "si", &command, &mode)) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     api_execute(command, mode); |     api_execute(command, mode); | ||||||
|     return Py_None; |     return Py_None; | ||||||
| @@ -161,8 +171,9 @@ static PyObject *python_api_register(PyObject *self, PyObject *args) | |||||||
|     const char *command, *help; |     const char *command, *help; | ||||||
|     PyObject   *callback; |     PyObject   *callback; | ||||||
|  |  | ||||||
|     if (!PyArg_ParseTuple(args, "ssO:register_command", &command, &help, &callback)) |     if (!PyArg_ParseTuple(args, "ssO:register_command", &command, &help, &callback)) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (!PyCallable_Check(callback)) { |     if (!PyCallable_Check(callback)) { | ||||||
|         PyErr_SetString(PyExc_TypeError, "Calback parameter must be callable"); |         PyErr_SetString(PyExc_TypeError, "Calback parameter must be callable"); | ||||||
| @@ -186,21 +197,24 @@ static PyObject *python_api_register(PyObject *self, PyObject *args) | |||||||
|             Py_XINCREF(callback); |             Py_XINCREF(callback); | ||||||
|             cur->next = malloc(sizeof(struct python_registered_func)); |             cur->next = malloc(sizeof(struct python_registered_func)); | ||||||
|  |  | ||||||
|             if (cur->next == NULL) |             if (cur->next == NULL) { | ||||||
|                 return PyErr_NoMemory(); |                 return PyErr_NoMemory(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             command_len     = strlen(command); |             command_len     = strlen(command); | ||||||
|             cur->next->name = malloc(command_len + 1); |             cur->next->name = malloc(command_len + 1); | ||||||
|  |  | ||||||
|             if (cur->next->name == NULL) |             if (cur->next->name == NULL) { | ||||||
|                 return PyErr_NoMemory(); |                 return PyErr_NoMemory(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             strncpy(cur->next->name, command, command_len + 1); |             strncpy(cur->next->name, command, command_len + 1); | ||||||
|             help_len        = strlen(help); |             help_len        = strlen(help); | ||||||
|             cur->next->help = malloc(help_len + 1); |             cur->next->help = malloc(help_len + 1); | ||||||
|  |  | ||||||
|             if (cur->next->help == NULL) |             if (cur->next->help == NULL) { | ||||||
|                 return PyErr_NoMemory(); |                 return PyErr_NoMemory(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             strncpy(cur->next->help, help, help_len + 1); |             strncpy(cur->next->help, help, help_len + 1); | ||||||
|             cur->next->callback = callback; |             cur->next->callback = callback; | ||||||
| @@ -252,8 +266,9 @@ void terminate_python(void) | |||||||
| { | { | ||||||
|     struct python_registered_func *cur, *old; |     struct python_registered_func *cur, *old; | ||||||
|  |  | ||||||
|     if (python_commands.name != NULL) |     if (python_commands.name != NULL) { | ||||||
|         free(python_commands.name); |         free(python_commands.name); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     for (cur = python_commands.next; cur != NULL;) { |     for (cur = python_commands.next; cur != NULL;) { | ||||||
|         old = cur; |         old = cur; | ||||||
| @@ -284,19 +299,22 @@ int do_python_command(int num_args, char (*args)[MAX_STR_SIZE]) | |||||||
|     struct python_registered_func *cur; |     struct python_registered_func *cur; | ||||||
|  |  | ||||||
|     for (cur = &python_commands; cur != NULL; cur = cur->next) { |     for (cur = &python_commands; cur != NULL; cur = cur->next) { | ||||||
|         if (cur->name == NULL) |         if (cur->name == NULL) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!strcmp(args[0], cur->name)) { |         if (!strcmp(args[0], cur->name)) { | ||||||
|             args_strings = PyList_New(0); |             args_strings = PyList_New(0); | ||||||
|  |  | ||||||
|             for (i = 1; i < num_args; i++) |             for (i = 1; i < num_args; i++) { | ||||||
|                 PyList_Append(args_strings, Py_BuildValue("s", args[i])); |                 PyList_Append(args_strings, Py_BuildValue("s", args[i])); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             callback_args = PyTuple_Pack(1, args_strings); |             callback_args = PyTuple_Pack(1, args_strings); | ||||||
|  |  | ||||||
|             if (PyObject_CallObject(cur->callback, callback_args) == NULL) |             if (PyObject_CallObject(cur->callback, callback_args) == NULL) { | ||||||
|                 api_display("Exception raised in callback function"); |                 api_display("Exception raised in callback function"); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
| @@ -311,9 +329,10 @@ int python_num_registered_handlers(void) | |||||||
|     struct python_registered_func *cur; |     struct python_registered_func *cur; | ||||||
|  |  | ||||||
|     for (cur = &python_commands; cur != NULL; cur = cur->next) { |     for (cur = &python_commands; cur != NULL; cur = cur->next) { | ||||||
|         if (cur->name != NULL) |         if (cur->name != NULL) { | ||||||
|             n++; |             n++; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return n; |     return n; | ||||||
| } | } | ||||||
| @@ -340,8 +359,9 @@ void python_draw_handler_help(WINDOW *win) | |||||||
|     struct python_registered_func *cur; |     struct python_registered_func *cur; | ||||||
|  |  | ||||||
|     for (cur = &python_commands; cur != NULL; cur = cur->next) { |     for (cur = &python_commands; cur != NULL; cur = cur->next) { | ||||||
|         if (cur->name != NULL) |         if (cur->name != NULL) { | ||||||
|             wprintw(win, "  %-29s: %.50s\n", cur->name, cur->help); |             wprintw(win, "  %-29s: %.50s\n", cur->name, cur->help); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
| #endif /* PYTHON */ | #endif /* PYTHON */ | ||||||
|   | |||||||
| @@ -52,8 +52,9 @@ int ID_to_QRcode_txt(const char *tox_id, const char *outfile) | |||||||
| { | { | ||||||
|     FILE *fp = fopen(outfile, "wb"); |     FILE *fp = fopen(outfile, "wb"); | ||||||
|  |  | ||||||
|     if (fp == NULL) |     if (fp == NULL) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     QRcode *qr_obj = QRcode_encodeString(tox_id, 0, QR_ECLEVEL_L, QR_MODE_8, 0); |     QRcode *qr_obj = QRcode_encodeString(tox_id, 0, QR_ECLEVEL_L, QR_MODE_8, 0); | ||||||
|  |  | ||||||
| @@ -65,14 +66,16 @@ int ID_to_QRcode_txt(const char *tox_id, const char *outfile) | |||||||
|     size_t width = qr_obj->width; |     size_t width = qr_obj->width; | ||||||
|     size_t i, j; |     size_t i, j; | ||||||
|  |  | ||||||
|     for (i = 0; i < width + BORDER_LEN * 2; ++i) |     for (i = 0; i < width + BORDER_LEN * 2; ++i) { | ||||||
|         fprintf(fp, "%s", CHAR_1); |         fprintf(fp, "%s", CHAR_1); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     fprintf(fp, "\n"); |     fprintf(fp, "\n"); | ||||||
|  |  | ||||||
|     for (i = 0; i < width; i += 2) { |     for (i = 0; i < width; i += 2) { | ||||||
|         for (j = 0; j < BORDER_LEN; ++j) |         for (j = 0; j < BORDER_LEN; ++j) { | ||||||
|             fprintf(fp, "%s", CHAR_1); |             fprintf(fp, "%s", CHAR_1); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         const unsigned char *row_1 = qr_obj->data + width * i; |         const unsigned char *row_1 = qr_obj->data + width * i; | ||||||
|         const unsigned char *row_2 = row_1 + width; |         const unsigned char *row_2 = row_1 + width; | ||||||
| @@ -81,18 +84,20 @@ int ID_to_QRcode_txt(const char *tox_id, const char *outfile) | |||||||
|             bool x = row_1[j] & 1; |             bool x = row_1[j] & 1; | ||||||
|             bool y = (i + 1) < width ? (row_2[j] & 1) : false; |             bool y = (i + 1) < width ? (row_2[j] & 1) : false; | ||||||
|  |  | ||||||
|             if (x && y) |             if (x && y) { | ||||||
|                 fprintf(fp, " "); |                 fprintf(fp, " "); | ||||||
|             else if (x) |             } else if (x) { | ||||||
|                 fprintf(fp, "%s", CHAR_2); |                 fprintf(fp, "%s", CHAR_2); | ||||||
|             else if (y) |             } else if (y) { | ||||||
|                 fprintf(fp, "%s", CHAR_3); |                 fprintf(fp, "%s", CHAR_3); | ||||||
|             else |             } else { | ||||||
|                 fprintf(fp, "%s", CHAR_1); |                 fprintf(fp, "%s", CHAR_1); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         for (j = 0; j < BORDER_LEN; ++j) |         for (j = 0; j < BORDER_LEN; ++j) { | ||||||
|             fprintf(fp, "%s", CHAR_1); |             fprintf(fp, "%s", CHAR_1); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         fprintf(fp, "\n"); |         fprintf(fp, "\n"); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -253,15 +253,18 @@ static int key_parse(const char **bind) | |||||||
|     int len = strlen(*bind); |     int len = strlen(*bind); | ||||||
|  |  | ||||||
|     if (len > 5) { |     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; |             return toupper(bind[0][5]) - 'A' + 1; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (strncasecmp(*bind, "tab", 3) == 0) |     if (strncasecmp(*bind, "tab", 3) == 0) { | ||||||
|         return T_KEY_TAB; |         return T_KEY_TAB; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (strncasecmp(*bind, "page", 4) == 0) |     if (strncasecmp(*bind, "page", 4) == 0) { | ||||||
|         return len == 6 ? KEY_PPAGE : KEY_NPAGE; |         return len == 6 ? KEY_PPAGE : KEY_NPAGE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
| @@ -304,8 +307,9 @@ int settings_load(struct user_settings *s, const char *patharg) | |||||||
|         if (!file_exists(path)) { |         if (!file_exists(path)) { | ||||||
|             FILE *fp = fopen(path, "w"); |             FILE *fp = fopen(path, "w"); | ||||||
|  |  | ||||||
|             if (fp == NULL) |             if (fp == NULL) { | ||||||
|                 return -1; |                 return -1; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             fclose(fp); |             fclose(fp); | ||||||
|         } |         } | ||||||
| @@ -397,29 +401,32 @@ int settings_load(struct user_settings *s, const char *patharg) | |||||||
|             int len = strlen(s->download_path); |             int len = strlen(s->download_path); | ||||||
|  |  | ||||||
|             /* make sure path ends with a '/' */ |             /* make sure path ends with a '/' */ | ||||||
|             if (len >= sizeof(s->download_path) - 2) |             if (len >= sizeof(s->download_path) - 2) { | ||||||
|                 s->download_path[0] = '\0'; |                 s->download_path[0] = '\0'; | ||||||
|             else if (s->download_path[len - 1] != '/') |             } else if (s->download_path[len - 1] != '/') { | ||||||
|                 strcat(&s->download_path[len - 1], "/"); |                 strcat(&s->download_path[len - 1], "/"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (config_setting_lookup_string(setting, tox_strings.chatlogs_path, &str)) { |         if (config_setting_lookup_string(setting, tox_strings.chatlogs_path, &str)) { | ||||||
|             snprintf(s->chatlogs_path, sizeof(s->chatlogs_path), "%s", str); |             snprintf(s->chatlogs_path, sizeof(s->chatlogs_path), "%s", str); | ||||||
|             int len = strlen(s->chatlogs_path); |             int len = strlen(s->chatlogs_path); | ||||||
|  |  | ||||||
|             if (len >= sizeof(s->chatlogs_path) - 2) |             if (len >= sizeof(s->chatlogs_path) - 2) { | ||||||
|                 s->chatlogs_path[0] = '\0'; |                 s->chatlogs_path[0] = '\0'; | ||||||
|             else if (s->chatlogs_path[len - 1] != '/') |             } else if (s->chatlogs_path[len - 1] != '/') { | ||||||
|                 strcat(&s->chatlogs_path[len - 1], "/"); |                 strcat(&s->chatlogs_path[len - 1], "/"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (config_setting_lookup_string(setting, tox_strings.avatar_path, &str)) { |         if (config_setting_lookup_string(setting, tox_strings.avatar_path, &str)) { | ||||||
|             snprintf(s->avatar_path, sizeof(s->avatar_path), "%s", str); |             snprintf(s->avatar_path, sizeof(s->avatar_path), "%s", str); | ||||||
|             int len = strlen(str); |             int len = strlen(str); | ||||||
|  |  | ||||||
|             if (len >= sizeof(s->avatar_path)) |             if (len >= sizeof(s->avatar_path)) { | ||||||
|                 s->avatar_path[0] = '\0'; |                 s->avatar_path[0] = '\0'; | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
| #ifdef PYTHON | #ifdef PYTHON | ||||||
|  |  | ||||||
| @@ -427,11 +434,12 @@ int settings_load(struct user_settings *s, const char *patharg) | |||||||
|             snprintf(s->autorun_path, sizeof(s->autorun_path), "%s", str); |             snprintf(s->autorun_path, sizeof(s->autorun_path), "%s", str); | ||||||
|             int len = strlen(str); |             int len = strlen(str); | ||||||
|  |  | ||||||
|             if (len >= sizeof(s->autorun_path) - 2) |             if (len >= sizeof(s->autorun_path) - 2) { | ||||||
|                 s->autorun_path[0] = '\0'; |                 s->autorun_path[0] = '\0'; | ||||||
|             else if (s->autorun_path[len - 1] != '/') |             } else if (s->autorun_path[len - 1] != '/') { | ||||||
|                 strcat(&s->autorun_path[len - 1], "/"); |                 strcat(&s->autorun_path[len - 1], "/"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -439,48 +447,60 @@ int settings_load(struct user_settings *s, const char *patharg) | |||||||
|             snprintf(s->password_eval, sizeof(s->password_eval), "%s", str); |             snprintf(s->password_eval, sizeof(s->password_eval), "%s", str); | ||||||
|             int len = strlen(str); |             int len = strlen(str); | ||||||
|  |  | ||||||
|             if (len >= sizeof(s->password_eval)) |             if (len >= sizeof(s->password_eval)) { | ||||||
|                 s->password_eval[0] = '\0'; |                 s->password_eval[0] = '\0'; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* keys */ |     /* keys */ | ||||||
|     if ((setting = config_lookup(cfg, key_strings.self)) != NULL) { |     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)) |         if (config_setting_lookup_string(setting, key_strings.next_tab, &tmp)) { | ||||||
|             set_key_binding(&s->key_next_tab, &tmp); |             set_key_binding(&s->key_next_tab, &tmp); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (config_setting_lookup_string(setting, key_strings.prev_tab, &tmp)) |         if (config_setting_lookup_string(setting, key_strings.prev_tab, &tmp)) { | ||||||
|             set_key_binding(&s->key_prev_tab, &tmp); |             set_key_binding(&s->key_prev_tab, &tmp); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (config_setting_lookup_string(setting, key_strings.scroll_line_up, &tmp)) |         if (config_setting_lookup_string(setting, key_strings.scroll_line_up, &tmp)) { | ||||||
|             set_key_binding(&s->key_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)) |         if (config_setting_lookup_string(setting, key_strings.scroll_line_down, &tmp)) { | ||||||
|             set_key_binding(&s->key_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)) |         if (config_setting_lookup_string(setting, key_strings.half_page_up, &tmp)) { | ||||||
|             set_key_binding(&s->key_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)) |         if (config_setting_lookup_string(setting, key_strings.half_page_down, &tmp)) { | ||||||
|             set_key_binding(&s->key_half_page_down, &tmp); |             set_key_binding(&s->key_half_page_down, &tmp); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (config_setting_lookup_string(setting, key_strings.page_bottom, &tmp)) |         if (config_setting_lookup_string(setting, key_strings.page_bottom, &tmp)) { | ||||||
|             set_key_binding(&s->key_page_bottom, &tmp); |             set_key_binding(&s->key_page_bottom, &tmp); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (config_setting_lookup_string(setting, key_strings.peer_list_up, &tmp)) |         if (config_setting_lookup_string(setting, key_strings.peer_list_up, &tmp)) { | ||||||
|             set_key_binding(&s->key_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)) |         if (config_setting_lookup_string(setting, key_strings.peer_list_down, &tmp)) { | ||||||
|             set_key_binding(&s->key_peer_list_down, &tmp); |             set_key_binding(&s->key_peer_list_down, &tmp); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (config_setting_lookup_string(setting, key_strings.toggle_peerlist, &tmp)) |         if (config_setting_lookup_string(setting, key_strings.toggle_peerlist, &tmp)) { | ||||||
|             set_key_binding(&s->key_toggle_peerlist, &tmp); |             set_key_binding(&s->key_toggle_peerlist, &tmp); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (config_setting_lookup_string(setting, key_strings.toggle_pastemode, &tmp)) |         if (config_setting_lookup_string(setting, key_strings.toggle_pastemode, &tmp)) { | ||||||
|             set_key_binding(&s->key_toggle_pastemode, &tmp); |             set_key_binding(&s->key_toggle_pastemode, &tmp); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
| #ifdef AUDIO | #ifdef AUDIO | ||||||
|  |  | ||||||
| @@ -501,51 +521,59 @@ int settings_load(struct user_settings *s, const char *patharg) | |||||||
|     if ((setting = config_lookup(cfg, sound_strings.self)) != NULL) { |     if ((setting = config_lookup(cfg, sound_strings.self)) != NULL) { | ||||||
|         if ((config_setting_lookup_string(setting, sound_strings.notif_error, &str) != CONFIG_TRUE) || |         if ((config_setting_lookup_string(setting, sound_strings.notif_error, &str) != CONFIG_TRUE) || | ||||||
|                 !set_sound(notif_error, str)) { |                 !set_sound(notif_error, str)) { | ||||||
|             if (str && strcasecmp(str, NO_SOUND) != 0) |             if (str && strcasecmp(str, NO_SOUND) != 0) { | ||||||
|                 set_sound(notif_error, PACKAGE_DATADIR "/sounds/ToxicError.wav"); |                 set_sound(notif_error, PACKAGE_DATADIR "/sounds/ToxicError.wav"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!config_setting_lookup_string(setting, sound_strings.user_log_in, &str) || |         if (!config_setting_lookup_string(setting, sound_strings.user_log_in, &str) || | ||||||
|                 !set_sound(user_log_in, str)) { |                 !set_sound(user_log_in, str)) { | ||||||
|             if (str && strcasecmp(str, NO_SOUND) != 0) |             if (str && strcasecmp(str, NO_SOUND) != 0) { | ||||||
|                 set_sound(user_log_in, PACKAGE_DATADIR "/sounds/ToxicContactOnline.wav"); |                 set_sound(user_log_in, PACKAGE_DATADIR "/sounds/ToxicContactOnline.wav"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!config_setting_lookup_string(setting, sound_strings.user_log_out, &str) || |         if (!config_setting_lookup_string(setting, sound_strings.user_log_out, &str) || | ||||||
|                 !set_sound(user_log_out, str)) { |                 !set_sound(user_log_out, str)) { | ||||||
|             if (str && strcasecmp(str, NO_SOUND) != 0) |             if (str && strcasecmp(str, NO_SOUND) != 0) { | ||||||
|                 set_sound(user_log_out, PACKAGE_DATADIR "/sounds/ToxicContactOffline.wav"); |                 set_sound(user_log_out, PACKAGE_DATADIR "/sounds/ToxicContactOffline.wav"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!config_setting_lookup_string(setting, sound_strings.call_incoming, &str) || |         if (!config_setting_lookup_string(setting, sound_strings.call_incoming, &str) || | ||||||
|                 !set_sound(call_incoming, str)) { |                 !set_sound(call_incoming, str)) { | ||||||
|             if (str && strcasecmp(str, NO_SOUND) != 0) |             if (str && strcasecmp(str, NO_SOUND) != 0) { | ||||||
|                 set_sound(call_incoming, PACKAGE_DATADIR "/sounds/ToxicIncomingCall.wav"); |                 set_sound(call_incoming, PACKAGE_DATADIR "/sounds/ToxicIncomingCall.wav"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!config_setting_lookup_string(setting, sound_strings.call_outgoing, &str) || |         if (!config_setting_lookup_string(setting, sound_strings.call_outgoing, &str) || | ||||||
|                 !set_sound(call_outgoing, str)) { |                 !set_sound(call_outgoing, str)) { | ||||||
|             if (str && strcasecmp(str, NO_SOUND) != 0) |             if (str && strcasecmp(str, NO_SOUND) != 0) { | ||||||
|                 set_sound(call_outgoing, PACKAGE_DATADIR "/sounds/ToxicOutgoingCall.wav"); |                 set_sound(call_outgoing, PACKAGE_DATADIR "/sounds/ToxicOutgoingCall.wav"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!config_setting_lookup_string(setting, sound_strings.generic_message, &str) || |         if (!config_setting_lookup_string(setting, sound_strings.generic_message, &str) || | ||||||
|                 !set_sound(generic_message, str)) { |                 !set_sound(generic_message, str)) { | ||||||
|             if (str && strcasecmp(str, NO_SOUND) != 0) |             if (str && strcasecmp(str, NO_SOUND) != 0) { | ||||||
|                 set_sound(generic_message, PACKAGE_DATADIR "/sounds/ToxicRecvMessage.wav"); |                 set_sound(generic_message, PACKAGE_DATADIR "/sounds/ToxicRecvMessage.wav"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!config_setting_lookup_string(setting, sound_strings.transfer_pending, &str) || |         if (!config_setting_lookup_string(setting, sound_strings.transfer_pending, &str) || | ||||||
|                 !set_sound(transfer_pending, str)) { |                 !set_sound(transfer_pending, str)) { | ||||||
|             if (str && strcasecmp(str, NO_SOUND) != 0) |             if (str && strcasecmp(str, NO_SOUND) != 0) { | ||||||
|                 set_sound(transfer_pending, PACKAGE_DATADIR "/sounds/ToxicTransferStart.wav"); |                 set_sound(transfer_pending, PACKAGE_DATADIR "/sounds/ToxicTransferStart.wav"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!config_setting_lookup_string(setting, sound_strings.transfer_completed, &str) || |         if (!config_setting_lookup_string(setting, sound_strings.transfer_completed, &str) || | ||||||
|                 !set_sound(transfer_completed, str)) { |                 !set_sound(transfer_completed, str)) { | ||||||
|             if (str && strcasecmp(str, NO_SOUND) != 0) |             if (str && strcasecmp(str, NO_SOUND) != 0) { | ||||||
|                 set_sound(transfer_completed, PACKAGE_DATADIR "/sounds/ToxicTransferComplete.wav"); |                 set_sound(transfer_completed, PACKAGE_DATADIR "/sounds/ToxicTransferComplete.wav"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|     } else { |     } else { | ||||||
|         set_sound(notif_error, PACKAGE_DATADIR "/sounds/ToxicError.wav"); |         set_sound(notif_error, PACKAGE_DATADIR "/sounds/ToxicError.wav"); | ||||||
|         set_sound(user_log_in, PACKAGE_DATADIR "/sounds/ToxicContactOnline.wav"); |         set_sound(user_log_in, PACKAGE_DATADIR "/sounds/ToxicContactOnline.wav"); | ||||||
|   | |||||||
| @@ -99,10 +99,11 @@ static char *read_into_dyn_buffer (FILE *stream) | |||||||
|     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); |         int length = dyn_buffer_size + strlen(input_ptr); | ||||||
|  |  | ||||||
|         if (dyn_buffer) |         if (dyn_buffer) { | ||||||
|             dyn_buffer = (char *) realloc(dyn_buffer, length); |             dyn_buffer = (char *) realloc(dyn_buffer, length); | ||||||
|         else |         } else { | ||||||
|             dyn_buffer = (char *) malloc(length); |             dyn_buffer = (char *) malloc(length); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         strcpy(dyn_buffer + dyn_buffer_size - 1, input_ptr); |         strcpy(dyn_buffer + dyn_buffer_size - 1, input_ptr); | ||||||
|         dyn_buffer_size = length; |         dyn_buffer_size = length; | ||||||
| @@ -118,25 +119,29 @@ static char *extract_socket_path (const char *info) | |||||||
|     char *end = NULL; |     char *end = NULL; | ||||||
|     char *path = NULL; |     char *path = NULL; | ||||||
|  |  | ||||||
|     if (!pos) |     if (!pos) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pos += strlen(search_str); |     pos += strlen(search_str); | ||||||
|     pos = strchr(pos, PATH_SEP_C); |     pos = strchr(pos, PATH_SEP_C); | ||||||
|  |  | ||||||
|     if (!pos) |     if (!pos) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     end = strchr(pos, '\n'); |     end = strchr(pos, '\n'); | ||||||
|  |  | ||||||
|     if (!end) |     if (!end) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     *end = '\0'; |     *end = '\0'; | ||||||
|     end = strrchr(pos, '.'); |     end = strrchr(pos, '.'); | ||||||
|  |  | ||||||
|     if (!end) |     if (!end) { | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     path = (char *) malloc(end - pos + 1); |     path = (char *) malloc(end - pos + 1); | ||||||
|     *end = '\0'; |     *end = '\0'; | ||||||
| @@ -151,32 +156,37 @@ static int detect_gnu_screen () | |||||||
|  |  | ||||||
|     socket_name = getenv("STY"); |     socket_name = getenv("STY"); | ||||||
|  |  | ||||||
|     if (!socket_name) |     if (!socket_name) { | ||||||
|         goto nomplex; |         goto nomplex; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     session_info_stream = popen("env LC_ALL=C screen -ls", "r"); |     session_info_stream = popen("env LC_ALL=C screen -ls", "r"); | ||||||
|  |  | ||||||
|     if (!session_info_stream) |     if (!session_info_stream) { | ||||||
|         goto nomplex; |         goto nomplex; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     dyn_buffer = read_into_dyn_buffer(session_info_stream); |     dyn_buffer = read_into_dyn_buffer(session_info_stream); | ||||||
|  |  | ||||||
|     if (!dyn_buffer) |     if (!dyn_buffer) { | ||||||
|         goto nomplex; |         goto nomplex; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pclose(session_info_stream); |     pclose(session_info_stream); | ||||||
|     session_info_stream = NULL; |     session_info_stream = NULL; | ||||||
|  |  | ||||||
|     socket_path = extract_socket_path(dyn_buffer); |     socket_path = extract_socket_path(dyn_buffer); | ||||||
|  |  | ||||||
|     if (!socket_path) |     if (!socket_path) { | ||||||
|         goto nomplex; |         goto nomplex; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     free(dyn_buffer); |     free(dyn_buffer); | ||||||
|     dyn_buffer = NULL; |     dyn_buffer = NULL; | ||||||
|  |  | ||||||
|     if (strlen(socket_path) + strlen(PATH_SEP_S) + strlen(socket_name) >= sizeof(mplex_data)) |     if (strlen(socket_path) + strlen(PATH_SEP_S) + strlen(socket_name) >= sizeof(mplex_data)) { | ||||||
|         goto nomplex; |         goto nomplex; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     strcpy(mplex_data, socket_path); |     strcpy(mplex_data, socket_path); | ||||||
|     strcat(mplex_data, PATH_SEP_S); |     strcat(mplex_data, PATH_SEP_S); | ||||||
| @@ -189,14 +199,17 @@ static int detect_gnu_screen () | |||||||
|  |  | ||||||
| nomplex: | nomplex: | ||||||
|  |  | ||||||
|     if (session_info_stream) |     if (session_info_stream) { | ||||||
|         pclose(session_info_stream); |         pclose(session_info_stream); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (dyn_buffer) |     if (dyn_buffer) { | ||||||
|         free(dyn_buffer); |         free(dyn_buffer); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (socket_path) |     if (socket_path) { | ||||||
|         free(socket_path); |         free(socket_path); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @@ -205,14 +218,16 @@ static int detect_tmux () | |||||||
| { | { | ||||||
|     char *tmux_env = getenv("TMUX"), *pos; |     char *tmux_env = getenv("TMUX"), *pos; | ||||||
|  |  | ||||||
|     if (!tmux_env) |     if (!tmux_env) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* find second separator */ |     /* find second separator */ | ||||||
|     pos = strrchr(tmux_env, ','); |     pos = strrchr(tmux_env, ','); | ||||||
|  |  | ||||||
|     if (!pos) |     if (!pos) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* store the session id for later use */ |     /* store the session id for later use */ | ||||||
|     snprintf(mplex_data, sizeof(mplex_data), "$%s", pos + 1); |     snprintf(mplex_data, sizeof(mplex_data), "$%s", pos + 1); | ||||||
| @@ -239,13 +254,15 @@ static int detect_mplex () | |||||||
|  */ |  */ | ||||||
| static int gnu_screen_is_detached() | static int gnu_screen_is_detached() | ||||||
| { | { | ||||||
|     if (mplex != MPLEX_SCREEN) |     if (mplex != MPLEX_SCREEN) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     struct stat sb; |     struct stat sb; | ||||||
|  |  | ||||||
|     if (stat (mplex_data, &sb) != 0) |     if (stat(mplex_data, &sb) != 0) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* execution permission (x) means attached */ |     /* execution permission (x) means attached */ | ||||||
|     return !(sb.st_mode & S_IXUSR); |     return !(sb.st_mode & S_IXUSR); | ||||||
| @@ -256,8 +273,9 @@ static int gnu_screen_is_detached () | |||||||
|  */ |  */ | ||||||
| static int tmux_is_detached() | static int tmux_is_detached() | ||||||
| { | { | ||||||
|     if (mplex != MPLEX_TMUX) |     if (mplex != MPLEX_TMUX) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     FILE *session_info_stream = NULL; |     FILE *session_info_stream = NULL; | ||||||
|     char *dyn_buffer = NULL, *search_str = NULL; |     char *dyn_buffer = NULL, *search_str = NULL; | ||||||
| @@ -268,13 +286,15 @@ static int tmux_is_detached () | |||||||
|     /* get the number of attached clients for each session */ |     /* get the number of attached clients for each session */ | ||||||
|     session_info_stream = popen("tmux list-sessions -F \"#{session_id} #{session_attached}\"", "r"); |     session_info_stream = popen("tmux list-sessions -F \"#{session_id} #{session_attached}\"", "r"); | ||||||
|  |  | ||||||
|     if (!session_info_stream) |     if (!session_info_stream) { | ||||||
|         goto fail; |         goto fail; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     dyn_buffer = read_into_dyn_buffer(session_info_stream); |     dyn_buffer = read_into_dyn_buffer(session_info_stream); | ||||||
|  |  | ||||||
|     if (!dyn_buffer) |     if (!dyn_buffer) { | ||||||
|         goto fail; |         goto fail; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pclose(session_info_stream); |     pclose(session_info_stream); | ||||||
|     session_info_stream = NULL; |     session_info_stream = NULL; | ||||||
| @@ -285,13 +305,15 @@ static int tmux_is_detached () | |||||||
|     strcpy(search_str + 1, mplex_data); |     strcpy(search_str + 1, mplex_data); | ||||||
|  |  | ||||||
|     /* do the search */ |     /* do the search */ | ||||||
|     if (strncmp (dyn_buffer, search_str + 1, numstr_len) == 0) |     if (strncmp(dyn_buffer, search_str + 1, numstr_len) == 0) { | ||||||
|         entry_pos = dyn_buffer; |         entry_pos = dyn_buffer; | ||||||
|     else |     } else { | ||||||
|         entry_pos = strstr(dyn_buffer, search_str); |         entry_pos = strstr(dyn_buffer, search_str); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (! entry_pos) |     if (! entry_pos) { | ||||||
|         goto fail; |         goto fail; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     entry_pos = strchr(entry_pos, ' ') + 1; |     entry_pos = strchr(entry_pos, ' ') + 1; | ||||||
|     detached = strncmp(entry_pos, "0\n", 2) == 0; |     detached = strncmp(entry_pos, "0\n", 2) == 0; | ||||||
| @@ -306,14 +328,17 @@ static int tmux_is_detached () | |||||||
|  |  | ||||||
| fail: | fail: | ||||||
|  |  | ||||||
|     if (session_info_stream) |     if (session_info_stream) { | ||||||
|         pclose(session_info_stream); |         pclose(session_info_stream); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (dyn_buffer) |     if (dyn_buffer) { | ||||||
|         free(dyn_buffer); |         free(dyn_buffer); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (search_str) |     if (search_str) { | ||||||
|         free(search_str); |         free(search_str); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @@ -337,8 +362,9 @@ static void mplex_timer_handler (Tox *m) | |||||||
|     TOX_USER_STATUS current_status, new_status; |     TOX_USER_STATUS current_status, new_status; | ||||||
|     const char *new_note; |     const char *new_note; | ||||||
|  |  | ||||||
|     if (mplex == MPLEX_NONE) |     if (mplex == MPLEX_NONE) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int detached = mplex_is_detached(); |     int detached = mplex_is_detached(); | ||||||
|  |  | ||||||
| @@ -360,8 +386,9 @@ static void mplex_timer_handler (Tox *m) | |||||||
|         prev_note[slen] = '\0'; |         prev_note[slen] = '\0'; | ||||||
|         pthread_mutex_unlock(&Winthread.lock); |         pthread_mutex_unlock(&Winthread.lock); | ||||||
|         new_note = user_settings->mplex_away_note; |         new_note = user_settings->mplex_away_note; | ||||||
|     } else |     } else { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char argv[3][MAX_STR_SIZE]; |     char argv[3][MAX_STR_SIZE]; | ||||||
|     strcpy(argv[0], "/status"); |     strcpy(argv[0], "/status"); | ||||||
| @@ -390,18 +417,22 @@ void *mplex_timer_thread(void *data) | |||||||
|  |  | ||||||
| int init_mplex_away_timer(Tox *m) | int init_mplex_away_timer(Tox *m) | ||||||
| { | { | ||||||
|     if (! detect_mplex ()) |     if (! detect_mplex()) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (! user_settings->mplex_away) |     if (! user_settings->mplex_away) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* status access mutex */ |     /* status access mutex */ | ||||||
|     if (pthread_mutex_init (&status_lock, NULL) != 0) |     if (pthread_mutex_init(&status_lock, NULL) != 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (pthread_create(&mplex_tid, NULL, mplex_timer_thread, (void *) m) != 0) |     if (pthread_create(&mplex_tid, NULL, mplex_timer_thread, (void *) m) != 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										175
									
								
								src/toxic.c
									
									
									
									
									
								
							
							
						
						
									
										175
									
								
								src/toxic.c
									
									
									
									
									
								
							| @@ -229,9 +229,10 @@ static void init_term(void) | |||||||
|         start_color(); |         start_color(); | ||||||
|  |  | ||||||
|         if (user_settings->colour_theme == NATIVE_COLS) { |         if (user_settings->colour_theme == NATIVE_COLS) { | ||||||
|             if (assume_default_colors(-1, -1) == OK) |             if (assume_default_colors(-1, -1) == OK) { | ||||||
|                 bg_color = -1; |                 bg_color = -1; | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         init_pair(0, COLOR_WHITE, COLOR_BLACK); |         init_pair(0, COLOR_WHITE, COLOR_BLACK); | ||||||
|         init_pair(1, COLOR_GREEN, bg_color); |         init_pair(1, COLOR_GREEN, bg_color); | ||||||
| @@ -267,13 +268,15 @@ static void queue_init_message(const char *msg, ...) | |||||||
|  |  | ||||||
|     char **new_msgs = realloc(init_messages.msgs, sizeof(char *) * init_messages.num); |     char **new_msgs = realloc(init_messages.msgs, sizeof(char *) * init_messages.num); | ||||||
|  |  | ||||||
|     if (new_msgs == NULL) |     if (new_msgs == NULL) { | ||||||
|         exit_toxic_err("Failed in queue_init_message", FATALERR_MEMORY); |         exit_toxic_err("Failed in queue_init_message", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     new_msgs[i] = malloc(MAX_STR_SIZE); |     new_msgs[i] = malloc(MAX_STR_SIZE); | ||||||
|  |  | ||||||
|     if (new_msgs[i] == NULL) |     if (new_msgs[i] == NULL) { | ||||||
|         exit_toxic_err("Failed in queue_init_message", FATALERR_MEMORY); |         exit_toxic_err("Failed in queue_init_message", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     snprintf(new_msgs[i], MAX_STR_SIZE, "%s", frmt_msg); |     snprintf(new_msgs[i], MAX_STR_SIZE, "%s", frmt_msg); | ||||||
|     init_messages.msgs = new_msgs; |     init_messages.msgs = new_msgs; | ||||||
| @@ -282,13 +285,15 @@ static void queue_init_message(const char *msg, ...) | |||||||
| /* called after messages have been printed to prompt and are no longer needed */ | /* called after messages have been printed to prompt and are no longer needed */ | ||||||
| static void cleanup_init_messages(void) | static void cleanup_init_messages(void) | ||||||
| { | { | ||||||
|     if (init_messages.num <= 0) |     if (init_messages.num <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < init_messages.num; ++i) |     for (i = 0; i < init_messages.num; ++i) { | ||||||
|         free(init_messages.msgs[i]); |         free(init_messages.msgs[i]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     free(init_messages.msgs); |     free(init_messages.msgs); | ||||||
| } | } | ||||||
| @@ -297,9 +302,10 @@ static void print_init_messages(ToxWindow *toxwin) | |||||||
| { | { | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < init_messages.num; ++i) |     for (i = 0; i < init_messages.num; ++i) { | ||||||
|         line_info_add(toxwin, NULL, NULL, NULL, SYS_MSG, 0, 0, init_messages.msgs[i]); |         line_info_add(toxwin, NULL, NULL, NULL, SYS_MSG, 0, 0, init_messages.msgs[i]); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| static void load_friendlist(Tox *m) | static void load_friendlist(Tox *m) | ||||||
| { | { | ||||||
| @@ -358,8 +364,9 @@ static int password_prompt(char *buf, int size) | |||||||
|     nflags.c_lflag &= ~ECHO; |     nflags.c_lflag &= ~ECHO; | ||||||
|     nflags.c_lflag |= ECHONL; |     nflags.c_lflag |= ECHONL; | ||||||
|  |  | ||||||
|     if (tcsetattr(fileno(stdin), TCSANOW, &nflags) != 0) |     if (tcsetattr(fileno(stdin), TCSANOW, &nflags) != 0) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     const char *p = fgets(buf, size, stdin); |     const char *p = fgets(buf, size, stdin); | ||||||
|     int len = strlen(buf); |     int len = strlen(buf); | ||||||
| @@ -367,8 +374,9 @@ static int password_prompt(char *buf, int size) | |||||||
|     /* re-enable terminal echo */ |     /* re-enable terminal echo */ | ||||||
|     tcsetattr(fileno(stdin), TCSANOW, &oflags); |     tcsetattr(fileno(stdin), TCSANOW, &oflags); | ||||||
|  |  | ||||||
|     if (p == NULL || len <= 1) |     if (p == NULL || len <= 1) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* eat overflowed stdin and return error */ |     /* eat overflowed stdin and return error */ | ||||||
|     if (buf[--len] != '\n') { |     if (buf[--len] != '\n') { | ||||||
| @@ -438,15 +446,17 @@ static void first_time_encrypt(const char *msg) | |||||||
|         fflush(stdout); |         fflush(stdout); | ||||||
|  |  | ||||||
|         if (!strcasecmp(ch, "y\n") || !strcasecmp(ch, "n\n") || !strcasecmp(ch, "yes\n") |         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; |             break; | ||||||
|  |         } | ||||||
|  |  | ||||||
|     } while (fgets(ch, sizeof(ch), stdin)); |     } while (fgets(ch, sizeof(ch), stdin)); | ||||||
|  |  | ||||||
|     printf("\n"); |     printf("\n"); | ||||||
|  |  | ||||||
|     if (ch[0] == 'q' || ch[0] == 'Q') |     if (ch[0] == 'q' || ch[0] == 'Q') { | ||||||
|         exit(0); |         exit(0); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ch[0] == 'y' || ch[0] == 'Y') { |     if (ch[0] == 'y' || ch[0] == 'Y') { | ||||||
|         int len = 0; |         int len = 0; | ||||||
| @@ -460,8 +470,9 @@ static void first_time_encrypt(const char *msg) | |||||||
|             len = password_prompt(user_password.pass, sizeof(user_password.pass)); |             len = password_prompt(user_password.pass, sizeof(user_password.pass)); | ||||||
|             user_password.len = len; |             user_password.len = len; | ||||||
|  |  | ||||||
|             if (strcasecmp(user_password.pass, "q") == 0) |             if (strcasecmp(user_password.pass, "q") == 0) { | ||||||
|                 exit(0); |                 exit(0); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             if (string_is_empty(passconfirm) && (len < MIN_PASSWORD_LEN || len > MAX_PASSWORD_LEN)) { |             if (string_is_empty(passconfirm) && (len < MIN_PASSWORD_LEN || len > MAX_PASSWORD_LEN)) { | ||||||
|                 printf("Password must be between %d and %d characters long. ", MIN_PASSWORD_LEN, MAX_PASSWORD_LEN); |                 printf("Password must be between %d and %d characters long. ", MIN_PASSWORD_LEN, MAX_PASSWORD_LEN); | ||||||
| @@ -604,11 +615,13 @@ static void init_tox_options(struct Tox_Options *tox_opts) | |||||||
|     tox_options_set_proxy_type(tox_opts, arg_opts.proxy_type); |     tox_options_set_proxy_type(tox_opts, arg_opts.proxy_type); | ||||||
|     tox_options_set_tcp_port(tox_opts, arg_opts.tcp_port); |     tox_options_set_tcp_port(tox_opts, arg_opts.tcp_port); | ||||||
|  |  | ||||||
|     if (!tox_options_get_ipv6_enabled(tox_opts)) |     if (!tox_options_get_ipv6_enabled(tox_opts)) { | ||||||
|         queue_init_message("Forcing IPv4 connection"); |         queue_init_message("Forcing IPv4 connection"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (tox_options_get_tcp_port(tox_opts)) |     if (tox_options_get_tcp_port(tox_opts)) { | ||||||
|         queue_init_message("TCP relaying enabled on port %d", tox_options_get_tcp_port(tox_opts)); |         queue_init_message("TCP relaying enabled on port %d", tox_options_get_tcp_port(tox_opts)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (tox_options_get_proxy_type(tox_opts) != TOX_PROXY_TYPE_NONE) { |     if (tox_options_get_proxy_type(tox_opts) != TOX_PROXY_TYPE_NONE) { | ||||||
|         tox_options_set_proxy_port(tox_opts, arg_opts.proxy_port); |         tox_options_set_proxy_port(tox_opts, arg_opts.proxy_port); | ||||||
| @@ -662,14 +675,16 @@ static Tox *load_tox(char *data_path, struct Tox_Options *tox_opts, TOX_ERR_NEW | |||||||
|             exit_toxic_err("failed in load_tox", FATALERR_ENCRYPT); |             exit_toxic_err("failed in load_tox", FATALERR_ENCRYPT); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (arg_opts.unencrypt_data && is_encrypted) |         if (arg_opts.unencrypt_data && is_encrypted) { | ||||||
|             queue_init_message("Data file '%s' has been unencrypted", data_path); |             queue_init_message("Data file '%s' has been unencrypted", data_path); | ||||||
|         else if (arg_opts.unencrypt_data) |         } else if (arg_opts.unencrypt_data) { | ||||||
|             queue_init_message("Warning: passed --unencrypt-data option with unencrypted data file '%s'", data_path); |             queue_init_message("Warning: passed --unencrypt-data option with unencrypted data file '%s'", data_path); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (is_encrypted) { |         if (is_encrypted) { | ||||||
|             if (!arg_opts.unencrypt_data) |             if (!arg_opts.unencrypt_data) { | ||||||
|                 user_password.data_is_encrypted = true; |                 user_password.data_is_encrypted = true; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             size_t pwlen = 0; |             size_t pwlen = 0; | ||||||
|             int pweval = user_settings->password_eval[0]; |             int pweval = user_settings->password_eval[0]; | ||||||
| @@ -746,19 +761,22 @@ static Tox *load_tox(char *data_path, struct Tox_Options *tox_opts, TOX_ERR_NEW | |||||||
|  |  | ||||||
|         fclose(fp); |         fclose(fp); | ||||||
|     } else {   /* Data file does not/should not exist */ |     } else {   /* Data file does not/should not exist */ | ||||||
|         if (file_exists(data_path)) |         if (file_exists(data_path)) { | ||||||
|             exit_toxic_err("failed in load_tox", FATALERR_FILEOP); |             exit_toxic_err("failed in load_tox", FATALERR_FILEOP); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         tox_options_set_savedata_type(tox_opts, TOX_SAVEDATA_TYPE_NONE); |         tox_options_set_savedata_type(tox_opts, TOX_SAVEDATA_TYPE_NONE); | ||||||
|  |  | ||||||
|         m = tox_new(tox_opts, new_err); |         m = tox_new(tox_opts, new_err); | ||||||
|  |  | ||||||
|         if (m == NULL) |         if (m == NULL) { | ||||||
|             return NULL; |             return NULL; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (store_data(m, data_path) == -1) |         if (store_data(m, data_path) == -1) { | ||||||
|             exit_toxic_err("failed in load_tox", FATALERR_FILEOP); |             exit_toxic_err("failed in load_tox", FATALERR_FILEOP); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return m; |     return m; | ||||||
| } | } | ||||||
| @@ -768,8 +786,9 @@ static Tox *load_toxic(char *data_path) | |||||||
|     TOX_ERR_OPTIONS_NEW options_new_err; |     TOX_ERR_OPTIONS_NEW options_new_err; | ||||||
|     struct Tox_Options *tox_opts = tox_options_new(&options_new_err); |     struct Tox_Options *tox_opts = tox_options_new(&options_new_err); | ||||||
|  |  | ||||||
|     if (!tox_opts) |     if (!tox_opts) { | ||||||
|         exit_toxic_err("tox_options_new returned fatal error", options_new_err); |         exit_toxic_err("tox_options_new returned fatal error", options_new_err); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     init_tox_options(tox_opts); |     init_tox_options(tox_opts); | ||||||
|  |  | ||||||
| @@ -782,18 +801,21 @@ static Tox *load_toxic(char *data_path) | |||||||
|         m = load_tox(data_path, tox_opts, &new_err); |         m = load_tox(data_path, tox_opts, &new_err); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!m) |     if (!m) { | ||||||
|         exit_toxic_err("tox_new returned fatal error", new_err); |         exit_toxic_err("tox_new returned fatal error", new_err); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (new_err != TOX_ERR_NEW_OK) |     if (new_err != TOX_ERR_NEW_OK) { | ||||||
|         queue_init_message("tox_new returned non-fatal error %d", new_err); |         queue_init_message("tox_new returned non-fatal error %d", new_err); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     init_tox_callbacks(m); |     init_tox_callbacks(m); | ||||||
|     load_friendlist(m); |     load_friendlist(m); | ||||||
|     load_blocklist(BLOCK_FILE); |     load_blocklist(BLOCK_FILE); | ||||||
|  |  | ||||||
|     if (tox_self_get_name_size(m) == 0) |     if (tox_self_get_name_size(m) == 0) { | ||||||
|         tox_self_set_name(m, (uint8_t *) "Toxic User", strlen("Toxic User"), NULL); |         tox_self_set_name(m, (uint8_t *) "Toxic User", strlen("Toxic User"), NULL); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     tox_options_free(tox_opts); |     tox_options_free(tox_opts); | ||||||
|     return m; |     return m; | ||||||
| @@ -854,9 +876,10 @@ void *thread_cqueue(void *data) | |||||||
|             ToxWindow *toxwin = get_window_ptr(i); |             ToxWindow *toxwin = get_window_ptr(i); | ||||||
|  |  | ||||||
|             if (toxwin != NULL && toxwin->is_chat |             if (toxwin != NULL && toxwin->is_chat | ||||||
|                     && get_friend_connection_status(toxwin->num) != TOX_CONNECTION_NONE) |                     && get_friend_connection_status(toxwin->num) != TOX_CONNECTION_NONE) { | ||||||
|                 cqueue_try_send(toxwin, m); |                 cqueue_try_send(toxwin, m); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         pthread_mutex_unlock(&Winthread.lock); |         pthread_mutex_unlock(&Winthread.lock); | ||||||
|  |  | ||||||
| @@ -956,8 +979,9 @@ static void parse_args(int argc, char *argv[]) | |||||||
|             case 'c': |             case 'c': | ||||||
|                 snprintf(arg_opts.config_path, sizeof(arg_opts.config_path), "%s", optarg); |                 snprintf(arg_opts.config_path, sizeof(arg_opts.config_path), "%s", optarg); | ||||||
|  |  | ||||||
|                 if (!file_exists(arg_opts.config_path)) |                 if (!file_exists(arg_opts.config_path)) { | ||||||
|                     queue_init_message("Config file not found"); |                     queue_init_message("Config file not found"); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
| @@ -973,22 +997,26 @@ static void parse_args(int argc, char *argv[]) | |||||||
|             case 'f': |             case 'f': | ||||||
|                 arg_opts.use_custom_data = 1; |                 arg_opts.use_custom_data = 1; | ||||||
|  |  | ||||||
|                 if (DATA_FILE) |                 if (DATA_FILE) { | ||||||
|                     free(DATA_FILE); |                     free(DATA_FILE); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 if (BLOCK_FILE) |                 if (BLOCK_FILE) { | ||||||
|                     free(BLOCK_FILE); |                     free(BLOCK_FILE); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 DATA_FILE = malloc(strlen(optarg) + 1); |                 DATA_FILE = malloc(strlen(optarg) + 1); | ||||||
|                 strcpy(DATA_FILE, optarg); |                 strcpy(DATA_FILE, optarg); | ||||||
|  |  | ||||||
|                 if (DATA_FILE == NULL) |                 if (DATA_FILE == NULL) { | ||||||
|                     exit_toxic_err("failed in parse_args", FATALERR_MEMORY); |                     exit_toxic_err("failed in parse_args", FATALERR_MEMORY); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 BLOCK_FILE = malloc(strlen(optarg) + strlen("-blocklist") + 1); |                 BLOCK_FILE = malloc(strlen(optarg) + strlen("-blocklist") + 1); | ||||||
|  |  | ||||||
|                 if (BLOCK_FILE == NULL) |                 if (BLOCK_FILE == NULL) { | ||||||
|                     exit_toxic_err("failed in parse_args", FATALERR_MEMORY); |                     exit_toxic_err("failed in parse_args", FATALERR_MEMORY); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 strcpy(BLOCK_FILE, optarg); |                 strcpy(BLOCK_FILE, optarg); | ||||||
|                 strcat(BLOCK_FILE, "-blocklist"); |                 strcat(BLOCK_FILE, "-blocklist"); | ||||||
| @@ -1010,13 +1038,15 @@ static void parse_args(int argc, char *argv[]) | |||||||
|                 arg_opts.proxy_type = TOX_PROXY_TYPE_SOCKS5; |                 arg_opts.proxy_type = TOX_PROXY_TYPE_SOCKS5; | ||||||
|                 snprintf(arg_opts.proxy_address, sizeof(arg_opts.proxy_address), "%s", optarg); |                 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); |                     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) |                 if (port <= 0 || port > MAX_PORT_RANGE) { | ||||||
|                     exit_toxic_err("Proxy error", FATALERR_PROXY); |                     exit_toxic_err("Proxy error", FATALERR_PROXY); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 arg_opts.proxy_port = port; |                 arg_opts.proxy_port = port; | ||||||
|                 break; |                 break; | ||||||
| @@ -1025,13 +1055,15 @@ static void parse_args(int argc, char *argv[]) | |||||||
|                 arg_opts.proxy_type = TOX_PROXY_TYPE_HTTP; |                 arg_opts.proxy_type = TOX_PROXY_TYPE_HTTP; | ||||||
|                 snprintf(arg_opts.proxy_address, sizeof(arg_opts.proxy_address), "%s", optarg); |                 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); |                     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) |                 if (port <= 0 || port > MAX_PORT_RANGE) { | ||||||
|                     exit_toxic_err("Proxy error", FATALERR_PROXY); |                     exit_toxic_err("Proxy error", FATALERR_PROXY); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 arg_opts.proxy_port = port; |                 arg_opts.proxy_port = port; | ||||||
|                 break; |                 break; | ||||||
| @@ -1039,8 +1071,9 @@ static void parse_args(int argc, char *argv[]) | |||||||
|             case 'r': |             case 'r': | ||||||
|                 snprintf(arg_opts.nameserver_path, sizeof(arg_opts.nameserver_path), "%s", optarg); |                 snprintf(arg_opts.nameserver_path, sizeof(arg_opts.nameserver_path), "%s", optarg); | ||||||
|  |  | ||||||
|                 if (!file_exists(arg_opts.nameserver_path)) |                 if (!file_exists(arg_opts.nameserver_path)) { | ||||||
|                     queue_init_message("nameserver list not found"); |                     queue_init_message("nameserver list not found"); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
| @@ -1051,8 +1084,9 @@ static void parse_args(int argc, char *argv[]) | |||||||
|             case 'T': |             case 'T': | ||||||
|                 port = strtol(optarg, NULL, 10); |                 port = strtol(optarg, NULL, 10); | ||||||
|  |  | ||||||
|                 if (port <= 0 || port > MAX_PORT_RANGE) |                 if (port <= 0 || port > MAX_PORT_RANGE) { | ||||||
|                     port = 14191; |                     port = 14191; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 arg_opts.tcp_port = port; |                 arg_opts.tcp_port = port; | ||||||
|                 break; |                 break; | ||||||
| @@ -1085,28 +1119,34 @@ static int rename_old_profile(const char *user_config_dir) | |||||||
|     char old_data_file[strlen(user_config_dir) + strlen(CONFIGDIR) + strlen(OLD_DATA_NAME) + 1]; |     char old_data_file[strlen(user_config_dir) + strlen(CONFIGDIR) + strlen(OLD_DATA_NAME) + 1]; | ||||||
|     snprintf(old_data_file, sizeof(old_data_file), "%s%s%s", user_config_dir, CONFIGDIR, OLD_DATA_NAME); |     snprintf(old_data_file, sizeof(old_data_file), "%s%s%s", user_config_dir, CONFIGDIR, OLD_DATA_NAME); | ||||||
|  |  | ||||||
|     if (!file_exists(old_data_file)) |     if (!file_exists(old_data_file)) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (file_exists(DATA_FILE)) |     if (file_exists(DATA_FILE)) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (rename(old_data_file, DATA_FILE) != 0) |     if (rename(old_data_file, DATA_FILE) != 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     queue_init_message("Data file has been moved to %s", DATA_FILE); |     queue_init_message("Data file has been moved to %s", DATA_FILE); | ||||||
|  |  | ||||||
|     char old_data_blocklist[strlen(user_config_dir) + strlen(CONFIGDIR) + strlen(OLD_DATA_BLOCKLIST_NAME) + 1]; |     char old_data_blocklist[strlen(user_config_dir) + strlen(CONFIGDIR) + strlen(OLD_DATA_BLOCKLIST_NAME) + 1]; | ||||||
|     snprintf(old_data_blocklist, sizeof(old_data_blocklist), "%s%s%s", user_config_dir, CONFIGDIR, OLD_DATA_BLOCKLIST_NAME); |     snprintf(old_data_blocklist, sizeof(old_data_blocklist), "%s%s%s", user_config_dir, CONFIGDIR, OLD_DATA_BLOCKLIST_NAME); | ||||||
|  |  | ||||||
|     if (!file_exists(old_data_blocklist)) |     if (!file_exists(old_data_blocklist)) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (file_exists(BLOCK_FILE)) |     if (file_exists(BLOCK_FILE)) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (rename(old_data_blocklist, BLOCK_FILE) != 0) |     if (rename(old_data_blocklist, BLOCK_FILE) != 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @@ -1117,13 +1157,15 @@ static int rename_old_profile(const char *user_config_dir) | |||||||
|  */ |  */ | ||||||
| static void init_default_data_files(void) | static void init_default_data_files(void) | ||||||
| { | { | ||||||
|     if (arg_opts.use_custom_data) |     if (arg_opts.use_custom_data) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     char *user_config_dir = get_user_config_dir(); |     char *user_config_dir = get_user_config_dir(); | ||||||
|  |  | ||||||
|     if (user_config_dir == NULL) |     if (user_config_dir == NULL) { | ||||||
|         exit_toxic_err("failed in init_default_data_files()", FATALERR_FILEOP); |         exit_toxic_err("failed in init_default_data_files()", FATALERR_FILEOP); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int config_err = create_user_config_dirs(user_config_dir); |     int config_err = create_user_config_dirs(user_config_dir); | ||||||
|  |  | ||||||
| @@ -1131,14 +1173,16 @@ static void init_default_data_files(void) | |||||||
|         DATA_FILE = strdup(DATANAME); |         DATA_FILE = strdup(DATANAME); | ||||||
|         BLOCK_FILE = strdup(BLOCKNAME); |         BLOCK_FILE = strdup(BLOCKNAME); | ||||||
|  |  | ||||||
|         if (DATA_FILE == NULL || BLOCK_FILE == NULL) |         if (DATA_FILE == NULL || BLOCK_FILE == NULL) { | ||||||
|             exit_toxic_err("failed in init_default_data_files()", FATALERR_MEMORY); |             exit_toxic_err("failed in init_default_data_files()", FATALERR_MEMORY); | ||||||
|  |         } | ||||||
|     } else { |     } else { | ||||||
|         DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen(DATANAME) + 1); |         DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen(DATANAME) + 1); | ||||||
|         BLOCK_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen(BLOCKNAME) + 1); |         BLOCK_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen(BLOCKNAME) + 1); | ||||||
|  |  | ||||||
|         if (DATA_FILE == NULL || BLOCK_FILE == NULL) |         if (DATA_FILE == NULL || BLOCK_FILE == NULL) { | ||||||
|             exit_toxic_err("failed in init_default_data_files()", FATALERR_MEMORY); |             exit_toxic_err("failed in init_default_data_files()", FATALERR_MEMORY); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         strcpy(DATA_FILE, user_config_dir); |         strcpy(DATA_FILE, user_config_dir); | ||||||
|         strcat(DATA_FILE, CONFIGDIR); |         strcat(DATA_FILE, CONFIGDIR); | ||||||
| @@ -1150,8 +1194,9 @@ static void init_default_data_files(void) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* For backwards compatibility with old toxic profile names. TODO: remove this some day */ |     /* For backwards compatibility with old toxic profile names. TODO: remove this some day */ | ||||||
|     if (rename_old_profile(user_config_dir) == -1) |     if (rename_old_profile(user_config_dir) == -1) { | ||||||
|         queue_init_message("Warning: Profile backwards compatibility failed."); |         queue_init_message("Warning: Profile backwards compatibility failed."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     free(user_config_dir); |     free(user_config_dir); | ||||||
| } | } | ||||||
| @@ -1174,8 +1219,9 @@ int main(int argc, char **argv) | |||||||
|     parse_args(argc, argv); |     parse_args(argc, argv); | ||||||
|  |  | ||||||
|     /* Use the -b flag to enable stderr */ |     /* Use the -b flag to enable stderr */ | ||||||
|     if (!arg_opts.debug) |     if (!arg_opts.debug) { | ||||||
|         freopen("/dev/null", "w", stderr); |         freopen("/dev/null", "w", stderr); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (arg_opts.encrypt_data && arg_opts.unencrypt_data) { |     if (arg_opts.encrypt_data && arg_opts.unencrypt_data) { | ||||||
|         arg_opts.encrypt_data = 0; |         arg_opts.encrypt_data = 0; | ||||||
| @@ -1190,17 +1236,19 @@ int main(int argc, char **argv) | |||||||
|  |  | ||||||
|     bool datafile_exists = file_exists(DATA_FILE); |     bool datafile_exists = file_exists(DATA_FILE); | ||||||
|  |  | ||||||
|     if (!datafile_exists && !arg_opts.unencrypt_data) |     if (!datafile_exists && !arg_opts.unencrypt_data) { | ||||||
|         first_time_encrypt("Creating new data file. Would you like to encrypt it? Y/n (q to quit)"); |         first_time_encrypt("Creating new data file. Would you like to encrypt it? Y/n (q to quit)"); | ||||||
|     else if (arg_opts.encrypt_data) |     } else if (arg_opts.encrypt_data) { | ||||||
|         first_time_encrypt("Encrypt existing data file? Y/n (q to quit)"); |         first_time_encrypt("Encrypt existing data file? Y/n (q to quit)"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     /* init user_settings struct and load settings from conf file */ |     /* init user_settings struct and load settings from conf file */ | ||||||
|     user_settings = calloc(1, sizeof(struct user_settings)); |     user_settings = calloc(1, sizeof(struct user_settings)); | ||||||
|  |  | ||||||
|     if (user_settings == NULL) |     if (user_settings == NULL) { | ||||||
|         exit_toxic_err("failed in main", FATALERR_MEMORY); |         exit_toxic_err("failed in main", FATALERR_MEMORY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     const char *p = arg_opts.config_path[0] ? arg_opts.config_path : NULL; |     const char *p = arg_opts.config_path[0] ? arg_opts.config_path : NULL; | ||||||
|  |  | ||||||
| @@ -1221,15 +1269,17 @@ int main(int argc, char **argv) | |||||||
|  |  | ||||||
| #ifdef X11 | #ifdef X11 | ||||||
|  |  | ||||||
|     if (init_xtra(DnD_callback) == -1) |     if (init_xtra(DnD_callback) == -1) { | ||||||
|         queue_init_message("X failed to initialize"); |         queue_init_message("X failed to initialize"); | ||||||
|  |     } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     Tox *m = load_toxic(DATA_FILE); |     Tox *m = load_toxic(DATA_FILE); | ||||||
|  |  | ||||||
|     if (arg_opts.encrypt_data && !datafile_exists) |     if (arg_opts.encrypt_data && !datafile_exists) { | ||||||
|         arg_opts.encrypt_data = 0; |         arg_opts.encrypt_data = 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     init_term(); |     init_term(); | ||||||
| @@ -1239,15 +1289,18 @@ int main(int argc, char **argv) | |||||||
|     load_groups(prompt, m); |     load_groups(prompt, m); | ||||||
|  |  | ||||||
|     /* thread for ncurses stuff */ |     /* thread for ncurses stuff */ | ||||||
|     if (pthread_mutex_init(&Winthread.lock, NULL) != 0) |     if (pthread_mutex_init(&Winthread.lock, NULL) != 0) { | ||||||
|         exit_toxic_err("failed in main", FATALERR_MUTEX_INIT); |         exit_toxic_err("failed in main", FATALERR_MUTEX_INIT); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (pthread_create(&Winthread.tid, NULL, thread_winref, (void *) m) != 0) |     if (pthread_create(&Winthread.tid, NULL, thread_winref, (void *) m) != 0) { | ||||||
|         exit_toxic_err("failed in main", FATALERR_THREAD_CREATE); |         exit_toxic_err("failed in main", FATALERR_THREAD_CREATE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* thread for message queue */ |     /* thread for message queue */ | ||||||
|     if (pthread_create(&cqueue_thread.tid, NULL, thread_cqueue, (void *) m) != 0) |     if (pthread_create(&cqueue_thread.tid, NULL, thread_cqueue, (void *) m) != 0) { | ||||||
|         exit_toxic_err("failed in main", FATALERR_THREAD_CREATE); |         exit_toxic_err("failed in main", FATALERR_THREAD_CREATE); | ||||||
|  |     } | ||||||
|  |  | ||||||
| #ifdef AUDIO | #ifdef AUDIO | ||||||
|  |  | ||||||
| @@ -1259,16 +1312,18 @@ int main(int argc, char **argv) | |||||||
| #endif /* VIDEO */ | #endif /* VIDEO */ | ||||||
|  |  | ||||||
|     /* AV thread */ |     /* AV thread */ | ||||||
|     if (pthread_create(&av_thread.tid, NULL, thread_av, (void *) av) != 0) |     if (pthread_create(&av_thread.tid, NULL, thread_av, (void *) av) != 0) { | ||||||
|         exit_toxic_err("failed in main", FATALERR_THREAD_CREATE); |         exit_toxic_err("failed in main", FATALERR_THREAD_CREATE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     set_primary_device(input, user_settings->audio_in_dev); |     set_primary_device(input, user_settings->audio_in_dev); | ||||||
|     set_primary_device(output, user_settings->audio_out_dev); |     set_primary_device(output, user_settings->audio_out_dev); | ||||||
|  |  | ||||||
| #elif SOUND_NOTIFY | #elif SOUND_NOTIFY | ||||||
|  |  | ||||||
|     if ( init_devices() == de_InternalError ) |     if (init_devices() == de_InternalError) { | ||||||
|         queue_init_message("Failed to init audio devices"); |         queue_init_message("Failed to init audio devices"); | ||||||
|  |     } | ||||||
|  |  | ||||||
| #endif /* AUDIO */ | #endif /* AUDIO */ | ||||||
|  |  | ||||||
| @@ -1282,8 +1337,9 @@ int main(int argc, char **argv) | |||||||
|     init_notify(60, 3000); |     init_notify(60, 3000); | ||||||
|  |  | ||||||
|     /* screen/tmux auto-away timer */ |     /* screen/tmux auto-away timer */ | ||||||
|     if (init_mplex_away_timer(m) == -1) |     if (init_mplex_away_timer(m) == -1) { | ||||||
|         queue_init_message("Failed to init mplex auto-away."); |         queue_init_message("Failed to init mplex auto-away."); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int nodeslist_ret = load_DHT_nodeslist(); |     int nodeslist_ret = load_DHT_nodeslist(); | ||||||
|  |  | ||||||
| @@ -1312,8 +1368,9 @@ int main(int argc, char **argv) | |||||||
|         if (timed_out(last_save, AUTOSAVE_FREQ)) { |         if (timed_out(last_save, AUTOSAVE_FREQ)) { | ||||||
|             pthread_mutex_lock(&Winthread.lock); |             pthread_mutex_lock(&Winthread.lock); | ||||||
|  |  | ||||||
|             if (store_data(m, DATA_FILE) != 0) |             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"); |                 line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, RED, "WARNING: Failed to save to data file"); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             pthread_mutex_unlock(&Winthread.lock); |             pthread_mutex_unlock(&Winthread.lock); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -33,8 +33,9 @@ | |||||||
| /* Adds char to line at pos. Return 0 on success, -1 if line buffer is full */ | /* Adds char to line at pos. Return 0 on success, -1 if line buffer is full */ | ||||||
| int add_char_to_buf(ChatContext *ctx, wint_t ch) | int add_char_to_buf(ChatContext *ctx, wint_t ch) | ||||||
| { | { | ||||||
|     if (ctx->len >= MAX_STR_SIZE - 1) |     if (ctx->len >= MAX_STR_SIZE - 1) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wmemmove(&ctx->line[ctx->pos + 1], &ctx->line[ctx->pos], ctx->len - ctx->pos); |     wmemmove(&ctx->line[ctx->pos + 1], &ctx->line[ctx->pos], ctx->len - ctx->pos); | ||||||
|     ctx->line[ctx->pos++] = ch; |     ctx->line[ctx->pos++] = ch; | ||||||
| @@ -46,8 +47,9 @@ int add_char_to_buf(ChatContext *ctx, wint_t ch) | |||||||
| /* Deletes the character before pos. Return 0 on success, -1 if nothing to delete */ | /* Deletes the character before pos. Return 0 on success, -1 if nothing to delete */ | ||||||
| int del_char_buf_bck(ChatContext *ctx) | int del_char_buf_bck(ChatContext *ctx) | ||||||
| { | { | ||||||
|     if (ctx->pos <= 0) |     if (ctx->pos <= 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wmemmove(&ctx->line[ctx->pos - 1], &ctx->line[ctx->pos], ctx->len - ctx->pos); |     wmemmove(&ctx->line[ctx->pos - 1], &ctx->line[ctx->pos], ctx->len - ctx->pos); | ||||||
|     --ctx->pos; |     --ctx->pos; | ||||||
| @@ -59,8 +61,9 @@ int del_char_buf_bck(ChatContext *ctx) | |||||||
| /* Deletes the character at pos. Return 0 on success, -1 if nothing to delete. */ | /* Deletes the character at pos. Return 0 on success, -1 if nothing to delete. */ | ||||||
| int del_char_buf_frnt(ChatContext *ctx) | int del_char_buf_frnt(ChatContext *ctx) | ||||||
| { | { | ||||||
|     if (ctx->pos >= ctx->len) |     if (ctx->pos >= ctx->len) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wmemmove(&ctx->line[ctx->pos], &ctx->line[ctx->pos + 1], ctx->len - ctx->pos - 1); |     wmemmove(&ctx->line[ctx->pos], &ctx->line[ctx->pos + 1], ctx->len - ctx->pos - 1); | ||||||
|     ctx->line[--ctx->len] = L'\0'; |     ctx->line[--ctx->len] = L'\0'; | ||||||
| @@ -72,8 +75,9 @@ int del_char_buf_frnt(ChatContext *ctx) | |||||||
|    Return 0 on success, -1 if noting to discard. */ |    Return 0 on success, -1 if noting to discard. */ | ||||||
| int discard_buf(ChatContext *ctx) | int discard_buf(ChatContext *ctx) | ||||||
| { | { | ||||||
|     if (ctx->pos <= 0) |     if (ctx->pos <= 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ctx->yank_len = ctx->pos; |     ctx->yank_len = ctx->pos; | ||||||
|     wmemcpy(ctx->yank, ctx->line, ctx->yank_len); |     wmemcpy(ctx->yank, ctx->line, ctx->yank_len); | ||||||
| @@ -92,8 +96,9 @@ int discard_buf(ChatContext *ctx) | |||||||
|    Return 0 on success, -1 if nothing to kill. */ |    Return 0 on success, -1 if nothing to kill. */ | ||||||
| int kill_buf(ChatContext *ctx) | int kill_buf(ChatContext *ctx) | ||||||
| { | { | ||||||
|     if (ctx->len <= ctx->pos) |     if (ctx->len <= ctx->pos) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ctx->yank_len = ctx->len - ctx->pos; |     ctx->yank_len = ctx->len - ctx->pos; | ||||||
|     wmemcpy(ctx->yank, &ctx->line[ctx->pos], ctx->yank_len); |     wmemcpy(ctx->yank, &ctx->line[ctx->pos], ctx->yank_len); | ||||||
| @@ -109,11 +114,13 @@ int kill_buf(ChatContext *ctx) | |||||||
|    Return 0 on success, -1 if yank buffer is empty or too long */ |    Return 0 on success, -1 if yank buffer is empty or too long */ | ||||||
| int yank_buf(ChatContext *ctx) | int yank_buf(ChatContext *ctx) | ||||||
| { | { | ||||||
|     if (!ctx->yank[0]) |     if (!ctx->yank[0]) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ctx->yank_len + ctx->len >= MAX_STR_SIZE) |     if (ctx->yank_len + ctx->len >= MAX_STR_SIZE) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wmemmove(&ctx->line[ctx->pos + ctx->yank_len], &ctx->line[ctx->pos], ctx->len - ctx->pos); |     wmemmove(&ctx->line[ctx->pos + ctx->yank_len], &ctx->line[ctx->pos], ctx->len - ctx->pos); | ||||||
|     wmemcpy(&ctx->line[ctx->pos], ctx->yank, ctx->yank_len); |     wmemcpy(&ctx->line[ctx->pos], ctx->yank, ctx->yank_len); | ||||||
| @@ -130,8 +137,9 @@ int yank_buf(ChatContext *ctx) | |||||||
|    Return 0 on success, -1 if nothing to delete */ |    Return 0 on success, -1 if nothing to delete */ | ||||||
| int del_word_buf(ChatContext *ctx) | int del_word_buf(ChatContext *ctx) | ||||||
| { | { | ||||||
|     if (ctx->len == 0 || ctx->pos == 0) |     if (ctx->len == 0 || ctx->pos == 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int i = ctx->pos, count = 0; |     int i = ctx->pos, count = 0; | ||||||
|  |  | ||||||
| @@ -169,18 +177,21 @@ void reset_buf(ChatContext *ctx) | |||||||
| /* Removes trailing spaces and newlines from line. */ | /* Removes trailing spaces and newlines from line. */ | ||||||
| void rm_trailing_spaces_buf(ChatContext *ctx) | void rm_trailing_spaces_buf(ChatContext *ctx) | ||||||
| { | { | ||||||
|     if (ctx->len <= 0) |     if (ctx->len <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ctx->line[ctx->len - 1] != ' ' && ctx->line[ctx->len - 1] != L'¶') |     if (ctx->line[ctx->len - 1] != ' ' && ctx->line[ctx->len - 1] != L'¶') { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = ctx->len - 1; i >= 0; --i) { |     for (i = ctx->len - 1; i >= 0; --i) { | ||||||
|         if (ctx->line[i] != ' ' && ctx->line[i] != L'¶') |         if (ctx->line[i] != ' ' && ctx->line[i] != L'¶') { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ctx->len = i + 1; |     ctx->len = i + 1; | ||||||
|     ctx->pos = MIN(ctx->pos, ctx->len); |     ctx->pos = MIN(ctx->pos, ctx->len); | ||||||
| @@ -195,8 +206,9 @@ static void shift_hist_back(ChatContext *ctx) | |||||||
|     int i; |     int i; | ||||||
|     int n = MAX_LINE_HIST - HIST_PURGE; |     int n = MAX_LINE_HIST - HIST_PURGE; | ||||||
|  |  | ||||||
|     for (i = 0; i < n; ++i) |     for (i = 0; i < n; ++i) { | ||||||
|         wmemcpy(ctx->ln_history[i], ctx->ln_history[i + HIST_PURGE], MAX_STR_SIZE); |         wmemcpy(ctx->ln_history[i], ctx->ln_history[i + HIST_PURGE], MAX_STR_SIZE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ctx->hst_tot = n; |     ctx->hst_tot = n; | ||||||
| } | } | ||||||
| @@ -204,11 +216,13 @@ static void shift_hist_back(ChatContext *ctx) | |||||||
| /* adds a line to the ln_history buffer at hst_pos and sets hst_pos to end of history. */ | /* adds a line to the ln_history buffer at hst_pos and sets hst_pos to end of history. */ | ||||||
| void add_line_to_hist(ChatContext *ctx) | void add_line_to_hist(ChatContext *ctx) | ||||||
| { | { | ||||||
|     if (ctx->len >= MAX_STR_SIZE) |     if (ctx->len >= MAX_STR_SIZE) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ctx->hst_tot >= MAX_LINE_HIST) |     if (ctx->hst_tot >= MAX_LINE_HIST) { | ||||||
|         shift_hist_back(ctx); |         shift_hist_back(ctx); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     ++ctx->hst_tot; |     ++ctx->hst_tot; | ||||||
|     ctx->hst_pos = ctx->hst_tot; |     ctx->hst_pos = ctx->hst_tot; | ||||||
| @@ -248,15 +262,17 @@ void strsubst(char *str, char old, char new) | |||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; str[i] != '\0'; ++i) |     for (i = 0; str[i] != '\0'; ++i) | ||||||
|         if (str[i] == old) |         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; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; str[i] != L'\0'; ++i) |     for (i = 0; str[i] != L'\0'; ++i) | ||||||
|         if (str[i] == old) |         if (str[i] == old) { | ||||||
|             str[i] = new; |             str[i] = new; | ||||||
|         } |         } | ||||||
|  | } | ||||||
|   | |||||||
| @@ -89,9 +89,10 @@ void terminate_video() | |||||||
|  |  | ||||||
|         stop_video_transmission(this_call, 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); |             close_video_device(vdt_output, this_call->vout_idx); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     terminate_video_devices(); |     terminate_video_devices(); | ||||||
| } | } | ||||||
| @@ -112,12 +113,13 @@ void read_video_device_callback(int16_t width, int16_t height, const uint8_t *y, | |||||||
|     if (toxav_video_send_frame(CallControl.av, friend_number, width, height, y, u, v, &error) == false) { |     if (toxav_video_send_frame(CallControl.av, friend_number, width, height, y, u, v, &error) == false) { | ||||||
|         line_info_add(CallControl.prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to send video frame"); |         line_info_add(CallControl.prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to send video frame"); | ||||||
|  |  | ||||||
|         if ( error == TOXAV_ERR_SEND_FRAME_NULL ) |         if (error == TOXAV_ERR_SEND_FRAME_NULL) { | ||||||
|             line_info_add(CallControl.prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to capture video frame"); |             line_info_add(CallControl.prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to capture video frame"); | ||||||
|         else if ( error == TOXAV_ERR_SEND_FRAME_INVALID ) |         } else if (error == TOXAV_ERR_SEND_FRAME_INVALID) { | ||||||
|             line_info_add(CallControl.prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to prepare video frame"); |             line_info_add(CallControl.prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to prepare video frame"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void write_video_device_callback(uint32_t friend_number, uint16_t width, uint16_t height, | 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, |                                  uint8_t const *y, uint8_t const *u, uint8_t const *v, | ||||||
| @@ -196,8 +198,9 @@ 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 ) |     if (this_call->vout_idx != -1) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     open_primary_video_device(vdt_output, &this_call->vout_idx); |     open_primary_video_device(vdt_output, &this_call->vout_idx); | ||||||
| } | } | ||||||
| @@ -269,10 +272,11 @@ void cmd_video(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[M | |||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if ( this_call->vin_idx == -1 ) |     if (this_call->vin_idx == -1) { | ||||||
|         callback_video_starting(self->num); |         callback_video_starting(self->num); | ||||||
|     else |     } else { | ||||||
|         callback_video_end(self->num); |         callback_video_end(self->num); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return; |     return; | ||||||
| on_error: | on_error: | ||||||
| @@ -284,19 +288,24 @@ void cmd_list_video_devices(WINDOW *window, ToxWindow *self, Tox *m, int argc, c | |||||||
|     const char *error_str; |     const char *error_str; | ||||||
|  |  | ||||||
|     if (argc != 1) { |     if (argc != 1) { | ||||||
|         if ( argc < 1 ) error_str = "Type must be specified!"; |         if (argc < 1) { | ||||||
|         else error_str = "Only one argument allowed!"; |             error_str = "Type must be specified!"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Only one argument allowed!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     VideoDeviceType type; |     VideoDeviceType type; | ||||||
|  |  | ||||||
|     if ( strcasecmp(argv[1], "in") == 0 ) /* Input devices */ |     if (strcasecmp(argv[1], "in") == 0) { /* Input devices */ | ||||||
|         type = vdt_input; |         type = vdt_input; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else if ( strcasecmp(argv[1], "out") == 0 ) /* Output devices */ |     else if (strcasecmp(argv[1], "out") == 0) { /* Output devices */ | ||||||
|         type = vdt_output; |         type = vdt_output; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else { |     else { | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); | ||||||
| @@ -316,20 +325,26 @@ void cmd_change_video_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, | |||||||
|     const char *error_str; |     const char *error_str; | ||||||
|  |  | ||||||
|     if (argc != 2) { |     if (argc != 2) { | ||||||
|         if ( argc < 1 ) error_str = "Type must be specified!"; |         if (argc < 1) { | ||||||
|         else if ( argc < 2 ) error_str = "Must have id!"; |             error_str = "Type must be specified!"; | ||||||
|         else error_str = "Only two arguments allowed!"; |         } else if (argc < 2) { | ||||||
|  |             error_str = "Must have id!"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Only two arguments allowed!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     VideoDeviceType type; |     VideoDeviceType type; | ||||||
|  |  | ||||||
|     if ( strcmp(argv[1], "in") == 0 ) /* Input devices */ |     if (strcmp(argv[1], "in") == 0) { /* Input devices */ | ||||||
|         type = vdt_input; |         type = vdt_input; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else if ( strcmp(argv[1], "out") == 0 ) /* Output devices */ |     else if (strcmp(argv[1], "out") == 0) { /* Output devices */ | ||||||
|         type = vdt_output; |         type = vdt_output; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else { |     else { | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); | ||||||
| @@ -360,20 +375,26 @@ void cmd_ccur_video_device(WINDOW *window, ToxWindow *self, Tox *m, int argc, ch | |||||||
|     const char *error_str; |     const char *error_str; | ||||||
|  |  | ||||||
|     if (argc != 2) { |     if (argc != 2) { | ||||||
|         if ( argc < 1 ) error_str = "Type must be specified!"; |         if (argc < 1) { | ||||||
|         else if ( argc < 2 ) error_str = "Must have id!"; |             error_str = "Type must be specified!"; | ||||||
|         else error_str = "Only two arguments allowed!"; |         } else if (argc < 2) { | ||||||
|  |             error_str = "Must have id!"; | ||||||
|  |         } else { | ||||||
|  |             error_str = "Only two arguments allowed!"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         goto on_error; |         goto on_error; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     VideoDeviceType type; |     VideoDeviceType type; | ||||||
|  |  | ||||||
|     if ( strcmp(argv[1], "in") == 0 ) /* Input devices */ |     if (strcmp(argv[1], "in") == 0) { /* Input devices */ | ||||||
|         type = vdt_input; |         type = vdt_input; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else if ( strcmp(argv[1], "out") == 0 ) /* Output devices */ |     else if (strcmp(argv[1], "out") == 0) { /* Output devices */ | ||||||
|         type = vdt_output; |         type = vdt_output; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     else { |     else { | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid type: %s", argv[1]); | ||||||
| @@ -421,8 +442,9 @@ void stop_video_stream(ToxWindow *self) | |||||||
| { | { | ||||||
|     Call *this_call = &CallControl.calls[self->num]; |     Call *this_call = &CallControl.calls[self->num]; | ||||||
|  |  | ||||||
|     if (this_call && this_call->vin_idx != -1) |     if (this_call && this_call->vin_idx != -1) { | ||||||
|         stop_video_transmission(this_call, self->num); |         stop_video_transmission(this_call, self->num); | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -187,8 +187,9 @@ VideoDeviceError init_video_devices() | |||||||
|  |  | ||||||
| #if defined(__OSX__) | #if defined(__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; |         return vde_InternalError; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #else /* not __OSX__*/ | #else /* not __OSX__*/ | ||||||
|  |  | ||||||
| @@ -232,13 +233,15 @@ VideoDeviceError init_video_devices() | |||||||
|     video_devices_names[vdt_output][0] = video_output_name; |     video_devices_names[vdt_output][0] = video_output_name; | ||||||
|  |  | ||||||
|     // Start poll thread |     // Start poll thread | ||||||
|     if ( pthread_mutex_init(&video_mutex, NULL) != 0 ) |     if (pthread_mutex_init(&video_mutex, NULL) != 0) { | ||||||
|         return vde_InternalError; |         return vde_InternalError; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pthread_t thread_id; |     pthread_t thread_id; | ||||||
|  |  | ||||||
|     if ( pthread_create(&thread_id, NULL, video_thread_poll, NULL) != 0 || pthread_detach(thread_id) != 0 ) |     if (pthread_create(&thread_id, NULL, video_thread_poll, NULL) != 0 || pthread_detach(thread_id) != 0) { | ||||||
|         return vde_InternalError; |         return vde_InternalError; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #ifdef VIDEO | #ifdef VIDEO | ||||||
|     av = av_; |     av = av_; | ||||||
| @@ -262,8 +265,9 @@ VideoDeviceError terminate_video_devices() | |||||||
|         free((void *)video_devices_names[vdt_input][i]); |         free((void *)video_devices_names[vdt_input][i]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if ( pthread_mutex_destroy(&video_mutex) != 0 ) |     if (pthread_mutex_destroy(&video_mutex) != 0) { | ||||||
|         return (VideoDeviceError) vde_InternalError; |         return (VideoDeviceError) vde_InternalError; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #ifdef __OSX__ | #ifdef __OSX__ | ||||||
|     osx_video_release(); |     osx_video_release(); | ||||||
| @@ -277,14 +281,16 @@ VideoDeviceError register_video_device_callback(int32_t friend_number, uint32_t | |||||||
| { | { | ||||||
| #if defined(__OSX__) | #if defined(__OSX__) | ||||||
|  |  | ||||||
|     if ( size[vdt_input] <= device_idx || !video_devices_running[vdt_input][device_idx] ) |     if (size[vdt_input] <= device_idx || !video_devices_running[vdt_input][device_idx]) { | ||||||
|         return vde_InvalidSelection; |         return vde_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #else /* not __OSX__ */ | #else /* not __OSX__ */ | ||||||
|  |  | ||||||
|     if (size[vdt_input] <= device_idx || !video_devices_running[vdt_input][device_idx] |     if (size[vdt_input] <= device_idx || !video_devices_running[vdt_input][device_idx] | ||||||
|             || !video_devices_running[vdt_input][device_idx]->fd ) |             || !video_devices_running[vdt_input][device_idx]->fd) { | ||||||
|         return vde_InvalidSelection; |         return vde_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -299,7 +305,9 @@ VideoDeviceError register_video_device_callback(int32_t friend_number, uint32_t | |||||||
|  |  | ||||||
| VideoDeviceError set_primary_video_device(VideoDeviceType type, int32_t selection) | VideoDeviceError set_primary_video_device(VideoDeviceType type, int32_t selection) | ||||||
| { | { | ||||||
|     if ( size[type] <= selection || selection < 0 ) return vde_InvalidSelection; |     if (size[type] <= selection || selection < 0) { | ||||||
|  |         return vde_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     primary_video_device[type] = selection; |     primary_video_device[type] = selection; | ||||||
|  |  | ||||||
| @@ -318,7 +326,9 @@ void get_primary_video_device_name(VideoDeviceType type, char *buf, int 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; |     if (size[type] <= selection || selection < 0) { | ||||||
|  |         return vde_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     lock; |     lock; | ||||||
|  |  | ||||||
| @@ -452,8 +462,9 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint | |||||||
|                                             device->fd, buf.m.offset); |                                             device->fd, buf.m.offset); | ||||||
|  |  | ||||||
|             if (MAP_FAILED == device->buffers[i].start) { |             if (MAP_FAILED == device->buffers[i].start) { | ||||||
|                 for (i = 0; i < buf.index; ++i) |                 for (i = 0; i < buf.index; ++i) { | ||||||
|                     munmap(device->buffers[i].start, device->buffers[i].length); |                     munmap(device->buffers[i].start, device->buffers[i].length); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 close(device->fd); |                 close(device->fd); | ||||||
|                 free(device); |                 free(device); | ||||||
| @@ -475,8 +486,9 @@ VideoDeviceError open_video_device(VideoDeviceType type, int32_t selection, uint | |||||||
|             buf.index = i; |             buf.index = i; | ||||||
|  |  | ||||||
|             if (-1 == xioctl(device->fd, VIDIOC_QBUF, &buf)) { |             if (-1 == xioctl(device->fd, VIDIOC_QBUF, &buf)) { | ||||||
|                 for (i = 0; i < device->n_buffers; ++i) |                 for (i = 0; i < device->n_buffers; ++i) { | ||||||
|                     munmap(device->buffers[i].start, device->buffers[i].length); |                     munmap(device->buffers[i].start, device->buffers[i].length); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 close(device->fd); |                 close(device->fd); | ||||||
|                 free(device); |                 free(device); | ||||||
| @@ -586,9 +598,13 @@ __inline VideoDeviceError write_video_out(uint16_t width, uint16_t height, | |||||||
| { | { | ||||||
|     VideoDevice *device = video_devices_running[vdt_output][0]; |     VideoDevice *device = video_devices_running[vdt_output][0]; | ||||||
|  |  | ||||||
|     if ( !device ) return vde_DeviceNotActive; |     if (!device) { | ||||||
|  |         return vde_DeviceNotActive; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if ( !device->x_window ) return vde_DeviceNotActive; |     if (!device->x_window) { | ||||||
|  |         return vde_DeviceNotActive; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pthread_mutex_lock(device->mutex); |     pthread_mutex_lock(device->mutex); | ||||||
|  |  | ||||||
| @@ -656,8 +672,9 @@ void *video_thread_poll (void *arg) // TODO: maybe use thread for every input so | |||||||
|  |  | ||||||
|         unlock; |         unlock; | ||||||
|  |  | ||||||
|         if ( video_thread_paused ) usleep(10000); /* Wait for unpause. */ |         if (video_thread_paused) { | ||||||
|         else { |             usleep(10000);    /* Wait for unpause. */ | ||||||
|  |         } else { | ||||||
|             for (i = 0; i < size[vdt_input]; ++i) { |             for (i = 0; i < size[vdt_input]; ++i) { | ||||||
|                 lock; |                 lock; | ||||||
|  |  | ||||||
| @@ -697,8 +714,9 @@ void *video_thread_poll (void *arg) // TODO: maybe use thread for every input so | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|                     /* Send frame data to friend through ToxAV */ |                     /* Send frame data to friend through ToxAV */ | ||||||
|                     if ( device->cb ) |                     if (device->cb) { | ||||||
|                         device->cb(video_width, video_height, y, u, v, device->cb_data); |                         device->cb(video_width, video_height, y, u, v, device->cb_data); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|                     /* Convert YUV420 data to BGR */ |                     /* Convert YUV420 data to BGR */ | ||||||
|                     uint8_t *img_data = malloc(video_width * video_height * 4); |                     uint8_t *img_data = malloc(video_width * video_height * 4); | ||||||
| @@ -753,7 +771,9 @@ void *video_thread_poll (void *arg) // TODO: maybe use thread for every input so | |||||||
|  |  | ||||||
| VideoDeviceError close_video_device(VideoDeviceType type, uint32_t device_idx) | VideoDeviceError close_video_device(VideoDeviceType type, uint32_t device_idx) | ||||||
| { | { | ||||||
|     if ( device_idx >= MAX_DEVICES ) return vde_InvalidSelection; |     if (device_idx >= MAX_DEVICES) { | ||||||
|  |         return vde_InvalidSelection; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     lock; |     lock; | ||||||
|     VideoDevice *device = video_devices_running[type][device_idx]; |     VideoDevice *device = video_devices_running[type][device_idx]; | ||||||
| @@ -807,7 +827,9 @@ VideoDeviceError close_video_device(VideoDeviceType type, uint32_t device_idx) | |||||||
|             free(device); |             free(device); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     } else device->ref_count--; |     } else { | ||||||
|  |         device->ref_count--; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     unlock; |     unlock; | ||||||
|     return rc; |     return rc; | ||||||
| @@ -817,8 +839,9 @@ void print_video_devices(ToxWindow *self, VideoDeviceType type) | |||||||
| { | { | ||||||
|     int i; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < size[type]; ++i) |     for (i = 0; i < size[type]; ++i) { | ||||||
|         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%d: %s", i, video_devices_names[type][i]); |         line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%d: %s", i, video_devices_names[type][i]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return; |     return; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										127
									
								
								src/windows.c
									
									
									
									
									
								
							
							
						
						
									
										127
									
								
								src/windows.c
									
									
									
									
									
								
							| @@ -67,23 +67,26 @@ void on_connectionchange(Tox *m, uint32_t friendnumber, TOX_CONNECTION connectio | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onConnectionChange != NULL) |         if (windows[i].onConnectionChange != NULL) { | ||||||
|             windows[i].onConnectionChange(&windows[i], m, friendnumber, connection_status); |             windows[i].onConnectionChange(&windows[i], m, friendnumber, connection_status); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_typing_change(Tox *m, uint32_t friendnumber, bool is_typing, void *userdata) | void on_typing_change(Tox *m, uint32_t friendnumber, bool is_typing, void *userdata) | ||||||
| { | { | ||||||
|     if (user_settings->show_typing_other == SHOW_TYPING_OFF) |     if (user_settings->show_typing_other == SHOW_TYPING_OFF) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onTypingChange != NULL) |         if (windows[i].onTypingChange != NULL) { | ||||||
|             windows[i].onTypingChange(&windows[i], m, friendnumber, is_typing); |             windows[i].onTypingChange(&windows[i], m, friendnumber, is_typing); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_message(Tox *m, uint32_t friendnumber, TOX_MESSAGE_TYPE type, const uint8_t *string, size_t length, | void on_message(Tox *m, uint32_t friendnumber, TOX_MESSAGE_TYPE type, const uint8_t *string, size_t length, | ||||||
|                 void *userdata) |                 void *userdata) | ||||||
| @@ -94,10 +97,11 @@ void on_message(Tox *m, uint32_t friendnumber, TOX_MESSAGE_TYPE type, const uint | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onMessage != NULL) |         if (windows[i].onMessage != NULL) { | ||||||
|             windows[i].onMessage(&windows[i], m, friendnumber, type, msg, length); |             windows[i].onMessage(&windows[i], m, friendnumber, type, msg, length); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_nickchange(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) | ||||||
| { | { | ||||||
| @@ -108,9 +112,10 @@ void on_nickchange(Tox *m, uint32_t friendnumber, const uint8_t *string, size_t | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onNickChange != NULL) |         if (windows[i].onNickChange != NULL) { | ||||||
|             windows[i].onNickChange(&windows[i], m, friendnumber, nick, length); |             windows[i].onNickChange(&windows[i], m, friendnumber, nick, length); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     store_data(m, DATA_FILE); |     store_data(m, DATA_FILE); | ||||||
| } | } | ||||||
| @@ -124,29 +129,32 @@ void on_statusmessagechange(Tox *m, uint32_t friendnumber, const uint8_t *string | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onStatusMessageChange != NULL) |         if (windows[i].onStatusMessageChange != NULL) { | ||||||
|             windows[i].onStatusMessageChange(&windows[i], friendnumber, msg, length); |             windows[i].onStatusMessageChange(&windows[i], friendnumber, msg, length); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_statuschange(Tox *m, uint32_t friendnumber, TOX_USER_STATUS status, void *userdata) | void on_statuschange(Tox *m, uint32_t friendnumber, TOX_USER_STATUS status, void *userdata) | ||||||
| { | { | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onStatusChange != NULL) |         if (windows[i].onStatusChange != NULL) { | ||||||
|             windows[i].onStatusChange(&windows[i], m, friendnumber, status); |             windows[i].onStatusChange(&windows[i], m, friendnumber, status); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_friendadded(Tox *m, uint32_t friendnumber, bool sort) | void on_friendadded(Tox *m, uint32_t friendnumber, bool sort) | ||||||
| { | { | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onFriendAdded != NULL) |         if (windows[i].onFriendAdded != NULL) { | ||||||
|             windows[i].onFriendAdded(&windows[i], m, friendnumber, sort); |             windows[i].onFriendAdded(&windows[i], m, friendnumber, sort); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     store_data(m, DATA_FILE); |     store_data(m, DATA_FILE); | ||||||
| } | } | ||||||
| @@ -160,10 +168,11 @@ void on_groupmessage(Tox *m, uint32_t groupnumber, uint32_t peernumber, TOX_MESS | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onGroupMessage != NULL) |         if (windows[i].onGroupMessage != NULL) { | ||||||
|             windows[i].onGroupMessage(&windows[i], m, groupnumber, peernumber, type, msg, length); |             windows[i].onGroupMessage(&windows[i], m, groupnumber, peernumber, type, msg, length); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_groupinvite(Tox *m, uint32_t friendnumber, TOX_CONFERENCE_TYPE type, const uint8_t *group_pub_key, | void on_groupinvite(Tox *m, uint32_t friendnumber, TOX_CONFERENCE_TYPE type, const uint8_t *group_pub_key, | ||||||
|                     size_t length, void *userdata) |                     size_t length, void *userdata) | ||||||
| @@ -171,20 +180,22 @@ void on_groupinvite(Tox *m, uint32_t friendnumber, TOX_CONFERENCE_TYPE type, con | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onGroupInvite != NULL) |         if (windows[i].onGroupInvite != NULL) { | ||||||
|             windows[i].onGroupInvite(&windows[i], m, friendnumber, type, (char *) group_pub_key, length); |             windows[i].onGroupInvite(&windows[i], m, friendnumber, type, (char *) group_pub_key, length); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_group_namelistchange(Tox *m, uint32_t groupnumber, void *userdata) | void on_group_namelistchange(Tox *m, uint32_t groupnumber, void *userdata) | ||||||
| { | { | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onGroupNameListChange != NULL) |         if (windows[i].onGroupNameListChange != NULL) { | ||||||
|             windows[i].onGroupNameListChange(&windows[i], m, groupnumber); |             windows[i].onGroupNameListChange(&windows[i], m, groupnumber); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_group_peernamechange(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *name, | void on_group_peernamechange(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *name, | ||||||
|                              size_t length, void *userdata) |                              size_t length, void *userdata) | ||||||
| @@ -196,10 +207,11 @@ void on_group_peernamechange(Tox *m, uint32_t groupnumber, uint32_t peernumber, | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onGroupPeerNameChange != NULL) |         if (windows[i].onGroupPeerNameChange != NULL) { | ||||||
|             windows[i].onGroupPeerNameChange(&windows[i], m, groupnumber, peernumber, nick, length); |             windows[i].onGroupPeerNameChange(&windows[i], m, groupnumber, peernumber, nick, length); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_group_titlechange(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *title, size_t length, | void on_group_titlechange(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *title, size_t length, | ||||||
|                           void *userdata) |                           void *userdata) | ||||||
| @@ -210,18 +222,20 @@ void on_group_titlechange(Tox *m, uint32_t groupnumber, uint32_t peernumber, con | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onGroupTitleChange != NULL) |         if (windows[i].onGroupTitleChange != NULL) { | ||||||
|             windows[i].onGroupTitleChange(&windows[i], m, groupnumber, peernumber, data, length); |             windows[i].onGroupTitleChange(&windows[i], m, groupnumber, peernumber, data, length); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_file_chunk_request(Tox *m, uint32_t friendnumber, uint32_t filenumber, uint64_t position, | void on_file_chunk_request(Tox *m, uint32_t friendnumber, uint32_t filenumber, uint64_t position, | ||||||
|                            size_t length, void *userdata) |                            size_t length, void *userdata) | ||||||
| { | { | ||||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnumber, filenumber); |     struct FileTransfer *ft = get_file_transfer_struct(friendnumber, filenumber); | ||||||
|  |  | ||||||
|     if (!ft) |     if (!ft) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ft->file_type == TOX_FILE_KIND_AVATAR) { |     if (ft->file_type == TOX_FILE_KIND_AVATAR) { | ||||||
|         on_avatar_chunk_request(m, ft, position, length); |         on_avatar_chunk_request(m, ft, position, length); | ||||||
| @@ -231,34 +245,38 @@ void on_file_chunk_request(Tox *m, uint32_t friendnumber, uint32_t filenumber, u | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onFileChunkRequest != NULL) |         if (windows[i].onFileChunkRequest != NULL) { | ||||||
|             windows[i].onFileChunkRequest(&windows[i], m, friendnumber, filenumber, position, length); |             windows[i].onFileChunkRequest(&windows[i], m, friendnumber, filenumber, position, length); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_file_recv_chunk(Tox *m, uint32_t friendnumber, uint32_t filenumber, uint64_t position, | void on_file_recv_chunk(Tox *m, uint32_t friendnumber, uint32_t filenumber, uint64_t position, | ||||||
|                         const uint8_t *data, size_t length, void *user_data) |                         const uint8_t *data, size_t length, void *user_data) | ||||||
| { | { | ||||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnumber, filenumber); |     struct FileTransfer *ft = get_file_transfer_struct(friendnumber, filenumber); | ||||||
|  |  | ||||||
|     if (!ft) |     if (!ft) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onFileRecvChunk != NULL) |         if (windows[i].onFileRecvChunk != NULL) { | ||||||
|             windows[i].onFileRecvChunk(&windows[i], m, friendnumber, filenumber, position, (char *) data, length); |             windows[i].onFileRecvChunk(&windows[i], m, friendnumber, filenumber, position, (char *) data, length); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_file_control(Tox *m, uint32_t friendnumber, uint32_t filenumber, TOX_FILE_CONTROL control, | void on_file_control(Tox *m, uint32_t friendnumber, uint32_t filenumber, TOX_FILE_CONTROL control, | ||||||
|                      void *userdata) |                      void *userdata) | ||||||
| { | { | ||||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnumber, filenumber); |     struct FileTransfer *ft = get_file_transfer_struct(friendnumber, filenumber); | ||||||
|  |  | ||||||
|     if (!ft) |     if (!ft) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (ft->file_type == TOX_FILE_KIND_AVATAR) { |     if (ft->file_type == TOX_FILE_KIND_AVATAR) { | ||||||
|         on_avatar_file_control(m, ft, control); |         on_avatar_file_control(m, ft, control); | ||||||
| @@ -268,10 +286,11 @@ void on_file_control(Tox *m, uint32_t friendnumber, uint32_t filenumber, TOX_FIL | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onFileControl != NULL) |         if (windows[i].onFileControl != NULL) { | ||||||
|             windows[i].onFileControl(&windows[i], m, friendnumber, filenumber, control); |             windows[i].onFileControl(&windows[i], m, friendnumber, filenumber, control); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void on_file_recv(Tox *m, uint32_t friendnumber, uint32_t filenumber, uint32_t kind, uint64_t file_size, | void on_file_recv(Tox *m, uint32_t friendnumber, uint32_t filenumber, uint32_t kind, uint64_t file_size, | ||||||
|                   const uint8_t *filename, size_t filename_length, void *userdata) |                   const uint8_t *filename, size_t filename_length, void *userdata) | ||||||
| @@ -296,27 +315,31 @@ void on_read_receipt(Tox *m, uint32_t friendnumber, uint32_t receipt, void *user | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (windows[i].onReadReceipt != NULL) |         if (windows[i].onReadReceipt != NULL) { | ||||||
|             windows[i].onReadReceipt(&windows[i], m, friendnumber, receipt); |             windows[i].onReadReceipt(&windows[i], m, friendnumber, receipt); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
| /* CALLBACKS END */ | /* CALLBACKS END */ | ||||||
|  |  | ||||||
| int add_window(Tox *m, ToxWindow w) | int add_window(Tox *m, ToxWindow w) | ||||||
| { | { | ||||||
|     if (LINES < 2) |     if (LINES < 2) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; i++) { |     for (i = 0; i < MAX_WINDOWS_NUM; i++) { | ||||||
|         if (windows[i].active) |         if (windows[i].active) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         w.window = newwin(LINES - 2, COLS, 0, 0); |         w.window = newwin(LINES - 2, COLS, 0, 0); | ||||||
|  |  | ||||||
|         if (w.window == NULL) |         if (w.window == NULL) { | ||||||
|             return -1; |             return -1; | ||||||
|  |         } | ||||||
|  |  | ||||||
| #ifdef URXVT_FIX | #ifdef URXVT_FIX | ||||||
|         /* Fixes text color problem on some terminals. */ |         /* Fixes text color problem on some terminals. */ | ||||||
| @@ -324,8 +347,9 @@ int add_window(Tox *m, ToxWindow w) | |||||||
| #endif | #endif | ||||||
|         windows[i] = w; |         windows[i] = w; | ||||||
|  |  | ||||||
|         if (w.onInit) |         if (w.onInit) { | ||||||
|             w.onInit(&w, m); |             w.onInit(&w, m); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         ++num_active_windows; |         ++num_active_windows; | ||||||
|  |  | ||||||
| @@ -337,8 +361,9 @@ int add_window(Tox *m, ToxWindow w) | |||||||
|  |  | ||||||
| void set_active_window(int index) | void set_active_window(int index) | ||||||
| { | { | ||||||
|     if (index < 0 || index >= MAX_WINDOWS_NUM) |     if (index < 0 || index >= MAX_WINDOWS_NUM) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     active_window = windows + index; |     active_window = windows + index; | ||||||
| } | } | ||||||
| @@ -351,18 +376,22 @@ void set_next_window(int ch) | |||||||
|  |  | ||||||
|     while (true) { |     while (true) { | ||||||
|         if (ch == user_settings->key_next_tab) { |         if (ch == user_settings->key_next_tab) { | ||||||
|             if (++active_window > end) |             if (++active_window > end) { | ||||||
|                 active_window = windows; |                 active_window = windows; | ||||||
|         } else if (--active_window < windows) |             } | ||||||
|  |         } else if (--active_window < windows) { | ||||||
|             active_window = end; |             active_window = end; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (active_window->window) |         if (active_window->window) { | ||||||
|             return; |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (active_window == inf)    /* infinite loop check */ |         if (active_window == inf) {  /* infinite loop check */ | ||||||
|             exit_toxic_err("failed in set_next_window", FATALERR_INFLOOP); |             exit_toxic_err("failed in set_next_window", FATALERR_INFLOOP); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* Deletes window w and cleans up */ | /* Deletes window w and cleans up */ | ||||||
| void del_window(ToxWindow *w) | void del_window(ToxWindow *w) | ||||||
| @@ -381,8 +410,9 @@ ToxWindow *init_windows(Tox *m) | |||||||
| { | { | ||||||
|     int n_prompt = add_window(m, new_prompt()); |     int n_prompt = add_window(m, new_prompt()); | ||||||
|  |  | ||||||
|     if (n_prompt == -1 || add_window(m, new_friendlist()) == -1) |     if (n_prompt == -1 || add_window(m, new_friendlist()) == -1) { | ||||||
|         exit_toxic_err("failed in init_windows", FATALERR_WININIT); |         exit_toxic_err("failed in init_windows", FATALERR_WININIT); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     prompt = &windows[n_prompt]; |     prompt = &windows[n_prompt]; | ||||||
|     active_window = prompt; |     active_window = prompt; | ||||||
| @@ -401,14 +431,16 @@ void on_window_resize(void) | |||||||
|     getmaxyx(stdscr, y2, x2); |     getmaxyx(stdscr, y2, x2); | ||||||
|     y2 -= 2; |     y2 -= 2; | ||||||
|  |  | ||||||
|     if (y2 <= 0 || x2 <= 0) |     if (y2 <= 0 || x2 <= 0) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (!windows[i].active) |         if (!windows[i].active) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         ToxWindow *w = &windows[i]; |         ToxWindow *w = &windows[i]; | ||||||
|  |  | ||||||
| @@ -418,8 +450,9 @@ void on_window_resize(void) | |||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (w->help->active) |         if (w->help->active) { | ||||||
|             wclear(w->help->win); |             wclear(w->help->win); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (w->is_groupchat) { |         if (w->is_groupchat) { | ||||||
|             delwin(w->chatwin->sidebar); |             delwin(w->chatwin->sidebar); | ||||||
| @@ -441,9 +474,10 @@ void on_window_resize(void) | |||||||
|         } else { |         } else { | ||||||
|             w->chatwin->history = subwin(w->window, y2 - CHATBOX_HEIGHT + 1, x2, 0, 0); |             w->chatwin->history = subwin(w->window, y2 - CHATBOX_HEIGHT + 1, x2, 0, 0); | ||||||
|  |  | ||||||
|             if (!w->is_groupchat) |             if (!w->is_groupchat) { | ||||||
|                 w->stb->topline = subwin(w->window, 2, x2, 0, 0); |                 w->stb->topline = subwin(w->window, 2, x2, 0, 0); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
| #ifdef AUDIO | #ifdef AUDIO | ||||||
|  |  | ||||||
| @@ -462,7 +496,9 @@ static void draw_window_tab(ToxWindow *toxwin) | |||||||
| { | { | ||||||
|     pthread_mutex_lock(&Winthread.lock); |     pthread_mutex_lock(&Winthread.lock); | ||||||
|  |  | ||||||
|     if (toxwin->alert != WINDOW_ALERT_NONE) attron(COLOR_PAIR(toxwin->alert)); |     if (toxwin->alert != WINDOW_ALERT_NONE) { | ||||||
|  |         attron(COLOR_PAIR(toxwin->alert)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pthread_mutex_unlock(&Winthread.lock); |     pthread_mutex_unlock(&Winthread.lock); | ||||||
|  |  | ||||||
| @@ -471,7 +507,9 @@ static void draw_window_tab(ToxWindow *toxwin) | |||||||
|  |  | ||||||
|     pthread_mutex_lock(&Winthread.lock); |     pthread_mutex_lock(&Winthread.lock); | ||||||
|  |  | ||||||
|     if (toxwin->alert != WINDOW_ALERT_NONE) attroff(COLOR_PAIR(toxwin->alert)); |     if (toxwin->alert != WINDOW_ALERT_NONE) { | ||||||
|  |         attroff(COLOR_PAIR(toxwin->alert)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pthread_mutex_unlock(&Winthread.lock); |     pthread_mutex_unlock(&Winthread.lock); | ||||||
| } | } | ||||||
| @@ -492,8 +530,9 @@ static void draw_bar(void) | |||||||
|     size_t i; |     size_t i; | ||||||
|  |  | ||||||
|     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { |     for (i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||||
|         if (!windows[i].active) |         if (!windows[i].active) { | ||||||
|             continue; |             continue; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (windows + i == active_window) |         if (windows + i == active_window) | ||||||
|  |  | ||||||
| @@ -543,19 +582,22 @@ void draw_active_window(Tox *m) | |||||||
| #ifdef HAVE_WIDECHAR | #ifdef HAVE_WIDECHAR | ||||||
|     int status = wget_wch(stdscr, &ch); |     int status = wget_wch(stdscr, &ch); | ||||||
|  |  | ||||||
|     if (status == ERR) |     if (status == ERR) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (status == OK) |     if (status == OK) { | ||||||
|         ltr = iswprint(ch); |         ltr = iswprint(ch); | ||||||
|     else /* if (status == KEY_CODE_YES) */ |     } else { /* if (status == KEY_CODE_YES) */ | ||||||
|         ltr = false; |         ltr = false; | ||||||
|  |     } | ||||||
|  |  | ||||||
| #else | #else | ||||||
|     ch = getch(); |     ch = getch(); | ||||||
|  |  | ||||||
|     if (ch == ERR) |     if (ch == ERR) { | ||||||
|         return; |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* TODO verify if this works */ |     /* TODO verify if this works */ | ||||||
|     ltr = isprint(ch); |     ltr = isprint(ch); | ||||||
| @@ -592,8 +634,9 @@ ToxWindow *get_window_ptr(int i) | |||||||
| { | { | ||||||
|     ToxWindow *toxwin = NULL; |     ToxWindow *toxwin = NULL; | ||||||
|  |  | ||||||
|     if (i >= 0 && i < MAX_WINDOWS_NUM && windows[i].active) |     if (i >= 0 && i < MAX_WINDOWS_NUM && windows[i].active) { | ||||||
|         toxwin = &windows[i]; |         toxwin = &windows[i]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return toxwin; |     return toxwin; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										83
									
								
								src/xtra.c
									
									
									
									
									
								
							
							
						
						
									
										83
									
								
								src/xtra.c
									
									
									
									
									
								
							| @@ -76,7 +76,9 @@ Property read_property(Window s, Atom p) | |||||||
|  |  | ||||||
|     /* Keep trying to read the property until there are no bytes unread */ |     /* Keep trying to read the property until there are no bytes unread */ | ||||||
|     do { |     do { | ||||||
|         if (data) XFree(data); |         if (data) { | ||||||
|  |             XFree(data); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         XGetWindowProperty(Xtra.display, s, |         XGetWindowProperty(Xtra.display, s, | ||||||
|                            p, 0, |                            p, 0, | ||||||
| @@ -98,7 +100,9 @@ Atom get_dnd_type(long *a, int l) | |||||||
|     int i = 0; |     int i = 0; | ||||||
|  |  | ||||||
|     for (; i < l; i ++) { |     for (; i < l; i ++) { | ||||||
|         if (a[i] != XtraNil) return a[i]; /* Get first valid */ |         if (a[i] != XtraNil) { | ||||||
|  |             return a[i];    /* Get first valid */ | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return XtraNil; |     return XtraNil; | ||||||
| @@ -193,10 +197,11 @@ static void handle_xdnd_selection(XSelectionEvent *e) | |||||||
|     Property p = read_property(Xtra.proxy_window, XdndSelection); |     Property p = read_property(Xtra.proxy_window, XdndSelection); | ||||||
|     DropType dt; |     DropType dt; | ||||||
|  |  | ||||||
|     if (strcmp(XGetAtomName(Xtra.display, p.read_type), "text/uri-list") == 0) |     if (strcmp(XGetAtomName(Xtra.display, p.read_type), "text/uri-list") == 0) { | ||||||
|         dt = DT_file_list; |         dt = DT_file_list; | ||||||
|     else /* text/uri-list */ |     } else { /* text/uri-list */ | ||||||
|         dt = DT_plain; |         dt = DT_plain; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     /* Call callback for every entry */ |     /* Call callback for every entry */ | ||||||
| @@ -204,13 +209,18 @@ static void handle_xdnd_selection(XSelectionEvent *e) | |||||||
|         char *sptr; |         char *sptr; | ||||||
|         char *str = strtok_r((char *) p.data, "\n\r", &sptr); |         char *str = strtok_r((char *) p.data, "\n\r", &sptr); | ||||||
|  |  | ||||||
|         if (str) Xtra.on_drop(str, dt); |         if (str) { | ||||||
|  |  | ||||||
|         while ((str = strtok_r(NULL, "\n\r", &sptr))) |  | ||||||
|             Xtra.on_drop(str, dt); |             Xtra.on_drop(str, dt); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     if (p.data) XFree(p.data); |         while ((str = strtok_r(NULL, "\n\r", &sptr))) { | ||||||
|  |             Xtra.on_drop(str, dt); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (p.data) { | ||||||
|  |         XFree(p.data); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void *event_loop(void *p) | void *event_loop(void *p) | ||||||
| @@ -227,7 +237,9 @@ void *event_loop(void *p) | |||||||
|  |  | ||||||
|         XLockDisplay(Xtra.display); |         XLockDisplay(Xtra.display); | ||||||
|  |  | ||||||
|         if ((pending = XPending(Xtra.display))) XNextEvent(Xtra.display, &event); |         if ((pending = XPending(Xtra.display))) { | ||||||
|  |             XNextEvent(Xtra.display, &event); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (!pending) { |         if (!pending) { | ||||||
|             XUnlockDisplay(Xtra.display); |             XUnlockDisplay(Xtra.display); | ||||||
| @@ -238,13 +250,22 @@ void *event_loop(void *p) | |||||||
|         if (event.type == ClientMessage) { |         if (event.type == ClientMessage) { | ||||||
|             Atom type = event.xclient.message_type; |             Atom type = event.xclient.message_type; | ||||||
|  |  | ||||||
|             if      (type == XdndEnter)         handle_xdnd_enter(&event.xclient); |             if (type == XdndEnter) { | ||||||
|             else if (type == XdndPosition)      handle_xdnd_position(&event.xclient); |                 handle_xdnd_enter(&event.xclient); | ||||||
|             else if (type == XdndDrop)          handle_xdnd_drop(&event.xclient); |             } else if (type == XdndPosition) { | ||||||
|             else if (type == XtraTerminate)     break; |                 handle_xdnd_position(&event.xclient); | ||||||
|         } else if (event.type == SelectionNotify) handle_xdnd_selection(&event.xselection); |             } else if (type == XdndDrop) { | ||||||
|  |                 handle_xdnd_drop(&event.xclient); | ||||||
|  |             } else if (type == XtraTerminate) { | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } else if (event.type == SelectionNotify) { | ||||||
|  |             handle_xdnd_selection(&event.xselection); | ||||||
|  |         } | ||||||
|         /* AINNOBODYCANHANDLEDEMEVENTS*/ |         /* AINNOBODYCANHANDLEDEMEVENTS*/ | ||||||
|         else XSendEvent(Xtra.display, Xtra.terminal_window, 0, 0, &event); |         else { | ||||||
|  |             XSendEvent(Xtra.display, Xtra.terminal_window, 0, 0, &event); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         XUnlockDisplay(Xtra.display); |         XUnlockDisplay(Xtra.display); | ||||||
|     } |     } | ||||||
| @@ -253,7 +274,9 @@ void *event_loop(void *p) | |||||||
|      * Please call xtra_terminate() at exit |      * Please call xtra_terminate() at exit | ||||||
|      * otherwise HEWUSAGUDBOI happens |      * otherwise HEWUSAGUDBOI happens | ||||||
|      */ |      */ | ||||||
|     if (Xtra.display) XCloseDisplay(Xtra.display); |     if (Xtra.display) { | ||||||
|  |         XCloseDisplay(Xtra.display); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return (Xtra.display = NULL); |     return (Xtra.display = NULL); | ||||||
| } | } | ||||||
| @@ -262,19 +285,25 @@ int init_xtra(drop_callback d) | |||||||
| { | { | ||||||
|     memset(&Xtra, 0, sizeof(Xtra)); |     memset(&Xtra, 0, sizeof(Xtra)); | ||||||
|  |  | ||||||
|     if (!d) return -1; |     if (!d) { | ||||||
|     else Xtra.on_drop = d; |         return -1; | ||||||
|  |     } else { | ||||||
|  |         Xtra.on_drop = d; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     XInitThreads(); |     XInitThreads(); | ||||||
|  |  | ||||||
|     if ( !(Xtra.display = XOpenDisplay(NULL))) return -1; |     if (!(Xtra.display = XOpenDisplay(NULL))) { | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Xtra.terminal_window = focused_window_id(); |     Xtra.terminal_window = focused_window_id(); | ||||||
|  |  | ||||||
|     /* OSX: if focused window is 0, it means toxic is ran from |     /* OSX: if focused window is 0, it means toxic is ran from | ||||||
|      * native terminal and not X11 terminal window, silently exit */ |      * native terminal and not X11 terminal window, silently exit */ | ||||||
|     if (!Xtra.terminal_window) |     if (!Xtra.terminal_window) { | ||||||
|         return 0; |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     { |     { | ||||||
|         /* Create an invisible window which will act as proxy for the DnD operation. */ |         /* Create an invisible window which will act as proxy for the DnD operation. */ | ||||||
| @@ -308,9 +337,10 @@ int init_xtra(drop_callback d) | |||||||
|                                    InputOnly,                                /* Class */ |                                    InputOnly,                                /* Class */ | ||||||
|                                    CopyFromParent,                           /* Visual */ |                                    CopyFromParent,                           /* Visual */ | ||||||
|                                    CWEventMask | CWCursor,                   /* Value mask */ |                                    CWEventMask | CWCursor,                   /* Value mask */ | ||||||
|                                     &attr)) )                                 /* Attributes for value mask */ |                                    &attr))) {                                /* Attributes for value mask */ | ||||||
|             return -1; |             return -1; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     XMapWindow(Xtra.display, Xtra.proxy_window);   /* Show window (sandwich) */ |     XMapWindow(Xtra.display, Xtra.proxy_window);   /* Show window (sandwich) */ | ||||||
|     XLowerWindow(Xtra.display, Xtra.proxy_window); /* Don't interfere with parent lmao */ |     XLowerWindow(Xtra.display, Xtra.proxy_window); /* Don't interfere with parent lmao */ | ||||||
| @@ -339,8 +369,9 @@ int init_xtra(drop_callback d) | |||||||
|  |  | ||||||
|     pthread_t id; |     pthread_t id; | ||||||
|  |  | ||||||
|     if (pthread_create(&id, NULL, event_loop, NULL) != 0) |     if (pthread_create(&id, NULL, event_loop, NULL) != 0) { | ||||||
|         return -1; |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pthread_detach(id); |     pthread_detach(id); | ||||||
|  |  | ||||||
| @@ -349,7 +380,9 @@ int init_xtra(drop_callback d) | |||||||
|  |  | ||||||
| void terminate_xtra() | void terminate_xtra() | ||||||
| { | { | ||||||
|     if (!Xtra.display || !Xtra.terminal_window) return; |     if (!Xtra.display || !Xtra.terminal_window) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     XEvent terminate = { |     XEvent terminate = { | ||||||
|         .xclient = { |         .xclient = { | ||||||
| @@ -369,7 +402,9 @@ void terminate_xtra() | |||||||
|  |  | ||||||
| long unsigned int focused_window_id() | long unsigned int focused_window_id() | ||||||
| { | { | ||||||
|     if (!Xtra.display) return 0; |     if (!Xtra.display) { | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     Window focus; |     Window focus; | ||||||
|     int revert; |     int revert; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user