summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkapplication-dbus.c2
-rw-r--r--gtk/gtkassistant.c7
-rw-r--r--gtk/gtkbutton.c1
-rw-r--r--gtk/gtkcellarea.c1
-rw-r--r--gtk/gtkcellrenderer.c1
-rw-r--r--gtk/gtkcellrendererprogress.c1
-rw-r--r--gtk/gtkcellrenderertext.c1
-rw-r--r--gtk/gtkcolorbutton.c1
-rw-r--r--gtk/gtkcolorchooserwidget.c1
-rw-r--r--gtk/gtkcssboxesprivate.h1
-rw-r--r--gtk/gtkcssimageprivate.h1
-rw-r--r--gtk/gtkcssnodeprivate.h1
-rw-r--r--gtk/gtkcssparserprivate.h1
-rw-r--r--gtk/gtkcssshadowsvalueprivate.h1
-rw-r--r--gtk/gtkcssshadowvalueprivate.h1
-rw-r--r--gtk/gtkcsstypesprivate.h1
-rw-r--r--gtk/gtkcssvalueprivate.h2
-rw-r--r--gtk/gtkdialog.c1
-rw-r--r--gtk/gtkdnd.c1
-rw-r--r--gtk/gtkeditable.c10
-rw-r--r--gtk/gtkemojichooser.c1
-rw-r--r--gtk/gtkemojicompletion.c1
-rw-r--r--gtk/gtkeventcontrollermotion.c219
-rw-r--r--gtk/gtkeventcontrollermotion.h5
-rw-r--r--gtk/gtkfontbutton.c13
-rw-r--r--gtk/gtkiconview.c4
-rw-r--r--gtk/gtkinfobar.c1
-rw-r--r--gtk/gtklabel.c4
-rw-r--r--gtk/gtklinkbutton.c1
-rw-r--r--gtk/gtkmain.c5
-rw-r--r--gtk/gtkmenu.c8
-rw-r--r--gtk/gtkmenubutton.c17
-rw-r--r--gtk/gtkmenuitem.c20
-rw-r--r--gtk/gtkmessagedialog.c12
-rw-r--r--gtk/gtkorientable.c2
-rw-r--r--gtk/gtkoverlay.c11
-rw-r--r--gtk/gtkpaned.c38
-rw-r--r--gtk/gtkrevealer.c153
-rw-r--r--gtk/gtkscrolledwindow.c2
-rw-r--r--gtk/gtksearchbar.c3
-rw-r--r--gtk/gtkseparatortoolitem.c7
-rw-r--r--gtk/gtksettings.c17
-rw-r--r--gtk/gtkshortcutsshortcut.c1
-rw-r--r--gtk/gtkshortcutswindow.c7
-rw-r--r--gtk/gtksingleselection.c9
-rw-r--r--gtk/gtkstackswitcher.c15
-rw-r--r--gtk/gtkstylecontext.h1
-rw-r--r--gtk/gtkstylecontextprivate.h2
-rw-r--r--gtk/gtktogglebutton.c7
-rw-r--r--gtk/gtktreeview.c8
-rw-r--r--gtk/gtkviewport.c1
-rw-r--r--gtk/gtkwidget.c2
-rw-r--r--gtk/gtkwin32themeprivate.h1
-rw-r--r--gtk/gtkwindow.c12
-rw-r--r--gtk/inspector/size-groups.c1
-rw-r--r--gtk/theme/Adwaita/_common.scss2
-rw-r--r--gtk/theme/Adwaita/gtk-contained-dark.css4
-rw-r--r--gtk/theme/Adwaita/gtk-contained.css4
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; }