about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2015-11-19 23:21:51 +0000
committerJames Booth <boothj5@gmail.com>2015-11-19 23:21:51 +0000
commit316b6a7b8bf2aab233bc777d0eb224e6af814f7b (patch)
tree2febb8f2f98a597c268b076d2601550d21dd6365
parent78a8487892a294b4690d20e04f0081d5d6c71823 (diff)
downloadprofani-tty-316b6a7b8bf2aab233bc777d0eb224e6af814f7b.tar.gz
Added /roster char header
-rw-r--r--src/command/command.c24
-rw-r--r--src/command/commands.c19
-rw-r--r--src/config/preferences.c34
-rw-r--r--src/config/preferences.h4
-rw-r--r--src/config/theme.c7
-rw-r--r--src/ui/rosterwin.c40
-rw-r--r--theme_template8
-rw-r--r--themes/boothj51
-rw-r--r--themes/complex1
9 files changed, 127 insertions, 11 deletions
diff --git a/src/command/command.c b/src/command/command.c
index 241865d5..587fd241 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -278,6 +278,7 @@ static struct cmd_t command_defs[] =
             "/roster hide [offline|resource|presence|status|empty|count|priority]",
             "/roster by group|presence|none",
             "/roster order name|presence",
+            "/roster char header <char>|none",
             "/roster size <percent>",
             "/roster add <jid> [<nick>]",
             "/roster remove <jid>",
@@ -310,6 +311,8 @@ static struct cmd_t command_defs[] =
             { "by none",             "No grouping in the roster panel." },
             { "order name",          "Order roster items by name only." },
             { "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." },
             { "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." },
@@ -1776,6 +1779,8 @@ static Autocomplete disco_ac;
 static Autocomplete close_ac;
 static Autocomplete wins_ac;
 static Autocomplete roster_ac;
+static Autocomplete roster_char_ac;
+static Autocomplete roster_char_none_ac;
 static Autocomplete roster_option_ac;
 static Autocomplete roster_by_ac;
 static Autocomplete roster_order_ac;
@@ -2024,6 +2029,13 @@ cmd_init(void)
     autocomplete_add(roster_ac, "by");
     autocomplete_add(roster_ac, "order");
     autocomplete_add(roster_ac, "size");
+    autocomplete_add(roster_ac, "char");
+
+    roster_char_ac = autocomplete_new();
+    autocomplete_add(roster_char_ac, "header");
+
+    roster_char_none_ac = autocomplete_new();
+    autocomplete_add(roster_char_none_ac, "none");
 
     roster_option_ac = autocomplete_new();
     autocomplete_add(roster_option_ac, "offline");
@@ -2295,6 +2307,8 @@ cmd_uninit(void)
     autocomplete_free(close_ac);
     autocomplete_free(wins_ac);
     autocomplete_free(roster_ac);
+    autocomplete_free(roster_char_ac);
+    autocomplete_free(roster_char_none_ac);
     autocomplete_free(roster_option_ac);
     autocomplete_free(roster_by_ac);
     autocomplete_free(roster_order_ac);
@@ -2482,6 +2496,8 @@ cmd_reset_autocomplete(ProfWin *window)
     autocomplete_reset(close_ac);
     autocomplete_reset(wins_ac);
     autocomplete_reset(roster_ac);
+    autocomplete_reset(roster_char_ac);
+    autocomplete_reset(roster_char_none_ac);
     autocomplete_reset(roster_option_ac);
     autocomplete_reset(roster_by_ac);
     autocomplete_reset(roster_order_ac);
@@ -2870,6 +2886,10 @@ static char*
 _roster_autocomplete(ProfWin *window, const char *const input)
 {
     char *result = NULL;
+    result = autocomplete_param_with_ac(input, "/roster char header", roster_char_none_ac, TRUE);
+    if (result) {
+        return result;
+    }
     result = autocomplete_param_with_func(input, "/roster nick", roster_barejid_autocomplete);
     if (result) {
         return result;
@@ -2902,6 +2922,10 @@ _roster_autocomplete(ProfWin *window, const char *const input)
     if (result) {
         return result;
     }
+    result = autocomplete_param_with_ac(input, "/roster char", roster_char_ac, TRUE);
+    if (result) {
+        return result;
+    }
     result = autocomplete_param_with_ac(input, "/roster", roster_ac, TRUE);
     if (result) {
         return result;
diff --git a/src/command/commands.c b/src/command/commands.c
index 92ca5daf..7f67e19d 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -1750,6 +1750,25 @@ cmd_roster(ProfWin *window, const char *const command, gchar **args)
             return TRUE;
         }
 
+    // set header character
+    } else if (g_strcmp0(args[0], "char") == 0) {
+        if (g_strcmp0(args[1], "header") == 0) {
+            if (!args[2]) {
+                cons_bad_cmd_usage(command);
+            } else if (g_strcmp0(args[2], "none") == 0) {
+                prefs_clear_roster_header_char();
+                cons_show("Roster header char removed.");
+                rosterwin_roster();
+            } else {
+                prefs_set_roster_header_char(args[2][0]);
+                cons_show("Roster header char set to %c.", args[2][0]);
+                rosterwin_roster();
+            }
+        } else {
+            cons_bad_cmd_usage(command);
+        }
+        return TRUE;
+
     // show/hide roster
     } else if (g_strcmp0(args[0], "show") == 0) {
         if (args[1] == NULL) {
diff --git a/src/config/preferences.c b/src/config/preferences.c
index 0f5041bf..36f02a64 100644
--- a/src/config/preferences.c
+++ b/src/config/preferences.c
@@ -444,6 +444,40 @@ prefs_set_pgp_char(char ch)
     _save_prefs();
 }
 
+char
+prefs_get_roster_header_char(void)
+{
+    char result = 0;
+
+    char *resultstr = g_key_file_get_string(prefs, PREF_GROUP_UI, "roster.header.char", NULL);
+    if (!resultstr) {
+        result =  0;
+    } else {
+        result = resultstr[0];
+    }
+    free(resultstr);
+
+    return result;
+}
+
+void
+prefs_set_roster_header_char(char ch)
+{
+    char str[2];
+    str[0] = ch;
+    str[1] = '\0';
+
+    g_key_file_set_string(prefs, PREF_GROUP_UI, "roster.header.char", str);
+    _save_prefs();
+}
+
+void
+prefs_clear_roster_header_char(void)
+{
+    g_key_file_remove_key(prefs, PREF_GROUP_UI, "roster.header.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 c5f60469..e75e94eb 100644
--- a/src/config/preferences.h
+++ b/src/config/preferences.h
@@ -165,6 +165,10 @@ void prefs_set_otr_char(char ch);
 char prefs_get_pgp_char(void);
 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);
+
 void prefs_add_login(const char *jid);
 
 gboolean prefs_add_alias(const char *const name, const char *const value);
diff --git a/src/config/theme.c b/src/config/theme.c
index a6649e88..73cdf0ad 100644
--- a/src/config/theme.c
+++ b/src/config/theme.c
@@ -469,6 +469,13 @@ _load_preferences(void)
         gint roster_size = g_key_file_get_integer(theme, "ui", "roster.size", NULL);
         prefs_set_roster_size(roster_size);
     }
+    if (g_key_file_has_key(theme, "ui", "roster.header.char", NULL)) {
+        gchar *ch = g_key_file_get_string(theme, "ui", "roster.header.char", NULL);
+        if (ch && strlen(ch) > 0) {
+            prefs_set_roster_header_char(ch[0]);
+            g_free(ch);
+        }
+    }
 
     _set_boolean_preference("privileges", PREF_MUC_PRIVILEGES);
 
diff --git a/src/ui/rosterwin.c b/src/ui/rosterwin.c
index 32d64543..00f97522 100644
--- a/src/ui/rosterwin.c
+++ b/src/ui/rosterwin.c
@@ -159,7 +159,12 @@ _rosterwin_contacts_by_presence(ProfLayoutSplit *layout, const char *const prese
     // if this group has contacts, or if we want to show empty groups
     if (contacts || prefs_get_boolean(PREF_ROSTER_EMPTY)) {
         wattron(layout->subwin, theme_attrs(THEME_ROSTER_HEADER));
-        GString *title_str = g_string_new(title);
+        GString *title_str = g_string_new(" ");
+        char ch = prefs_get_roster_header_char();
+        if (ch) {
+            g_string_append_printf(title_str, "%c", ch);
+        }
+        g_string_append(title_str, title);
         if (prefs_get_boolean(PREF_ROSTER_COUNT)) {
             g_string_append_printf(title_str, " (%d)", g_slist_length(contacts));
         }
@@ -194,7 +199,11 @@ _rosterwin_contacts_by_group(ProfLayoutSplit *layout, char *group)
 
     if (contacts || prefs_get_boolean(PREF_ROSTER_EMPTY)) {
         wattron(layout->subwin, theme_attrs(THEME_ROSTER_HEADER));
-        GString *title = g_string_new(" -");
+        GString *title = g_string_new(" ");
+        char ch = prefs_get_roster_header_char();
+        if (ch) {
+            g_string_append_printf(title, "%c", ch);
+        }
         g_string_append(title, group);
         if (prefs_get_boolean(PREF_ROSTER_COUNT)) {
             g_string_append_printf(title, " (%d)", g_slist_length(contacts));
@@ -228,7 +237,13 @@ _rosterwin_contacts_by_no_group(ProfLayoutSplit *layout)
 
     if (contacts || prefs_get_boolean(PREF_ROSTER_EMPTY)) {
         wattron(layout->subwin, theme_attrs(THEME_ROSTER_HEADER));
-        GString *title = g_string_new(" -no group");
+        GString *title = g_string_new(" ");
+        char ch = prefs_get_roster_header_char();
+        if (ch) {
+            g_string_append_printf(title, "%c", ch);
+        }
+        g_string_append(title, "no group");
+
         if (prefs_get_boolean(PREF_ROSTER_COUNT)) {
             g_string_append_printf(title, " (%d)", g_slist_length(contacts));
         }
@@ -257,13 +272,13 @@ rosterwin_roster(void)
        char *by = prefs_get_string(PREF_ROSTER_BY);
         if (g_strcmp0(by, "presence") == 0) {
             werase(layout->subwin);
-            _rosterwin_contacts_by_presence(layout, "chat", " -Available for chat");
-            _rosterwin_contacts_by_presence(layout, "online", " -Online");
-            _rosterwin_contacts_by_presence(layout, "away", " -Away");
-            _rosterwin_contacts_by_presence(layout, "xa", " -Extended Away");
-            _rosterwin_contacts_by_presence(layout, "dnd", " -Do not disturb");
+            _rosterwin_contacts_by_presence(layout, "chat", "Available for chat");
+            _rosterwin_contacts_by_presence(layout, "online", "Online");
+            _rosterwin_contacts_by_presence(layout, "away", "Away");
+            _rosterwin_contacts_by_presence(layout, "xa", "Extended Away");
+            _rosterwin_contacts_by_presence(layout, "dnd", "Do not disturb");
             if (prefs_get_boolean(PREF_ROSTER_OFFLINE)) {
-                _rosterwin_contacts_by_presence(layout, "offline", " -Offline");
+                _rosterwin_contacts_by_presence(layout, "offline", "Offline");
             }
         } else if (g_strcmp0(by, "group") == 0) {
             werase(layout->subwin);
@@ -289,7 +304,12 @@ rosterwin_roster(void)
             werase(layout->subwin);
 
             wattron(layout->subwin, theme_attrs(THEME_ROSTER_HEADER));
-            GString *title = g_string_new(" -Roster");
+            GString *title = g_string_new(" ");
+            char ch = prefs_get_roster_header_char();
+            if (ch) {
+                g_string_append_printf(title, "%c", ch);
+            }
+            g_string_append(title, "Roster");
             if (prefs_get_boolean(PREF_ROSTER_COUNT)) {
                 g_string_append_printf(title, " (%d)", g_slist_length(contacts));
             }
diff --git a/theme_template b/theme_template
index ae36cfd4..86627d81 100644
--- a/theme_template
+++ b/theme_template
@@ -74,9 +74,15 @@ statuses.muc=
 roster=
 roster.offline=
 roster.resource=
+roster.presence=
+roster.status=
+roster.empty=
 roster.by=
+roster.order=
+roster.count=
+roster.priority=
 roster.size=
-roster.empty=
+roster.header.char=
 occupants=
 occupants.size=
 occupants.jid=
diff --git a/themes/boothj5 b/themes/boothj5
index 0b40fab5..b6d99272 100644
--- a/themes/boothj5
+++ b/themes/boothj5
@@ -82,6 +82,7 @@ roster.order=presence
 roster.count=true
 roster.priority=true
 roster.size=25
+roster.header.char=@
 occupants=true
 occupants.size=15
 occupants.jid=false
diff --git a/themes/complex b/themes/complex
index c1abfc81..f76ac7b5 100644
--- a/themes/complex
+++ b/themes/complex
@@ -29,6 +29,7 @@ roster.order=presence
 roster.count=true
 roster.priority=true
 roster.size=25
+roster.header.char=-
 privileges=true
 presence=true
 intype=true