diff --git a/src/core/misc.c b/src/core/misc.c index b9bc70c7..709fd98d 100644 --- a/src/core/misc.c +++ b/src/core/misc.c @@ -609,13 +609,14 @@ char *my_asctime(time_t t) /* Returns number of columns needed to print items. save_column_widths is filled with length of each column. */ int get_max_column_count(GSList *items, COLUMN_LEN_FUNC len_func, - int max_width, int item_extra, int item_min_size, + int max_width, int max_columns, + int item_extra, int item_min_size, int **save_column_widths, int *rows) { GSList *tmp; int **columns, *columns_width, *columns_rows; int item_pos, items_count; - int ret, len, n, col, max_columns; + int ret, len, n, col; items_count = g_slist_length(items); if (items_count == 0) { @@ -624,7 +625,10 @@ int get_max_column_count(GSList *items, COLUMN_LEN_FUNC len_func, return 0; } - max_columns = max_width/(item_extra+item_min_size); + len = max_width/(item_extra+item_min_size); + if (max_columns <= 0 || len < max_columns) + max_columns = len; + columns = g_new0(int *, max_columns); columns_width = g_new0(int, max_columns); columns_rows = g_new0(int, max_columns); diff --git a/src/core/misc.h b/src/core/misc.h index 110aa14b..b56e8f97 100644 --- a/src/core/misc.h +++ b/src/core/misc.h @@ -78,7 +78,8 @@ char *my_asctime(time_t t); /* Returns number of columns needed to print items. save_column_widths is filled with length of each column. */ int get_max_column_count(GSList *items, COLUMN_LEN_FUNC len_func, - int max_width, int item_extra, int item_min_size, + int max_width, int max_columns, + int item_extra, int item_min_size, int **save_column_widths, int *rows); /* Return a column sorted copy of a list. */ diff --git a/src/fe-common/core/fe-channels.c b/src/fe-common/core/fe-channels.c index 77c7b7e4..2a9ba71f 100644 --- a/src/fe-common/core/fe-channels.c +++ b/src/fe-common/core/fe-channels.c @@ -329,8 +329,13 @@ static void display_sorted_nicks(CHANNEL_REC *channel, GSList *nicklist) g_free(format); } - /* calculate columns */ + /* calculate columns */ + if (settings_get_int("names_max_width") > 0 && + max_width > settings_get_int("names_max_width")) + max_width = settings_get_int("names_max_width"); + cols = get_max_column_count(nicklist, get_nick_length, max_width, + settings_get_int("names_max_columns"), item_extra, 3, &columns, &rows); nicklist = columns_sort_list(nicklist, rows); @@ -442,6 +447,8 @@ static void cmd_names(const char *data, SERVER_REC *server, WI_ITEM_REC *item) void fe_channels_init(void) { settings_add_bool("lookandfeel", "autoclose_windows", TRUE); + settings_add_int("lookandfeel", "names_max_columns", 6); + settings_add_int("lookandfeel", "names_max_width", 0); signal_add("channel created", (SIGNAL_FUNC) signal_channel_created); signal_add("channel destroyed", (SIGNAL_FUNC) signal_channel_destroyed); diff --git a/src/fe-common/core/fe-core-commands.c b/src/fe-common/core/fe-core-commands.c index 87e26a9c..e374dbd6 100644 --- a/src/fe-common/core/fe-core-commands.c +++ b/src/fe-common/core/fe-core-commands.c @@ -96,7 +96,7 @@ static void help_category(GSList *cmdlist, int items) /* calculate columns */ cols = get_max_column_count(cmdlist, get_cmd_length, - max_width, 1, 3, &columns, &rows); + max_width, 6, 1, 3, &columns, &rows); cmdlist = columns_sort_list(cmdlist, rows); /* rows in last column */