From 2ab24f580e413b22ac0b037afa353ef47847bf75 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Wed, 11 May 2022 16:02:41 +1200 Subject: [PATCH] default-apps: Use modern widgets --- panels/default-apps/cc-default-apps-panel.c | 131 ++++++------- panels/default-apps/cc-default-apps-panel.ui | 184 +++++++------------ 2 files changed, 125 insertions(+), 190 deletions(-) diff --git a/panels/default-apps/cc-default-apps-panel.c b/panels/default-apps/cc-default-apps-panel.c index aa88f2566..a88d73444 100644 --- a/panels/default-apps/cc-default-apps-panel.c +++ b/panels/default-apps/cc-default-apps-panel.c @@ -24,63 +24,49 @@ #include "cc-default-apps-panel.h" #include "cc-default-apps-resources.h" -typedef struct -{ - const char *content_type; - gint label_offset; - /* Patterns used to filter supported mime types - when changing preferred applications. NULL - means no other types should be changed */ - const char *extra_type_filter; -} DefaultAppData; - struct _CcDefaultAppsPanel { - CcPanel parent_instance; - - GtkWidget *default_apps_grid; - - GtkWidget *web_label; - GtkWidget *mail_label; - GtkWidget *calendar_label; - GtkWidget *music_label; - GtkWidget *video_label; - GtkWidget *photos_label; + CcPanel parent_instance; + + GtkAppChooserButton *web_button; + GtkAppChooserButton *mail_button; + GtkAppChooserButton *calendar_button; + GtkAppChooserButton *music_button; + GtkAppChooserButton *video_button; + GtkAppChooserButton *photos_button; }; - G_DEFINE_TYPE (CcDefaultAppsPanel, cc_default_apps_panel, CC_TYPE_PANEL) static void -default_app_changed (CcDefaultAppsPanel *self, - GtkAppChooserButton *button) +update_default_app (GtkAppChooserButton *button, const gchar *extra_type_filter) { g_autoptr(GAppInfo) info = NULL; + g_autofree gchar *content_type = NULL; g_autoptr(GError) error = NULL; - DefaultAppData *app_data; int i; info = gtk_app_chooser_get_app_info (GTK_APP_CHOOSER (button)); - app_data = g_object_get_data (G_OBJECT (button), "cc-default-app-data"); - if (g_app_info_set_as_default_for_type (info, app_data->content_type, &error) == FALSE) + content_type = gtk_app_chooser_get_content_type (GTK_APP_CHOOSER (button)); + if (g_app_info_set_as_default_for_type (info, content_type, &error) == FALSE) { g_warning ("Failed to set '%s' as the default application for '%s': %s", - g_app_info_get_name (info), app_data->content_type, error->message); + g_app_info_get_name (info), content_type, error->message); } else { g_debug ("Set '%s' as the default handler for '%s'", - g_app_info_get_name (info), app_data->content_type); + g_app_info_get_name (info), content_type); } - if (app_data->extra_type_filter) + if (extra_type_filter) { g_auto(GStrv) entries = NULL; const char *const *mime_types; g_autoptr(GPtrArray) patterns = NULL; - entries = g_strsplit (app_data->extra_type_filter, ";", -1); + entries = g_strsplit (extra_type_filter, ";", -1); patterns = g_ptr_array_new_with_free_func ((GDestroyNotify) g_pattern_spec_free); for (i = 0; entries[i] != NULL; i++) { @@ -119,50 +105,41 @@ default_app_changed (CcDefaultAppsPanel *self, } } -#define OFFSET(x) (G_STRUCT_OFFSET (CcDefaultAppsPanel, x)) -#define WIDGET_FROM_OFFSET(x) (G_STRUCT_MEMBER (GtkWidget*, self, x)) static void -info_panel_setup_default_app (CcDefaultAppsPanel *self, - DefaultAppData *data, - guint left_attach, - guint top_attach) +web_changed_cb (CcDefaultAppsPanel *self) { - GtkWidget *button; - GtkWidget *label; - - button = gtk_app_chooser_button_new (data->content_type); - g_object_set_data (G_OBJECT (button), "cc-default-app-data", data); + update_default_app (self->web_button, "text/html;application/xhtml+xml;x-scheme-handler/https"); +} - gtk_app_chooser_button_set_show_default_item (GTK_APP_CHOOSER_BUTTON (button), TRUE); - gtk_grid_attach (GTK_GRID (self->default_apps_grid), button, left_attach, top_attach, - 1, 1); - g_signal_connect_object (G_OBJECT (button), "changed", - G_CALLBACK (default_app_changed), self, G_CONNECT_SWAPPED); +static void +mail_changed_cb (CcDefaultAppsPanel *self) +{ + update_default_app (self->mail_button, NULL); +} - label = WIDGET_FROM_OFFSET (data->label_offset); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), button); +static void +calendar_changed_cb (CcDefaultAppsPanel *self) +{ + update_default_app (self->calendar_button, NULL); } -static DefaultAppData preferred_app_infos[] = { - { "x-scheme-handler/http", OFFSET (web_label), "text/html;application/xhtml+xml;x-scheme-handler/https" }, - { "x-scheme-handler/mailto", OFFSET (mail_label), NULL }, - { "text/calendar", OFFSET (calendar_label), NULL }, - { "audio/x-vorbis+ogg", OFFSET (music_label), "audio/*" }, - { "video/x-ogm+ogg", OFFSET (video_label), "video/*" }, - { "image/jpeg", OFFSET (photos_label), "image/*" } -}; +static void +music_changed_cb (CcDefaultAppsPanel *self) +{ + update_default_app (self->music_button, "audio/*"); +} static void -info_panel_setup_default_apps (CcDefaultAppsPanel *self) +video_changed_cb (CcDefaultAppsPanel *self) { - int i; + update_default_app (self->video_button, "video/*"); +} - for (i = 0; i < G_N_ELEMENTS (preferred_app_infos); i++) - { - info_panel_setup_default_app (self, &preferred_app_infos[i], - 1, i); - } +static void +photos_changed_cb (CcDefaultAppsPanel *self) +{ + update_default_app (self->photos_button, "image/*"); } static void @@ -171,13 +148,19 @@ cc_default_apps_panel_class_init (CcDefaultAppsPanelClass *klass) GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/default-apps/cc-default-apps-panel.ui"); - gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, default_apps_grid); - gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, web_label); - gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, mail_label); - gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, calendar_label); - gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, music_label); - gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, video_label); - gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, photos_label); + gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, web_button); + gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, mail_button); + gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, calendar_button); + gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, music_button); + gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, video_button); + gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, photos_button); + + gtk_widget_class_bind_template_callback (widget_class, web_changed_cb); + gtk_widget_class_bind_template_callback (widget_class, mail_changed_cb); + gtk_widget_class_bind_template_callback (widget_class, calendar_changed_cb); + gtk_widget_class_bind_template_callback (widget_class, music_changed_cb); + gtk_widget_class_bind_template_callback (widget_class, video_changed_cb); + gtk_widget_class_bind_template_callback (widget_class, photos_changed_cb); } static void @@ -187,7 +170,13 @@ cc_default_apps_panel_init (CcDefaultAppsPanel *self) gtk_widget_init_template (GTK_WIDGET (self)); - info_panel_setup_default_apps (self); + // Set these here as setting them in the .ui file is leading to duplicate entries. + gtk_app_chooser_button_set_show_default_item (self->web_button, TRUE); + gtk_app_chooser_button_set_show_default_item (self->mail_button, TRUE); + gtk_app_chooser_button_set_show_default_item (self->calendar_button, TRUE); + gtk_app_chooser_button_set_show_default_item (self->music_button, TRUE); + gtk_app_chooser_button_set_show_default_item (self->video_button, TRUE); + gtk_app_chooser_button_set_show_default_item (self->photos_button, TRUE); } GtkWidget * diff --git a/panels/default-apps/cc-default-apps-panel.ui b/panels/default-apps/cc-default-apps-panel.ui index ac8db762a..71bcbd5ff 100644 --- a/panels/default-apps/cc-default-apps-panel.ui +++ b/panels/default-apps/cc-default-apps-panel.ui @@ -14,141 +14,77 @@ 10 vertical - - 12 - 12 + - - 1 - _Web - True - + + _Web + True + + + x-scheme-handler/http + + + - - 1 - _Mail - True - - 1 - 0 - - + + _Mail + True + + + x-scheme-handler/mailto + + + - - 1 - _Calendar - True - - 2 - 0 - - + + _Calendar + True + + + text/calendar + + + - - 1 - M_usic - True - - 3 - 0 - - + + M_usic + True + + + audio/x-vorbis+ogg + + + - - 1 - _Video - True - - 4 - 0 - - + + _Video + True + + + video/x-ogm+ogg + + + - - - - 2 - 0 - - - - - - - - 2 - 1 - - - - - - - - 2 - 2 - - - - - - - - 2 - 3 - - - - - - - - 2 - 4 - - - - - - 1 - _Photos - True - - 5 - 0 - - - - - - - - - 2 - 5 - + + _Photos + True + + + image/jpeg + + + @@ -156,4 +92,14 @@ + + + + + + + + + + -- GitLab