From 5c1d47b56a4920a25b210eeb4364610c5ad26132 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 14 Nov 2024 10:48:21 -0500 Subject: [PATCH 01/21] text: Try harder not to select inserted Emoji We had code trying to handle the case of focus coming from a child, but it is running too late to be effective. Instead, keep a flag that tells us if the Emoji picker is still open. --- gtk/gtktext.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/gtk/gtktext.c b/gtk/gtktext.c index 0a0c6835a5..5fef904072 100644 --- a/gtk/gtktext.c +++ b/gtk/gtktext.c @@ -291,6 +291,7 @@ struct _GtkTextPrivate guint propagate_text_width : 1; guint text_handles_enabled : 1; guint enable_undo : 1; + guint emoji_chooser_open : 1; }; struct _GtkTextPasswordHint @@ -3459,7 +3460,7 @@ gtk_text_grab_focus (GtkWidget *widget) if (!GTK_WIDGET_CLASS (gtk_text_parent_class)->grab_focus (GTK_WIDGET (self))) return FALSE; - if (priv->editable && !priv->in_click && !prev_focus_was_child) + if (priv->editable && !priv->in_click && !prev_focus_was_child && !priv->emoji_chooser_open) { g_object_get (gtk_widget_get_settings (widget), "gtk-entry-select-on-focus", @@ -7183,6 +7184,15 @@ gtk_text_get_tabs (GtkText *self) return priv->tabs; } +static void +emoji_chooser_closed (GtkWidget *chooser, + GtkText *text) +{ + GtkTextPrivate *priv = gtk_text_get_instance_private (text); + + priv->emoji_chooser_open = 1; +} + static void emoji_picked (GtkEmojiChooser *chooser, const char *text, @@ -7208,6 +7218,7 @@ emoji_picked (GtkEmojiChooser *chooser, static void gtk_text_insert_emoji (GtkText *self) { + GtkTextPrivate *priv = gtk_text_get_instance_private (self); GtkWidget *chooser; if (gtk_widget_get_ancestor (GTK_WIDGET (self), GTK_TYPE_EMOJI_CHOOSER) != NULL) @@ -7221,10 +7232,11 @@ gtk_text_insert_emoji (GtkText *self) gtk_widget_set_parent (chooser, GTK_WIDGET (self)); g_signal_connect (chooser, "emoji-picked", G_CALLBACK (emoji_picked), self); - g_signal_connect_swapped (chooser, "hide", G_CALLBACK (gtk_text_grab_focus_without_selecting), self); + g_signal_connect_swapped (chooser, "hide", G_CALLBACK (emoji_chooser_closed), self); } gtk_popover_popup (GTK_POPOVER (chooser)); + priv->emoji_chooser_open = 1; } static void From e6119c35a8762190ba09bd332f49e210e288baec Mon Sep 17 00:00:00 2001 From: Matthijs Velsink Date: Wed, 30 Oct 2024 23:13:29 +0100 Subject: [PATCH 02/21] gsk: Fix wrong bt709_oetf And use the format from `gdkcolordefs.h` for good measure. --- gsk/gpu/shaders/gskgpuconvertcicp.glsl | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/gsk/gpu/shaders/gskgpuconvertcicp.glsl b/gsk/gpu/shaders/gskgpuconvertcicp.glsl index 35045564f0..09c6cff922 100644 --- a/gsk/gpu/shaders/gskgpuconvertcicp.glsl +++ b/gsk/gpu/shaders/gskgpuconvertcicp.glsl @@ -161,19 +161,25 @@ run (out vec2 pos) float bt709_eotf (float v) { - if (abs (v) < 0.081) + const float a = 1.099; + const float d = 0.0812; + + if (abs (v) < d) return v / 4.5; else - return sign (v) * pow ((abs (v) + 0.099) / 1.099, 1.0/0.45); + return sign (v) * pow ((abs (v) + (a - 1.0)) / a, 1.0 / 0.45); } float bt709_oetf (float v) { - if (abs (v) < 0.081) + const float a = 1.099; + const float b = 0.018; + + if (abs (v) < b) return v * 4.5; else - return 1.099 * sign (v) * (pow (abs (v), 0.45) - 0.099); + return sign (v) * (a * pow (abs (v), 0.45) - (a - 1.0)); } float From fc5a3ef2c8745a997867fb18466e29a789c31e01 Mon Sep 17 00:00:00 2001 From: Alice Mikhaylenko Date: Wed, 30 Oct 2024 18:05:18 +0400 Subject: [PATCH 03/21] application: Set default window icon to appid by default Lots of newer apps that use their appid as their icon name don't set window icons, since they aren't used in GNOME. Instead of setting it manually in every app, just default to it. Only set the icon if it exists in the icon theme. Remove manually set default icons in the demo. No tests as GtkApplication doesn't have any in the first place. Fixes https://gitlab.gnome.org/GNOME/gtk/-/issues/7120 --- demos/gtk-demo/main.c | 2 -- demos/node-editor/node-editor-application.c | 2 -- demos/print-editor/print-editor.c | 1 - demos/widget-factory/widget-factory.c | 1 - gtk/gtkapplication.c | 22 +++++++++++++++++++++ 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/demos/gtk-demo/main.c b/demos/gtk-demo/main.c index a276931986..0e27a441e9 100644 --- a/demos/gtk-demo/main.c +++ b/demos/gtk-demo/main.c @@ -1068,8 +1068,6 @@ command_line (GApplication *app, window = gtk_application_get_windows (GTK_APPLICATION (app))->data; - gtk_window_set_icon_name (GTK_WINDOW (window), "org.gtk.Demo4"); - if (name == NULL) goto out; diff --git a/demos/node-editor/node-editor-application.c b/demos/node-editor/node-editor-application.c index 50e284fe03..5c0ff7bf83 100644 --- a/demos/node-editor/node-editor-application.c +++ b/demos/node-editor/node-editor-application.c @@ -219,8 +219,6 @@ node_editor_application_activate (GApplication *app) if (g_strcmp0 (PROFILE, "devel") == 0) gtk_widget_add_css_class (GTK_WIDGET (win), "devel"); - gtk_window_set_icon_name (GTK_WINDOW (win), "org.gtk.gtk4.NodeEditor"); - gtk_window_present (GTK_WINDOW (win)); } diff --git a/demos/print-editor/print-editor.c b/demos/print-editor/print-editor.c index 1f44ed9c8c..a3665e528e 100644 --- a/demos/print-editor/print-editor.c +++ b/demos/print-editor/print-editor.c @@ -798,7 +798,6 @@ activate (GApplication *app) if (g_strcmp0 (PROFILE, "devel") == 0) gtk_widget_add_css_class (GTK_WIDGET (main_window), "devel"); - gtk_window_set_icon_name (GTK_WINDOW (main_window), "org.gtk.PrintEditor4"); gtk_window_set_default_size (GTK_WINDOW (main_window), 400, 600); gtk_application_window_set_show_menubar (GTK_APPLICATION_WINDOW (main_window), TRUE); update_title (GTK_WINDOW (main_window)); diff --git a/demos/widget-factory/widget-factory.c b/demos/widget-factory/widget-factory.c index 7b4d7f762e..1dbb1a472a 100644 --- a/demos/widget-factory/widget-factory.c +++ b/demos/widget-factory/widget-factory.c @@ -2241,7 +2241,6 @@ activate (GApplication *app) if (g_strcmp0 (PROFILE, "devel") == 0) gtk_widget_add_css_class (GTK_WIDGET (window), "devel"); - gtk_window_set_icon_name (window, "org.gtk.WidgetFactory4"); gtk_application_add_window (GTK_APPLICATION (app), window); g_action_map_add_action_entries (G_ACTION_MAP (window), win_entries, G_N_ELEMENTS (win_entries), diff --git a/gtk/gtkapplication.c b/gtk/gtkapplication.c index 03b7bc4c6a..d58efe6fc5 100644 --- a/gtk/gtkapplication.c +++ b/gtk/gtkapplication.c @@ -88,6 +88,10 @@ * displays the shortcuts window, associate the item with the action * `win.show-help-overlay`. * + * `GtkApplication` will also automatically set the application id as the + * default window icon. Use [func@Gtk.Window.set_default_icon_name] or + * [property@Gtk.Window:icon-name] to override that behavior. + * * ## A simple application * * [A simple example](https://gitlab.gnome.org/GNOME/gtk/tree/main/examples/bp/bloatpad.c) @@ -244,6 +248,23 @@ gtk_application_load_resources (GtkApplication *application) } } +static void +gtk_application_set_window_icon (GtkApplication *application) +{ + GtkIconTheme *default_theme; + const char *appid; + + if (gtk_window_get_default_icon_name () != NULL) + return; + + default_theme = gtk_icon_theme_get_for_display (gdk_display_get_default ()); + appid = g_application_get_application_id (G_APPLICATION (application)); + + if (!gtk_icon_theme_has_icon (default_theme, appid)) + return; + + gtk_window_set_default_icon_name (appid); +} static void gtk_application_startup (GApplication *g_application) @@ -267,6 +288,7 @@ gtk_application_startup (GApplication *g_application) gtk_application_impl_startup (priv->impl, priv->register_session); gtk_application_load_resources (application); + gtk_application_set_window_icon (application); gdk_profiler_end_mark (before, "Application startup", NULL); } From 5444c3771d92aa17313eb74f0f3d69958849407c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20=22sp1rit=22=E2=80=8B?= Date: Thu, 31 Oct 2024 08:59:49 +0100 Subject: [PATCH 04/21] demo: Fix "Expander" demonstration The expander window is not a dialog anymore, so attempting connecting to its "response" is invalid and throws a critical: signal 'response' is invalid for instance '' of type 'GtkWindow' --- demos/gtk-demo/expander.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/demos/gtk-demo/expander.c b/demos/gtk-demo/expander.c index c374175c27..b6d6ba4846 100644 --- a/demos/gtk-demo/expander.c +++ b/demos/gtk-demo/expander.c @@ -12,11 +12,13 @@ static GtkWidget *window = NULL; -static void -response_cb (GtkDialog *dialog, int response_id) +static gboolean +close_request_cb (GtkWidget *win, gpointer user_data) { - gtk_window_destroy (GTK_WINDOW (window)); + g_assert (window == win); + gtk_window_destroy ((GtkWindow *)window); window = NULL; + return TRUE; } static void @@ -117,7 +119,7 @@ do_expander (GtkWidget *do_widget) g_signal_connect (expander, "notify::expanded", G_CALLBACK (expander_cb), window); - g_signal_connect (window, "response", G_CALLBACK (response_cb), NULL); + g_signal_connect (window, "close-request", G_CALLBACK (close_request_cb), NULL); } if (!gtk_widget_get_visible (window)) From c3e16e68f7485cb91c41ed4f3701e54ab67eb56c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 24 Oct 2024 21:28:47 +0200 Subject: [PATCH 05/21] win32: Don't crash if the settings are empty --- gtk/print/gtkprintoperation-win32.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gtk/print/gtkprintoperation-win32.c b/gtk/print/gtkprintoperation-win32.c index fbcfa3e7df..a9e6435d62 100644 --- a/gtk/print/gtkprintoperation-win32.c +++ b/gtk/print/gtkprintoperation-win32.c @@ -972,6 +972,8 @@ devmode_from_settings (GtkPrintSettings *settings, const char *extras_base64; gsize extras_len; const char *val; + gunichar2 *device_name; + glong device_name_len; /* If we already provided a valid hDevMode, don't initialize a new one; just lock the one we have */ if (hDevMode) @@ -996,8 +998,9 @@ devmode_from_settings (GtkPrintSettings *settings, devmode->dmSpecVersion = DM_SPECVERSION; devmode->dmSize = sizeof (DEVMODEW); - gunichar2 *device_name = g_utf8_to_utf16 (gtk_print_settings_get (settings, "win32-devmode-name"), -1, NULL, NULL, NULL); - memcpy (devmode->dmDeviceName, device_name, CCHDEVICENAME); + device_name = g_utf8_to_utf16 (gtk_print_settings_get (settings, "win32-devmode-name"), -1, NULL, &device_name_len, NULL); + if (device_name && device_name_len) + memcpy (devmode->dmDeviceName, device_name, MIN (device_name_len, CCHDEVICENAME) * sizeof (gunichar2)); g_free (device_name); From 5f0f6f558e65e5653202c1216ea5720a985f1cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20=22sp1rit=22=E2=80=8B?= Date: Sat, 2 Nov 2024 19:23:30 +0100 Subject: [PATCH 06/21] demo: Fix drag and drop demo critical Right now, child is NULL when starting a drag in the main area and moving the pointer onto the colors, there releasing it. To avoid gtk_widget_get_ancestor thowing a critical, early exit if child is NULL. --- demos/gtk-demo/dnd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/demos/gtk-demo/dnd.c b/demos/gtk-demo/dnd.c index 747f5f3bb9..ac5b38c050 100644 --- a/demos/gtk-demo/dnd.c +++ b/demos/gtk-demo/dnd.c @@ -579,6 +579,8 @@ released_cb (GtkGesture *gesture, widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); child = gtk_widget_pick (widget, x, y, 0); + if (!child) + return; item = (CanvasItem *)gtk_widget_get_ancestor (child, canvas_item_get_type ()); if (!item) return; From bb764374019bfd991cb7659d150bf131df7791d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20=22sp1rit=22=E2=80=8B?= Date: Sat, 2 Nov 2024 20:32:34 +0100 Subject: [PATCH 07/21] meson: set install_tag for schema files To limit the amount of files installed by meson install, users can specify specific classes of files they actually want to install. Most to be installed files are automatically tagged by meson correctly based on what function produced them, but it can't for some (esp. those installed using install_data/subdir). As gschema files *should typically* be available at runtime, give them the "runtime" tag. See https://mesonbuild.com/Installing.html#installation-tags --- gtk/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk/meson.build b/gtk/meson.build index 5d2f2859fe..c7f2d4be31 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -1090,7 +1090,7 @@ gtk_settings_schemas = [ 'org.gtk.gtk4.Settings.EmojiChooser.gschema.xml', 'org.gtk.gtk4.Settings.Debug.gschema.xml', ] -install_data(gtk_settings_schemas, install_dir: gtk_schemasdir) +install_data(gtk_settings_schemas, install_dir: gtk_schemasdir, install_tag: 'runtime') gnome.compile_schemas(depend_files: files(gtk_settings_schemas), build_by_default: true) gtk_schema_build_dir = meson.current_build_dir() From aa5ef81b3ccfd993c853673518ae5f82be27721f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20=22sp1rit=22=E2=80=8B?= Date: Sat, 2 Nov 2024 20:43:54 +0100 Subject: [PATCH 08/21] demos: Add xmlns to appstream metainfo files Pixiewood expects well-formed XML files, whose tags match the AppStream namespace. Note that AppStream itself does not do this, so picking a prefix for the namespace is fine for pixiewood but not AppStream. --- demos/gtk-demo/org.gtk.Demo4.appdata.xml.in | 2 +- demos/node-editor/org.gtk.gtk4.NodeEditor.appdata.xml.in | 2 +- demos/print-editor/org.gtk.PrintEditor4.appdata.xml | 2 +- demos/widget-factory/org.gtk.WidgetFactory4.appdata.xml.in | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/demos/gtk-demo/org.gtk.Demo4.appdata.xml.in b/demos/gtk-demo/org.gtk.Demo4.appdata.xml.in index 87f9267e67..94d7145670 100644 --- a/demos/gtk-demo/org.gtk.Demo4.appdata.xml.in +++ b/demos/gtk-demo/org.gtk.Demo4.appdata.xml.in @@ -1,5 +1,5 @@ - + org.gtk.Demo4 org.gtk.Demo4.desktop CC0-1.0 diff --git a/demos/node-editor/org.gtk.gtk4.NodeEditor.appdata.xml.in b/demos/node-editor/org.gtk.gtk4.NodeEditor.appdata.xml.in index 26ee6ff4d9..16b7e92657 100644 --- a/demos/node-editor/org.gtk.gtk4.NodeEditor.appdata.xml.in +++ b/demos/node-editor/org.gtk.gtk4.NodeEditor.appdata.xml.in @@ -1,5 +1,5 @@ - + org.gtk.gtk4.NodeEditor org.gtk.gtk4.NodeEditor.desktop CC0-1.0 diff --git a/demos/print-editor/org.gtk.PrintEditor4.appdata.xml b/demos/print-editor/org.gtk.PrintEditor4.appdata.xml index bdee5bbe67..66f5e43d3a 100644 --- a/demos/print-editor/org.gtk.PrintEditor4.appdata.xml +++ b/demos/print-editor/org.gtk.PrintEditor4.appdata.xml @@ -1,5 +1,5 @@ - + org.gtk.PrintEditor4 org.gtk.PrintEditor4.desktop CC0-1.0 diff --git a/demos/widget-factory/org.gtk.WidgetFactory4.appdata.xml.in b/demos/widget-factory/org.gtk.WidgetFactory4.appdata.xml.in index 284b7419c2..b976069fb7 100644 --- a/demos/widget-factory/org.gtk.WidgetFactory4.appdata.xml.in +++ b/demos/widget-factory/org.gtk.WidgetFactory4.appdata.xml.in @@ -1,5 +1,5 @@ - + org.gtk.WidgetFactory4 org.gtk.WidgetFactory4.desktop CC0-1.0 From 24fda9ae40b3db67e488203440a6d8c7c79c930b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 3 Nov 2024 20:57:13 -0500 Subject: [PATCH 09/21] fontchooser: Make it more shrinkable There were several places where unnecessarily big minimum sizes were hardcoded. Instead, set a reasonable default size for the dialog and the let window shrink further. Helps for mobile situations. Related: #7133 --- gtk/gtkfontchooserwidget.c | 1 + gtk/ui/gtkfontchooserdialog.ui | 2 ++ gtk/ui/gtkfontchooserwidget.ui | 2 -- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c index 033a98b1ab..dced83f333 100644 --- a/gtk/gtkfontchooserwidget.c +++ b/gtk/gtkfontchooserwidget.c @@ -2190,6 +2190,7 @@ update_feature_example (GtkFontChooserWidget *fontchooser, gtk_label_set_text (GTK_LABEL (item->example), text); gtk_label_set_attributes (GTK_LABEL (item->example), attrs); + gtk_label_set_ellipsize (GTK_LABEL (item->example), PANGO_ELLIPSIZE_END); g_free (text); pango_attr_list_unref (attrs); diff --git a/gtk/ui/gtkfontchooserdialog.ui b/gtk/ui/gtkfontchooserdialog.ui index 2ccd571132..965dc9f366 100644 --- a/gtk/ui/gtkfontchooserdialog.ui +++ b/gtk/ui/gtkfontchooserdialog.ui @@ -2,6 +2,8 @@