diff --git a/src/config/preferences.c b/src/config/preferences.c index 2051e66b..205d47df 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -202,6 +202,47 @@ prefs_reset_room_trigger_ac(void) autocomplete_reset(room_trigger_ac); } +gboolean +prefs_get_notify_chat(gboolean current_win) +{ + gboolean notify_message = prefs_get_boolean(PREF_NOTIFY_MESSAGE); + gboolean notify_window = FALSE; + + if (!current_win || (current_win && prefs_get_boolean(PREF_NOTIFY_MESSAGE_CURRENT)) ) { + notify_window = TRUE; + } + + return (notify_message && notify_window); +} + +gboolean +prefs_get_notify_room(gboolean current_win, const char *const nick, const char *const message) +{ + gboolean notify_message = FALSE; + gboolean notify_window = FALSE; + + char *room_setting = prefs_get_string(PREF_NOTIFY_ROOM); + if (g_strcmp0(room_setting, "on") == 0) { + notify_message = TRUE; + } + if (g_strcmp0(room_setting, "mention") == 0) { + char *message_lower = g_utf8_strdown(message, -1); + char *nick_lower = g_utf8_strdown(nick, -1); + if (g_strrstr(message_lower, nick_lower)) { + notify_message = TRUE; + } + g_free(message_lower); + g_free(nick_lower); + } + prefs_free_string(room_setting); + + if (!current_win || (current_win && prefs_get_boolean(PREF_NOTIFY_ROOM_CURRENT)) ) { + notify_window = TRUE; + } + + return (notify_message && notify_window); +} + gboolean prefs_get_boolean(preference_t pref) { diff --git a/src/config/preferences.h b/src/config/preferences.h index 9038591d..face1811 100644 --- a/src/config/preferences.h +++ b/src/config/preferences.h @@ -213,4 +213,7 @@ char* prefs_get_string(preference_t pref); void prefs_free_string(char *pref); void prefs_set_string(preference_t pref, char *value); +gboolean prefs_get_notify_chat(gboolean current_win); +gboolean prefs_get_notify_room(gboolean current_win, const char *const nick, const char *const message); + #endif diff --git a/src/ui/chatwin.c b/src/ui/chatwin.c index c34cc1fc..2efe82e1 100644 --- a/src/ui/chatwin.c +++ b/src/ui/chatwin.c @@ -274,8 +274,32 @@ chatwin_incoming_msg(ProfChatWin *chatwin, const char *const resource, const cha beep(); } - if (prefs_get_boolean(PREF_NOTIFY_MESSAGE)) { - notify_message(window, display_name, message); + if (!prefs_get_boolean(PREF_NOTIFY_MESSAGE)) { + free(display_name); + return; + } + + gboolean notify = FALSE; + + gboolean is_current = wins_is_current(window); + if (!is_current || (is_current && prefs_get_boolean(PREF_NOTIFY_MESSAGE_CURRENT)) ) { + notify = TRUE; + } + + if (!notify) { + free(display_name); + return; + } + + int ui_index = num; + if (ui_index == 10) { + ui_index = 0; + } + + if (prefs_get_boolean(PREF_NOTIFY_MESSAGE_TEXT)) { + notify_message(display_name, ui_index, message); + } else { + notify_message(display_name, ui_index, NULL); } free(display_name); diff --git a/src/ui/mucwin.c b/src/ui/mucwin.c index 58fef4d1..aa825d16 100644 --- a/src/ui/mucwin.c +++ b/src/ui/mucwin.c @@ -390,11 +390,6 @@ mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const mes mucwin->unread++; } - int ui_index = num; - if (ui_index == 10) { - ui_index = 0; - } - // don't notify self messages if (strcmp(nick, my_nick) == 0) { return; @@ -404,34 +399,24 @@ mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const mes beep(); } - gboolean notify = FALSE; - char *room_setting = prefs_get_string(PREF_NOTIFY_ROOM); - if (g_strcmp0(room_setting, "on") == 0) { - notify = TRUE; + gboolean is_current = wins_is_current(window); + gboolean notify = prefs_get_notify_room(is_current, my_nick, message); + if (!notify) { + return; } - if (g_strcmp0(room_setting, "mention") == 0) { - char *message_lower = g_utf8_strdown(message, -1); - char *nick_lower = g_utf8_strdown(nick, -1); - if (g_strrstr(message_lower, nick_lower)) { - notify = TRUE; - } - g_free(message_lower); - g_free(nick_lower); - } - prefs_free_string(room_setting); - if (notify) { - gboolean is_current = wins_is_current(window); - if ( !is_current || (is_current && prefs_get_boolean(PREF_NOTIFY_ROOM_CURRENT)) ) { - Jid *jidp = jid_create(mucwin->roomjid); - if (prefs_get_boolean(PREF_NOTIFY_ROOM_TEXT)) { - notify_room_message(nick, jidp->localpart, ui_index, message); - } else { - notify_room_message(nick, jidp->localpart, ui_index, NULL); - } - jid_destroy(jidp); - } + Jid *jidp = jid_create(mucwin->roomjid); + int ui_index = num; + if (ui_index == 10) { + ui_index = 0; } + + if (prefs_get_boolean(PREF_NOTIFY_ROOM_TEXT)) { + notify_room_message(nick, jidp->localpart, ui_index, message); + } else { + notify_room_message(nick, jidp->localpart, ui_index, NULL); + } + jid_destroy(jidp); } void diff --git a/src/ui/notifier.c b/src/ui/notifier.c index 9127b1e7..c0861009 100644 --- a/src/ui/notifier.c +++ b/src/ui/notifier.c @@ -73,17 +73,16 @@ notifier_uninit(void) } void -notify_typing(const char *const handle) +notify_typing(const char *const name) { - char message[strlen(handle) + 1 + 11]; - sprintf(message, "%s: typing...", handle); + char message[strlen(name) + 1 + 11]; + sprintf(message, "%s: typing...", name); _notify(message, 10000, "Incoming message"); } void -notify_invite(const char *const from, const char *const room, - const char *const reason) +notify_invite(const char *const from, const char *const room, const char *const reason) { GString *message = g_string_new("Room invite\nfrom: "); g_string_append(message, from); @@ -99,32 +98,24 @@ notify_invite(const char *const from, const char *const room, } void -notify_message(ProfWin *window, const char *const name, const char *const text) +notify_message(const char *const name, int win, const char *const text) { - int num = wins_get_num(window); - if (num == 10) { - num = 0; + GString *message = g_string_new(""); + g_string_append_printf(message, "%s (win %d)", name, win); + if (text) { + g_string_append_printf(message, "\n%s", text); } - gboolean is_current = wins_is_current(window); - if (!is_current || (is_current && prefs_get_boolean(PREF_NOTIFY_MESSAGE_CURRENT)) ) { - GString *message = g_string_new(""); - g_string_append_printf(message, "%s (win %d)", name, num); + _notify(message->str, 10000, "incoming message"); - if (prefs_get_boolean(PREF_NOTIFY_MESSAGE_TEXT) && text) { - g_string_append_printf(message, "\n%s", text); - } - - _notify(message->str, 10000, "incoming message"); - g_string_free(message, TRUE); - } + g_string_free(message, TRUE); } void -notify_room_message(const char *const handle, const char *const room, int win, const char *const text) +notify_room_message(const char *const nick, const char *const room, int win, const char *const text) { GString *message = g_string_new(""); - g_string_append_printf(message, "%s in %s (win %d)", handle, room, win); + g_string_append_printf(message, "%s in %s (win %d)", nick, room, win); if (text) { g_string_append_printf(message, "\n%s", text); } diff --git a/src/ui/privwin.c b/src/ui/privwin.c index 6031a2c0..10ce1dbe 100644 --- a/src/ui/privwin.c +++ b/src/ui/privwin.c @@ -75,8 +75,32 @@ privwin_incoming_msg(ProfPrivateWin *privatewin, const char *const message, GDat beep(); } - if (prefs_get_boolean(PREF_NOTIFY_MESSAGE)) { - notify_message(window, display_from, message); + if (!prefs_get_boolean(PREF_NOTIFY_MESSAGE)) { + free(display_from); + return; + } + + gboolean notify = FALSE; + + gboolean is_current = wins_is_current(window); + if (!is_current || (is_current && prefs_get_boolean(PREF_NOTIFY_MESSAGE_CURRENT)) ) { + notify = TRUE; + } + + if (!notify) { + free(display_from); + return; + } + + int ui_index = num; + if (ui_index == 10) { + ui_index = 0; + } + + if (prefs_get_boolean(PREF_NOTIFY_MESSAGE_TEXT)) { + notify_message(display_from, ui_index, message); + } else { + notify_message(display_from, ui_index, NULL); } free(display_from); diff --git a/src/ui/ui.h b/src/ui/ui.h index 032a1161..3cc40001 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -339,9 +339,9 @@ void win_clear(ProfWin *window); // desktop notifications void notifier_initialise(void); void notifier_uninit(void); -void notify_typing(const char *const handle); -void notify_message(ProfWin *window, const char *const name, const char *const text); -void notify_room_message(const char *const handle, const char *const room, int win, const char *const text); +void notify_typing(const char *const name); +void notify_message(const char *const name, int win, const char *const text); +void notify_room_message(const char *const nick, const char *const room, int win, const char *const text); void notify_remind(void); void notify_invite(const char *const from, const char *const room, const char *const reason); void notify_subscription(const char *const from); diff --git a/tests/unittests/ui/stub_ui.c b/tests/unittests/ui/stub_ui.c index 084b36be..4cab2ea9 100644 --- a/tests/unittests/ui/stub_ui.c +++ b/tests/unittests/ui/stub_ui.c @@ -514,7 +514,7 @@ void win_clear(ProfWin *window) {} void notifier_uninit(void) {} void notify_typing(const char * const handle) {} -void notify_message(ProfWin *window, const char * const name, const char * const text) {} +void notify_message(const char *const name, int win, const char *const text) {} void notify_room_message(const char * const handle, const char * const room, int win, const char * const text) {} void notify_remind(void) {}