X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkentry.c;h=4dacb7d83c78f5724749348c823bafa25d2fb2b3;hb=f91c04e2846de010871ee21389eb926dd18e065e;hp=4cb2c06eee4a038b4d37dd0362fbc19596831f13;hpb=2432bf4a587f1a49e4827048ec353e0027652c69;p=~andy%2Fgtk diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 4cb2c06ee..4dacb7d83 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -33,7 +33,6 @@ #include #include -#include "gdk/gdkkeysyms.h" #include "gtkalignment.h" #include "gtkbindings.h" #include "gtkcelleditable.h" @@ -59,12 +58,59 @@ #include "gtkwindow.h" #include "gtktreeview.h" #include "gtktreeselection.h" +#include "gtktypebuiltins.h" #include "gtkprivate.h" #include "gtkentryprivate.h" #include "gtkcelllayout.h" #include "gtktooltip.h" #include "gtkiconfactory.h" #include "gtkicontheme.h" +#include "gtkwidgetprivate.h" +#include "gtkstylecontextprivate.h" + +/** + * SECTION:gtkentry + * @Short_description: A single line text entry field + * @Title: GtkEntry + * @See_also: #GtkTextView, #GtkEntryCompletion + * + * The #GtkEntry widget is a single line text entry + * widget. A fairly large set of key bindings are supported + * by default. If the entered text is longer than the allocation + * of the widget, the widget will scroll so that the cursor + * position is visible. + * + * When using an entry for passwords and other sensitive information, + * it can be put into "password mode" using gtk_entry_set_visibility(). + * In this mode, entered text is displayed using a 'invisible' character. + * By default, GTK+ picks the best invisible character that is available + * in the current font, but it can be changed with + * gtk_entry_set_invisible_char(). Since 2.16, GTK+ displays a warning + * when Caps Lock or input methods might interfere with entering text in + * a password entry. The warning can be turned off with the + * #GtkEntry:caps-lock-warning property. + * + * Since 2.16, GtkEntry has the ability to display progress or activity + * information behind the text. To make an entry display such information, + * use gtk_entry_set_progress_fraction() or gtk_entry_set_progress_pulse_step(). + * + * Additionally, GtkEntry can show icons at either side of the entry. These + * icons can be activatable by clicking, can be set up as drag source and + * can have tooltips. To add an icon, use gtk_entry_set_icon_from_gicon() or + * one of the various other functions that set an icon from a stock id, an + * icon name or a pixbuf. To trigger an action when the user clicks an icon, + * connect to the #GtkEntry::icon-press signal. To allow DND operations + * from an icon, use gtk_entry_set_icon_drag_source(). To set a tooltip on + * an icon, use gtk_entry_set_icon_tooltip_text() or the corresponding function + * for markup. + * + * Note that functionality or information that is only available by clicking + * on an icon in an entry may not be accessible at all to users which are not + * able to use a mouse or other pointing device. It is therefore recommended + * that any such functionality should also be available by other means, e.g. + * via the context menu of the entry. + */ + #define GTK_ENTRY_COMPLETION_KEY "gtk-entry-completion-key" @@ -85,11 +131,89 @@ static GQuark quark_password_hint = 0; static GQuark quark_cursor_hadjustment = 0; static GQuark quark_capslock_feedback = 0; -typedef struct _GtkEntryPrivate GtkEntryPrivate; +typedef struct _EntryIconInfo EntryIconInfo; +typedef struct _GtkEntryPasswordHint GtkEntryPasswordHint; +typedef struct _GtkEntryCapslockFeedback GtkEntryCapslockFeedback; -#define GTK_ENTRY_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ENTRY, GtkEntryPrivate)) +struct _GtkEntryPrivate +{ + EntryIconInfo *icons[MAX_ICONS]; + + GtkEntryBuffer *buffer; + GtkIMContext *im_context; + GtkShadowType shadow_type; + GtkWidget *popup_menu; + + GdkDevice *completion_device; + GdkWindow *text_area; + + PangoLayout *cached_layout; + + gchar *im_module; + + gdouble progress_fraction; + gdouble progress_pulse_fraction; + gdouble progress_pulse_current; + + gfloat xalign; + + gint ascent; /* font ascent in pango units */ + gint current_pos; + gint descent; /* font descent in pango units */ + gint dnd_position; /* In chars, -1 == no DND cursor */ + gint drag_start_x; + gint drag_start_y; + gint focus_width; + gint icon_margin; + gint insert_pos; + gint selection_bound; + gint scroll_offset; + gint start_x; + gint start_y; + gint width_chars; + + gunichar invisible_char; + + guint button; + guint blink_time; /* time in msec the cursor has blinked since last user event */ + guint blink_timeout; + guint recompute_idle; + + guint16 x_text_size; /* allocated size, in bytes */ + guint16 x_n_bytes; /* length in use, in bytes */ + + guint16 preedit_length; /* length of preedit string, in bytes */ + guint16 preedit_cursor; /* offset of cursor within preedit string, in chars */ + + guint editable : 1; + guint in_drag : 1; + guint overwrite_mode : 1; + guint visible : 1; + + guint activates_default : 1; + guint cache_includes_preedit : 1; + guint caps_lock_warning : 1; + guint caps_lock_warning_shown : 1; + guint change_count : 8; + guint cursor_visible : 1; + guint editing_canceled : 1; /* Only used by GtkCellRendererText */ + guint has_frame : 1; + guint in_click : 1; /* Flag so we don't select all when clicking in entry to focus in */ + guint is_cell_renderer : 1; + guint invisible_char_set : 1; + guint interior_focus : 1; + guint mouse_cursor_obscured : 1; + guint need_im_reset : 1; + guint progress_pulse_mode : 1; + guint progress_pulse_way_back : 1; + guint real_changed : 1; + guint resolved_dir : 4; /* PangoDirection */ + guint select_words : 1; + guint select_lines : 1; + guint truncate_multiline : 1; +}; -typedef struct +struct _EntryIconInfo { GdkWindow *window; gchar *tooltip; @@ -107,51 +231,14 @@ typedef struct GtkTargetList *target_list; GdkDragAction actions; -} EntryIconInfo; - -struct _GtkEntryPrivate -{ - GtkEntryBuffer* buffer; - - gfloat xalign; - gint insert_pos; - guint blink_time; /* time in msec the cursor has blinked since last user event */ - guint interior_focus : 1; - guint real_changed : 1; - guint invisible_char_set : 1; - guint caps_lock_warning : 1; - guint caps_lock_warning_shown : 1; - guint change_count : 8; - guint progress_pulse_mode : 1; - guint progress_pulse_way_back : 1; - - gint focus_width; - GtkShadowType shadow_type; - - gdouble progress_fraction; - gdouble progress_pulse_fraction; - gdouble progress_pulse_current; - - EntryIconInfo *icons[MAX_ICONS]; - gint icon_margin; - gint start_x; - gint start_y; - - gchar *im_module; - - GdkDevice *completion_device; }; -typedef struct _GtkEntryPasswordHint GtkEntryPasswordHint; - struct _GtkEntryPasswordHint { gint position; /* Position (in text) of the last password hint */ guint source_id; /* Timeout source id */ }; -typedef struct _GtkEntryCapslockFeedback GtkEntryCapslockFeedback; - struct _GtkEntryCapslockFeedback { GtkWidget *entry; @@ -267,8 +354,10 @@ static void gtk_entry_get_preferred_height (GtkWidget *widget, static void gtk_entry_size_allocate (GtkWidget *widget, GtkAllocation *allocation); static void gtk_entry_draw_frame (GtkWidget *widget, + GtkStyleContext *context, cairo_t *cr); static void gtk_entry_draw_progress (GtkWidget *widget, + GtkStyleContext *context, cairo_t *cr); static gint gtk_entry_draw (GtkWidget *widget, cairo_t *cr); @@ -291,8 +380,7 @@ static gint gtk_entry_focus_in (GtkWidget *widget, static gint gtk_entry_focus_out (GtkWidget *widget, GdkEventFocus *event); static void gtk_entry_grab_focus (GtkWidget *widget); -static void gtk_entry_style_set (GtkWidget *widget, - GtkStyle *previous_style); +static void gtk_entry_style_updated (GtkWidget *widget); static gboolean gtk_entry_query_tooltip (GtkWidget *widget, gint x, gint y, @@ -300,8 +388,8 @@ static gboolean gtk_entry_query_tooltip (GtkWidget *widget, GtkTooltip *tooltip); static void gtk_entry_direction_changed (GtkWidget *widget, GtkTextDirection previous_dir); -static void gtk_entry_state_changed (GtkWidget *widget, - GtkStateType previous_state); +static void gtk_entry_state_flags_changed (GtkWidget *widget, + GtkStateFlags previous_state); static void gtk_entry_screen_changed (GtkWidget *widget, GdkScreen *old_screen); @@ -427,7 +515,6 @@ static void gtk_entry_draw_cursor (GtkEntry *entry, static PangoLayout *gtk_entry_ensure_layout (GtkEntry *entry, gboolean include_preedit); static void gtk_entry_reset_layout (GtkEntry *entry); -static void gtk_entry_queue_draw (GtkEntry *entry); static void gtk_entry_recompute (GtkEntry *entry); static gint gtk_entry_find_position (GtkEntry *entry, gint x); @@ -595,12 +682,12 @@ gtk_entry_class_init (GtkEntryClass *class) widget_class->focus_in_event = gtk_entry_focus_in; widget_class->focus_out_event = gtk_entry_focus_out; widget_class->grab_focus = gtk_entry_grab_focus; - widget_class->style_set = gtk_entry_style_set; + widget_class->style_updated = gtk_entry_style_updated; widget_class->query_tooltip = gtk_entry_query_tooltip; widget_class->drag_begin = gtk_entry_drag_begin; widget_class->drag_end = gtk_entry_drag_end; widget_class->direction_changed = gtk_entry_direction_changed; - widget_class->state_changed = gtk_entry_state_changed; + widget_class->state_flags_changed = gtk_entry_state_flags_changed; widget_class->screen_changed = gtk_entry_screen_changed; widget_class->mnemonic_activate = gtk_entry_mnemonic_activate; @@ -1065,7 +1152,7 @@ gtk_entry_class_init (GtkEntryClass *class) g_param_spec_boolean ("primary-icon-activatable", P_("Primary icon activatable"), P_("Whether the primary icon is activatable"), - FALSE, + TRUE, GTK_PARAM_READWRITE)); /** @@ -1086,7 +1173,7 @@ gtk_entry_class_init (GtkEntryClass *class) g_param_spec_boolean ("secondary-icon-activatable", P_("Secondary icon activatable"), P_("Whether the secondary icon is activatable"), - FALSE, + TRUE, GTK_PARAM_READWRITE)); @@ -1776,9 +1863,8 @@ gtk_entry_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (object); GtkEntry *entry = GTK_ENTRY (object); - GtkWidget *widget; + GtkEntryPrivate *priv = entry->priv; switch (prop_id) { @@ -1790,25 +1876,26 @@ gtk_entry_set_property (GObject *object, { gboolean new_value = g_value_get_boolean (value); - if (new_value != entry->editable) + if (new_value != priv->editable) { - widget = GTK_WIDGET (entry); + GtkWidget *widget = GTK_WIDGET (entry); + if (!new_value) { _gtk_entry_reset_im_context (entry); if (gtk_widget_has_focus (widget)) - gtk_im_context_focus_out (entry->im_context); + gtk_im_context_focus_out (priv->im_context); - entry->preedit_length = 0; - entry->preedit_cursor = 0; + priv->preedit_length = 0; + priv->preedit_cursor = 0; } - entry->editable = new_value; + priv->editable = new_value; if (new_value && gtk_widget_has_focus (widget)) - gtk_im_context_focus_in (entry->im_context); - - gtk_entry_queue_draw (entry); + gtk_im_context_focus_in (priv->im_context); + + gtk_widget_queue_draw (widget); } } break; @@ -1850,7 +1937,7 @@ gtk_entry_set_property (GObject *object, break; case PROP_TRUNCATE_MULTILINE: - entry->truncate_multiline = g_value_get_boolean (value); + priv->truncate_multiline = g_value_get_boolean (value); break; case PROP_SHADOW_TYPE: @@ -1979,12 +2066,12 @@ gtk_entry_set_property (GObject *object, case PROP_IM_MODULE: g_free (priv->im_module); priv->im_module = g_value_dup_string (value); - if (GTK_IS_IM_MULTICONTEXT (entry->im_context)) - gtk_im_multicontext_set_context_id (GTK_IM_MULTICONTEXT (entry->im_context), priv->im_module); + if (GTK_IS_IM_MULTICONTEXT (priv->im_context)) + gtk_im_multicontext_set_context_id (GTK_IM_MULTICONTEXT (priv->im_context), priv->im_module); break; case PROP_EDITING_CANCELED: - entry->editing_canceled = g_value_get_boolean (value); + priv->editing_canceled = g_value_get_boolean (value); break; case PROP_SCROLL_OFFSET: @@ -2001,8 +2088,8 @@ gtk_entry_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (object); GtkEntry *entry = GTK_ENTRY (object); + GtkEntryPrivate *priv = entry->priv; switch (prop_id) { @@ -2011,15 +2098,15 @@ gtk_entry_get_property (GObject *object, break; case PROP_CURSOR_POSITION: - g_value_set_int (value, entry->current_pos); + g_value_set_int (value, priv->current_pos); break; case PROP_SELECTION_BOUND: - g_value_set_int (value, entry->selection_bound); + g_value_set_int (value, priv->selection_bound); break; case PROP_EDITABLE: - g_value_set_boolean (value, entry->editable); + g_value_set_boolean (value, priv->editable); break; case PROP_MAX_LENGTH: @@ -2027,11 +2114,11 @@ gtk_entry_get_property (GObject *object, break; case PROP_VISIBILITY: - g_value_set_boolean (value, entry->visible); + g_value_set_boolean (value, priv->visible); break; case PROP_HAS_FRAME: - g_value_set_boolean (value, entry->has_frame); + g_value_set_boolean (value, priv->has_frame); break; case PROP_INNER_BORDER: @@ -2039,19 +2126,19 @@ gtk_entry_get_property (GObject *object, break; case PROP_INVISIBLE_CHAR: - g_value_set_uint (value, entry->invisible_char); + g_value_set_uint (value, priv->invisible_char); break; case PROP_ACTIVATES_DEFAULT: - g_value_set_boolean (value, entry->activates_default); + g_value_set_boolean (value, priv->activates_default); break; case PROP_WIDTH_CHARS: - g_value_set_int (value, entry->width_chars); + g_value_set_int (value, priv->width_chars); break; case PROP_SCROLL_OFFSET: - g_value_set_int (value, entry->scroll_offset); + g_value_set_int (value, priv->scroll_offset); break; case PROP_TEXT: @@ -2063,7 +2150,7 @@ gtk_entry_get_property (GObject *object, break; case PROP_TRUNCATE_MULTILINE: - g_value_set_boolean (value, entry->truncate_multiline); + g_value_set_boolean (value, priv->truncate_multiline); break; case PROP_SHADOW_TYPE: @@ -2071,7 +2158,7 @@ gtk_entry_get_property (GObject *object, break; case PROP_OVERWRITE_MODE: - g_value_set_boolean (value, entry->overwrite_mode); + g_value_set_boolean (value, priv->overwrite_mode); break; case PROP_TEXT_LENGTH: @@ -2200,7 +2287,7 @@ gtk_entry_get_property (GObject *object, case PROP_EDITING_CANCELED: g_value_set_boolean (value, - entry->editing_canceled); + priv->editing_canceled); break; default: @@ -2223,10 +2310,9 @@ find_invisible_char (GtkWidget *widget) 0x273a /* SIXTEEN POINTED ASTERISK */ }; - if (gtk_widget_get_style (widget)) - gtk_widget_style_get (widget, - "invisible-char", &invisible_chars[0], - NULL); + gtk_widget_style_get (widget, + "invisible-char", &invisible_chars[0], + NULL); layout = gtk_widget_create_pango_layout (widget, NULL); @@ -2261,20 +2347,26 @@ find_invisible_char (GtkWidget *widget) static void gtk_entry_init (GtkEntry *entry) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkStyleContext *context; + GtkEntryPrivate *priv; + + entry->priv = G_TYPE_INSTANCE_GET_PRIVATE (entry, + GTK_TYPE_ENTRY, + GtkEntryPrivate); + priv = entry->priv; gtk_widget_set_can_focus (GTK_WIDGET (entry), TRUE); gtk_widget_set_has_window (GTK_WIDGET (entry), FALSE); - entry->editable = TRUE; - entry->visible = TRUE; - entry->invisible_char = find_invisible_char (GTK_WIDGET (entry)); - entry->dnd_position = -1; - entry->width_chars = -1; - entry->is_cell_renderer = FALSE; - entry->editing_canceled = FALSE; - entry->has_frame = TRUE; - entry->truncate_multiline = FALSE; + priv->editable = TRUE; + priv->visible = TRUE; + priv->invisible_char = find_invisible_char (GTK_WIDGET (entry)); + priv->dnd_position = -1; + priv->width_chars = -1; + priv->is_cell_renderer = FALSE; + priv->editing_canceled = FALSE; + priv->has_frame = TRUE; + priv->truncate_multiline = FALSE; priv->shadow_type = GTK_SHADOW_IN; priv->xalign = 0.0; priv->caps_lock_warning = TRUE; @@ -2291,24 +2383,26 @@ gtk_entry_init (GtkEntry *entry) /* This object is completely private. No external entity can gain a reference * to it; so we create it here and destroy it in finalize(). */ - entry->im_context = gtk_im_multicontext_new (); - - g_signal_connect (entry->im_context, "commit", + priv->im_context = gtk_im_multicontext_new (); + + g_signal_connect (priv->im_context, "commit", G_CALLBACK (gtk_entry_commit_cb), entry); - g_signal_connect (entry->im_context, "preedit-changed", + g_signal_connect (priv->im_context, "preedit-changed", G_CALLBACK (gtk_entry_preedit_changed_cb), entry); - g_signal_connect (entry->im_context, "retrieve-surrounding", + g_signal_connect (priv->im_context, "retrieve-surrounding", G_CALLBACK (gtk_entry_retrieve_surrounding_cb), entry); - g_signal_connect (entry->im_context, "delete-surrounding", + g_signal_connect (priv->im_context, "delete-surrounding", G_CALLBACK (gtk_entry_delete_surrounding_cb), entry); + context = gtk_widget_get_style_context (GTK_WIDGET (entry)); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_ENTRY); } static gint get_icon_width (GtkEntry *entry, GtkEntryIconPosition icon_pos) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = priv->icons[icon_pos]; GdkScreen *screen; GtkSettings *settings; @@ -2332,7 +2426,7 @@ get_icon_allocations (GtkEntry *entry, GtkAllocation *secondary) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; gint x, y, width, height; get_text_area_size (entry, &x, &y, &width, &height); @@ -2368,7 +2462,7 @@ get_icon_allocations (GtkEntry *entry, static void begin_change (GtkEntry *entry) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; priv->change_count++; } @@ -2377,31 +2471,31 @@ static void end_change (GtkEntry *entry) { GtkEditable *editable = GTK_EDITABLE (entry); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); - + GtkEntryPrivate *priv = entry->priv; + g_return_if_fail (priv->change_count > 0); priv->change_count--; if (priv->change_count == 0) { - if (priv->real_changed) + if (priv->real_changed) { g_signal_emit_by_name (editable, "changed"); priv->real_changed = FALSE; } - } + } } static void emit_changed (GtkEntry *entry) { GtkEditable *editable = GTK_EDITABLE (entry); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; if (priv->change_count == 0) g_signal_emit_by_name (editable, "changed"); - else + else priv->real_changed = TRUE; } @@ -2409,21 +2503,22 @@ static void gtk_entry_destroy (GtkWidget *widget) { GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; - entry->current_pos = entry->selection_bound = 0; + priv->current_pos = priv->selection_bound = 0; _gtk_entry_reset_im_context (entry); gtk_entry_reset_layout (entry); - if (entry->blink_timeout) + if (priv->blink_timeout) { - g_source_remove (entry->blink_timeout); - entry->blink_timeout = 0; + g_source_remove (priv->blink_timeout); + priv->blink_timeout = 0; } - if (entry->recompute_idle) + if (priv->recompute_idle) { - g_source_remove (entry->recompute_idle); - entry->recompute_idle = 0; + g_source_remove (priv->recompute_idle); + priv->recompute_idle = 0; } GTK_WIDGET_CLASS (gtk_entry_parent_class)->destroy (widget); @@ -2433,7 +2528,7 @@ static void gtk_entry_dispose (GObject *object) { GtkEntry *entry = GTK_ENTRY (object); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; gtk_entry_set_icon_from_pixbuf (entry, GTK_ENTRY_ICON_PRIMARY, NULL); gtk_entry_set_icon_tooltip_markup (entry, GTK_ENTRY_ICON_PRIMARY, NULL); @@ -2454,7 +2549,7 @@ static void gtk_entry_finalize (GObject *object) { GtkEntry *entry = GTK_ENTRY (object); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = NULL; gint i; @@ -2475,16 +2570,16 @@ gtk_entry_finalize (GObject *object) gtk_entry_set_completion (entry, NULL); - if (entry->cached_layout) - g_object_unref (entry->cached_layout); + if (priv->cached_layout) + g_object_unref (priv->cached_layout); - g_object_unref (entry->im_context); + g_object_unref (priv->im_context); - if (entry->blink_timeout) - g_source_remove (entry->blink_timeout); + if (priv->blink_timeout) + g_source_remove (priv->blink_timeout); - if (entry->recompute_idle) - g_source_remove (entry->recompute_idle); + if (priv->recompute_idle) + g_source_remove (priv->recompute_idle); g_free (priv->im_module); @@ -2494,12 +2589,14 @@ gtk_entry_finalize (GObject *object) static DisplayMode gtk_entry_get_display_mode (GtkEntry *entry) { - GtkEntryPrivate *priv; - if (entry->visible) + GtkEntryPrivate *priv = entry->priv; + + if (priv->visible) return DISPLAY_NORMAL; - priv = GTK_ENTRY_GET_PRIVATE (entry); - if (entry->invisible_char == 0 && priv->invisible_char_set) + + if (priv->invisible_char == 0 && priv->invisible_char_set) return DISPLAY_BLANK; + return DISPLAY_INVISIBLE; } @@ -2520,7 +2617,7 @@ gtk_entry_get_display_text (GtkEntry *entry, guint length; gint i; - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; text = gtk_entry_buffer_get_text (get_buffer (entry)); length = gtk_entry_buffer_get_length (get_buffer (entry)); @@ -2531,7 +2628,7 @@ gtk_entry_get_display_text (GtkEntry *entry, if (end_pos <= start_pos) return g_strdup (""); - else if (entry->visible) + else if (priv->visible) { start = g_utf8_offset_to_pointer (text, start_pos); end = g_utf8_offset_to_pointer (start, end_pos - start_pos); @@ -2542,10 +2639,10 @@ gtk_entry_get_display_text (GtkEntry *entry, str = g_string_sized_new (length * 2); /* Figure out what our invisible char is and encode it */ - if (!entry->invisible_char) + if (!priv->invisible_char) invisible_char = priv->invisible_char_set ? ' ' : '*'; else - invisible_char = entry->invisible_char; + invisible_char = priv->invisible_char; char_len = g_unichar_to_utf8 (invisible_char, char_str); /* @@ -2576,7 +2673,8 @@ gtk_entry_get_display_text (GtkEntry *entry, static void update_cursors (GtkWidget *widget) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = NULL; GdkDisplay *display; GdkCursor *cursor; @@ -2601,7 +2699,7 @@ update_cursors (GtkWidget *widget) display = gtk_widget_get_display (widget); cursor = gdk_cursor_new_for_display (display, GDK_XTERM); gdk_window_set_cursor (icon_info->window, cursor); - gdk_cursor_unref (cursor); + g_object_unref (cursor); } else { @@ -2615,7 +2713,8 @@ static void realize_icon_info (GtkWidget *widget, GtkEntryIconPosition icon_pos) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = priv->icons[icon_pos]; GdkWindowAttr attributes; gint attributes_mask; @@ -2651,7 +2750,8 @@ static EntryIconInfo* construct_icon_info (GtkWidget *widget, GtkEntryIconPosition icon_pos) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info; g_return_val_if_fail (priv->icons[icon_pos] == NULL, NULL); @@ -2668,12 +2768,15 @@ construct_icon_info (GtkWidget *widget, static void gtk_entry_map (GtkWidget *widget) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = NULL; gint i; GTK_WIDGET_CLASS (gtk_entry_parent_class)->map (widget); + gdk_window_show (priv->text_area); + for (i = 0; i < MAX_ICONS; i++) { if ((icon_info = priv->icons[i]) != NULL) @@ -2689,7 +2792,8 @@ gtk_entry_map (GtkWidget *widget) static void gtk_entry_unmap (GtkWidget *widget) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = NULL; gint i; @@ -2702,6 +2806,8 @@ gtk_entry_unmap (GtkWidget *widget) } } + gdk_window_hide (priv->text_area); + GTK_WIDGET_CLASS (gtk_entry_parent_class)->unmap (widget); } @@ -2723,7 +2829,7 @@ gtk_entry_realize (GtkWidget *widget) g_object_ref (window); entry = GTK_ENTRY (widget); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; attributes.window_type = GDK_WINDOW_CHILD; attributes.wclass = GDK_INPUT_ONLY; @@ -2750,20 +2856,16 @@ gtk_entry_realize (GtkWidget *widget) attributes_mask |= GDK_WA_CURSOR; } - entry->text_area = gdk_window_new (gtk_widget_get_window (widget), - &attributes, - attributes_mask); + priv->text_area = gdk_window_new (gtk_widget_get_window (widget), + &attributes, + attributes_mask); - gdk_window_set_user_data (entry->text_area, entry); + gdk_window_set_user_data (priv->text_area, entry); if (attributes_mask & GDK_WA_CURSOR) - gdk_cursor_unref (attributes.cursor); - - gtk_widget_style_attach (widget); + g_object_unref (attributes.cursor); - gdk_window_show (entry->text_area); - - gtk_im_context_set_client_window (entry->im_context, entry->text_area); + gtk_im_context_set_client_window (priv->im_context, priv->text_area); gtk_entry_adjust_scroll (entry); gtk_entry_update_primary_selection (entry); @@ -2787,30 +2889,30 @@ static void gtk_entry_unrealize (GtkWidget *widget) { GtkEntry *entry = GTK_ENTRY (widget); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; GtkClipboard *clipboard; EntryIconInfo *icon_info; gint i; gtk_entry_reset_layout (entry); - gtk_im_context_set_client_window (entry->im_context, NULL); + gtk_im_context_set_client_window (priv->im_context, NULL); clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_PRIMARY); if (gtk_clipboard_get_owner (clipboard) == G_OBJECT (entry)) gtk_clipboard_clear (clipboard); - if (entry->text_area) + if (priv->text_area) { - gdk_window_set_user_data (entry->text_area, NULL); - gdk_window_destroy (entry->text_area); - entry->text_area = NULL; + gdk_window_set_user_data (priv->text_area, NULL); + gdk_window_destroy (priv->text_area); + priv->text_area = NULL; } - if (entry->popup_menu) + if (priv->popup_menu) { - gtk_widget_destroy (entry->popup_menu); - entry->popup_menu = NULL; + gtk_widget_destroy (priv->popup_menu); + priv->popup_menu = NULL; } GTK_WIDGET_CLASS (gtk_entry_parent_class)->unrealize (widget); @@ -2833,16 +2935,19 @@ _gtk_entry_get_borders (GtkEntry *entry, gint *xborder, gint *yborder) { + GtkEntryPrivate *priv = entry->priv; GtkWidget *widget = GTK_WIDGET (entry); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); - GtkStyle *style; - if (entry->has_frame) + if (priv->has_frame) { - style = gtk_widget_get_style (widget); + GtkStyleContext *context; + GtkBorder padding; + + context = gtk_widget_get_style_context (widget); + gtk_style_context_get_padding (context, 0, &padding); - *xborder = style->xthickness; - *yborder = style->ythickness; + *xborder = padding.left; + *yborder = padding.top; } else { @@ -2863,25 +2968,30 @@ gtk_entry_get_preferred_width (GtkWidget *widget, gint *natural) { GtkEntry *entry = GTK_ENTRY (widget); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; PangoFontMetrics *metrics; gint xborder, yborder; GtkBorder inner_border; PangoContext *context; + GtkStyleContext *style_context; + GtkStateFlags state; gint icon_widths = 0; gint icon_width, i; gint width; - gtk_widget_ensure_style (widget); context = gtk_widget_get_pango_context (widget); + + style_context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + metrics = pango_context_get_metrics (context, - gtk_widget_get_style (widget)->font_desc, + gtk_style_context_get_font (style_context, state), pango_context_get_language (context)); _gtk_entry_get_borders (entry, &xborder, &yborder); _gtk_entry_effective_inner_border (entry, &inner_border); - if (entry->width_chars < 0) + if (priv->width_chars < 0) width = MIN_ENTRY_WIDTH + xborder * 2 + inner_border.left + inner_border.right; else { @@ -2889,7 +2999,7 @@ gtk_entry_get_preferred_width (GtkWidget *widget, gint digit_width = pango_font_metrics_get_approximate_digit_width (metrics); gint char_pixels = (MAX (char_width, digit_width) + PANGO_SCALE - 1) / PANGO_SCALE; - width = char_pixels * entry->width_chars + xborder * 2 + inner_border.left + inner_border.right; + width = char_pixels * priv->width_chars + xborder * 2 + inner_border.left + inner_border.right; } for (i = 0; i < MAX_ICONS; i++) @@ -2914,26 +3024,31 @@ gtk_entry_get_preferred_height (GtkWidget *widget, gint *natural) { GtkEntry *entry = GTK_ENTRY (widget); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; PangoFontMetrics *metrics; gint xborder, yborder; GtkBorder inner_border; + GtkStyleContext *style_context; + GtkStateFlags state; PangoContext *context; gint height; - gtk_widget_ensure_style (widget); context = gtk_widget_get_pango_context (widget); + + style_context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + metrics = pango_context_get_metrics (context, - gtk_widget_get_style (widget)->font_desc, + gtk_style_context_get_font (style_context, state), pango_context_get_language (context)); - entry->ascent = pango_font_metrics_get_ascent (metrics); - entry->descent = pango_font_metrics_get_descent (metrics); + priv->ascent = pango_font_metrics_get_ascent (metrics); + priv->descent = pango_font_metrics_get_descent (metrics); _gtk_entry_get_borders (entry, &xborder, &yborder); _gtk_entry_effective_inner_border (entry, &inner_border); - height = PANGO_PIXELS (entry->ascent + entry->descent) + yborder * 2 + inner_border.top + inner_border.bottom; + height = PANGO_PIXELS (priv->ascent + priv->descent) + yborder * 2 + inner_border.top + inner_border.bottom; pango_font_metrics_unref (metrics); @@ -2945,7 +3060,7 @@ static void place_windows (GtkEntry *entry) { GtkWidget *widget = GTK_WIDGET (entry); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; gint x, y, width, height; gint frame_x, frame_y; GtkAllocation primary; @@ -2982,7 +3097,7 @@ place_windows (GtkEntry *entry) secondary.x, secondary.y, secondary.width, secondary.height); - gdk_window_move_resize (entry->text_area, x, y, width, height); + gdk_window_move_resize (priv->text_area, x, y, width, height); } static void @@ -2992,8 +3107,8 @@ gtk_entry_get_text_area_size (GtkEntry *entry, gint *width, gint *height) { + GtkEntryPrivate *priv = entry->priv; GtkWidget *widget = GTK_WIDGET (entry); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); GtkAllocation allocation; GtkRequisition requisition; gint frame_height; @@ -3049,6 +3164,7 @@ get_frame_size (GtkEntry *entry, gint *width, gint *height) { + GtkEntryPrivate *priv = entry->priv; GtkAllocation allocation; GtkRequisition requisition; GtkWidget *widget = GTK_WIDGET (entry); @@ -3061,7 +3177,7 @@ get_frame_size (GtkEntry *entry, if (y) { - if (entry->is_cell_renderer) + if (priv->is_cell_renderer) *y = allocation.y; else *y = allocation.y + (allocation.height - requisition.height) / 2; @@ -3072,7 +3188,7 @@ get_frame_size (GtkEntry *entry, if (height) { - if (entry->is_cell_renderer) + if (priv->is_cell_renderer) *height = allocation.height; else *height = requisition.height; @@ -3126,64 +3242,15 @@ gtk_entry_size_allocate (GtkWidget *widget, } } -/* Kudos to the gnome-panel guys. */ -static void -colorshift_pixbuf (GdkPixbuf *dest, - GdkPixbuf *src, - gint shift) -{ - gint i, j; - gint width, height, has_alpha, src_rowstride, dest_rowstride; - guchar *target_pixels; - guchar *original_pixels; - guchar *pix_src; - guchar *pix_dest; - int val; - guchar r, g, b; - - has_alpha = gdk_pixbuf_get_has_alpha (src); - width = gdk_pixbuf_get_width (src); - height = gdk_pixbuf_get_height (src); - src_rowstride = gdk_pixbuf_get_rowstride (src); - dest_rowstride = gdk_pixbuf_get_rowstride (dest); - original_pixels = gdk_pixbuf_get_pixels (src); - target_pixels = gdk_pixbuf_get_pixels (dest); - - for (i = 0; i < height; i++) - { - pix_dest = target_pixels + i * dest_rowstride; - pix_src = original_pixels + i * src_rowstride; - - for (j = 0; j < width; j++) - { - r = *(pix_src++); - g = *(pix_src++); - b = *(pix_src++); - - val = r + shift; - *(pix_dest++) = CLAMP (val, 0, 255); - - val = g + shift; - *(pix_dest++) = CLAMP (val, 0, 255); - - val = b + shift; - *(pix_dest++) = CLAMP (val, 0, 255); - - if (has_alpha) - *(pix_dest++) = *(pix_src++); - } - } -} - static gboolean should_prelight (GtkEntry *entry, GtkEntryIconPosition icon_pos) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = priv->icons[icon_pos]; gboolean prelight; - if (!icon_info) + if (!icon_info) return FALSE; if (icon_info->nonactivatable && icon_info->target_list == NULL) @@ -3205,10 +3272,13 @@ draw_icon (GtkWidget *widget, GtkEntryIconPosition icon_pos) { GtkEntry *entry = GTK_ENTRY (widget); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = priv->icons[icon_pos]; GdkPixbuf *pixbuf; gint x, y, width, height; + GtkStyleContext *context; + GtkIconSource *icon_source; + GtkStateFlags state; if (!icon_info) return; @@ -3244,28 +3314,23 @@ draw_icon (GtkWidget *widget, x = (width - gdk_pixbuf_get_width (pixbuf)) / 2; y = (height - gdk_pixbuf_get_height (pixbuf)) / 2; - if (!gtk_widget_is_sensitive (widget) || - icon_info->insensitive) - { - GdkPixbuf *temp_pixbuf; + icon_source = gtk_icon_source_new (); + gtk_icon_source_set_pixbuf (icon_source, pixbuf); + gtk_icon_source_set_state_wildcarded (icon_source, TRUE); - temp_pixbuf = gdk_pixbuf_copy (pixbuf); - gdk_pixbuf_saturate_and_pixelate (pixbuf, - temp_pixbuf, - 0.8f, - TRUE); - g_object_unref (pixbuf); - pixbuf = temp_pixbuf; - } + state = 0; + if (!gtk_widget_is_sensitive (widget) || icon_info->insensitive) + state |= GTK_STATE_FLAG_INSENSITIVE; else if (icon_info->prelight) - { - GdkPixbuf *temp_pixbuf; + state |= GTK_STATE_FLAG_PRELIGHT; - temp_pixbuf = gdk_pixbuf_copy (pixbuf); - colorshift_pixbuf (temp_pixbuf, pixbuf, 30); - g_object_unref (pixbuf); - pixbuf = temp_pixbuf; - } + context = gtk_widget_get_style_context (widget); + gtk_style_context_save (context); + gtk_style_context_set_state (context, state); + pixbuf = gtk_render_icon_pixbuf (context, icon_source, (GtkIconSize)-1); + gtk_style_context_restore (context); + + gtk_icon_source_free (icon_source); gdk_cairo_set_source_pixbuf (cr, pixbuf, x, y); cairo_paint (cr); @@ -3275,21 +3340,18 @@ draw_icon (GtkWidget *widget, static void -gtk_entry_draw_frame (GtkWidget *widget, - cairo_t *cr) +gtk_entry_draw_frame (GtkWidget *widget, + GtkStyleContext *context, + cairo_t *cr) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); - GtkStyle *style; - GdkWindow *window; + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; gint x = 0, y = 0, width, height; - GtkStateType state; GtkAllocation allocation; gint frame_x, frame_y; cairo_save (cr); - window = gtk_widget_get_window (widget); - get_frame_size (GTK_ENTRY (widget), &frame_x, &frame_y, &width, &height); gtk_widget_get_allocation (widget, &allocation); @@ -3317,21 +3379,14 @@ gtk_entry_draw_frame (GtkWidget *widget, height -= 2 * priv->focus_width; } - style = gtk_widget_get_style (widget); - state = gtk_widget_has_focus (widget) ? - GTK_STATE_ACTIVE : gtk_widget_get_state (widget); + gtk_render_background (context, cr, + x, y, width, height); - gtk_paint_flat_box (style, cr, - state, GTK_SHADOW_NONE, - widget, "entry_bg", + if (priv->has_frame) + gtk_render_frame (context, cr, x, y, width, height); - gtk_paint_shadow (style, cr, - state, priv->shadow_type, - widget, "entry", x, y, width, height); - - - gtk_entry_draw_progress (widget, cr); + gtk_entry_draw_progress (widget, context, cr); if (gtk_widget_has_focus (widget) && !priv->interior_focus) { @@ -3340,68 +3395,44 @@ gtk_entry_draw_frame (GtkWidget *widget, width += 2 * priv->focus_width; height += 2 * priv->focus_width; - gtk_paint_focus (style, cr, - gtk_widget_get_state (widget), - widget, "entry", - 0, 0, width, height); + gtk_render_focus (context, cr, + 0, 0, width, height); } cairo_restore (cr); } -static void -gtk_entry_get_progress_border (GtkWidget *widget, - GtkBorder *progress_border) -{ - GtkBorder *tmp_border; - GtkStyle *style; - - gtk_widget_style_get (widget, "progress-border", &tmp_border, NULL); - if (tmp_border) - { - *progress_border = *tmp_border; - gtk_border_free (tmp_border); - } - else - { - style = gtk_widget_get_style (widget); - - progress_border->left = style->xthickness; - progress_border->right = style->xthickness; - progress_border->top = style->ythickness; - progress_border->bottom = style->ythickness; - } -} - static void get_progress_area (GtkWidget *widget, - gint *x, - gint *y, - gint *width, - gint *height) + gint *x, + gint *y, + gint *width, + gint *height) { - GtkEntryPrivate *private = GTK_ENTRY_GET_PRIVATE (widget); GtkEntry *entry = GTK_ENTRY (widget); - GtkBorder progress_border; - gint frame_width, frame_height; + GtkEntryPrivate *private = entry->priv; + GtkBorder *progress_border; - get_frame_size (entry, NULL, NULL, &frame_width, &frame_height); - gtk_entry_get_progress_border (widget, &progress_border); + get_text_area_size (entry, x, y, width, height); - *x = progress_border.left; - *y = progress_border.top; + if (!private->interior_focus) + { + *x -= private->focus_width; + *y -= private->focus_width; + *width += 2 * private->focus_width; + *height += 2 * private->focus_width; + } - *width = frame_width - - progress_border.left - progress_border.right; - *height = frame_height - - progress_border.top - progress_border.bottom; + gtk_widget_style_get (widget, "progress-border", &progress_border, NULL); - if (gtk_widget_has_focus (widget) && !private->interior_focus) + if (progress_border) { - *x += private->focus_width; - *y += private->focus_width; - *width -= 2 * private->focus_width; - *height -= 2 * private->focus_width; + *x += progress_border->left; + *y += progress_border->top; + *width -= progress_border->left + progress_border->right; + *height -= progress_border->top + progress_border->bottom; + + gtk_border_free (progress_border); } if (private->progress_pulse_mode) @@ -3436,26 +3467,24 @@ get_progress_area (GtkWidget *widget, } static void -gtk_entry_draw_progress (GtkWidget *widget, - cairo_t *cr) +gtk_entry_draw_progress (GtkWidget *widget, + GtkStyleContext *context, + cairo_t *cr) { gint x, y, width, height; - GtkStateType state; get_progress_area (widget, &x, &y, &width, &height); if ((width <= 0) || (height <= 0)) return; - state = GTK_STATE_SELECTED; - if (!gtk_widget_get_sensitive (widget)) - state = GTK_STATE_INSENSITIVE; + gtk_style_context_save (context); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_PROGRESSBAR); - gtk_paint_box (gtk_widget_get_style (widget), cr, - state, GTK_SHADOW_OUT, - widget, "entry-progress", - x, y, - width, height); + gtk_render_activity (context, cr, + x, y, width, height); + + gtk_style_context_restore (context); } static gint @@ -3463,27 +3492,28 @@ gtk_entry_draw (GtkWidget *widget, cairo_t *cr) { GtkEntry *entry = GTK_ENTRY (widget); - GtkStyle *style; - GtkStateType state; - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkStyleContext *context; + GtkStateFlags state; + GtkEntryPrivate *priv = entry->priv; int i; - style = gtk_widget_get_style (widget); + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); - state = gtk_widget_has_focus (widget) ? - GTK_STATE_ACTIVE : gtk_widget_get_state (widget); + gtk_style_context_save (context); + gtk_style_context_set_state (context, state); if (gtk_cairo_should_draw_window (cr, gtk_widget_get_window (widget))) { /* Draw entry_bg, shadow, progress and focus */ - gtk_entry_draw_frame (widget, cr); + gtk_entry_draw_frame (widget, context, cr); /* Draw text and cursor */ cairo_save (cr); - gtk_cairo_transform_to_window (cr, widget, entry->text_area); + gtk_cairo_transform_to_window (cr, widget, priv->text_area); - if (entry->dnd_position != -1) + if (priv->dnd_position != -1) gtk_entry_draw_cursor (GTK_ENTRY (widget), cr, CURSOR_DND); gtk_entry_draw_text (GTK_ENTRY (widget), cr); @@ -3491,7 +3521,7 @@ gtk_entry_draw (GtkWidget *widget, /* When no text is being displayed at all, don't show the cursor */ if (gtk_entry_get_display_mode (entry) != DISPLAY_BLANK && gtk_widget_has_focus (widget) && - entry->selection_bound == entry->current_pos && entry->cursor_visible) + priv->selection_bound == priv->current_pos && priv->cursor_visible) gtk_entry_draw_cursor (GTK_ENTRY (widget), cr, CURSOR_STANDARD); cairo_restore (cr); @@ -3514,6 +3544,8 @@ gtk_entry_draw (GtkWidget *widget, } } + gtk_style_context_restore (context); + return FALSE; } @@ -3522,7 +3554,7 @@ gtk_entry_enter_notify (GtkWidget *widget, GdkEventCrossing *event) { GtkEntry *entry = GTK_ENTRY (widget); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; gint i; for (i = 0; i < MAX_ICONS; i++) @@ -3549,7 +3581,7 @@ gtk_entry_leave_notify (GtkWidget *widget, GdkEventCrossing *event) { GtkEntry *entry = GTK_ENTRY (widget); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; gint i; for (i = 0; i < MAX_ICONS; i++) @@ -3645,7 +3677,7 @@ gtk_entry_button_press (GtkWidget *widget, { GtkEntry *entry = GTK_ENTRY (widget); GtkEditable *editable = GTK_EDITABLE (widget); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = NULL; gint tmp_pos; gint sel_start, sel_end; @@ -3677,36 +3709,36 @@ gtk_entry_button_press (GtkWidget *widget, } } - if (event->window != entry->text_area || - (entry->button && event->button != entry->button)) + if (event->window != priv->text_area || + (priv->button && event->button != priv->button)) return FALSE; gtk_entry_reset_blink_time (entry); - entry->button = event->button; + priv->button = event->button; if (!gtk_widget_has_focus (widget)) { - entry->in_click = TRUE; + priv->in_click = TRUE; gtk_widget_grab_focus (widget); - entry->in_click = FALSE; + priv->in_click = FALSE; } - tmp_pos = gtk_entry_find_position (entry, event->x + entry->scroll_offset); + tmp_pos = gtk_entry_find_position (entry, event->x + priv->scroll_offset); if (event->button == 1) { gboolean have_selection = gtk_editable_get_selection_bounds (editable, &sel_start, &sel_end); - entry->select_words = FALSE; - entry->select_lines = FALSE; + priv->select_words = FALSE; + priv->select_lines = FALSE; if (event->state & GDK_SHIFT_MASK) { _gtk_entry_reset_im_context (entry); if (!have_selection) /* select from the current position to the clicked position */ - sel_start = sel_end = entry->current_pos; + sel_start = sel_end = priv->current_pos; if (tmp_pos > sel_start && tmp_pos < sel_end) { @@ -3729,12 +3761,12 @@ gtk_entry_button_press (GtkWidget *widget, break; case GDK_2BUTTON_PRESS: - entry->select_words = TRUE; + priv->select_words = TRUE; gtk_entry_select_word (entry); break; case GDK_3BUTTON_PRESS: - entry->select_lines = TRUE; + priv->select_lines = TRUE; gtk_entry_select_line (entry); break; @@ -3742,10 +3774,10 @@ gtk_entry_button_press (GtkWidget *widget, break; } - start = MIN (entry->current_pos, entry->selection_bound); + start = MIN (priv->current_pos, priv->selection_bound); start = MIN (sel_start, start); - end = MAX (entry->current_pos, entry->selection_bound); + end = MAX (priv->current_pos, priv->selection_bound); end = MAX (sel_end, end); if (tmp_pos == sel_start || tmp_pos == sel_end) @@ -3763,14 +3795,14 @@ gtk_entry_button_press (GtkWidget *widget, switch (event->type) { case GDK_BUTTON_PRESS: - if (in_selection (entry, event->x + entry->scroll_offset)) + if (in_selection (entry, event->x + priv->scroll_offset)) { /* Click inside the selection - we'll either start a drag, or * clear the selection */ - entry->in_drag = TRUE; - entry->drag_start_x = event->x + entry->scroll_offset; - entry->drag_start_y = event->y; + priv->in_drag = TRUE; + priv->drag_start_x = event->x + priv->scroll_offset; + priv->drag_start_y = event->y; } else gtk_editable_set_position (editable, tmp_pos); @@ -3779,20 +3811,20 @@ gtk_entry_button_press (GtkWidget *widget, case GDK_2BUTTON_PRESS: /* We ALWAYS receive a GDK_BUTTON_PRESS immediately before * receiving a GDK_2BUTTON_PRESS so we need to reset - * entry->in_drag which may have been set above + * priv->in_drag which may have been set above */ - entry->in_drag = FALSE; - entry->select_words = TRUE; + priv->in_drag = FALSE; + priv->select_words = TRUE; gtk_entry_select_word (entry); break; case GDK_3BUTTON_PRESS: /* We ALWAYS receive a GDK_BUTTON_PRESS immediately before * receiving a GDK_3BUTTON_PRESS so we need to reset - * entry->in_drag which may have been set above + * priv->in_drag which may have been set above */ - entry->in_drag = FALSE; - entry->select_lines = TRUE; + priv->in_drag = FALSE; + priv->select_lines = TRUE; gtk_entry_select_line (entry); break; @@ -3804,7 +3836,7 @@ gtk_entry_button_press (GtkWidget *widget, } else if (event->button == 2 && event->type == GDK_BUTTON_PRESS) { - if (entry->editable) + if (priv->editable) { priv->insert_pos = tmp_pos; gtk_entry_paste (entry, GDK_SELECTION_PRIMARY); @@ -3818,7 +3850,7 @@ gtk_entry_button_press (GtkWidget *widget, else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { gtk_entry_do_popup (entry, event); - entry->button = 0; /* Don't wait for release, since the menu will gtk_grab_add */ + priv->button = 0; /* Don't wait for release, since the menu will gtk_grab_add */ return TRUE; } @@ -3831,7 +3863,7 @@ gtk_entry_button_release (GtkWidget *widget, GdkEventButton *event) { GtkEntry *entry = GTK_ENTRY (widget); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = NULL; gint i; @@ -3862,19 +3894,19 @@ gtk_entry_button_release (GtkWidget *widget, } } - if (event->window != entry->text_area || entry->button != event->button) + if (event->window != priv->text_area || priv->button != event->button) return FALSE; - if (entry->in_drag) + if (priv->in_drag) { - gint tmp_pos = gtk_entry_find_position (entry, entry->drag_start_x); + gint tmp_pos = gtk_entry_find_position (entry, priv->drag_start_x); gtk_editable_set_position (GTK_EDITABLE (entry), tmp_pos); - entry->in_drag = 0; + priv->in_drag = 0; } - entry->button = 0; + priv->button = 0; gtk_entry_update_primary_selection (entry); @@ -3899,9 +3931,8 @@ gtk_entry_motion_notify (GtkWidget *widget, GdkEventMotion *event) { GtkEntry *entry = GTK_ENTRY (widget); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = NULL; - GdkDragContext *context; gint tmp_pos; gint i; @@ -3924,45 +3955,45 @@ gtk_entry_motion_notify (GtkWidget *widget, { icon_info->in_drag = TRUE; icon_info->pressed = FALSE; - context = gtk_drag_begin (widget, - icon_info->target_list, - icon_info->actions, - 1, - (GdkEvent*)event); + gtk_drag_begin (widget, + icon_info->target_list, + icon_info->actions, + 1, + (GdkEvent*)event); } return TRUE; } } - if (entry->mouse_cursor_obscured) + if (priv->mouse_cursor_obscured) { GdkCursor *cursor; - + cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_XTERM); - gdk_window_set_cursor (entry->text_area, cursor); - gdk_cursor_unref (cursor); - entry->mouse_cursor_obscured = FALSE; + gdk_window_set_cursor (priv->text_area, cursor); + g_object_unref (cursor); + priv->mouse_cursor_obscured = FALSE; } - if (event->window != entry->text_area || entry->button != 1) + if (event->window != priv->text_area || priv->button != 1) return FALSE; - if (entry->select_lines) + if (priv->select_lines) return TRUE; gdk_event_request_motions (event); - if (entry->in_drag) + if (priv->in_drag) { if (gtk_entry_get_display_mode (entry) == DISPLAY_NORMAL && gtk_drag_check_threshold (widget, - entry->drag_start_x, entry->drag_start_y, - event->x + entry->scroll_offset, event->y)) + priv->drag_start_x, priv->drag_start_y, + event->x + priv->scroll_offset, event->y)) { GdkDragContext *context; GtkTargetList *target_list = gtk_target_list_new (NULL, 0); - guint actions = entry->editable ? GDK_ACTION_COPY | GDK_ACTION_MOVE : GDK_ACTION_COPY; + guint actions = priv->editable ? GDK_ACTION_COPY | GDK_ACTION_MOVE : GDK_ACTION_COPY; gchar *text = NULL; cairo_surface_t *surface; @@ -3972,7 +4003,7 @@ gtk_entry_motion_notify (GtkWidget *widget, surface = _gtk_text_util_create_drag_icon (widget, text, -1); context = gtk_drag_begin (widget, target_list, actions, - entry->button, (GdkEvent *)event); + priv->button, (GdkEvent *)event); if (surface) gtk_drag_set_icon_surface (context, surface); @@ -3983,8 +4014,8 @@ gtk_entry_motion_notify (GtkWidget *widget, cairo_surface_destroy (surface); g_free (text); - entry->in_drag = FALSE; - entry->button = 0; + priv->in_drag = FALSE; + priv->button = 0; gtk_target_list_unref (target_list); } @@ -3993,12 +4024,12 @@ gtk_entry_motion_notify (GtkWidget *widget, { if (event->y < 0) tmp_pos = 0; - else if (event->y >= gdk_window_get_height (entry->text_area)) + else if (event->y >= gdk_window_get_height (priv->text_area)) tmp_pos = gtk_entry_buffer_get_length (get_buffer (entry)); else - tmp_pos = gtk_entry_find_position (entry, event->x + entry->scroll_offset); - - if (entry->select_words) + tmp_pos = gtk_entry_find_position (entry, event->x + priv->scroll_offset); + + if (priv->select_words) { gint min, max; gint old_min, old_max; @@ -4006,12 +4037,12 @@ gtk_entry_motion_notify (GtkWidget *widget, min = gtk_entry_move_backward_word (entry, tmp_pos, TRUE); max = gtk_entry_move_forward_word (entry, tmp_pos, TRUE); - - pos = entry->current_pos; - bound = entry->selection_bound; - old_min = MIN(entry->current_pos, entry->selection_bound); - old_max = MAX(entry->current_pos, entry->selection_bound); + pos = priv->current_pos; + bound = priv->selection_bound; + + old_min = MIN(priv->current_pos, priv->selection_bound); + old_max = MAX(priv->current_pos, priv->selection_bound); if (min < old_min) { @@ -4025,12 +4056,12 @@ gtk_entry_motion_notify (GtkWidget *widget, } else if (pos == old_min) { - if (entry->current_pos != min) + if (priv->current_pos != min) pos = max; } else { - if (entry->current_pos != max) + if (priv->current_pos != max) pos = min; } @@ -4054,18 +4085,20 @@ set_invisible_cursor (GdkWindow *window) gdk_window_set_cursor (window, cursor); - gdk_cursor_unref (cursor); + g_object_unref (cursor); } static void gtk_entry_obscure_mouse_cursor (GtkEntry *entry) { - if (entry->mouse_cursor_obscured) + GtkEntryPrivate *priv = entry->priv; + + if (priv->mouse_cursor_obscured) return; - set_invisible_cursor (entry->text_area); - - entry->mouse_cursor_obscured = TRUE; + set_invisible_cursor (priv->text_area); + + priv->mouse_cursor_obscured = TRUE; } static gint @@ -4073,16 +4106,17 @@ gtk_entry_key_press (GtkWidget *widget, GdkEventKey *event) { GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; gtk_entry_reset_blink_time (entry); gtk_entry_pend_cursor_blink (entry); - if (entry->editable) + if (priv->editable) { - if (gtk_im_context_filter_keypress (entry->im_context, event)) + if (gtk_im_context_filter_keypress (priv->im_context, event)) { gtk_entry_obscure_mouse_cursor (entry); - entry->need_im_reset = TRUE; + priv->need_im_reset = TRUE; return TRUE; } } @@ -4093,7 +4127,7 @@ gtk_entry_key_press (GtkWidget *widget, event->keyval == GDK_KEY_Escape) { GtkEntryCompletion *completion = gtk_entry_get_completion (entry); - + if (completion && completion->priv->completion_timeout) { g_source_remove (completion->priv->completion_timeout); @@ -4108,7 +4142,7 @@ gtk_entry_key_press (GtkWidget *widget, */ return TRUE; - if (!entry->editable && event->length) + if (!priv->editable && event->length) gtk_widget_error_bell (widget); return FALSE; @@ -4119,12 +4153,13 @@ gtk_entry_key_release (GtkWidget *widget, GdkEventKey *event) { GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; - if (entry->editable) + if (priv->editable) { - if (gtk_im_context_filter_keypress (entry->im_context, event)) + if (gtk_im_context_filter_keypress (priv->im_context, event)) { - entry->need_im_reset = TRUE; + priv->need_im_reset = TRUE; return TRUE; } } @@ -4137,16 +4172,17 @@ gtk_entry_focus_in (GtkWidget *widget, GdkEventFocus *event) { GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; GdkKeymap *keymap; gtk_widget_queue_draw (widget); keymap = gdk_keymap_get_for_display (gtk_widget_get_display (widget)); - if (entry->editable) + if (priv->editable) { - entry->need_im_reset = TRUE; - gtk_im_context_focus_in (entry->im_context); + priv->need_im_reset = TRUE; + gtk_im_context_focus_in (priv->im_context); keymap_state_changed (keymap, entry); g_signal_connect (keymap, "state-changed", G_CALLBACK (keymap_state_changed), entry); @@ -4166,6 +4202,7 @@ gtk_entry_focus_out (GtkWidget *widget, GdkEventFocus *event) { GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; GtkEntryCompletion *completion; GdkKeymap *keymap; @@ -4173,10 +4210,10 @@ gtk_entry_focus_out (GtkWidget *widget, keymap = gdk_keymap_get_for_display (gtk_widget_get_display (widget)); - if (entry->editable) + if (priv->editable) { - entry->need_im_reset = TRUE; - gtk_im_context_focus_out (entry->im_context); + priv->need_im_reset = TRUE; + gtk_im_context_focus_out (priv->im_context); remove_capslock_feedback (entry); } @@ -4196,11 +4233,12 @@ static void gtk_entry_grab_focus (GtkWidget *widget) { GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; gboolean select_on_focus; GTK_WIDGET_CLASS (gtk_entry_parent_class)->grab_focus (widget); - if (entry->editable && !entry->in_click) + if (priv->editable && !priv->in_click) { g_object_get (gtk_widget_get_settings (widget), "gtk-entry-select-on-focus", @@ -4224,10 +4262,11 @@ gtk_entry_direction_changed (GtkWidget *widget, } static void -gtk_entry_state_changed (GtkWidget *widget, - GtkStateType previous_state) +gtk_entry_state_flags_changed (GtkWidget *widget, + GtkStateFlags previous_state) { GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; GdkCursor *cursor; if (gtk_widget_get_realized (widget)) @@ -4236,13 +4275,13 @@ gtk_entry_state_changed (GtkWidget *widget, cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_XTERM); else cursor = NULL; - - gdk_window_set_cursor (entry->text_area, cursor); + + gdk_window_set_cursor (priv->text_area, cursor); if (cursor) - gdk_cursor_unref (cursor); + g_object_unref (cursor); - entry->mouse_cursor_obscured = FALSE; + priv->mouse_cursor_obscured = FALSE; update_cursors (widget); } @@ -4250,7 +4289,7 @@ gtk_entry_state_changed (GtkWidget *widget, if (!gtk_widget_is_sensitive (widget)) { /* Clear any selection */ - gtk_editable_select_region (GTK_EDITABLE (entry), entry->current_pos, entry->current_pos); + gtk_editable_select_region (GTK_EDITABLE (entry), priv->current_pos, priv->current_pos); } gtk_widget_queue_draw (widget); @@ -4325,6 +4364,7 @@ gtk_entry_real_set_position (GtkEditable *editable, gint position) { GtkEntry *entry = GTK_ENTRY (editable); + GtkEntryPrivate *priv = entry->priv; guint length; @@ -4332,8 +4372,8 @@ gtk_entry_real_set_position (GtkEditable *editable, if (position < 0 || position > length) position = length; - if (position != entry->current_pos || - position != entry->selection_bound) + if (position != priv->current_pos || + position != priv->selection_bound) { _gtk_entry_reset_im_context (entry); gtk_entry_set_positions (entry, position, position); @@ -4343,7 +4383,10 @@ gtk_entry_real_set_position (GtkEditable *editable, static gint gtk_entry_get_position (GtkEditable *editable) { - return GTK_ENTRY (editable)->current_pos; + GtkEntry *entry = GTK_ENTRY (editable); + GtkEntryPrivate *priv = entry->priv; + + return priv->current_pos; } static void @@ -4375,17 +4418,18 @@ gtk_entry_get_selection_bounds (GtkEditable *editable, gint *end) { GtkEntry *entry = GTK_ENTRY (editable); + GtkEntryPrivate *priv = entry->priv; - *start = entry->selection_bound; - *end = entry->current_pos; + *start = priv->selection_bound; + *end = priv->current_pos; - return (entry->selection_bound != entry->current_pos); + return (priv->selection_bound != priv->current_pos); } static void icon_theme_changed (GtkEntry *entry) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; gint i; for (i = 0; i < MAX_ICONS; i++) @@ -4408,7 +4452,7 @@ icon_theme_changed (GtkEntry *entry) static void icon_margin_changed (GtkEntry *entry) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; GtkBorder border; _gtk_entry_effective_inner_border (GTK_ENTRY (entry), &border); @@ -4417,14 +4461,15 @@ icon_margin_changed (GtkEntry *entry) } static void -gtk_entry_style_set (GtkWidget *widget, - GtkStyle *previous_style) +gtk_entry_style_updated (GtkWidget *widget) { GtkEntry *entry = GTK_ENTRY (widget); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; gint focus_width; gboolean interior_focus; + GTK_WIDGET_CLASS (gtk_entry_parent_class)->style_updated (widget); + gtk_widget_style_get (widget, "focus-line-width", &focus_width, "interior-focus", &interior_focus, @@ -4434,7 +4479,7 @@ gtk_entry_style_set (GtkWidget *widget, priv->interior_focus = interior_focus; if (!priv->invisible_char_set) - entry->invisible_char = find_invisible_char (GTK_WIDGET (entry)); + priv->invisible_char = find_invisible_char (GTK_WIDGET (entry)); gtk_entry_recompute (entry); @@ -4456,9 +4501,11 @@ gtk_cell_editable_key_press_event (GtkEntry *entry, GdkEventKey *key_event, gpointer data) { + GtkEntryPrivate *priv = entry->priv; + if (key_event->keyval == GDK_KEY_Escape) { - entry->editing_canceled = TRUE; + priv->editing_canceled = TRUE; gtk_cell_editable_editing_done (GTK_CELL_EDITABLE (entry)); gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE (entry)); @@ -4481,7 +4528,10 @@ static void gtk_entry_start_editing (GtkCellEditable *cell_editable, GdkEvent *event) { - GTK_ENTRY (cell_editable)->is_cell_renderer = TRUE; + GtkEntry *entry = GTK_ENTRY (cell_editable); + GtkEntryPrivate *priv = entry->priv; + + priv->is_cell_renderer = TRUE; g_signal_connect (cell_editable, "activate", G_CALLBACK (gtk_cell_editable_entry_activated), NULL); @@ -4559,16 +4609,17 @@ buffer_inserted_text (GtkEntryBuffer *buffer, guint n_chars, GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; guint password_hint_timeout; - if (entry->current_pos > position) - entry->current_pos += n_chars; + if (priv->current_pos > position) + priv->current_pos += n_chars; - if (entry->selection_bound > position) - entry->selection_bound += n_chars; + if (priv->selection_bound > position) + priv->selection_bound += n_chars; /* Calculate the password hint if it needs to be displayed. */ - if (n_chars == 1 && !entry->visible) + if (n_chars == 1 && !priv->visible) { g_object_get (gtk_widget_get_settings (GTK_WIDGET (entry)), "gtk-entry-password-hint-timeout", &password_hint_timeout, @@ -4600,15 +4651,16 @@ buffer_deleted_text (GtkEntryBuffer *buffer, guint n_chars, GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; guint end_pos = position + n_chars; gint selection_bound; guint current_pos; - current_pos = entry->current_pos; + current_pos = priv->current_pos; if (current_pos > position) current_pos -= MIN (current_pos, end_pos) - position; - selection_bound = entry->selection_bound; + selection_bound = priv->selection_bound; if (selection_bound > position) selection_bound -= MIN (selection_bound, end_pos) - position; @@ -4618,7 +4670,7 @@ buffer_deleted_text (GtkEntryBuffer *buffer, gtk_entry_update_primary_selection (entry); /* Disable the password hint if one exists. */ - if (!entry->visible) + if (!priv->visible) { GtkEntryPasswordHint *password_hint = g_object_get_qdata (G_OBJECT (entry), quark_password_hint); @@ -4687,6 +4739,7 @@ static gint get_better_cursor_x (GtkEntry *entry, gint offset) { + GtkEntryPrivate *priv = entry->priv; GdkKeymap *keymap = gdk_keymap_get_for_display (gtk_widget_get_display (GTK_WIDGET (entry))); PangoDirection keymap_direction = gdk_keymap_get_direction (keymap); gboolean split_cursor; @@ -4706,7 +4759,7 @@ get_better_cursor_x (GtkEntry *entry, if (split_cursor) return strong_pos.x / PANGO_SCALE; else - return (keymap_direction == entry->resolved_dir) ? strong_pos.x / PANGO_SCALE : weak_pos.x / PANGO_SCALE; + return (keymap_direction == priv->resolved_dir) ? strong_pos.x / PANGO_SCALE : weak_pos.x / PANGO_SCALE; } static void @@ -4715,12 +4768,12 @@ gtk_entry_move_cursor (GtkEntry *entry, gint count, gboolean extend_selection) { - gint new_pos = entry->current_pos; - GtkEntryPrivate *priv; + GtkEntryPrivate *priv = entry->priv; + gint new_pos = priv->current_pos; _gtk_entry_reset_im_context (entry); - if (entry->current_pos != entry->selection_bound && !extend_selection) + if (priv->current_pos != priv->selection_bound && !extend_selection) { /* If we have a current selection and aren't extending it, move to the * start/or end of the selection as appropriate @@ -4729,26 +4782,25 @@ gtk_entry_move_cursor (GtkEntry *entry, { case GTK_MOVEMENT_VISUAL_POSITIONS: { - gint current_x = get_better_cursor_x (entry, entry->current_pos); - gint bound_x = get_better_cursor_x (entry, entry->selection_bound); + gint current_x = get_better_cursor_x (entry, priv->current_pos); + gint bound_x = get_better_cursor_x (entry, priv->selection_bound); if (count <= 0) - new_pos = current_x < bound_x ? entry->current_pos : entry->selection_bound; + new_pos = current_x < bound_x ? priv->current_pos : priv->selection_bound; else - new_pos = current_x > bound_x ? entry->current_pos : entry->selection_bound; + new_pos = current_x > bound_x ? priv->current_pos : priv->selection_bound; break; } case GTK_MOVEMENT_LOGICAL_POSITIONS: case GTK_MOVEMENT_WORDS: if (count < 0) - new_pos = MIN (entry->current_pos, entry->selection_bound); + new_pos = MIN (priv->current_pos, priv->selection_bound); else - new_pos = MAX (entry->current_pos, entry->selection_bound); + new_pos = MAX (priv->current_pos, priv->selection_bound); break; case GTK_MOVEMENT_DISPLAY_LINE_ENDS: case GTK_MOVEMENT_PARAGRAPH_ENDS: case GTK_MOVEMENT_BUFFER_ENDS: - priv = GTK_ENTRY_GET_PRIVATE (entry); new_pos = count < 0 ? 0 : gtk_entry_buffer_get_length (get_buffer (entry)); break; case GTK_MOVEMENT_DISPLAY_LINES: @@ -4767,7 +4819,7 @@ gtk_entry_move_cursor (GtkEntry *entry, break; case GTK_MOVEMENT_VISUAL_POSITIONS: new_pos = gtk_entry_move_visually (entry, new_pos, count); - if (entry->current_pos == new_pos) + if (priv->current_pos == new_pos) { if (!extend_selection) { @@ -4800,15 +4852,14 @@ gtk_entry_move_cursor (GtkEntry *entry, new_pos = gtk_entry_move_backward_word (entry, new_pos, FALSE); count++; } - if (entry->current_pos == new_pos) + if (priv->current_pos == new_pos) gtk_widget_error_bell (GTK_WIDGET (entry)); break; case GTK_MOVEMENT_DISPLAY_LINE_ENDS: case GTK_MOVEMENT_PARAGRAPH_ENDS: case GTK_MOVEMENT_BUFFER_ENDS: - priv = GTK_ENTRY_GET_PRIVATE (entry); new_pos = count < 0 ? 0 : gtk_entry_buffer_get_length (get_buffer (entry)); - if (entry->current_pos == new_pos) + if (priv->current_pos == new_pos) gtk_widget_error_bell (GTK_WIDGET (entry)); break; case GTK_MOVEMENT_DISPLAY_LINES: @@ -4820,7 +4871,7 @@ gtk_entry_move_cursor (GtkEntry *entry, } if (extend_selection) - gtk_editable_select_region (GTK_EDITABLE (entry), entry->selection_bound, new_pos); + gtk_editable_select_region (GTK_EDITABLE (entry), priv->selection_bound, new_pos); else gtk_editable_set_position (GTK_EDITABLE (entry), new_pos); @@ -4831,10 +4882,11 @@ static void gtk_entry_insert_at_cursor (GtkEntry *entry, const gchar *str) { + GtkEntryPrivate *priv = entry->priv; GtkEditable *editable = GTK_EDITABLE (entry); - gint pos = entry->current_pos; + gint pos = priv->current_pos; - if (entry->editable) + if (priv->editable) { _gtk_entry_reset_im_context (entry); @@ -4848,20 +4900,21 @@ gtk_entry_delete_from_cursor (GtkEntry *entry, GtkDeleteType type, gint count) { + GtkEntryPrivate *priv = entry->priv; GtkEditable *editable = GTK_EDITABLE (entry); - gint start_pos = entry->current_pos; - gint end_pos = entry->current_pos; + gint start_pos = priv->current_pos; + gint end_pos = priv->current_pos; gint old_n_bytes = gtk_entry_buffer_get_bytes (get_buffer (entry)); _gtk_entry_reset_im_context (entry); - if (!entry->editable) + if (!priv->editable) { gtk_widget_error_bell (GTK_WIDGET (entry)); return; } - if (entry->selection_bound != entry->current_pos) + if (priv->selection_bound != priv->current_pos) { gtk_editable_delete_selection (editable); return; @@ -4870,7 +4923,7 @@ gtk_entry_delete_from_cursor (GtkEntry *entry, switch (type) { case GTK_DELETE_CHARS: - end_pos = gtk_entry_move_logically (entry, entry->current_pos, count); + end_pos = gtk_entry_move_logically (entry, priv->current_pos, count); gtk_editable_delete_text (editable, MIN (start_pos, end_pos), MAX (start_pos, end_pos)); break; case GTK_DELETE_WORDS: @@ -4904,9 +4957,9 @@ gtk_entry_delete_from_cursor (GtkEntry *entry, case GTK_DELETE_DISPLAY_LINE_ENDS: case GTK_DELETE_PARAGRAPH_ENDS: if (count < 0) - gtk_editable_delete_text (editable, 0, entry->current_pos); + gtk_editable_delete_text (editable, 0, priv->current_pos); else - gtk_editable_delete_text (editable, entry->current_pos, -1); + gtk_editable_delete_text (editable, priv->current_pos, -1); break; case GTK_DELETE_DISPLAY_LINES: case GTK_DELETE_PARAGRAPHS: @@ -4926,26 +4979,27 @@ gtk_entry_delete_from_cursor (GtkEntry *entry, static void gtk_entry_backspace (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; GtkEditable *editable = GTK_EDITABLE (entry); gint prev_pos; _gtk_entry_reset_im_context (entry); - if (!entry->editable) + if (!priv->editable) { gtk_widget_error_bell (GTK_WIDGET (entry)); return; } - if (entry->selection_bound != entry->current_pos) + if (priv->selection_bound != priv->current_pos) { gtk_editable_delete_selection (editable); return; } - prev_pos = gtk_entry_move_logically (entry, entry->current_pos, -1); + prev_pos = gtk_entry_move_logically (entry, priv->current_pos, -1); - if (prev_pos < entry->current_pos) + if (prev_pos < priv->current_pos) { PangoLayout *layout = gtk_entry_ensure_layout (entry, FALSE); PangoLogAttr *log_attrs; @@ -4954,23 +5008,23 @@ gtk_entry_backspace (GtkEntry *entry) pango_layout_get_log_attrs (layout, &log_attrs, &n_attrs); /* Deleting parts of characters */ - if (log_attrs[entry->current_pos].backspace_deletes_character) + if (log_attrs[priv->current_pos].backspace_deletes_character) { gchar *cluster_text; gchar *normalized_text; glong len; cluster_text = gtk_entry_get_display_text (entry, prev_pos, - entry->current_pos); + priv->current_pos); normalized_text = g_utf8_normalize (cluster_text, strlen (cluster_text), G_NORMALIZE_NFD); len = g_utf8_strlen (normalized_text, -1); - gtk_editable_delete_text (editable, prev_pos, entry->current_pos); + gtk_editable_delete_text (editable, prev_pos, priv->current_pos); if (len > 1) { - gint pos = entry->current_pos; + gint pos = priv->current_pos; gtk_editable_insert_text (editable, normalized_text, g_utf8_offset_to_pointer (normalized_text, len - 1) - normalized_text, @@ -4983,7 +5037,7 @@ gtk_entry_backspace (GtkEntry *entry) } else { - gtk_editable_delete_text (editable, prev_pos, entry->current_pos); + gtk_editable_delete_text (editable, prev_pos, priv->current_pos); } g_free (log_attrs); @@ -4999,13 +5053,14 @@ gtk_entry_backspace (GtkEntry *entry) static void gtk_entry_copy_clipboard (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; GtkEditable *editable = GTK_EDITABLE (entry); gint start, end; gchar *str; if (gtk_editable_get_selection_bounds (editable, &start, &end)) { - if (!entry->visible) + if (!priv->visible) { gtk_widget_error_bell (GTK_WIDGET (entry)); return; @@ -5022,10 +5077,11 @@ gtk_entry_copy_clipboard (GtkEntry *entry) static void gtk_entry_cut_clipboard (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; GtkEditable *editable = GTK_EDITABLE (entry); gint start, end; - if (!entry->visible) + if (!priv->visible) { gtk_widget_error_bell (GTK_WIDGET (entry)); return; @@ -5033,7 +5089,7 @@ gtk_entry_cut_clipboard (GtkEntry *entry) gtk_entry_copy_clipboard (entry); - if (entry->editable) + if (priv->editable) { if (gtk_editable_get_selection_bounds (editable, &start, &end)) gtk_editable_delete_text (editable, start, end); @@ -5047,7 +5103,9 @@ gtk_entry_cut_clipboard (GtkEntry *entry) static void gtk_entry_paste_clipboard (GtkEntry *entry) { - if (entry->editable) + GtkEntryPrivate *priv = entry->priv; + + if (priv->editable) gtk_entry_paste (entry, GDK_NONE); else gtk_widget_error_bell (GTK_WIDGET (entry)); @@ -5056,10 +5114,11 @@ gtk_entry_paste_clipboard (GtkEntry *entry) static void gtk_entry_delete_cb (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; GtkEditable *editable = GTK_EDITABLE (entry); gint start, end; - if (entry->editable) + if (priv->editable) { if (gtk_editable_get_selection_bounds (editable, &start, &end)) gtk_editable_delete_text (editable, start, end); @@ -5069,7 +5128,9 @@ gtk_entry_delete_cb (GtkEntry *entry) static void gtk_entry_toggle_overwrite (GtkEntry *entry) { - entry->overwrite_mode = !entry->overwrite_mode; + GtkEntryPrivate *priv = entry->priv; + + priv->overwrite_mode = !priv->overwrite_mode; gtk_entry_pend_cursor_blink (entry); gtk_widget_queue_draw (GTK_WIDGET (entry)); } @@ -5083,6 +5144,7 @@ gtk_entry_select_all (GtkEntry *entry) static void gtk_entry_real_activate (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; GtkWindow *window; GtkWidget *default_widget, *focus_widget; GtkWidget *toplevel; @@ -5090,7 +5152,7 @@ gtk_entry_real_activate (GtkEntry *entry) widget = GTK_WIDGET (entry); - if (entry->activates_default) + if (priv->activates_default) { toplevel = gtk_widget_get_toplevel (widget); if (GTK_IS_WINDOW (toplevel)) @@ -5124,7 +5186,9 @@ gtk_entry_commit_cb (GtkIMContext *context, const gchar *str, GtkEntry *entry) { - if (entry->editable) + GtkEntryPrivate *priv = entry->priv; + + if (priv->editable) gtk_entry_enter_text (entry, str); } @@ -5132,18 +5196,20 @@ static void gtk_entry_preedit_changed_cb (GtkIMContext *context, GtkEntry *entry) { - if (entry->editable) + GtkEntryPrivate *priv = entry->priv; + + if (priv->editable) { gchar *preedit_string; gint cursor_pos; - - gtk_im_context_get_preedit_string (entry->im_context, + + gtk_im_context_get_preedit_string (priv->im_context, &preedit_string, NULL, &cursor_pos); g_signal_emit (entry, signals[PREEDIT_CHANGED], 0, preedit_string); - entry->preedit_length = strlen (preedit_string); + priv->preedit_length = strlen (preedit_string); cursor_pos = CLAMP (cursor_pos, 0, g_utf8_strlen (preedit_string, -1)); - entry->preedit_cursor = cursor_pos; + priv->preedit_cursor = cursor_pos; g_free (preedit_string); gtk_entry_recompute (entry); @@ -5152,14 +5218,15 @@ gtk_entry_preedit_changed_cb (GtkIMContext *context, static gboolean gtk_entry_retrieve_surrounding_cb (GtkIMContext *context, - GtkEntry *entry) + GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; gchar *text; /* XXXX ??? does this even make sense when text is not visible? Should we return FALSE? */ text = gtk_entry_get_display_text (entry, 0, -1); gtk_im_context_set_surrounding (context, text, strlen (text), /* Length in bytes */ - g_utf8_offset_to_pointer (text, entry->current_pos) - text); + g_utf8_offset_to_pointer (text, priv->current_pos) - text); g_free (text); return TRUE; @@ -5171,10 +5238,12 @@ gtk_entry_delete_surrounding_cb (GtkIMContext *slave, gint n_chars, GtkEntry *entry) { - if (entry->editable) + GtkEntryPrivate *priv = entry->priv; + + if (priv->editable) gtk_editable_delete_text (GTK_EDITABLE (entry), - entry->current_pos + offset, - entry->current_pos + offset + n_chars); + priv->current_pos + offset, + priv->current_pos + offset + n_chars); return TRUE; } @@ -5187,29 +5256,30 @@ static void gtk_entry_enter_text (GtkEntry *entry, const gchar *str) { + GtkEntryPrivate *priv = entry->priv; GtkEditable *editable = GTK_EDITABLE (entry); gint tmp_pos; gboolean old_need_im_reset; - old_need_im_reset = entry->need_im_reset; - entry->need_im_reset = FALSE; + old_need_im_reset = priv->need_im_reset; + priv->need_im_reset = FALSE; if (gtk_editable_get_selection_bounds (editable, NULL, NULL)) gtk_editable_delete_selection (editable); else { - if (entry->overwrite_mode) + if (priv->overwrite_mode) gtk_entry_delete_from_cursor (entry, GTK_DELETE_CHARS, 1); } - tmp_pos = entry->current_pos; + tmp_pos = priv->current_pos; gtk_editable_insert_text (editable, str, strlen (str), &tmp_pos); gtk_editable_set_position (editable, tmp_pos); - entry->need_im_reset = old_need_im_reset; + priv->need_im_reset = old_need_im_reset; } -/* All changes to entry->current_pos and entry->selection_bound +/* All changes to priv->current_pos and priv->selection_bound * should go through this function. */ static void @@ -5217,23 +5287,24 @@ gtk_entry_set_positions (GtkEntry *entry, gint current_pos, gint selection_bound) { + GtkEntryPrivate *priv = entry->priv; gboolean changed = FALSE; g_object_freeze_notify (G_OBJECT (entry)); if (current_pos != -1 && - entry->current_pos != current_pos) + priv->current_pos != current_pos) { - entry->current_pos = current_pos; + priv->current_pos = current_pos; changed = TRUE; g_object_notify (G_OBJECT (entry), "cursor-position"); } if (selection_bound != -1 && - entry->selection_bound != selection_bound) + priv->selection_bound != selection_bound) { - entry->selection_bound = selection_bound; + priv->selection_bound = selection_bound; changed = TRUE; g_object_notify (G_OBJECT (entry), "selection-bound"); @@ -5251,16 +5322,19 @@ gtk_entry_set_positions (GtkEntry *entry, static void gtk_entry_reset_layout (GtkEntry *entry) { - if (entry->cached_layout) + GtkEntryPrivate *priv = entry->priv; + + if (priv->cached_layout) { - g_object_unref (entry->cached_layout); - entry->cached_layout = NULL; + g_object_unref (priv->cached_layout); + priv->cached_layout = NULL; } } static void update_im_cursor_location (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; GdkRectangle area; gint strong_x; gint strong_xoffset; @@ -5269,7 +5343,7 @@ update_im_cursor_location (GtkEntry *entry) gtk_entry_get_cursor_locations (entry, CURSOR_STANDARD, &strong_x, NULL); gtk_entry_get_text_area_size (entry, NULL, NULL, &area_width, &area_height); - strong_xoffset = strong_x - entry->scroll_offset; + strong_xoffset = strong_x - priv->scroll_offset; if (strong_xoffset < 0) { strong_xoffset = 0; @@ -5283,23 +5357,22 @@ update_im_cursor_location (GtkEntry *entry) area.width = 0; area.height = area_height; - gtk_im_context_set_cursor_location (entry->im_context, &area); + gtk_im_context_set_cursor_location (priv->im_context, &area); } static gboolean recompute_idle_func (gpointer data) { - GtkEntry *entry; + GtkEntry *entry = GTK_ENTRY (data); + GtkEntryPrivate *priv = entry->priv; - entry = GTK_ENTRY (data); + priv->recompute_idle = 0; - entry->recompute_idle = 0; - if (gtk_widget_has_screen (GTK_WIDGET (entry))) { gtk_entry_adjust_scroll (entry); - gtk_entry_queue_draw (entry); - + gtk_widget_queue_draw (GTK_WIDGET (entry)); + update_im_cursor_location (entry); } @@ -5309,12 +5382,14 @@ recompute_idle_func (gpointer data) static void gtk_entry_recompute (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; + gtk_entry_reset_layout (entry); gtk_entry_check_cursor_blink (entry); - - if (!entry->recompute_idle) + + if (!priv->recompute_idle) { - entry->recompute_idle = gdk_threads_add_idle_full (G_PRIORITY_HIGH_IDLE + 15, /* between resize and redraw */ + priv->recompute_idle = gdk_threads_add_idle_full (G_PRIORITY_HIGH_IDLE + 15, /* between resize and redraw */ recompute_idle_func, entry, NULL); } } @@ -5323,6 +5398,7 @@ static PangoLayout * gtk_entry_create_layout (GtkEntry *entry, gboolean include_preedit) { + GtkEntryPrivate *priv = entry->priv; GtkWidget *widget = GTK_WIDGET (entry); PangoLayout *layout = gtk_widget_create_pango_layout (widget, NULL); PangoAttrList *tmp_attrs = pango_attr_list_new (); @@ -5341,16 +5417,16 @@ gtk_entry_create_layout (GtkEntry *entry, if (include_preedit) { - gtk_im_context_get_preedit_string (entry->im_context, + gtk_im_context_get_preedit_string (priv->im_context, &preedit_string, &preedit_attrs, NULL); - preedit_length = entry->preedit_length; + preedit_length = priv->preedit_length; } if (preedit_length) { GString *tmp_string = g_string_new (display); - gint cursor_index = g_utf8_offset_to_pointer (display, entry->current_pos) - display; - + gint cursor_index = g_utf8_offset_to_pointer (display, priv->current_pos) - display; + g_string_insert (tmp_string, cursor_index, preedit_string); pango_layout_set_text (layout, tmp_string->str, tmp_string->len); @@ -5392,7 +5468,7 @@ gtk_entry_create_layout (GtkEntry *entry, pango_context_set_base_dir (gtk_widget_get_pango_context (widget), pango_dir); - entry->resolved_dir = pango_dir; + priv->resolved_dir = pango_dir; pango_layout_set_text (layout, display, n_bytes); } @@ -5414,17 +5490,19 @@ static PangoLayout * gtk_entry_ensure_layout (GtkEntry *entry, gboolean include_preedit) { - if (entry->preedit_length > 0 && - !include_preedit != !entry->cache_includes_preedit) + GtkEntryPrivate *priv = entry->priv; + + if (priv->preedit_length > 0 && + !include_preedit != !priv->cache_includes_preedit) gtk_entry_reset_layout (entry); - if (!entry->cached_layout) + if (!priv->cached_layout) { - entry->cached_layout = gtk_entry_create_layout (entry, include_preedit); - entry->cache_includes_preedit = include_preedit; + priv->cached_layout = gtk_entry_create_layout (entry, include_preedit); + priv->cache_includes_preedit = include_preedit; } - - return entry->cached_layout; + + return priv->cached_layout; } static void @@ -5432,6 +5510,7 @@ get_layout_position (GtkEntry *entry, gint *x, gint *y) { + GtkEntryPrivate *priv = entry->priv; PangoLayout *layout; PangoRectangle logical_rect; gint area_width, area_height; @@ -5450,9 +5529,9 @@ get_layout_position (GtkEntry *entry, pango_layout_line_get_extents (line, NULL, &logical_rect); /* Align primarily for locale's ascent/descent */ - y_pos = ((area_height - entry->ascent - entry->descent) / 2 + - entry->ascent + logical_rect.y); - + y_pos = ((area_height - priv->ascent - priv->descent) / 2 + + priv->ascent + logical_rect.y); + /* Now see if we need to adjust to fit in actual drawn string */ if (logical_rect.height > area_height) y_pos = (area_height - logical_rect.height) / 2; @@ -5464,15 +5543,18 @@ get_layout_position (GtkEntry *entry, y_pos = inner_border.top + y_pos / PANGO_SCALE; if (x) - *x = inner_border.left - entry->scroll_offset; + *x = inner_border.left - priv->scroll_offset; if (y) *y = y_pos; } static void -draw_text_with_color (GtkEntry *entry, cairo_t *cr, GdkColor *default_color) +draw_text_with_color (GtkEntry *entry, + cairo_t *cr, + GdkRGBA *default_color) { + GtkEntryPrivate *priv = entry->priv; PangoLayout *layout = gtk_entry_ensure_layout (entry, TRUE); GtkWidget *widget; gint x, y; @@ -5485,7 +5567,7 @@ draw_text_with_color (GtkEntry *entry, cairo_t *cr, GdkColor *default_color) get_layout_position (entry, &x, &y); cairo_move_to (cr, x, y); - gdk_cairo_set_source_color (cr, default_color); + gdk_cairo_set_source_rgba (cr, default_color); pango_cairo_show_layout (cr, layout); if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start_pos, &end_pos)) @@ -5493,42 +5575,39 @@ draw_text_with_color (GtkEntry *entry, cairo_t *cr, GdkColor *default_color) gint *ranges; gint n_ranges, i; PangoRectangle logical_rect; - GdkColor *selection_color, *text_color; + GdkRGBA selection_color, text_color; GtkBorder inner_border; - GtkStyle *style; + GtkStyleContext *context; + GtkStateFlags state; + context = gtk_widget_get_style_context (widget); pango_layout_get_pixel_extents (layout, NULL, &logical_rect); gtk_entry_get_pixel_ranges (entry, &ranges, &n_ranges); - style = gtk_widget_get_style (widget); + state = GTK_STATE_FLAG_SELECTED; if (gtk_widget_has_focus (widget)) - { - selection_color = &style->base [GTK_STATE_SELECTED]; - text_color = &style->text [GTK_STATE_SELECTED]; - } - else - { - selection_color = &style->base [GTK_STATE_ACTIVE]; - text_color = &style->text [GTK_STATE_ACTIVE]; - } + state |= GTK_STATE_FLAG_FOCUSED; + + gtk_style_context_get_background_color (context, state, &selection_color); + gtk_style_context_get_color (context, state, &text_color); _gtk_entry_effective_inner_border (entry, &inner_border); for (i = 0; i < n_ranges; ++i) cairo_rectangle (cr, - inner_border.left - entry->scroll_offset + ranges[2 * i], + inner_border.left - priv->scroll_offset + ranges[2 * i], y, ranges[2 * i + 1], logical_rect.height); cairo_clip (cr); - gdk_cairo_set_source_color (cr, selection_color); + gdk_cairo_set_source_rgba (cr, &selection_color); cairo_paint (cr); cairo_move_to (cr, x, y); - gdk_cairo_set_source_color (cr, text_color); + gdk_cairo_set_source_rgba (cr, &text_color); pango_cairo_show_layout (cr, layout); g_free (ranges); @@ -5540,10 +5619,11 @@ static void gtk_entry_draw_text (GtkEntry *entry, cairo_t *cr) { + GtkEntryPrivate *priv = entry->priv; GtkWidget *widget = GTK_WIDGET (entry); - GtkStateType state; - GtkStyle *style; - GdkColor text_color, bar_text_color; + GtkStateFlags state = 0; + GdkRGBA text_color, bar_text_color; + GtkStyleContext *context; gint pos_x, pos_y; gint width, height; gint progress_x, progress_y, progress_width, progress_height; @@ -5552,34 +5632,38 @@ gtk_entry_draw_text (GtkEntry *entry, /* Nothing to display at all */ if (gtk_entry_get_display_mode (entry) == DISPLAY_BLANK) return; - - state = GTK_STATE_SELECTED; - if (!gtk_widget_get_sensitive (widget)) - state = GTK_STATE_INSENSITIVE; - style = gtk_widget_get_style (widget); - text_color = style->text[gtk_widget_get_state (widget)]; - bar_text_color = style->fg[state]; + + state = gtk_widget_get_state_flags (widget); + context = gtk_widget_get_style_context (widget); + + gtk_style_context_get_color (context, state, &text_color); + + /* Get foreground color for progressbars */ + gtk_style_context_save (context); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_PROGRESSBAR); + gtk_style_context_get_color (context, state, &bar_text_color); + gtk_style_context_restore (context); get_progress_area (widget, &progress_x, &progress_y, &progress_width, &progress_height); - clip_width = gdk_window_get_width (entry->text_area); - clip_height = gdk_window_get_height (entry->text_area); + clip_width = gdk_window_get_width (priv->text_area); + clip_height = gdk_window_get_height (priv->text_area); cairo_rectangle (cr, 0, 0, clip_width, clip_height); cairo_clip (cr); /* If the color is the same, or the progress area has a zero * size, then we only need to draw once. */ - if ((text_color.pixel == bar_text_color.pixel) || + if (gdk_rgba_equal (&text_color, &bar_text_color) || ((progress_width == 0) || (progress_height == 0))) { draw_text_with_color (entry, cr, &text_color); } else { - width = gdk_window_get_width (entry->text_area); - height = gdk_window_get_height (entry->text_area); + width = gdk_window_get_width (priv->text_area); + height = gdk_window_get_height (priv->text_area); cairo_save (cr); @@ -5590,7 +5674,7 @@ gtk_entry_draw_text (GtkEntry *entry, cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); cairo_rectangle (cr, 0, 0, width, height); - gdk_window_get_position (entry->text_area, &pos_x, &pos_y); + gdk_window_get_position (priv->text_area, &pos_x, &pos_y); progress_x -= pos_x; progress_y -= pos_y; @@ -5638,6 +5722,7 @@ gtk_entry_draw_cursor (GtkEntry *entry, cairo_t *cr, CursorType type) { + GtkEntryPrivate *priv = entry->priv; GtkWidget *widget = GTK_WIDGET (entry); GdkKeymap *keymap = gdk_keymap_get_for_display (gtk_widget_get_display (GTK_WIDGET (entry))); PangoDirection keymap_direction = gdk_keymap_get_direction (keymap); @@ -5655,14 +5740,14 @@ gtk_entry_draw_cursor (GtkEntry *entry, _gtk_entry_effective_inner_border (entry, &inner_border); - xoffset = inner_border.left - entry->scroll_offset; + xoffset = inner_border.left - priv->scroll_offset; - text_area_height = gdk_window_get_height (entry->text_area); + text_area_height = gdk_window_get_height (priv->text_area); layout = gtk_entry_ensure_layout (entry, TRUE); text = pango_layout_get_text (layout); - cursor_index = g_utf8_offset_to_pointer (text, entry->current_pos + entry->preedit_cursor) - text; - if (!entry->overwrite_mode) + cursor_index = g_utf8_offset_to_pointer (text, priv->current_pos + priv->preedit_cursor) - text; + if (!priv->overwrite_mode) block = FALSE; else block = _gtk_text_util_get_block_cursor_location (layout, @@ -5682,7 +5767,7 @@ gtk_entry_draw_cursor (GtkEntry *entry, "gtk-split-cursor", &split_cursor, NULL); - dir1 = entry->resolved_dir; + dir1 = priv->resolved_dir; if (split_cursor) { @@ -5690,13 +5775,13 @@ gtk_entry_draw_cursor (GtkEntry *entry, if (weak_x != strong_x) { - dir2 = (entry->resolved_dir == PANGO_DIRECTION_LTR) ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR; + dir2 = (priv->resolved_dir == PANGO_DIRECTION_LTR) ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR; x2 = weak_x; } } else { - if (keymap_direction == entry->resolved_dir) + if (keymap_direction == priv->resolved_dir) x1 = strong_x; else x1 = weak_x; @@ -5721,7 +5806,8 @@ gtk_entry_draw_cursor (GtkEntry *entry, } else /* overwrite_mode */ { - GdkColor cursor_color; + GtkStyleContext *context; + GdkRGBA cursor_color; GdkRectangle rect; gint x, y; @@ -5734,17 +5820,25 @@ gtk_entry_draw_cursor (GtkEntry *entry, rect.width = PANGO_PIXELS (cursor_rect.width); rect.height = PANGO_PIXELS (cursor_rect.height); - _gtk_widget_get_cursor_color (widget, &cursor_color); - gdk_cairo_set_source_color (cr, &cursor_color); + context = gtk_widget_get_style_context (widget); + + _gtk_style_context_get_cursor_color (context, &cursor_color, NULL); + gdk_cairo_set_source_rgba (cr, &cursor_color); gdk_cairo_rectangle (cr, &rect); cairo_fill (cr); if (!block_at_line_end) { + GtkStateFlags state; + GdkRGBA color; + + state = gtk_widget_get_state_flags (widget); + gtk_style_context_get_background_color (context, state, &color); + gdk_cairo_rectangle (cr, &rect); cairo_clip (cr); cairo_move_to (cr, x, y); - gdk_cairo_set_source_color (cr, >k_widget_get_style (widget)->base[gtk_widget_get_state (widget)]); + gdk_cairo_set_source_rgba (cr, &color); pango_cairo_show_layout (cr, layout); } @@ -5752,21 +5846,15 @@ gtk_entry_draw_cursor (GtkEntry *entry, } } -static void -gtk_entry_queue_draw (GtkEntry *entry) -{ - if (gtk_widget_is_drawable (GTK_WIDGET (entry))) - gdk_window_invalidate_rect (gtk_widget_get_window (GTK_WIDGET (entry)), - NULL, FALSE); -} - void _gtk_entry_reset_im_context (GtkEntry *entry) { - if (entry->need_im_reset) + GtkEntryPrivate *priv = entry->priv; + + if (priv->need_im_reset) { - entry->need_im_reset = FALSE; - gtk_im_context_reset (entry->im_context); + priv->need_im_reset = FALSE; + gtk_im_context_reset (priv->im_context); } } @@ -5813,16 +5901,26 @@ gboolean gtk_entry_im_context_filter_keypress (GtkEntry *entry, GdkEventKey *event) { + GtkEntryPrivate *priv; + g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE); - return gtk_im_context_filter_keypress (entry->im_context, event); + priv = entry->priv; + + return gtk_im_context_filter_keypress (priv->im_context, event); } +GtkIMContext* +_gtk_entry_get_im_context (GtkEntry *entry) +{ + return entry->priv->im_context; +} static gint gtk_entry_find_position (GtkEntry *entry, gint x) { + GtkEntryPrivate *priv = entry->priv; PangoLayout *layout; PangoLayoutLine *line; gint index; @@ -5833,15 +5931,15 @@ gtk_entry_find_position (GtkEntry *entry, layout = gtk_entry_ensure_layout (entry, TRUE); text = pango_layout_get_text (layout); - cursor_index = g_utf8_offset_to_pointer (text, entry->current_pos) - text; - + cursor_index = g_utf8_offset_to_pointer (text, priv->current_pos) - text; + line = pango_layout_get_lines_readonly (layout)->data; pango_layout_line_x_to_index (line, x * PANGO_SCALE, &index, &trailing); - if (index >= cursor_index && entry->preedit_length) + if (index >= cursor_index && priv->preedit_length) { - if (index >= cursor_index + entry->preedit_length) - index -= entry->preedit_length; + if (index >= cursor_index + priv->preedit_length) + index -= priv->preedit_length; else { index = cursor_index; @@ -5861,6 +5959,7 @@ gtk_entry_get_cursor_locations (GtkEntry *entry, gint *strong_x, gint *weak_x) { + GtkEntryPrivate *priv = entry->priv; DisplayMode mode = gtk_entry_get_display_mode (entry); /* Nothing to display at all, so no cursor is relevant */ @@ -5881,20 +5980,20 @@ gtk_entry_get_cursor_locations (GtkEntry *entry, if (type == CURSOR_STANDARD) { - index = g_utf8_offset_to_pointer (text, entry->current_pos + entry->preedit_cursor) - text; + index = g_utf8_offset_to_pointer (text, priv->current_pos + priv->preedit_cursor) - text; } else /* type == CURSOR_DND */ { - index = g_utf8_offset_to_pointer (text, entry->dnd_position) - text; + index = g_utf8_offset_to_pointer (text, priv->dnd_position) - text; - if (entry->dnd_position > entry->current_pos) + if (priv->dnd_position > priv->current_pos) { if (mode == DISPLAY_NORMAL) - index += entry->preedit_length; + index += priv->preedit_length; else { gint preedit_len_chars = g_utf8_strlen (text, -1) - gtk_entry_buffer_get_length (get_buffer (entry)); - index += preedit_len_chars * g_unichar_to_utf8 (entry->invisible_char, NULL); + index += preedit_len_chars * g_unichar_to_utf8 (priv->invisible_char, NULL); } } } @@ -5912,7 +6011,7 @@ gtk_entry_get_cursor_locations (GtkEntry *entry, static void gtk_entry_adjust_scroll (GtkEntry *entry) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; gint min_offset, max_offset; gint text_area_width, text_width; GtkBorder inner_border; @@ -5928,7 +6027,7 @@ gtk_entry_adjust_scroll (GtkEntry *entry) _gtk_entry_effective_inner_border (entry, &inner_border); - text_area_width = gdk_window_get_width (entry->text_area); + text_area_width = gdk_window_get_width (priv->text_area); text_area_width -= inner_border.left + inner_border.right; if (text_area_width < 0) text_area_width = 0; @@ -5940,7 +6039,7 @@ gtk_entry_adjust_scroll (GtkEntry *entry) /* Display as much text as we can */ - if (entry->resolved_dir == PANGO_DIRECTION_LTR) + if (priv->resolved_dir == PANGO_DIRECTION_LTR) xalign = priv->xalign; else xalign = 1.0 - priv->xalign; @@ -5958,7 +6057,7 @@ gtk_entry_adjust_scroll (GtkEntry *entry) max_offset = min_offset; } - entry->scroll_offset = CLAMP (entry->scroll_offset, min_offset, max_offset); + priv->scroll_offset = CLAMP (priv->scroll_offset, min_offset, max_offset); /* And make sure cursors are on screen. Note that the cursor is * actually drawn one pixel into the INNER_BORDER space on @@ -5976,29 +6075,29 @@ gtk_entry_adjust_scroll (GtkEntry *entry) gtk_entry_get_cursor_locations (entry, CURSOR_STANDARD, &strong_x, &weak_x); - strong_xoffset = strong_x - entry->scroll_offset; + strong_xoffset = strong_x - priv->scroll_offset; if (strong_xoffset < 0) { - entry->scroll_offset += strong_xoffset; + priv->scroll_offset += strong_xoffset; strong_xoffset = 0; } else if (strong_xoffset > text_area_width) { - entry->scroll_offset += strong_xoffset - text_area_width; + priv->scroll_offset += strong_xoffset - text_area_width; strong_xoffset = text_area_width; } - weak_xoffset = weak_x - entry->scroll_offset; + weak_xoffset = weak_x - priv->scroll_offset; if (weak_xoffset < 0 && strong_xoffset - weak_xoffset <= text_area_width) { - entry->scroll_offset += weak_xoffset; + priv->scroll_offset += weak_xoffset; } else if (weak_xoffset > text_area_width && strong_xoffset - (weak_xoffset - text_area_width) >= 0) { - entry->scroll_offset += weak_xoffset - text_area_width; + priv->scroll_offset += weak_xoffset - text_area_width; } g_object_notify (G_OBJECT (entry), "scroll-offset"); @@ -6007,10 +6106,13 @@ gtk_entry_adjust_scroll (GtkEntry *entry) static void gtk_entry_move_adjustments (GtkEntry *entry) { + GtkWidget *widget = GTK_WIDGET (entry); GtkAllocation allocation; GtkAdjustment *adjustment; PangoContext *context; PangoFontMetrics *metrics; + GtkStyleContext *style_context; + GtkStateFlags state; gint x, layout_x, border_x, border_y; gint char_width; @@ -6018,7 +6120,7 @@ gtk_entry_move_adjustments (GtkEntry *entry) if (!adjustment) return; - gtk_widget_get_allocation (&(entry->widget), &allocation); + gtk_widget_get_allocation (widget, &allocation); /* Cursor position, layout offset, border width, and widget allocation */ gtk_entry_get_cursor_locations (entry, CURSOR_STANDARD, &x, NULL); @@ -6027,9 +6129,12 @@ gtk_entry_move_adjustments (GtkEntry *entry) x += allocation.x + layout_x + border_x; /* Approximate width of a char, so user can see what is ahead/behind */ - context = gtk_widget_get_pango_context (GTK_WIDGET (entry)); - metrics = pango_context_get_metrics (context, - gtk_widget_get_style (&(entry->widget))->font_desc, + context = gtk_widget_get_pango_context (widget); + style_context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + + metrics = pango_context_get_metrics (context, + gtk_style_context_get_font (style_context, state), pango_context_get_language (context)); char_width = pango_font_metrics_get_approximate_char_width (metrics) / PANGO_SCALE; @@ -6044,6 +6149,7 @@ gtk_entry_move_visually (GtkEntry *entry, gint start, gint count) { + GtkEntryPrivate *priv = entry->priv; gint index; PangoLayout *layout = gtk_entry_ensure_layout (entry, FALSE); const gchar *text; @@ -6069,7 +6175,7 @@ gtk_entry_move_visually (GtkEntry *entry, GdkKeymap *keymap = gdk_keymap_get_for_display (gtk_widget_get_display (GTK_WIDGET (entry))); PangoDirection keymap_direction = gdk_keymap_get_direction (keymap); - strong = keymap_direction == entry->resolved_dir; + strong = keymap_direction == priv->resolved_dir; } if (count > 0) @@ -6213,6 +6319,7 @@ gtk_entry_move_backward_word (GtkEntry *entry, static void gtk_entry_delete_whitespace (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; PangoLayout *layout = gtk_entry_ensure_layout (entry, FALSE); PangoLogAttr *log_attrs; gint n_attrs; @@ -6220,7 +6327,7 @@ gtk_entry_delete_whitespace (GtkEntry *entry) pango_layout_get_log_attrs (layout, &log_attrs, &n_attrs); - start = end = entry->current_pos; + start = end = priv->current_pos; while (start > 0 && log_attrs[start-1].is_white) start--; @@ -6238,8 +6345,9 @@ gtk_entry_delete_whitespace (GtkEntry *entry) static void gtk_entry_select_word (GtkEntry *entry) { - gint start_pos = gtk_entry_move_backward_word (entry, entry->current_pos, TRUE); - gint end_pos = gtk_entry_move_forward_word (entry, entry->current_pos, TRUE); + GtkEntryPrivate *priv = entry->priv; + gint start_pos = gtk_entry_move_backward_word (entry, priv->current_pos, TRUE); + gint end_pos = gtk_entry_move_forward_word (entry, priv->current_pos, TRUE); gtk_editable_select_region (GTK_EDITABLE (entry), start_pos, end_pos); } @@ -6269,9 +6377,9 @@ paste_received (GtkClipboard *clipboard, { GtkEntry *entry = GTK_ENTRY (data); GtkEditable *editable = GTK_EDITABLE (entry); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); - - if (entry->button == 2) + GtkEntryPrivate *priv = entry->priv; + + if (priv->button == 2) { gint pos, start, end; pos = priv->insert_pos; @@ -6289,12 +6397,12 @@ paste_received (GtkClipboard *clipboard, completion = gtk_entry_get_completion (entry); - if (entry->truncate_multiline) + if (priv->truncate_multiline) length = truncate_multiline (text); /* only complete if the selection is at the end */ popup_completion = (gtk_entry_buffer_get_length (get_buffer (entry)) == - MAX (entry->current_pos, entry->selection_bound)); + MAX (priv->current_pos, priv->selection_bound)); if (completion) { @@ -6310,7 +6418,7 @@ paste_received (GtkClipboard *clipboard, if (gtk_editable_get_selection_bounds (editable, &start, &end)) gtk_editable_delete_text (editable, start, end); - pos = entry->current_pos; + pos = priv->current_pos; gtk_editable_insert_text (editable, text, length, &pos); gtk_editable_set_position (editable, pos); g_object_thaw_notify (G_OBJECT (entry)); @@ -6355,8 +6463,9 @@ primary_clear_cb (GtkClipboard *clipboard, gpointer data) { GtkEntry *entry = GTK_ENTRY (data); + GtkEntryPrivate *priv = entry->priv; - gtk_editable_select_region (GTK_EDITABLE (entry), entry->current_pos, entry->current_pos); + gtk_editable_select_region (GTK_EDITABLE (entry), priv->current_pos, priv->current_pos); } static void @@ -6398,7 +6507,7 @@ static void gtk_entry_clear (GtkEntry *entry, GtkEntryIconPosition icon_pos) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = priv->icons[icon_pos]; if (!icon_info || icon_info->storage_type == GTK_IMAGE_EMPTY) @@ -6465,12 +6574,12 @@ static void gtk_entry_ensure_pixbuf (GtkEntry *entry, GtkEntryIconPosition icon_pos) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; EntryIconInfo *icon_info = priv->icons[icon_pos]; GtkIconInfo *info; GtkIconTheme *icon_theme; GtkSettings *settings; - GtkStateType state; + GtkStateFlags state; GtkWidget *widget; GdkScreen *screen; gint width, height; @@ -6486,18 +6595,16 @@ gtk_entry_ensure_pixbuf (GtkEntry *entry, case GTK_IMAGE_PIXBUF: break; case GTK_IMAGE_STOCK: - state = gtk_widget_get_state (widget); - gtk_widget_set_state (widget, GTK_STATE_NORMAL); - icon_info->pixbuf = gtk_widget_render_icon (widget, - icon_info->stock_id, - GTK_ICON_SIZE_MENU, - NULL); + state = gtk_widget_get_state_flags (widget); + gtk_widget_set_state_flags (widget, 0, TRUE); + icon_info->pixbuf = gtk_widget_render_icon_pixbuf (widget, + icon_info->stock_id, + GTK_ICON_SIZE_MENU); if (!icon_info->pixbuf) - icon_info->pixbuf = gtk_widget_render_icon (widget, - GTK_STOCK_MISSING_IMAGE, - GTK_ICON_SIZE_MENU, - NULL); - gtk_widget_set_state (widget, state); + icon_info->pixbuf = gtk_widget_render_icon_pixbuf (widget, + GTK_STOCK_MISSING_IMAGE, + GTK_ICON_SIZE_MENU); + gtk_widget_set_state_flags (widget, state, TRUE); break; case GTK_IMAGE_ICON_NAME: @@ -6506,7 +6613,7 @@ gtk_entry_ensure_pixbuf (GtkEntry *entry, { icon_theme = gtk_icon_theme_get_for_screen (screen); settings = gtk_settings_get_for_screen (screen); - + gtk_icon_size_lookup_for_settings (settings, GTK_ICON_SIZE_MENU, &width, &height); @@ -6518,13 +6625,12 @@ gtk_entry_ensure_pixbuf (GtkEntry *entry, if (icon_info->pixbuf == NULL) { - state = gtk_widget_get_state (widget); - gtk_widget_set_state (widget, GTK_STATE_NORMAL); - icon_info->pixbuf = gtk_widget_render_icon (widget, - GTK_STOCK_MISSING_IMAGE, - GTK_ICON_SIZE_MENU, - NULL); - gtk_widget_set_state (widget, state); + state = gtk_widget_get_state_flags (widget); + gtk_widget_set_state_flags (widget, 0, TRUE); + icon_info->pixbuf = gtk_widget_render_icon_pixbuf (widget, + GTK_STOCK_MISSING_IMAGE, + GTK_ICON_SIZE_MENU); + gtk_widget_set_state_flags (widget, state, TRUE); } } break; @@ -6552,13 +6658,12 @@ gtk_entry_ensure_pixbuf (GtkEntry *entry, if (icon_info->pixbuf == NULL) { - state = gtk_widget_get_state (widget); - gtk_widget_set_state (widget, GTK_STATE_NORMAL); - icon_info->pixbuf = gtk_widget_render_icon (widget, - GTK_STOCK_MISSING_IMAGE, - GTK_ICON_SIZE_MENU, - NULL); - gtk_widget_set_state (widget, state); + state = gtk_widget_get_state_flags (widget); + gtk_widget_set_state_flags (widget, 0, TRUE); + icon_info->pixbuf = gtk_widget_render_icon_pixbuf (widget, + GTK_STOCK_MISSING_IMAGE, + GTK_ICON_SIZE_MENU); + gtk_widget_set_state_flags (widget, state, TRUE); } } break; @@ -6609,7 +6714,7 @@ gtk_entry_new_with_buffer (GtkEntryBuffer *buffer) static GtkEntryBuffer* get_buffer (GtkEntry *entry) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; if (priv->buffer == NULL) { @@ -6659,7 +6764,8 @@ gtk_entry_set_buffer (GtkEntry *entry, GObject *obj; g_return_if_fail (GTK_IS_ENTRY (entry)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + + priv = entry->priv; if (buffer) { @@ -6696,7 +6802,7 @@ gtk_entry_set_buffer (GtkEntry *entry, /** * gtk_entry_get_text_area: * @entry: a #GtkEntry - * @text_area: Return location for the text area. + * @text_area: (out): Return location for the text area. * * Gets the area where the entry's text is drawn. This function is * useful when drawing something to the entry in a draw callback. @@ -6711,21 +6817,25 @@ void gtk_entry_get_text_area (GtkEntry *entry, GdkRectangle *text_area) { + GtkEntryPrivate *priv; + g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (text_area != NULL); - if (entry->text_area) + priv = entry->priv; + + if (priv->text_area) { GtkAllocation allocation; gint x, y; gtk_widget_get_allocation (GTK_WIDGET (entry), &allocation); - gdk_window_get_position (entry->text_area, &x, &y); + gdk_window_get_position (priv->text_area, &x, &y); text_area->x = x - allocation.x; text_area->y = y - allocation.y; - text_area->width = gdk_window_get_width (entry->text_area); - text_area->height = gdk_window_get_height (entry->text_area); + text_area->width = gdk_window_get_width (priv->text_area); + text_area->height = gdk_window_get_height (priv->text_area); } else { @@ -6752,11 +6862,9 @@ gtk_entry_set_text (GtkEntry *entry, { gint tmp_pos; GtkEntryCompletion *completion; - GtkEntryPrivate *priv; g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (text != NULL); - priv = GTK_ENTRY_GET_PRIVATE (entry); /* Actually setting the text will affect the cursor and selection; * if the contents don't actually change, this will look odd to the user. @@ -6799,13 +6907,17 @@ void gtk_entry_set_visibility (GtkEntry *entry, gboolean visible) { + GtkEntryPrivate *priv; + g_return_if_fail (GTK_IS_ENTRY (entry)); + priv = entry->priv; + visible = visible != FALSE; - if (entry->visible != visible) + if (priv->visible != visible) { - entry->visible = visible; + priv->visible = visible; g_object_notify (G_OBJECT (entry), "visibility"); gtk_entry_recompute (entry); @@ -6826,7 +6938,7 @@ gtk_entry_get_visibility (GtkEntry *entry) { g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE); - return entry->visible; + return entry->priv->visible; } /** @@ -6850,7 +6962,7 @@ gtk_entry_set_invisible_char (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if (!priv->invisible_char_set) { @@ -6858,10 +6970,10 @@ gtk_entry_set_invisible_char (GtkEntry *entry, g_object_notify (G_OBJECT (entry), "invisible-char-set"); } - if (ch == entry->invisible_char) + if (ch == priv->invisible_char) return; - entry->invisible_char = ch; + priv->invisible_char = ch; g_object_notify (G_OBJECT (entry), "invisible-char"); gtk_entry_recompute (entry); } @@ -6881,7 +6993,7 @@ gtk_entry_get_invisible_char (GtkEntry *entry) { g_return_val_if_fail (GTK_IS_ENTRY (entry), 0); - return entry->invisible_char; + return entry->priv->invisible_char; } /** @@ -6902,7 +7014,7 @@ gtk_entry_unset_invisible_char (GtkEntry *entry) g_return_if_fail (GTK_IS_ENTRY (entry)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if (!priv->invisible_char_set) return; @@ -6910,9 +7022,9 @@ gtk_entry_unset_invisible_char (GtkEntry *entry) priv->invisible_char_set = FALSE; ch = find_invisible_char (GTK_WIDGET (entry)); - if (entry->invisible_char != ch) + if (priv->invisible_char != ch) { - entry->invisible_char = ch; + priv->invisible_char = ch; g_object_notify (G_OBJECT (entry), "invisible-char"); } @@ -6933,9 +7045,11 @@ void gtk_entry_set_overwrite_mode (GtkEntry *entry, gboolean overwrite) { + GtkEntryPrivate *priv = entry->priv; + g_return_if_fail (GTK_IS_ENTRY (entry)); - - if (entry->overwrite_mode == overwrite) + + if (priv->overwrite_mode == overwrite) return; gtk_entry_toggle_overwrite (entry); @@ -6958,7 +7072,7 @@ gtk_entry_get_overwrite_mode (GtkEntry *entry) { g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE); - return entry->overwrite_mode; + return entry->priv->overwrite_mode; } /** @@ -6983,6 +7097,7 @@ G_CONST_RETURN gchar* gtk_entry_get_text (GtkEntry *entry) { g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL); + return gtk_entry_buffer_get_text (get_buffer (entry)); } @@ -7031,6 +7146,7 @@ gint gtk_entry_get_max_length (GtkEntry *entry) { g_return_val_if_fail (GTK_IS_ENTRY (entry), 0); + return gtk_entry_buffer_get_max_length (get_buffer (entry)); } @@ -7056,6 +7172,7 @@ guint16 gtk_entry_get_text_length (GtkEntry *entry) { g_return_val_if_fail (GTK_IS_ENTRY (entry), 0); + return gtk_entry_buffer_get_length (get_buffer (entry)); } @@ -7077,12 +7194,17 @@ void gtk_entry_set_activates_default (GtkEntry *entry, gboolean setting) { + GtkEntryPrivate *priv; + g_return_if_fail (GTK_IS_ENTRY (entry)); + + priv = entry->priv; + setting = setting != FALSE; - if (setting != entry->activates_default) + if (setting != priv->activates_default) { - entry->activates_default = setting; + priv->activates_default = setting; g_object_notify (G_OBJECT (entry), "activates-default"); } } @@ -7100,7 +7222,7 @@ gtk_entry_get_activates_default (GtkEntry *entry) { g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE); - return entry->activates_default; + return entry->priv->activates_default; } /** @@ -7118,11 +7240,15 @@ void gtk_entry_set_width_chars (GtkEntry *entry, gint n_chars) { + GtkEntryPrivate *priv; + g_return_if_fail (GTK_IS_ENTRY (entry)); - if (entry->width_chars != n_chars) + priv = entry->priv; + + if (priv->width_chars != n_chars) { - entry->width_chars = n_chars; + priv->width_chars = n_chars; g_object_notify (G_OBJECT (entry), "width-chars"); gtk_widget_queue_resize (GTK_WIDGET (entry)); } @@ -7141,7 +7267,7 @@ gtk_entry_get_width_chars (GtkEntry *entry) { g_return_val_if_fail (GTK_IS_ENTRY (entry), 0); - return entry->width_chars; + return entry->priv->width_chars; } /** @@ -7155,15 +7281,19 @@ void gtk_entry_set_has_frame (GtkEntry *entry, gboolean setting) { + GtkEntryPrivate *priv; + g_return_if_fail (GTK_IS_ENTRY (entry)); + priv = entry->priv; + setting = (setting != FALSE); - if (entry->has_frame == setting) + if (priv->has_frame == setting) return; gtk_widget_queue_resize (GTK_WIDGET (entry)); - entry->has_frame = setting; + priv->has_frame = setting; g_object_notify (G_OBJECT (entry), "has-frame"); } @@ -7180,7 +7310,7 @@ gtk_entry_get_has_frame (GtkEntry *entry) { g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE); - return entry->has_frame; + return entry->priv->has_frame; } /** @@ -7282,20 +7412,23 @@ gint gtk_entry_layout_index_to_text_index (GtkEntry *entry, gint layout_index) { + GtkEntryPrivate *priv; PangoLayout *layout; const gchar *text; gint cursor_index; g_return_val_if_fail (GTK_IS_ENTRY (entry), 0); + priv = entry->priv; + layout = gtk_entry_ensure_layout (entry, TRUE); text = pango_layout_get_text (layout); - cursor_index = g_utf8_offset_to_pointer (text, entry->current_pos) - text; - - if (layout_index >= cursor_index && entry->preedit_length) + cursor_index = g_utf8_offset_to_pointer (text, priv->current_pos) - text; + + if (layout_index >= cursor_index && priv->preedit_length) { - if (layout_index >= cursor_index + entry->preedit_length) - layout_index -= entry->preedit_length; + if (layout_index >= cursor_index + priv->preedit_length) + layout_index -= priv->preedit_length; else layout_index = cursor_index; } @@ -7318,17 +7451,21 @@ gint gtk_entry_text_index_to_layout_index (GtkEntry *entry, gint text_index) { + GtkEntryPrivate *priv; PangoLayout *layout; const gchar *text; gint cursor_index; + g_return_val_if_fail (GTK_IS_ENTRY (entry), 0); + priv = entry->priv; + layout = gtk_entry_ensure_layout (entry, TRUE); text = pango_layout_get_text (layout); - cursor_index = g_utf8_offset_to_pointer (text, entry->current_pos) - text; - + cursor_index = g_utf8_offset_to_pointer (text, priv->current_pos) - text; + if (text_index > cursor_index) - text_index += entry->preedit_length; + text_index += priv->preedit_length; return text_index; } @@ -7336,8 +7473,8 @@ gtk_entry_text_index_to_layout_index (GtkEntry *entry, /** * gtk_entry_get_layout_offsets: * @entry: a #GtkEntry - * @x: (allow-none): location to store X offset of layout, or %NULL - * @y: (allow-none): location to store Y offset of layout, or %NULL + * @x: (out) (allow-none): location to store X offset of layout, or %NULL + * @y: (out) (allow-none): location to store Y offset of layout, or %NULL * * * Obtains the position of the #PangoLayout used to render text @@ -7399,10 +7536,10 @@ void gtk_entry_set_alignment (GtkEntry *entry, gfloat xalign) { GtkEntryPrivate *priv; - + g_return_if_fail (GTK_IS_ENTRY (entry)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if (xalign < 0.0) xalign = 0.0; @@ -7432,13 +7569,9 @@ gtk_entry_set_alignment (GtkEntry *entry, gfloat xalign) gfloat gtk_entry_get_alignment (GtkEntry *entry) { - GtkEntryPrivate *priv; - g_return_val_if_fail (GTK_IS_ENTRY (entry), 0.0); - priv = GTK_ENTRY_GET_PRIVATE (entry); - - return priv->xalign; + return entry->priv->xalign; } /** @@ -7464,7 +7597,7 @@ gtk_entry_set_icon_from_pixbuf (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (IS_VALID_ICON_POSITION (icon_pos)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if ((icon_info = priv->icons[icon_pos]) == NULL) icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos); @@ -7529,15 +7662,13 @@ gtk_entry_set_icon_from_stock (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (IS_VALID_ICON_POSITION (icon_pos)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if ((icon_info = priv->icons[icon_pos]) == NULL) icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos); g_object_freeze_notify (G_OBJECT (entry)); - gtk_widget_ensure_style (GTK_WIDGET (entry)); - /* need to dup before clearing */ new_id = g_strdup (stock_id); @@ -7599,15 +7730,13 @@ gtk_entry_set_icon_from_icon_name (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (IS_VALID_ICON_POSITION (icon_pos)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if ((icon_info = priv->icons[icon_pos]) == NULL) icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos); g_object_freeze_notify (G_OBJECT (entry)); - gtk_widget_ensure_style (GTK_WIDGET (entry)); - /* need to dup before clearing */ new_name = g_strdup (icon_name); @@ -7667,7 +7796,7 @@ gtk_entry_set_icon_from_gicon (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (IS_VALID_ICON_POSITION (icon_pos)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if ((icon_info = priv->icons[icon_pos]) == NULL) icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos); @@ -7729,7 +7858,7 @@ gtk_entry_set_icon_activatable (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (IS_VALID_ICON_POSITION (icon_pos)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if ((icon_info = priv->icons[icon_pos]) == NULL) icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos); @@ -7769,10 +7898,10 @@ gtk_entry_get_icon_activatable (GtkEntry *entry, g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE); g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), FALSE); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; icon_info = priv->icons[icon_pos]; - return (icon_info != NULL && !icon_info->nonactivatable); + return (!icon_info || !icon_info->nonactivatable); } /** @@ -7801,7 +7930,8 @@ gtk_entry_get_icon_pixbuf (GtkEntry *entry, g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL); g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), NULL); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; + icon_info = priv->icons[icon_pos]; if (!icon_info) @@ -7836,7 +7966,7 @@ gtk_entry_get_icon_gicon (GtkEntry *entry, g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL); g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), NULL); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; icon_info = priv->icons[icon_pos]; if (!icon_info) @@ -7869,7 +7999,7 @@ gtk_entry_get_icon_stock (GtkEntry *entry, g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL); g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), NULL); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; icon_info = priv->icons[icon_pos]; if (!icon_info) @@ -7902,7 +8032,7 @@ gtk_entry_get_icon_name (GtkEntry *entry, g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL); g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), NULL); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; icon_info = priv->icons[icon_pos]; if (!icon_info) @@ -7933,7 +8063,7 @@ gtk_entry_set_icon_sensitive (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (IS_VALID_ICON_POSITION (icon_pos)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if ((icon_info = priv->icons[icon_pos]) == NULL) icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos); @@ -7976,7 +8106,8 @@ gtk_entry_get_icon_sensitive (GtkEntry *entry, g_return_val_if_fail (GTK_IS_ENTRY (entry), TRUE); g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), TRUE); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; + icon_info = priv->icons[icon_pos]; return (!icon_info || !icon_info->insensitive); @@ -8006,7 +8137,8 @@ gtk_entry_get_icon_storage_type (GtkEntry *entry, g_return_val_if_fail (GTK_IS_ENTRY (entry), GTK_IMAGE_EMPTY); g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), GTK_IMAGE_EMPTY); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; + icon_info = priv->icons[icon_pos]; if (!icon_info) @@ -8093,7 +8225,7 @@ gtk_entry_set_icon_drag_source (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (IS_VALID_ICON_POSITION (icon_pos)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if ((icon_info = priv->icons[icon_pos]) == NULL) icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos); @@ -8131,7 +8263,7 @@ gtk_entry_get_current_icon_drag_source (GtkEntry *entry) g_return_val_if_fail (GTK_IS_ENTRY (entry), -1); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; for (i = 0; i < MAX_ICONS; i++) { @@ -8149,7 +8281,7 @@ gtk_entry_get_current_icon_drag_source (GtkEntry *entry) * gtk_entry_get_icon_area: * @entry: A #GtkEntry * @icon_pos: Icon position - * @icon_area: Return location for the icon's area + * @icon_area: (out): Return location for the icon's area * * Gets the area where entry's icon at @icon_pos is drawn. * This function is useful when drawing something to the @@ -8173,7 +8305,7 @@ gtk_entry_get_icon_area (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (icon_area != NULL); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; icon_info = priv->icons[icon_pos]; @@ -8206,7 +8338,7 @@ ensure_has_tooltip (GtkEntry *entry) int i; gboolean has_tooltip = FALSE; - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; for (i = 0; i < MAX_ICONS; i++) { @@ -8247,7 +8379,8 @@ gtk_entry_get_icon_tooltip_text (GtkEntry *entry, g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL); g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), NULL); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; + icon_info = priv->icons[icon_pos]; if (!icon_info) @@ -8287,10 +8420,10 @@ gtk_entry_set_icon_tooltip_text (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (IS_VALID_ICON_POSITION (icon_pos)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; - if (!(icon_info = priv->icons[icon_pos])) - icon_info = priv->icons[icon_pos]; + if ((icon_info = priv->icons[icon_pos]) == NULL) + icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos); if (icon_info->tooltip) g_free (icon_info->tooltip); @@ -8329,7 +8462,8 @@ gtk_entry_get_icon_tooltip_markup (GtkEntry *entry, g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL); g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), NULL); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; + icon_info = priv->icons[icon_pos]; if (!icon_info) @@ -8366,10 +8500,10 @@ gtk_entry_set_icon_tooltip_markup (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); g_return_if_fail (IS_VALID_ICON_POSITION (icon_pos)); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; - if (!(icon_info = priv->icons[icon_pos])) - icon_info = priv->icons[icon_pos]; + if ((icon_info = priv->icons[icon_pos]) == NULL) + icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos); if (icon_info->tooltip) g_free (icon_info->tooltip); @@ -8398,7 +8532,7 @@ gtk_entry_query_tooltip (GtkWidget *widget, gint icon_pos; entry = GTK_ENTRY (widget); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if (!keyboard_tip) { @@ -8467,7 +8601,10 @@ static void popup_menu_detach (GtkWidget *attach_widget, GtkMenu *menu) { - GTK_ENTRY (attach_widget)->popup_menu = NULL; + GtkEntry *entry_attach = GTK_ENTRY (attach_widget); + GtkEntryPrivate *priv_attach = entry_attach->priv; + + priv_attach->popup_menu = NULL; } static void @@ -8478,6 +8615,7 @@ popup_position_func (GtkMenu *menu, gpointer user_data) { GtkEntry *entry = GTK_ENTRY (user_data); + GtkEntryPrivate *priv = entry->priv; GtkWidget *widget = GTK_WIDGET (entry); GdkScreen *screen; GtkRequisition menu_req; @@ -8487,22 +8625,22 @@ popup_position_func (GtkMenu *menu, g_return_if_fail (gtk_widget_get_realized (widget)); - gdk_window_get_origin (entry->text_area, x, y); + gdk_window_get_origin (priv->text_area, x, y); screen = gtk_widget_get_screen (widget); - monitor_num = gdk_screen_get_monitor_at_window (screen, entry->text_area); + monitor_num = gdk_screen_get_monitor_at_window (screen, priv->text_area); if (monitor_num < 0) monitor_num = 0; gtk_menu_set_monitor (menu, monitor_num); gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); - gtk_widget_get_preferred_size (entry->popup_menu, + gtk_widget_get_preferred_size (priv->popup_menu, &menu_req, NULL); - height = gdk_window_get_height (entry->text_area); + height = gdk_window_get_height (priv->text_area); gtk_entry_get_cursor_locations (entry, CURSOR_STANDARD, &strong_x, NULL); _gtk_entry_effective_inner_border (entry, &inner_border); - *x += inner_border.left + strong_x - entry->scroll_offset; + *x += inner_border.left + strong_x - priv->scroll_offset; if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) *x -= menu_req.width; @@ -8523,8 +8661,9 @@ unichar_chosen_func (const char *text, gpointer data) { GtkEntry *entry = GTK_ENTRY (data); + GtkEntryPrivate *priv = entry->priv; - if (entry->editable) + if (priv->editable) gtk_entry_enter_text (entry, text); } @@ -8542,7 +8681,8 @@ popup_targets_received (GtkClipboard *clipboard, { PopupInfo *info = user_data; GtkEntry *entry = info->entry; - + GtkEntryPrivate *info_entry_priv = entry->priv; + if (gtk_widget_get_realized (GTK_WIDGET (entry))) { DisplayMode mode; @@ -8553,43 +8693,43 @@ popup_targets_received (GtkClipboard *clipboard, gboolean show_unicode_menu; clipboard_contains_text = gtk_selection_data_targets_include_text (data); - if (entry->popup_menu) - gtk_widget_destroy (entry->popup_menu); - - entry->popup_menu = gtk_menu_new (); - - gtk_menu_attach_to_widget (GTK_MENU (entry->popup_menu), + if (info_entry_priv->popup_menu) + gtk_widget_destroy (info_entry_priv->popup_menu); + + info_entry_priv->popup_menu = gtk_menu_new (); + + gtk_menu_attach_to_widget (GTK_MENU (info_entry_priv->popup_menu), GTK_WIDGET (entry), popup_menu_detach); mode = gtk_entry_get_display_mode (entry); - append_action_signal (entry, entry->popup_menu, GTK_STOCK_CUT, "cut-clipboard", - entry->editable && mode == DISPLAY_NORMAL && - entry->current_pos != entry->selection_bound); + append_action_signal (entry, info_entry_priv->popup_menu, GTK_STOCK_CUT, "cut-clipboard", + info_entry_priv->editable && mode == DISPLAY_NORMAL && + info_entry_priv->current_pos != info_entry_priv->selection_bound); - append_action_signal (entry, entry->popup_menu, GTK_STOCK_COPY, "copy-clipboard", + append_action_signal (entry, info_entry_priv->popup_menu, GTK_STOCK_COPY, "copy-clipboard", mode == DISPLAY_NORMAL && - entry->current_pos != entry->selection_bound); + info_entry_priv->current_pos != info_entry_priv->selection_bound); - append_action_signal (entry, entry->popup_menu, GTK_STOCK_PASTE, "paste-clipboard", - entry->editable && clipboard_contains_text); + append_action_signal (entry, info_entry_priv->popup_menu, GTK_STOCK_PASTE, "paste-clipboard", + info_entry_priv->editable && clipboard_contains_text); menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_DELETE, NULL); - gtk_widget_set_sensitive (menuitem, entry->editable && entry->current_pos != entry->selection_bound); + gtk_widget_set_sensitive (menuitem, info_entry_priv->editable && info_entry_priv->current_pos != info_entry_priv->selection_bound); g_signal_connect_swapped (menuitem, "activate", G_CALLBACK (gtk_entry_delete_cb), entry); gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (entry->popup_menu), menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (info_entry_priv->popup_menu), menuitem); menuitem = gtk_separator_menu_item_new (); gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (entry->popup_menu), menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (info_entry_priv->popup_menu), menuitem); menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_SELECT_ALL, NULL); g_signal_connect_swapped (menuitem, "activate", G_CALLBACK (gtk_entry_select_all), entry); gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (entry->popup_menu), menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (info_entry_priv->popup_menu), menuitem); g_object_get (gtk_widget_get_settings (GTK_WIDGET (entry)), "gtk-show-input-method-menu", &show_input_method_menu, @@ -8600,33 +8740,33 @@ popup_targets_received (GtkClipboard *clipboard, { menuitem = gtk_separator_menu_item_new (); gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (entry->popup_menu), menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (info_entry_priv->popup_menu), menuitem); } if (show_input_method_menu) { menuitem = gtk_menu_item_new_with_mnemonic (_("Input _Methods")); - gtk_widget_set_sensitive (menuitem, entry->editable); + gtk_widget_set_sensitive (menuitem, info_entry_priv->editable); gtk_widget_show (menuitem); submenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu); - - gtk_menu_shell_append (GTK_MENU_SHELL (entry->popup_menu), menuitem); - - gtk_im_multicontext_append_menuitems (GTK_IM_MULTICONTEXT (entry->im_context), + + gtk_menu_shell_append (GTK_MENU_SHELL (info_entry_priv->popup_menu), menuitem); + + gtk_im_multicontext_append_menuitems (GTK_IM_MULTICONTEXT (info_entry_priv->im_context), GTK_MENU_SHELL (submenu)); } if (show_unicode_menu) { menuitem = gtk_menu_item_new_with_mnemonic (_("_Insert Unicode Control Character")); - gtk_widget_set_sensitive (menuitem, entry->editable); + gtk_widget_set_sensitive (menuitem, info_entry_priv->editable); gtk_widget_show (menuitem); submenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu); - gtk_menu_shell_append (GTK_MENU_SHELL (entry->popup_menu), menuitem); - + gtk_menu_shell_append (GTK_MENU_SHELL (info_entry_priv->popup_menu), menuitem); + _gtk_text_util_append_special_char_menuitems (GTK_MENU_SHELL (submenu), unichar_chosen_func, entry); @@ -8635,19 +8775,19 @@ popup_targets_received (GtkClipboard *clipboard, g_signal_emit (entry, signals[POPULATE_POPUP], 0, - entry->popup_menu); - + info_entry_priv->popup_menu); + if (info->button) - gtk_menu_popup (GTK_MENU (entry->popup_menu), NULL, NULL, + gtk_menu_popup (GTK_MENU (info_entry_priv->popup_menu), NULL, NULL, NULL, NULL, info->button, info->time); else { - gtk_menu_popup (GTK_MENU (entry->popup_menu), NULL, NULL, + gtk_menu_popup (GTK_MENU (info_entry_priv->popup_menu), NULL, NULL, popup_position_func, entry, info->button, info->time); - gtk_menu_shell_select_first (GTK_MENU_SHELL (entry->popup_menu), FALSE); + gtk_menu_shell_select_first (GTK_MENU_SHELL (info_entry_priv->popup_menu), FALSE); } } @@ -8695,7 +8835,8 @@ static void gtk_entry_drag_begin (GtkWidget *widget, GdkDragContext *context) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; gint i; for (i = 0; i < MAX_ICONS; i++) @@ -8733,7 +8874,8 @@ static void gtk_entry_drag_end (GtkWidget *widget, GdkDragContext *context) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; gint i; for (i = 0; i < MAX_ICONS; i++) @@ -8751,8 +8893,9 @@ gtk_entry_drag_leave (GtkWidget *widget, guint time) { GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; - entry->dnd_position = -1; + priv->dnd_position = -1; gtk_widget_queue_draw (widget); } @@ -8764,9 +8907,10 @@ gtk_entry_drag_drop (GtkWidget *widget, guint time) { GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; GdkAtom target = GDK_NONE; - - if (entry->editable) + + if (priv->editable) target = gtk_drag_dest_find_target (widget, context, NULL); if (target != GDK_NONE) @@ -8785,24 +8929,27 @@ gtk_entry_drag_motion (GtkWidget *widget, guint time) { GtkEntry *entry = GTK_ENTRY (widget); - GtkStyle *style; + GtkEntryPrivate *priv = entry->priv; + GtkStyleContext *style_context; GtkWidget *source_widget; GdkDragAction suggested_action; gint new_position, old_position; gint sel1, sel2; + GtkBorder padding; - style = gtk_widget_get_style (widget); - x -= style->xthickness; - y -= style->ythickness; + style_context = gtk_widget_get_style_context (widget); + gtk_style_context_get_padding (style_context, 0, &padding); + x -= padding.left; + y -= padding.top; - old_position = entry->dnd_position; - new_position = gtk_entry_find_position (entry, x + entry->scroll_offset); + old_position = priv->dnd_position; + new_position = gtk_entry_find_position (entry, x + priv->scroll_offset); - if (entry->editable && + if (priv->editable && gtk_drag_dest_find_target (widget, context, NULL) != GDK_NONE) { source_widget = gtk_drag_get_source_widget (context); - suggested_action = context->suggested_action; + suggested_action = gdk_drag_context_get_suggested_action (context); if (!gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &sel1, &sel2) || new_position < sel1 || new_position > sel2) @@ -8812,30 +8959,30 @@ gtk_entry_drag_motion (GtkWidget *widget, /* Default to MOVE, unless the user has * pressed ctrl or alt to affect available actions */ - if ((context->actions & GDK_ACTION_MOVE) != 0) + if ((gdk_drag_context_get_actions (context) & GDK_ACTION_MOVE) != 0) suggested_action = GDK_ACTION_MOVE; } - - entry->dnd_position = new_position; + + priv->dnd_position = new_position; } else { if (source_widget == widget) suggested_action = 0; /* Can't drop in selection where drag started */ - - entry->dnd_position = -1; + + priv->dnd_position = -1; } } else { /* Entry not editable, or no text */ suggested_action = 0; - entry->dnd_position = -1; + priv->dnd_position = -1; } gdk_drag_status (context, suggested_action, time); - - if (entry->dnd_position != old_position) + + if (priv->dnd_position != old_position) gtk_widget_queue_draw (widget); return TRUE; @@ -8851,26 +8998,29 @@ gtk_entry_drag_data_received (GtkWidget *widget, guint time) { GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; GtkEditable *editable = GTK_EDITABLE (widget); - GtkStyle *style; + GtkStyleContext *style_context; + GtkBorder padding; gchar *str; str = (gchar *) gtk_selection_data_get_text (selection_data); - style = gtk_widget_get_style (widget); - x -= style->xthickness; - y -= style->ythickness; + style_context = gtk_widget_get_style_context (widget); + gtk_style_context_get_padding (style_context, 0, &padding); + x -= padding.left; + y -= padding.top; - if (str && entry->editable) + if (str && priv->editable) { gint new_position; gint sel1, sel2; gint length = -1; - if (entry->truncate_multiline) + if (priv->truncate_multiline) length = truncate_multiline (str); - new_position = gtk_entry_find_position (entry, x + entry->scroll_offset); + new_position = gtk_entry_find_position (entry, x + priv->scroll_offset); if (!gtk_editable_get_selection_bounds (editable, &sel1, &sel2) || new_position < sel1 || new_position > sel2) @@ -8888,7 +9038,7 @@ gtk_entry_drag_data_received (GtkWidget *widget, end_change (entry); } - gtk_drag_finish (context, TRUE, context->action == GDK_ACTION_MOVE, time); + gtk_drag_finish (context, TRUE, gdk_drag_context_get_selected_action (context) == GDK_ACTION_MOVE, time); } else { @@ -8906,12 +9056,12 @@ gtk_entry_drag_data_get (GtkWidget *widget, guint info, guint time) { + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; + GtkEditable *editable = GTK_EDITABLE (widget); gint sel_start, sel_end; gint i; - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); - GtkEditable *editable = GTK_EDITABLE (widget); - /* If there is an icon drag going on, exit early. */ for (i = 0; i < MAX_ICONS; i++) { @@ -8939,12 +9089,12 @@ static void gtk_entry_drag_data_delete (GtkWidget *widget, GdkDragContext *context) { + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; + GtkEditable *editable = GTK_EDITABLE (widget); gint sel_start, sel_end; gint i; - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (widget); - GtkEditable *editable = GTK_EDITABLE (widget); - /* If there is an icon drag going on, exit early. */ for (i = 0; i < MAX_ICONS; i++) { @@ -8956,8 +9106,8 @@ gtk_entry_drag_data_delete (GtkWidget *widget, return; } } - - if (GTK_ENTRY (widget)->editable && + + if (priv->editable && gtk_editable_get_selection_bounds (editable, &sel_start, &sel_end)) gtk_editable_delete_text (editable, sel_start, sel_end); } @@ -8976,9 +9126,11 @@ gtk_entry_drag_data_delete (GtkWidget *widget, static gboolean cursor_blinks (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; + if (gtk_widget_has_focus (GTK_WIDGET (entry)) && - entry->editable && - entry->selection_bound == entry->current_pos) + priv->editable && + priv->selection_bound == priv->current_pos) { GtkSettings *settings; gboolean blink; @@ -9017,14 +9169,15 @@ get_cursor_blink_timeout (GtkEntry *entry) static void show_cursor (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; GtkWidget *widget; - if (!entry->cursor_visible) + if (!priv->cursor_visible) { - entry->cursor_visible = TRUE; + priv->cursor_visible = TRUE; widget = GTK_WIDGET (entry); - if (gtk_widget_has_focus (widget) && entry->selection_bound == entry->current_pos) + if (gtk_widget_has_focus (widget) && priv->selection_bound == priv->current_pos) gtk_widget_queue_draw (widget); } } @@ -9032,14 +9185,15 @@ show_cursor (GtkEntry *entry) static void hide_cursor (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; GtkWidget *widget; - if (entry->cursor_visible) + if (priv->cursor_visible) { - entry->cursor_visible = FALSE; + priv->cursor_visible = FALSE; widget = GTK_WIDGET (entry); - if (gtk_widget_has_focus (widget) && entry->selection_bound == entry->current_pos) + if (gtk_widget_has_focus (widget) && priv->selection_bound == priv->current_pos) gtk_widget_queue_draw (widget); } } @@ -9055,7 +9209,7 @@ blink_cb (gpointer data) gint blink_timeout; entry = GTK_ENTRY (data); - priv = GTK_ENTRY_GET_PRIVATE (entry); + priv = entry->priv; if (!gtk_widget_has_focus (GTK_WIDGET (entry))) { @@ -9068,7 +9222,7 @@ blink_cb (gpointer data) return FALSE; } - g_assert (entry->selection_bound == entry->current_pos); + g_assert (priv->selection_bound == priv->current_pos); blink_timeout = get_cursor_blink_timeout (entry); if (priv->blink_time > 1000 * blink_timeout && @@ -9076,12 +9230,12 @@ blink_cb (gpointer data) { /* we've blinked enough without the user doing anything, stop blinking */ show_cursor (entry); - entry->blink_timeout = 0; + priv->blink_timeout = 0; } - else if (entry->cursor_visible) + else if (priv->cursor_visible) { hide_cursor (entry); - entry->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER, blink_cb, entry); } @@ -9089,7 +9243,7 @@ blink_cb (gpointer data) { show_cursor (entry); priv->blink_time += get_cursor_time (entry); - entry->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER, blink_cb, entry); } @@ -9101,44 +9255,43 @@ blink_cb (gpointer data) static void gtk_entry_check_cursor_blink (GtkEntry *entry) { - GtkEntryPrivate *priv; - - priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; if (cursor_blinks (entry)) { - if (!entry->blink_timeout) + if (!priv->blink_timeout) { show_cursor (entry); - entry->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER, blink_cb, entry); } } else { - if (entry->blink_timeout) - { - g_source_remove (entry->blink_timeout); - entry->blink_timeout = 0; + if (priv->blink_timeout) + { + g_source_remove (priv->blink_timeout); + priv->blink_timeout = 0; } - - entry->cursor_visible = TRUE; + + priv->cursor_visible = TRUE; } - } static void gtk_entry_pend_cursor_blink (GtkEntry *entry) { + GtkEntryPrivate *priv = entry->priv; + if (cursor_blinks (entry)) { - if (entry->blink_timeout != 0) - g_source_remove (entry->blink_timeout); - - entry->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_PEND_MULTIPLIER / CURSOR_DIVIDER, - blink_cb, - entry); + if (priv->blink_timeout != 0) + g_source_remove (priv->blink_timeout); + + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_PEND_MULTIPLIER / CURSOR_DIVIDER, + blink_cb, + entry); show_cursor (entry); } } @@ -9146,10 +9299,8 @@ gtk_entry_pend_cursor_blink (GtkEntry *entry) static void gtk_entry_reset_blink_time (GtkEntry *entry) { - GtkEntryPrivate *priv; - - priv = GTK_ENTRY_GET_PRIVATE (entry); - + GtkEntryPrivate *priv = entry->priv; + priv->blink_time = 0; } @@ -9159,7 +9310,7 @@ static gint gtk_entry_completion_timeout (gpointer data) { GtkEntryCompletion *completion = GTK_ENTRY_COMPLETION (data); - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (completion->priv->entry); + GtkEntryPrivate *completion_entry_priv = GTK_ENTRY (completion->priv->entry)->priv; completion->priv->completion_timeout = 0; @@ -9189,7 +9340,7 @@ gtk_entry_completion_timeout (gpointer data) if (gtk_widget_get_visible (completion->priv->popup_window)) _gtk_entry_completion_resize_popup (completion); else - _gtk_entry_completion_popup (completion, priv->completion_device); + _gtk_entry_completion_popup (completion, completion_entry_priv->completion_device); } else _gtk_entry_completion_popdown (completion); @@ -9428,6 +9579,8 @@ keypress_completion_out: { GtkTreeIter iter; GtkTreeModel *model = NULL; + GtkTreeModel *child_model; + GtkTreeIter child_iter; GtkTreeSelection *sel; gboolean retval = TRUE; @@ -9441,9 +9594,11 @@ keypress_completion_out: sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (completion->priv->tree_view)); if (gtk_tree_selection_get_selected (sel, &model, &iter)) { + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_iter, &iter); + child_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model)); g_signal_handler_block (widget, completion->priv->changed_id); g_signal_emit_by_name (completion, "match-selected", - model, &iter, &entry_set); + child_model, &child_iter, &entry_set); g_signal_handler_unblock (widget, completion->priv->changed_id); if (!entry_set) @@ -9491,23 +9646,24 @@ keypress_completion_out: } static void -gtk_entry_completion_changed (GtkWidget *entry, +gtk_entry_completion_changed (GtkWidget *widget, gpointer user_data) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); GtkEntryCompletion *completion = GTK_ENTRY_COMPLETION (user_data); + GtkEntry *entry = GTK_ENTRY (widget); + GtkEntryPrivate *priv = entry->priv; GdkDevice *device; /* (re)install completion timeout */ if (completion->priv->completion_timeout) g_source_remove (completion->priv->completion_timeout); - if (!gtk_entry_get_text (GTK_ENTRY (entry))) + if (!gtk_entry_get_text (entry)) return; /* no need to normalize for this test */ if (completion->priv->minimum_key_length > 0 && - strcmp ("", gtk_entry_get_text (GTK_ENTRY (entry))) == 0) + strcmp ("", gtk_entry_get_text (entry)) == 0) { if (gtk_widget_get_visible (completion->priv->popup_window)) _gtk_entry_completion_popdown (completion); @@ -9516,7 +9672,7 @@ gtk_entry_completion_changed (GtkWidget *entry, device = gtk_get_current_event_device (); - if (device && device->source == GDK_SOURCE_KEYBOARD) + if (device && gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) device = gdk_device_get_associated_device (device); if (device) @@ -9814,7 +9970,7 @@ gtk_entry_set_progress_fraction (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); widget = GTK_WIDGET (entry); - private = GTK_ENTRY_GET_PRIVATE (entry); + private = entry->priv; if (private->progress_pulse_mode) old_fraction = -1; @@ -9856,13 +10012,9 @@ gtk_entry_set_progress_fraction (GtkEntry *entry, gdouble gtk_entry_get_progress_fraction (GtkEntry *entry) { - GtkEntryPrivate *private; - g_return_val_if_fail (GTK_IS_ENTRY (entry), 0.0); - private = GTK_ENTRY_GET_PRIVATE (entry); - - return private->progress_fraction; + return entry->priv->progress_fraction; } /** @@ -9883,7 +10035,7 @@ gtk_entry_set_progress_pulse_step (GtkEntry *entry, g_return_if_fail (GTK_IS_ENTRY (entry)); - private = GTK_ENTRY_GET_PRIVATE (entry); + private = entry->priv; fraction = CLAMP (fraction, 0.0, 1.0); @@ -9910,13 +10062,9 @@ gtk_entry_set_progress_pulse_step (GtkEntry *entry, gdouble gtk_entry_get_progress_pulse_step (GtkEntry *entry) { - GtkEntryPrivate *private; - g_return_val_if_fail (GTK_IS_ENTRY (entry), 0.0); - private = GTK_ENTRY_GET_PRIVATE (entry); - - return private->progress_pulse_fraction; + return entry->priv->progress_pulse_fraction; } /** @@ -9939,7 +10087,7 @@ gtk_entry_progress_pulse (GtkEntry *entry) g_return_if_fail (GTK_IS_ENTRY (entry)); - private = GTK_ENTRY_GET_PRIVATE (entry); + private = entry->priv; if (private->progress_pulse_mode) { @@ -9981,7 +10129,7 @@ static void show_capslock_feedback (GtkEntry *entry, const gchar *text) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; if (gtk_entry_get_icon_storage_type (entry, GTK_ENTRY_ICON_SECONDARY) == GTK_IMAGE_EMPTY) { @@ -9999,7 +10147,7 @@ show_capslock_feedback (GtkEntry *entry, static void remove_capslock_feedback (GtkEntry *entry) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; if (priv->caps_lock_warning_shown) { @@ -10012,7 +10160,7 @@ static void keymap_state_changed (GdkKeymap *keymap, GtkEntry *entry) { - GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry); + GtkEntryPrivate *priv = entry->priv; char *text = NULL; if (gtk_entry_get_display_mode (entry) != DISPLAY_NORMAL && priv->caps_lock_warning) @@ -10031,3 +10179,21 @@ keymap_state_changed (GdkKeymap *keymap, else remove_capslock_feedback (entry); } + +/* + * _gtk_entry_set_is_cell_renderer: + * @entry: a #GtkEntry + * @is_cell_renderer: new value + * + * This is a helper function for GtkComboBox. A GtkEntry in a GtkComboBox + * is supposed to behave like a GtkCellEditable when placed in a combo box. + * + * I.e take up its allocation and get GtkEntry->is_cell_renderer = TRUE. + * + */ +void +_gtk_entry_set_is_cell_renderer (GtkEntry *entry, + gboolean is_cell_renderer) +{ + entry->priv->is_cell_renderer = is_cell_renderer; +}