about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/command/command.c8
-rw-r--r--src/command/commands.c12
-rw-r--r--src/config/preferences.c34
-rw-r--r--src/config/preferences.h3
-rw-r--r--src/config/theme.c7
-rw-r--r--src/ui/console.c12
-rw-r--r--src/ui/rosterwin.c4
-rw-r--r--theme_template1
-rw-r--r--themes/boothj51
-rw-r--r--themes/complex1
10 files changed, 83 insertions, 0 deletions
diff --git a/src/command/command.c b/src/command/command.c
index 587fd241..7a87d828 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -279,6 +279,7 @@ static struct cmd_t command_defs[] =
             "/roster by group|presence|none",
             "/roster order name|presence",
             "/roster char header <char>|none",
+            "/roster char contact <char>|none",
             "/roster size <percent>",
             "/roster add <jid> [<nick>]",
             "/roster remove <jid>",
@@ -313,6 +314,8 @@ static struct cmd_t command_defs[] =
             { "order presence",      "Order roster items by presence, and then by name." },
             { "char header <char>",  "Prefix roster headers with specificed character." },
             { "char header none",    "Remove roster header character prefix." },
+            { "char contact <char>", "Prefix roster contacts with specificed character." },
+            { "char contact none",   "Remove roster contact character prefix." },
             { "size <precent>",      "Percentage of the screen taken up by the roster (1-99)." },
             { "add <jid> [<nick>]",  "Add a new item to the roster." },
             { "remove <jid>",        "Removes an item from the roster." },
@@ -2033,6 +2036,7 @@ cmd_init(void)
 
     roster_char_ac = autocomplete_new();
     autocomplete_add(roster_char_ac, "header");
+    autocomplete_add(roster_char_ac, "contact");
 
     roster_char_none_ac = autocomplete_new();
     autocomplete_add(roster_char_none_ac, "none");
@@ -2890,6 +2894,10 @@ _roster_autocomplete(ProfWin *window, const char *const input)
     if (result) {
         return result;
     }
+    result = autocomplete_param_with_ac(input, "/roster char contact", roster_char_none_ac, TRUE);
+    if (result) {
+        return result;
+    }
     result = autocomplete_param_with_func(input, "/roster nick", roster_barejid_autocomplete);
     if (result) {
         return result;
diff --git a/src/command/commands.c b/src/command/commands.c
index 7f67e19d..ca6a1003 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -1764,6 +1764,18 @@ cmd_roster(ProfWin *window, const char *const command, gchar **args)
                 cons_show("Roster header char set to %c.", args[2][0]);
                 rosterwin_roster();
             }
+        } else if (g_strcmp0(args[1], "contact") == 0) {
+            if (!args[2]) {
+                cons_bad_cmd_usage(command);
+            } else if (g_strcmp0(args[2], "none") == 0) {
+                prefs_clear_roster_contact_char();
+                cons_show("Roster contact char removed.");
+                rosterwin_roster();
+            } else {
+                prefs_set_roster_contact_char(args[2][0]);
+                cons_show("Roster contact char set to %c.", args[2][0]);
+                rosterwin_roster();
+            }
         } else {
             cons_bad_cmd_usage(command);
         }
diff --git a/src/config/preferences.c b/src/config/preferences.c
index 36f02a64..071b6646 100644
--- a/src/config/preferences.c
+++ b/src/config/preferences.c
@@ -478,6 +478,40 @@ prefs_clear_roster_header_char(void)
     _save_prefs();
 }
 
+char
+prefs_get_roster_contact_char(void)
+{
+    char result = 0;
+
+    char *resultstr = g_key_file_get_string(prefs, PREF_GROUP_UI, "roster.contact.char", NULL);
+    if (!resultstr) {
+        result =  0;
+    } else {
+        result = resultstr[0];
+    }
+    free(resultstr);
+
+    return result;
+}
+
+void
+prefs_set_roster_contact_char(char ch)
+{
+    char str[2];
+    str[0] = ch;
+    str[1] = '\0';
+
+    g_key_file_set_string(prefs, PREF_GROUP_UI, "roster.contact.char", str);
+    _save_prefs();
+}
+
+void
+prefs_clear_roster_contact_char(void)
+{
+    g_key_file_remove_key(prefs, PREF_GROUP_UI, "roster.contact.char", NULL);
+    _save_prefs();
+}
+
 gboolean
 prefs_add_alias(const char *const name, const char *const value)
 {
diff --git a/src/config/preferences.h b/src/config/preferences.h
index e75e94eb..da4eef88 100644
--- a/src/config/preferences.h
+++ b/src/config/preferences.h
@@ -168,6 +168,9 @@ void prefs_set_pgp_char(char ch);
 char prefs_get_roster_header_char(void);
 void prefs_set_roster_header_char(char ch);
 void prefs_clear_roster_header_char(void);
+char prefs_get_roster_contact_char(void);
+void prefs_set_roster_contact_char(char ch);
+void prefs_clear_roster_contact_char(void);
 
 void prefs_add_login(const char *jid);
 
diff --git a/src/config/theme.c b/src/config/theme.c
index 73cdf0ad..b875f46f 100644
--- a/src/config/theme.c
+++ b/src/config/theme.c
@@ -476,6 +476,13 @@ _load_preferences(void)
             g_free(ch);
         }
     }
+    if (g_key_file_has_key(theme, "ui", "roster.contact.char", NULL)) {
+        gchar *ch = g_key_file_get_string(theme, "ui", "roster.contact.char", NULL);
+        if (ch && strlen(ch) > 0) {
+            prefs_set_roster_contact_char(ch[0]);
+            g_free(ch);
+        }
+    }
 
     _set_boolean_preference("privileges", PREF_MUC_PRIVILEGES);
 
diff --git a/src/ui/console.c b/src/ui/console.c
index 64eff932..1beaa48a 100644
--- a/src/ui/console.c
+++ b/src/ui/console.c
@@ -1242,6 +1242,18 @@ cons_roster_setting(void)
 
     int size = prefs_get_roster_size();
     cons_show("Roster size (/roster)         : %d", size);
+
+    char header_ch = prefs_get_roster_header_char();
+    if (header_ch)
+        cons_show("Roster header char (/roster)  : %c", header_ch);
+    else
+        cons_show("Roster header char (/roster)  : none");
+
+    char contact_ch = prefs_get_roster_contact_char();
+    if (contact_ch)
+        cons_show("Roster contact char (/roster) : %c", contact_ch);
+    else
+        cons_show("Roster contact char (/roster) : none");
 }
 
 void
diff --git a/src/ui/rosterwin.c b/src/ui/rosterwin.c
index 00f97522..64ce1f7f 100644
--- a/src/ui/rosterwin.c
+++ b/src/ui/rosterwin.c
@@ -139,6 +139,10 @@ _rosterwin_contact(ProfLayoutSplit *layout, PContact contact)
 
     wattron(layout->subwin, theme_attrs(presence_colour));
     GString *msg = g_string_new("   ");
+    char ch = prefs_get_roster_contact_char();
+    if (ch) {
+        g_string_append_printf(msg, "%c", ch);
+    }
     g_string_append(msg, name);
     win_printline_nowrap(layout->subwin, msg->str);
     g_string_free(msg, TRUE);
diff --git a/theme_template b/theme_template
index 86627d81..7eca6ff9 100644
--- a/theme_template
+++ b/theme_template
@@ -83,6 +83,7 @@ roster.count=
 roster.priority=
 roster.size=
 roster.header.char=
+roster.contact.char=
 occupants=
 occupants.size=
 occupants.jid=
diff --git a/themes/boothj5 b/themes/boothj5
index b6d99272..48ada774 100644
--- a/themes/boothj5
+++ b/themes/boothj5
@@ -83,6 +83,7 @@ roster.count=true
 roster.priority=true
 roster.size=25
 roster.header.char=@
+roster.contact.char=-
 occupants=true
 occupants.size=15
 occupants.jid=false
diff --git a/themes/complex b/themes/complex
index f76ac7b5..e2667944 100644
--- a/themes/complex
+++ b/themes/complex
@@ -30,6 +30,7 @@ roster.count=true
 roster.priority=true
 roster.size=25
 roster.header.char=-
+roster.contact.char=-
 privileges=true
 presence=true
 intype=true