diff options
Diffstat (limited to 'gtk')
58 files changed, 477 insertions, 181 deletions
diff --git a/gtk/gtkapplication-dbus.c b/gtk/gtkapplication-dbus.c index 3345a79573..b73d86046c 100644 --- a/gtk/gtkapplication-dbus.c +++ b/gtk/gtkapplication-dbus.c @@ -26,6 +26,8 @@ #include "gtksettings.h" #include "gtkprivate.h" +#include "gdk/gdkconstructor.h" + G_DEFINE_TYPE (GtkApplicationImplDBus, gtk_application_impl_dbus, GTK_TYPE_APPLICATION_IMPL) #define DBUS_BUS_NAME "org.freedesktop.DBus" diff --git a/gtk/gtkassistant.c b/gtk/gtkassistant.c index 8d3d67cd1d..1306bb4bd2 100644 --- a/gtk/gtkassistant.c +++ b/gtk/gtkassistant.c @@ -74,14 +74,15 @@ #include "gtkintl.h" #include "gtkimage.h" #include "gtklabel.h" -#include "gtkstack.h" +#include "gtklistlistmodelprivate.h" +#include "gtkmaplistmodel.h" #include "gtkprivate.h" #include "gtksettings.h" #include "gtksizegroup.h" #include "gtksizerequest.h" +#include "gtkstack.h" +#include "gtkstylecontext.h" #include "gtktypebuiltins.h" -#include "gtklistlistmodelprivate.h" -#include "gtkmaplistmodel.h" #include "a11y/gtkwindowaccessible.h" diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c index 6b2346cdba..8414bec0e3 100644 --- a/gtk/gtkbutton.c +++ b/gtk/gtkbutton.c @@ -66,6 +66,7 @@ #include "gtkmain.h" #include "gtkmarshalers.h" #include "gtkprivate.h" +#include "gtkstylecontext.h" #include "gtktypebuiltins.h" #include "a11y/gtkbuttonaccessible.h" diff --git a/gtk/gtkcellarea.c b/gtk/gtkcellarea.c index 3fc37a3dac..eb4db09263 100644 --- a/gtk/gtkcellarea.c +++ b/gtk/gtkcellarea.c @@ -352,6 +352,7 @@ #include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtksnapshot.h" +#include "gtkstylecontext.h" #include <gobject/gvaluecollector.h> diff --git a/gtk/gtkcellrenderer.c b/gtk/gtkcellrenderer.c index 7c176b020c..72780c77c9 100644 --- a/gtk/gtkcellrenderer.c +++ b/gtk/gtkcellrenderer.c @@ -23,6 +23,7 @@ #include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtksnapshot.h" +#include "gtkstylecontext.h" #include "gtktreeprivate.h" #include "gtktypebuiltins.h" diff --git a/gtk/gtkcellrendererprogress.c b/gtk/gtkcellrendererprogress.c index 43f4b138b6..1bacf77757 100644 --- a/gtk/gtkcellrendererprogress.c +++ b/gtk/gtkcellrendererprogress.c @@ -31,6 +31,7 @@ #include "gtkorientable.h" #include "gtkprivate.h" #include "gtksnapshot.h" +#include "gtkstylecontext.h" /** diff --git a/gtk/gtkcellrenderertext.c b/gtk/gtkcellrenderertext.c index ddacdc4e3c..9e6f238aa5 100644 --- a/gtk/gtkcellrenderertext.c +++ b/gtk/gtkcellrenderertext.c @@ -26,6 +26,7 @@ #include "gtkprivate.h" #include "gtksizerequest.h" #include "gtksnapshot.h" +#include "gtkstylecontext.h" #include "gtktreeprivate.h" #include "a11y/gtktextcellaccessible.h" diff --git a/gtk/gtkcolorbutton.c b/gtk/gtkcolorbutton.c index 0c8abded61..7e10a78abc 100644 --- a/gtk/gtkcolorbutton.c +++ b/gtk/gtkcolorbutton.c @@ -43,6 +43,7 @@ #include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtksnapshot.h" +#include "gtkstylecontext.h" /** diff --git a/gtk/gtkcolorchooserwidget.c b/gtk/gtkcolorchooserwidget.c index 9f2d286017..8ba5df0d17 100644 --- a/gtk/gtkcolorchooserwidget.c +++ b/gtk/gtkcolorchooserwidget.c @@ -29,6 +29,7 @@ #include "gtkprivate.h" #include "gtkintl.h" #include "gtksizegroup.h" +#include "gtkstylecontext.h" #include <math.h> diff --git a/gtk/gtkcssboxesprivate.h b/gtk/gtkcssboxesprivate.h index d90ba1e598..24a38ff0de 100644 --- a/gtk/gtkcssboxesprivate.h +++ b/gtk/gtkcssboxesprivate.h @@ -19,6 +19,7 @@ #define __GTK_CSS_BOXES_PRIVATE_H__ #include "gtkcsstypesprivate.h" +#include "gtktypes.h" G_BEGIN_DECLS diff --git a/gtk/gtkcssimageprivate.h b/gtk/gtkcssimageprivate.h index 7bdfc23823..f39d73ae8d 100644 --- a/gtk/gtkcssimageprivate.h +++ b/gtk/gtkcssimageprivate.h @@ -26,6 +26,7 @@ #include "gtk/gtkcssparserprivate.h" #include "gtk/gtkcsstypesprivate.h" #include "gtk/gtksnapshot.h" +#include "gtk/gtkstyleprovider.h" G_BEGIN_DECLS diff --git a/gtk/gtkcssnodeprivate.h b/gtk/gtkcssnodeprivate.h index 7335fb30da..20ef434e7e 100644 --- a/gtk/gtkcssnodeprivate.h +++ b/gtk/gtkcssnodeprivate.h @@ -23,6 +23,7 @@ #include "gtkcssstylechangeprivate.h" #include "gtkbitmaskprivate.h" #include "gtkcsstypesprivate.h" +#include "gtkstylecontext.h" G_BEGIN_DECLS diff --git a/gtk/gtkcssparserprivate.h b/gtk/gtkcssparserprivate.h index 3fb30f9136..8dd99ff9c5 100644 --- a/gtk/gtkcssparserprivate.h +++ b/gtk/gtkcssparserprivate.h @@ -18,7 +18,6 @@ #ifndef __GTK_CSS_PARSER_PRIVATE_H__ #define __GTK_CSS_PARSER_PRIVATE_H__ -#include "gtk/gtkcsstypesprivate.h" #include <gtk/gtkcssprovider.h> G_BEGIN_DECLS diff --git a/gtk/gtkcssshadowsvalueprivate.h b/gtk/gtkcssshadowsvalueprivate.h index e79a131a1f..fe1cc65816 100644 --- a/gtk/gtkcssshadowsvalueprivate.h +++ b/gtk/gtkcssshadowsvalueprivate.h @@ -23,6 +23,7 @@ #include <cairo.h> #include <pango/pango.h> +#include "gtkborder.h" #include "gtktypes.h" #include "gtkcssparserprivate.h" #include "gtkcssvalueprivate.h" diff --git a/gtk/gtkcssshadowvalueprivate.h b/gtk/gtkcssshadowvalueprivate.h index 4633c8abed..78d6eacc97 100644 --- a/gtk/gtkcssshadowvalueprivate.h +++ b/gtk/gtkcssshadowvalueprivate.h @@ -23,6 +23,7 @@ #include <cairo.h> #include <pango/pango.h> +#include "gtkborder.h" #include "gtktypes.h" #include "gtkcssparserprivate.h" #include "gtkcssvalueprivate.h" diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h index 0c9ae190d2..ece3703208 100644 --- a/gtk/gtkcsstypesprivate.h +++ b/gtk/gtkcsstypesprivate.h @@ -20,7 +20,6 @@ #include <glib-object.h> #include <gsk/gsk.h> -#include <gtk/gtkstylecontext.h> G_BEGIN_DECLS diff --git a/gtk/gtkcssvalueprivate.h b/gtk/gtkcssvalueprivate.h index 53ba739bce..7aba6b023c 100644 --- a/gtk/gtkcssvalueprivate.h +++ b/gtk/gtkcssvalueprivate.h @@ -21,7 +21,9 @@ #define __GTK_CSS_VALUE_PRIVATE_H__ #include <glib-object.h> + #include "gtkcsstypesprivate.h" +#include "gtkstyleprovider.h" G_BEGIN_DECLS diff --git a/gtk/gtkdialog.c b/gtk/gtkdialog.c index db6cbac56e..11b4d7be9b 100644 --- a/gtk/gtkdialog.c +++ b/gtk/gtkdialog.c @@ -44,6 +44,7 @@ #include "gtksettings.h" #include "gtktypebuiltins.h" #include "gtksizegroup.h" +#include "gtkstylecontext.h" /** * SECTION:gtkdialog diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index 0313566573..46aeba742a 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -33,6 +33,7 @@ #include "gtkpicture.h" #include "gtkselectionprivate.h" #include "gtksettingsprivate.h" +#include "gtkstylecontext.h" #include "gtktooltipprivate.h" #include "gtkwidgetprivate.h" #include "gtkwindowgroup.h" diff --git a/gtk/gtkeditable.c b/gtk/gtkeditable.c index f710d51cc0..9569c4bc20 100644 --- a/gtk/gtkeditable.c +++ b/gtk/gtkeditable.c @@ -935,7 +935,10 @@ gtk_editable_delegate_set_property (GObject *object, GType type = G_TYPE_FROM_INSTANCE (object); guint first_prop; - first_prop = GPOINTER_TO_UINT (g_type_get_qdata (type, quark_editable_data)); + do { + first_prop = GPOINTER_TO_UINT (g_type_get_qdata (type, quark_editable_data)); + type = g_type_parent (type); + } while (first_prop == 0 && type != 0); if (prop_id < first_prop) return FALSE; @@ -994,7 +997,10 @@ gtk_editable_delegate_get_property (GObject *object, GType type = G_TYPE_FROM_INSTANCE (object); guint first_prop; - first_prop = GPOINTER_TO_UINT (g_type_get_qdata (type, quark_editable_data)); + do { + first_prop = GPOINTER_TO_UINT (g_type_get_qdata (type, quark_editable_data)); + type = g_type_parent (type); + } while (first_prop == 0 && type != 0); if (prop_id < first_prop) return FALSE; diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c index d59ca4f5cc..26fdfb3584 100644 --- a/gtk/gtkemojichooser.c +++ b/gtk/gtkemojichooser.c @@ -34,6 +34,7 @@ #include "gtkintl.h" #include "gtkprivate.h" #include "gtksearchentryprivate.h" +#include "gtkstylecontext.h" #include "gtktext.h" #define BOX_SPACE 6 diff --git a/gtk/gtkemojicompletion.c b/gtk/gtkemojicompletion.c index 3c8796f920..e432128ee7 100644 --- a/gtk/gtkemojicompletion.c +++ b/gtk/gtkemojicompletion.c @@ -32,6 +32,7 @@ #include "gtkeventcontrollerkey.h" #include "gtkflowbox.h" #include "gtkstack.h" +#include "gtkstylecontext.h" struct _GtkEmojiCompletion { diff --git a/gtk/gtkeventcontrollermotion.c b/gtk/gtkeventcontrollermotion.c index f1d0d33a77..38fd81c37f 100644 --- a/gtk/gtkeventcontrollermotion.c +++ b/gtk/gtkeventcontrollermotion.c @@ -29,7 +29,8 @@ #include "config.h" #include "gtkintl.h" -#include "gtkwidget.h" +#include "gtkprivate.h" +#include "gtkwidgetprivate.h" #include "gtkeventcontrollerprivate.h" #include "gtkeventcontrollermotion.h" #include "gtktypebuiltins.h" @@ -38,6 +39,11 @@ struct _GtkEventControllerMotion { GtkEventController parent_instance; + + const GdkEvent *current_event; + + guint is_pointer_focus : 1; + guint contains_pointer_focus : 1; }; struct _GtkEventControllerMotionClass @@ -52,14 +58,67 @@ enum { N_SIGNALS }; +enum { + PROP_IS_POINTER_FOCUS = 1, + PROP_CONTAINS_POINTER_FOCUS, + NUM_PROPERTIES +}; + +static GParamSpec *props[NUM_PROPERTIES] = { NULL, }; + static guint signals[N_SIGNALS] = { 0 }; G_DEFINE_TYPE (GtkEventControllerMotion, gtk_event_controller_motion, GTK_TYPE_EVENT_CONTROLLER) +static void +update_pointer_focus (GtkEventControllerMotion *motion, + gboolean enter, + GdkNotifyType detail) +{ + gboolean is_pointer; + gboolean contains_pointer; + + switch (detail) + { + case GDK_NOTIFY_VIRTUAL: + case GDK_NOTIFY_NONLINEAR_VIRTUAL: + is_pointer = FALSE; + contains_pointer = enter; + break; + case GDK_NOTIFY_ANCESTOR: + case GDK_NOTIFY_NONLINEAR: + is_pointer = enter; + contains_pointer = FALSE; + break; + case GDK_NOTIFY_INFERIOR: + is_pointer = enter; + contains_pointer = !enter; + break; + case GDK_NOTIFY_UNKNOWN: + default: + g_warning ("Unknown crossing detail"); + return; + } + + g_object_freeze_notify (G_OBJECT (motion)); + if (motion->is_pointer_focus != is_pointer) + { + motion->is_pointer_focus = is_pointer; + g_object_notify (G_OBJECT (motion), "is-pointer-focus"); + } + if (motion->contains_pointer_focus != contains_pointer) + { + motion->contains_pointer_focus = contains_pointer; + g_object_notify (G_OBJECT (motion), "contains-pointer-focus"); + } + g_object_thaw_notify (G_OBJECT (motion)); +} + static gboolean gtk_event_controller_motion_handle_event (GtkEventController *controller, const GdkEvent *event) { + GtkEventControllerMotion *motion = GTK_EVENT_CONTROLLER_MOTION (controller); GtkEventControllerClass *parent_class; GdkEventType type; @@ -67,17 +126,43 @@ gtk_event_controller_motion_handle_event (GtkEventController *controller, if (type == GDK_ENTER_NOTIFY) { double x, y; + GdkCrossingMode mode; + GdkNotifyType detail; + gdk_event_get_coords (event, &x, &y); - g_signal_emit (controller, signals[ENTER], 0, x, y); + gdk_event_get_crossing_mode (event, &mode); + gdk_event_get_crossing_detail (event, &detail); + + update_pointer_focus (motion, TRUE, detail); + + motion->current_event = event; + + g_signal_emit (controller, signals[ENTER], 0, x, y, mode, detail); + + motion->current_event = NULL; } else if (type == GDK_LEAVE_NOTIFY) { - g_signal_emit (controller, signals[LEAVE], 0); + GdkCrossingMode mode; + GdkNotifyType detail; + + gdk_event_get_crossing_mode (event, &mode); + gdk_event_get_crossing_detail (event, &detail); + + update_pointer_focus (motion, FALSE, detail); + + motion->current_event = event; + + g_signal_emit (controller, signals[LEAVE], 0, mode, detail); + + motion->current_event = NULL; } else if (type == GDK_MOTION_NOTIFY) { double x, y; + gdk_event_get_coords (event, &x, &y); + g_signal_emit (controller, signals[MOTION], 0, x, y); } @@ -87,13 +172,76 @@ gtk_event_controller_motion_handle_event (GtkEventController *controller, } static void +gtk_event_controller_motion_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GtkEventControllerMotion *controller = GTK_EVENT_CONTROLLER_MOTION (object); + + switch (prop_id) + { + case PROP_IS_POINTER_FOCUS: + g_value_set_boolean (value, controller->is_pointer_focus); + break; + + case PROP_CONTAINS_POINTER_FOCUS: + g_value_set_boolean (value, controller->contains_pointer_focus); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void gtk_event_controller_motion_class_init (GtkEventControllerMotionClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkEventControllerClass *controller_class = GTK_EVENT_CONTROLLER_CLASS (klass); + object_class->get_property = gtk_event_controller_motion_get_property; + controller_class->handle_event = gtk_event_controller_motion_handle_event; /** + * GtkEventControllerMotion:is-pointer-focus: + * + * Whether the pointer is in the controllers widget itself, + * as opposed to in a descendent widget. See + * #GtkEventControllerMotion:contains-pointer-focus. + * + * When handling crossing events, this property is updated + * before #GtkEventControllerMotion::enter or + * #GtkEventControllerMotion::leave are emitted. + */ + props[PROP_IS_POINTER_FOCUS] = + g_param_spec_boolean ("is-pointer-focus", + P_("Is Pointer Focus"), + P_("Whether the pointer is in the controllers widget"), + FALSE, + G_PARAM_READABLE); + + /** + * GtkEventControllerMotion:contains-pointer-focus: + * + * Whether the pointer is in a descendant of the controllers widget. + * See #GtkEventControllerMotion:is-pointer-focus. + * + * When handling crossing events, this property is updated + * before #GtkEventControllerMotion::enter or + * #GtkEventControllerMotion::leave are emitted. + */ + props[PROP_CONTAINS_POINTER_FOCUS] = + g_param_spec_boolean ("contains-pointer-focus", + P_("Contains Pointer Focus"), + P_("Whether the pointer is in a descendant of the controllers widget"), + FALSE, + G_PARAM_READABLE); + + g_object_class_install_properties (object_class, NUM_PROPERTIES, props); + + /** * GtkEventControllerMotion::enter: * @controller: The object that received the signal * @x: the x coordinate @@ -107,7 +255,12 @@ gtk_event_controller_motion_class_init (GtkEventControllerMotionClass *klass) G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, - G_TYPE_NONE, 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE); + G_TYPE_NONE, + 4, + G_TYPE_DOUBLE, + G_TYPE_DOUBLE, + GDK_TYPE_CROSSING_MODE, + GDK_TYPE_NOTIFY_TYPE); /** * GtkEventControllerMotion::leave: @@ -121,7 +274,10 @@ gtk_event_controller_motion_class_init (GtkEventControllerMotionClass *klass) G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, - G_TYPE_NONE, 0); + G_TYPE_NONE, + 2, + GDK_TYPE_CROSSING_MODE, + GDK_TYPE_NOTIFY_TYPE); /** * GtkEventControllerMotion::motion: @@ -158,3 +314,56 @@ gtk_event_controller_motion_new (void) return g_object_new (GTK_TYPE_EVENT_CONTROLLER_MOTION, NULL); } + +/** + * gtk_event_controller_motion_get_pointer_origin: + * @controller: a #GtkEventControllerMotion + * + * Returns the widget that contained the pointer before. + * + * This function can only be used in handlers for the + * #GtkEventControllerMotion::enter and + * #GtkEventControllerMotion::leave signals. + * + * Returns: (transfer none): the previous pointer focus + */ +GtkWidget * +gtk_event_controller_motion_get_pointer_origin (GtkEventControllerMotion *controller) +{ + GtkWidget *origin; + + g_return_val_if_fail (GTK_IS_EVENT_CONTROLLER_MOTION (controller), NULL); + g_return_val_if_fail (controller->current_event != NULL, NULL); + + if (gdk_event_get_event_type (controller->current_event) == GDK_ENTER_NOTIFY) + origin = (GtkWidget *)gdk_event_get_related_target (controller->current_event); + else + origin = (GtkWidget *)gdk_event_get_target (controller->current_event); + + return origin; +} + +/** + * gtk_event_controller_motion_get_pointer_target: + * @controller: a #GtkEventControllerMotion + * + * Returns the widget that will contain the pointer afterwards. + * + * This function can only be used in handlers for the + * #GtkEventControllerMotion::enter and + * #GtkEventControllerMotion::leave signals. + * + * Returns: (transfer none): the next pointer focus + */ +GtkWidget * +gtk_event_controller_motion_get_pointer_target (GtkEventControllerMotion *controller) +{ + g_return_val_if_fail (GTK_IS_EVENT_CONTROLLER_MOTION (controller), NULL); + g_return_val_if_fail (controller->current_event != NULL, NULL); + + if (gdk_event_get_event_type (controller->current_event) == GDK_ENTER_NOTIFY) + return (GtkWidget *)gdk_event_get_target (controller->current_event); + else + return (GtkWidget *)gdk_event_get_related_target (controller->current_event); +} + diff --git a/gtk/gtkeventcontrollermotion.h b/gtk/gtkeventcontrollermotion.h index 9377a7ba12..05d1852986 100644 --- a/gtk/gtkeventcontrollermotion.h +++ b/gtk/gtkeventcontrollermotion.h @@ -45,6 +45,11 @@ GType gtk_event_controller_motion_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GtkEventController *gtk_event_controller_motion_new (void); +GDK_AVAILABLE_IN_ALL +GtkWidget * gtk_event_controller_motion_get_pointer_origin (GtkEventControllerMotion *controller); +GDK_AVAILABLE_IN_ALL +GtkWidget * gtk_event_controller_motion_get_pointer_target (GtkEventControllerMotion *controller); + G_END_DECLS #endif /* __GTK_EVENT_CONTROLLER_MOTION_H__ */ diff --git a/gtk/gtkfontbutton.c b/gtk/gtkfontbutton.c index 3d87ffb103..6e12768c2f 100644 --- a/gtk/gtkfontbutton.c +++ b/gtk/gtkfontbutton.c @@ -29,21 +29,20 @@ #include "gtkfontbutton.h" -#include "gtkmain.h" #include "gtkbox.h" -#include "gtklabel.h" +#include "gtkcssprovider.h" #include "gtkfontchooser.h" #include "gtkfontchooserdialog.h" -#include "gtkimage.h" +#include "gtkfontchooserutils.h" +#include "gtkintl.h" +#include "gtklabel.h" #include "gtkmarshalers.h" -#include "gtkseparator.h" #include "gtkprivate.h" -#include "gtkintl.h" -#include "gtkcssprovider.h" +#include "gtkseparator.h" +#include "gtkstylecontext.h" #include <string.h> #include <stdio.h> -#include "gtkfontchooserutils.h" /** diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c index cf97d48ba2..06d1240fb4 100644 --- a/gtk/gtkiconview.c +++ b/gtk/gtkiconview.c @@ -164,6 +164,8 @@ static void gtk_icon_view_motion (GtkEventControl double y, gpointer user_data); static void gtk_icon_view_leave (GtkEventController *controller, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer user_data); static void gtk_icon_view_button_press (GtkGestureMultiPress *gesture, int n_press, @@ -1875,6 +1877,8 @@ gtk_icon_view_motion (GtkEventController *controller, static void gtk_icon_view_leave (GtkEventController *controller, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer user_data) { GtkIconView *icon_view; diff --git a/gtk/gtkinfobar.c b/gtk/gtkinfobar.c index 2631fbc624..a396264e89 100644 --- a/gtk/gtkinfobar.c +++ b/gtk/gtkinfobar.c @@ -45,6 +45,7 @@ #include "gtkintl.h" #include "gtkprivate.h" #include "gtkorientable.h" +#include "gtkstylecontext.h" #include "gtktypebuiltins.h" #include "gtkwidgetprivate.h" diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index e3be68e02e..859fa5059a 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -425,6 +425,8 @@ static void gtk_label_motion (GtkEventControllerMotion *controller, double y, gpointer data); static void gtk_label_leave (GtkEventControllerMotion *controller, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer data); static void gtk_label_grab_focus (GtkWidget *widget); @@ -4870,6 +4872,8 @@ gtk_label_motion (GtkEventControllerMotion *controller, static void gtk_label_leave (GtkEventControllerMotion *controller, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer data) { GtkLabel *label = GTK_LABEL (data); diff --git a/gtk/gtklinkbutton.c b/gtk/gtklinkbutton.c index ee5468aa55..50f4dfb6da 100644 --- a/gtk/gtklinkbutton.c +++ b/gtk/gtklinkbutton.c @@ -65,6 +65,7 @@ #include "gtkprivate.h" #include "gtkshow.h" #include "gtksizerequest.h" +#include "gtkstylecontext.h" #include "gtktooltip.h" #include "gtkwidgetprivate.h" diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index b435c489a3..250a2063c7 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1418,6 +1418,7 @@ synth_crossing (GtkWidget *widget, if (gdk_event_get_event_type (source) == GDK_FOCUS_CHANGE) { +g_print ("focus %s: %s\n", enter ? "in" : "out", G_OBJECT_TYPE_NAME (widget)); event = gdk_event_new (GDK_FOCUS_CHANGE); event->focus_change.in = enter; event->focus_change.mode = crossing_mode; @@ -1521,7 +1522,7 @@ gtk_synthesize_crossing_events (GtkRoot *toplevel, if (widget != ancestor || widget == old_target) synth_crossing (widget, GTK_WIDGET (toplevel), FALSE, old_target, new_target, event, notify_type, mode); - if (widget == ancestor) + if (widget == ancestor || widget == GTK_WIDGET (toplevel)) break; widget = gtk_widget_get_parent (widget); } @@ -1536,7 +1537,7 @@ gtk_synthesize_crossing_events (GtkRoot *toplevel, while (widget) { widgets = g_slist_prepend (widgets, widget); - if (widget == ancestor) + if (widget == ancestor || widget == GTK_WIDGET (toplevel)) break; widget = gtk_widget_get_parent (widget); } diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index 247dd4f12e..ad0209367f 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -215,8 +215,12 @@ static void gtk_menu_motion (GtkEventController *controller, static void gtk_menu_enter (GtkEventController *controller, double x, double y, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer user_data); static void gtk_menu_leave (GtkEventController *controller, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer user_data); static gboolean gtk_menu_key_pressed (GtkEventControllerKey *controller, guint keyval, @@ -3165,6 +3169,8 @@ static void gtk_menu_enter (GtkEventController *controller, double x, double y, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer user_data) { GdkDevice *source_device; @@ -3191,6 +3197,8 @@ gtk_menu_enter (GtkEventController *controller, static void gtk_menu_leave (GtkEventController *controller, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer user_data) { GtkMenu *menu; diff --git a/gtk/gtkmenubutton.c b/gtk/gtkmenubutton.c index 68eaa1c50b..60b5a2b034 100644 --- a/gtk/gtkmenubutton.c +++ b/gtk/gtkmenubutton.c @@ -110,18 +110,19 @@ #include "config.h" -#include "gtkmenubutton.h" -#include "gtkmenubuttonprivate.h" -#include "gtktypebuiltins.h" -#include "gtkimage.h" +#include "gtkaccessible.h" #include "gtkactionable.h" +#include "gtkimage.h" +#include "gtkintl.h" #include "gtkmain.h" -#include "gtkaccessible.h" +#include "gtkmenubutton.h" +#include "gtkmenubuttonprivate.h" #include "gtkpopover.h" -#include "a11y/gtkmenubuttonaccessible.h" - #include "gtkprivate.h" -#include "gtkintl.h" +#include "gtkstylecontext.h" +#include "gtktypebuiltins.h" + +#include "a11y/gtkmenubuttonaccessible.h" struct _GtkMenuButtonPrivate { diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c index f516c38d6d..e7213ebe58 100644 --- a/gtk/gtkmenuitem.c +++ b/gtk/gtkmenuitem.c @@ -141,8 +141,12 @@ static void gtk_menu_item_destroy (GtkWidget *widget); static void gtk_menu_item_enter (GtkEventController *controller, double x, double y, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer user_data); static void gtk_menu_item_leave (GtkEventController *controller, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer user_data); static void gtk_menu_item_parent_cb (GObject *object, GParamSpec *pspec, @@ -1117,22 +1121,20 @@ static void gtk_menu_item_enter (GtkEventController *controller, double x, double y, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer user_data) { GtkMenuItem *menu_item = GTK_MENU_ITEM (user_data); GtkWidget *menu_shell; - GdkCrossingMode mode; GdkEvent *event; event = gtk_get_current_event (); /* FIXME controller event */ - if (gdk_event_get_crossing_mode ((GdkEvent *)event, &mode)) - { - if (mode == GDK_CROSSING_GTK_GRAB || - mode == GDK_CROSSING_GTK_UNGRAB || - mode == GDK_CROSSING_STATE_CHANGED) - return; - } + if (mode == GDK_CROSSING_GTK_GRAB || + mode == GDK_CROSSING_GTK_UNGRAB || + mode == GDK_CROSSING_STATE_CHANGED) + return; if (gdk_event_get_device ((GdkEvent*) event) == gdk_event_get_source_device ((GdkEvent*) event)) @@ -1147,6 +1149,8 @@ gtk_menu_item_enter (GtkEventController *controller, static void gtk_menu_item_leave (GtkEventController *controller, + GdkCrossingMode mode, + GdkNotifyType detail, gpointer user_data) { GtkMenuItem *menu_item = GTK_MENU_ITEM (user_data); diff --git a/gtk/gtkmessagedialog.c b/gtk/gtkmessagedialog.c index e98a0ffb99..153616831f 100644 --- a/gtk/gtkmessagedialog.c +++ b/gtk/gtkmessagedialog.c @@ -25,18 +25,20 @@ #include "config.h" -#include <string.h> - #include "gtkmessagedialog.h" -#include "gtkdialogprivate.h" + #include "gtkaccessible.h" -#include "gtkbuildable.h" -#include "gtklabel.h" #include "gtkbox.h" +#include "gtkbuildable.h" +#include "gtkdialogprivate.h" #include "gtkintl.h" +#include "gtklabel.h" #include "gtkprivate.h" +#include "gtkstylecontext.h" #include "gtktypebuiltins.h" +#include <string.h> + /** * SECTION:gtkmessagedialog * @Short_description: A convenient message window diff --git a/gtk/gtkorientable.c b/gtk/gtkorientable.c index 9612e544e5..70b8e60ff7 100644 --- a/gtk/gtkorientable.c +++ b/gtk/gtkorientable.c @@ -22,7 +22,9 @@ #include "config.h" #include "gtkorientableprivate.h" + #include "gtkprivate.h" +#include "gtkstylecontext.h" #include "gtktypebuiltins.h" #include "gtkintl.h" diff --git a/gtk/gtkoverlay.c b/gtk/gtkoverlay.c index 643ca00d2e..0b3c8932c3 100644 --- a/gtk/gtkoverlay.c +++ b/gtk/gtkoverlay.c @@ -21,14 +21,15 @@ #include "config.h" #include "gtkoverlay.h" + #include "gtkbuildable.h" -#include "gtkscrolledwindow.h" -#include "gtkwidgetprivate.h" +#include "gtkintl.h" #include "gtkmarshalers.h" -#include "gtksnapshot.h" - #include "gtkprivate.h" -#include "gtkintl.h" +#include "gtkscrolledwindow.h" +#include "gtksnapshot.h" +#include "gtkstylecontext.h" +#include "gtkwidgetprivate.h" /** * SECTION:gtkoverlay diff --git a/gtk/gtkpaned.c b/gtk/gtkpaned.c index c09b3d9142..cf2e39a26e 100644 --- a/gtk/gtkpaned.c +++ b/gtk/gtkpaned.c @@ -35,7 +35,6 @@ #include "gtkgesturesingle.h" #include "gtkgizmoprivate.h" #include "gtkintl.h" -#include "gtkmain.h" #include "gtkmarshalers.h" #include "gtkorientableprivate.h" #include "gtkprivate.h" @@ -768,7 +767,6 @@ gesture_drag_begin_cb (GtkGestureDrag *gesture, priv->drag_pos = start_y - handle_area.origin.y; priv->panning = TRUE; - gtk_grab_add (GTK_WIDGET (paned)); gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED); @@ -804,7 +802,6 @@ gesture_drag_end_cb (GtkGestureDrag *gesture, if (!priv->panning) gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_DENIED); - gtk_grab_remove (GTK_WIDGET (paned)); priv->panning = FALSE; } @@ -1185,22 +1182,6 @@ flip_child (int width, } static void -gtk_paned_set_child_visible (GtkPaned *paned, - guint id, - gboolean visible) -{ - GtkPanedPrivate *priv = gtk_paned_get_instance_private (paned); - GtkWidget *child; - - child = id == CHILD1 ? priv->child1 : priv->child2; - - if (child == NULL) - return; - - gtk_widget_set_child_visible (child, visible); -} - -static void gtk_paned_size_allocate (GtkWidget *widget, int width, int height, @@ -1316,6 +1297,8 @@ gtk_paned_size_allocate (GtkWidget *widget, child2_allocation.height = child2_height; } + gtk_widget_set_child_visible (priv->handle_widget, TRUE); + gtk_widget_size_allocate (priv->handle_widget, &handle_allocation, -1); gtk_widget_size_allocate (priv->child1, &child1_allocation, -1); gtk_widget_size_allocate (priv->child2, &child2_allocation, -1); @@ -1324,26 +1307,21 @@ gtk_paned_size_allocate (GtkWidget *widget, { if (priv->child1 && gtk_widget_get_visible (priv->child1)) { - gtk_paned_set_child_visible (paned, CHILD1, TRUE); - gtk_paned_set_child_visible (paned, CHILD2, FALSE); + gtk_widget_set_child_visible (priv->child1, TRUE); gtk_widget_size_allocate (priv->child1, &(GtkAllocation) {0, 0, width, height}, -1); } else if (priv->child2 && gtk_widget_get_visible (priv->child2)) { - gtk_paned_set_child_visible (paned, CHILD1, FALSE); - gtk_paned_set_child_visible (paned, CHILD2, TRUE); + gtk_widget_set_child_visible (priv->child2, TRUE); gtk_widget_size_allocate (priv->child2, &(GtkAllocation) {0, 0, width, height}, -1); } - else - { - gtk_paned_set_child_visible (paned, CHILD1, FALSE); - gtk_paned_set_child_visible (paned, CHILD2, FALSE); - } + + gtk_widget_set_child_visible (priv->handle_widget, FALSE); } } @@ -1813,8 +1791,8 @@ gtk_paned_calc_position (GtkPaned *paned, &priv->min_position, &priv->max_position, &priv->child1_size); - gtk_paned_set_child_visible (paned, CHILD1, priv->child1_size != 0); - gtk_paned_set_child_visible (paned, CHILD2, priv->child1_size != allocation); + gtk_widget_set_child_visible (priv->child1, priv->child1_size != 0); + gtk_widget_set_child_visible (priv->child2, priv->child1_size != allocation); g_object_freeze_notify (G_OBJECT (paned)); if (priv->child1_size != old_position) diff --git a/gtk/gtkrevealer.c b/gtk/gtkrevealer.c index f594b11f63..6dc84603c8 100644 --- a/gtk/gtkrevealer.c +++ b/gtk/gtkrevealer.c @@ -366,84 +366,89 @@ gtk_revealer_real_size_allocate (GtkWidget *widget, GtkRevealer *revealer = GTK_REVEALER (widget); GtkRevealerPrivate *priv = gtk_revealer_get_instance_private (revealer); GtkWidget *child; + GskTransform *transform; + double hscale, vscale; + int child_width, child_height; child = gtk_bin_get_child (GTK_BIN (revealer)); - if (child != NULL && gtk_widget_get_visible (child)) + if (child == NULL || !gtk_widget_get_visible (child)) + return; + + if (priv->current_pos >= 1.0) + { + gtk_widget_allocate (child, width, height, baseline, NULL); + return; + } + + child_width = width; + child_height = height; + hscale = get_child_size_scale (revealer, GTK_ORIENTATION_HORIZONTAL); + vscale = get_child_size_scale (revealer, GTK_ORIENTATION_VERTICAL); + if (hscale <= 0 || vscale <= 0) + { + /* don't allocate anything, the child is invisible and the numbers + * don't make sense. */ + return; + } + + if (hscale < 1.0) + { + g_assert (vscale == 1.0); + child_width = MIN (G_MAXINT, ceil (width / hscale)); + } + else if (vscale < 1.0) { - GskTransform *transform; - double hscale, vscale; - int child_width, child_height; - - child_width = width; - child_height = height; - hscale = get_child_size_scale (revealer, GTK_ORIENTATION_HORIZONTAL); - vscale = get_child_size_scale (revealer, GTK_ORIENTATION_VERTICAL); - - if (hscale <= 0 || vscale <= 0) - { - /* don't allocate anything, the child is invisible and the numbers - * don't make sense. */ - return; - } - else if (hscale < 1.0) - { - g_assert (vscale == 1.0); - child_width = MIN (G_MAXINT, ceil (width / hscale)); - } - else if (vscale < 1.0) - { - child_height = MIN (G_MAXINT, ceil (height / vscale)); - } - - transform = NULL; - switch (effective_transition (revealer)) - { - case GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT: - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width - child_width, 0)); - break; - - case GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN: - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (0, height - child_height)); - - case GTK_REVEALER_TRANSITION_TYPE_SWING_LEFT: - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width, height / 2)); - transform = gsk_transform_perspective (transform, 2 * MAX (width, height)); - transform = gsk_transform_rotate_3d (transform, -90 * (1.0 - priv->current_pos), graphene_vec3_y_axis ()); - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- child_width, - child_height / 2)); - break; - - case GTK_REVEALER_TRANSITION_TYPE_SWING_RIGHT: - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (0, height / 2)); - transform = gsk_transform_perspective (transform, 2 * MAX (width, height)); - transform = gsk_transform_rotate_3d (transform, 90 * (1.0 - priv->current_pos), graphene_vec3_y_axis ()); - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (0, - child_height / 2)); - break; - - case GTK_REVEALER_TRANSITION_TYPE_SWING_DOWN: - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width / 2, 0)); - transform = gsk_transform_perspective (transform, 2 * MAX (width, height)); - transform = gsk_transform_rotate_3d (transform, -90 * (1.0 - priv->current_pos), graphene_vec3_x_axis ()); - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- child_width / 2, 0)); - break; - - case GTK_REVEALER_TRANSITION_TYPE_SWING_UP: - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width / 2, height)); - transform = gsk_transform_perspective (transform, 2 * MAX (width, height)); - transform = gsk_transform_rotate_3d (transform, 90 * (1.0 - priv->current_pos), graphene_vec3_x_axis ()); - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- child_width / 2, - child_height)); - break; - - case GTK_REVEALER_TRANSITION_TYPE_NONE: - case GTK_REVEALER_TRANSITION_TYPE_CROSSFADE: - case GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT: - case GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP: - default: - break; - } - - gtk_widget_allocate (child, child_width, child_height, -1, transform); - gsk_transform_unref (transform); + child_height = MIN (G_MAXINT, ceil (height / vscale)); + } + + transform = NULL; + switch (effective_transition (revealer)) + { + case GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT: + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width - child_width, 0)); + break; + + case GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN: + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (0, height - child_height)); + + case GTK_REVEALER_TRANSITION_TYPE_SWING_LEFT: + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width, height / 2)); + transform = gsk_transform_perspective (transform, 2 * MAX (width, height)); + transform = gsk_transform_rotate_3d (transform, -90 * (1.0 - priv->current_pos), graphene_vec3_y_axis ()); + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- child_width, - child_height / 2)); + break; + + case GTK_REVEALER_TRANSITION_TYPE_SWING_RIGHT: + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (0, height / 2)); + transform = gsk_transform_perspective (transform, 2 * MAX (width, height)); + transform = gsk_transform_rotate_3d (transform, 90 * (1.0 - priv->current_pos), graphene_vec3_y_axis ()); + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (0, - child_height / 2)); + break; + + case GTK_REVEALER_TRANSITION_TYPE_SWING_DOWN: + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width / 2, 0)); + transform = gsk_transform_perspective (transform, 2 * MAX (width, height)); + transform = gsk_transform_rotate_3d (transform, -90 * (1.0 - priv->current_pos), graphene_vec3_x_axis ()); + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- child_width / 2, 0)); + break; + + case GTK_REVEALER_TRANSITION_TYPE_SWING_UP: + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (width / 2, height)); + transform = gsk_transform_perspective (transform, 2 * MAX (width, height)); + transform = gsk_transform_rotate_3d (transform, 90 * (1.0 - priv->current_pos), graphene_vec3_x_axis ()); + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- child_width / 2, - child_height)); + break; + + case GTK_REVEALER_TRANSITION_TYPE_NONE: + case GTK_REVEALER_TRANSITION_TYPE_CROSSFADE: + case GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT: + case GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP: + default: + break; } + + gtk_widget_allocate (child, child_width, child_height, -1, transform); + gsk_transform_unref (transform); } static void diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index ea1b402c4b..2ba312e741 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -423,6 +423,8 @@ add_tab_bindings (GtkBindingSet *binding_set, static void motion_controller_leave (GtkEventController *controller, + GdkCrossingMode mode, + GdkNotifyType detail, GtkScrolledWindow *scrolled_window) { GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window); diff --git a/gtk/gtksearchbar.c b/gtk/gtksearchbar.c index 7c0222ef60..e774955d3f 100644 --- a/gtk/gtksearchbar.c +++ b/gtk/gtksearchbar.c @@ -32,12 +32,13 @@ #include "gtkbutton.h" #include "gtkcenterbox.h" #include "gtkentryprivate.h" +#include "gtkeventcontrollerkey.h" #include "gtkintl.h" #include "gtkprivate.h" #include "gtkrevealer.h" #include "gtksearchentryprivate.h" #include "gtksnapshot.h" -#include "gtkeventcontrollerkey.h" +#include "gtkstylecontext.h" /** * SECTION:gtksearchbar diff --git a/gtk/gtkseparatortoolitem.c b/gtk/gtkseparatortoolitem.c index 3cdc517c19..86cb818fd2 100644 --- a/gtk/gtkseparatortoolitem.c +++ b/gtk/gtkseparatortoolitem.c @@ -18,11 +18,14 @@ */ #include "config.h" -#include "gtkseparatormenuitem.h" + #include "gtkseparatortoolitem.h" + #include "gtkintl.h" -#include "gtktoolbarprivate.h" #include "gtkprivate.h" +#include "gtkseparatormenuitem.h" +#include "gtkstylecontext.h" +#include "gtktoolbarprivate.h" #include "gtkwidgetprivate.h" /** diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index 0b70835bbf..354e70a083 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -18,22 +18,23 @@ #include "config.h" -#include <string.h> - -#include "gtksettings.h" - #include "gtksettingsprivate.h" -#include "gtkintl.h" -#include "gtkwidget.h" -#include "gtkprivate.h" + #include "gtkcssproviderprivate.h" #include "gtkhslaprivate.h" +#include "gtkintl.h" +#include "gtkprivate.h" +#include "gtkscrolledwindow.h" +#include "gtkstylecontext.h" #include "gtkstyleproviderprivate.h" #include "gtktypebuiltins.h" #include "gtkversion.h" -#include "gtkscrolledwindow.h" +#include "gtkwidget.h" + #include "gdk/gdk-private.h" +#include <string.h> + #ifdef GDK_WINDOWING_X11 #include "x11/gdkx.h" #include <pango/pangofc-fontmap.h> diff --git a/gtk/gtkshortcutsshortcut.c b/gtk/gtkshortcutsshortcut.c index 3e923a34e1..1cbd8e0bf8 100644 --- a/gtk/gtkshortcutsshortcut.c +++ b/gtk/gtkshortcutsshortcut.c @@ -27,6 +27,7 @@ #include "gtkshortcutlabel.h" #include "gtkshortcutswindowprivate.h" #include "gtksizegroup.h" +#include "gtkstylecontext.h" #include "gtktypebuiltins.h" /** diff --git a/gtk/gtkshortcutswindow.c b/gtk/gtkshortcutswindow.c index 77f7d297e7..1728736541 100644 --- a/gtk/gtkshortcutswindow.c +++ b/gtk/gtkshortcutswindow.c @@ -22,11 +22,13 @@ #include "gtkbindings.h" #include "gtkbox.h" +#include "gtkeventcontrollerkey.h" #include "gtkgrid.h" #include "gtkheaderbar.h" #include "gtkintl.h" #include "gtklabel.h" #include "gtklistbox.h" +#include "gtkmain.h" #include "gtkmenubutton.h" #include "gtkpopover.h" #include "gtkprivate.h" @@ -38,13 +40,10 @@ #include "gtkshortcutsshortcutprivate.h" #include "gtksizegroup.h" #include "gtkstack.h" +#include "gtkstylecontext.h" #include "gtktogglebutton.h" #include "gtktypebuiltins.h" #include "gtkwidgetprivate.h" -#include "gtkeventcontrollerkey.h" -#include "gtkprivate.h" -#include "gtkintl.h" -#include "gtkmain.h" /** * SECTION:gtkshortcutswindow diff --git a/gtk/gtksingleselection.c b/gtk/gtksingleselection.c index ce25eb91d1..5f9517fbed 100644 --- a/gtk/gtksingleselection.c +++ b/gtk/gtksingleselection.c @@ -451,10 +451,15 @@ gtk_single_selection_class_init (GtkSingleSelectionClass *klass) G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + /** + * GtkSingleSelection:model: + * + * The model being managed + */ properties[PROP_MODEL] = g_param_spec_object ("model", P_("The model"), - P_("The model"), + P_("The model being managed"), G_TYPE_LIST_MODEL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); @@ -548,7 +553,9 @@ gtk_single_selection_set_selected (GtkSingleSelection *self, gtk_selection_model_selection_changed (GTK_SELECTION_MODEL (self), position, old_position - position + 1); else gtk_selection_model_selection_changed (GTK_SELECTION_MODEL (self), old_position, position - old_position + 1); + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SELECTED]); + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SELECTED_ITEM]); } /** diff --git a/gtk/gtkstackswitcher.c b/gtk/gtkstackswitcher.c index e088ba1cca..b2fa29307d 100644 --- a/gtk/gtkstackswitcher.c +++ b/gtk/gtkstackswitcher.c @@ -18,18 +18,21 @@ */ #include "config.h" + #include "gtkstackswitcher.h" -#include "gtkradiobutton.h" -#include "gtklabel.h" + #include "gtkdnd.h" #include "gtkdragdest.h" +#include "gtkimage.h" +#include "gtkintl.h" +#include "gtklabel.h" #include "gtkorientable.h" #include "gtkprivate.h" -#include "gtkintl.h" -#include "gtkwidgetprivate.h" -#include "gtktypebuiltins.h" -#include "gtkimage.h" +#include "gtkradiobutton.h" #include "gtkselectionmodel.h" +#include "gtkstylecontext.h" +#include "gtktypebuiltins.h" +#include "gtkwidgetprivate.h" /** * SECTION:gtkstackswitcher diff --git a/gtk/gtkstylecontext.h b/gtk/gtkstylecontext.h index 0f349ff368..13de1f1035 100644 --- a/gtk/gtkstylecontext.h +++ b/gtk/gtkstylecontext.h @@ -26,7 +26,6 @@ #include <gtk/gtkcsssection.h> #include <gtk/gtkstyleprovider.h> #include <gtk/gtktypes.h> -#include <atk/atk.h> G_BEGIN_DECLS diff --git a/gtk/gtkstylecontextprivate.h b/gtk/gtkstylecontextprivate.h index 3973215abb..81a2e2e3f1 100644 --- a/gtk/gtkstylecontextprivate.h +++ b/gtk/gtkstylecontextprivate.h @@ -26,6 +26,8 @@ #include "gtkbitmaskprivate.h" #include "gtkcssvalueprivate.h" +#include <atk/atk.h> + G_BEGIN_DECLS GtkStyleContext *gtk_style_context_new_for_node (GtkCssNode *node); diff --git a/gtk/gtktogglebutton.c b/gtk/gtktogglebutton.c index 2f3b0900b7..c482a19da0 100644 --- a/gtk/gtktogglebutton.c +++ b/gtk/gtktogglebutton.c @@ -24,15 +24,16 @@ #include "config.h" -#include "gtktogglebutton.h" +#include "gtktogglebuttonprivate.h" #include "gtkbuttonprivate.h" -#include "gtktogglebuttonprivate.h" +#include "gtkintl.h" #include "gtklabel.h" #include "gtkmain.h" #include "gtkmarshalers.h" #include "gtkprivate.h" -#include "gtkintl.h" +#include "gtkstylecontext.h" + #include "a11y/gtktogglebuttonaccessible.h" diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 6a45c7893d..58ff31bd05 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -929,8 +929,12 @@ static void gtk_tree_view_drag_gesture_end (GtkGestureDrag *ges static void gtk_tree_view_motion_controller_enter (GtkEventControllerMotion *controller, double x, double y, + GdkCrossingMode mode, + GdkNotifyType detail, GtkTreeView *tree_view); static void gtk_tree_view_motion_controller_leave (GtkEventControllerMotion *controller, + GdkCrossingMode mode, + GdkNotifyType detail, GtkTreeView *tree_view); static void gtk_tree_view_motion_controller_motion (GtkEventControllerMotion *controller, double x, @@ -5437,6 +5441,8 @@ static void gtk_tree_view_motion_controller_enter (GtkEventControllerMotion *controller, double x, double y, + GdkCrossingMode mode, + GdkNotifyType detail, GtkTreeView *tree_view) { GtkTreeRBTree *tree; @@ -5462,6 +5468,8 @@ gtk_tree_view_motion_controller_enter (GtkEventControllerMotion *controller, static void gtk_tree_view_motion_controller_leave (GtkEventControllerMotion *controller, + GdkCrossingMode mode, + GdkNotifyType detail, GtkTreeView *tree_view) { if (tree_view->priv->prelight_node) diff --git a/gtk/gtkviewport.c b/gtk/gtkviewport.c index 8a8f7e032a..123227405d 100644 --- a/gtk/gtkviewport.c +++ b/gtk/gtkviewport.c @@ -31,6 +31,7 @@ #include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtkscrollable.h" +#include "gtkstylecontext.h" #include "gtktypebuiltins.h" #include "gtkwidgetprivate.h" diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index ca206fc6a4..7b5e2ed1e5 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -13315,7 +13315,7 @@ gtk_widget_set_focus_child (GtkWidget *widget, * * Returns the current focus child of @widget. * - * Returns: (nullable): The current focus child of @widget, + * Returns: (nullable): (transfer none): The current focus child of @widget, * or %NULL in case the focus child is unset. */ GtkWidget * diff --git a/gtk/gtkwin32themeprivate.h b/gtk/gtkwin32themeprivate.h index 9ea7777366..056e098062 100644 --- a/gtk/gtkwin32themeprivate.h +++ b/gtk/gtkwin32themeprivate.h @@ -20,6 +20,7 @@ #ifndef __GTK_WIN32_THEME_PART_H__ #define __GTK_WIN32_THEME_PART_H__ +#include "gtkborder.h" #include "gtkcssparserprivate.h" G_BEGIN_DECLS diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index bc2a53cff2..091a432e81 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -6913,6 +6913,8 @@ do_focus_change (GtkWidget *widget, GdkSeat *seat; GdkDevice *device; GdkEvent *event; + GtkRoot *root; + GtkStateFlags flags; seat = gdk_display_get_default_seat (gtk_widget_get_display (widget)); device = gdk_seat_get_keyboard (seat); @@ -6929,6 +6931,16 @@ do_focus_change (GtkWidget *widget, event->focus_change.mode = GDK_CROSSING_STATE_CHANGED; event->focus_change.detail = GDK_NOTIFY_ANCESTOR; + flags = GTK_STATE_FLAG_FOCUSED; + root = gtk_widget_get_root (widget); + if (!GTK_IS_WINDOW (root) || gtk_window_get_focus_visible (GTK_WINDOW (root))) + flags |= GTK_STATE_FLAG_FOCUS_VISIBLE; + + if (in) + gtk_widget_set_state_flags (widget, flags, FALSE); + else + gtk_widget_unset_state_flags (widget, flags); + gtk_widget_set_has_focus (widget, in); gtk_widget_event (widget, event); diff --git a/gtk/inspector/size-groups.c b/gtk/inspector/size-groups.c index 59ef51e7e6..0537edba00 100644 --- a/gtk/inspector/size-groups.c +++ b/gtk/inspector/size-groups.c @@ -28,6 +28,7 @@ #include "gtklabel.h" #include "gtklistbox.h" #include "gtksizegroup.h" +#include "gtkstylecontext.h" #include "gtkswitch.h" #include "gtkwidgetprivate.h" diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss index eb8d2e1d0a..d9320bfd27 100644 --- a/gtk/theme/Adwaita/_common.scss +++ b/gtk/theme/Adwaita/_common.scss @@ -32,7 +32,7 @@ flowboxchild:focus(visible) { outline-style: dashed; outline-offset: -3px; outline-width: 1px; - -gtk-outline-radius: 2px; + -gtk-outline-radius: $button-radius - 2; } diff --git a/gtk/theme/Adwaita/gtk-contained-dark.css b/gtk/theme/Adwaita/gtk-contained-dark.css index 35d5b4697b..5784a43f23 100644 --- a/gtk/theme/Adwaita/gtk-contained-dark.css +++ b/gtk/theme/Adwaita/gtk-contained-dark.css @@ -1,6 +1,6 @@ * { padding: 0; -gtk-secondary-caret-color: #15539e; } -button:focus(visible), checkbutton:focus(visible), radiobutton:focus(visible), switch:focus(visible), scale:focus(visible), label:focus(visible), row:focus(visible), flowboxchild:focus(visible) { outline-color: alpha(currentColor,0.3); outline-style: dashed; outline-offset: -3px; outline-width: 1px; -gtk-outline-radius: 2px; } +button:focus(visible), checkbutton:focus(visible), radiobutton:focus(visible), switch:focus(visible), scale:focus(visible), label:focus(visible), row:focus(visible), flowboxchild:focus(visible) { outline-color: alpha(currentColor,0.3); outline-style: dashed; outline-offset: -3px; outline-width: 1px; -gtk-outline-radius: 3px; } /*************** Base States * */ .background { color: #eeeeec; background-color: #353535; } @@ -132,6 +132,8 @@ spinbutton:not(.vertical) image:active, spinbutton.vertical text image:active, e spinbutton:not(.vertical) image:backdrop, spinbutton.vertical text image:backdrop, entry image:backdrop { color: #7e7e7d; } +spinbutton.password:not(.vertical) image.caps-lock-indicator, spinbutton.vertical text.password image.caps-lock-indicator, entry.password image.caps-lock-indicator { color: #7e7e7d; } + spinbutton:drop(active):focus:not(.vertical), spinbutton.vertical text:drop(active):focus, spinbutton:drop(active):not(.vertical), spinbutton.vertical text:drop(active), entry:drop(active):focus, entry:drop(active) { border-color: #4e9a06; box-shadow: inset 0 0 0 1px #4e9a06; } .osd spinbutton:not(.vertical), .osd spinbutton.vertical text, spinbutton.vertical .osd text, .osd entry { color: white; border-color: rgba(0, 0, 0, 0.7); background-color: rgba(0, 0, 0, 0.5); background-clip: padding-box; box-shadow: none; text-shadow: 0 1px black; -gtk-icon-shadow: 0 1px black; } diff --git a/gtk/theme/Adwaita/gtk-contained.css b/gtk/theme/Adwaita/gtk-contained.css index 827b6b9017..b1be17f86f 100644 --- a/gtk/theme/Adwaita/gtk-contained.css +++ b/gtk/theme/Adwaita/gtk-contained.css @@ -1,6 +1,6 @@ * { padding: 0; -gtk-secondary-caret-color: #3584e4; } -button:focus(visible), checkbutton:focus(visible), radiobutton:focus(visible), switch:focus(visible), scale:focus(visible), label:focus(visible), row:focus(visible), flowboxchild:focus(visible) { outline-color: alpha(currentColor,0.3); outline-style: dashed; outline-offset: -3px; outline-width: 1px; -gtk-outline-radius: 2px; } +button:focus(visible), checkbutton:focus(visible), radiobutton:focus(visible), switch:focus(visible), scale:focus(visible), label:focus(visible), row:focus(visible), flowboxchild:focus(visible) { outline-color: alpha(currentColor,0.3); outline-style: dashed; outline-offset: -3px; outline-width: 1px; -gtk-outline-radius: 3px; } /*************** Base States * */ .background { color: #2e3436; background-color: #f6f5f4; } @@ -132,6 +132,8 @@ spinbutton:not(.vertical) image:active, spinbutton.vertical text image:active, e spinbutton:not(.vertical) image:backdrop, spinbutton.vertical text image:backdrop, entry image:backdrop { color: #a7aaaa; } +spinbutton.password:not(.vertical) image.caps-lock-indicator, spinbutton.vertical text.password image.caps-lock-indicator, entry.password image.caps-lock-indicator { color: #a7aaaa; } + spinbutton:drop(active):focus:not(.vertical), spinbutton.vertical text:drop(active):focus, spinbutton:drop(active):not(.vertical), spinbutton.vertical text:drop(active), entry:drop(active):focus, entry:drop(active) { border-color: #4e9a06; box-shadow: inset 0 0 0 1px #4e9a06; } .osd spinbutton:not(.vertical), .osd spinbutton.vertical text, spinbutton.vertical .osd text, .osd entry { color: white; border-color: rgba(0, 0, 0, 0.7); background-color: rgba(0, 0, 0, 0.5); background-clip: padding-box; box-shadow: none; text-shadow: 0 1px black; -gtk-icon-shadow: 0 1px black; } |