diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 6 | ||||
-rw-r--r-- | glib/glib.h | 14 | ||||
-rw-r--r-- | gtk/gtkentry.c | 206 | ||||
-rw-r--r-- | gtk/gtkentry.h | 1 |
10 files changed, 193 insertions, 70 deletions
@@ -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; |