diff options
author | Timm Bäder <mail@baedert.org> | 2020-02-25 13:35:34 +0000 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2020-02-25 13:35:34 +0000 |
commit | 64ff12dbd7a95e23aa30ae2fb998b328bbcafee3 (patch) | |
tree | 669ac57af67d33903933b0cb15060af5f9de3499 | |
parent | 648a67085f37e42c464dc4d5c498ffc3afed3ecc (diff) | |
parent | 02e295ec5d509d74731a6946b7caee59f897a5b3 (diff) | |
download | gtk+-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.txt | 1 | ||||
-rw-r--r-- | gtk/a11y/gtkstatusbaraccessible.c | 46 | ||||
-rw-r--r-- | gtk/gtkcolorchooser.c | 2 | ||||
-rw-r--r-- | gtk/gtkcolorchooserwidget.c | 8 | ||||
-rw-r--r-- | gtk/gtkemojichooser.c | 7 | ||||
-rw-r--r-- | gtk/gtkheaderbar.c | 6 | ||||
-rw-r--r-- | gtk/gtkmenusectionbox.c | 3 | ||||
-rw-r--r-- | gtk/gtkmodelbutton.c | 2 | ||||
-rw-r--r-- | gtk/gtkpathbar.c | 230 | ||||
-rw-r--r-- | gtk/gtkpathbar.h | 4 | ||||
-rw-r--r-- | gtk/gtkplacessidebar.c | 407 | ||||
-rw-r--r-- | gtk/gtkpopover.c | 6 | ||||
-rw-r--r-- | gtk/gtkpopovermenu.c | 2 | ||||
-rw-r--r-- | gtk/gtkpopovermenubar.c | 6 | ||||
-rw-r--r-- | gtk/gtkrange.c | 108 | ||||
-rw-r--r-- | gtk/gtkscrolledwindow.c | 17 | ||||
-rw-r--r-- | gtk/gtkshortcutlabel.c | 2 | ||||
-rw-r--r-- | gtk/gtkstackswitcher.c | 2 | ||||
-rw-r--r-- | gtk/gtkstatusbar.c | 9 | ||||
-rw-r--r-- | gtk/gtkstatusbar.h | 3 | ||||
-rw-r--r-- | gtk/gtkstatusbarprivate.h | 30 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 170 | ||||
-rw-r--r-- | gtk/gtkwidget.h | 6 | ||||
-rw-r--r-- | gtk/gtkwidgetprivate.h | 9 | ||||
-rw-r--r-- | gtk/gtkwindow.c | 20 | ||||
-rw-r--r-- | gtk/gtkwindowprivate.h | 3 | ||||
-rw-r--r-- | gtk/inspector/inspect-button.c | 7 | ||||
-rw-r--r-- | gtk/inspector/recorder.ui | 133 | ||||
-rw-r--r-- | gtk/ui/gtkpathbar.ui | 39 |
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> |