X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Ffe-text%2Fstatusbar.c;fp=apps%2Firssi%2Fsrc%2Ffe-text%2Fstatusbar.c;h=68724293011ee6bacd5b7f4b8a504da3c3689a6e;hb=18d69a0a1fec438e241bb4f431506ed59a34066b;hp=5eba9557f9ace85104067cf6b8687e3a930794ef;hpb=f7be6adec0248118cddde9b04522c13cd90568cd;p=silc.git diff --git a/apps/irssi/src/fe-text/statusbar.c b/apps/irssi/src/fe-text/statusbar.c index 5eba9557..68724293 100644 --- a/apps/irssi/src/fe-text/statusbar.c +++ b/apps/irssi/src/fe-text/statusbar.c @@ -13,9 +13,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "module.h" @@ -92,6 +92,12 @@ void statusbar_item_unregister(const char *name) } } +void statusbar_item_set_size(struct SBAR_ITEM_REC *item, int min_size, int max_size) +{ + item->min_size = min_size; + item->max_size = max_size; +} + STATUSBAR_GROUP_REC *statusbar_group_create(const char *name) { STATUSBAR_GROUP_REC *rec; @@ -618,29 +624,7 @@ STATUSBAR_REC *statusbar_find(STATUSBAR_GROUP_REC *group, const char *name, return NULL; } -static char *update_statusbar_bg(const char *str, const char *color) -{ - GString *out; - char *ret; - - out = g_string_new(color); - while (*str != '\0') { - if (*str == '%' && str[1] == 'n') { - g_string_append(out, color); - str += 2; - continue; - } - - g_string_append_c(out, *str); - str++; - } - - ret = out->str; - g_string_free(out, FALSE); - return ret; -} - -const char *statusbar_item_get_value(SBAR_ITEM_REC *item) +static const char *statusbar_item_get_value(SBAR_ITEM_REC *item) { const char *value; @@ -653,20 +637,22 @@ const char *statusbar_item_get_value(SBAR_ITEM_REC *item) return value; } -static char *reverse_controls(const char *str) +static GString *finalize_string(const char *str, const char *color) { GString *out; - char *ret; - out = g_string_new(NULL); + out = g_string_new(color); while (*str != '\0') { if ((unsigned char) *str < 32 || (term_type == TERM_TYPE_8BIT && (unsigned char) (*str & 0x7f) < 32)) { /* control char */ - g_string_sprintfa(out, "%%8%c%%8", + g_string_append_printf(out, "%%8%c%%8", 'A'-1 + (*str & 0x7f)); + } else if (*str == '%' && str[1] == 'n') { + g_string_append(out, color); + str++; } else { g_string_append_c(out, *str); } @@ -674,9 +660,7 @@ static char *reverse_controls(const char *str) str++; } - ret = out->str; - g_string_free(out, FALSE); - return ret; + return out; } void statusbar_item_default_handler(SBAR_ITEM_REC *item, int get_size_only, @@ -720,39 +704,30 @@ void statusbar_item_default_handler(SBAR_ITEM_REC *item, int get_size_only, tmpstr = strip_codes(tmpstr2); g_free(tmpstr2); - /* show all control chars reversed */ - tmpstr2 = reverse_controls(tmpstr); - g_free(tmpstr); - - tmpstr = tmpstr2; if (get_size_only) { item->min_size = item->max_size = format_get_length(tmpstr); } else { + GString *out; + if (item->size < item->min_size) { /* they're forcing us smaller than minimum size.. */ len = format_real_length(tmpstr, item->size); tmpstr[len] = '\0'; - } else { - /* make sure the str is big enough to fill the - requested size, so it won't corrupt screen */ - len = format_get_length(tmpstr); - if (len < item->size) { - char *fill; - - len = item->size-len; - fill = g_malloc(len + 1); - memset(fill, ' ', len); fill[len] = '\0'; - - tmpstr2 = g_strconcat(tmpstr, fill, NULL); - g_free(fill); - g_free(tmpstr); - tmpstr = tmpstr2; - } + } + out = finalize_string(tmpstr, item->bar->color); + /* make sure the str is big enough to fill the + requested size, so it won't corrupt screen */ + len = format_get_length(tmpstr); + if (len < item->size) { + int i; + + len = item->size-len; + for (i = 0; i < len; i++) + g_string_append_c(out, ' '); } - tmpstr2 = update_statusbar_bg(tmpstr, item->bar->color); - gui_printtext(item->xpos, item->bar->real_ypos, tmpstr2); - g_free(tmpstr2); + gui_printtext(item->xpos, item->bar->real_ypos, out->str); + g_string_free(out, TRUE); } g_free(tmpstr); }