diff --git a/src/audio_call.c b/src/audio_call.c index 2dfcfb9..83151b0 100644 --- a/src/audio_call.c +++ b/src/audio_call.c @@ -100,7 +100,7 @@ void callback_peer_timeout ( void* av, int32_t call_index, void *arg ); void callback_media_change ( void* av, int32_t call_index, void *arg ); int stop_transmission(int call_index); -void write_device_callback(ToxAv* av, int32_t call_index, int16_t* data, int size); +void write_device_callback(ToxAv* av, int32_t call_index, int16_t* data, int size, void* userdata); static void print_err (ToxWindow *self, const char *error_str) { @@ -146,7 +146,7 @@ ToxAv *init_audio(ToxWindow *self, Tox *tox) toxav_register_callstate_callback(ASettins.av, callback_peer_timeout, av_OnPeerTimeout, self); toxav_register_callstate_callback(ASettins.av, callback_media_change, av_OnMediaChange, self); - toxav_register_audio_recv_callback(ASettins.av, write_device_callback); + toxav_register_audio_recv_callback(ASettins.av, write_device_callback, NULL); return ASettins.av; } @@ -175,8 +175,9 @@ void read_device_callback (const int16_t* captured, uint32_t size, void* data) } -void write_device_callback(ToxAv* av, int32_t call_index, int16_t* data, int size) +void write_device_callback(ToxAv* av, int32_t call_index, int16_t* data, int size, void* userdata) { + (void)userdata; if (call_index >= 0 && ASettins.calls[call_index].ttas) { ToxAvCSettings csettings = ASettins.cs; toxav_get_peer_csettings(av, call_index, 0, &csettings); @@ -489,8 +490,7 @@ void cmd_cancel(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[ } #ifdef _SOUND_NOTIFY - stop_sound(self->active_sound); - self->active_sound = -1; + stop_sound(self->ringing_sound); #endif /* _SOUND_NOTIFY */ /* Callback will print status... */ diff --git a/src/chat.c b/src/chat.c index 33ef157..503af2d 100644 --- a/src/chat.c +++ b/src/chat.c @@ -166,7 +166,11 @@ static void chat_onMessage(ToxWindow *self, Tox *m, int32_t num, const char *msg line_info_add(self, timefrmt, nick, NULL, IN_MSG, 0, 0, msg); write_to_log(msg, nick, ctx->log, false); - notify(self, generic_message, NT_WNDALERT_1 | NT_NOFOCUS); + if (self->active_box != -1) + box_notify2(self, generic_message, NT_WNDALERT_1 | NT_NOFOCUS, self->active_box, msg); + else + box_notify(self, generic_message, NT_WNDALERT_1 | NT_NOFOCUS, &self->active_box, nick, msg); + } static void chat_onConnectionChange(ToxWindow *self, Tox *m, int32_t num, uint8_t status) @@ -180,11 +184,10 @@ static void chat_onConnectionChange(ToxWindow *self, Tox *m, int32_t num, uint8_ statusbar->is_online = true; friends[num].is_typing = user_settings_->show_typing_other == SHOW_TYPING_ON ? tox_get_is_typing(m, num) : 0; - notify(self, user_log_in, NT_NOFOCUS); + } else { /* Friend goes offline */ statusbar->is_online = false; friends[num].is_typing = 0; - notify(self, user_log_out, NT_NOFOCUS); if (self->chatwin->self_is_typing) set_self_typingstatus(self, m, 0); @@ -214,7 +217,11 @@ static void chat_onAction(ToxWindow *self, Tox *m, int32_t num, const char *acti line_info_add(self, timefrmt, nick, NULL, ACTION, 0, 0, action); write_to_log(action, nick, ctx->log, true); - notify(self, generic_message, NT_WNDALERT_1 | NT_NOFOCUS); + + if (self->active_box != -1) + box_notify2(self, generic_message, NT_WNDALERT_0 | NT_NOFOCUS, self->active_box, "* %s %s", nick, action ); + else + box_notify(self, generic_message, NT_WNDALERT_0 | NT_NOFOCUS, &self->active_box, self->name, "* %s %s", nick, action ); } static void chat_onNickChange(ToxWindow *self, Tox *m, int32_t num, const char *nick, uint16_t len) @@ -333,7 +340,12 @@ static void chat_onFileSendRequest(ToxWindow *self, Tox *m, int32_t num, uint8_t friends[num].file_receiver.size[filenum] = filesize; strcpy(friends[num].file_receiver.filenames[filenum], filename); - notify(self, transfer_pending, NT_WNDALERT_2 | NT_NOFOCUS); + if (self->active_box != -1) + box_notify2(self, transfer_pending, NT_WNDALERT_2 | NT_NOFOCUS, self->active_box, + "Incoming file: %s", filename ); + else + box_notify(self, transfer_pending, NT_WNDALERT_2 | NT_NOFOCUS, &self->active_box, self->name, + "Incoming file: %s", filename ); } static void chat_close_file_receiver(int32_t num, uint8_t filenum) @@ -378,7 +390,7 @@ static void chat_onFileControl(ToxWindow *self, Tox *m, int32_t num, uint8_t rec prep_prog_line(progline); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, progline); file_senders[i].line_id = self->chatwin->hst->line_end->id + 2; - notify(self, silent, NT_NOFOCUS | NT_BEEP | NT_WNDALERT_2); + sound_notify(self, silent, NT_NOFOCUS | NT_BEEP | NT_WNDALERT_2, NULL); } break; @@ -388,15 +400,27 @@ static void chat_onFileControl(ToxWindow *self, Tox *m, int32_t num, uint8_t rec if (receive_send == 0) chat_close_file_receiver(num, filenum); - - notify(self, error, NT_NOFOCUS | NT_WNDALERT_2); + + if (self->active_box != -1) + box_notify2(self, error, NT_NOFOCUS | NT_WNDALERT_2, + self->active_box, "File transfer for '%s' failed!", filename ); + else + box_notify(self, error, NT_NOFOCUS | NT_WNDALERT_2, &self->active_box, + self->name, "File transfer for '%s' failed!", filename ); break; case TOX_FILECONTROL_FINISHED: if (receive_send == 0) { snprintf(msg, sizeof(msg), "File transfer for '%s' complete.", filename); chat_close_file_receiver(num, filenum); - notify(self, transfer_completed, NT_NOFOCUS | NT_WNDALERT_2); + + if (self->active_box != -1) + box_notify2(self, transfer_completed, NT_NOFOCUS | NT_WNDALERT_2, + self->active_box, "File '%s' successfuly sent!", filename ); + else + box_notify(self, transfer_completed, NT_NOFOCUS | NT_WNDALERT_2, &self->active_box, + self->name, "File '%s' successfuly sent!", filename ); + } break; @@ -455,7 +479,12 @@ static void chat_onGroupInvite(ToxWindow *self, Tox *m, int32_t friendnumber, co friends[friendnumber].groupchat_pending = true; - notify(self, generic_message, NT_WNDALERT_2); + sound_notify(self, generic_message, NT_WNDALERT_2, NULL); + + if (self->active_box != -1) + box_silent_notify2(self, NT_WNDALERT_2 | NT_NOFOCUS, self->active_box, "invites you to join group chat"); + else + box_silent_notify(self, NT_WNDALERT_2 | NT_NOFOCUS, &self->active_box, name, "invites you to join group chat"); } /* Av Stuff */ @@ -470,11 +499,12 @@ void chat_onInvite (ToxWindow *self, ToxAv *av, int call_index) self->call_idx = call_index; line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Incoming audio call! Type: \"/answer\" or \"/reject\""); + -#ifdef _SOUND_NOTIFY - if (self->active_sound == -1) - self->active_sound = notify(self, call_incoming, NT_LOOP | NT_WNDALERT_0); -#endif /* _SOUND_NOTIFY */ + if (self->ringing_sound != -1) + box_notify2(self, call_incoming, NT_LOOP | NT_WNDALERT_0, self->ringing_sound, "Incoming audio call!"); + else + box_notify(self, call_incoming, NT_LOOP | NT_WNDALERT_0, &self->ringing_sound, self->name, "Incoming audio call!"); } void chat_onRinging (ToxWindow *self, ToxAv *av, int call_index) @@ -485,8 +515,8 @@ void chat_onRinging (ToxWindow *self, ToxAv *av, int call_index) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Ringing...\"cancel\" ?"); #ifdef _SOUND_NOTIFY - if (self->active_sound == -1) - self->active_sound = notify(self, call_outgoing, NT_LOOP); + if (self->ringing_sound == -1) + sound_notify(self, call_outgoing, NT_LOOP, &self->ringing_sound); #endif /* _SOUND_NOTIFY */ } @@ -500,8 +530,7 @@ void chat_onStarting (ToxWindow *self, ToxAv *av, int call_index) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Call started! Type: \"/hangup\" to end it."); #ifdef _SOUND_NOTIFY - stop_sound(self->active_sound); - self->active_sound = -1; + stop_sound(self->ringing_sound); #endif /* _SOUND_NOTIFY */ } @@ -515,8 +544,7 @@ void chat_onEnding (ToxWindow *self, ToxAv *av, int call_index) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Call ended!"); #ifdef _SOUND_NOTIFY - stop_sound(self->active_sound); - self->active_sound = -1; + stop_sound(self->ringing_sound); #endif /* _SOUND_NOTIFY */ } @@ -529,8 +557,7 @@ void chat_onError (ToxWindow *self, ToxAv *av, int call_index) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Error!"); #ifdef _SOUND_NOTIFY - stop_sound(self->active_sound); - self->active_sound = -1; + stop_sound(self->ringing_sound); #endif /* _SOUND_NOTIFY */ } @@ -544,8 +571,7 @@ void chat_onStart (ToxWindow *self, ToxAv *av, int call_index) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Call started! Type: \"/hangup\" to end it."); #ifdef _SOUND_NOTIFY - stop_sound(self->active_sound); - self->active_sound = -1; + stop_sound(self->ringing_sound); #endif /* _SOUND_NOTIFY */ } @@ -559,8 +585,7 @@ void chat_onCancel (ToxWindow *self, ToxAv *av, int call_index) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Call canceled!"); #ifdef _SOUND_NOTIFY - stop_sound(self->active_sound); - self->active_sound = -1; + stop_sound(self->ringing_sound); #endif /* _SOUND_NOTIFY */ } @@ -573,8 +598,7 @@ void chat_onReject (ToxWindow *self, ToxAv *av, int call_index) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Rejected!"); #ifdef _SOUND_NOTIFY - stop_sound(self->active_sound); - self->active_sound = -1; + stop_sound(self->ringing_sound); #endif /* _SOUND_NOTIFY */ } @@ -588,8 +612,7 @@ void chat_onEnd (ToxWindow *self, ToxAv *av, int call_index) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Call ended!"); #ifdef _SOUND_NOTIFY - stop_sound(self->active_sound); - self->active_sound = -1; + stop_sound(self->ringing_sound); #endif /* _SOUND_NOTIFY */ } @@ -602,8 +625,7 @@ void chat_onRequestTimeout (ToxWindow *self, ToxAv *av, int call_index) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "No answer!"); #ifdef _SOUND_NOTIFY - stop_sound(self->active_sound); - self->active_sound = -1; + stop_sound(self->ringing_sound); #endif /* _SOUND_NOTIFY */ } @@ -617,12 +639,10 @@ void chat_onPeerTimeout (ToxWindow *self, ToxAv *av, int call_index) line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Peer disconnected; call ended!"); #ifdef _SOUND_NOTIFY - stop_sound(self->active_sound); - self->active_sound = -1; + stop_sound(self->ringing_sound); #endif /* _SOUND_NOTIFY */ } -#ifdef _AUDIO static void init_infobox(ToxWindow *self) { ChatContext *ctx = self->chatwin; @@ -639,7 +659,6 @@ static void init_infobox(ToxWindow *self) ctx->infobox.active = true; strcpy(ctx->infobox.timestr, "00"); } -#endif static void kill_infobox(ToxWindow *self) { @@ -776,7 +795,7 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) ctx->start = wlen < x2 ? 0 : wlen - x2 + 1; } } else { - notify(self, error, 0); + sound_notify(self, error, 0, NULL); } } else if (key == '\n') { @@ -1031,11 +1050,10 @@ ToxWindow new_chat(Tox *m, int32_t friendnum) ret.call_idx = -1; ret.device_selection[0] = ret.device_selection[1] = -1; + ret.ringing_sound = -1; #endif /* _AUDIO */ -#ifdef _SOUND_NOTIFY - ret.active_sound = -1; -#endif /* _SOUND_NOTIFY */ + ret.active_box = -1; char nick[TOX_MAX_NAME_LENGTH]; int n_len = get_nick_truncate(m, nick, friendnum); diff --git a/src/execute.c b/src/execute.c index d4547fd..f44fcfe 100644 --- a/src/execute.c +++ b/src/execute.c @@ -168,7 +168,7 @@ void execute(WINDOW *w, ToxWindow *self, Tox *m, const char *input, int mode) if (do_command(w, self, m, num_args, GLOBAL_NUM_COMMANDS, global_commands, args) == 0) return; - /* do both in case user has no sound */ - line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid command."); - notify(self, error, 0); + /* Just play sound instead */ + /*line_info_add(self, NULL, NULL, NULL, "Invalid command.", SYS_MSG, 0, 0);*/ + sound_notify(self, error, 0, NULL); } diff --git a/src/file_senders.c b/src/file_senders.c index f9b891d..721cbf0 100644 --- a/src/file_senders.c +++ b/src/file_senders.c @@ -177,7 +177,13 @@ static void send_file_data(ToxWindow *self, Tox *m, int i, int32_t friendnum, in char msg[MAX_STR_SIZE]; snprintf(msg, sizeof(msg), "File '%s' successfuly sent.", pathname); close_file_sender(self, m, i, msg, TOX_FILECONTROL_FINISHED, filenum, friendnum); - notify(self, transfer_completed, NT_NOFOCUS | NT_WNDALERT_2); + + if (self->active_box != -1) + box_notify2(self, transfer_completed, NT_NOFOCUS | NT_WNDALERT_2, + self->active_box, "File '%s' successfuly sent!", pathname ); + else + box_notify(self, transfer_completed, NT_NOFOCUS | NT_WNDALERT_2, &self->active_box, + self->name, "File '%s' successfuly sent!", pathname ); return; } } @@ -206,7 +212,14 @@ void do_file_senders(Tox *m) char msg[MAX_STR_SIZE]; snprintf(msg, sizeof(msg), "File transfer for '%s' timed out.", pathname); close_file_sender(self, m, i, msg, TOX_FILECONTROL_KILL, filenum, friendnum); - notify(self, error, NT_NOFOCUS | NT_WNDALERT_2); + sound_notify(self, error, NT_NOFOCUS | NT_WNDALERT_2, NULL); + + if (self->active_box != -1) + box_notify2(self, error, NT_NOFOCUS | NT_WNDALERT_2, + self->active_box, "File transfer for '%s' failed!", pathname ); + else + box_notify(self, error, NT_NOFOCUS | NT_WNDALERT_2, &self->active_box, + self->name, "File transfer for '%s' failed!", pathname ); continue; } diff --git a/src/friendlist.c b/src/friendlist.c index e3f5219..f7b40b9 100644 --- a/src/friendlist.c +++ b/src/friendlist.c @@ -253,8 +253,7 @@ static void friendlist_onMessage(ToxWindow *self, Tox *m, int32_t num, const cha if (friends[num].chatwin == -1) { if (get_num_active_windows() < MAX_WINDOWS_NUM) { - friends[num].chatwin = add_window(m, new_chat(m, friends[num].num)); - notify(self, generic_message, NT_WNDALERT_0 | NT_NOFOCUS); + friends[num].chatwin = add_window(m, new_chat(m, friends[num].num)); } else { char nick[TOX_MAX_NAME_LENGTH]; get_nick_truncate(m, nick, num); @@ -266,7 +265,7 @@ static void friendlist_onMessage(ToxWindow *self, Tox *m, int32_t num, const cha const char *msg = "* Warning: Too many windows are open."; line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, RED, msg); - notify(prompt, error, NT_WNDALERT_1); + sound_notify(prompt, error, NT_WNDALERT_1, NULL); } } } @@ -397,7 +396,14 @@ static void friendlist_onFileSendRequest(ToxWindow *self, Tox *m, int32_t num, u if (friends[num].chatwin == -1) { if (get_num_active_windows() < MAX_WINDOWS_NUM) { friends[num].chatwin = add_window(m, new_chat(m, friends[num].num)); - notify(self, transfer_pending, NT_NOFOCUS); + + if (self->active_box != -1) + box_notify2(self, transfer_pending, NT_NOFOCUS, self->active_box, + "Incoming file reaquest: %s", filename); + else + box_notify(self, transfer_pending, NT_NOFOCUS, &self->active_box, self->name, + "Incoming file reaquest: %s", filename); + } else { tox_file_send_control(m, num, 1, filenum, TOX_FILECONTROL_KILL, 0, 0); @@ -407,7 +413,7 @@ static void friendlist_onFileSendRequest(ToxWindow *self, Tox *m, int32_t num, u const char *msg = "* File transfer from %s failed: too many windows are open."; line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, RED, msg, nick); - notify(prompt, error, NT_WNDALERT_1); + sound_notify(prompt, error, NT_WNDALERT_1, NULL); } } } @@ -420,7 +426,13 @@ static void friendlist_onGroupInvite(ToxWindow *self, Tox *m, int32_t num, const if (friends[num].chatwin == -1) { if (get_num_active_windows() < MAX_WINDOWS_NUM) { friends[num].chatwin = add_window(m, new_chat(m, friends[num].num)); - notify(self, generic_message, NT_WNDALERT_0 | NT_NOFOCUS); + + if (self->active_box != -1) + box_notify2(self, generic_message, NT_WNDALERT_0 | NT_NOFOCUS, self->active_box, + "You are invited to join group" ); + else + box_notify(self, generic_message, NT_WNDALERT_0 | NT_NOFOCUS, &self->active_box, self->name, + "You are invited to join group" ); } else { char nick[TOX_MAX_NAME_LENGTH]; @@ -429,7 +441,7 @@ static void friendlist_onGroupInvite(ToxWindow *self, Tox *m, int32_t num, const const char *msg = "* Group chat invite from %s failed: too many windows are open."; line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, RED, msg, nick); - notify(prompt, error, NT_WNDALERT_1); + sound_notify(prompt, error, NT_WNDALERT_1, NULL); } } } @@ -651,7 +663,7 @@ static void friendlist_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) } else { const char *msg = "* Warning: Too many windows are open."; line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, RED, msg); - notify(prompt, error, NT_WNDALERT_1); + sound_notify(prompt, error, NT_WNDALERT_1, NULL); } break; @@ -969,7 +981,7 @@ static void friendlist_onAv(ToxWindow *self, ToxAv *av, int call_index) const char *errmsg = "* Warning: Too many windows are open."; line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, RED, errmsg); - notify(prompt, error, NT_WNDALERT_1); + sound_notify(prompt, error, NT_WNDALERT_1, NULL); } } } @@ -1011,10 +1023,8 @@ ToxWindow new_friendlist(void) ret.call_idx = -1; ret.device_selection[0] = ret.device_selection[1] = -1; #endif /* _AUDIO */ - -#ifdef _SOUND_NOTIFY - ret.active_sound = -1; -#endif /* _SOUND_NOTIFY */ + + ret.active_box = -1; Help *help = calloc(1, sizeof(Help)); diff --git a/src/groupchat.c b/src/groupchat.c index cbf7e96..8663a12 100644 --- a/src/groupchat.c +++ b/src/groupchat.c @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -144,10 +145,16 @@ static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, int groupnum, int /* Only play sound if mentioned */ if (strcasestr(msg, selfnick) && strncmp(selfnick, nick, TOXIC_MAX_NAME_LENGTH - 1)) { - notify(self, generic_message, NT_WNDALERT_0); + sound_notify(self, generic_message, NT_WNDALERT_0, NULL); + + if (self->active_box != -1) + box_silent_notify2(self, NT_NOFOCUS, self->active_box, "%s %s", nick, msg); + else + box_silent_notify(self, NT_NOFOCUS, &self->active_box, self->name, "%s %s", nick, msg); + nick_clr = RED; } - else notify(self, silent, NT_WNDALERT_1); + else sound_notify(self, silent, NT_WNDALERT_1, NULL); char timefrmt[TIME_STR_SIZE]; get_time_str(timefrmt, sizeof(timefrmt)); @@ -169,9 +176,19 @@ static void groupchat_onGroupAction(ToxWindow *self, Tox *m, int groupnum, int p selfnick[n_len] = '\0'; if (strcasestr(action, selfnick)) { - notify(self, generic_message, NT_WNDALERT_0); + sound_notify(self, generic_message, NT_WNDALERT_0, NULL); + + char nick[TOX_MAX_NAME_LENGTH]; + int n_len = tox_group_peername(m, groupnum, peernum, (uint8_t *) nick); + n_len = MIN(n_len, TOXIC_MAX_NAME_LENGTH - 1); /* enforce client max name length */ + nick[n_len] = '\0'; + + if (self->active_box != -1) + box_silent_notify2(self, NT_NOFOCUS, self->active_box, "* %s %s", nick, action ); + else + box_silent_notify(self, NT_NOFOCUS, &self->active_box, self->name, "* %s %s", nick, action); } - else notify(self, silent, NT_WNDALERT_1); + else sound_notify(self, silent, NT_WNDALERT_1, NULL); char nick[TOX_MAX_NAME_LENGTH]; n_len = tox_group_peername(m, groupnum, peernum, (uint8_t *) nick); @@ -304,7 +321,7 @@ static void groupchat_onGroupNamelistChange(ToxWindow *self, Tox *m, int groupnu break; } - notify(self, silent, NT_WNDALERT_2); + sound_notify(self, silent, NT_WNDALERT_2, NULL); } static void send_group_action(ToxWindow *self, ChatContext *ctx, Tox *m, char *action) @@ -363,10 +380,10 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr) ctx->start = wlen < x2 ? 0 : wlen - x2 + 1; } } else { - notify(self, error, 0); + sound_notify(self, error, 0, NULL); } } else { - notify(self, error, 0); + sound_notify(self, error, 0, NULL); } } else if (key == user_settings_->key_peer_list_down) { /* Scroll peerlist up and down one position */ int L = y2 - CHATBOX_HEIGHT - SDBAR_OFST; @@ -523,6 +540,7 @@ ToxWindow new_group_chat(Tox *m, int groupnum) ret.help = help; ret.num = groupnum; + ret.active_box = -1; return ret; } diff --git a/src/input.c b/src/input.c index dde6a7e..4fd2b72 100644 --- a/src/input.c +++ b/src/input.c @@ -42,12 +42,12 @@ void input_new_char(ToxWindow *self, wint_t key, int x, int y, int mx_x, int mx_ /* this is the only place we need to do this check */ if (cur_len == -1) { - notify(self, error, 0); + sound_notify(self, error, 0, NULL); return; } if (add_char_to_buf(ctx, key) == -1) { - notify(self, error, 0); + sound_notify(self, error, 0, NULL); return; } @@ -63,7 +63,7 @@ static void input_backspace(ToxWindow *self, int x, int mx_x) ChatContext *ctx = self->chatwin; if (del_char_buf_bck(ctx) == -1) { - notify(self, error, 0); + sound_notify(self, error, 0, NULL); return; } @@ -80,21 +80,21 @@ static void input_backspace(ToxWindow *self, int x, int mx_x) static void input_delete(ToxWindow *self) { if (del_char_buf_frnt(self->chatwin) == -1) - notify(self, error, 0); + sound_notify(self, error, 0, NULL); } /* deletes entire line before cursor from input field and buffer */ static void input_discard(ToxWindow *self) { if (discard_buf(self->chatwin) == -1) - notify(self, error, 0); + sound_notify(self, error, 0, NULL); } /* deletes entire line after cursor from input field and buffer */ static void input_kill(ChatContext *ctx) { if (kill_buf(ctx) == -1) - notify(NULL, error, NT_ALWAYS); + sound_notify(NULL, error, NT_ALWAYS, NULL); } static void input_yank(ToxWindow *self, int x, int mx_x) @@ -102,7 +102,7 @@ static void input_yank(ToxWindow *self, int x, int mx_x) ChatContext *ctx = self->chatwin; if (yank_buf(ctx) == -1) { - notify(self, error, 0); + sound_notify(self, error, 0, NULL); return; } diff --git a/src/line_info.c b/src/line_info.c index 4dbdbf9..b7d1ee9 100644 --- a/src/line_info.c +++ b/src/line_info.c @@ -421,14 +421,14 @@ static void line_info_scroll_up(struct history *hst) { if (hst->line_start->prev) hst->line_start = hst->line_start->prev; - else notify(NULL, error, NT_ALWAYS); + else sound_notify(NULL, error, NT_ALWAYS, NULL); } static void line_info_scroll_down(struct history *hst) { if (hst->line_start->next) hst->line_start = hst->line_start->next; - else notify(NULL, error, NT_ALWAYS); + else sound_notify(NULL, error, NT_ALWAYS, NULL); } static void line_info_page_up(ToxWindow *self, struct history *hst) diff --git a/src/notify.c b/src/notify.c index b571c8b..5dd555d 100644 --- a/src/notify.c +++ b/src/notify.c @@ -23,6 +23,7 @@ #include "notify.h" #include "device.h" #include "settings.h" +#include "line_info.h" #include #include @@ -33,7 +34,7 @@ #include #include -#ifdef _AUDIO +#if defined(_AUDIO) || defined(_SOUND_NOTIFY) #ifdef __APPLE__ #include #include @@ -71,10 +72,13 @@ struct _Control { Display *display; #endif /* _X11 */ -#ifdef _SOUND_NOTIFY +#if defined(_SOUND_NOTIFY) || defined(_BOX_NOTIFY) pthread_mutex_t poll_mutex[1]; - uint32_t device_idx; /* index of output device */ _Bool poll_active; +#endif + +#ifdef _SOUND_NOTIFY + uint32_t device_idx; /* index of output device */ char* sounds[SOUNDS_SIZE]; #endif /* _SOUND_NOTIFY */ } Control = {0}; @@ -83,16 +87,16 @@ struct _ActiveNotifications { #ifdef _SOUND_NOTIFY uint32_t source; uint32_t buffer; - _Bool active; _Bool looping; #endif - + _Bool active; + int *id_indicator; #ifdef _BOX_NOTIFY NotifyNotification* box; char messages[128][128]; char title[24]; size_t size; - time_t timeout; + time_t n_timeout; #endif } actives[ACTIVE_NOTIFS_MAX] = {{0}}; /**********************************************************************************/ @@ -115,8 +119,21 @@ long unsigned int get_focused_window_id() #endif /* _X11 */ } -#ifdef _SOUND_NOTIFY +static void control_lock() +{ +#if defined(_SOUND_NOTIFY) || defined(_BOX_NOTIFY) + pthread_mutex_lock(Control.poll_mutex); +#endif +} +static void control_unlock() +{ +#if defined(_SOUND_NOTIFY) || defined(_BOX_NOTIFY) + pthread_mutex_unlock(Control.poll_mutex); +#endif +} + +#ifdef _SOUND_NOTIFY _Bool is_playing(int source) { int ready; @@ -128,17 +145,20 @@ _Bool is_playing(int source) void graceful_clear() { int i; - pthread_mutex_lock(Control.poll_mutex); + control_lock(); while (1) { for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) { if (actives[i].active) { #ifdef _BOX_NOTIFY if (actives[i].box) { - notify_notification_close(actives[i].box, NULL); - memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); + GError* ignore; + notify_notification_close(actives[i].box, &ignore); + actives[i].box = NULL; } #endif + if(actives[i].id_indicator) *actives[i].id_indicator = -1; // reset indicator value + if ( actives[i].looping ) { stop_sound(i); } else { @@ -151,7 +171,7 @@ void graceful_clear() } if (i == ACTIVE_NOTIFS_MAX) { - pthread_mutex_unlock(Control.poll_mutex); + control_unlock(); return; } @@ -164,7 +184,7 @@ void* do_playing(void* _p) (void)_p; int i; while(Control.poll_active) { - pthread_mutex_lock(Control.poll_mutex); + control_lock(); for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) { if (actives[i].active && !actives[i].looping #ifdef _BOX_NOTIFY @@ -172,44 +192,43 @@ void* do_playing(void* _p) #endif ) { if (!is_playing(actives[i].source)) { - /* Close */ - + /* Close */ alSourceStop(actives[i].source); alDeleteSources(1, &actives[i].source); alDeleteBuffers(1,&actives[i].buffer); memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); } - } + } #ifdef _BOX_NOTIFY - else if (actives[i].box && !actives[i].looping && - time(NULL) >= actives[i].timeout && !is_playing(actives[i].source)) + else if (actives[i].box && time(NULL) >= actives[i].n_timeout) { - alSourceStop(actives[i].source); - alDeleteSources(1, &actives[i].source); - alDeleteBuffers(1,&actives[i].buffer); - memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); - GError* ignore; notify_notification_close(actives[i].box, &ignore); - memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); - assert(0); + actives[i].box = NULL; + + if(actives[i].id_indicator) *actives[i].id_indicator = -1; // reset indicator value + + if (!actives[i].looping && !is_playing(actives[i].source)) { + /* stop source if not looping or playing, just terminate box */ + alSourceStop(actives[i].source); + alDeleteSources(1, &actives[i].source); + alDeleteBuffers(1,&actives[i].buffer); + memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); + } } #endif } - pthread_mutex_unlock(Control.poll_mutex); + control_unlock(); usleep(10000); } pthread_exit(NULL); } - int play_source(uint32_t source, uint32_t buffer, _Bool looping) { - pthread_mutex_lock(Control.poll_mutex); int i = 0; for (; i < ACTIVE_NOTIFS_MAX && actives[i].active; i ++); if ( i == ACTIVE_NOTIFS_MAX ) { - pthread_mutex_unlock(Control.poll_mutex); return -1; /* Full */ } @@ -220,10 +239,53 @@ int play_source(uint32_t source, uint32_t buffer, _Bool looping) actives[i].buffer = buffer; actives[i].looping = looping; - pthread_mutex_unlock(Control.poll_mutex); return i; } + +#elif _BOX_NOTIFY +void* do_playing(void* _p) +{ + (void)_p; + int i; + while(Control.poll_active) { + control_lock(); + for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) { + if (actives[i].box && time(NULL) >= actives[i].n_timeout) + { + GError* ignore; + notify_notification_close(actives[i].box, &ignore); + actives[i].box = NULL; + + if(actives[i].id_indicator) *actives[i].id_indicator = -1; // reset indicator value + memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); + } + } + control_unlock(); + usleep(10000); + } + pthread_exit(NULL); +} + +void graceful_clear() +{ + int i; + control_lock(); + + for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) { + if (actives[i].box) { + GError* ignore; + notify_notification_close(actives[i].box, &ignore); + actives[i].box = NULL; + } + + if(actives[i].id_indicator) *actives[i].id_indicator = -1; // reset indicator value + memset(&actives[i], 0, sizeof(struct _ActiveNotifications)); + } + + control_unlock(); +} #endif + /**********************************************************************************/ /**********************************************************************************/ /**********************************************************************************/ @@ -239,7 +301,9 @@ int init_notify(int login_cooldown, int notification_timeout) alutInitWithoutContext(NULL, NULL); if (open_primary_device(output, &Control.device_idx, 48000, 20, 1) != de_None) return -1; +#endif /* _SOUND_NOTIFY */ +#if defined(_SOUND_NOTIFY) || defined(_BOX_NOTIFY) pthread_mutex_init(Control.poll_mutex, NULL); pthread_t thread; if (pthread_create(&thread, NULL, do_playing, NULL) != 0 || pthread_detach(thread) != 0 ) { @@ -247,7 +311,7 @@ int init_notify(int login_cooldown, int notification_timeout) return -1; } Control.poll_active = 1; -#endif /* _SOUND_NOTIFY */ +#endif Control.cooldown = time(NULL) + login_cooldown; #ifdef _X11 @@ -266,19 +330,20 @@ int init_notify(int login_cooldown, int notification_timeout) } void terminate_notify() -{ -#ifdef _SOUND_NOTIFY +{ +#if defined(_SOUND_NOTIFY) || defined(_BOX_NOTIFY) if ( !Control.poll_active ) return; Control.poll_active = 0; + graceful_clear(); +#endif + +#ifdef _SOUND_NOTIFY int i = 0; for (; i < SOUNDS_SIZE; i ++) free(Control.sounds[i]); - - graceful_clear(); close_device(output, Control.device_idx); alutExit(); -#endif /* _SOUND_NOTIFY */ - +#endif /* _SOUND_NOTIFY */ #ifdef _BOX_NOTIFY notify_uninit(); @@ -328,7 +393,7 @@ int play_notify_sound(Notification notif, uint64_t flags) if (flags & NT_BEEP) beep(); else if (notif != silent) { - if ( !Control.poll_active || (flags & NT_RESTOL && Control.cooldown > time(NULL)) || !Control.sounds[notif] ) + if ( !Control.poll_active || !Control.sounds[notif] ) return -1; rc = play_sound_internal(notif, flags & NT_LOOP ? 1 : 0); @@ -338,14 +403,21 @@ int play_notify_sound(Notification notif, uint64_t flags) } -void stop_sound(int sound) +void stop_sound(int id) { - if (sound >= 0 && sound < ACTIVE_NOTIFS_MAX && actives[sound].looping && actives[sound].active ) { - alSourcei(actives[sound].source, AL_LOOPING, false); - alSourceStop(actives[sound].source); - alDeleteSources(1, &actives[sound].source); - alDeleteBuffers(1,&actives[sound].buffer); - memset(&actives[sound], 0, sizeof(struct _ActiveNotifications)); + if (id >= 0 && id < ACTIVE_NOTIFS_MAX && actives[id].looping && actives[id].active ) { +#ifdef _BOX_NOTIFY + if (actives[id].box) { + GError* ignore; + notify_notification_close(actives[id].box, &ignore); + } +#endif + *actives[id].id_indicator = -1; +// alSourcei(actives[id].source, AL_LOOPING, false); + alSourceStop(actives[id].source); + alDeleteSources(1, &actives[id].source); + alDeleteBuffers(1,&actives[id].buffer); + memset(&actives[id], 0, sizeof(struct _ActiveNotifications)); } } #endif @@ -359,11 +431,16 @@ static int m_play_sound(Notification notif, uint64_t flags) beep(); return -1; -#endif /* _SOUND_NOTIFY */ - +#endif /* _SOUND_NOTIFY */ } -int notify(ToxWindow* self, Notification notif, uint64_t flags) +#ifdef _BOX_NOTIFY +void m_notify_action(NotifyNotification *box, char *action, void* data) +{ +} +#endif + +int sound_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_indicator) { /* Consider colored notify as primary */ if (self && self->alert == WINDOW_ALERT_NONE) { @@ -372,43 +449,119 @@ int notify(ToxWindow* self, Notification notif, uint64_t flags) else if (flags & NT_WNDALERT_2) self->alert = WINDOW_ALERT_2; } - if (flags & NT_NOFOCUS && Control.this_window == get_focused_window_id()) + if ((flags & NT_RESTOL && Control.cooldown > time(NULL)) || + ((flags & NT_NOFOCUS && Control.this_window == get_focused_window_id()) )) return -1; - int rc = -1; + int id = -1; + control_lock(); if (self && (!self->stb || self->stb->status != TOX_USERSTATUS_BUSY) && user_settings_->alerts == ALERTS_ENABLED) - rc = m_play_sound(notif, flags); + id = m_play_sound(notif, flags); else if (flags & NT_ALWAYS) - rc = m_play_sound(notif, flags); + id = m_play_sound(notif, flags); - return rc; +#if defined(_BOX_NOTIFY) && !defined(_SOUND_NOTIFY) + + if (id == -1) { + for (id = 0; id < ACTIVE_NOTIFS_MAX && actives[id].box; id ++); + if ( id == ACTIVE_NOTIFS_MAX ) { + control_unlock(); + return -1; /* Full */ + } + } + +#endif + + if ( id_indicator && id != -1 ) { + actives[id].id_indicator = id_indicator; + *id_indicator = id; + } + + control_unlock(); + + return id; } -int box_notify(ToxWindow* self, Notification notif, uint64_t flags, char* title, char* format, ...) +int sound_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id) { + /* Consider colored notify as primary */ + if (self && self->alert == WINDOW_ALERT_NONE) { + if (flags & NT_WNDALERT_0) self->alert = WINDOW_ALERT_0; + else if (flags & NT_WNDALERT_1) self->alert = WINDOW_ALERT_1; + else if (flags & NT_WNDALERT_2) self->alert = WINDOW_ALERT_2; + } + + if ((flags & NT_RESTOL && Control.cooldown > time(NULL)) || + ((flags & NT_NOFOCUS && Control.this_window == get_focused_window_id()) )) + return -1; + + if (id < 0 || id >= ACTIVE_NOTIFS_MAX) return -1; +#ifdef _SOUND_NOTIFY + control_lock(); + + if (!actives[id].active || !Control.sounds[notif]) { + control_unlock(); + return -1; + } + + alSourceStop(actives[id].source); + alDeleteSources(1, &actives[id].source); + alDeleteBuffers(1,&actives[id].buffer); + + + alGenSources(1, &actives[id].source); + alGenBuffers(1, &actives[id].buffer); + actives[id].buffer = alutCreateBufferFromFile(Control.sounds[notif]); + alSourcei(actives[id].source, AL_BUFFER, actives[id].buffer); + alSourcei(actives[id].source, AL_LOOPING, flags & NT_LOOP); + + alSourcePlay(actives[id].source); + + control_unlock(); + + return id; +#else + if (notif != silent) + beep(); + + return 0; +#endif /* _SOUND_NOTIFY */ +} + +int box_notify(ToxWindow* self, Notification notif, uint64_t flags, int* id_indicator, char* title, const char* format, ...) +{ + if ((flags & NT_RESTOL && Control.cooldown > time(NULL)) || + ((flags & NT_NOFOCUS && Control.this_window == get_focused_window_id()) )) + return -1; + #ifdef _BOX_NOTIFY - int id = notify(self, notif, flags); - pthread_mutex_lock(Control.poll_mutex); + int id = sound_notify(self, notif, flags, id_indicator); - if (id == -1 && !(flags & NT_NOFOCUS && Control.this_window == get_focused_window_id())) { /* Could not play */ + control_lock(); + +#ifdef _SOUND_NOTIFY + if (id == -1) { /* Could not play */ for (id = 0; id < ACTIVE_NOTIFS_MAX && actives[id].active; id ++); if ( id == ACTIVE_NOTIFS_MAX ) { - pthread_mutex_unlock(Control.poll_mutex); + control_unlock(); return -1; /* Full */ } - actives[id].active = 1; + actives[id].active = 1; + actives[id].id_indicator = id_indicator; + if (id_indicator) *id_indicator = id; } +#endif strncpy(actives[id].title, title, 24); if (strlen(title) > 23) strcpy(actives[id].title + 20, "..."); va_list __ARGS__; va_start (__ARGS__, format); - snprintf (actives[id].messages[0], 127, format, __ARGS__); + vsnprintf (actives[id].messages[0], 127, format, __ARGS__); va_end (__ARGS__); if (strlen(actives[id].messages[0]) > 124) @@ -416,46 +569,48 @@ int box_notify(ToxWindow* self, Notification notif, uint64_t flags, char* title, actives[id].box = notify_notification_new(actives[id].title, actives[id].messages[0], NULL); actives[id].size ++; - actives[id].timeout = time(NULL) + Control.notif_timeout; + actives[id].n_timeout = time(NULL) + Control.notif_timeout / 1000; notify_notification_set_timeout(actives[id].box, Control.notif_timeout); + notify_notification_set_app_name(actives[id].box, "toxic"); + /*notify_notification_add_action(actives[id].box, "lel", "default", m_notify_action, self, NULL);*/ notify_notification_show(actives[id].box, NULL); - pthread_mutex_unlock(Control.poll_mutex); + control_unlock(); return id; #else - return notify(self, notif, flags); + return sound_notify(self, notif, flags, id_indicator); #endif } -int box_notify_append(ToxWindow* self, Notification notif, uint64_t flags, int id, char* format, ...) +int box_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id, const char* format, ...) { + if ((flags & NT_RESTOL && Control.cooldown > time(NULL)) || + ((flags & NT_NOFOCUS && Control.this_window == get_focused_window_id()) )) + return -1; + #ifdef _BOX_NOTIFY - if (id < 0 || id >= ACTIVE_NOTIFS_MAX || !actives[id].box || actives[id].size >= 128 ) return -1; - /* Consider colored notify as primary */ - if (self && self->alert == WINDOW_ALERT_NONE) { - if (flags & NT_WNDALERT_0) self->alert = WINDOW_ALERT_0; - else if (flags & NT_WNDALERT_1) self->alert = WINDOW_ALERT_1; - else if (flags & NT_WNDALERT_2) self->alert = WINDOW_ALERT_2; - } - if (flags & NT_NOFOCUS && Control.this_window == get_focused_window_id()) + if (sound_notify2(self, notif, flags, id) == -1) return -1; - pthread_mutex_lock(Control.poll_mutex); + control_lock(); + + if (!actives[id].box || actives[id].size >= 128 ) { + control_unlock(); + return -1; + } - /* Play the sound again */ - alSourcePlay(actives[id].source); va_list __ARGS__; va_start (__ARGS__, format); - snprintf (actives[id].messages[actives[id].size], 127, format, __ARGS__); + vsnprintf (actives[id].messages[actives[id].size], 127, format, __ARGS__); va_end (__ARGS__); - if (strlen(actives[id].messages[actives[id].size]) > 124) + if (strlen(actives[id].messages[actives[id].size]) > 124) strcpy(actives[id].messages[actives[id].size] + 124, "..."); actives[id].size ++; - actives[id].timeout = time(NULL) + Control.notif_timeout; + actives[id].n_timeout = time(NULL) + Control.notif_timeout / 1000; char formated[128 * 129] = {'\0'}; @@ -470,10 +625,119 @@ int box_notify_append(ToxWindow* self, Notification notif, uint64_t flags, int i notify_notification_update(actives[id].box, actives[id].title, formated, NULL); notify_notification_show(actives[id].box, NULL); - pthread_mutex_unlock(Control.poll_mutex); + control_unlock(); return id; #else - return notify(self, notif, flags); + return sound_notify2(self, notif, flags, id); +#endif +} + +int box_silent_notify(ToxWindow* self, uint64_t flags, int* id_indicator, const char* title, const char* format, ...) +{ + /* Always do colored notify */ + if (self && self->alert == WINDOW_ALERT_NONE) { + if (flags & NT_WNDALERT_0) self->alert = WINDOW_ALERT_0; + else if (flags & NT_WNDALERT_1) self->alert = WINDOW_ALERT_1; + else if (flags & NT_WNDALERT_2) self->alert = WINDOW_ALERT_2; + } + + if ((flags & NT_RESTOL && Control.cooldown > time(NULL)) || + ((flags & NT_NOFOCUS && Control.this_window == get_focused_window_id()) )) + return -1; + +#ifdef _BOX_NOTIFY + + control_lock(); + + int id; + for (id = 0; id < ACTIVE_NOTIFS_MAX && actives[id].active; id ++); + if ( id == ACTIVE_NOTIFS_MAX ) { + control_unlock(); + return -1; /* Full */ + } + + if (id_indicator) { + actives[id].id_indicator = id_indicator; + *id_indicator = id; + } + + strncpy(actives[id].title, title, 24); + if (strlen(title) > 23) strcpy(actives[id].title + 20, "..."); + + va_list __ARGS__; va_start (__ARGS__, format); + vsnprintf (actives[id].messages[0], 127, format, __ARGS__); + va_end (__ARGS__); + + if (strlen(actives[id].messages[0]) > 124) + strcpy(actives[id].messages[0] + 124, "..."); + + actives[id].active = 1; + actives[id].box = notify_notification_new(actives[id].title, actives[id].messages[0], NULL); + actives[id].size ++; + actives[id].n_timeout = time(NULL) + Control.notif_timeout / 1000; + + notify_notification_set_timeout(actives[id].box, Control.notif_timeout); + notify_notification_set_app_name(actives[id].box, "toxic"); + /*notify_notification_add_action(actives[id].box, "lel", "default", m_notify_action, self, NULL);*/ + notify_notification_show(actives[id].box, NULL); + + control_unlock(); + return id; +#else + return -1; +#endif +} + +int box_silent_notify2(ToxWindow* self, uint64_t flags, int id, const char* format, ...) +{ + /* Always do colored notify */ + if (self && self->alert == WINDOW_ALERT_NONE) { + if (flags & NT_WNDALERT_0) self->alert = WINDOW_ALERT_0; + else if (flags & NT_WNDALERT_1) self->alert = WINDOW_ALERT_1; + else if (flags & NT_WNDALERT_2) self->alert = WINDOW_ALERT_2; + } + + if ((flags & NT_RESTOL && Control.cooldown > time(NULL)) || + ((flags & NT_NOFOCUS && Control.this_window == get_focused_window_id()) )) + return -1; + +#ifdef _BOX_NOTIFY + control_lock(); + + if (id < 0 || id >= ACTIVE_NOTIFS_MAX || !actives[id].box || actives[id].size >= 128 ) { + control_unlock(); + return -1; + } + + + va_list __ARGS__; va_start (__ARGS__, format); + vsnprintf (actives[id].messages[actives[id].size], 127, format, __ARGS__); + va_end (__ARGS__); + + if (strlen(actives[id].messages[actives[id].size]) > 124) + strcpy(actives[id].messages[actives[id].size] + 124, "..."); + + actives[id].size ++; + actives[id].n_timeout = time(NULL) + Control.notif_timeout / 1000; + + char formated[128 * 129] = {'\0'}; + + int i = 0; + for (; i start = wlen < x2 ? 0 : wlen - x2 + 1; } } else { - notify(self, error, 0); + sound_notify(self, error, 0, NULL); } } else { - notify(self, error, 0); + sound_notify(self, error, 0, NULL); } } else if (key == '\n') { rm_trailing_spaces_buf(ctx); @@ -309,13 +309,23 @@ static void prompt_onConnectionChange(ToxWindow *self, Tox *m, int32_t friendnum line_info_add(self, timefrmt, nick, NULL, CONNECTION, 0, GREEN, msg); write_to_log(msg, nick, ctx->log, true); - notify(self, user_log_in, NT_WNDALERT_2 | NT_NOTIFWND | NT_RESTOL); + if (self->active_box != -1) + box_notify2(self, user_log_in, NT_WNDALERT_2 | NT_NOTIFWND | NT_RESTOL, self->active_box, + "%s has come online", nick ); + else + box_notify(self, user_log_in, NT_WNDALERT_2 | NT_NOTIFWND | NT_RESTOL, &self->active_box, + "Toxic", "%s has come online", nick ); } else { msg = "has gone offline"; line_info_add(self, timefrmt, nick, NULL, CONNECTION, 0, RED, msg); write_to_log(msg, nick, ctx->log, true); - notify(self, user_log_out, NT_WNDALERT_2 | NT_NOTIFWND | NT_RESTOL); + if (self->active_box != -1) + box_notify2(self, user_log_out, NT_WNDALERT_2 | NT_NOTIFWND | NT_RESTOL, self->active_box, + "%s has gone offline", nick ); + else + box_notify(self, user_log_out, NT_WNDALERT_2 | NT_NOTIFWND | NT_RESTOL, &self->active_box, + "Toxic", "%s has gone offline", nick ); } } @@ -342,7 +352,7 @@ static void prompt_onFriendRequest(ToxWindow *self, Tox *m, const char *key, con msg = "Type \"/accept %d\" to accept it."; line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, msg, n); - notify(self, generic_message, NT_WNDALERT_1 | NT_NOTIFWND); + sound_notify(self, generic_message, NT_WNDALERT_1 | NT_NOTIFWND, NULL); } void prompt_init_statusbar(ToxWindow *self, Tox *m) @@ -458,5 +468,7 @@ ToxWindow new_prompt(void) ret.stb = stb; ret.help = help; + ret.active_box = -1; + return ret; } diff --git a/src/toxic.c b/src/toxic.c index d11d880..9fb98fe 100644 --- a/src/toxic.c +++ b/src/toxic.c @@ -97,7 +97,7 @@ void exit_toxic_success(Tox *m) free(user_settings_); #ifdef _SOUND_NOTIFY - notify(NULL, self_log_out, NT_ALWAYS); +// sound_notify(NULL, self_log_out, NT_ALWAYS, NULL); #endif /* _SOUND_NOTIFY */ terminate_notify(); #ifdef _AUDIO @@ -667,11 +667,11 @@ int main(int argc, char *argv[]) init_notify(60, 3000); #ifdef _SOUND_NOTIFY - notify(prompt, self_log_in, 0); +// sound_notify(prompt, self_log_in, 0, NULL); #endif /* _SOUND_NOTIFY */ const char *msg; - + if (config_err) { msg = "Unable to determine configuration directory. Defaulting to 'data' for data file..."; line_info_add(prompt, NULL, NULL, NULL, SYS_MSG, 0, 0, msg); @@ -687,6 +687,12 @@ int main(int argc, char *argv[]) useconds_t msleepval = 40000; uint64_t loopcount = 0; + + /* Redirect stdout to /dev/null + * NOTE: Might not be best solution + */ + freopen("/dev/null", "w", stderr); + while (true) { update_unix_time(); do_toxic(m, prompt); diff --git a/src/toxic_strings.c b/src/toxic_strings.c index d3fff7c..a564f77 100644 --- a/src/toxic_strings.c +++ b/src/toxic_strings.c @@ -192,7 +192,7 @@ void fetch_hist_item(ChatContext *ctx, int key_dir) if (key_dir == KEY_UP) { if (--ctx->hst_pos < 0) { ctx->hst_pos = 0; - notify(NULL, error, NT_ALWAYS); + sound_notify(NULL, error, NT_ALWAYS, NULL); } } else { if (++ctx->hst_pos >= ctx->hst_tot) { diff --git a/src/windows.h b/src/windows.h index 109eb78..529487b 100644 --- a/src/windows.h +++ b/src/windows.h @@ -124,12 +124,11 @@ struct ToxWindow { * Don't modify outside av callbacks. */ int device_selection[2]; /* -1 if not set, if set uses these selections instead of primary device */ + int ringing_sound; #endif /* _AUDIO */ -#ifdef _SOUND_NOTIFY - int active_sound; -#endif - + int active_box; /* For box notify */ + char name[TOXIC_MAX_NAME_LENGTH]; int32_t num; /* corresponds to friendnumber in chat windows */ bool active;