about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/command/cmd_ac.c1
-rw-r--r--src/command/cmd_defs.c5
-rw-r--r--src/command/cmd_funcs.c32
-rw-r--r--src/config/preferences.c17
-rw-r--r--src/config/preferences.h2
-rw-r--r--src/config/theme.c5
-rw-r--r--src/ui/console.c7
-rw-r--r--src/ui/statusbar.c76
-rw-r--r--themes/boothj51
9 files changed, 115 insertions, 31 deletions
diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c
index c996d814..f9d5a22a 100644
--- a/src/command/cmd_ac.c
+++ b/src/command/cmd_ac.c
@@ -785,6 +785,7 @@ cmd_ac_init(void)
     autocomplete_add(statusbar_ac, "show");
     autocomplete_add(statusbar_ac, "hide");
     autocomplete_add(statusbar_ac, "maxtabs");
+    autocomplete_add(statusbar_ac, "tablen");
     autocomplete_add(statusbar_ac, "self");
     autocomplete_add(statusbar_ac, "chat");
     autocomplete_add(statusbar_ac, "room");
diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c
index d6ee9be6..418155c4 100644
--- a/src/command/cmd_defs.c
+++ b/src/command/cmd_defs.c
@@ -1361,6 +1361,7 @@ static struct cmd_t command_defs[] =
             "/statusbar show name|number",
             "/statusbar hide name|number",
             "/statusbar maxtabs <value>",
+            "/statusbar tablen <value>",
             "/statusbar self user|barejid|fulljid|off",
             "/statusbar chat user|jid",
             "/statusbar room room|jid",
@@ -1370,6 +1371,7 @@ static struct cmd_t command_defs[] =
             "Manage statusbar display preferences.")
         CMD_ARGS(
             { "maxtabs <value>",            "Set the maximum number of tabs to display, <value> must be between 0 and 10" },
+            { "tablen <value>",             "Set the maximum number of characters to show as the tab name, 0 sets to unlimited." },
             { "show|hide name",             "Show or hide names in tabs." },
             { "show|hide number",           "Show or hide numbers in tabs." },
             { "self user|barejid|fulljid",  "Show account user name, barejid, fulljid as status bar title." },
@@ -1379,7 +1381,8 @@ static struct cmd_t command_defs[] =
             { "up",                         "Move the status bar up the screen." },
             { "down",                       "Move the status bar down the screen." })
         CMD_EXAMPLES(
-            "/statusbar maxtabs 5",
+            "/statusbar maxtabs 8",
+            "/statusbar tablen 5",
             "/statusbar self user",
             "/statusbar chat jid",
             "/statusbar hide name")
diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c
index 11f1f51c..c8aa22b4 100644
--- a/src/command/cmd_funcs.c
+++ b/src/command/cmd_funcs.c
@@ -5846,6 +5846,38 @@ cmd_statusbar(ProfWin *window, const char *const command, gchar **args)
         }
     }
 
+    if (g_strcmp0(args[0], "tablen") == 0) {
+        if (args[1] == NULL) {
+            cons_bad_cmd_usage(command);
+            return TRUE;
+        }
+
+        char *value = args[1];
+        int intval = 0;
+        char *err_msg = NULL;
+        gboolean res = strtoi_range(value, &intval, 0, INT_MAX, &err_msg);
+        if (res) {
+            if (intval < 0) {
+                cons_bad_cmd_usage(command);
+                return TRUE;
+            }
+
+            prefs_set_statusbartablen(intval);
+            if (intval == 0) {
+                cons_show("Maximum tab length disabled.");
+            } else {
+                cons_show("Maximum tab length set to %d.", intval);
+            }
+            ui_resize();
+            return TRUE;
+        } else {
+            cons_show(err_msg);
+            cons_bad_cmd_usage(command);
+            free(err_msg);
+            return TRUE;
+        }
+    }
+
     if (g_strcmp0(args[0], "self") == 0) {
         if (g_strcmp0(args[1], "barejid") == 0) {
             prefs_set_string(PREF_STATUSBAR_SELF, "barejid");
diff --git a/src/config/preferences.c b/src/config/preferences.c
index 8b2ad10a..e62c552c 100644
--- a/src/config/preferences.c
+++ b/src/config/preferences.c
@@ -680,6 +680,23 @@ prefs_set_statusbartabs(gint value)
     _save_prefs();
 }
 
+gint
+prefs_get_statusbartablen(void)
+{
+    if (!g_key_file_has_key(prefs, PREF_GROUP_UI, "statusbar.tablen", NULL)) {
+        return 0;
+    } else {
+        return g_key_file_get_integer(prefs, PREF_GROUP_UI, "statusbar.tablen", NULL);
+    }
+}
+
+void
+prefs_set_statusbartablen(gint value)
+{
+    g_key_file_set_integer(prefs, PREF_GROUP_UI, "statusbar.tablen", value);
+    _save_prefs();
+}
+
 gchar**
 prefs_get_plugins(void)
 {
diff --git a/src/config/preferences.h b/src/config/preferences.h
index 808ffafd..bafe4a1f 100644
--- a/src/config/preferences.h
+++ b/src/config/preferences.h
@@ -194,6 +194,8 @@ void prefs_set_inpblock(gint value);
 
 void prefs_set_statusbartabs(gint value);
 gint prefs_get_statusbartabs(void);
+void prefs_set_statusbartablen(gint value);
+gint prefs_get_statusbartablen(void);
 
 void prefs_set_occupants_size(gint value);
 gint prefs_get_occupants_size(void);
diff --git a/src/config/theme.c b/src/config/theme.c
index 24dbc9ae..769299d0 100644
--- a/src/config/theme.c
+++ b/src/config/theme.c
@@ -442,6 +442,11 @@ _load_preferences(void)
         prefs_set_statusbartabs(tabs_size);
     }
 
+    if (g_key_file_has_key(theme, "ui", "statusbar.tablen", NULL)) {
+        gint tab_len = g_key_file_get_integer(theme, "ui", "statusbar.tablen", NULL);
+        prefs_set_statusbartabs(tab_len);
+    }
+
     if (g_key_file_has_key(theme, "ui", "occupants.size", NULL)) {
         gint occupants_size = g_key_file_get_integer(theme, "ui", "occupants.size", NULL);
         prefs_set_occupants_size(occupants_size);
diff --git a/src/ui/console.c b/src/ui/console.c
index 26c830fc..9bead705 100644
--- a/src/ui/console.c
+++ b/src/ui/console.c
@@ -1754,6 +1754,13 @@ cons_statusbar_setting(void)
 
     cons_show("Max tabs (/statusbar)               : %d", prefs_get_statusbartabs());
 
+    gint pref_len = prefs_get_statusbartablen();
+    if (pref_len == 0) {
+        cons_show("Max tab length (/statusbar)         : OFF");
+    } else {
+        cons_show("Max tab length (/statusbar)         : %d", pref_len);
+    }
+
     char *pref_self = prefs_get_string(PREF_STATUSBAR_SELF);
     if (g_strcmp0(pref_self, "off") == 0) {
         cons_show("Self statusbar display (/statusbar) : OFF");
diff --git a/src/ui/statusbar.c b/src/ui/statusbar.c
index 59b32a9f..ac1d7498 100644
--- a/src/ui/statusbar.c
+++ b/src/ui/statusbar.c
@@ -511,42 +511,40 @@ _tabs_width(void)
 static char*
 _display_name(StatusBarTab *tab)
 {
+    char *fullname = NULL;
+
     if (tab->window_type == WIN_CONSOLE) {
-        return strdup("console");
-    }
-    if (tab->window_type == WIN_XML) {
-        return strdup("xmlconsole");
-    }
-    if (tab->window_type == WIN_PLUGIN) {
-        return strdup(tab->identifier);
-    }
-    if (tab->window_type == WIN_CHAT) {
+        fullname = strdup("console");
+    } else if (tab->window_type == WIN_XML) {
+        fullname = strdup("xmlconsole");
+    } else if (tab->window_type == WIN_PLUGIN) {
+        fullname = strdup(tab->identifier);
+    } else if (tab->window_type == WIN_CHAT) {
         PContact contact = roster_get_contact(tab->identifier);
         if (contact && p_contact_name(contact)) {
-            return strdup(p_contact_name(contact));
-        }
-        char *pref = prefs_get_string(PREF_STATUSBAR_CHAT);
-        if (g_strcmp0("user", pref) == 0) {
-            Jid *jidp = jid_create(tab->identifier);
-            char *user = strdup(jidp->localpart);
-            jid_destroy(jidp);
-            return user;
+            fullname = strdup(p_contact_name(contact));
         } else {
-            return strdup(tab->identifier);
+            char *pref = prefs_get_string(PREF_STATUSBAR_CHAT);
+            if (g_strcmp0("user", pref) == 0) {
+                Jid *jidp = jid_create(tab->identifier);
+                char *user = strdup(jidp->localpart);
+                jid_destroy(jidp);
+                fullname = user;
+            } else {
+                fullname = strdup(tab->identifier);
+            }
         }
-    }
-    if (tab->window_type == WIN_MUC) {
+    } else if (tab->window_type == WIN_MUC) {
         char *pref = prefs_get_string(PREF_STATUSBAR_ROOM);
         if (g_strcmp0("room", pref) == 0) {
             Jid *jidp = jid_create(tab->identifier);
             char *room = strdup(jidp->localpart);
             jid_destroy(jidp);
-            return room;
+            fullname = room;
         } else {
-            return strdup(tab->identifier);
+            fullname = strdup(tab->identifier);
         }
-    }
-    if (tab->window_type == WIN_MUC_CONFIG) {
+    } else if (tab->window_type == WIN_MUC_CONFIG) {
         char *pref = prefs_get_string(PREF_STATUSBAR_ROOM);
         GString *display_str = g_string_new("");
         if (g_strcmp0("room", pref) == 0) {
@@ -559,9 +557,8 @@ _display_name(StatusBarTab *tab)
         g_string_append(display_str, " conf");
         char *result = strdup(display_str->str);
         g_string_free(display_str, TRUE);
-        return result;
-    }
-    if (tab->window_type == WIN_PRIVATE) {
+        fullname = result;
+    } else if (tab->window_type == WIN_PRIVATE) {
         char *pref = prefs_get_string(PREF_STATUSBAR_ROOM);
         if (g_strcmp0("room", pref) == 0) {
             GString *display_str = g_string_new("");
@@ -572,10 +569,29 @@ _display_name(StatusBarTab *tab)
             jid_destroy(jidp);
             char *result = strdup(display_str->str);
             g_string_free(display_str, TRUE);
-            return result;
+            fullname = result;
         } else {
-            return strdup(tab->identifier);
+            fullname = strdup(tab->identifier);
         }
+    } else {
+        fullname = strdup("window");
     }
-    return strdup("window");
+
+    gint tablen = prefs_get_statusbartablen();
+    if (tablen == 0) {
+        return fullname;
+    }
+
+    int namelen = utf8_display_len(fullname);
+    if (namelen < tablen) {
+        return fullname;
+    }
+
+    gchar *trimmed = g_utf8_substring(fullname, 0, tablen);
+    free(fullname);
+    char *trimmedname = strdup(trimmed);
+    g_free(trimmed);
+
+    return trimmedname;
+
 }
diff --git a/themes/boothj5 b/themes/boothj5
index 2f9a94e0..80baffb8 100644
--- a/themes/boothj5
+++ b/themes/boothj5
@@ -146,6 +146,7 @@ statusbar.self=user
 statusbar.chat=user
 statusbar.room=room
 statusbar.tabs=8
+statusbar.tablen=0
 statusbar.show.name=true
 statusbar.show.number=true