summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2020-02-25 13:35:34 +0000
committerTimm Bäder <mail@baedert.org>2020-02-25 13:35:34 +0000
commit64ff12dbd7a95e23aa30ae2fb998b328bbcafee3 (patch)
tree669ac57af67d33903933b0cb15060af5f9de3499
parent648a67085f37e42c464dc4d5c498ffc3afed3ecc (diff)
parent02e295ec5d509d74731a6946b7caee59f897a5b3 (diff)
downloadgtk+-64ff12dbd7a95e23aa30ae2fb998b328bbcafee3.tar.gz
Merge branch 'wip/baedert/for-master' into 'master'
wip/baedert/for-master See merge request GNOME/gtk!1466
-rw-r--r--docs/reference/gtk/gtk4-sections.txt1
-rw-r--r--gtk/a11y/gtkstatusbaraccessible.c46
-rw-r--r--gtk/gtkcolorchooser.c2
-rw-r--r--gtk/gtkcolorchooserwidget.c8
-rw-r--r--gtk/gtkemojichooser.c7
-rw-r--r--gtk/gtkheaderbar.c6
-rw-r--r--gtk/gtkmenusectionbox.c3
-rw-r--r--gtk/gtkmodelbutton.c2
-rw-r--r--gtk/gtkpathbar.c230
-rw-r--r--gtk/gtkpathbar.h4
-rw-r--r--gtk/gtkplacessidebar.c407
-rw-r--r--gtk/gtkpopover.c6
-rw-r--r--gtk/gtkpopovermenu.c2
-rw-r--r--gtk/gtkpopovermenubar.c6
-rw-r--r--gtk/gtkrange.c108
-rw-r--r--gtk/gtkscrolledwindow.c17
-rw-r--r--gtk/gtkshortcutlabel.c2
-rw-r--r--gtk/gtkstackswitcher.c2
-rw-r--r--gtk/gtkstatusbar.c9
-rw-r--r--gtk/gtkstatusbar.h3
-rw-r--r--gtk/gtkstatusbarprivate.h30
-rw-r--r--gtk/gtkwidget.c170
-rw-r--r--gtk/gtkwidget.h6
-rw-r--r--gtk/gtkwidgetprivate.h9
-rw-r--r--gtk/gtkwindow.c20
-rw-r--r--gtk/gtkwindowprivate.h3
-rw-r--r--gtk/inspector/inspect-button.c7
-rw-r--r--gtk/inspector/recorder.ui133
-rw-r--r--gtk/ui/gtkpathbar.ui39
29 files changed, 421 insertions, 867 deletions
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index e8761954f2..08f27b2a7d 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -2531,7 +2531,6 @@ gtk_statusbar_push
gtk_statusbar_pop
gtk_statusbar_remove
gtk_statusbar_remove_all
-gtk_statusbar_get_message_area
<SUBSECTION Standard>
GTK_STATUSBAR
GTK_IS_STATUSBAR
diff --git a/gtk/a11y/gtkstatusbaraccessible.c b/gtk/a11y/gtkstatusbaraccessible.c
index d21fc7295d..b4d2f38505 100644
--- a/gtk/a11y/gtkstatusbaraccessible.c
+++ b/gtk/a11y/gtkstatusbaraccessible.c
@@ -19,6 +19,7 @@
#include <string.h>
#include <gtk/gtk.h>
+#include "gtkstatusbarprivate.h"
#include "gtkstatusbaraccessible.h"
@@ -51,50 +52,11 @@ gtk_statusbar_accessible_initialize (AtkObject *obj,
obj->role = ATK_ROLE_STATUSBAR;
}
-static GtkWidget *
-find_label_child (GtkContainer *container)
-{
- GList *children, *tmp_list;
- GtkWidget *child;
-
- children = gtk_container_get_children (container);
-
- child = NULL;
- for (tmp_list = children; tmp_list != NULL; tmp_list = tmp_list->next)
- {
- if (GTK_IS_LABEL (tmp_list->data))
- {
- child = GTK_WIDGET (tmp_list->data);
- break;
- }
- else if (GTK_IS_CONTAINER (tmp_list->data))
- {
- child = find_label_child (GTK_CONTAINER (tmp_list->data));
- if (child)
- break;
- }
- }
- g_list_free (children);
-
- return child;
-}
-
-static GtkWidget *
-get_label_from_statusbar (GtkStatusbar *statusbar)
-{
- GtkWidget *box;
-
- box = gtk_statusbar_get_message_area (statusbar);
-
- return find_label_child (GTK_CONTAINER (box));
-}
-
static const gchar *
gtk_statusbar_accessible_get_name (AtkObject *obj)
{
const gchar *name;
GtkWidget *widget;
- GtkWidget *label;
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
if (widget == NULL)
@@ -104,11 +66,7 @@ gtk_statusbar_accessible_get_name (AtkObject *obj)
if (name != NULL)
return name;
- label = get_label_from_statusbar (GTK_STATUSBAR (widget));
- if (GTK_IS_LABEL (label))
- return gtk_label_get_label (GTK_LABEL (label));
-
- return NULL;
+ return gtk_statusbar_get_message (GTK_STATUSBAR (widget));
}
static gint
diff --git a/gtk/gtkcolorchooser.c b/gtk/gtkcolorchooser.c
index f5389fa806..070f7fa20e 100644
--- a/gtk/gtkcolorchooser.c
+++ b/gtk/gtkcolorchooser.c
@@ -230,7 +230,7 @@ _gtk_color_chooser_snapshot_checkered_pattern (GtkSnapshot *snapshot,
int height)
{
const GdkRGBA color1 = GDK_RGBA("A8A8A8");
- const GdkRGBA color2 = GDK_RGBA("545445");
+ const GdkRGBA color2 = GDK_RGBA("545454");
gtk_snapshot_push_repeat (snapshot, &GRAPHENE_RECT_INIT (0, 0, width, height), NULL);
gtk_snapshot_append_color (snapshot, &color1, &GRAPHENE_RECT_INIT (0, 0, 10, 10));
diff --git a/gtk/gtkcolorchooserwidget.c b/gtk/gtkcolorchooserwidget.c
index 269c6a26e8..bda681e7ab 100644
--- a/gtk/gtkcolorchooserwidget.c
+++ b/gtk/gtkcolorchooserwidget.c
@@ -803,20 +803,16 @@ add_custom_color (GtkColorChooserWidget *cc,
const GdkRGBA *color)
{
GtkColorChooserWidgetPrivate *priv = gtk_color_chooser_widget_get_instance_private (cc);
- GtkWidget *last;
GtkWidget *p;
GList *children;
children = gtk_container_get_children (GTK_CONTAINER (priv->custom));
if (g_list_length (children) >= 9)
{
- last = g_list_last (children)->data;
- if (last == GTK_WIDGET (priv->current))
- priv->current = NULL;
+ GtkWidget *last = gtk_widget_get_last_child (priv->custom);
- gtk_widget_destroy (last);
+ gtk_container_remove (GTK_CONTAINER (priv->custom), last);
}
-
g_list_free (children);
p = gtk_color_swatch_new ();
diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c
index adc415ebc9..66915d31c9 100644
--- a/gtk/gtkemojichooser.c
+++ b/gtk/gtkemojichooser.c
@@ -210,13 +210,13 @@ add_recent_item (GtkEmojiChooser *chooser,
if (modifier == modifier2 && g_variant_equal (item, item2))
{
- gtk_widget_destroy (GTK_WIDGET (l->data));
+ gtk_container_remove (GTK_CONTAINER (chooser->recent.box), l->data);
i--;
continue;
}
if (i >= MAX_RECENT)
{
- gtk_widget_destroy (GTK_WIDGET (l->data));
+ gtk_container_remove (GTK_CONTAINER (chooser->recent.box), l->data);
continue;
}
@@ -414,7 +414,8 @@ add_emoji (GtkWidget *box,
if (pango_layout_get_unknown_glyphs_count (layout) > 0 ||
rect.width >= 1.5 * chooser->emoji_max_width)
{
- gtk_widget_destroy (label);
+ g_object_ref_sink (label);
+ g_object_unref (label);
return;
}
diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c
index 0c708ee851..ca56f4fba1 100644
--- a/gtk/gtkheaderbar.c
+++ b/gtk/gtkheaderbar.c
@@ -383,11 +383,11 @@ _gtk_header_bar_update_window_buttons (GtkHeaderBar *bar)
priv->titlebar_icon = button;
gtk_widget_add_css_class (button, "titlebutton");
gtk_widget_add_css_class (button, "icon");
- gtk_widget_set_size_request (button, 20, 20);
if (!_gtk_header_bar_update_window_icon (bar, window))
{
- gtk_widget_destroy (button);
+ g_object_ref_sink (button);
+ g_object_unref (button);
priv->titlebar_icon = NULL;
button = NULL;
}
@@ -802,7 +802,7 @@ gtk_header_bar_dispose (GObject *object)
if (priv->label_sizing_box)
{
- gtk_widget_destroy (priv->label_sizing_box);
+ g_object_ref_sink (priv->label_sizing_box);
g_clear_object (&priv->label_sizing_box);
}
diff --git a/gtk/gtkmenusectionbox.c b/gtk/gtkmenusectionbox.c
index 9aec305ec6..94760fdf9f 100644
--- a/gtk/gtkmenusectionbox.c
+++ b/gtk/gtkmenusectionbox.c
@@ -222,7 +222,8 @@ gtk_menu_section_box_remove_func (gint position,
gtk_container_remove (GTK_CONTAINER (stack), subbox);
}
- gtk_widget_destroy (g_list_nth_data (children, position));
+ gtk_container_remove (GTK_CONTAINER (box->item_box),
+ g_list_nth_data (children, position));
g_list_free (children);
gtk_menu_section_box_schedule_separator_sync (box);
diff --git a/gtk/gtkmodelbutton.c b/gtk/gtkmodelbutton.c
index 585fa3e46c..e1616a1383 100644
--- a/gtk/gtkmodelbutton.c
+++ b/gtk/gtkmodelbutton.c
@@ -60,7 +60,7 @@
* radio button.
*
* Model buttons are used when popovers from a menu model with
- * gtk_popover_new_from_model(); they can also be used manually in
+ * gtk_popover_menu_new_from_model(); they can also be used manually in
* a #GtkPopoverMenu.
*
* When the action is specified via the #GtkActionable:action-name
diff --git a/gtk/gtkpathbar.c b/gtk/gtkpathbar.c
index e9477e349c..c9337b23f9 100644
--- a/gtk/gtkpathbar.c
+++ b/gtk/gtkpathbar.c
@@ -118,7 +118,7 @@ struct _ButtonData
*/
#define BUTTON_IS_FAKE_ROOT(button) ((button)->type == HOME_BUTTON)
-G_DEFINE_TYPE_WITH_PRIVATE (GtkPathBar, gtk_path_bar, GTK_TYPE_CONTAINER)
+G_DEFINE_TYPE_WITH_PRIVATE (GtkPathBar, gtk_path_bar, GTK_TYPE_WIDGET)
static void gtk_path_bar_finalize (GObject *object);
static void gtk_path_bar_dispose (GObject *object);
@@ -133,21 +133,8 @@ static void gtk_path_bar_size_allocate (GtkWidget *widget,
int width,
int height,
int baseline);
-static void gtk_path_bar_add (GtkContainer *container,
- GtkWidget *widget);
-static void gtk_path_bar_remove (GtkContainer *container,
- GtkWidget *widget);
-static void gtk_path_bar_forall (GtkContainer *container,
- GtkCallback callback,
- gpointer callback_data);
static void gtk_path_bar_scroll_up (GtkPathBar *path_bar);
static void gtk_path_bar_scroll_down (GtkPathBar *path_bar);
-static gboolean gtk_path_bar_slider_up_defocus (GtkWidget *widget,
- GdkEvent *event,
- GtkPathBar *path_bar);
-static gboolean gtk_path_bar_slider_down_defocus (GtkWidget *widget,
- GdkEvent *event,
- GtkPathBar *path_bar);
static void gtk_path_bar_update_button_appearance (GtkPathBar *path_bar,
ButtonData *button_data,
gboolean current_dir);
@@ -216,13 +203,11 @@ gtk_path_bar_init (GtkPathBar *path_bar)
priv = gtk_path_bar_get_instance_private (path_bar);
- gtk_widget_init_template (GTK_WIDGET (path_bar));
+ priv->up_slider_button = gtk_button_new_from_icon_name ("pan-start-symbolic");
+ gtk_widget_set_parent (priv->up_slider_button, GTK_WIDGET (path_bar));
- /* Add the children manually because GtkPathBar derives from an abstract class,
- * Glade cannot edit a <template> in gtkpathbar.ui if it's only a GtkContainer.
- */
- gtk_container_add (GTK_CONTAINER (path_bar), priv->up_slider_button);
- gtk_container_add (GTK_CONTAINER (path_bar), priv->down_slider_button);
+ priv->down_slider_button = gtk_button_new_from_icon_name ("pan-end-symbolic");
+ gtk_widget_set_parent (priv->down_slider_button, GTK_WIDGET (path_bar));
/* GtkBuilder wont let us connect 'swapped' without specifying the signal's
* user data in the .ui file
@@ -250,11 +235,9 @@ gtk_path_bar_class_init (GtkPathBarClass *path_bar_class)
{
GObjectClass *gobject_class;
GtkWidgetClass *widget_class;
- GtkContainerClass *container_class;
gobject_class = (GObjectClass *) path_bar_class;
widget_class = (GtkWidgetClass *) path_bar_class;
- container_class = (GtkContainerClass *) path_bar_class;
gobject_class->finalize = gtk_path_bar_finalize;
gobject_class->dispose = gtk_path_bar_dispose;
@@ -262,12 +245,6 @@ gtk_path_bar_class_init (GtkPathBarClass *path_bar_class)
widget_class->measure = gtk_path_bar_measure;
widget_class->size_allocate = gtk_path_bar_size_allocate;
- container_class->add = gtk_path_bar_add;
- container_class->forall = gtk_path_bar_forall;
- container_class->remove = gtk_path_bar_remove;
- /* FIXME: */
- /* container_class->child_type = gtk_path_bar_child_type;*/
-
path_bar_signals [PATH_CLICKED] =
g_signal_new (I_("path-clicked"),
G_OBJECT_CLASS_TYPE (gobject_class),
@@ -280,23 +257,9 @@ gtk_path_bar_class_init (GtkPathBarClass *path_bar_class)
G_TYPE_POINTER,
G_TYPE_BOOLEAN);
- /* Bind class to template
- */
- gtk_widget_class_set_template_from_resource (widget_class,
- "/org/gtk/libgtk/ui/gtkpathbar.ui");
-
- gtk_widget_class_bind_template_child_private (widget_class, GtkPathBar, up_slider_button);
- gtk_widget_class_bind_template_child_private (widget_class, GtkPathBar, down_slider_button);
-
- gtk_widget_class_bind_template_callback (widget_class, gtk_path_bar_slider_up_defocus);
- gtk_widget_class_bind_template_callback (widget_class, gtk_path_bar_slider_down_defocus);
- gtk_widget_class_bind_template_callback (widget_class, gtk_path_bar_scroll_up);
- gtk_widget_class_bind_template_callback (widget_class, gtk_path_bar_scroll_down);
-
gtk_widget_class_set_css_name (widget_class, "pathbar");
}
-
static void
gtk_path_bar_finalize (GObject *object)
{
@@ -324,6 +287,10 @@ gtk_path_bar_dispose (GObject *object)
{
GtkPathBar *path_bar = GTK_PATH_BAR (object);
GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (path_bar);
+ GtkWidget *w;
+
+ while ((w = gtk_widget_get_first_child (GTK_WIDGET (path_bar))) != NULL)
+ gtk_widget_unparent (w);
priv->get_info_cancellable = NULL;
cancel_all_cancellables (path_bar);
@@ -331,12 +298,6 @@ gtk_path_bar_dispose (GObject *object)
G_OBJECT_CLASS (gtk_path_bar_parent_class)->dispose (object);
}
-/* Size requisition:
- *
- * Ideally, our size is determined by another widget, and we are just filling
- * available space.
- */
-
static void
gtk_path_bar_measure (GtkWidget *widget,
GtkOrientation orientation,
@@ -357,7 +318,6 @@ gtk_path_bar_measure (GtkWidget *widget,
*minimum = 0;
*natural = 0;
-
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
for (list = priv->button_list; list; list = list->next)
@@ -704,89 +664,6 @@ gtk_path_bar_scroll_controller_scroll (GtkEventControllerScroll *scroll,
}
static void
-gtk_path_bar_add (GtkContainer *container,
- GtkWidget *widget)
-
-{
- gtk_widget_set_parent (widget, GTK_WIDGET (container));
-}
-
-static void
-gtk_path_bar_remove_1 (GtkContainer *container,
- GtkWidget *widget)
-{
- gboolean was_visible = gtk_widget_get_visible (widget);
- gtk_widget_unparent (widget);
- if (was_visible)
- gtk_widget_queue_resize (GTK_WIDGET (container));
-}
-
-static void
-gtk_path_bar_remove (GtkContainer *container,
- GtkWidget *widget)
-{
- GtkPathBar *path_bar = GTK_PATH_BAR (container);
- GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (path_bar);
- GList *children;
-
- if (widget == priv->up_slider_button)
- {
- gtk_path_bar_remove_1 (container, widget);
- priv->up_slider_button = NULL;
- return;
- }
-
- if (widget == priv->down_slider_button)
- {
- gtk_path_bar_remove_1 (container, widget);
- priv->down_slider_button = NULL;
- return;
- }
-
- children = priv->button_list;
- while (children)
- {
- if (widget == BUTTON_DATA (children->data)->button)
- {
- gtk_path_bar_remove_1 (container, widget);
- priv->button_list = g_list_remove_link (priv->button_list, children);
- g_list_free (children);
- return;
- }
-
- children = children->next;
- }
-}
-
-static void
-gtk_path_bar_forall (GtkContainer *container,
- GtkCallback callback,
- gpointer callback_data)
-{
- GtkPathBar *path_bar = GTK_PATH_BAR (container);
- GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (path_bar);
- GList *children;
-
- g_return_if_fail (callback != NULL);
-
- children = priv->button_list;
- while (children)
- {
- GtkWidget *child;
- child = BUTTON_DATA (children->data)->button;
- children = children->next;
-
- (* callback) (child, callback_data);
- }
-
- if (priv->up_slider_button)
- (* callback) (priv->up_slider_button, callback_data);
-
- if (priv->down_slider_button)
- (* callback) (priv->down_slider_button, callback_data);
-}
-
-static void
gtk_path_bar_scroll_down (GtkPathBar *path_bar)
{
GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (path_bar);
@@ -863,74 +740,25 @@ gtk_path_bar_scroll_up (GtkPathBar *path_bar)
}
}
-static gboolean
-gtk_path_bar_slider_up_defocus (GtkWidget *widget,
- GdkEvent *event,
- GtkPathBar *path_bar)
+static void
+gtk_path_bar_clear_buttons (GtkPathBar *self)
{
- GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (path_bar);
- GList *list;
- GList *up_button = NULL;
-
- if (gdk_event_get_event_type (event) != GDK_FOCUS_CHANGE)
- return FALSE;
+ GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (self);
+ GtkWidget *w;
- for (list = g_list_last (priv->button_list); list; list = list->prev)
+ w = gtk_widget_get_first_child (GTK_WIDGET (self));
+ while (w)
{
- if (gtk_widget_get_child_visible (BUTTON_DATA (list->data)->button))
- {
- up_button = list;
- break;
- }
- }
-
- /* don't let the focus vanish */
- if ((!gtk_widget_is_sensitive (priv->up_slider_button)) ||
- (!gtk_widget_get_child_visible (priv->up_slider_button)))
- gtk_widget_grab_focus (BUTTON_DATA (up_button->data)->button);
-
- return FALSE;
-}
-
-static gboolean
-gtk_path_bar_slider_down_defocus (GtkWidget *widget,
- GdkEvent *event,
- GtkPathBar *path_bar)
-{
- GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (path_bar);
- GList *list;
- GList *down_button = NULL;
-
- if (gdk_event_get_event_type (event) != GDK_FOCUS_CHANGE)
- return FALSE;
+ GtkWidget *next = gtk_widget_get_next_sibling (w);
- for (list = priv->button_list; list; list = list->next)
- {
- if (gtk_widget_get_child_visible (BUTTON_DATA (list->data)->button))
+ if (w != priv->up_slider_button && w != priv->down_slider_button)
{
- down_button = list;
- break;
+ gtk_widget_unparent (w);
}
- }
-
- /* don't let the focus vanish */
- if ((!gtk_widget_is_sensitive (priv->down_slider_button)) ||
- (!gtk_widget_get_child_visible (priv->down_slider_button)))
- gtk_widget_grab_focus (BUTTON_DATA (down_button->data)->button);
-
- return FALSE;
-}
-
-/* Public functions and their helpers */
-static void
-gtk_path_bar_clear_buttons (GtkPathBar *path_bar)
-{
- GtkPathBarPrivate *priv = gtk_path_bar_get_instance_private (path_bar);
- while (priv->button_list != NULL)
- {
- gtk_container_remove (GTK_CONTAINER (path_bar), BUTTON_DATA (priv->button_list->data)->button);
+ w = next;
}
+
priv->first_scrolled_button = NULL;
priv->fake_root = NULL;
}
@@ -1332,23 +1160,16 @@ gtk_path_bar_set_file_finish (struct SetFileInfo *info,
if (result)
{
GList *l;
- GtkCssNode *prev;
gtk_path_bar_clear_buttons (info->path_bar);
priv->button_list = g_list_reverse (info->new_buttons);
priv->fake_root = info->fake_root;
- prev = gtk_widget_get_css_node (priv->down_slider_button);
for (l = priv->button_list; l; l = l->next)
{
GtkWidget *button = BUTTON_DATA (l->data)->button;
- GtkCssNode *node = gtk_widget_get_css_node (button);
- gtk_css_node_insert_before (gtk_widget_get_css_node (GTK_WIDGET (info->path_bar)),
- node,
- prev);
- gtk_container_add (GTK_CONTAINER (info->path_bar), button);
- prev = node;
+ gtk_widget_insert_after (button, GTK_WIDGET (info->path_bar), priv->up_slider_button);
}
}
else
@@ -1356,12 +1177,11 @@ gtk_path_bar_set_file_finish (struct SetFileInfo *info,
GList *l;
for (l = info->new_buttons; l; l = l->next)
- {
- ButtonData *button_data;
+ {
+ ButtonData *button_data = BUTTON_DATA (l->data);
- button_data = BUTTON_DATA (l->data);
- gtk_widget_destroy (button_data->button);
- }
+ gtk_widget_unparent (button_data->button);
+ }
g_list_free (info->new_buttons);
}
diff --git a/gtk/gtkpathbar.h b/gtk/gtkpathbar.h
index 6f8c105246..52a2df2deb 100644
--- a/gtk/gtkpathbar.h
+++ b/gtk/gtkpathbar.h
@@ -36,12 +36,12 @@ typedef struct _GtkPathBarClass GtkPathBarClass;
struct _GtkPathBar
{
- GtkContainer parent_instance;
+ GtkWidget parent_instance;
};
struct _GtkPathBarClass
{
- GtkContainerClass parent_class;
+ GtkWidgetClass parent_class;
void (* path_clicked) (GtkPathBar *path_bar,
GFile *file,
diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c
index 1e50e8cc02..8e0eda0ac6 100644
--- a/gtk/gtkplacessidebar.c
+++ b/gtk/gtkplacessidebar.c
@@ -45,7 +45,7 @@
#include "gtksettings.h"
#include "gtktrashmonitor.h"
#include "gtktypebuiltins.h"
-#include "gtkpopover.h"
+#include "gtkpopovermenu.h"
#include "gtkgrid.h"
#include "gtklabel.h"
#include "gtkbutton.h"
@@ -1004,6 +1004,7 @@ update_places (GtkPlacesSidebar *sidebar)
gchar *tooltip;
GList *network_mounts, *network_volumes;
GIcon *new_bookmark_icon;
+ GList *children;
#ifdef HAVE_CLOUDPROVIDERS
GList *cloud_providers;
GList *cloud_providers_accounts;
@@ -1026,9 +1027,10 @@ update_places (GtkPlacesSidebar *sidebar)
/* Reset drag state, just in case we update the places while dragging or
* ending a drag */
stop_drop_feedback (sidebar);
- gtk_container_foreach (GTK_CONTAINER (sidebar->list_box),
- (GtkCallback) gtk_widget_destroy,
- NULL);
+ children = gtk_container_get_children (GTK_CONTAINER (sidebar->list_box));
+ for (l = children; l; l = l->next)
+ gtk_container_remove (GTK_CONTAINER (sidebar->list_box), l->data);
+ g_list_free (children);
network_mounts = network_volumes = NULL;
@@ -1696,7 +1698,8 @@ stop_drop_feedback (GtkPlacesSidebar *sidebar)
if (sidebar->row_placeholder != NULL)
{
- gtk_widget_destroy (sidebar->row_placeholder);
+ if (gtk_widget_get_parent (sidebar->row_placeholder) != NULL)
+ gtk_container_remove (GTK_CONTAINER (sidebar), sidebar->row_placeholder);
sidebar->row_placeholder = NULL;
}
@@ -2076,150 +2079,6 @@ check_unmount_and_eject (GMount *mount,
}
static void
-check_visibility (GMount *mount,
- GVolume *volume,
- GDrive *drive,
- gboolean *show_mount,
- gboolean *show_unmount,
- gboolean *show_eject,
- gboolean *show_rescan,
- gboolean *show_start,
- gboolean *show_stop)
-{
- *show_mount = FALSE;
- *show_rescan = FALSE;
- *show_start = FALSE;
- *show_stop = FALSE;
-
- check_unmount_and_eject (mount, volume, drive, show_unmount, show_eject);
-
- if (drive != NULL)
- {
- if (g_drive_is_media_removable (drive) &&
- !g_drive_is_media_check_automatic (drive) &&
- g_drive_can_poll_for_media (drive))
- *show_rescan = TRUE;
-
- *show_start = g_drive_can_start (drive) || g_drive_can_start_degraded (drive);
- *show_stop = g_drive_can_stop (drive);
-
- if (*show_stop)
- *show_unmount = FALSE;
- }
-
- if (volume != NULL)
- {
- if (mount == NULL)
- *show_mount = g_volume_can_mount (volume);
- }
-}
-
-typedef struct {
- GtkWidget *add_shortcut_item;
- GtkWidget *remove_item;
- GtkWidget *rename_item;
- GtkWidget *separator_item;
- GtkWidget *mount_item;
- GtkWidget *unmount_item;
- GtkWidget *eject_item;
- GtkWidget *rescan_item;
- GtkWidget *start_item;
- GtkWidget *stop_item;
-} PopoverData;
-
-static void
-check_popover_sensitivity (GtkSidebarRow *row,
- PopoverData *data)
-{
- gboolean show_mount;
- gboolean show_unmount;
- gboolean show_eject;
- gboolean show_rescan;
- gboolean show_start;
- gboolean show_stop;
- GtkPlacesSidebarPlaceType type;
- GDrive *drive;
- GVolume *volume;
- GMount *mount;
- GtkPlacesSidebar *sidebar;
- GAction *action;
-
- g_object_get (row,
- "sidebar", &sidebar,
- "place-type", &type,
- "drive", &drive,
- "volume", &volume,
- "mount", &mount,
- NULL);
-
- gtk_widget_set_visible (data->add_shortcut_item, (type == PLACES_MOUNTED_VOLUME));
-
- action = g_action_map_lookup_action (G_ACTION_MAP (sidebar->row_actions), "remove");
- g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (type == PLACES_BOOKMARK));
- action = g_action_map_lookup_action (G_ACTION_MAP (sidebar->row_actions), "rename");
- g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (type == PLACES_BOOKMARK ||
- type == PLACES_XDG_DIR));
- action = g_action_map_lookup_action (G_ACTION_MAP (sidebar->row_actions), "open");
- g_simple_action_set_enabled (G_SIMPLE_ACTION (action), !gtk_list_box_row_is_selected (GTK_LIST_BOX_ROW (row)));
-
- check_visibility (mount, volume, drive,
- &show_mount, &show_unmount, &show_eject, &show_rescan, &show_start, &show_stop);
-
- gtk_widget_set_visible (data->separator_item, show_mount || show_unmount || show_eject);
- gtk_widget_set_visible (data->mount_item, show_mount);
- gtk_widget_set_visible (data->unmount_item, show_unmount);
- gtk_widget_set_visible (data->eject_item, show_eject);
- gtk_widget_set_visible (data->rescan_item, show_rescan);
- gtk_widget_set_visible (data->start_item, show_start);
- gtk_widget_set_visible (data->stop_item, show_stop);
-
- /* Adjust start/stop items to reflect the type of the drive */
- g_object_set (data->start_item, "text", _("_Start"), NULL);
- g_object_set (data->stop_item, "text", _("_Stop"), NULL);
- if ((show_start || show_stop) && drive != NULL)
- {
- switch (g_drive_get_start_stop_type (drive))
- {
- case G_DRIVE_START_STOP_TYPE_SHUTDOWN:
- /* start() for type G_DRIVE_START_STOP_TYPE_SHUTDOWN is normally not used */
- g_object_set (data->start_item, "text", _("_Power On"), NULL);
- g_object_set (data->stop_item, "text", _("_Safely Remove Drive"), NULL);
- break;
-
- case G_DRIVE_START_STOP_TYPE_NETWORK:
- g_object_set (data->start_item, "text", _("_Connect Drive"), NULL);
- g_object_set (data->stop_item, "text", _("_Disconnect Drive"), NULL);
- break;
-
- case G_DRIVE_START_STOP_TYPE_MULTIDISK:
- g_object_set (data->start_item, "text", _("_Start Multi-disk Device"), NULL);
- g_object_set (data->stop_item, "text", _("_Stop Multi-disk Device"), NULL);
- break;
-
- case G_DRIVE_START_STOP_TYPE_PASSWORD:
- /* stop() for type G_DRIVE_START_STOP_TYPE_PASSWORD is normally not used */
- g_object_set (data->start_item, "text", _("_Unlock Device"), NULL);
- g_object_set (data->stop_item, "text", _("_Lock Device"), NULL);
- break;
-
- default:
- case G_DRIVE_START_STOP_TYPE_UNKNOWN:
- /* uses defaults set above */
- break;
- }
- }
-
- if (drive)
- g_object_unref (drive);
- if (volume)
- g_object_unref (volume);
- if (mount)
- g_object_unref (mount);
-
- g_object_unref (sidebar);
-}
-
-static void
drive_start_from_bookmark_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
@@ -3368,67 +3227,6 @@ static GActionEntry entries[] = {
};
static void
-add_actions (GtkPlacesSidebar *sidebar)
-{
- sidebar->row_actions = G_ACTION_GROUP (g_simple_action_group_new ());
- g_action_map_add_action_entries (G_ACTION_MAP (sidebar->row_actions),
- entries, G_N_ELEMENTS (entries),
- sidebar);
- gtk_widget_insert_action_group (GTK_WIDGET (sidebar), "row", sidebar->row_actions);
-}
-
-static GtkWidget *
-append_separator (GtkWidget *box)
-{
- GtkWidget *separator;
-
- separator = g_object_new (GTK_TYPE_SEPARATOR,
- "orientation", GTK_ORIENTATION_HORIZONTAL,
- "visible", TRUE,
- "margin-top", 6,
- "margin-bottom", 6,
- NULL);
- gtk_container_add (GTK_CONTAINER (box), separator);
-
- return separator;
-}
-
-static GtkWidget *
-add_button (GtkWidget *box,
- const gchar *label,
- const gchar *action)
-{
- GtkWidget *item;
-
- item = g_object_new (GTK_TYPE_MODEL_BUTTON,
- "visible", TRUE,
- "action-name", action,
- "text", label,
- NULL);
- gtk_container_add (GTK_CONTAINER (box), item);
-
- return item;
-}
-
-static GtkWidget *
-add_open_button (GtkWidget *box,
- const gchar *label,
- GtkPlacesOpenFlags flags)
-{
- GtkWidget *item;
-
- item = g_object_new (GTK_TYPE_MODEL_BUTTON,
- "visible", TRUE,
- "action-name", flags == GTK_PLACES_OPEN_NORMAL ? "row.open" : "row.open-other",
- "action-target", g_variant_new_int32 (flags),
- "text", label,
- NULL);
- gtk_container_add (GTK_CONTAINER (box), item);
-
- return item;
-}
-
-static void
on_row_popover_destroy (GtkWidget *row_popover,
GtkPlacesSidebar *sidebar)
{
@@ -3473,16 +3271,15 @@ build_popup_menu_using_gmenu (GtkSidebarRow *row)
}
cloud_provider_menu = cloud_providers_account_get_menu_model (cloud_provider_account);
cloud_provider_action_group = cloud_providers_account_get_action_group (cloud_provider_account);
- if (cloud_provider_menu != NULL && cloud_provider_action_group != NULL)
+ if (cloud_provider_menu != NULL && cloud_p:laurovider_action_group != NULL)
{
g_menu_append_section (menu, NULL, cloud_provider_menu);
gtk_widget_insert_action_group (GTK_WIDGET (sidebar),
"cloudprovider",
G_ACTION_GROUP (cloud_provider_action_group));
}
- add_actions (sidebar);
if (sidebar->popover)
- gtk_widget_destroy (sidebar->popover);
+ gtk_widget_unparent (sidebar->popover);
sidebar->popover = gtk_popover_new_from_model (GTK_WIDGET (sidebar),
G_MENU_MODEL (menu));
@@ -3499,8 +3296,24 @@ static void
create_row_popover (GtkPlacesSidebar *sidebar,
GtkSidebarRow *row)
{
- PopoverData data;
- GtkWidget *box;
+ GtkPlacesSidebarPlaceType type;
+ GMenu *menu, *section;
+ GMenuItem *item;
+ GMount *mount;
+ GVolume *volume;
+ GDrive *drive;
+ GAction *action;
+ gboolean show_unmount, show_eject;
+ gboolean show_stop;
+
+ g_object_get (row,
+ "place-type", &type,
+ "drive", &drive,
+ "volume", &volume,
+ "mount", &mount,
+ NULL);
+
+ check_unmount_and_eject (mount, volume, drive, &show_unmount, &show_eject);
#ifdef HAVE_CLOUDPROVIDERS
CloudProvidersAccount *cloud_provider_account;
@@ -3514,42 +3327,135 @@ create_row_popover (GtkPlacesSidebar *sidebar,
}
#endif
- sidebar->popover = gtk_popover_new ();
- gtk_widget_set_parent (sidebar->popover, GTK_WIDGET (sidebar));
- /* Clean sidebar pointer when its destroyed, most of the times due to its
- * relative_to associated row being destroyed */
- g_signal_connect (sidebar->popover, "destroy", G_CALLBACK (on_row_popover_destroy), sidebar);
- setup_popover_shadowing (sidebar->popover);
- box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- g_object_set (box, "margin", 10, NULL);
- gtk_widget_show (box);
- gtk_container_add (GTK_CONTAINER (sidebar->popover), box);
+ action = g_action_map_lookup_action (G_ACTION_MAP (sidebar->row_actions), "remove");
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (type == PLACES_BOOKMARK));
+ action = g_action_map_lookup_action (G_ACTION_MAP (sidebar->row_actions), "rename");
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (type == PLACES_BOOKMARK ||
+ type == PLACES_XDG_DIR));
+ action = g_action_map_lookup_action (G_ACTION_MAP (sidebar->row_actions), "open");
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action), !gtk_list_box_row_is_selected (GTK_LIST_BOX_ROW (row)));
- add_open_button (box, _("_Open"), GTK_PLACES_OPEN_NORMAL);
+ menu = g_menu_new ();
+ section = g_menu_new ();
+
+ item = g_menu_item_new (_("_Open"), "row.open");
+ g_menu_item_set_action_and_target_value (item, "row.open",
+ g_variant_new_int32 (GTK_PLACES_OPEN_NORMAL));
+ g_menu_append_item (section, item);
+ g_object_unref (item);
if (sidebar->open_flags & GTK_PLACES_OPEN_NEW_TAB)
- add_open_button (box, _("Open in New _Tab"), GTK_PLACES_OPEN_NEW_TAB);
+ {
+ item = g_menu_item_new (_("_Open in New _Tab"), "row.open");
+ g_menu_item_set_action_and_target_value (item, "row.open",
+ g_variant_new_int32 (GTK_PLACES_OPEN_NEW_TAB));
+ g_menu_append_item (section, item);
+ g_object_unref (item);
+ }
if (sidebar->open_flags & GTK_PLACES_OPEN_NEW_WINDOW)
- add_open_button (box, _("Open in New _Window"), GTK_PLACES_OPEN_NEW_WINDOW);
+ {
+ item = g_menu_item_new (_("_Open in New _Tab"), "row.open");
+ g_menu_item_set_action_and_target_value (item, "row.open",
+ g_variant_new_int32 (GTK_PLACES_OPEN_NEW_WINDOW));
+ g_menu_append_item (section, item);
+ g_object_unref (item);
+ }
- append_separator (box);
+ g_menu_append_section (menu, NULL, G_MENU_MODEL (section));
+ g_object_unref (section);
- data.add_shortcut_item = add_button (box, _("_Add Bookmark"), "row.bookmark");
- data.remove_item = add_button (box, _("_Remove"), "row.remove");
- data.rename_item = add_button (box, _("Rename…"), "row.rename");
+ section = g_menu_new ();
+ item = g_menu_item_new (_("_Add Bookmark"), "row.add-bookmark");
+ g_menu_append_item (section, item);
+ g_object_unref (item);
- data.separator_item = append_separator (box);
+ item = g_menu_item_new (_("_Remove"), "row.remove");
+ g_menu_append_item (section, item);
+ g_object_unref (item);
- data.mount_item = add_button (box, _("_Mount"), "row.mount");
- data.unmount_item = add_button (box, _("_Unmount"), "row.unmount");
- data.eject_item = add_button (box, _("_Eject"), "row.eject");
- data.rescan_item = add_button (box, _("_Detect Media"), "row.rescan");
- data.start_item = add_button (box, _("_Start"), "row.start");
- data.stop_item = add_button (box, _("_Stop"), "row.stop");
+ item = g_menu_item_new (_("_Rename"), "row.rename");
+ g_menu_append_item (section, item);
+ g_object_unref (item);
- /* Update everything! */
- check_popover_sensitivity (row, &data);
+ g_menu_append_section (menu, NULL, G_MENU_MODEL (section));
+ g_object_unref (section);
+
+ section = g_menu_new ();
+
+ if (volume != NULL && mount == NULL &&
+ g_volume_can_mount (volume))
+ {
+ item = g_menu_item_new (_("_Mount"), "row.mount");
+ g_menu_append_item (section, item);
+ g_object_unref (item);
+ }
+
+ show_stop = (drive != NULL && g_drive_can_stop (drive));
+
+ if (show_unmount && !show_stop)
+ {
+ item = g_menu_item_new (_("_Unmount"), "row.unmount");
+ g_menu_append_item (section, item);
+ g_object_unref (item);
+ }
+
+ if (show_eject)
+ {
+ item = g_menu_item_new (_("_Eject"), "row.eject");
+ g_menu_append_item (section, item);
+ g_object_unref (item);
+ }
+
+ if (drive != NULL &&
+ g_drive_is_media_removable (drive) &&
+ !g_drive_is_media_check_automatic (drive) &&
+ g_drive_can_poll_for_media (drive))
+ {
+ item = g_menu_item_new (_("_Detect Media"), "row.rescan");
+ g_menu_append_item (section, item);
+ g_object_unref (item);
+ }
+
+ if (drive != NULL &&
+ (g_drive_can_start (drive) || g_drive_can_start_degraded (drive)))
+ {
+ const guint ss_type = g_drive_get_start_stop_type (drive);
+ const char *start_label = _("_Start");
+
+ if (ss_type == G_DRIVE_START_STOP_TYPE_SHUTDOWN) start_label = _("_Power On");
+ else if (ss_type == G_DRIVE_START_STOP_TYPE_NETWORK) start_label = _("_Connect Drive");
+ else if (ss_type == G_DRIVE_START_STOP_TYPE_MULTIDISK) start_label = _("_Start Multi-disk Device");
+ else if (ss_type == G_DRIVE_START_STOP_TYPE_PASSWORD) start_label = _("_Unlock Device");
+
+ item = g_menu_item_new (start_label, "row.start");
+ g_menu_append_item (section, item);
+ g_object_unref (item);
+ }
+
+ if (show_stop && !show_unmount)
+ {
+ const guint ss_type = g_drive_get_start_stop_type (drive);
+ const char *stop_label = _("_Stop");
+
+ if (ss_type == G_DRIVE_START_STOP_TYPE_SHUTDOWN) stop_label = _("_Safely Remove Drive");
+ else if (ss_type == G_DRIVE_START_STOP_TYPE_NETWORK) stop_label = _("_Disconnect Drive");
+ else if (ss_type == G_DRIVE_START_STOP_TYPE_MULTIDISK) stop_label = _("Stop Multi-disk Device");
+ else if (ss_type == G_DRIVE_START_STOP_TYPE_PASSWORD) stop_label = _("_Lock Device");
+
+ item = g_menu_item_new (stop_label, "row.stop");
+ g_menu_append_item (section, item);
+ g_object_unref (item);
+ }
+
+ g_menu_append_section (menu, NULL, G_MENU_MODEL (section));
+ g_object_unref (section);
+
+ sidebar->popover = gtk_popover_menu_new_from_model (G_MENU_MODEL (menu));
+ g_object_unref (menu);
+ g_signal_connect (sidebar->popover, "destroy", G_CALLBACK (on_row_popover_destroy), sidebar);
+
+ setup_popover_shadowing (sidebar->popover);
}
static void
@@ -3696,7 +3602,7 @@ on_row_dragged (GtkGestureDrag *gesture,
sidebar->dragging_over = TRUE;
content = gdk_content_provider_new_typed (GTK_TYPE_SIDEBAR_ROW, sidebar->drag_row);
-
+
surface = gtk_native_get_surface (gtk_widget_get_native (GTK_WIDGET (sidebar)));
device = gtk_gesture_get_device (GTK_GESTURE (gesture));
@@ -3710,6 +3616,7 @@ on_row_dragged (GtkGestureDrag *gesture,
gtk_widget_hide (sidebar->drag_row);
drag_widget = GTK_WIDGET (gtk_sidebar_row_clone (GTK_SIDEBAR_ROW (sidebar->drag_row)));
+ g_object_ref_sink (drag_widget);
sidebar->drag_row_height = allocation.height;
gtk_widget_set_size_request (drag_widget, allocation.width, allocation.height);
@@ -3719,7 +3626,7 @@ on_row_dragged (GtkGestureDrag *gesture,
gtk_drag_icon_set_from_paintable (drag, paintable, sidebar->drag_row_x, sidebar->drag_row_y);
g_object_unref (paintable);
- g_object_set_data_full (G_OBJECT (drag), "row-widget", drag_widget, (GDestroyNotify)gtk_widget_destroy);
+ g_object_set_data_full (G_OBJECT (drag), "row-widget", drag_widget, (GDestroyNotify)g_object_unref);
g_object_unref (drag);
}
@@ -4062,7 +3969,11 @@ gtk_places_sidebar_init (GtkPlacesSidebar *sidebar)
/* populate the sidebar */
update_places (sidebar);
- add_actions (sidebar);
+ sidebar->row_actions = G_ACTION_GROUP (g_simple_action_group_new ());
+ g_action_map_add_action_entries (G_ACTION_MAP (sidebar->row_actions),
+ entries, G_N_ELEMENTS (entries),
+ sidebar);
+ gtk_widget_insert_action_group (GTK_WIDGET (sidebar), "row", sidebar->row_actions);
}
static void
@@ -4186,15 +4097,11 @@ gtk_places_sidebar_dispose (GObject *object)
sidebar->bookmarks_manager = NULL;
}
- if (sidebar->popover)
- {
- gtk_widget_destroy (sidebar->popover);
- sidebar->popover = NULL;
- }
+ g_clear_pointer (&sidebar->popover, gtk_widget_unparent);
if (sidebar->rename_popover)
{
- gtk_widget_destroy (sidebar->rename_popover);
+ gtk_widget_unparent (sidebar->rename_popover);
sidebar->rename_popover = NULL;
sidebar->rename_entry = NULL;
sidebar->rename_button = NULL;
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index f928041973..404bdc9b1d 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -1155,11 +1155,9 @@ static void
gtk_popover_update_shape (GtkPopover *popover)
{
GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
- GtkWidget *widget = GTK_WIDGET (popover);
if (priv->has_arrow)
{
-
cairo_surface_t *cairo_surface;
cairo_region_t *region;
cairo_t *cr;
@@ -1177,11 +1175,11 @@ gtk_popover_update_shape (GtkPopover *popover)
region = gdk_cairo_region_create_from_surface (cairo_surface);
cairo_surface_destroy (cairo_surface);
- gtk_widget_input_shape_combine_region (widget, region);
+ gdk_surface_input_shape_combine_region (priv->surface, region, 0, 0);
cairo_region_destroy (region);
}
else
- gtk_widget_input_shape_combine_region (widget, NULL);
+ gdk_surface_input_shape_combine_region (priv->surface, NULL, 0, 0);
}
static gint
diff --git a/gtk/gtkpopovermenu.c b/gtk/gtkpopovermenu.c
index 584a5c5f14..d9779bd2f7 100644
--- a/gtk/gtkpopovermenu.c
+++ b/gtk/gtkpopovermenu.c
@@ -604,7 +604,7 @@ gtk_popover_menu_set_menu_model (GtkPopoverMenu *popover,
stack = gtk_bin_get_child (GTK_BIN (popover));
while ((child = gtk_widget_get_first_child (stack)))
- gtk_widget_destroy (child);
+ gtk_container_remove (GTK_CONTAINER (stack), child);
if (model)
gtk_menu_section_box_new_toplevel (popover, model, popover->flags);
diff --git a/gtk/gtkpopovermenubar.c b/gtk/gtkpopovermenubar.c
index 00362a11e4..5adec80cba 100644
--- a/gtk/gtkpopovermenubar.c
+++ b/gtk/gtkpopovermenubar.c
@@ -369,7 +369,7 @@ tracker_remove (gint position,
{
if (i == position)
{
- gtk_widget_destroy (child);
+ gtk_widget_unparent (child);
break;
}
}
@@ -480,7 +480,7 @@ gtk_popover_menu_bar_dispose (GObject *object)
g_clear_object (&bar->model);
while ((child = gtk_widget_get_first_child (GTK_WIDGET (bar))))
- gtk_widget_destroy (child);
+ gtk_widget_unparent (child);
G_OBJECT_CLASS (gtk_popover_menu_bar_parent_class)->dispose (object);
}
@@ -651,7 +651,7 @@ gtk_popover_menu_bar_set_menu_model (GtkPopoverMenuBar *bar,
GtkActionMuxer *muxer;
while ((child = gtk_widget_get_first_child (GTK_WIDGET (bar))))
- gtk_widget_destroy (child);
+ gtk_widget_unparent (child);
g_clear_pointer (&bar->tracker, gtk_menu_tracker_free);
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index a09d8b6e8a..7ab475d2a3 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -204,7 +204,6 @@ static void gtk_range_compute_slider_position (GtkRange *range,
GdkRectangle *slider_rect);
static gboolean gtk_range_scroll (GtkRange *range,
GtkScrollType scroll);
-static void gtk_range_calc_slider (GtkRange *range);
static void gtk_range_calc_marks (GtkRange *range);
static void gtk_range_adjustment_value_changed (GtkAdjustment *adjustment,
gpointer data);
@@ -2299,11 +2298,18 @@ gtk_range_drag_gesture_begin (GtkGestureDrag *gesture,
static void
gtk_range_adjustment_changed (GtkAdjustment *adjustment,
- gpointer data)
+ gpointer data)
{
GtkRange *range = GTK_RANGE (data);
+ GtkRangePrivate *priv = gtk_range_get_instance_private (range);
- gtk_range_calc_slider (range);
+ if (gtk_adjustment_get_upper (priv->adjustment) == gtk_adjustment_get_lower (priv->adjustment) &&
+ GTK_IS_SCALE (range))
+ gtk_widget_hide (priv->slider_widget);
+ else
+ gtk_widget_show (priv->slider_widget);
+
+ gtk_widget_queue_allocate (priv->trough_widget);
/* Note that we don't round off to priv->round_digits here.
* that's because it's really broken to change a value
@@ -2521,9 +2527,6 @@ gtk_range_scroll (GtkRange *range,
break;
case GTK_SCROLL_JUMP:
- /* Used by CList, range doesn't use it. */
- break;
-
case GTK_SCROLL_NONE:
default:
break;
@@ -2546,11 +2549,11 @@ gtk_range_compute_slider_position (GtkRange *range,
GdkRectangle *slider_rect)
{
GtkRangePrivate *priv = gtk_range_get_instance_private (range);
- int trough_width, trough_height;
- int slider_width, slider_height, min_slider_size;
const double upper = gtk_adjustment_get_upper (priv->adjustment);
const double lower = gtk_adjustment_get_lower (priv->adjustment);
const double page_size = gtk_adjustment_get_page_size (priv->adjustment);
+ int trough_width, trough_height;
+ int slider_width, slider_height;
gtk_widget_measure (priv->slider_widget,
GTK_ORIENTATION_HORIZONTAL, -1,
@@ -2566,112 +2569,77 @@ gtk_range_compute_slider_position (GtkRange *range,
if (priv->orientation == GTK_ORIENTATION_VERTICAL)
{
- gint y, bottom, top, height;
-
- /* Slider fits into the trough, with stepper_spacing on either side,
- * and the size/position based on the adjustment or fixed, depending.
- */
+ int y, height;
+
slider_rect->x = (int) floor ((trough_width - slider_width) / 2);
slider_rect->width = slider_width;
- min_slider_size = slider_height;
-
- /* Compute slider position/length */
- top = 0;
- bottom = top + trough_height;
-
/* slider height is the fraction (page_size /
* total_adjustment_range) times the trough height in pixels
*/
if (upper - lower != 0)
- height = (bottom - top) * (page_size / (upper - lower));
+ height = trough_height * (page_size / (upper - lower));
else
- height = min_slider_size;
+ height = slider_height;
- if (height < min_slider_size ||
+ if (height < slider_height ||
priv->slider_size_fixed)
- height = min_slider_size;
+ height = slider_height;
height = MIN (height, trough_height);
-
- y = top;
if (upper - lower - page_size != 0)
- y += (bottom - top - height) * ((adjustment_value - lower) / (upper - lower - page_size));
+ y = (trough_height - height) * ((adjustment_value - lower) / (upper - lower - page_size));
+ else
+ y = 0;
+
+ y = CLAMP (y, 0, trough_height);
- y = CLAMP (y, top, bottom);
-
if (should_invert (range))
- y = bottom - (y - top + height);
-
+ y = trough_height - y - height;
+
slider_rect->y = y;
slider_rect->height = height;
}
else
{
- gint x, left, right, width;
-
- /* Slider fits into the trough, with stepper_spacing on either side,
- * and the size/position based on the adjustment or fixed, depending.
- */
+ int x, width;
+
slider_rect->y = (int) floor ((trough_height - slider_height) / 2);
slider_rect->height = slider_height;
- min_slider_size = slider_width;
-
- /* Compute slider position/length */
- left = 0;
- right = left + trough_width;
-
/* slider width is the fraction (page_size /
* total_adjustment_range) times the trough width in pixels
*/
if (upper - lower != 0)
- width = (right - left) * (page_size / (upper - lower));
+ width = trough_width * (page_size / (upper - lower));
else
- width = min_slider_size;
+ width = slider_width;
- if (width < min_slider_size ||
+ if (width < slider_width ||
priv->slider_size_fixed)
- width = min_slider_size;
+ width = slider_width;
width = MIN (width, trough_width);
- x = left;
-
if (upper - lower - page_size != 0)
- x += (right - left - width) * ((adjustment_value - lower) / (upper - lower - page_size));
-
- x = CLAMP (x, left, right);
-
+ x = (trough_width - width) * ((adjustment_value - lower) / (upper - lower - page_size));
+ else
+ x = 0;
+
+ x = CLAMP (x, 0, trough_width);
+
if (should_invert (range))
- x = right - (x - left + width);
-
+ x = trough_width - x - width;
+
slider_rect->x = x;
slider_rect->width = width;
}
}
static void
-gtk_range_calc_slider (GtkRange *range)
-{
- GtkRangePrivate *priv = gtk_range_get_instance_private (range);
- gboolean visible;
-
- if (GTK_IS_SCALE (range) &&
- gtk_adjustment_get_upper (priv->adjustment) == gtk_adjustment_get_lower (priv->adjustment))
- visible = FALSE;
- else
- visible = TRUE;
-
- gtk_widget_set_visible (priv->slider_widget, visible);
-
- gtk_widget_queue_allocate (priv->trough_widget);
-}
-
-static void
gtk_range_calc_marks (GtkRange *range)
{
GtkRangePrivate *priv = gtk_range_get_instance_private (range);
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 71a8d2c53e..6debc150ae 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -1404,14 +1404,11 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
{
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
- GtkBin *bin;
GtkAllocation child_allocation;
GtkWidget *child;
gint sb_width;
gint sb_height;
- bin = GTK_BIN (scrolled_window);
-
/* Get possible scrollbar dimensions */
gtk_widget_measure (priv->vscrollbar, GTK_ORIENTATION_HORIZONTAL, -1,
&sb_width, NULL, NULL, NULL);
@@ -1430,7 +1427,7 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
priv->vscrollbar_policy == GTK_POLICY_EXTERNAL)
priv->vscrollbar_visible = FALSE;
- child = gtk_bin_get_child (bin);
+ child = gtk_bin_get_child (GTK_BIN (scrolled_window));
if (child && gtk_widget_get_visible (child))
{
gint child_scroll_width;
@@ -2069,7 +2066,6 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
GtkAdjustment *hadjustment)
{
GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
- GtkBin *bin;
GtkWidget *child;
g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
@@ -2079,8 +2075,6 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
else
hadjustment = (GtkAdjustment*) g_object_new (GTK_TYPE_ADJUSTMENT, NULL);
- bin = GTK_BIN (scrolled_window);
-
if (!priv->hscrollbar)
{
priv->hscrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
@@ -2121,7 +2115,7 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
gtk_scrolled_window_adjustment_changed (hadjustment, scrolled_window);
gtk_scrolled_window_adjustment_value_changed (hadjustment, scrolled_window);
- child = gtk_bin_get_child (bin);
+ child = gtk_bin_get_child (GTK_BIN (scrolled_window));
if (child)
gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (child), hadjustment);
@@ -2143,7 +2137,6 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
GtkAdjustment *vadjustment)
{
GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
- GtkBin *bin;
GtkWidget *child;
g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
@@ -2153,8 +2146,6 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
else
vadjustment = (GtkAdjustment*) g_object_new (GTK_TYPE_ADJUSTMENT, NULL);
- bin = GTK_BIN (scrolled_window);
-
if (!priv->vscrollbar)
{
priv->vscrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadjustment);
@@ -2195,7 +2186,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
gtk_scrolled_window_adjustment_changed (vadjustment, scrolled_window);
gtk_scrolled_window_adjustment_value_changed (vadjustment, scrolled_window);
- child = gtk_bin_get_child (bin);
+ child = gtk_bin_get_child (GTK_BIN (scrolled_window));
if (child)
gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (child), vadjustment);
@@ -3495,7 +3486,7 @@ gtk_scrolled_window_add (GtkContainer *container,
GtkAdjustment *hadj, *vadj;
bin = GTK_BIN (container);
- g_return_if_fail (gtk_bin_get_child (GTK_BIN (scrolled_window)) == NULL);
+ g_return_if_fail (gtk_bin_get_child (bin) == NULL);
/* gtk_scrolled_window_set_[hv]adjustment have the side-effect
* of creating the scrollbars
diff --git a/gtk/gtkshortcutlabel.c b/gtk/gtkshortcutlabel.c
index be430d88dd..704324fa8c 100644
--- a/gtk/gtkshortcutlabel.c
+++ b/gtk/gtkshortcutlabel.c
@@ -22,8 +22,6 @@
#include "gtkboxlayout.h"
#include "gtklabel.h"
#include "gtkframe.h"
-#include "gtkstylecontext.h"
-#include "gtkprivate.h"
#include "gtkintl.h"
/**
diff --git a/gtk/gtkstackswitcher.c b/gtk/gtkstackswitcher.c
index 979d0cdd11..48173692eb 100644
--- a/gtk/gtkstackswitcher.c
+++ b/gtk/gtkstackswitcher.c
@@ -136,7 +136,7 @@ rebuild_child (GtkWidget *self,
button_child = gtk_bin_get_child (GTK_BIN (self));
if (button_child != NULL)
- gtk_widget_destroy (button_child);
+ gtk_container_remove (GTK_CONTAINER (self), button_child);
button_child = NULL;
diff --git a/gtk/gtkstatusbar.c b/gtk/gtkstatusbar.c
index cf140118e2..a570dec71f 100644
--- a/gtk/gtkstatusbar.c
+++ b/gtk/gtkstatusbar.c
@@ -26,6 +26,7 @@
#include "config.h"
#include "gtkstatusbar.h"
+#include "gtkstatusbarprivate.h"
#include "gtkbinlayout.h"
#include "gtkframe.h"
@@ -501,7 +502,7 @@ gtk_statusbar_remove_all (GtkStatusbar *statusbar,
}
}
-/**
+/** < private >
* gtk_statusbar_get_message_area:
* @statusbar: a #GtkStatusbar
*
@@ -509,14 +510,14 @@ gtk_statusbar_remove_all (GtkStatusbar *statusbar,
*
* Returns: (type Gtk.Box) (transfer none): a #GtkBox
*/
-GtkWidget*
-gtk_statusbar_get_message_area (GtkStatusbar *statusbar)
+const char*
+gtk_statusbar_get_message (GtkStatusbar *statusbar)
{
GtkStatusbarPrivate *priv = gtk_statusbar_get_instance_private (statusbar);
g_return_val_if_fail (GTK_IS_STATUSBAR (statusbar), NULL);
- return priv->message_area;
+ return gtk_label_get_label (GTK_LABEL (priv->label));
}
static void
diff --git a/gtk/gtkstatusbar.h b/gtk/gtkstatusbar.h
index de63712c59..530f82e75f 100644
--- a/gtk/gtkstatusbar.h
+++ b/gtk/gtkstatusbar.h
@@ -62,9 +62,6 @@ GDK_AVAILABLE_IN_ALL
void gtk_statusbar_remove_all (GtkStatusbar *statusbar,
guint context_id);
-GDK_AVAILABLE_IN_ALL
-GtkWidget* gtk_statusbar_get_message_area (GtkStatusbar *statusbar);
-
G_END_DECLS
#endif /* __GTK_STATUSBAR_H__ */
diff --git a/gtk/gtkstatusbarprivate.h b/gtk/gtkstatusbarprivate.h
new file mode 100644
index 0000000000..4dc942726c
--- /dev/null
+++ b/gtk/gtkstatusbarprivate.h
@@ -0,0 +1,30 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ * GtkStatusbar Copyright (C) 1998 Shawn T. Amundson
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GTK_STATUSBAR_PRIVATE_H__
+#define __GTK_STATUSBAR_PRIVATE_H__
+
+#include "gtkwidget.h"
+
+G_BEGIN_DECLS
+
+const char * gtk_statusbar_get_message (GtkStatusbar *statusbar);
+
+G_END_DECLS
+
+#endif /* __GTK_STATUSBAR_H__ */
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index d15df4c1fd..944e6f303c 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -689,8 +689,6 @@ static void gtk_widget_set_usize_internal (GtkWidget *widget,
static gboolean event_surface_is_still_viewable (GdkEvent *event);
-static void gtk_widget_update_input_shape (GtkWidget *widget);
-
static gboolean gtk_widget_class_get_visible_by_default (GtkWidgetClass *widget_class);
static void remove_parent_surface_transform_changed_listener (GtkWidget *widget);
@@ -707,7 +705,6 @@ GtkTextDirection gtk_default_direction = GTK_TEXT_DIR_LTR;
static GQuark quark_accel_path = 0;
static GQuark quark_accel_closures = 0;
-static GQuark quark_input_shape_info = 0;
static GQuark quark_pango_context = 0;
static GQuark quark_mnemonic_labels = 0;
static GQuark quark_tooltip_markup = 0;
@@ -864,7 +861,6 @@ gtk_widget_class_init (GtkWidgetClass *klass)
quark_accel_path = g_quark_from_static_string ("gtk-accel-path");
quark_accel_closures = g_quark_from_static_string ("gtk-accel-closures");
- quark_input_shape_info = g_quark_from_static_string ("gtk-input-shape-info");
quark_pango_context = g_quark_from_static_string ("gtk-pango-context");
quark_mnemonic_labels = g_quark_from_static_string ("gtk-mnemonic-labels");
quark_tooltip_markup = g_quark_from_static_string ("gtk-tooltip-markup");
@@ -2413,7 +2409,6 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
priv->name = NULL;
priv->user_alpha = 255;
priv->alpha = 255;
- priv->surface = NULL;
priv->parent = NULL;
priv->first_child = NULL;
priv->last_child = NULL;
@@ -3532,13 +3527,23 @@ gtk_widget_remove_surface_transform_changed_callback (GtkWidget *widget,
}
}
+static GdkSurface *
+gtk_widget_get_surface (GtkWidget *widget)
+{
+ GtkNative *native = gtk_widget_get_native (widget);
+
+ if (native)
+ return gtk_native_get_surface (native);
+
+ return NULL;
+}
+
/**
* gtk_widget_realize:
* @widget: a #GtkWidget
*
* Creates the GDK (windowing system) resources associated with a
- * widget. For example, @widget->surface will be created when a widget
- * is realized. Normally realization happens implicitly; if you show
+ * widget. Normally realization happens implicitly; if you show
* a widget and all its parent containers, then the widget will be
* realized and mapped automatically.
*
@@ -3580,10 +3585,12 @@ gtk_widget_realize (GtkWidget *widget)
g_signal_emit (widget, widget_signals[REALIZE], 0);
- gtk_widget_update_input_shape (widget);
-
if (priv->multidevice)
- gdk_surface_set_support_multidevice (priv->surface, TRUE);
+ {
+ GdkSurface *surface = gtk_widget_get_surface (widget);
+
+ gdk_surface_set_support_multidevice (surface, TRUE);
+ }
gtk_widget_update_alpha (widget);
@@ -3602,7 +3609,7 @@ gtk_widget_realize (GtkWidget *widget)
*
* This function is only useful in widget implementations.
* Causes a widget to be unrealized (frees all GDK resources
- * associated with the widget, such as @widget->surface).
+ * associated with the widget).
**/
void
gtk_widget_unrealize (GtkWidget *widget)
@@ -3614,9 +3621,6 @@ gtk_widget_unrealize (GtkWidget *widget)
g_object_ref (widget);
gtk_widget_push_verify_invariants (widget);
- if (g_object_get_qdata (G_OBJECT (widget), quark_input_shape_info))
- gtk_widget_input_shape_combine_region (widget, NULL);
-
if (_gtk_widget_get_realized (widget))
{
if (priv->mapped)
@@ -3830,7 +3834,9 @@ gtk_widget_get_frame_clock (GtkWidget *widget)
if (priv->realized)
{
- return gdk_surface_get_frame_clock (priv->surface);
+ GdkSurface *surface = gtk_widget_get_surface (widget);
+
+ return gdk_surface_get_frame_clock (surface);
}
else
{
@@ -4362,12 +4368,16 @@ static gboolean
gtk_widget_real_can_activate_accel (GtkWidget *widget,
guint signal_id)
{
- GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+ GdkSurface *surface;
/* widgets must be onscreen for accels to take effect */
- return gtk_widget_is_sensitive (widget) &&
- _gtk_widget_get_mapped (widget) &&
- gdk_surface_is_viewable (priv->surface);
+ if (!gtk_widget_is_sensitive (widget) ||
+ !_gtk_widget_get_mapped (widget))
+ return FALSE;
+
+ surface = gtk_widget_get_surface (widget);
+
+ return gdk_surface_is_viewable (surface);
}
/**
@@ -6865,7 +6875,6 @@ _gtk_widget_scale_changed (GtkWidget *widget)
gint
gtk_widget_get_scale_factor (GtkWidget *widget)
{
- GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GtkRoot *root;
GdkDisplay *display;
GdkMonitor *monitor;
@@ -6873,7 +6882,12 @@ gtk_widget_get_scale_factor (GtkWidget *widget)
g_return_val_if_fail (GTK_IS_WIDGET (widget), 1);
if (_gtk_widget_get_realized (widget))
- return gdk_surface_get_scale_factor (priv->surface);
+ {
+ GdkSurface *surface = gtk_widget_get_surface (widget);
+
+ if (surface)
+ return gdk_surface_get_scale_factor (surface);
+ }
root = _gtk_widget_get_root (widget);
if (root && GTK_WIDGET (root) != widget)
@@ -7024,9 +7038,9 @@ gtk_widget_keynav_failed (GtkWidget *widget,
void
gtk_widget_error_bell (GtkWidget *widget)
{
- GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GtkSettings* settings;
gboolean beep;
+ GdkSurface *surface;
g_return_if_fail (GTK_IS_WIDGET (widget));
@@ -7034,12 +7048,14 @@ gtk_widget_error_bell (GtkWidget *widget)
if (!settings)
return;
+ surface = gtk_widget_get_surface (widget);
+
g_object_get (settings,
"gtk-error-bell", &beep,
NULL);
- if (beep && priv->surface)
- gdk_surface_beep (priv->surface);
+ if (beep && surface)
+ gdk_surface_beep (surface);
}
static void
@@ -7754,18 +7770,6 @@ gtk_widget_real_realize (GtkWidget *widget)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- if (GTK_IS_NATIVE (widget))
- {
- priv->surface = gtk_native_get_surface (GTK_NATIVE (widget));
- g_object_ref (priv->surface);
- }
- else
- {
- g_assert (priv->parent);
- priv->surface = priv->parent->priv->surface;
- g_object_ref (priv->surface);
- }
-
priv->realized = TRUE;
gtk_widget_connect_frame_clock (widget);
@@ -7797,8 +7801,6 @@ gtk_widget_real_unrealize (GtkWidget *widget)
gtk_widget_disconnect_frame_clock (widget);
priv->realized = FALSE;
-
- g_clear_object (&priv->surface);
}
void
@@ -7959,7 +7961,7 @@ _gtk_widget_synthesize_crossing (GtkWidget *from,
from_surface = _gtk_widget_get_device_surface (from, device);
if (!from_surface)
- from_surface = from->priv->surface;
+ from_surface = gtk_widget_get_surface (from);
gdk_surface_get_device_position (from_surface, device, &x, &y, NULL);
gtk_widget_handle_crossing (from, &crossing, x, y);
@@ -7969,7 +7971,7 @@ _gtk_widget_synthesize_crossing (GtkWidget *from,
{
to_surface = _gtk_widget_get_device_surface (to, device);
if (!to_surface)
- to_surface = to->priv->surface;
+ to_surface = gtk_widget_get_surface (to);
crossing.direction = GTK_CROSSING_IN;
gdk_surface_get_device_position (to_surface, device, &x, &y, NULL);
@@ -8074,85 +8076,6 @@ gtk_widget_propagate_state (GtkWidget *widget,
}
}
-static void
-gtk_widget_update_input_shape (GtkWidget *widget)
-{
- GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
-
- /* set shape if widget has a GDK surface already.
- * otherwise the shape is scheduled to be set by gtk_widget_realize().
- */
- if (priv->surface)
- {
- cairo_region_t *region;
- cairo_region_t *csd_region;
- cairo_region_t *app_region;
- gboolean free_region;
-
- app_region = g_object_get_qdata (G_OBJECT (widget), quark_input_shape_info);
- csd_region = g_object_get_data (G_OBJECT (widget), "csd-region");
-
- free_region = FALSE;
-
- if (app_region && csd_region)
- {
- free_region = TRUE;
- region = cairo_region_copy (app_region);
- cairo_region_intersect (region, csd_region);
- }
- else if (app_region)
- region = app_region;
- else if (csd_region)
- region = csd_region;
- else
- region = NULL;
-
- gdk_surface_input_shape_combine_region (priv->surface, region, 0, 0);
-
- if (free_region)
- cairo_region_destroy (region);
- }
-}
-
-void
-gtk_widget_set_csd_input_shape (GtkWidget *widget,
- const cairo_region_t *region)
-{
- if (region == NULL)
- g_object_set_data (G_OBJECT (widget), "csd-region", NULL);
- else
- g_object_set_data_full (G_OBJECT (widget), "csd-region",
- cairo_region_copy (region),
- (GDestroyNotify) cairo_region_destroy);
- gtk_widget_update_input_shape (widget);
-}
-
-/**
- * gtk_widget_input_shape_combine_region:
- * @widget: a #GtkWidget
- * @region: (allow-none): shape to be added, or %NULL to remove an existing shape
- *
- * Sets an input shape for this widget’s GDK surface. This allows for
- * windows which react to mouse click in a nonrectangular region, see
- * gdk_surface_input_shape_combine_region() for more information.
- **/
-void
-gtk_widget_input_shape_combine_region (GtkWidget *widget,
- cairo_region_t *region)
-{
- g_return_if_fail (GTK_IS_WIDGET (widget));
- /* set_shape doesn't work on widgets without GDK surface */
- g_return_if_fail (GTK_IS_NATIVE (widget));
-
- if (region == NULL)
- g_object_set_qdata (G_OBJECT (widget), quark_input_shape_info, NULL);
- else
- g_object_set_qdata_full (G_OBJECT (widget), quark_input_shape_info,
- cairo_region_copy (region),
- (GDestroyNotify) cairo_region_destroy);
- gtk_widget_update_input_shape (widget);
-}
-
/**
* gtk_requisition_new:
*
@@ -10728,7 +10651,12 @@ gtk_widget_set_support_multidevice (GtkWidget *widget,
priv->multidevice = (support_multidevice == TRUE);
if (_gtk_widget_get_realized (widget))
- gdk_surface_set_support_multidevice (priv->surface, support_multidevice);
+ {
+ GdkSurface *surface = gtk_widget_get_surface (widget);
+
+ if (surface)
+ gdk_surface_set_support_multidevice (surface, support_multidevice);
+ }
}
/* There are multiple alpha related sources. First of all the user can specify alpha
@@ -10761,7 +10689,7 @@ gtk_widget_update_alpha (GtkWidget *widget)
{
if (GTK_IS_NATIVE (widget))
{
- gdk_surface_set_opacity (priv->surface, priv->alpha / 255.0);
+ gdk_surface_set_opacity (gtk_native_get_surface (GTK_NATIVE (widget)), priv->alpha / 255.0);
gtk_widget_queue_allocate (widget);
}
else
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index 92272125e8..9121d5bb7e 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -706,12 +706,6 @@ void gtk_widget_set_default_direction (GtkTextDirection dir);
GDK_AVAILABLE_IN_ALL
GtkTextDirection gtk_widget_get_default_direction (void);
-/* Counterpart to gdk_surface_input_shape_combine_region.
- */
-GDK_AVAILABLE_IN_ALL
-void gtk_widget_input_shape_combine_region (GtkWidget *widget,
- cairo_region_t *region);
-
GDK_AVAILABLE_IN_ALL
void gtk_widget_set_cursor (GtkWidget *widget,
GdkCursor *cursor);
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index b1efa36f39..1018c9c915 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -180,12 +180,6 @@ struct _GtkWidgetPrivate
GSList *paintables;
- /* The widget's surface or its parent surface if it does
- * not have a surface. (Which will be indicated by the
- * no_surface field being set).
- */
- GdkSurface *surface;
-
GList *event_controllers;
AtkObject *accessible;
@@ -285,9 +279,6 @@ gboolean _gtk_widget_consumes_motion (GtkWidget
gboolean gtk_widget_has_tick_callback (GtkWidget *widget);
-void gtk_widget_set_csd_input_shape (GtkWidget *widget,
- const cairo_region_t *region);
-
gboolean gtk_widget_has_size_request (GtkWidget *widget);
void gtk_widget_reset_controllers (GtkWidget *widget);
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 0aa7583ffe..b1943221b0 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -273,6 +273,8 @@ typedef struct
GdkSurface *surface;
GskRenderer *renderer;
+ cairo_region_t *extra_input_region;
+
GList *foci;
GtkConstraintSolver *constraint_solver;
@@ -4670,6 +4672,7 @@ gtk_window_finalize (GObject *object)
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
GtkMnemonicHash *mnemonic_hash;
+ g_clear_pointer (&priv->extra_input_region, cairo_region_destroy);
g_free (priv->title);
gtk_window_release_application (window);
@@ -5335,11 +5338,26 @@ update_csd_shape (GtkWindow *window)
if (rect.width > 0 && rect.height > 0)
{
cairo_region_t *region = cairo_region_create_rectangle (&rect);
- gtk_widget_set_csd_input_shape (widget, region);
+
+ if (priv->extra_input_region)
+ cairo_region_intersect (region, priv->extra_input_region);
+
+ gdk_surface_input_shape_combine_region (priv->surface, region, 0, 0);
cairo_region_destroy (region);
}
}
+void
+gtk_window_set_extra_input_region (GtkWindow *window,
+ cairo_region_t *region)
+{
+ GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+
+ g_clear_pointer (&priv->extra_input_region, cairo_region_destroy);
+ priv->extra_input_region = cairo_region_copy (region);
+ update_csd_shape (window);
+}
+
static void
corner_rect (cairo_rectangle_int_t *rect,
const GtkCssValue *value)
diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h
index 6e6f8a6881..5fc156f8f9 100644
--- a/gtk/gtkwindowprivate.h
+++ b/gtk/gtkwindowprivate.h
@@ -161,6 +161,9 @@ GtkWidget * gtk_window_pick_popover (GtkWindow *window,
double y,
GtkPickFlags flags);
+void gtk_window_set_extra_input_region (GtkWindow *window,
+ cairo_region_t *region);
+
G_END_DECLS
#endif /* __GTK_WINDOW_PRIVATE_H__ */
diff --git a/gtk/inspector/inspect-button.c b/gtk/inspector/inspect-button.c
index 9ecb168dd8..57076dbbd0 100644
--- a/gtk/inspector/inspect-button.c
+++ b/gtk/inspector/inspect-button.c
@@ -35,6 +35,7 @@
#include "gtkeventcontrollermotion.h"
#include "gtkeventcontrollerkey.h"
#include "gtknative.h"
+#include "gtkwindowprivate.h"
static GtkWidget *
find_widget_at_pointer (GdkDevice *device)
@@ -116,8 +117,10 @@ reemphasize_window (GtkWidget *window)
display = gtk_widget_get_display (window);
if (gdk_display_is_composited (display))
{
+ GtkInspectorWindow *iw = GTK_INSPECTOR_WINDOW (window);
+
gtk_widget_set_opacity (window, 1.0);
- gtk_widget_input_shape_combine_region (window, NULL);
+ gtk_window_set_extra_input_region (GTK_WINDOW (iw), NULL);
}
else
gdk_surface_raise (gtk_native_get_surface (GTK_NATIVE (window)));
@@ -200,7 +203,7 @@ gtk_inspector_on_inspect (GtkWidget *button,
gtk_widget_set_opacity (GTK_WIDGET (iw), 0.3);
rect.x = rect.y = rect.width = rect.height = 0;
region = cairo_region_create_rectangle (&rect);
- gtk_widget_input_shape_combine_region (GTK_WIDGET (iw), region);
+ gtk_window_set_extra_input_region (GTK_WINDOW (iw), region);
cairo_region_destroy (region);
}
else
diff --git a/gtk/inspector/recorder.ui b/gtk/inspector/recorder.ui
index e0f5e74c30..cd48428a02 100644
--- a/gtk/inspector/recorder.ui
+++ b/gtk/inspector/recorder.ui
@@ -46,107 +46,98 @@
</object>
</child>
<child>
+ <object class="GtkSeparator" />
+ </child>
+ <child>
<object class="GtkBox">
<style>
<class name="view"/>
</style>
<child>
- <object class="GtkFrame">
+ <object class="GtkScrolledWindow">
+ <property name="hscrollbar-policy">never</property>
+ <property name="propagate-natural-width">1</property>
+ <style>
+ <class name="sidebar"/>
+ </style>
<child>
- <object class="GtkScrolledWindow">
- <property name="hscrollbar-policy">never</property>
- <property name="propagate-natural-width">1</property>
- <style>
- <class name="sidebar"/>
- </style>
- <child>
- <object class="GtkListBox" id="recordings_list">
- <property name="vexpand">1</property>
- <signal name="row-selected" handler="recordings_list_row_selected"/>
- </object>
- </child>
+ <object class="GtkListBox" id="recordings_list">
+ <property name="vexpand">1</property>
+ <signal name="row-selected" handler="recordings_list_row_selected"/>
</object>
</child>
</object>
</child>
<child>
- <object class="GtkFrame">
+ <object class="GtkScrolledWindow">
+ <property name="hscrollbar-policy">never</property>
+ <property name="propagate-natural-width">1</property>
+ <style>
+ <class name="sidebar"/>
+ </style>
<child>
- <object class="GtkScrolledWindow">
- <property name="hscrollbar-policy">never</property>
- <property name="propagate-natural-width">1</property>
- <style>
- <class name="sidebar"/>
- </style>
- <child>
- <object class="GtkListBox" id="render_node_list">
- <property name="vexpand">1</property>
- <signal name="row-selected" handler="render_node_list_selection_changed"/>
- </object>
- </child>
+ <object class="GtkListBox" id="render_node_list">
+ <property name="vexpand">1</property>
+ <signal name="row-selected" handler="render_node_list_selection_changed"/>
</object>
</child>
</object>
</child>
<child>
- <object class="GtkFrame">
+ <object class="GtkPaned" id="render_paned">
+ <property name="orientation">vertical</property>
+ <property name="position">300</property>
+ <property name="wide-handle">1</property>
<child>
- <object class="GtkPaned" id="render_paned">
- <property name="orientation">vertical</property>
- <property name="position">300</property>
- <property name="wide-handle">1</property>
+ <object class="GtkScrolledWindow">
<child>
- <object class="GtkScrolledWindow">
+ <object class="GtkTreeView" id="node_property_tree">
+ <property name="activate-on-single-click">1</property>
+ <signal name="row-activated" handler="node_property_activated"/>
<child>
- <object class="GtkTreeView" id="node_property_tree">
- <property name="activate-on-single-click">1</property>
- <signal name="row-activated" handler="node_property_activated"/>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Property</property>
<child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Property</property>
- <child>
- <object class="GtkCellRendererText">
- <property name="yalign">0</property>
- </object>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
+ <object class="GtkCellRendererText">
+ <property name="yalign">0</property>
</object>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Value</property>
+ <child>
+ <object class="GtkCellRendererText">
+ <property name="yalign">0</property>
+ <property name="wrap-mode">word</property>
+ <property name="max-width-chars">50</property>
+ </object>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
</child>
<child>
- <object class="GtkTreeViewColumn">
- <property name="title" translatable="yes">Value</property>
- <child>
- <object class="GtkCellRendererText">
- <property name="yalign">0</property>
- <property name="wrap-mode">word</property>
- <property name="max-width-chars">50</property>
- </object>
- <attributes>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- <child>
- <object class="GtkCellRendererPixbuf">
- <property name="xalign">0</property>
- </object>
- <attributes>
- <attribute name="visible">2</attribute>
- <attribute name="texture">3</attribute>
- </attributes>
- </child>
+ <object class="GtkCellRendererPixbuf">
+ <property name="xalign">0</property>
</object>
+ <attributes>
+ <attribute name="visible">2</attribute>
+ <attribute name="texture">3</attribute>
+ </attributes>
</child>
</object>
</child>
</object>
</child>
- <child>
- <object class="GtkPicture" id="render_node_view">
- <property name="expand">1</property>
- </object>
- </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="render_node_view">
+ <property name="expand">1</property>
</object>
</child>
</object>
diff --git a/gtk/ui/gtkpathbar.ui b/gtk/ui/gtkpathbar.ui
deleted file mode 100644
index 29fe44c3bd..0000000000
--- a/gtk/ui/gtkpathbar.ui
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<interface domain="gtk40">
- <object class="GtkButton" id="down_slider_button">
- <property name="can-focus">1</property>
- <property name="receives-default">1</property>
- <property name="focus-on-click">0</property>
- <child internal-child="accessible">
- <object class="AtkObject" id="down_slider_button-atkobject">
- <property name="AtkObject::accessible-name" translatable="yes">Down Path</property>
- </object>
- </child>
- <child>
- <object class="GtkImage">
- <property name="icon-name">pan-end-symbolic</property>
- </object>
- </child>
- <style>
- <class name="slider-button"/>
- </style>
- </object>
- <object class="GtkButton" id="up_slider_button">
- <property name="can-focus">1</property>
- <property name="receives-default">1</property>
- <property name="focus-on-click">0</property>
- <child internal-child="accessible">
- <object class="AtkObject" id="up_slider_button-atkobject">
- <property name="AtkObject::accessible-name" translatable="yes">Up Path</property>
- </object>
- </child>
- <child>
- <object class="GtkImage">
- <property name="icon-name">pan-start-symbolic</property>
- </object>
- </child>
- <style>
- <class name="slider-button"/>
- </style>
- </object>
-</interface>