# HG changeset patch # User mikael # Date 1113671695 0 # Node ID ff119bb115631c82351f94a583160307ec1c9227 # Parent b392112ab995c1c0954f10f12c0f0d0aa49afa74 [/trunk] Changeset 89 by mikael * Fix wrapping (prefix) issue. diff -r b392112ab995 -r ff119bb11563 mcabber/src/hbuf.c --- a/mcabber/src/hbuf.c Sat Apr 16 16:37:31 2005 +0000 +++ b/mcabber/src/hbuf.c Sat Apr 16 17:14:55 2005 +0000 @@ -26,6 +26,7 @@ /* This is a private structure type */ +#define PREFIX_LENGTH 32 typedef struct { char *ptr; char *ptr_end; @@ -35,19 +36,20 @@ // (for ex. when HBB_FLAG_PERSISTENT is set). struct { // hbuf_line_info char *ptr_end_alloc; - char prefix[32]; + char prefix[PREFIX_LENGTH]; } persist; } hbuf_block; -// hbuf_add_line(p_hbuf, text, width) +// hbuf_add_line(p_hbuf, text, prefix, width) // Add a line to the given buffer. If width is not null, then lines are // wrapped at this length. // // Note 1: Splitting according to width won't work if there are tabs; they // should be expanded before. // Note 2: width does not include the ending \0. -void hbuf_add_line(GList **p_hbuf, char *text, unsigned int width) +void hbuf_add_line(GList **p_hbuf, const char *text, const char *prefix, + unsigned int width) { GList *hbuf = *p_hbuf; char *line, *cr, *end; @@ -55,6 +57,8 @@ if (!text) return; hbuf_block *hbuf_block_elt = g_new0(hbuf_block, 1); + if (prefix) + strncpy(hbuf_block_elt->persist.prefix, prefix, PREFIX_LENGTH-1); if (!hbuf) { hbuf_block_elt->ptr = g_new(char, HBB_BLOCKSIZE); hbuf_block_elt->flags = HBB_FLAG_ALLOC | HBB_FLAG_PERSISTENT; @@ -216,14 +220,15 @@ } // hbuf_get_lines(hbuf, n, where) -// Returns an array of n pointers (for n lines from hbuf) +// Returns an array of 2*n pointers (for n prefixes + n lines from hbuf) +// (prefix line 1, line 1, prefix line 2, line 2, etc.) // (The first line will be the line currently pointed by hbuf) // Note:The caller should free the array after use. char **hbuf_get_lines(GList *hbuf, unsigned int n) { unsigned int i; - char **array = g_new0(char*, n); + char **array = g_new0(char*, n*2); char **array_elt = array; for (i=0 ; i < n ; i++) { @@ -231,6 +236,7 @@ hbuf_block *blk = (hbuf_block*)(hbuf->data); int maxlen; maxlen = blk->ptr_end - blk->ptr; + *array_elt++ = blk->persist.prefix; *array_elt++ = g_strndup(blk->ptr, maxlen); hbuf = g_list_next(hbuf); } else diff -r b392112ab995 -r ff119bb11563 mcabber/src/hbuf.h --- a/mcabber/src/hbuf.h Sat Apr 16 16:37:31 2005 +0000 +++ b/mcabber/src/hbuf.h Sat Apr 16 17:14:55 2005 +0000 @@ -12,7 +12,8 @@ #define HBB_FLAG_PERSISTENT 2 // #define HBB_FLAG_FREE 4 -void hbuf_add_line(GList **p_hbuf, char *text, unsigned int width); +void hbuf_add_line(GList **p_hbuf, const char *text, const char *prefix, + unsigned int width); void hbuf_free(GList **p_hbuf); void hbuf_rebuild(GList **p_hbuf, unsigned int width); diff -r b392112ab995 -r ff119bb11563 mcabber/src/screen.c --- a/mcabber/src/screen.c Sat Apr 16 16:37:31 2005 +0000 +++ b/mcabber/src/screen.c Sat Apr 16 17:14:55 2005 +0000 @@ -246,11 +246,17 @@ wmove(win_entry->win, 0, 0); for (n = 0; n < CHAT_WIN_HEIGHT; n++) { int r = width; - if (*(lines+n)) { - wprintw(win_entry->win, "%s", *(lines+n)); - r -= strlen(*(lines+n)); - }// else - // wmove(win_entry->win, n, 0); + if (*(lines+2*n)) { + if (**(lines+2*n)) + wprintw(win_entry->win, "%s", *(lines+2*n)); // prefix + else { + wprintw(win_entry->win, " "); + r -= 12; + } + wprintw(win_entry->win, "%s", *(lines+2*n+1)); // line + // Calculate the number of blank characters to empty the line + r -= strlen(*(lines+2*n)) + strlen(*(lines+2*n+1)); + } for ( ; r>0 ; r--) { wprintw(win_entry->win, " "); } @@ -291,25 +297,25 @@ } -void scr_WriteInWindow(const char *winId, char *text, int TimeStamp, - int force_show) +void scr_WriteInWindow(const char *winId, const char *text, int TimeStamp, + const char *prefix, int force_show) { - char *line; + char *fullprefix = NULL; window_entry_t *win_entry; int dont_show = FALSE; - line = calloc(1, strlen(text)+16); - - // Prepare line (timestamp + text) - // FIXME: actually timestamp and text should not be merged, there is a prefix - // field in the hbuf_block structure just for that. - if (TimeStamp) { - time_t now = time(NULL); - strftime(line, 12, "[%H:%M] ", localtime(&now)); - } else { - strcpy(line, " "); + // Prepare the prefix + if (prefix || TimeStamp) { + if (!prefix) prefix = ""; + fullprefix = calloc(1, strlen(prefix)+16); + if (TimeStamp) { + time_t now = time(NULL); + strftime(fullprefix, 12, "[%H:%M] ", localtime(&now)); + } else { + strcpy(fullprefix, " "); + } + strcat(fullprefix, prefix); } - strcat(line, text); // Look for the window entry. win_entry = scr_SearchWindow(winId); @@ -326,9 +332,9 @@ maxX - ROSTER_WIDTH, dont_show); } - hbuf_add_line(&win_entry->hbuf, line, + hbuf_add_line(&win_entry->hbuf, text, fullprefix, maxX - scr_WindowWidth(rosterWnd) - 14); - free(line); + free(fullprefix); if (!dont_show) { // Show and refresh the window @@ -407,28 +413,15 @@ return; } -// XXX This function is almost useless now. Once we handle properly -// the prefix in scr_WriteInWindow(), we can remove it... void scr_WriteMessage(const char *jid, const char *text, char *prefix) { - char *buffer = (char *) malloc(strlen(prefix) + strlen(text) + 1); - - if (prefix) - strcpy(buffer, prefix); - else - *buffer = 0; - - strcat(buffer, text); - - scr_WriteInWindow(jid, buffer, TRUE, FALSE); - - free(buffer); + scr_WriteInWindow(jid, text, TRUE, prefix, FALSE); } void scr_WriteIncomingMessage(const char *jidfrom, const char *text) { char *buffer = utf8_decode(text); - // FIXME expand tabs... + // FIXME expand tabs / filter out special chars... scr_WriteMessage(jidfrom, buffer, "<== "); free(buffer); top_panel(inputPanel); @@ -441,7 +434,6 @@ scr_WriteMessage(jidto, text, "--> "); scr_ShowWindow(jidto); top_panel(inputPanel); - //refresh(); // XXX ? } int scr_Getch(void)