From a17f33b1fec1c7d9a75e993bfb20420cf37deef5 Mon Sep 17 00:00:00 2001 From: Adrien Plazas Date: Mon, 5 Oct 2020 17:20:27 +0200 Subject: [PATCH] gtkaboutdialog: Directly specialize GtkWindow As it doesn't act as a dialog, there is no point specializing GtkDialog, so his makes it specialize GtkWindow directly. --- docs/reference/gtk/migrating-3to4.md | 5 ++ gtk/gtkaboutdialog.c | 120 ++++----------------------- gtk/gtkaboutdialog.h | 2 +- gtk/ui/gtkaboutdialog.ui | 6 +- 4 files changed, 26 insertions(+), 107 deletions(-) diff --git a/docs/reference/gtk/migrating-3to4.md b/docs/reference/gtk/migrating-3to4.md index 8e19740e12..c32078c503 100644 --- a/docs/reference/gtk/migrating-3to4.md +++ b/docs/reference/gtk/migrating-3to4.md @@ -1069,6 +1069,11 @@ getter function to retrieve the buildable ID. If you are using gtk_buildable_get_name() you should replace it with gtk_buildable_get_buildable_id(). +### Adapt to GtkAboutDialog API changes + +GtkAboutDialog now directly derives from GtkWindow, the GtkDialog API can no +longer be used on it. + ## Changes to consider after the switch GTK 4 has a number of new features that you may want to take diff --git a/gtk/gtkaboutdialog.c b/gtk/gtkaboutdialog.c index f3304fce2c..06e8e091d7 100644 --- a/gtk/gtkaboutdialog.c +++ b/gtk/gtkaboutdialog.c @@ -34,13 +34,11 @@ #include "gtkaboutdialog.h" #include "gtkbutton.h" -#include "gtkdialog.h" #include "gtkgrid.h" #include "gtkbox.h" #include "gtkicontheme.h" #include "gtkimage.h" #include "gtklabel.h" -#include "gtklinkbutton.h" #include "gtkmarshalers.h" #include "gtkstack.h" #include "gtkorientable.h" @@ -48,7 +46,6 @@ #include "gtktextview.h" #include "gtkshow.h" #include "gtkmain.h" -#include "gtkmessagedialog.h" #include "gtktogglebutton.h" #include "gtktypebuiltins.h" #include "gtkstack.h" @@ -57,7 +54,6 @@ #include "gtkheaderbar.h" #include "gtkprivate.h" #include "gtkintl.h" -#include "gtkdialogprivate.h" #include "gtkeventcontrollermotion.h" #include "gtkeventcontrollerkey.h" #include "gtkgestureclick.h" @@ -105,11 +101,6 @@ * "title", _("About ExampleCode"), * NULL); * ]| - * - * It is also possible to show a #GtkAboutDialog like any other #GtkDialog, - * and use the #GtkDialog::response signal to catch user responses. In this - * case, you might need to know that the “Close” button returns the - * %GTK_RESPONSE_CANCEL response id. */ typedef struct @@ -153,7 +144,7 @@ typedef struct _GtkAboutDialogClass GtkAboutDialogClass; struct _GtkAboutDialog { - GtkDialog parent_instance; + GtkWindow parent_instance; char *name; char *version; @@ -177,9 +168,6 @@ struct _GtkAboutDialog GtkWidget *stack; GtkWidget *stack_switcher; - GtkWidget *credits_button; - GtkWidget *license_button; - GtkWidget *system_button; GtkWidget *logo_image; GtkWidget *name_label; @@ -204,12 +192,11 @@ struct _GtkAboutDialog guint hovering_over_link : 1; guint wrap_license : 1; guint in_child_changed : 1; - guint in_switch_page : 1; }; struct _GtkAboutDialogClass { - GtkDialogClass parent_class; + GtkWindowClass parent_class; gboolean (*activate_link) (GtkAboutDialog *dialog, const char *uri); @@ -275,10 +262,6 @@ static void text_view_motion (GtkEventControllerM double x, double y, GtkAboutDialog *about); -static void toggle_credits (GtkToggleButton *button, - gpointer user_data); -static void toggle_license (GtkToggleButton *button, - gpointer user_data); enum { ACTIVATE_LINK, @@ -288,7 +271,7 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; static GParamSpec *props[LAST_PROP] = { NULL, }; -G_DEFINE_TYPE (GtkAboutDialog, gtk_about_dialog, GTK_TYPE_DIALOG) +G_DEFINE_TYPE (GtkAboutDialog, gtk_about_dialog, GTK_TYPE_WINDOW) static gboolean stack_visible_child_notify (GtkStack *stack, @@ -603,6 +586,12 @@ gtk_about_dialog_class_init (GtkAboutDialogClass *klass) g_object_class_install_properties (object_class, LAST_PROP, props); + /* + * Key bindings + */ + + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Escape, 0, "window.close", NULL); + /* Bind class to template */ gtk_widget_class_set_template_from_resource (widget_class, @@ -705,46 +694,6 @@ update_credits_button_visibility (GtkAboutDialog *about) update_stack_switcher_visibility (about); } -static void -switch_page (GtkAboutDialog *about, - const char *name) -{ - gtk_stack_set_visible_child_name (GTK_STACK (about->stack), name); - - about->in_switch_page = TRUE; - if (about->credits_button) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (about->credits_button), - g_str_equal (name, "credits")); - if (about->license_button) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (about->license_button), - g_str_equal (name, "license")); - about->in_switch_page = FALSE; -} - -static void -apply_use_header_bar (GtkAboutDialog *about) -{ - gboolean use_header_bar; - - g_object_get (about, "use-header-bar", &use_header_bar, NULL); - if (!use_header_bar) - { - about->credits_button = gtk_toggle_button_new_with_mnemonic (_("C_redits")); - g_object_bind_property (about->credits_page, "visible", - about->credits_button, "visible", G_BINDING_SYNC_CREATE); - g_signal_connect (about->credits_button, "toggled", G_CALLBACK (toggle_credits), about); - - gtk_dialog_add_action_widget (GTK_DIALOG (about), about->credits_button, GTK_RESPONSE_NONE); - - about->license_button = gtk_toggle_button_new_with_mnemonic (_("_License")); - g_object_bind_property (about->license_page, "visible", - about->license_button, "visible", G_BINDING_SYNC_CREATE); - g_signal_connect (about->license_button, "toggled", G_CALLBACK (toggle_license), about); - - gtk_dialog_add_button (GTK_DIALOG (about), _("_Close"), GTK_RESPONSE_DELETE_EVENT); - } -} - static void gtk_about_dialog_init (GtkAboutDialog *about) { @@ -768,14 +717,9 @@ gtk_about_dialog_init (GtkAboutDialog *about) about->visited_links = g_ptr_array_new_with_free_func (g_free); - gtk_dialog_set_default_response (GTK_DIALOG (about), GTK_RESPONSE_CANCEL); - gtk_widget_init_template (GTK_WIDGET (about)); - gtk_dialog_set_use_header_bar_from_setting (GTK_DIALOG (about)); - apply_use_header_bar (about); - - switch_page (about, "main"); + gtk_stack_set_visible_child_name (GTK_STACK (about->stack), "main"); update_stack_switcher_visibility (about); /* force defaults */ @@ -951,34 +895,6 @@ gtk_about_dialog_get_property (GObject *object, } } -static void -toggle_credits (GtkToggleButton *button, - gpointer user_data) -{ - GtkAboutDialog *about = user_data; - gboolean show_credits; - - if (about->in_switch_page) - return; - - show_credits = gtk_toggle_button_get_active (button); - switch_page (about, show_credits ? "credits" : "main"); -} - -static void -toggle_license (GtkToggleButton *button, - gpointer user_data) -{ - GtkAboutDialog *about = user_data; - gboolean show_license; - - if (about->in_switch_page) - return; - - show_license = gtk_toggle_button_get_active (button); - switch_page (about, show_license ? "license" : "main"); -} - static gboolean gtk_about_dialog_activate_link (GtkAboutDialog *about, const char *uri) @@ -2255,17 +2171,15 @@ gtk_about_dialog_new (void) return g_object_new (GTK_TYPE_ABOUT_DIALOG, NULL); } -static void +static gboolean close_cb (GtkAboutDialog *about, - int response_id, gpointer user_data) { - if (response_id == GTK_RESPONSE_DELETE_EVENT) - { - switch_page (about, "main"); + gtk_stack_set_visible_child_name (GTK_STACK (about->stack), "main"); - gtk_widget_hide (GTK_WIDGET (about)); - } + gtk_widget_hide (GTK_WIDGET (about)); + + return TRUE; } /** @@ -2299,8 +2213,8 @@ gtk_show_about_dialog (GtkWindow *parent, g_object_ref_sink (dialog); - /* Close dialog on user response */ - g_signal_connect (dialog, "response", + /* Hide the dialog on close request */ + g_signal_connect (dialog, "close-request", G_CALLBACK (close_cb), NULL); va_start (var_args, first_property_name); diff --git a/gtk/gtkaboutdialog.h b/gtk/gtkaboutdialog.h index 76a2d187ee..f24247f54e 100644 --- a/gtk/gtkaboutdialog.h +++ b/gtk/gtkaboutdialog.h @@ -27,7 +27,7 @@ #error "Only can be included directly." #endif -#include +#include G_BEGIN_DECLS diff --git a/gtk/ui/gtkaboutdialog.ui b/gtk/ui/gtkaboutdialog.ui index 8663225e4b..ab5fe44b32 100644 --- a/gtk/ui/gtkaboutdialog.ui +++ b/gtk/ui/gtkaboutdialog.ui @@ -1,8 +1,8 @@ -