예제 #1
0
static void display_sorted_nicks(CHANNEL_REC *channel, GSList *nicklist)
{
        WINDOW_REC *window;
	TEXT_DEST_REC dest;
	GString *str;
	GSList *tmp;
        char *format, *stripped, *prefix_format;
	char *linebuf, nickmode[2] = { 0, 0 };
	int *columns, cols, rows, last_col_rows, col, row, max_width;
        int item_extra, linebuf_size, formatnum;

	window = window_find_closest(channel->server, channel->visible_name,
				     MSGLEVEL_CLIENTCRAP);
        max_width = window->width;

        /* get the length of item extra stuff ("[ ] ") */
	format = format_get_text(MODULE_NAME, NULL,
				 channel->server, channel->visible_name,
				 TXT_NAMES_NICK, " ", "");
	stripped = strip_codes(format);
	item_extra = strlen(stripped);
        g_free(stripped);
	g_free(format);

	if (settings_get_int("names_max_width") > 0 &&
	    settings_get_int("names_max_width") < max_width)
		max_width = settings_get_int("names_max_width");

        /* remove width of the timestamp from max_width */
	format_create_dest(&dest, channel->server, channel->visible_name,
			   MSGLEVEL_CLIENTCRAP, NULL);
	format = format_get_line_start(current_theme, &dest, time(NULL));
	if (format != NULL) {
		stripped = strip_codes(format);
		max_width -= strlen(stripped);
		g_free(stripped);
		g_free(format);
	}

        /* remove width of the prefix from max_width */
	prefix_format = format_get_text(MODULE_NAME, NULL,
					channel->server, channel->visible_name,
					TXT_NAMES_PREFIX,
					channel->visible_name);
	if (prefix_format != NULL) {
		stripped = strip_codes(prefix_format);
		max_width -= strlen(stripped);
		g_free(stripped);
	}

	if (max_width <= 0) {
		/* we should always have at least some space .. if we
		   really don't, it won't show properly anyway. */
		max_width = 10;
	}

	/* calculate columns */
	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);

        /* rows in last column */
	last_col_rows = rows-(cols*rows-g_slist_length(nicklist));
	if (last_col_rows == 0)
                last_col_rows = rows;

	str = g_string_new(prefix_format);
	linebuf_size = max_width+1; linebuf = g_malloc(linebuf_size);

        col = 0; row = 0;
	for (tmp = nicklist; tmp != NULL; tmp = tmp->next) {
		NICK_REC *rec = tmp->data;

		if (rec->other)
			nickmode[0] = rec->other;
		else if (rec->op)
			nickmode[0] = '@';
		else if (rec->halfop)
			nickmode[0] = '%';
		else if (rec->voice)
			nickmode[0] = '+';
		else
			nickmode[0] = ' ';
		
		if (linebuf_size < columns[col]-item_extra+1) {
			linebuf_size = (columns[col]-item_extra+1)*2;
                        linebuf = g_realloc(linebuf, linebuf_size);
		}
		memset(linebuf, ' ', columns[col]-item_extra);
		linebuf[columns[col]-item_extra] = '\0';
		memcpy(linebuf, rec->nick, strlen(rec->nick));

		formatnum = rec->op ? TXT_NAMES_NICK_OP :
			rec->halfop ? TXT_NAMES_NICK_HALFOP :
			rec->voice ? TXT_NAMES_NICK_VOICE :
                        TXT_NAMES_NICK;
		format = format_get_text(MODULE_NAME, NULL,
					 channel->server,
					 channel->visible_name,
					 formatnum, nickmode, linebuf);
		g_string_append(str, format);
		g_free(format);

		if (++col == cols) {
			printtext(channel->server, channel->visible_name,
				  MSGLEVEL_CLIENTCRAP, "%s", str->str);
			g_string_truncate(str, 0);
			if (prefix_format != NULL)
                                g_string_assign(str, prefix_format);
			col = 0; row++;

			if (row == last_col_rows)
                                cols--;
		}
	}

	if (str->len > strlen(prefix_format)) {
		printtext(channel->server, channel->visible_name,
			  MSGLEVEL_CLIENTCRAP, "%s", str->str);
	}

	g_slist_free(nicklist);
	g_string_free(str, TRUE);
	g_free_not_null(columns);
	g_free_not_null(prefix_format);
	g_free(linebuf);
}
예제 #2
0
파일: fe-help.c 프로젝트: Brijen/MacIrssi
static void help_category(GSList *cmdlist, int items)
{
        WINDOW_REC *window;
	TEXT_DEST_REC dest;
	GString *str;
	GSList *tmp;
	int *columns, cols, rows, col, row, last_col_rows, max_width;
	char *linebuf, *format, *stripped;

	window = window_find_closest(NULL, NULL, MSGLEVEL_CLIENTCRAP);
        max_width = window->width;

        /* remove width of timestamp from max_width */
	format_create_dest(&dest, NULL, NULL, MSGLEVEL_CLIENTCRAP, NULL);
	format = format_get_line_start(current_theme, &dest, time(NULL));
	if (format != NULL) {
		stripped = strip_codes(format);
		max_width -= strlen(stripped);
		g_free(stripped);
		g_free(format);
	}

        /* calculate columns */
	cols = get_max_column_count(cmdlist, get_cmd_length,
				    max_width, 6, 1, 3, &columns, &rows);
	cmdlist = columns_sort_list(cmdlist, rows);

        /* rows in last column */
	last_col_rows = rows-(cols*rows-g_slist_length(cmdlist));
	if (last_col_rows == 0)
                last_col_rows = rows;

	str = g_string_new(NULL);
	linebuf = g_malloc(max_width+1);

        col = 0; row = 0;
	for (tmp = cmdlist; tmp != NULL; tmp = tmp->next) {
		COMMAND_REC *rec = tmp->data;

		memset(linebuf, ' ', columns[col]);
		linebuf[columns[col]] = '\0';
		memcpy(linebuf, rec->cmd, strlen(rec->cmd));
		g_string_append(str, linebuf);

		if (++col == cols) {
			printtext(NULL, NULL,
				  MSGLEVEL_CLIENTCRAP, "%s", str->str);
			g_string_truncate(str, 0);
			col = 0; row++;

			if (row == last_col_rows)
                                cols--;
		}
	}
	if (str->len != 0)
		printtext(NULL, NULL, MSGLEVEL_CLIENTCRAP, "%s", str->str);

	g_slist_free(cmdlist);
	g_string_free(str, TRUE);
	g_free(columns);
	g_free(linebuf);
}