Ejemplo n.º 1
0
static void view_add_eol(TEXT_BUFFER_VIEW_REC *view, LINE_REC **line)
{
	static const unsigned char eol[] = { 0, LINE_CMD_EOL };

	*line = textbuffer_insert(view->buffer, *line, eol, 2, NULL);
	textbuffer_view_insert_line(view, *line);
}
Ejemplo n.º 2
0
static void sig_gui_print_text(WINDOW_REC *window, void *fgcolor,
			       void *bgcolor, void *pflags,
			       char *str, void *level)
{
        GUI_WINDOW_REC *gui;
        TEXT_BUFFER_VIEW_REC *view;
	LINE_REC *insert_after;
        LINE_INFO_REC lineinfo;
	int fg, bg, flags, attr;

	flags = GPOINTER_TO_INT(pflags);
	fg = GPOINTER_TO_INT(fgcolor);
	bg = GPOINTER_TO_INT(bgcolor);
	get_colors(flags, &fg, &bg, &attr);

	if (window == NULL) {
                g_return_if_fail(next_xpos != -1);

		attr |= fg >= 0 ? fg : ATTR_RESETFG;
		attr |= bg >= 0 ? (bg << 4) : ATTR_RESETBG;
		term_set_color(root_window, attr);

		term_move(root_window, next_xpos, next_ypos);
		if (flags & GUI_PRINT_FLAG_CLRTOEOL)
			term_clrtoeol(root_window);
		term_addstr(root_window, str);
		next_xpos += strlen(str);
                return;
	}

	lineinfo.level = GPOINTER_TO_INT(level);
        lineinfo.time = time(NULL);

        gui = WINDOW_GUI(window);
	view = gui->view;
	insert_after = gui->use_insert_after ?
		gui->insert_after : view->buffer->cur_line;

	if (flags & GUI_PRINT_FLAG_NEWLINE)
                view_add_eol(view, &insert_after);
	line_add_colors(view->buffer, &insert_after, fg, bg, flags);

	if (flags & GUI_PRINT_FLAG_INDENT_FUNC) {
		/* specify the indentation function */
                line_add_indent_func(view->buffer, &insert_after, str);
	} else {
		insert_after = textbuffer_insert(view->buffer, insert_after,
						 (unsigned char *) str,
						 strlen(str), &lineinfo);
	}
	if (gui->use_insert_after)
                gui->insert_after = insert_after;
}
Ejemplo n.º 3
0
void textbuffer_reformat_line(WINDOW_REC *window, LINE_REC *line)
{
        GUI_WINDOW_REC *gui;
	TEXT_DEST_REC dest;
	LINE_REC *line_prev;
        LINE_INFO_REC line_info;
	GString *raw;
	char *str, *tmp, *prestr, *linestart, *leveltag;

        gui = WINDOW_GUI(window);

	raw = g_string_new(NULL);
	str = textbuffer_line_get_format(window, line, raw);

        if (str == NULL && raw->len == 2 &&
            raw->str[1] == (char)LINE_CMD_FORMAT_CONT) {
                /* multiline format, format explained in one the
                   following lines. remove this line. */
                textbuffer_view_remove_line(gui->view, line);
	} else if (str != NULL) {
                /* FIXME: ugly ugly .. and this can't handle
                   unformatted lines.. */
		g_string_append_c(raw, '\0');
		g_string_append_c(raw, (char)LINE_CMD_EOL);

		line_prev = line->prev;
                memcpy(&line_info, &line->info, sizeof(line_info));
                textbuffer_view_remove_line(gui->view, line); line = NULL;

		format_create_dest(&dest, NULL, NULL, line_info.level, window);

		linestart = format_get_line_start(current_theme, &dest, line_info.time);
		leveltag = format_get_level_tag(current_theme, &dest);

		prestr = g_strconcat(linestart == NULL ? "" : linestart,
				     leveltag, NULL);
		g_free_not_null(linestart);
		g_free_not_null(leveltag);

		tmp = format_add_linestart(str, prestr);
		g_free(str);
		g_free(prestr);

                gui_printtext_after(&dest, line_prev, tmp);
		g_free(tmp);

                line = textbuffer_insert(gui->view->buffer, gui->insert_after,
					 (unsigned char *) raw->str,
					 raw->len, &line_info);
		textbuffer_view_insert_line(gui->view, line);
	}
	g_string_free(raw, TRUE);
}
Ejemplo n.º 4
0
void textbuffer_line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line,
				int fg, int bg, int flags)
{
	unsigned char data[20];
	int pos;

        /* get the fg & bg command chars */
	fg = fg < 0 ? LINE_COLOR_DEFAULT : fg & 0x0f;
	bg = LINE_COLOR_BG | (bg < 0 ? LINE_COLOR_DEFAULT : bg & 0x0f);

	pos = 0;
	if (fg != buffer->last_fg) {
		buffer->last_fg = fg;
		data[pos++] = 0;
		data[pos++] = fg == 0 ? LINE_CMD_COLOR0 : fg;
	}
	if (bg != buffer->last_bg) {
                buffer->last_bg = bg;
		data[pos++] = 0;
		data[pos++] = bg;
	}

	if ((flags & GUI_PRINT_FLAG_UNDERLINE) != (buffer->last_flags & GUI_PRINT_FLAG_UNDERLINE)) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_UNDERLINE;
	}
	if ((flags & GUI_PRINT_FLAG_REVERSE) != (buffer->last_flags & GUI_PRINT_FLAG_REVERSE)) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_REVERSE;
	}
	if ((flags & GUI_PRINT_FLAG_BLINK) != (buffer->last_flags & GUI_PRINT_FLAG_BLINK)) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_BLINK;
	}
	if ((flags & GUI_PRINT_FLAG_BOLD) != (buffer->last_flags & GUI_PRINT_FLAG_BOLD)) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_BOLD;
	}
	if ((flags & GUI_PRINT_FLAG_ITALIC) != (buffer->last_flags & GUI_PRINT_FLAG_ITALIC)) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_ITALIC;
	}
	if (flags & GUI_PRINT_FLAG_INDENT) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_INDENT;
	}

        if (pos > 0)
		*line = textbuffer_insert(buffer, *line, data, pos, NULL);

	buffer->last_flags = flags;
}
Ejemplo n.º 5
0
static void line_add_indent_func(TEXT_BUFFER_REC *buffer, LINE_REC **line,
				 const char *function)
{
        GSList *list;
        unsigned char data[1+sizeof(INDENT_FUNC)];

        list = g_hash_table_lookup(indent_functions, function);
	if (list != NULL) {
		data[0] = LINE_CMD_INDENT_FUNC;
		memcpy(data+1, list->data, sizeof(INDENT_FUNC));
		*line = textbuffer_insert(buffer, *line,
					  data, sizeof(data), NULL);
	}
}
Ejemplo n.º 6
0
static void sig_gui_print_text(WINDOW_REC *window, void *fgcolor,
			       void *bgcolor, void *pflags,
			       char *str, TEXT_DEST_REC *dest)
{
        GUI_WINDOW_REC *gui;
        TEXT_BUFFER_VIEW_REC *view;
	LINE_REC *insert_after;
        LINE_INFO_REC lineinfo;
	int fg, bg, flags, attr;

	flags = GPOINTER_TO_INT(pflags);
	fg = GPOINTER_TO_INT(fgcolor);
	bg = GPOINTER_TO_INT(bgcolor);
	get_colors(flags, &fg, &bg, &attr);

	if (window == NULL) {
                g_return_if_fail(next_xpos != -1);

		term_set_color2(root_window, attr, fg, bg);

		term_move(root_window, next_xpos, next_ypos);
		if (flags & GUI_PRINT_FLAG_CLRTOEOL)
			term_clrtoeol(root_window);
		term_addstr(root_window, str);
		next_xpos += strlen(str); /* FIXME utf8 or big5 */
                return;
	}

	lineinfo.level = dest == NULL ? 0 : dest->level;
        gui = WINDOW_GUI(window);
        lineinfo.time = (gui->use_insert_after && gui->insert_after_time) ?
		gui->insert_after_time : time(NULL);

	view = gui->view;
	insert_after = gui->use_insert_after ?
		gui->insert_after : view->buffer->cur_line;

	if (flags & GUI_PRINT_FLAG_NEWLINE) {
                view_add_eol(view, &insert_after);
	}
	textbuffer_line_add_colors(view->buffer, &insert_after, fg, bg, flags);

	insert_after = textbuffer_insert(view->buffer, insert_after,
					 (unsigned char *) str,
					 strlen(str), &lineinfo);
	if (gui->use_insert_after)
                gui->insert_after = insert_after;
}
Ejemplo n.º 7
0
static void sig_gui_printtext_finished(WINDOW_REC *window)
{
	GUI_WINDOW_REC *gui;
        LINE_REC *insert_after;

	if (format->len == 0)
                return;

	/* save format of the line */
        gui = WINDOW_GUI(window);
	insert_after = gui->use_insert_after ?
		gui->insert_after : gui->view->buffer->cur_line;

	textbuffer_insert(gui->view->buffer, insert_after,
			  (unsigned char *) format->str,
			  format->len, NULL);

	g_string_truncate(format, 0);
}
Ejemplo n.º 8
0
void quassel_irssi_backlog(void* arg, int msg_id, int timestamp, int bufferid, int network, char* buffer_id, char* sender, int type, int flags, char* content) {
	(void) msg_id;
	(void) bufferid;
	(void) type;
	(void) flags;
	Quassel_SERVER_REC *server = (Quassel_SERVER_REC*)arg;

	char *chan = channame(network, buffer_id);
	char *nick = strdup(sender);
	char *address;
	if( (address=index(nick, '!')) != NULL)
		*address = 0;
	address++;

	GSList *win = windows;
	while(win) {
		WINDOW_REC* winrec = (WINDOW_REC*) win->data;
		if(winrec->active_server != SERVER(server) &&
			winrec->connect_server != SERVER(server))
			goto next;

		if(!winrec->active)
			goto next;

		if(strcmp(winrec->active->visible_name, chan)!=0)
			goto next;

		if(!WINDOW_GUI(winrec) ||
				!WINDOW_GUI(winrec)->view ||
				!WINDOW_GUI(winrec)->view->buffer)
			goto next;

		LINE_INFO_REC lineinforec;
		lineinforec.time=timestamp;
		lineinforec.level = 0;

		LINE_REC* pos = WINDOW_GUI(winrec)->view->buffer->first_line;
		LINE_REC* before = pos;
		for(; pos!=NULL; pos = pos->next) {
			if(pos->info.time >= timestamp)
				break;
			before = pos;
		}

		unsigned char *data = NULL;
		int len = asprintf((char**)&data, "%d:%s:%sxx", timestamp, nick, content);
		data[len-2]=0;
		data[len-1]=0x80;
		LINE_REC *linerec = textbuffer_insert(WINDOW_GUI(winrec)->view->buffer, before, data, len, &lineinforec);
		free(data);
		textbuffer_view_insert_line(WINDOW_GUI(winrec)->view, linerec);
		if(WINDOW_GUI(winrec)->insert_after)
			WINDOW_GUI(winrec)->insert_after = linerec;

		WINDOW_GUI(winrec)->view->dirty = 1;
		winrec->last_line = time(NULL);

		mainwindows_redraw();
next:
		win = g_slist_next(win);
	}
	free(nick);
}
Ejemplo n.º 9
0
LINE_REC *textbuffer_append(TEXT_BUFFER_REC *buffer,
			    const unsigned char *data, int len,
			    LINE_INFO_REC *info)
{
        return textbuffer_insert(buffer, buffer->cur_line, data, len, info);
}
Ejemplo n.º 10
0
void textbuffer_line_add_colors(TEXT_BUFFER_REC *buffer, LINE_REC **line,
				int fg, int bg, int flags)
{
	unsigned char data[22];
	int pos;

	pos = 0;
	if (fg != buffer->last_fg
	    || (flags & GUI_PRINT_FLAG_COLOR_24_FG) != (buffer->last_flags & GUI_PRINT_FLAG_COLOR_24_FG)) {
		buffer->last_fg = fg;
		data[pos++] = 0;
#ifdef TERM_TRUECOLOR
		if (flags & GUI_PRINT_FLAG_COLOR_24_FG)
			format_24bit_line_color(data, &pos, 0, fg);
		else
#endif
		if (fg < 0)
			data[pos++] = LINE_COLOR_DEFAULT;
		else if (fg < 16)
			data[pos++] = fg == 0 ? LINE_CMD_COLOR0 : fg;
		else if (fg < 256) {
			data[pos++] = LINE_COLOR_EXT;
			data[pos++] = fg;
		}
	}
	if (bg != buffer->last_bg
	    || (flags & GUI_PRINT_FLAG_COLOR_24_BG) != (buffer->last_flags & GUI_PRINT_FLAG_COLOR_24_BG)) {
                buffer->last_bg = bg;
		data[pos++] = 0;
#ifdef TERM_TRUECOLOR
		if (flags & GUI_PRINT_FLAG_COLOR_24_BG)
			format_24bit_line_color(data, &pos, 1, bg);
		else
#endif
		if (bg < 0)
			data[pos++] = LINE_COLOR_BG | LINE_COLOR_DEFAULT;
		else if (bg < 16)
			data[pos++] = LINE_COLOR_BG | bg;
		else if (bg < 256) {
			data[pos++] = LINE_COLOR_EXT_BG;
			data[pos++] = bg;
		}
	}

	if ((flags & GUI_PRINT_FLAG_UNDERLINE) != (buffer->last_flags & GUI_PRINT_FLAG_UNDERLINE)) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_UNDERLINE;
	}
	if ((flags & GUI_PRINT_FLAG_REVERSE) != (buffer->last_flags & GUI_PRINT_FLAG_REVERSE)) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_REVERSE;
	}
	if ((flags & GUI_PRINT_FLAG_BLINK) != (buffer->last_flags & GUI_PRINT_FLAG_BLINK)) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_BLINK;
	}
	if ((flags & GUI_PRINT_FLAG_BOLD) != (buffer->last_flags & GUI_PRINT_FLAG_BOLD)) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_BOLD;
	}
	if (flags & GUI_PRINT_FLAG_INDENT) {
		data[pos++] = 0;
		data[pos++] = LINE_CMD_INDENT;
	}

        if (pos > 0)
		*line = textbuffer_insert(buffer, *line, data, pos, NULL);

	buffer->last_flags = flags;
}