about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2016-02-04 01:24:37 +0000
committerJames Booth <boothj5@gmail.com>2016-02-04 01:24:37 +0000
commit6702bb9739ffae6f1b905e15fc9504773e0e64c4 (patch)
tree76a36311c65d3df49fbd911ed3bf31fb1a28a727
parente1962261a90ceb12860ad64c564a610730c2cc6f (diff)
downloadprofani-tty-6702bb9739ffae6f1b905e15fc9504773e0e64c4.tar.gz
Don't show notification reminders for messages the user does not want notifications for
-rw-r--r--src/config/preferences.c8
-rw-r--r--src/config/preferences.h4
-rw-r--r--src/event/server_events.c38
-rw-r--r--src/ui/chatwin.c4
-rw-r--r--src/ui/privwin.c3
-rw-r--r--src/ui/win_types.h3
-rw-r--r--src/ui/window.c43
-rw-r--r--src/window_list.c3
8 files changed, 57 insertions, 49 deletions
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;
         }
     }
 }