From d6e7f389d1c1009b7c1fe9fb7f01697b610028ea Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 11 Mar 2018 01:18:46 +0000 Subject: Add max tab length to statusbar --- src/command/cmd_ac.c | 1 + src/command/cmd_defs.c | 5 +++- src/command/cmd_funcs.c | 32 ++++++++++++++++++++ src/config/preferences.c | 17 +++++++++++ src/config/preferences.h | 2 ++ src/config/theme.c | 5 ++++ src/ui/console.c | 7 +++++ src/ui/statusbar.c | 76 +++++++++++++++++++++++++++++------------------- 8 files changed, 114 insertions(+), 31 deletions(-) (limited to 'src') 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 ", + "/statusbar tablen ", "/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 ", "Set the maximum number of tabs to display, must be between 0 and 10" }, + { "tablen ", "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; + } -- cgit 1.4.1-2-gfad0