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