diff options
author | Havoc Pennington <hp@redhat.com> | 2000-12-04 23:04:17 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2000-12-04 23:04:17 +0000 |
commit | 9365d0d7dc44e67a371590edf7b5f8744963e04c (patch) | |
tree | 72f57f594f861aafca4ddc4815b16d1969699ead /gtk | |
parent | d77144614bb39e62dc40cd9b8c510b4cfee04c62 (diff) | |
download | gtk+-9365d0d7dc44e67a371590edf7b5f8744963e04c.tar.gz |
fix this to be sane
2000-12-04 Havoc Pennington <hp@redhat.com>
* gtk/gtkpaned.c (gtk_paned_expose): fix this to be sane
* gtk/gtkvpaned.c (gtk_vpaned_expose): Add an expose handler
* gtk/gtkhpaned.c (gtk_hpaned_expose): Add an expose handler
* gtk/gtknotebook.c (gtk_notebook_draw_tab): put in a temporary
hack to avoid infinite loops (queue draw instead of draw) -
Owen has more appropriate fixes in a branch he'll check in later.
* gtk/gtktextiter.c (gtk_text_iter_ends_line): handle paragraph
separator, CR, and CRLF as line ends
* gtk/gtktextbtree.c (gtk_text_btree_insert): on insertion, break
into lines using pango_find_paragraph_boundary(); other bits of
the widget are still going to be broken if the boundary isn't '\n'
though
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkhpaned.c | 49 | ||||
-rw-r--r-- | gtk/gtknotebook.c | 18 | ||||
-rw-r--r-- | gtk/gtkpaned.c | 12 | ||||
-rw-r--r-- | gtk/gtktextbtree.c | 39 | ||||
-rw-r--r-- | gtk/gtktextiter.c | 35 | ||||
-rw-r--r-- | gtk/gtkvpaned.c | 51 |
6 files changed, 172 insertions, 32 deletions
diff --git a/gtk/gtkhpaned.c b/gtk/gtkhpaned.c index 32fa276ce3..d74ac1aa05 100644 --- a/gtk/gtkhpaned.c +++ b/gtk/gtkhpaned.c @@ -32,6 +32,8 @@ static void gtk_hpaned_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_hpaned_size_allocate (GtkWidget *widget, GtkAllocation *allocation); +static gint gtk_hpaned_expose (GtkWidget *widget, + GdkEventExpose *event); static void gtk_hpaned_xor_line (GtkPaned *paned); static gboolean gtk_hpaned_button_press (GtkWidget *widget, GdkEventButton *event); @@ -40,6 +42,8 @@ static gboolean gtk_hpaned_button_release (GtkWidget *widget, static gboolean gtk_hpaned_motion (GtkWidget *widget, GdkEventMotion *event); +static gpointer parent_class; + GtkType gtk_hpaned_get_type (void) { @@ -70,10 +74,13 @@ gtk_hpaned_class_init (GtkHPanedClass *class) { GtkWidgetClass *widget_class; + parent_class = gtk_type_class (GTK_TYPE_PANED); + widget_class = (GtkWidgetClass *) class; widget_class->size_request = gtk_hpaned_size_request; widget_class->size_allocate = gtk_hpaned_size_allocate; + widget_class->expose_event = gtk_hpaned_expose; widget_class->button_press_event = gtk_hpaned_button_press; widget_class->button_release_event = gtk_hpaned_button_release; widget_class->motion_notify_event = gtk_hpaned_motion; @@ -221,6 +228,48 @@ gtk_hpaned_size_allocate (GtkWidget *widget, } } +static gint +gtk_hpaned_expose (GtkWidget *widget, + GdkEventExpose *event) +{ + GtkPaned *paned; + guint16 border_width; + + g_return_val_if_fail (widget != NULL, FALSE); + g_return_val_if_fail (GTK_IS_PANED (widget), FALSE); + + if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget)) + { + paned = GTK_PANED (widget); + border_width = GTK_CONTAINER (paned)->border_width; + + if (event->window == widget->window) + { + gdk_window_clear_area (widget->window, + event->area.x, event->area.y, + event->area.width, + event->area.height); + + /* Chain up to draw children */ + GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); + } + else if (event->window == paned->handle) + { + gtk_paint_handle (widget->style, + paned->handle, + GTK_STATE_NORMAL, + GTK_SHADOW_NONE, + &event->area, + widget, + "paned", + 0, 0, -1, -1, + GTK_ORIENTATION_VERTICAL); + } + } + + return FALSE; +} + static void gtk_hpaned_xor_line (GtkPaned *paned) { diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index 87010ec8b2..73f5a35291 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -2340,8 +2340,22 @@ gtk_notebook_draw_tab (GtkNotebook *notebook, page->tab_label->allocation.width + 1, page->tab_label->allocation.height + 1); } - if (gtk_widget_intersect (page->tab_label, area, &child_area)) - gtk_widget_draw (page->tab_label, &child_area); + if (gtk_widget_intersect (page->tab_label, area, &child_area) && + GTK_WIDGET_DRAWABLE (page->tab_label)) + { + GdkEventExpose expose_event; + + /* This is a lame hack since all this code needs rewriting anyhow */ + + expose_event.window = page->tab_label->window; + expose_event.area = child_area; + expose_event.send_event = TRUE; + expose_event.type = GDK_EXPOSE; + expose_event.count = 0; + + gtk_widget_event (page->tab_label, + (GdkEvent*)&expose_event); + } } } diff --git a/gtk/gtkpaned.c b/gtk/gtkpaned.c index 87cecc3dd0..483084702b 100644 --- a/gtk/gtkpaned.c +++ b/gtk/gtkpaned.c @@ -295,6 +295,8 @@ gtk_paned_unrealize (GtkWidget *widget) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); } + + static gint gtk_paned_expose (GtkWidget *widget, GdkEventExpose *event) @@ -310,16 +312,10 @@ gtk_paned_expose (GtkWidget *widget, { paned = GTK_PANED (widget); - if (event->window == paned->handle) - { - child_event = *event; - event->area.x += paned->handle_xpos; - event->area.y += paned->handle_ypos; - gtk_widget_draw (widget, &event->area); - } - else + if (event->window != paned->handle) { child_event = *event; + if (paned->child1 && GTK_WIDGET_NO_WINDOW (paned->child1) && gtk_widget_intersect (paned->child1, &event->area, &child_event.area)) diff --git a/gtk/gtktextbtree.c b/gtk/gtktextbtree.c index 287b5d15f3..686d170106 100644 --- a/gtk/gtktextbtree.c +++ b/gtk/gtktextbtree.c @@ -924,12 +924,15 @@ gtk_text_btree_insert (GtkTextIter *iter, * added to this line). */ GtkTextLineSegment *seg; GtkTextLine *newline; - int chunkSize; /* # characters in current chunk. */ - guint sol; /* start of line */ - guint eol; /* Pointer to character just after last - * one in current chunk. */ + int chunk_len; /* # characters in current chunk. */ + gint sol; /* start of line */ + gint eol; /* Pointer to character just after last + * one in current chunk. + */ + gint delim; /* index of paragraph delimiter */ int line_count_delta; /* Counts change to total number of - * lines in file. */ + * lines in file. + */ int char_count_delta; /* change to number of chars */ GtkTextBTree *tree; @@ -968,17 +971,14 @@ gtk_text_btree_insert (GtkTextIter *iter, char_count_delta = 0; while (eol < len) { - for (; eol < len; eol++) - { - if (text[eol] == '\n') - { - eol++; - break; - } - } - chunkSize = eol - sol; + pango_find_paragraph_boundary (text + sol, + len - sol, + &delim, + &eol); - seg = _gtk_char_segment_new (&text[sol], chunkSize); + chunk_len = eol - sol; + + seg = _gtk_char_segment_new (&text[sol], chunk_len); char_count_delta += seg->char_count; @@ -993,10 +993,9 @@ gtk_text_btree_insert (GtkTextIter *iter, cur_seg->next = seg; } - if (text[eol-1] != '\n') - { - break; - } + if (delim == eol) + /* chunk didn't end with a paragraph separator */ + break; /* * The chunk ended with a newline, so create a new GtkTextLine @@ -6703,7 +6702,7 @@ gtk_text_btree_spew_line_short (GtkTextLine *line, int indent) s = str; while (*s) { - if (*s == '\n') + if (*s == '\n' || *s == '\r') *s = '\\'; ++s; } diff --git a/gtk/gtktextiter.c b/gtk/gtktextiter.c index d73e0a8589..fae5b5dc63 100644 --- a/gtk/gtktextiter.c +++ b/gtk/gtktextiter.c @@ -1326,18 +1326,49 @@ gtk_text_iter_starts_line (const GtkTextIter *iter) * gtk_text_iter_ends_line: * @iter: an iterator * - * Returns TRUE if @iter points to a newline character. + * Returns TRUE if @iter points to the start of the paragraph delimiter + * characters for a line (delimiters will be either a newline, a + * carriage return, a carriage return followed by a newline, or a + * Unicode paragraph separator character). Note that an iterator pointing + * to the \n of a \r\n pair will not be counted as the end of a line, + * the line ends before the \r. * * Return value: whether @iter is at the end of a line **/ gboolean gtk_text_iter_ends_line (const GtkTextIter *iter) { + GtkTextRealIter *real; + gunichar wc; + g_return_val_if_fail (iter != NULL, FALSE); + real = gtk_text_iter_make_real (iter); + check_invariants (iter); - return gtk_text_iter_get_char (iter) == '\n'; + /* Only one character has type G_UNICODE_PARAGRAPH_SEPARATOR in + * Unicode 3.0; update this if that changes. + */ +#define PARAGRAPH_SEPARATOR 0x2029 + + wc = gtk_text_iter_get_char (iter); + + if (wc == '\r' || wc == PARAGRAPH_SEPARATOR) + return TRUE; + else if (wc == '\n') + { + /* need to determine if a \r precedes the \n, in which case + * we aren't the end of the line + */ + GtkTextIter tmp = *iter; + if (!gtk_text_iter_prev_char (&tmp)) + return FALSE; + + return gtk_text_iter_get_char (&tmp) != '\r'; + } + else + return FALSE; } /** diff --git a/gtk/gtkvpaned.c b/gtk/gtkvpaned.c index 69bfed62d9..5347372fa3 100644 --- a/gtk/gtkvpaned.c +++ b/gtk/gtkvpaned.c @@ -32,6 +32,8 @@ static void gtk_vpaned_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_vpaned_size_allocate (GtkWidget *widget, GtkAllocation *allocation); +static gint gtk_vpaned_expose (GtkWidget *widget, + GdkEventExpose *expose); static void gtk_vpaned_xor_line (GtkPaned *paned); static gboolean gtk_vpaned_button_press (GtkWidget *widget, GdkEventButton *event); @@ -40,6 +42,8 @@ static gboolean gtk_vpaned_button_release (GtkWidget *widget, static gboolean gtk_vpaned_motion (GtkWidget *widget, GdkEventMotion *event); +static gpointer parent_class; + GtkType gtk_vpaned_get_type (void) { @@ -70,10 +74,13 @@ gtk_vpaned_class_init (GtkVPanedClass *class) { GtkWidgetClass *widget_class; + parent_class = gtk_type_class (GTK_TYPE_PANED); + widget_class = (GtkWidgetClass *) class; widget_class->size_request = gtk_vpaned_size_request; widget_class->size_allocate = gtk_vpaned_size_allocate; + widget_class->expose_event = gtk_vpaned_expose; widget_class->button_press_event = gtk_vpaned_button_press; widget_class->button_release_event = gtk_vpaned_button_release; widget_class->motion_notify_event = gtk_vpaned_motion; @@ -221,6 +228,50 @@ gtk_vpaned_size_allocate (GtkWidget *widget, } } +static gint +gtk_vpaned_expose (GtkWidget *widget, + GdkEventExpose *event) +{ + GtkPaned *paned; + guint16 border_width; + + g_return_val_if_fail (widget != NULL, FALSE); + g_return_val_if_fail (GTK_IS_PANED (widget), FALSE); + + if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget)) + { + paned = GTK_PANED (widget); + border_width = GTK_CONTAINER (paned)->border_width; + + if (event->window == widget->window) + { + gdk_window_clear_area (widget->window, + event->area.x, event->area.y, + event->area.width, + event->area.height); + + + /* Chain up to draw children */ + GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); + } + else if (event->window == paned->handle) + { + gtk_paint_handle (widget->style, + paned->handle, + GTK_STATE_NORMAL, + GTK_SHADOW_NONE, + &event->area, + widget, + "paned", + 0, 0, -1, -1, + GTK_ORIENTATION_HORIZONTAL); + + } + } + + return FALSE; +} + static void gtk_vpaned_xor_line (GtkPaned *paned) { |