summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2000-12-04 23:04:17 +0000
committerHavoc Pennington <hp@src.gnome.org>2000-12-04 23:04:17 +0000
commit9365d0d7dc44e67a371590edf7b5f8744963e04c (patch)
tree72f57f594f861aafca4ddc4815b16d1969699ead /gtk
parentd77144614bb39e62dc40cd9b8c510b4cfee04c62 (diff)
downloadgtk+-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.c49
-rw-r--r--gtk/gtknotebook.c18
-rw-r--r--gtk/gtkpaned.c12
-rw-r--r--gtk/gtktextbtree.c39
-rw-r--r--gtk/gtktextiter.c35
-rw-r--r--gtk/gtkvpaned.c51
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)
{