about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/config/theme.c2
-rw-r--r--src/config/theme.h1
-rw-r--r--src/event/server_events.c2
-rw-r--r--src/ui/console.c1
-rw-r--r--src/ui/mucwin.c71
-rw-r--r--src/ui/ui.h2
-rw-r--r--tests/unittests/ui/stub_ui.c2
-rw-r--r--theme_template1
-rw-r--r--themes/aqua1
-rw-r--r--themes/batman1
-rw-r--r--themes/bios1
-rw-r--r--themes/boothj53
-rw-r--r--themes/boothj5_slack3
-rw-r--r--themes/forest1
-rw-r--r--themes/hacker1
-rw-r--r--themes/headache1
-rw-r--r--themes/joker1
-rw-r--r--themes/mono1
-rw-r--r--themes/orange1
-rw-r--r--themes/original1
-rw-r--r--themes/original_bright1
-rw-r--r--themes/shade1
-rw-r--r--themes/spawn1
-rw-r--r--themes/whiteness1
24 files changed, 93 insertions, 9 deletions
diff --git a/src/config/theme.c b/src/config/theme.c
index 414bf2b4..d221bd3f 100644
--- a/src/config/theme.c
+++ b/src/config/theme.c
@@ -109,6 +109,7 @@ theme_init(const char *const theme_name)
     g_hash_table_insert(defaults, strdup("roommention"),             strdup("yellow"));
     g_hash_table_insert(defaults, strdup("roommention.term"),        strdup("yellow"));
     g_hash_table_insert(defaults, strdup("roomtrigger"),             strdup("yellow"));
+    g_hash_table_insert(defaults, strdup("roomtrigger.term"),        strdup("yellow"));
     g_hash_table_insert(defaults, strdup("online"),                  strdup("green"));
     g_hash_table_insert(defaults, strdup("offline"),                 strdup("red"));
     g_hash_table_insert(defaults, strdup("away"),                    strdup("cyan"));
@@ -754,6 +755,7 @@ theme_attrs(theme_item_t attrs)
     case THEME_ROOMMENTION:             _theme_prep_fgnd("roommention",             lookup_str, &bold); break;
     case THEME_ROOMMENTION_TERM:        _theme_prep_fgnd("roommention.term",        lookup_str, &bold); break;
     case THEME_ROOMTRIGGER:             _theme_prep_fgnd("roomtrigger",             lookup_str, &bold); break;
+    case THEME_ROOMTRIGGER_TERM:        _theme_prep_fgnd("roomtrigger.term",        lookup_str, &bold); break;
     case THEME_ONLINE:                  _theme_prep_fgnd("online",                  lookup_str, &bold); break;
     case THEME_OFFLINE:                 _theme_prep_fgnd("offline",                 lookup_str, &bold); break;
     case THEME_AWAY:                    _theme_prep_fgnd("away",                    lookup_str, &bold); break;
diff --git a/src/config/theme.h b/src/config/theme.h
index a90fa360..6ea369d9 100644
--- a/src/config/theme.h
+++ b/src/config/theme.h
@@ -72,6 +72,7 @@ typedef enum {
     THEME_ROOMMENTION,
     THEME_ROOMMENTION_TERM,
     THEME_ROOMTRIGGER,
+    THEME_ROOMTRIGGER_TERM,
     THEME_ONLINE,
     THEME_OFFLINE,
     THEME_AWAY,
diff --git a/src/event/server_events.c b/src/event/server_events.c
index 0b11fbfa..a21b27c0 100644
--- a/src/event/server_events.c
+++ b/src/event/server_events.c
@@ -256,7 +256,7 @@ sv_ev_room_message(const char *const room_jid, const char *const nick, const cha
 
     GList *triggers = prefs_message_get_triggers(message);
 
-    mucwin_message(mucwin, nick, message, mention, triggers != NULL);
+    mucwin_message(mucwin, nick, message, mention, triggers);
 
     ProfWin *window = (ProfWin*)mucwin;
     int num = wins_get_num(window);
diff --git a/src/ui/console.c b/src/ui/console.c
index 00957aae..8164ccf1 100644
--- a/src/ui/console.c
+++ b/src/ui/console.c
@@ -2217,6 +2217,7 @@ cons_theme_properties(void)
     _cons_theme_prop(THEME_ROOMMENTION, "roommention");
     _cons_theme_prop(THEME_ROOMMENTION_TERM, "roommention.term");
     _cons_theme_prop(THEME_ROOMTRIGGER, "roomtrigger");
+    _cons_theme_prop(THEME_ROOMTRIGGER_TERM, "roomtrigger.term");
 
     _cons_theme_prop(THEME_ROSTER_HEADER, "roster.header");
     _cons_theme_prop(THEME_ROSTER_CHAT, "roster.chat");
diff --git a/src/ui/mucwin.c b/src/ui/mucwin.c
index 3d7263f3..fef02539 100644
--- a/src/ui/mucwin.c
+++ b/src/ui/mucwin.c
@@ -385,9 +385,71 @@ _mucwin_print_mention(ProfWin *window, const char *const message, const char *co
     g_free(message_lower);
 }
 
+static void
+_mucwin_print_triggers(ProfWin *window, const char *const message, GList *triggers)
+{
+    char *message_lower = g_utf8_strdown(message, -1);
+
+    // find earliest trigger in message
+    int first_trigger_pos = -1;
+    int first_trigger_len = -1;
+    GList *curr = triggers;
+    while (curr) {
+        char *trigger_lower = g_utf8_strdown(curr->data, -1);
+        char *trigger_ptr = g_strstr_len(message_lower, -1, trigger_lower);
+
+        // not found, try next
+        if (trigger_ptr == NULL) {
+            curr = g_list_next(curr);
+            continue;
+        }
+
+        // found, repace vars if earlier than previous
+        int trigger_pos = trigger_ptr - message_lower;
+        if (first_trigger_pos == -1 || trigger_pos < first_trigger_pos) {
+            first_trigger_pos = trigger_pos;
+            first_trigger_len = strlen(trigger_lower);
+        }
+
+        g_free(trigger_lower);
+        curr = g_list_next(curr);
+    }
+
+    g_free(message_lower);
+
+    // no triggers found
+    if (first_trigger_pos == -1) {
+        win_print(window, '-', 0, NULL, NO_DATE | NO_ME, THEME_ROOMTRIGGER, "", message);
+    } else {
+        if (first_trigger_pos > 0) {
+            char message_section[strlen(message) + 1];
+            int i = 0;
+            while (i < first_trigger_pos) {
+                message_section[i] = message[i];
+                i++;
+            }
+            message_section[i] = '\0';
+            win_print(window, '-', 0, NULL, NO_DATE | NO_ME | NO_EOL, THEME_ROOMTRIGGER, "", message_section);
+        }
+        char trigger_section[first_trigger_len + 1];
+        int i = 0;
+        while (i < first_trigger_len) {
+            trigger_section[i] = message[first_trigger_pos + i];
+            i++;
+        }
+        trigger_section[i] = '\0';
+
+        if (first_trigger_pos + first_trigger_len < strlen(message)) {
+            win_print(window, '-', 0, NULL, NO_DATE | NO_ME | NO_EOL, THEME_ROOMTRIGGER_TERM, "", trigger_section);
+            _mucwin_print_triggers(window, &message[first_trigger_pos + first_trigger_len], triggers);
+        } else {
+            win_print(window, '-', 0, NULL, NO_DATE | NO_ME, THEME_ROOMTRIGGER_TERM, "", trigger_section);
+        }
+    }
+}
+
 void
-mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const message, gboolean mention,
-    gboolean trigger_found)
+mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const message, gboolean mention, GList *triggers)
 {
     assert(mucwin != NULL);
 
@@ -398,8 +460,9 @@ mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const mes
         if (mention) {
             win_print(window, '-', 0, NULL, NO_ME | NO_EOL, THEME_ROOMMENTION, nick, "");
             _mucwin_print_mention(window, message, my_nick);
-        } else if (trigger_found) {
-            win_print(window, '-', 0, NULL, NO_ME, THEME_ROOMTRIGGER, nick, message);
+        } else if (triggers) {
+            win_print(window, '-', 0, NULL, NO_ME | NO_EOL, THEME_ROOMTRIGGER, nick, "");
+            _mucwin_print_triggers(window, message, triggers);
         } else {
             win_print(window, '-', 0, NULL, NO_ME, THEME_TEXT_THEM, nick, message);
         }
diff --git a/src/ui/ui.h b/src/ui/ui.h
index 70b01df3..8376cb90 100644
--- a/src/ui/ui.h
+++ b/src/ui/ui.h
@@ -158,7 +158,7 @@ void mucwin_occupant_role_and_affiliation_change(ProfMucWin *mucwin, const char
     const char *const role, const char *const affiliation, const char *const actor, const char *const reason);
 void mucwin_roster(ProfMucWin *mucwin, GList *occupants, const char *const presence);
 void mucwin_history(ProfMucWin *mucwin, const char *const nick, GDateTime *timestamp, const char *const message);
-void mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const message, gboolean mention, gboolean trigger_found);
+void mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const message, gboolean mention, GList *triggers);
 void mucwin_subject(ProfMucWin *mucwin, const char *const nick, const char *const subject);
 void mucwin_requires_config(ProfMucWin *mucwin);
 void mucwin_info(ProfMucWin *mucwin);
diff --git a/tests/unittests/ui/stub_ui.c b/tests/unittests/ui/stub_ui.c
index 40467c6e..79c9a6cf 100644
--- a/tests/unittests/ui/stub_ui.c
+++ b/tests/unittests/ui/stub_ui.c
@@ -193,7 +193,7 @@ void mucwin_occupant_role_and_affiliation_change(ProfMucWin *mucwin, const char
     const char * const affiliation, const char * const actor, const char * const reason) {}
 void mucwin_roster(ProfMucWin *mucwin, GList *occupants, const char * const presence) {}
 void mucwin_history(ProfMucWin *mucwin, const char * const nick, GDateTime *timestamp, const char * const message) {}
-void mucwin_message(ProfMucWin *mucwin, const char * const nick, const char * const message, gboolean mention, gboolean trigger_found) {}
+void mucwin_message(ProfMucWin *mucwin, const char * const nick, const char * const message, gboolean mention, GList *triggers) {}
 void mucwin_subject(ProfMucWin *mucwin, const char * const nick, const char * const subject) {}
 void mucwin_requires_config(ProfMucWin *mucwin) {}
 void ui_room_destroy(const char * const roomjid) {}
diff --git a/theme_template b/theme_template
index ba8a45c3..20393bab 100644
--- a/theme_template
+++ b/theme_template
@@ -47,6 +47,7 @@ roominfo=
 roommention=
 roommention.term=
 roomtrigger=
+roomtrigger.term=
 me=
 them=
 roster.header=
diff --git a/themes/aqua b/themes/aqua
index 1a2d7c3d..a0f7fb91 100644
--- a/themes/aqua
+++ b/themes/aqua
@@ -47,6 +47,7 @@ roominfo=white
 roommention=bold_blue
 roommention.term=bold_blue
 roomtrigger=bold_blue
+roomtrigger.term=bold_blue
 me=cyan
 them=white
 roster.header=bold_white
diff --git a/themes/batman b/themes/batman
index d61a2eb3..e982b182 100644
--- a/themes/batman
+++ b/themes/batman
@@ -49,6 +49,7 @@ unsubscribed=black_bold
 roommention=cyan
 roommention.term=cyan
 roomtrigger=cyan
+roomtrigger.term=cyan
 roster.header=yellow
 roster.chat=green
 roster.online=green
diff --git a/themes/bios b/themes/bios
index c378ddd8..ad582d7e 100644
--- a/themes/bios
+++ b/themes/bios
@@ -47,6 +47,7 @@ roominfo=bold_yellow
 roommention=bold_green
 roommention.term=bold_green
 roomtrigger=bold_green
+roomtrigger.term=bold_green
 me=bold_cyan
 them=bold_magenta
 roster.header=bold_magenta
diff --git a/themes/boothj5 b/themes/boothj5
index 1fee7a27..bb1f8d27 100644
--- a/themes/boothj5
+++ b/themes/boothj5
@@ -46,7 +46,8 @@ error=red
 roominfo=yellow
 roommention=bold_white
 roommention.term=bold_cyan
-roomtrigger=bold_blue
+roomtrigger=bold_white
+roomtrigger.term=bold_blue
 me=blue
 them=bold_green
 roster.header=bold_yellow
diff --git a/themes/boothj5_slack b/themes/boothj5_slack
index 46ff71df..e7f1a571 100644
--- a/themes/boothj5_slack
+++ b/themes/boothj5_slack
@@ -46,7 +46,8 @@ error=red
 roominfo=yellow
 roommention=bold_white
 roommention.term=bold_cyan
-roomtrigger=bold_blue
+roomtrigger=bold_white
+roomtrigger.term=bold_blue
 me=blue
 them=bold_green
 roster.header=bold_yellow
diff --git a/themes/forest b/themes/forest
index 37701e2d..d466eda1 100644
--- a/themes/forest
+++ b/themes/forest
@@ -47,6 +47,7 @@ roominfo=yellow
 roommention=bold_cyan
 roommention.term=bold_cyan
 roomtrigger=bold_cyan
+roomtrigger.term=bold_cyan
 me=blue
 them=bold_blue
 roster.header=bold_green
diff --git a/themes/hacker b/themes/hacker
index 00a4ec00..a6516baa 100644
--- a/themes/hacker
+++ b/themes/hacker
@@ -47,6 +47,7 @@ roominfo=green
 roommention=bold_green
 roommention.term=bold_green
 roomtrigger=bold_green
+roomtrigger.term=bold_green
 me=green
 them=bold_green
 roster.header=bold_green
diff --git a/themes/headache b/themes/headache
index 83cc69d9..d53a1286 100644
--- a/themes/headache
+++ b/themes/headache
@@ -47,6 +47,7 @@ roominfo=white
 roommention=bold_green
 roommention.term=bold_green
 roomtrigger=bold_green
+roomtrigger.term=bold_green
 me=white
 them=white
 roster.header=bold_cyan
diff --git a/themes/joker b/themes/joker
index 30cf5656..db5e6d54 100644
--- a/themes/joker
+++ b/themes/joker
@@ -47,6 +47,7 @@ roominfo=green
 roommention=green
 roommention.term=green
 roomtrigger=green
+roomtrigger.term=green
 me=magenta
 them=green
 roster.header=magenta
diff --git a/themes/mono b/themes/mono
index 48e6a5d5..fcb16230 100644
--- a/themes/mono
+++ b/themes/mono
@@ -47,6 +47,7 @@ roominfo=white
 roommention=white
 roommention.term=white
 roomtrigger=white
+roomtrigger.term=white
 me=white
 them=white
 roster.header=white
diff --git a/themes/orange b/themes/orange
index 51f79d09..729ea5d4 100644
--- a/themes/orange
+++ b/themes/orange
@@ -47,6 +47,7 @@ roominfo=blue
 roommention=blue
 roommention.term=blue
 roomtrigger=blue
+roomtrigger.term=blue
 me=black
 them=black
 roster.header=black
diff --git a/themes/original b/themes/original
index 84f11c00..33e54fb3 100644
--- a/themes/original
+++ b/themes/original
@@ -47,6 +47,7 @@ roominfo=yellow
 roommention=yellow
 roommention.term=yellow
 roomtrigger=yellow
+roomtrigger.term=yellow
 me=yellow
 them=green
 roster.header=yellow
diff --git a/themes/original_bright b/themes/original_bright
index e3bb6a52..92f139e3 100644
--- a/themes/original_bright
+++ b/themes/original_bright
@@ -47,6 +47,7 @@ roominfo=bold_yellow
 roommention=bold_yellow
 roommention.term=bold_yellow
 roomtrigger=bold_yellow
+roomtrigger.term=bold_yellow
 me=bold_yellow
 them=bold_green
 roster.header=bold_yellow
diff --git a/themes/shade b/themes/shade
index b6ea758e..7672ea32 100644
--- a/themes/shade
+++ b/themes/shade
@@ -47,6 +47,7 @@ roominfo=green
 roommention=green
 roommention.term=green
 roomtrigger=green
+roomtrigger.term=green
 me=bold_black
 them=magenta
 roster.header=magenta
diff --git a/themes/spawn b/themes/spawn
index 2537bfe3..82c63e9d 100644
--- a/themes/spawn
+++ b/themes/spawn
@@ -47,6 +47,7 @@ roominfo=green
 roommention=red
 roommention.term=red
 roomtrigger=red
+roomtrigger.term=red
 me=green
 them=yellow
 roster.header=white
diff --git a/themes/whiteness b/themes/whiteness
index c3cf3777..5bf83850 100644
--- a/themes/whiteness
+++ b/themes/whiteness
@@ -47,6 +47,7 @@ roominfo=yellow
 roommention=yellow
 roommention.term=yellow
 roomtrigger=yellow
+roomtrigger.term=yellow
 me=black
 them=black
 roster.header=black