From 1b278b0636d710182e4c99f29f9597d0ef3e2115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Thu, 20 Feb 2020 17:54:56 +0100 Subject: [PATCH 01/29] colorchooserwidget: Get rid of a gtk_widget_destroy() call --- gtk/gtkcolorchooserwidget.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) 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 (); From 73faa9c84afc90318b3098062f1270230a580808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Thu, 20 Feb 2020 18:05:00 +0100 Subject: [PATCH 02/29] popovermenu: Avoid a gtk_widget_destroy() call --- gtk/gtkpopovermenu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); From ceabe70a42f17fcc5650cc80a2f2c0b38c23a593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Thu, 20 Feb 2020 19:21:59 +0100 Subject: [PATCH 03/29] emojichooser: Avoid using gtk_widget_destroy() --- gtk/gtkemojichooser.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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; } From 103b6a9205740388c603cd6db33208d097180031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Thu, 20 Feb 2020 19:26:44 +0100 Subject: [PATCH 04/29] popovermenubar: Avoid calling gtk_widget_destroy() --- gtk/gtkpopovermenubar.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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); From f4202c50752b8ff03f45ae212486e57ca58fec40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Thu, 20 Feb 2020 19:29:25 +0100 Subject: [PATCH 05/29] headerbar: Avoid calling gtk_widget_destroy() --- gtk/gtkheaderbar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c index 0c708ee851..945c3cf5a2 100644 --- a/gtk/gtkheaderbar.c +++ b/gtk/gtkheaderbar.c @@ -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); } From e1ca83ddbdb3f96d1cb2709bee98db0ff3cb9c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Thu, 20 Feb 2020 19:36:13 +0100 Subject: [PATCH 06/29] pathbar: Avoid calling gtk_widget_destroy() --- gtk/gtkpathbar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk/gtkpathbar.c b/gtk/gtkpathbar.c index e9477e349c..ba23450eac 100644 --- a/gtk/gtkpathbar.c +++ b/gtk/gtkpathbar.c @@ -1360,7 +1360,7 @@ gtk_path_bar_set_file_finish (struct SetFileInfo *info, ButtonData *button_data; button_data = BUTTON_DATA (l->data); - gtk_widget_destroy (button_data->button); + gtk_container_remove (GTK_CONTAINER (info->path_bar), button_data->button); } g_list_free (info->new_buttons); From 995277f57dbd807c2f9d65605076b8b1201470a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Thu, 20 Feb 2020 19:56:56 +0100 Subject: [PATCH 07/29] placessidebar: Avoid calling gtk_widget_destroy() --- gtk/gtkplacessidebar.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c index 1e50e8cc02..674eab90d6 100644 --- a/gtk/gtkplacessidebar.c +++ b/gtk/gtkplacessidebar.c @@ -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; } @@ -3482,7 +3485,7 @@ build_popup_menu_using_gmenu (GtkSidebarRow *row) } add_actions (sidebar); if (sidebar->popover) - gtk_widget_destroy (sidebar->popover); + gtk_widget_unparent (sidebar->popver); sidebar->popover = gtk_popover_new_from_model (GTK_WIDGET (sidebar), G_MENU_MODEL (menu)); @@ -3696,7 +3699,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 +3713,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 +3723,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); } @@ -4186,15 +4190,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; From 60d2813247831adf9642f87ad2bf597280d2f31a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Fri, 21 Feb 2020 09:03:32 +0100 Subject: [PATCH 08/29] placessidebar: Convert popover menu to proper GtkPopoverMenu --- gtk/gtkplacessidebar.c | 383 ++++++++++++++++------------------------- 1 file changed, 145 insertions(+), 238 deletions(-) diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c index 674eab90d6..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" @@ -2078,150 +2078,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, @@ -3370,67 +3226,6 @@ static GActionEntry entries[] = { { "stop", stop_shortcut_cb, NULL, NULL, NULL }, }; -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) @@ -3476,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_unparent (sidebar->popver); + gtk_widget_unparent (sidebar->popover); sidebar->popover = gtk_popover_new_from_model (GTK_WIDGET (sidebar), G_MENU_MODEL (menu)); @@ -3502,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; @@ -3517,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 @@ -4066,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 From df3b88483d5680386893b02276921a73df2a7679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Fri, 21 Feb 2020 09:04:27 +0100 Subject: [PATCH 09/29] modelbutton: Fix wrong function name in doc comment --- gtk/gtkmodelbutton.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From dbd1180ce463608fd612b25c894f8a0c171b20c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Fri, 21 Feb 2020 09:08:05 +0100 Subject: [PATCH 10/29] stackswitcher: Avoid calling gtk_widget_destroy() --- gtk/gtkstackswitcher.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; From 68b4c061cf1c5721074ab19462778b1c81336032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Fri, 21 Feb 2020 09:37:00 +0100 Subject: [PATCH 11/29] shortcutlabel: Remove unnecessary includes --- gtk/gtkshortcutlabel.c | 2 -- 1 file changed, 2 deletions(-) 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" /** From ff4a33b69b7e4e56dd9a01a1dcd5baa6ddad1985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Fri, 21 Feb 2020 12:57:16 +0100 Subject: [PATCH 12/29] headerbar: Remove size request on icon button Doesn't make sense that we force this one button to be this big. --- gtk/gtkheaderbar.c | 1 - 1 file changed, 1 deletion(-) diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c index 945c3cf5a2..1a81f327bc 100644 --- a/gtk/gtkheaderbar.c +++ b/gtk/gtkheaderbar.c @@ -383,7 +383,6 @@ _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)) { From 549a3a81aedffffe57e9ec2dabf28cb55a042c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Fri, 21 Feb 2020 13:04:44 +0100 Subject: [PATCH 13/29] headerbar: Replace gtk_widget_destroy() call --- gtk/gtkheaderbar.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c index 1a81f327bc..ca56f4fba1 100644 --- a/gtk/gtkheaderbar.c +++ b/gtk/gtkheaderbar.c @@ -386,7 +386,8 @@ _gtk_header_bar_update_window_buttons (GtkHeaderBar *bar) 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; } From dae06d82ae44aa818ad971224be2c1a8035b9bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Fri, 21 Feb 2020 13:38:38 +0100 Subject: [PATCH 14/29] inspector: Remove double borders in recorder --- gtk/inspector/recorder.ui | 133 ++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 71 deletions(-) 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 @@ -45,108 +45,99 @@ + + + - + + never + 1 + - - never - 1 - - - - 1 - - - + + 1 + - + + never + 1 + - - never - 1 - - - - 1 - - - + + 1 + - + + vertical + 300 + 1 - - vertical - 300 - 1 + - + + 1 + - - 1 - + + Property - - Property - - - 0 - - - 0 - - + + 0 + + 0 + + + + + + + Value + + + 0 + word + 50 + + + 1 + - - Value - - - 0 - word - 50 - - - 1 - - - - - 0 - - - 2 - 3 - - + + 0 + + 2 + 3 + - - - 1 - - + + + + + 1 From 1baae1f288a776258b4f210902d5bbe5984cccf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Fri, 21 Feb 2020 13:58:49 +0100 Subject: [PATCH 15/29] colorchooser: Fix typo in checkerboard color --- gtk/gtkcolorchooser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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)); From b1d4d24c7b576da415a6e1ae158a72eb09007ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Fri, 21 Feb 2020 15:24:19 +0100 Subject: [PATCH 16/29] pathbar: Inherit from GtkWidget --- gtk/gtkpathbar.c | 236 +++++-------------------------------------- gtk/gtkpathbar.h | 4 +- gtk/ui/gtkpathbar.ui | 39 ------- 3 files changed, 30 insertions(+), 249 deletions(-) delete mode 100644 gtk/ui/gtkpathbar.ui diff --git a/gtk/gtkpathbar.c b/gtk/gtkpathbar.c index ba23450eac..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