forked from AuroraMiddleware/gtk
GtkEntry: Use GtkStyleContext.
This commit is contained in:
parent
618b1a8b33
commit
8b8eab1c81
206
gtk/gtkentry.c
206
gtk/gtkentry.c
@ -353,8 +353,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);
|
||||
@ -377,8 +379,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,
|
||||
@ -386,8 +387,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);
|
||||
|
||||
@ -681,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;
|
||||
|
||||
@ -2309,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);
|
||||
|
||||
@ -2347,6 +2347,7 @@ find_invisible_char (GtkWidget *widget)
|
||||
static void
|
||||
gtk_entry_init (GtkEntry *entry)
|
||||
{
|
||||
GtkStyleContext *context;
|
||||
GtkEntryPrivate *priv;
|
||||
|
||||
entry->priv = G_TYPE_INSTANCE_GET_PRIVATE (entry,
|
||||
@ -2393,6 +2394,8 @@ gtk_entry_init (GtkEntry *entry)
|
||||
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
|
||||
@ -2934,14 +2937,17 @@ _gtk_entry_get_borders (GtkEntry *entry,
|
||||
{
|
||||
GtkEntryPrivate *priv = entry->priv;
|
||||
GtkWidget *widget = GTK_WIDGET (entry);
|
||||
GtkStyle *style;
|
||||
|
||||
if (priv->has_frame)
|
||||
{
|
||||
style = gtk_widget_get_style (widget);
|
||||
GtkStyleContext *context;
|
||||
GtkBorder padding;
|
||||
|
||||
*xborder = style->xthickness;
|
||||
*yborder = style->ythickness;
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
gtk_style_context_get_padding (context, 0, &padding);
|
||||
|
||||
*xborder = padding.left;
|
||||
*yborder = padding.top;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2967,14 +2973,20 @@ gtk_entry_get_preferred_width (GtkWidget *widget,
|
||||
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);
|
||||
@ -3017,13 +3029,19 @@ gtk_entry_get_preferred_height (GtkWidget *widget,
|
||||
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));
|
||||
|
||||
priv->ascent = pango_font_metrics_get_ascent (metrics);
|
||||
@ -3375,15 +3393,14 @@ 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)
|
||||
{
|
||||
GtkEntry *entry = GTK_ENTRY (widget);
|
||||
GtkEntryPrivate *priv = entry->priv;
|
||||
GtkStyle *style;
|
||||
GdkWindow *window;
|
||||
gint x = 0, y = 0, width, height;
|
||||
GtkStateType state;
|
||||
GtkAllocation allocation;
|
||||
gint frame_x, frame_y;
|
||||
|
||||
@ -3418,20 +3435,14 @@ gtk_entry_draw_frame (GtkWidget *widget,
|
||||
height -= 2 * priv->focus_width;
|
||||
}
|
||||
|
||||
style = gtk_widget_get_style (widget);
|
||||
state = gtk_widget_get_state (widget);
|
||||
|
||||
gtk_paint_flat_box (style, cr,
|
||||
state, GTK_SHADOW_NONE,
|
||||
widget, "entry_bg",
|
||||
x, y, width, height);
|
||||
gtk_render_background (context, cr,
|
||||
x, y, width, height);
|
||||
|
||||
if (priv->has_frame)
|
||||
gtk_paint_shadow (style, cr,
|
||||
state, priv->shadow_type,
|
||||
widget, "entry", x, y, width, height);
|
||||
gtk_render_frame (context, cr,
|
||||
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)
|
||||
{
|
||||
@ -3440,10 +3451,8 @@ 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);
|
||||
@ -3514,26 +3523,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
|
||||
@ -3541,20 +3548,21 @@ gtk_entry_draw (GtkWidget *widget,
|
||||
cairo_t *cr)
|
||||
{
|
||||
GtkEntry *entry = GTK_ENTRY (widget);
|
||||
GtkStyle *style;
|
||||
GtkStateType state;
|
||||
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);
|
||||
if (gtk_widget_has_focus (widget))
|
||||
state |= GTK_STATE_FLAG_FOCUSED;
|
||||
|
||||
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);
|
||||
@ -4309,8 +4317,8 @@ 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;
|
||||
@ -4508,8 +4516,7 @@ 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 = entry->priv;
|
||||
@ -5596,7 +5603,9 @@ get_layout_position (GtkEntry *entry,
|
||||
}
|
||||
|
||||
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);
|
||||
@ -5611,7 +5620,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))
|
||||
@ -5619,25 +5628,22 @@ 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);
|
||||
|
||||
@ -5650,11 +5656,11 @@ draw_text_with_color (GtkEntry *entry, cairo_t *cr, GdkColor *default_color)
|
||||
|
||||
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);
|
||||
@ -5668,9 +5674,9 @@ gtk_entry_draw_text (GtkEntry *entry,
|
||||
{
|
||||
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;
|
||||
@ -5679,13 +5685,17 @@ 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,
|
||||
@ -5698,7 +5708,7 @@ gtk_entry_draw_text (GtkEntry *entry,
|
||||
|
||||
/* 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);
|
||||
@ -5869,10 +5879,18 @@ gtk_entry_draw_cursor (GtkEntry *entry,
|
||||
|
||||
if (!block_at_line_end)
|
||||
{
|
||||
GtkStyleContext *context;
|
||||
GtkStateFlags state;
|
||||
GdkRGBA color;
|
||||
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
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);
|
||||
}
|
||||
|
||||
@ -8971,15 +8989,17 @@ gtk_entry_drag_motion (GtkWidget *widget,
|
||||
{
|
||||
GtkEntry *entry = GTK_ENTRY (widget);
|
||||
GtkEntryPrivate *priv = entry->priv;
|
||||
GtkStyle *style;
|
||||
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 = priv->dnd_position;
|
||||
new_position = gtk_entry_find_position (entry, x + priv->scroll_offset);
|
||||
@ -9039,14 +9059,16 @@ gtk_entry_drag_data_received (GtkWidget *widget,
|
||||
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 && priv->editable)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user