diff --git a/src/config/preferences.c b/src/config/preferences.c index af89b0c6..8642e20a 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -228,9 +228,13 @@ prefs_message_get_triggers(const char *const message) } gboolean -prefs_do_room_notify(gboolean current_win, const char *const roomjid, const char *const nick, const char *const message, - gboolean mention, gboolean trigger_found) +prefs_do_room_notify(gboolean current_win, const char *const roomjid, const char *const mynick, + const char *const theirnick, const char *const message, gboolean mention, gboolean trigger_found) { + if (g_strcmp0(mynick, theirnick) == 0) { + return FALSE; + } + gboolean notify_current = prefs_get_boolean(PREF_NOTIFY_ROOM_CURRENT); gboolean notify_window = FALSE; if (!current_win || (current_win && notify_current) ) { diff --git a/src/config/preferences.h b/src/config/preferences.h index baf43953..8afb2707 100644 --- a/src/config/preferences.h +++ b/src/config/preferences.h @@ -232,8 +232,8 @@ void prefs_free_string(char *pref); void prefs_set_string(preference_t pref, char *value); gboolean prefs_do_chat_notify(gboolean current_win); -gboolean prefs_do_room_notify(gboolean current_win, const char *const roomjid, const char *const nick, - const char *const message, gboolean mention, gboolean trigger_found); +gboolean prefs_do_room_notify(gboolean current_win, const char *const roomjid, const char *const mynick, + const char *const theirnick, const char *const message, gboolean mention, gboolean trigger_found); GList* prefs_message_get_triggers(const char *const message); void prefs_set_room_notify(const char *const roomjid, gboolean value); diff --git a/src/event/server_events.c b/src/event/server_events.c index 42d75cdb..0b11fbfa 100644 --- a/src/event/server_events.c +++ b/src/event/server_events.c @@ -259,28 +259,29 @@ sv_ev_room_message(const char *const room_jid, const char *const nick, const cha mucwin_message(mucwin, nick, message, mention, triggers != NULL); ProfWin *window = (ProfWin*)mucwin; - gboolean is_current = wins_is_current(window); int num = wins_get_num(window); - gboolean notify = prefs_do_room_notify(is_current, mucwin->roomjid, mynick, message, mention, triggers != NULL); + gboolean is_current = FALSE; // currently in groupchat window if (wins_is_current(window)) { + is_current = TRUE; status_bar_active(num); + if ((g_strcmp0(mynick, nick) != 0) && (prefs_get_boolean(PREF_BEEP))) { + beep(); + } + // not currently on groupchat window } else { status_bar_new(num); - cons_show_incoming_room_message(nick, mucwin->roomjid, num, mention, triggers, mucwin->unread); - - if (prefs_get_boolean(PREF_FLASH) && (strcmp(nick, mynick) != 0)) { + if ((g_strcmp0(mynick, nick) != 0) && (prefs_get_boolean(PREF_FLASH))) { flash(); } + cons_show_incoming_room_message(nick, mucwin->roomjid, num, mention, triggers, mucwin->unread); + mucwin->unread++; - if (notify) { - mucwin->notify = TRUE; - } if (mention) { mucwin->unread_mentions = TRUE; @@ -290,26 +291,17 @@ sv_ev_room_message(const char *const room_jid, const char *const nick, const cha } } + if (prefs_do_room_notify(is_current, mucwin->roomjid, mynick, nick, message, mention, triggers != NULL)) { + Jid *jidp = jid_create(mucwin->roomjid); + notify_room_message(nick, jidp->localpart, num, message); + jid_destroy(jidp); + } + if (triggers) { g_list_free_full(triggers, free); } rosterwin_roster(); - - // don't notify self messages - if (strcmp(nick, mynick) == 0) { - return; - } - - if (prefs_get_boolean(PREF_BEEP)) { - beep(); - } - - if (notify) { - Jid *jidp = jid_create(mucwin->roomjid); - notify_room_message(nick, jidp->localpart, num, message); - jid_destroy(jidp); - } } void diff --git a/src/ui/chatwin.c b/src/ui/chatwin.c index b086619e..1a87cbd8 100644 --- a/src/ui/chatwin.c +++ b/src/ui/chatwin.c @@ -258,9 +258,7 @@ chatwin_incoming_msg(ProfChatWin *chatwin, const char *const resource, const cha } chatwin->unread++; - if (notify) { - chatwin->notify = TRUE; - } + if (prefs_get_boolean(PREF_CHLOG) && prefs_get_boolean(PREF_HISTORY)) { _chatwin_history(chatwin, chatwin->barejid); } diff --git a/src/ui/privwin.c b/src/ui/privwin.c index c47a7565..d1f26cba 100644 --- a/src/ui/privwin.c +++ b/src/ui/privwin.c @@ -72,9 +72,6 @@ privwin_incoming_msg(ProfPrivateWin *privatewin, const char *const message, GDat win_print_incoming_message(window, timestamp, jidp->resourcepart, message, PROF_MSG_PLAIN); privatewin->unread++; - if (notify) { - privatewin->notify = TRUE; - } if (prefs_get_boolean(PREF_FLASH)) { flash(); diff --git a/src/ui/win_types.h b/src/ui/win_types.h index 558359a2..54ded939 100644 --- a/src/ui/win_types.h +++ b/src/ui/win_types.h @@ -102,7 +102,6 @@ typedef struct prof_chat_win_t { ProfWin window; char *barejid; int unread; - gboolean notify; ChatState *state; gboolean is_otr; gboolean otr_is_trusted; @@ -119,7 +118,6 @@ typedef struct prof_muc_win_t { int unread; gboolean unread_mentions; gboolean unread_triggers; - gboolean notify; gboolean showjid; unsigned long memcheck; } ProfMucWin; @@ -135,7 +133,6 @@ typedef struct prof_private_win_t { ProfWin window; char *fulljid; int unread; - gboolean notify; unsigned long memcheck; gboolean occupant_offline; gboolean room_left; diff --git a/src/ui/window.c b/src/ui/window.c index d8499ad3..345470b2 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -141,7 +141,6 @@ win_create_chat(const char *const barejid) new_win->pgp_send = FALSE; new_win->history_shown = FALSE; new_win->unread = 0; - new_win->notify = FALSE; new_win->state = chat_state_new(); new_win->memcheck = PROFCHATWIN_MEMCHECK; @@ -183,7 +182,6 @@ win_create_muc(const char *const roomjid) new_win->unread = 0; new_win->unread_mentions = FALSE; new_win->unread_triggers = FALSE; - new_win->notify = FALSE; if (prefs_get_boolean(PREF_OCCUPANTS_JID)) { new_win->showjid = TRUE; } else { @@ -219,7 +217,6 @@ win_create_private(const char *const fulljid) new_win->fulljid = strdup(fulljid); new_win->unread = 0; - new_win->notify = FALSE; new_win->occupant_offline = FALSE; new_win->room_left = FALSE; @@ -1313,19 +1310,45 @@ win_has_active_subwin(ProfWin *window) gboolean win_notify(ProfWin *window) { - if (window->type == WIN_CHAT) { + switch (window->type) { + case WIN_CHAT: + { ProfChatWin *chatwin = (ProfChatWin*) window; assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); - return chatwin->notify; - } else if (window->type == WIN_MUC) { + + if (prefs_get_boolean(PREF_NOTIFY_CHAT) && chatwin->unread > 0) { + return TRUE; + } else { + return FALSE; + } + } + case WIN_MUC: + { ProfMucWin *mucwin = (ProfMucWin*) window; assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); - return mucwin->notify; - } else if (window->type == WIN_PRIVATE) { + + if (prefs_get_room_notify(mucwin->roomjid) && mucwin->unread > 0) { + return TRUE; + } else if (prefs_get_room_notify_mention(mucwin->roomjid) && mucwin->unread_mentions) { + return TRUE; + } else if (prefs_get_room_notify_trigger(mucwin->roomjid) && mucwin->unread_triggers) { + return TRUE; + } else { + return FALSE; + } + } + case WIN_PRIVATE: + { ProfPrivateWin *privatewin = (ProfPrivateWin*) window; assert(privatewin->memcheck == PROFPRIVATEWIN_MEMCHECK); - return privatewin->notify; - } else { + + if (prefs_get_boolean(PREF_NOTIFY_CHAT) && privatewin->unread > 0) { + return TRUE; + } else { + return FALSE; + } + } + default: return FALSE; } } diff --git a/src/window_list.c b/src/window_list.c index bfd1f422..97155294 100644 --- a/src/window_list.c +++ b/src/window_list.c @@ -273,18 +273,15 @@ wins_set_current_by_num(int i) ProfChatWin *chatwin = (ProfChatWin*) window; assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); chatwin->unread = 0; - chatwin->notify = FALSE; } else if (window->type == WIN_MUC) { ProfMucWin *mucwin = (ProfMucWin*) window; assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK); mucwin->unread = 0; mucwin->unread_mentions = FALSE; mucwin->unread_triggers = FALSE; - mucwin->notify = FALSE; } else if (window->type == WIN_PRIVATE) { ProfPrivateWin *privatewin = (ProfPrivateWin*) window; privatewin->unread = 0; - privatewin->notify = FALSE; } } }