summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ChangeLog.pre-2-06
-rw-r--r--ChangeLog.pre-2-106
-rw-r--r--ChangeLog.pre-2-26
-rw-r--r--ChangeLog.pre-2-46
-rw-r--r--ChangeLog.pre-2-66
-rw-r--r--ChangeLog.pre-2-86
-rw-r--r--glib/glib.h14
-rw-r--r--gtk/gtkentry.c206
-rw-r--r--gtk/gtkentry.h1
10 files changed, 193 insertions, 70 deletions
diff --git a/ChangeLog b/ChangeLog
index df38998ac7..07cd5d9da4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jan 7 18:06:17 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gtk/gtkentry.c:
+ * gtk/gtkentry.h: applied patch to use a backing pixmap for
+ drawing, which removes the bad flickering. (gtk-wille-980106-0)
+
Wed Jan 7 02:14:30 PST 1998 Manish Singh <yosh@gimp.org>
* glib/glib.h
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index df38998ac7..07cd5d9da4 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,9 @@
+Wed Jan 7 18:06:17 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gtk/gtkentry.c:
+ * gtk/gtkentry.h: applied patch to use a backing pixmap for
+ drawing, which removes the bad flickering. (gtk-wille-980106-0)
+
Wed Jan 7 02:14:30 PST 1998 Manish Singh <yosh@gimp.org>
* glib/glib.h
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index df38998ac7..07cd5d9da4 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,9 @@
+Wed Jan 7 18:06:17 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gtk/gtkentry.c:
+ * gtk/gtkentry.h: applied patch to use a backing pixmap for
+ drawing, which removes the bad flickering. (gtk-wille-980106-0)
+
Wed Jan 7 02:14:30 PST 1998 Manish Singh <yosh@gimp.org>
* glib/glib.h
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index df38998ac7..07cd5d9da4 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,9 @@
+Wed Jan 7 18:06:17 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gtk/gtkentry.c:
+ * gtk/gtkentry.h: applied patch to use a backing pixmap for
+ drawing, which removes the bad flickering. (gtk-wille-980106-0)
+
Wed Jan 7 02:14:30 PST 1998 Manish Singh <yosh@gimp.org>
* glib/glib.h
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index df38998ac7..07cd5d9da4 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,9 @@
+Wed Jan 7 18:06:17 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gtk/gtkentry.c:
+ * gtk/gtkentry.h: applied patch to use a backing pixmap for
+ drawing, which removes the bad flickering. (gtk-wille-980106-0)
+
Wed Jan 7 02:14:30 PST 1998 Manish Singh <yosh@gimp.org>
* glib/glib.h
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index df38998ac7..07cd5d9da4 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,9 @@
+Wed Jan 7 18:06:17 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gtk/gtkentry.c:
+ * gtk/gtkentry.h: applied patch to use a backing pixmap for
+ drawing, which removes the bad flickering. (gtk-wille-980106-0)
+
Wed Jan 7 02:14:30 PST 1998 Manish Singh <yosh@gimp.org>
* glib/glib.h
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index df38998ac7..07cd5d9da4 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,9 @@
+Wed Jan 7 18:06:17 PST 1998 Manish Singh <yosh@gimp.org>
+
+ * gtk/gtkentry.c:
+ * gtk/gtkentry.h: applied patch to use a backing pixmap for
+ drawing, which removes the bad flickering. (gtk-wille-980106-0)
+
Wed Jan 7 02:14:30 PST 1998 Manish Singh <yosh@gimp.org>
* glib/glib.h
diff --git a/glib/glib.h b/glib/glib.h
index c77ccc3d7d..b07ea11375 100644
--- a/glib/glib.h
+++ b/glib/glib.h
@@ -397,9 +397,10 @@ GList* g_list_prepend (GList *list,
GList* g_list_insert (GList *list,
gpointer data,
gint position);
-GList* g_list_insert_sorted (GList *list,
- gpointer data,
- GCompareFunc func);
+GList* g_list_insert_sorted
+ (GList *list,
+ gpointer data,
+ GCompareFunc func);
GList* g_list_concat (GList *list1,
GList *list2);
GList* g_list_remove (GList *list,
@@ -433,9 +434,10 @@ GSList* g_slist_prepend (GSList *list,
GSList* g_slist_insert (GSList *list,
gpointer data,
gint position);
-GSList* g_slist_insert_sorted (GSList *list,
- gpointer data,
- GCompareFunc func);
+GSList* g_slist_insert_sorted
+ (GSList *list,
+ gpointer data,
+ GCompareFunc func);
GSList* g_slist_concat (GSList *list1,
GSList *list2);
GSList* g_slist_remove (GSList *list,
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index 5069f150b2..973a6f09b2 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -72,6 +72,8 @@ static void gtk_entry_size_request (GtkWidget *widget,
GtkRequisition *requisition);
static void gtk_entry_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
+static void gtk_entry_make_backing_pixmap (GtkEntry *entry,
+ gint width, gint height);
static void gtk_entry_draw (GtkWidget *widget,
GdkRectangle *area);
static gint gtk_entry_expose (GtkWidget *widget,
@@ -97,6 +99,9 @@ static void gtk_entry_selection_received (GtkWidget *widget,
GtkSelectionData *selection_data);
static void gtk_entry_draw_text (GtkEntry *entry);
static void gtk_entry_draw_cursor (GtkEntry *entry);
+static void gtk_entry_draw_cursor_on_drawable
+ (GtkEntry *entry,
+ GdkDrawable *drawable);
static void gtk_entry_queue_draw (GtkEntry *entry);
static gint gtk_entry_timer (gpointer data);
static gint gtk_entry_position (GtkEntry *entry,
@@ -314,6 +319,7 @@ gtk_entry_init (GtkEntry *entry)
GTK_WIDGET_SET_FLAGS (entry, GTK_CAN_FOCUS);
entry->text_area = NULL;
+ entry->backing_pixmap = NULL;
entry->text = NULL;
entry->text_size = 0;
entry->text_length = 0;
@@ -538,6 +544,9 @@ gtk_entry_destroy (GtkObject *object)
g_free (entry->text);
entry->text = NULL;
+ if (entry->backing_pixmap)
+ gdk_pixmap_unref (entry->backing_pixmap);
+
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
@@ -1034,9 +1043,7 @@ gtk_entry_key_press (GtkWidget *widget,
if (event->state & GDK_CONTROL_MASK)
gtk_delete_line (entry);
else if (event->state & GDK_SHIFT_MASK)
- {
- gtk_entry_cut_clipboard (entry, event);
- }
+ gtk_entry_cut_clipboard (entry, event);
else
gtk_delete_forward_character (entry);
}
@@ -1373,6 +1380,33 @@ gtk_entry_selection_received (GtkWidget *widget,
}
static void
+gtk_entry_make_backing_pixmap (GtkEntry *entry, gint width, gint height)
+{
+ gint pixmap_width, pixmap_height;
+
+ if (!entry->backing_pixmap)
+ {
+ /* allocate */
+ entry->backing_pixmap = gdk_pixmap_new (entry->text_area,
+ width, height,
+ -1);
+ }
+ else
+ {
+ /* reallocate if sizes don't match */
+ gdk_window_get_size (entry->backing_pixmap,
+ &pixmap_width, &pixmap_height);
+ if ((pixmap_width != width) || (pixmap_height != height))
+ {
+ gdk_pixmap_unref (entry->backing_pixmap);
+ entry->backing_pixmap = gdk_pixmap_new (entry->text_area,
+ width, height,
+ -1);
+ }
+ }
+}
+
+static void
gtk_entry_draw_text (GtkEntry *entry)
{
GtkWidget *widget;
@@ -1383,6 +1417,8 @@ gtk_entry_draw_text (GtkEntry *entry)
gint selection_end_xoffset;
gint width, height;
gint y;
+ GdkDrawable *drawable;
+ gint use_backing_pixmap;
g_return_if_fail (entry != NULL);
g_return_if_fail (GTK_IS_ENTRY (entry));
@@ -1403,76 +1439,118 @@ gtk_entry_draw_text (GtkEntry *entry)
{
widget = GTK_WIDGET (entry);
- gdk_window_clear (entry->text_area);
+ if (!entry->text)
+ {
+ gdk_window_clear (entry->text_area);
+ if (entry->editable)
+ gtk_entry_draw_cursor (entry);
+ return;
+ }
+
+ gdk_window_get_size (entry->text_area, &width, &height);
- if (entry->text)
+ /*
+ If the widget has focus, draw on a backing pixmap to avoid flickering
+ and copy it to the text_area.
+ Otherwise draw to text_area directly for better speed.
+ */
+ use_backing_pixmap = GTK_WIDGET_HAS_FOCUS (widget) && (entry->text != NULL);
+ if (use_backing_pixmap)
{
- gdk_window_get_size (entry->text_area, &width, &height);
- y = (height - (widget->style->font->ascent + widget->style->font->descent)) / 2;
- y += widget->style->font->ascent;
-
- if (entry->selection_start_pos != entry->selection_end_pos)
- {
- selected_state = GTK_STATE_SELECTED;
- if (!entry->have_selection)
- selected_state = GTK_STATE_ACTIVE;
-
- selection_start_pos = MIN (entry->selection_start_pos, entry->selection_end_pos);
- selection_end_pos = MAX (entry->selection_start_pos, entry->selection_end_pos);
-
- selection_start_xoffset = gdk_text_width (widget->style->font,
- entry->text,
- selection_start_pos);
- selection_end_xoffset = gdk_text_width (widget->style->font,
- entry->text,
- selection_end_pos);
-
- if (selection_start_pos > 0)
- gdk_draw_text (entry->text_area, widget->style->font,
- widget->style->fg_gc[GTK_STATE_NORMAL],
- -entry->scroll_offset, y,
- entry->text, selection_start_pos);
-
- gdk_draw_rectangle (entry->text_area,
- widget->style->bg_gc[selected_state],
- TRUE,
- -entry->scroll_offset + selection_start_xoffset,
- 0,
- selection_end_xoffset - selection_start_xoffset,
- -1);
-
- gdk_draw_text (entry->text_area, widget->style->font,
- widget->style->fg_gc[selected_state],
- -entry->scroll_offset + selection_start_xoffset, y,
- entry->text + selection_start_pos,
- selection_end_pos - selection_start_pos);
-
- if (selection_end_pos < entry->text_length)
- gdk_draw_string (entry->text_area, widget->style->font,
- widget->style->fg_gc[GTK_STATE_NORMAL],
- -entry->scroll_offset + selection_end_xoffset, y,
- entry->text + selection_end_pos);
- }
- else
- {
- GdkGCValues values;
-
- gdk_gc_get_values (widget->style->fg_gc[GTK_STATE_NORMAL], &values);
- gdk_draw_string (entry->text_area, widget->style->font,
- widget->style->fg_gc[GTK_STATE_NORMAL],
- -entry->scroll_offset, y,
- entry->text);
- }
+ gtk_entry_make_backing_pixmap (entry, width, height);
+ drawable = entry->backing_pixmap;
+ gdk_draw_rectangle (drawable,
+ widget->style->white_gc,
+ TRUE,
+ 0, 0,
+ width,
+ height);
}
+ else
+ {
+ drawable = entry->text_area;
+ gdk_window_clear (entry->text_area);
+ }
+
+ y = (height - (widget->style->font->ascent + widget->style->font->descent)) / 2;
+ y += widget->style->font->ascent;
- if(entry->editable)
- gtk_entry_draw_cursor (entry);
+ if (entry->selection_start_pos != entry->selection_end_pos)
+ {
+ selected_state = GTK_STATE_SELECTED;
+ if (!entry->have_selection)
+ selected_state = GTK_STATE_ACTIVE;
+
+ selection_start_pos = MIN (entry->selection_start_pos, entry->selection_end_pos);
+ selection_end_pos = MAX (entry->selection_start_pos, entry->selection_end_pos);
+
+ selection_start_xoffset = gdk_text_width (widget->style->font,
+ entry->text,
+ selection_start_pos);
+ selection_end_xoffset = gdk_text_width (widget->style->font,
+ entry->text,
+ selection_end_pos);
+
+ if (selection_start_pos > 0)
+ gdk_draw_text (drawable, widget->style->font,
+ widget->style->fg_gc[GTK_STATE_NORMAL],
+ -entry->scroll_offset, y,
+ entry->text, selection_start_pos);
+
+ gdk_draw_rectangle (drawable,
+ widget->style->bg_gc[selected_state],
+ TRUE,
+ -entry->scroll_offset + selection_start_xoffset,
+ 0,
+ selection_end_xoffset - selection_start_xoffset,
+ -1);
+
+ gdk_draw_text (drawable, widget->style->font,
+ widget->style->fg_gc[selected_state],
+ -entry->scroll_offset + selection_start_xoffset, y,
+ entry->text + selection_start_pos,
+ selection_end_pos - selection_start_pos);
+
+ if (selection_end_pos < entry->text_length)
+ gdk_draw_string (drawable, widget->style->font,
+ widget->style->fg_gc[GTK_STATE_NORMAL],
+ -entry->scroll_offset + selection_end_xoffset, y,
+ entry->text + selection_end_pos);
+ }
+ else
+ {
+ GdkGCValues values;
+
+ gdk_gc_get_values (widget->style->fg_gc[GTK_STATE_NORMAL], &values);
+ gdk_draw_string (drawable, widget->style->font,
+ widget->style->fg_gc[GTK_STATE_NORMAL],
+ -entry->scroll_offset, y,
+ entry->text);
+ }
+
+ if (entry->editable)
+ gtk_entry_draw_cursor_on_drawable (entry, drawable);
+
+ if (use_backing_pixmap)
+ gdk_draw_pixmap(entry->text_area,
+ widget->style->fg_gc[GTK_STATE_NORMAL],
+ entry->backing_pixmap,
+ 0, 0, 0, 0, width, height);
}
}
static void
gtk_entry_draw_cursor (GtkEntry *entry)
{
+ g_return_if_fail (entry != NULL);
+ g_return_if_fail (GTK_IS_ENTRY (entry));
+
+ gtk_entry_draw_cursor_on_drawable (entry, entry->text_area);
+}
+
+static void
+gtk_entry_draw_cursor_on_drawable (GtkEntry *entry, GdkDrawable *drawable)
+{
GtkWidget *widget;
GdkGC *gc;
gint xoffset;
@@ -1498,7 +1576,7 @@ gtk_entry_draw_cursor (GtkEntry *entry)
gc = widget->style->white_gc;
gdk_window_get_size (entry->text_area, NULL, &text_area_height);
- gdk_draw_line (entry->text_area, gc, xoffset, 0, xoffset, text_area_height);
+ gdk_draw_line (drawable, gc, xoffset, 0, xoffset, text_area_height);
#ifdef USE_XIM
if (gdk_im_ready() && entry->ic &&
gdk_ic_get_style (entry->ic) & GdkIMPreeditPosition)
diff --git a/gtk/gtkentry.h b/gtk/gtkentry.h
index aa17365386..270ef3dab0 100644
--- a/gtk/gtkentry.h
+++ b/gtk/gtkentry.h
@@ -41,6 +41,7 @@ struct _GtkEntry
GtkWidget widget;
GdkWindow *text_area;
+ GdkPixmap *backing_pixmap;
gchar *text;
guint16 text_size;