entry: Use images for icons

This commit is contained in:
Timm Bäder
2017-06-16 11:19:52 +02:00
committed by Matthias Clasen
parent 00d720d8a4
commit 4d74129c61

View File

@@ -38,7 +38,6 @@
#include "gtkdndprivate.h"
#include "gtkentry.h"
#include "gtkentrybuffer.h"
#include "gtkiconhelperprivate.h"
#include "gtkimcontextsimple.h"
#include "gtkimmulticontext.h"
#include "gtkintl.h"
@@ -70,6 +69,7 @@
#include "gtkcssnodeprivate.h"
#include "gtkcsscustomgadgetprivate.h"
#include "gtkprogresstrackerprivate.h"
#include "gtkimageprivate.h"
#include "a11y/gtkentryaccessible.h"
@@ -278,17 +278,15 @@ struct _GtkEntryPrivate
struct _EntryIconInfo
{
GdkWindow *window;
GtkWidget *widget;
GtkWidget *image;
gchar *tooltip;
guint insensitive : 1;
guint nonactivatable : 1;
guint prelight : 1;
guint in_drag : 1;
guint pressed : 1;
GdkDragAction actions;
GtkTargetList *target_list;
GtkCssGadget *gadget;
GdkEventSequence *current_sequence;
GdkDevice *device;
};
@@ -418,10 +416,6 @@ static void gtk_entry_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot);
static gboolean gtk_entry_event (GtkWidget *widget,
GdkEvent *event);
static gint gtk_entry_enter_notify (GtkWidget *widget,
GdkEventCrossing *event);
static gint gtk_entry_leave_notify (GtkWidget *widget,
GdkEventCrossing *event);
static gint gtk_entry_key_press (GtkWidget *widget,
GdkEventKey *event);
static gint gtk_entry_key_release (GtkWidget *widget,
@@ -664,7 +658,7 @@ static void buffer_connect_signals (GtkEntry *entry);
static void buffer_disconnect_signals (GtkEntry *entry);
static GtkEntryBuffer *get_buffer (GtkEntry *entry);
static void gtk_entry_measure (GtkWidget *gadget,
static void gtk_entry_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
@@ -724,8 +718,6 @@ gtk_entry_class_init (GtkEntryClass *class)
widget_class->measure = gtk_entry_measure;
widget_class->size_allocate = gtk_entry_size_allocate;
widget_class->snapshot = gtk_entry_snapshot;
widget_class->enter_notify_event = gtk_entry_enter_notify;
widget_class->leave_notify_event = gtk_entry_leave_notify;
widget_class->event = gtk_entry_event;
widget_class->key_press_event = gtk_entry_key_press;
widget_class->key_release_event = gtk_entry_key_release;
@@ -2546,11 +2538,11 @@ get_icon_width (GtkEntry *entry,
if (!icon_info)
return 0;
gtk_css_gadget_get_preferred_size (icon_info->gadget,
GTK_ORIENTATION_HORIZONTAL,
-1,
&width, NULL,
NULL, NULL);
gtk_widget_measure (icon_info->widget,
GTK_ORIENTATION_HORIZONTAL,
-1,
&width, NULL,
NULL, NULL);
return width;
}
@@ -2669,7 +2661,7 @@ gtk_entry_finalize (GObject *object)
if (icon_info->target_list != NULL)
gtk_target_list_unref (icon_info->target_list);
g_clear_object (&icon_info->gadget);
gtk_widget_unparent (icon_info->widget);
g_slice_free (EntryIconInfo, icon_info);
}
@@ -2816,26 +2808,18 @@ update_cursors (GtkWidget *widget)
{
if ((icon_info = priv->icons[i]) != NULL)
{
if (!_gtk_icon_helper_get_is_empty (GTK_ICON_HELPER (icon_info->gadget)) &&
icon_info->window != NULL)
gdk_window_show_unraised (icon_info->window);
/* The icon windows are not children of the visible entry window,
* thus we can't just inherit the xterm cursor. Slight complication
* here is that for the entry, insensitive => arrow cursor, but for
* an icon in a sensitive entry, insensitive => xterm cursor.
*/
/* Set the cursor explicitly to the default one */
if (gtk_widget_is_sensitive (widget) &&
(icon_info->insensitive ||
(gtk_widget_get_sensitive (icon_info->widget) ||
(icon_info->nonactivatable && icon_info->target_list == NULL)))
{
cursor = gdk_cursor_new_from_name (display, "text");
gdk_window_set_cursor (icon_info->window, cursor);
cursor = gdk_cursor_new_from_name (display, "default");
gtk_widget_set_cursor (icon_info->widget, cursor);
g_clear_object (&cursor);
}
else
{
gdk_window_set_cursor (icon_info->window, NULL);
gtk_widget_set_cursor (icon_info->widget, NULL);
}
}
}
@@ -2843,24 +2827,6 @@ update_cursors (GtkWidget *widget)
set_text_cursor (widget);
}
static void
realize_icon_info (GtkWidget *widget,
GtkEntryIconPosition icon_pos)
{
GtkEntry *entry = GTK_ENTRY (widget);
GtkEntryPrivate *priv = entry->priv;
EntryIconInfo *icon_info = priv->icons[icon_pos];
g_return_if_fail (icon_info != NULL);
icon_info->window = gdk_window_new_input (gtk_widget_get_window (widget),
GDK_ALL_EVENTS_MASK,
&(GdkRectangle) { 0, 0, 1, 1});
gtk_widget_register_window (widget, icon_info->window);
gtk_widget_queue_resize (widget);
}
static void
update_icon_style (GtkWidget *widget,
GtkEntryIconPosition icon_pos)
@@ -2869,6 +2835,7 @@ update_icon_style (GtkWidget *widget,
GtkEntryPrivate *priv = entry->priv;
EntryIconInfo *icon_info = priv->icons[icon_pos];
const gchar *sides[2] = { GTK_STYLE_CLASS_LEFT, GTK_STYLE_CLASS_RIGHT };
GtkStyleContext *context;
if (icon_info == NULL)
return;
@@ -2876,31 +2843,9 @@ update_icon_style (GtkWidget *widget,
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
icon_pos = 1 - icon_pos;
gtk_css_gadget_add_class (icon_info->gadget, sides[icon_pos]);
gtk_css_gadget_remove_class (icon_info->gadget, sides[1 - icon_pos]);
}
static void
update_icon_state (GtkWidget *widget,
GtkEntryIconPosition icon_pos)
{
GtkEntry *entry = GTK_ENTRY (widget);
GtkEntryPrivate *priv = entry->priv;
EntryIconInfo *icon_info = priv->icons[icon_pos];
GtkStateFlags state;
if (icon_info == NULL)
return;
state = gtk_widget_get_state_flags (widget);
state &= ~(GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_DROP_ACTIVE);
if ((state & GTK_STATE_FLAG_INSENSITIVE) || icon_info->insensitive)
state |= GTK_STATE_FLAG_INSENSITIVE;
else if (icon_info->prelight)
state |= GTK_STATE_FLAG_PRELIGHT;
gtk_css_gadget_set_state (icon_info->gadget, state);
context = gtk_widget_get_style_context (icon_info->widget);
gtk_style_context_add_class (context, sides[icon_pos]);
gtk_style_context_remove_class (context, sides[1 - icon_pos]);
}
static void
@@ -2946,7 +2891,7 @@ update_node_ordering (GtkEntry *entry)
{
GtkCssNode *node;
node = gtk_css_gadget_get_node (icon_info->gadget);
node = gtk_widget_get_css_node (icon_info->widget);
parent = gtk_css_node_get_parent (node);
sibling = gtk_css_node_get_first_child (parent);
if (node != sibling)
@@ -2967,41 +2912,20 @@ construct_icon_info (GtkWidget *widget,
icon_info = g_slice_new0 (EntryIconInfo);
priv->icons[icon_pos] = icon_info;
icon_info->gadget = gtk_icon_helper_new_named ("image", widget);
_gtk_icon_helper_set_force_scale_pixbuf (GTK_ICON_HELPER (icon_info->gadget), TRUE);
gtk_css_node_set_parent (gtk_css_gadget_get_node (icon_info->gadget),
gtk_widget_get_css_node (widget));
icon_info->widget = gtk_image_new ();
gtk_widget_set_parent (icon_info->widget, widget);
update_icon_state (widget, icon_pos);
update_icon_style (widget, icon_pos);
update_node_ordering (entry);
if (gtk_widget_get_realized (widget))
realize_icon_info (widget, icon_pos);
return icon_info;
}
static void
gtk_entry_map (GtkWidget *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);
for (i = 0; i < MAX_ICONS; i++)
{
if ((icon_info = priv->icons[i]) != NULL)
{
if (!_gtk_icon_helper_get_is_empty (GTK_ICON_HELPER (icon_info->gadget)) &&
icon_info->window != NULL)
gdk_window_show (icon_info->window);
}
}
update_cursors (widget);
}
@@ -3010,23 +2934,11 @@ gtk_entry_unmap (GtkWidget *widget)
{
GtkEntry *entry = GTK_ENTRY (widget);
GtkEntryPrivate *priv = entry->priv;
EntryIconInfo *icon_info = NULL;
gint i;
if (priv->text_handle)
_gtk_text_handle_set_mode (priv->text_handle,
GTK_TEXT_HANDLE_MODE_NONE);
for (i = 0; i < MAX_ICONS; i++)
{
if ((icon_info = priv->icons[i]) != NULL)
{
if (!_gtk_icon_helper_get_is_empty (GTK_ICON_HELPER (icon_info->gadget)) &&
icon_info->window != NULL)
gdk_window_hide (icon_info->window);
}
}
GTK_WIDGET_CLASS (gtk_entry_parent_class)->unmap (widget);
}
@@ -3046,8 +2958,6 @@ gtk_entry_realize (GtkWidget *widget)
{
GtkEntry *entry;
GtkEntryPrivate *priv;
EntryIconInfo *icon_info;
int i;
GtkAllocation text_allocation;
GTK_WIDGET_CLASS (gtk_entry_parent_class)->realize (widget);
@@ -3061,19 +2971,6 @@ gtk_entry_realize (GtkWidget *widget)
gtk_entry_adjust_scroll (entry);
gtk_entry_update_primary_selection (entry);
/* If the icon positions are already setup, create their windows.
* Otherwise if they don't exist yet, then construct_icon_info()
* will create the windows once the widget is already realized.
*/
for (i = 0; i < MAX_ICONS; i++)
{
if ((icon_info = priv->icons[i]) != NULL)
{
if (icon_info->window == NULL)
realize_icon_info (widget, i);
}
}
}
static void
@@ -3082,8 +2979,6 @@ gtk_entry_unrealize (GtkWidget *widget)
GtkEntry *entry = GTK_ENTRY (widget);
GtkEntryPrivate *priv = entry->priv;
GtkClipboard *clipboard;
EntryIconInfo *icon_info;
gint i;
gtk_entry_reset_layout (entry);
@@ -3100,19 +2995,6 @@ gtk_entry_unrealize (GtkWidget *widget)
}
GTK_WIDGET_CLASS (gtk_entry_parent_class)->unrealize (widget);
for (i = 0; i < MAX_ICONS; i++)
{
if ((icon_info = priv->icons[i]) != NULL)
{
if (icon_info->window != NULL)
{
gtk_widget_unregister_window (widget, icon_info->window);
gdk_window_destroy (icon_info->window);
icon_info->window = NULL;
}
}
}
}
static void
@@ -3195,11 +3077,11 @@ gtk_entry_measure (GtkWidget *widget,
if (!icon_info)
continue;
gtk_css_gadget_get_preferred_size (icon_info->gadget,
GTK_ORIENTATION_VERTICAL,
-1,
NULL, &h,
NULL, NULL);
gtk_widget_measure (icon_info->widget,
GTK_ORIENTATION_VERTICAL,
-1,
NULL, &h,
NULL, NULL);
icon_height = MAX (icon_height, h);
}
@@ -3232,35 +3114,6 @@ gtk_entry_measure (GtkWidget *widget,
}
}
static void
place_windows (GtkEntry *entry)
{
GtkEntryPrivate *priv = entry->priv;
EntryIconInfo *icon_info;
icon_info = priv->icons[GTK_ENTRY_ICON_PRIMARY];
if (icon_info)
{
GtkAllocation primary;
gtk_css_gadget_get_border_allocation (icon_info->gadget, &primary, NULL);
gdk_window_move_resize (icon_info->window,
primary.x, primary.y,
primary.width, primary.height);
}
icon_info = priv->icons[GTK_ENTRY_ICON_SECONDARY];
if (icon_info)
{
GtkAllocation secondary;
gtk_css_gadget_get_border_allocation (icon_info->gadget, &secondary, NULL);
gdk_window_move_resize (icon_info->window,
secondary.x, secondary.y,
secondary.width, secondary.height);
}
}
static void
gtk_entry_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
@@ -3280,21 +3133,21 @@ gtk_entry_size_allocate (GtkWidget *widget,
{
EntryIconInfo *icon_info = priv->icons[i];
GtkAllocation icon_alloc;
gint dummy, width, height;
gint width, height;
if (!icon_info)
continue;
gtk_css_gadget_get_preferred_size (icon_info->gadget,
GTK_ORIENTATION_HORIZONTAL,
-1,
&dummy, &width,
NULL, NULL);
gtk_css_gadget_get_preferred_size (icon_info->gadget,
GTK_ORIENTATION_VERTICAL,
-1,
&dummy, &height,
NULL, NULL);
gtk_widget_measure (icon_info->widget,
GTK_ORIENTATION_HORIZONTAL,
-1,
NULL, &width,
NULL, NULL);
gtk_widget_measure (icon_info->widget,
GTK_ORIENTATION_VERTICAL,
-1,
NULL, &height,
NULL, NULL);
if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL && i == GTK_ENTRY_ICON_PRIMARY) ||
(gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR && i == GTK_ENTRY_ICON_SECONDARY))
@@ -3311,11 +3164,8 @@ gtk_entry_size_allocate (GtkWidget *widget,
icon_alloc.height = height;
priv->text_width -= width;
gtk_css_gadget_allocate (icon_info->gadget,
&icon_alloc,
gtk_widget_get_allocated_baseline (widget),
&child_clip);
gtk_widget_size_allocate (icon_info->widget, &icon_alloc);
gtk_widget_get_clip (icon_info->widget, &child_clip);
gdk_rectangle_union (&child_clip, &clip, &clip);
}
@@ -3361,7 +3211,6 @@ gtk_entry_size_allocate (GtkWidget *widget,
{
GtkEntryCompletion *completion;
place_windows (entry);
gtk_entry_recompute (entry);
completion = gtk_entry_get_completion (entry);
@@ -3372,25 +3221,6 @@ gtk_entry_size_allocate (GtkWidget *widget,
gtk_widget_set_clip (widget, &clip);
}
static gboolean
should_prelight (GtkEntry *entry,
GtkEntryIconPosition icon_pos)
{
GtkEntryPrivate *priv = entry->priv;
EntryIconInfo *icon_info = priv->icons[icon_pos];
if (!icon_info)
return FALSE;
if (icon_info->nonactivatable && icon_info->target_list == NULL)
return FALSE;
if (icon_info->pressed)
return FALSE;
return TRUE;
}
static void
gtk_entry_draw_undershoot (GtkEntry *entry,
GtkSnapshot *snapshot)
@@ -3418,11 +3248,11 @@ gtk_entry_draw_undershoot (GtkEntry *entry,
int icon_idx = rtl ? 1 : 0;
if (priv->icons[icon_idx] != NULL)
{
gtk_css_gadget_get_preferred_size (priv->icons[icon_idx]->gadget,
GTK_ORIENTATION_HORIZONTAL,
-1,
&icon_width, NULL,
NULL, NULL);
gtk_widget_measure (priv->icons[icon_idx]->widget,
GTK_ORIENTATION_HORIZONTAL,
-1,
&icon_width, NULL,
NULL, NULL);
}
gtk_style_context_save_to_node (context, priv->undershoot_node[0]);
@@ -3437,11 +3267,11 @@ gtk_entry_draw_undershoot (GtkEntry *entry,
int icon_idx = rtl ? 0 : 1;
if (priv->icons[icon_idx] != NULL)
{
gtk_css_gadget_get_preferred_size (priv->icons[icon_idx]->gadget,
GTK_ORIENTATION_HORIZONTAL,
-1,
&icon_width, NULL,
NULL, NULL);
gtk_widget_measure (priv->icons[icon_idx]->widget,
GTK_ORIENTATION_HORIZONTAL,
-1,
&icon_width, NULL,
NULL, NULL);
}
gtk_style_context_save_to_node (context, priv->undershoot_node[1]);
gtk_snapshot_render_background (snapshot, context, rect.x + rect.width - UNDERSHOOT_SIZE, rect.y, UNDERSHOOT_SIZE, rect.height);
@@ -3499,73 +3329,12 @@ gtk_entry_snapshot (GtkWidget *widget,
EntryIconInfo *icon_info = priv->icons[i];
if (icon_info != NULL)
gtk_css_gadget_snapshot (icon_info->gadget, snapshot);
gtk_widget_snapshot_child (widget, icon_info->widget, snapshot);
}
gtk_entry_draw_undershoot (entry, snapshot);
}
static gint
gtk_entry_enter_notify (GtkWidget *widget,
GdkEventCrossing *event)
{
GtkEntry *entry = GTK_ENTRY (widget);
GtkEntryPrivate *priv = entry->priv;
gint i;
for (i = 0; i < MAX_ICONS; i++)
{
EntryIconInfo *icon_info = priv->icons[i];
if (icon_info != NULL && event->window == icon_info->window)
{
if (should_prelight (entry, i))
{
icon_info->prelight = TRUE;
update_icon_state (widget, i);
gtk_widget_queue_draw (widget);
}
break;
}
}
return GDK_EVENT_PROPAGATE;
}
static gint
gtk_entry_leave_notify (GtkWidget *widget,
GdkEventCrossing *event)
{
GtkEntry *entry = GTK_ENTRY (widget);
GtkEntryPrivate *priv = entry->priv;
gint i;
for (i = 0; i < MAX_ICONS; i++)
{
EntryIconInfo *icon_info = priv->icons[i];
if (icon_info != NULL && event->window == icon_info->window)
{
/* a grab means that we may never see the button release */
if (event->mode == GDK_CROSSING_GRAB || event->mode == GDK_CROSSING_GTK_GRAB)
icon_info->pressed = FALSE;
if (should_prelight (entry, i))
{
icon_info->prelight = FALSE;
update_icon_state (widget, i);
gtk_widget_queue_draw (widget);
}
break;
}
}
return GDK_EVENT_PROPAGATE;
}
static void
gtk_entry_get_pixel_ranges (GtkEntry *entry,
gint **ranges,
@@ -3742,7 +3511,9 @@ gtk_entry_event (GtkWidget *widget,
GdkEventSequence *sequence;
GdkDevice *device;
gdouble x, y;
gint i;
gint i = 0;
gdk_event_get_coords (event, &x, &y);
if (event->type == GDK_MOTION_NOTIFY &&
priv->mouse_cursor_obscured)
@@ -3754,23 +3525,29 @@ gtk_entry_event (GtkWidget *widget,
for (i = 0; i < MAX_ICONS; i++)
{
if (priv->icons[i] &&
priv->icons[i]->window == event->any.window)
GtkAllocation icon_alloc;
if (priv->icons[i])
{
icon_info = priv->icons[i];
break;
gtk_widget_get_allocation (priv->icons[i]->widget, &icon_alloc);
if (gdk_rectangle_contains_point (&icon_alloc, (int)x, (int)y))
{
icon_info = priv->icons[i];
break;
}
}
}
if (!icon_info)
return GDK_EVENT_PROPAGATE;
if (icon_info->insensitive)
if (!gtk_widget_get_sensitive (icon_info->widget))
return GDK_EVENT_STOP;
sequence = gdk_event_get_event_sequence (event);
device = gdk_event_get_device (event);
gdk_event_get_coords (event, &x, &y);
switch (event->type)
{
@@ -3783,13 +3560,6 @@ gtk_entry_event (GtkWidget *widget,
case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS:
case GDK_3BUTTON_PRESS:
if (should_prelight (GTK_ENTRY (widget), i))
{
icon_info->prelight = FALSE;
update_icon_state (widget, i);
gtk_widget_queue_draw (widget);
}
priv->start_x = x;
priv->start_y = y;
icon_info->pressed = TRUE;
@@ -3835,16 +3605,6 @@ gtk_entry_event (GtkWidget *widget,
icon_info->pressed = FALSE;
icon_info->device = NULL;
if (should_prelight (GTK_ENTRY (widget), i) &&
x >= 0 && y >= 0 &&
x < gdk_window_get_width (icon_info->window) &&
y < gdk_window_get_height (icon_info->window))
{
icon_info->prelight = TRUE;
update_icon_state (widget, i);
gtk_widget_queue_draw (widget);
}
if (!icon_info->nonactivatable)
g_signal_emit (widget, signals[ICON_RELEASE], 0, i, event);
@@ -4545,8 +4305,6 @@ gtk_entry_state_flags_changed (GtkWidget *widget,
}
update_node_state (entry);
update_icon_state (widget, GTK_ENTRY_ICON_PRIMARY);
update_icon_state (widget, GTK_ENTRY_ICON_SECONDARY);
gtk_entry_update_cached_style_values (entry);
}
@@ -6832,26 +6590,18 @@ gtk_entry_clear (GtkEntry *entry,
{
GtkEntryPrivate *priv = entry->priv;
EntryIconInfo *icon_info = priv->icons[icon_pos];
GtkIconHelper *icon_helper;
GtkImageType storage_type;
if (icon_info == NULL)
return;
icon_helper = GTK_ICON_HELPER (icon_info->gadget);
if (_gtk_icon_helper_get_is_empty (icon_helper))
storage_type = gtk_image_get_storage_type (GTK_IMAGE (icon_info->widget));
if (storage_type == GTK_IMAGE_EMPTY)
return;
g_object_freeze_notify (G_OBJECT (entry));
/* Explicitly check, as the pointer may become invalidated
* during destruction.
*/
if (GDK_IS_WINDOW (icon_info->window))
gdk_window_hide (icon_info->window);
storage_type = _gtk_icon_helper_get_storage_type (icon_helper);
switch (storage_type)
{
case GTK_IMAGE_PIXBUF:
@@ -6880,7 +6630,7 @@ gtk_entry_clear (GtkEntry *entry,
break;
}
_gtk_icon_helper_clear (icon_helper);
gtk_image_clear (GTK_IMAGE (icon_info->widget));
g_object_notify_by_pspec (G_OBJECT (entry),
entry_props[icon_pos == GTK_ENTRY_ICON_PRIMARY
@@ -7780,9 +7530,7 @@ gtk_entry_set_icon_from_pixbuf (GtkEntry *entry,
if (pixbuf)
{
_gtk_icon_helper_set_pixbuf (GTK_ICON_HELPER (icon_info->gadget), pixbuf);
_gtk_icon_helper_set_icon_size (GTK_ICON_HELPER (icon_info->gadget),
GTK_ICON_SIZE_MENU);
gtk_image_set_from_pixbuf (GTK_IMAGE (icon_info->widget), pixbuf);
if (icon_pos == GTK_ENTRY_ICON_PRIMARY)
{
@@ -7795,9 +7543,6 @@ gtk_entry_set_icon_from_pixbuf (GtkEntry *entry,
g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_STORAGE_TYPE_SECONDARY]);
}
if (gtk_widget_get_mapped (GTK_WIDGET (entry)))
gdk_window_show_unraised (icon_info->window);
g_object_unref (pixbuf);
}
else
@@ -7846,7 +7591,7 @@ gtk_entry_set_icon_from_icon_name (GtkEntry *entry,
if (icon_name != NULL)
{
_gtk_icon_helper_set_icon_name (GTK_ICON_HELPER (icon_info->gadget), icon_name, GTK_ICON_SIZE_MENU);
gtk_image_set_from_icon_name (GTK_IMAGE (icon_info->widget), icon_name, GTK_ICON_SIZE_MENU);
if (icon_pos == GTK_ENTRY_ICON_PRIMARY)
{
@@ -7858,9 +7603,6 @@ gtk_entry_set_icon_from_icon_name (GtkEntry *entry,
g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_ICON_NAME_SECONDARY]);
g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_STORAGE_TYPE_SECONDARY]);
}
if (gtk_widget_get_mapped (GTK_WIDGET (entry)))
gdk_window_show_unraised (icon_info->window);
}
else
gtk_entry_clear (entry, icon_pos);
@@ -7906,7 +7648,7 @@ gtk_entry_set_icon_from_gicon (GtkEntry *entry,
if (icon)
{
_gtk_icon_helper_set_gicon (GTK_ICON_HELPER (icon_info->gadget), icon, GTK_ICON_SIZE_MENU);
gtk_image_set_from_gicon (GTK_IMAGE (icon_info->widget), icon, GTK_ICON_SIZE_MENU);
if (icon_pos == GTK_ENTRY_ICON_PRIMARY)
{
@@ -7918,9 +7660,6 @@ gtk_entry_set_icon_from_gicon (GtkEntry *entry,
g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_GICON_SECONDARY]);
g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_STORAGE_TYPE_SECONDARY]);
}
if (gtk_widget_get_mapped (GTK_WIDGET (entry)))
gdk_window_show_unraised (icon_info->window);
}
else
gtk_entry_clear (entry, icon_pos);
@@ -8033,7 +7772,7 @@ gtk_entry_get_icon_pixbuf (GtkEntry *entry,
if (!icon_info)
return NULL;
return _gtk_icon_helper_peek_pixbuf (GTK_ICON_HELPER (icon_info->gadget));
return gtk_image_get_pixbuf (GTK_IMAGE (icon_info->widget));
}
/**
@@ -8056,6 +7795,8 @@ gtk_entry_get_icon_gicon (GtkEntry *entry,
{
GtkEntryPrivate *priv;
EntryIconInfo *icon_info;
GIcon *icon;
GtkIconSize icon_size;
g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL);
g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), NULL);
@@ -8066,7 +7807,9 @@ gtk_entry_get_icon_gicon (GtkEntry *entry,
if (!icon_info)
return NULL;
return _gtk_icon_helper_peek_gicon (GTK_ICON_HELPER (icon_info->gadget));
gtk_image_get_gicon (GTK_IMAGE (icon_info->widget), &icon, &icon_size);
return icon;
}
/**
@@ -8089,6 +7832,8 @@ gtk_entry_get_icon_name (GtkEntry *entry,
{
GtkEntryPrivate *priv;
EntryIconInfo *icon_info;
const char *icon_name;
GtkIconSize icon_size;
g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL);
g_return_val_if_fail (IS_VALID_ICON_POSITION (icon_pos), NULL);
@@ -8099,7 +7844,9 @@ gtk_entry_get_icon_name (GtkEntry *entry,
if (!icon_info)
return NULL;
return _gtk_icon_helper_get_icon_name (GTK_ICON_HELPER (icon_info->gadget));
gtk_image_get_icon_name (GTK_IMAGE (icon_info->widget), &icon_name, &icon_size);
return icon_name;
}
/**
@@ -8129,18 +7876,15 @@ gtk_entry_set_icon_sensitive (GtkEntry *entry,
if ((icon_info = priv->icons[icon_pos]) == NULL)
icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos);
if (icon_info->insensitive != !sensitive)
if (gtk_widget_get_sensitive (icon_info->widget) != sensitive)
{
icon_info->insensitive = !sensitive;
gtk_widget_set_sensitive (icon_info->widget, sensitive);
icon_info->pressed = FALSE;
icon_info->prelight = FALSE;
if (gtk_widget_get_realized (GTK_WIDGET (entry)))
update_cursors (GTK_WIDGET (entry));
update_icon_state (GTK_WIDGET (entry), icon_pos);
g_object_notify_by_pspec (G_OBJECT (entry),
entry_props[icon_pos == GTK_ENTRY_ICON_PRIMARY
? PROP_SENSITIVE_PRIMARY
@@ -8173,8 +7917,10 @@ gtk_entry_get_icon_sensitive (GtkEntry *entry,
icon_info = priv->icons[icon_pos];
return (!icon_info || !icon_info->insensitive);
if (!icon_info)
return FALSE;
return gtk_widget_get_sensitive (icon_info->widget);
}
/**
@@ -8207,7 +7953,7 @@ gtk_entry_get_icon_storage_type (GtkEntry *entry,
if (!icon_info)
return GTK_IMAGE_EMPTY;
return _gtk_icon_helper_get_storage_type (GTK_ICON_HELPER (icon_info->gadget));
return gtk_image_get_storage_type (GTK_IMAGE (icon_info->widget));
}
/**
@@ -8246,7 +7992,7 @@ gtk_entry_get_icon_at_pos (GtkEntry *entry,
if (icon_info == NULL)
continue;
gtk_css_gadget_get_border_allocation (icon_info->gadget, &allocation, NULL);
gtk_widget_get_border_allocation (icon_info->widget, &allocation);
if (x >= allocation.x && x < allocation.x + allocation.width &&
y >= allocation.y && y < allocation.y + allocation.height)
return i;
@@ -8378,7 +8124,7 @@ gtk_entry_get_icon_area (GtkEntry *entry,
{
GtkAllocation widget_allocation;
gtk_widget_get_allocation (GTK_WIDGET (entry), &widget_allocation);
gtk_css_gadget_get_border_allocation (icon_info->gadget, icon_area, NULL);
gtk_widget_get_border_allocation (icon_info->widget, icon_area);
icon_area->x -= widget_allocation.x;
icon_area->y -= widget_allocation.y;
}
@@ -9043,7 +8789,7 @@ gtk_entry_drag_begin (GtkWidget *widget,
if (icon_info->in_drag)
{
gtk_drag_set_icon_definition (context,
gtk_icon_helper_get_definition (GTK_ICON_HELPER (icon_info->gadget)),
gtk_image_get_definition (GTK_IMAGE (icon_info->widget)),
-2, -2);
return;
}