From: <sa...@us...> - 2006-08-05 04:07:55
|
Revision: 16634 Author: sadrul Date: 2006-08-04 21:07:52 -0700 (Fri, 04 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16634&view=rev Log Message: ----------- Do not waste too much unnecessary memory. Modified Paths: -------------- trunk/console/libgnt/gnttextview.c Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-08-05 03:20:14 UTC (rev 16633) +++ trunk/console/libgnt/gnttextview.c 2006-08-05 04:07:52 UTC (rev 16634) @@ -187,7 +187,6 @@ for (i = 0; split[i]; i++) { GntTextLine *line; - int len = g_utf8_strlen(split[i], -1); char *iter = split[i]; int prev = 0; @@ -202,8 +201,9 @@ while (iter && *iter) { GntTextSegment *seg = g_new0(GntTextSegment, 1); + int len = g_utf8_offset_to_pointer(iter, widget->priv.width - line->length - 1) - iter; seg->flags = fl; - seg->text = g_new0(char, len + 1); /* XXX: MUST be improved */ + seg->text = g_new0(char, len + 1); g_utf8_strncpy(seg->text, iter, widget->priv.width - line->length - 1); line->segments = g_list_append(line->segments, seg); @@ -215,7 +215,6 @@ line = g_new0(GntTextLine, 1); view->list = g_list_prepend(g_list_first(view->list), line); } - /*len -= prev;*/ } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-20 16:25:42
|
Revision: 16902 Author: sadrul Date: 2006-08-20 09:25:36 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16902&view=rev Log Message: ----------- No blank line at the end. Modified Paths: -------------- trunk/console/libgnt/gnttextview.c Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-08-20 16:20:45 UTC (rev 16901) +++ trunk/console/libgnt/gnttextview.c 2006-08-20 16:25:36 UTC (rev 16902) @@ -35,7 +35,7 @@ GList *iter; GntTextLine *line = lines->data; - wmove(widget->window, widget->priv.height - 1 - i, 0); + wmove(widget->window, widget->priv.height - i, 0); for (iter = line->segments; iter; iter = iter->next) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-29 03:47:48
|
Revision: 17077 Author: sadrul Date: 2006-08-28 20:47:34 -0700 (Mon, 28 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=17077&view=rev Log Message: ----------- The width of the conversation windows can now be resized. Modified Paths: -------------- trunk/console/libgnt/gnttextview.c Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-08-29 02:22:08 UTC (rev 17076) +++ trunk/console/libgnt/gnttextview.c 2006-08-29 03:47:34 UTC (rev 17077) @@ -8,7 +8,8 @@ typedef struct { - GntTextFormatFlags flags; + GntTextFormatFlags tvflag; + chtype flags; char *text; } GntTextSegment; @@ -16,6 +17,7 @@ { GList *segments; /* A list of GntTextSegments */ int length; /* The current length of the line so far (ie. onscreen width) */ + gboolean soft; /* TRUE if it's an overflow from prev. line */ } GntTextLine; static GntWidgetClass *parent_class = NULL; @@ -148,6 +150,59 @@ } static void +gnt_text_view_reflow(GntTextView *view) +{ + /* This is pretty ugly, and inefficient. Someone do something about it. */ + GntTextLine *line; + GList *back, *iter, *list; + int pos = 0; + + list = view->list; + while (list->prev) { + line = list->data; + if (!line->soft) + pos++; + list = list->prev; + } + + back = g_list_last(view->list); + view->list = NULL; + gnt_text_view_clear(view); + + for (; back; back = back->prev) { + line = back->data; + + if (back->next && !line->soft) + gnt_text_view_next_line(view); + + for (iter = line->segments; iter; iter = iter->next) { + GntTextSegment *seg = iter->data; + gnt_text_view_append_text_with_flags(view, seg->text, seg->tvflag); + } + + free_text_line(line, NULL); + } + g_list_free(list); + + list = view->list = g_list_first(view->list); + while (pos--) { + while (((GntTextLine*)list->data)->soft) + list = list->next; + list = list->next; + } + view->list = list; + gnt_widget_draw(GNT_WIDGET(view)); +} + +static void +gnt_text_view_size_changed(GntWidget *widget, int w, int h) +{ + if (w != widget->priv.width) { + gnt_text_view_reflow(GNT_TEXT_VIEW(widget)); + } +} + +static void gnt_text_view_class_init(GntTextViewClass *klass) { parent_class = GNT_WIDGET_CLASS(klass); @@ -157,6 +212,7 @@ parent_class->size_request = gnt_text_view_size_request; parent_class->key_pressed = gnt_text_view_key_pressed; parent_class->clicked = gnt_text_view_clicked; + parent_class->size_changed = gnt_text_view_size_changed; DEBUG; } @@ -166,9 +222,7 @@ { GntWidget *widget = GNT_WIDGET(instance); - /* XXX: For now, resizing the width is not permitted. This is because - * of the way I am handling wrapped lines. */ - GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_Y); + GNT_WIDGET_SET_FLAGS(GNT_WIDGET(instance), GNT_WIDGET_GROW_Y | GNT_WIDGET_GROW_X); widget->priv.minw = 5; widget->priv.minh = 2; @@ -256,6 +310,7 @@ if (len) { GntTextSegment *seg = g_new0(GntTextSegment, 1); seg->flags = fl; + seg->tvflag = flags; seg->text = g_new0(char, len + 1); g_utf8_strncpy(seg->text, iter, g_utf8_pointer_to_offset(iter, iter + len)); line->segments = g_list_append(line->segments, seg); @@ -264,10 +319,12 @@ iter += len; if (line->length >= widget->priv.width - 1 && *iter) { line = g_new0(GntTextLine, 1); + line->soft = TRUE; view->list = g_list_prepend(g_list_first(view->list), line); } } else { line = g_new0(GntTextLine, 1); + line->soft = TRUE; view->list = g_list_prepend(g_list_first(view->list), line); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-09-01 06:39:16
|
Revision: 17106 http://svn.sourceforge.net/gaim/?rev=17106&view=rev Author: sadrul Date: 2006-08-31 23:38:46 -0700 (Thu, 31 Aug 2006) Log Message: ----------- wabz keeps finding bugs i left in the codes. Modified Paths: -------------- trunk/console/libgnt/gnttextview.c Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-09-01 02:44:46 UTC (rev 17105) +++ trunk/console/libgnt/gnttextview.c 2006-09-01 06:38:46 UTC (rev 17106) @@ -1,6 +1,8 @@ #include "gnttextview.h" #include "gntutils.h" +#include <string.h> + enum { SIGS = 1, @@ -320,14 +322,15 @@ end++; start = end; gnt_text_view_next_line(view); + view->list = g_list_first(view->list); continue; } line = view->list->data; if ((end = strchr(start, '\n')) != NULL || (end = strchr(start, '\r')) != NULL) { - int l = gnt_util_onscreen_width(start, end - 1); - if (l >= widget->priv.width - line->length - 1) { + len = gnt_util_onscreen_width(start, end - 1); + if (len >= widget->priv.width - line->length - 1) { end = NULL; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-10-15 00:48:40
|
Revision: 17482 http://svn.sourceforge.net/gaim/?rev=17482&view=rev Author: sadrul Date: 2006-10-14 17:48:35 -0700 (Sat, 14 Oct 2006) Log Message: ----------- Patch from Richard Nelson (wabz). This turns off some flags so that the empty spaces at the end of the lines do not have underlines or blinking. Modified Paths: -------------- trunk/console/libgnt/gnttextview.c Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-10-14 20:00:56 UTC (rev 17481) +++ trunk/console/libgnt/gnttextview.c 2006-10-15 00:48:35 UTC (rev 17482) @@ -51,10 +51,10 @@ *end = '\0'; wattrset(widget->window, seg->flags); wprintw(widget->window, "%s", (view->string->str + seg->start)); - if (!iter->next) - whline(widget->window, ' ' | seg->flags, widget->priv.width - line->length - 1); *end = back; } + wattroff(widget->window, A_UNDERLINE | A_BLINK | A_REVERSE); + whline(widget->window, ' ', widget->priv.width - line->length - 1); } scrcol = widget->priv.width - 1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-10-28 04:55:15
|
Revision: 17593 http://svn.sourceforge.net/gaim/?rev=17593&view=rev Author: sadrul Date: 2006-10-27 21:55:07 -0700 (Fri, 27 Oct 2006) Log Message: ----------- I have learnt two things today: (1) no one resizes the conversation windows (2) no one uses the lastlog plugin ... let's fix them anyway. Modified Paths: -------------- trunk/console/libgnt/gnttextview.c Modified: trunk/console/libgnt/gnttextview.c =================================================================== --- trunk/console/libgnt/gnttextview.c 2006-10-28 00:28:06 UTC (rev 17592) +++ trunk/console/libgnt/gnttextview.c 2006-10-28 04:55:07 UTC (rev 17593) @@ -162,7 +162,7 @@ GntTextLine *line; GList *back, *iter, *list; GString *string; - int pos = 0; + int pos = 0; /* no. of 'real' lines */ list = view->list; while (list->prev) { @@ -180,15 +180,15 @@ gnt_text_view_clear(view); view->string = g_string_set_size(view->string, string->len); + view->string->len = 0; GNT_WIDGET_SET_FLAGS(GNT_WIDGET(view), GNT_WIDGET_DRAWING); for (; back; back = back->prev) { line = back->data; if (back->next && !line->soft) { - GList *llist = g_list_first(view->list); - llist = g_list_prepend(llist, g_new0(GntTextLine, 1)); + gnt_text_view_append_text_with_flags(view, "\n", GNT_TEXT_FLAG_NORMAL); } - + for (iter = line->segments; iter; iter = iter->next) { GntTextSegment *seg = iter->data; char *start = string->str + seg->start; @@ -203,6 +203,7 @@ g_list_free(list); list = view->list = g_list_first(view->list); + /* Go back to the line that was in view before resizing started */ while (pos--) { while (((GntTextLine*)list->data)->soft) list = list->next; @@ -308,14 +309,14 @@ fl = gnt_text_format_flag_to_chtype(flags); len = view->string->len; - g_string_append(view->string, text); + view->string = g_string_append(view->string, text); view->list = g_list_first(view->list); start = end = view->string->str + len; while (*start) { - GntTextSegment *seg; + GntTextSegment *seg = NULL; if (*end == '\n' || *end == '\r') { end++; @@ -326,6 +327,13 @@ } line = view->list->data; + if (line->length == widget->priv.width - 1) { + /* The last added line was exactly the same width as the widget */ + line = g_new0(GntTextLine, 1); + line->soft = TRUE; + view->list = g_list_prepend(view->list, line); + } + if ((end = strchr(start, '\n')) != NULL || (end = strchr(start, '\r')) != NULL) { len = gnt_util_onscreen_width(start, end - 1); @@ -338,12 +346,21 @@ end = gnt_util_onscreen_width_to_pointer(start, widget->priv.width - line->length - 1, &len); - seg = g_new0(GntTextSegment, 1); - seg->start = start - view->string->str; + /* Try to append to the previous segment if possible */ + if (line->segments) { + seg = g_list_last(line->segments)->data; + if (seg->flags != fl) + seg = NULL; + } + + if (seg == NULL) { + seg = g_new0(GntTextSegment, 1); + seg->start = start - view->string->str; + seg->tvflag = flags; + seg->flags = fl; + line->segments = g_list_append(line->segments, seg); + } seg->end = end - view->string->str; - seg->tvflag = flags; - seg->flags = fl; - line->segments = g_list_append(line->segments, seg); line->length += len; start = end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |