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); }
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; }
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); }
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; }
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); } }
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; }
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); }
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); }
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); }
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; }