Compare commits

..

16 Commits

Author SHA1 Message Date
Matthias Clasen
f05eac610a Merge branch 'places_view_button_labels' into 'main'
gtkplacesview: Add some missing button tooltips

See merge request GNOME/gtk!7927
2024-11-15 15:51:38 +00:00
Sveinn í Felli
4e8eeba5bb Update Icelandic translation
(cherry picked from commit d07a62a940)
2024-11-15 15:25:16 +00:00
Lukáš Tyrychtr
6da8fcf5d9 gtkplacesview: Add some missing button tooltips
The remove server button and the server list one had only icons,
so fix it by adding tooltips to them.
2024-11-15 15:27:04 +01:00
Matthias Clasen
a34e95bc39 Merge branch 'for-main' into 'main'
surface: Add debug spew for color states

See merge request GNOME/gtk!7924
2024-11-14 23:04:07 +00:00
Matthias Clasen
ed2716f9ce inspector: Put surfaces and renderers in the tree
These are otherwise really hard to navigate to, and we already
have plenty of non-widget objects in the tree.
2024-11-14 16:58:44 -05:00
Matthias Clasen
841bd9c5c2 inspector: Avoid a critical 2024-11-14 16:09:45 -05:00
Matthias Clasen
b0344e1fd8 surface: Add debug spew for color states
Log the preferred color state events we get.
2024-11-14 15:33:35 -05:00
Matthias Clasen
77e340f23d Merge branch 'for-main' into 'main'
text: Try harder not to select inserted Emoji

See merge request GNOME/gtk!7921
2024-11-14 16:14:19 +00:00
Matthias Clasen
1d1ef311e3 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.
2024-11-14 10:49:42 -05:00
Sveinn í Felli
1ce19d3c77 Update Icelandic translation
(cherry picked from commit b3e794e4f5)
2024-11-13 16:05:16 +00:00
Sveinn í Felli
3e6e8e6dd5 Update Icelandic translation
(cherry picked from commit 482c55550c)
2024-11-13 16:01:01 +00:00
Matthias Clasen
78738fac3b Merge branch 'cm/fix-goptioncontext-leak' into 'main'
updateiconcache: Fix GOptionContext leak in main

See merge request GNOME/gtk!7918
2024-11-13 13:37:34 +00:00
correctmost
549f537445 updateiconcache: Fix GOptionContext leak in main 2024-11-12 21:16:18 -05:00
Matthias Clasen
e37d15f75c Merge branch 'vulkan-prepare' into 'main'
Drop vulkan refcounting

See merge request GNOME/gtk!7916
2024-11-12 22:56:40 +00:00
Matthias Clasen
ae180f85ca gsk: Move the platform check up
In some cases, we can know that we're not going to use Vulkan
without initializing it. Handle those before calling
gdk_display_prepare_vulkan.
2024-11-12 16:53:15 -05:00
Matthias Clasen
58036ece96 Drop vulkan refcounting
Change things to have a gdk_display_prepare_vulkan call which sets
up Vulkan support for the display. The Vulkan resources will be
dropped when the display is disposed. This matches what we do
for GL, and seems better than a refcounting approach where everybody
leaks the references.

Fixes: #7150
2024-11-12 16:53:15 -05:00
15 changed files with 2455 additions and 1438 deletions

View File

@@ -438,11 +438,10 @@ gdk_display_dispose (GObject *object)
g_clear_pointer (&display->egl_dmabuf_formats, gdk_dmabuf_formats_unref);
g_clear_pointer (&display->egl_internal_formats, gdk_dmabuf_formats_unref);
#ifdef GDK_RENDERING_VULKAN
if (display->vk_dmabuf_formats)
{
gdk_display_unref_vulkan (display);
g_assert (display->vk_dmabuf_formats == NULL);
}
if (display->vk_instance)
gdk_display_destroy_vulkan_instance (display);
g_assert (display->vk_dmabuf_formats == NULL);
g_clear_error (&display->vulkan_error);
#endif
g_clear_object (&priv->gl_context);
@@ -1286,6 +1285,53 @@ gdk_display_get_keymap (GdkDisplay *display)
return GDK_DISPLAY_GET_CLASS (display)->get_keymap (display);
}
/*< private >
* gdk_display_prepare_vulkan:
* @self: a `GdkDisplay`
* @error: return location for a `GError`
*
* Checks that Vulkan is available for @self and ensures that it is
* properly initialized.
*
* When this fails, an @error will be set describing the error and this
* function returns %FALSE.
*
* Note that even if this function succeeds, creating a `GdkVulkanContext`
* may still fail.
*
* This function is idempotent. Calling it multiple times will just
* return the same value or error.
*
* You never need to call this function, GDK will call it automatically
* as needed.
*
* Returns: %TRUE if the display supports Vulkan
*/
gboolean
gdk_display_prepare_vulkan (GdkDisplay *self,
GError **error)
{
g_return_val_if_fail (GDK_IS_DISPLAY (self), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
#ifdef GDK_RENDERING_VULKAN
if (!self->vk_instance && !self->vulkan_error)
gdk_display_create_vulkan_instance (self, &self->vulkan_error);
if (self->vk_instance == NULL)
{
if (error)
*error = g_error_copy (self->vulkan_error);
}
return self->vk_instance != NULL;
#else
g_set_error (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_UNSUPPORTED,
"GTK was built without Vulkan support");
return FALSE;
#endif
}
/*<private>
* gdk_display_create_vulkan_context:
* @self: a `GdkDisplay`

View File

@@ -126,7 +126,7 @@ struct _GdkDisplay
GdkDmabufFormats *vk_dmabuf_formats;
GdkVulkanFeatures vulkan_features;
guint vulkan_refcount;
GError *vulkan_error;
#endif /* GDK_RENDERING_VULKAN */
/* egl info */
@@ -239,6 +239,8 @@ void _gdk_display_unpause_events (GdkDisplay *display
void gdk_display_init_dmabuf (GdkDisplay *self);
gboolean gdk_display_prepare_vulkan (GdkDisplay *self,
GError **error);
gboolean gdk_display_has_vulkan_feature (GdkDisplay *self,
GdkVulkanFeatures feature);
GdkVulkanContext * gdk_display_create_vulkan_context (GdkDisplay *self,

View File

@@ -367,7 +367,6 @@ gdk_vulkan_context_dispose (GObject *gobject)
{
GdkVulkanContext *context = GDK_VULKAN_CONTEXT (gobject);
GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context);
GdkDisplay *display;
VkDevice device;
guint i;
@@ -397,11 +396,6 @@ gdk_vulkan_context_dispose (GObject *gobject)
priv->surface = VK_NULL_HANDLE;
}
/* display will be unset in gdk_draw_context_dispose() */
display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (context));
if (display && priv->vulkan_ref)
gdk_display_unref_vulkan (display);
G_OBJECT_CLASS (gdk_vulkan_context_parent_class)->dispose (gobject);
}
@@ -887,8 +881,7 @@ gdk_vulkan_context_real_init (GInitable *initable,
VkBool32 supported;
uint32_t i;
priv->vulkan_ref = gdk_display_init_vulkan (display, error);
if (!priv->vulkan_ref)
if (!gdk_display_prepare_vulkan (display, error))
return FALSE;
if (surface == NULL)
@@ -1668,7 +1661,7 @@ gdk_vulkan_debug_report (VkDebugReportFlagsEXT flags,
return VK_FALSE;
}
static gboolean
gboolean
gdk_display_create_vulkan_instance (GdkDisplay *display,
GError **error)
{
@@ -1678,6 +1671,8 @@ gdk_display_create_vulkan_instance (GdkDisplay *display,
gboolean have_debug_report = FALSE;
VkResult res;
g_assert (display->vk_instance == NULL);
if (!gdk_has_feature (GDK_FEATURE_VULKAN))
{
g_set_error_literal (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_NOT_AVAILABLE,
@@ -1804,66 +1799,16 @@ gdk_display_create_vulkan_instance (GdkDisplay *display,
return TRUE;
}
/*
* gdk_display_init_vulkan:
* @display: a display
* @error: A potential error message
*
* Initializes Vulkan and returns an error on failure.
*
* If Vulkan is already initialized, this function returns
* %TRUE and increases the refcount of the existing instance.
*
* You need to gdk_display_unref_vulkan() to close it again.
*
* Returns: %TRUE if Vulkan is initialized.
**/
gboolean
gdk_display_init_vulkan (GdkDisplay *display,
GError **error)
{
if (display->vulkan_refcount == 0)
{
if (!gdk_display_create_vulkan_instance (display, error))
return FALSE;
}
display->vulkan_refcount++;
return TRUE;
}
/*
* gdk_display_ref_vulkan:
* @display: a GdkDisplay
*
* Increases the refcount of an existing Vulkan instance.
*
* This function must not be called if Vulkan may not be initialized
* yet, call gdk_display_init_vulkan() in that case.
**/
void
gdk_display_ref_vulkan (GdkDisplay *display)
{
g_assert (display->vulkan_refcount > 0);
display->vulkan_refcount++;
}
void
gdk_display_unref_vulkan (GdkDisplay *display)
gdk_display_destroy_vulkan_instance (GdkDisplay *display)
{
GHashTableIter iter;
gpointer key, value;
g_return_if_fail (GDK_IS_DISPLAY (display));
g_return_if_fail (display->vulkan_refcount > 0);
g_assert (GDK_IS_DISPLAY (display));
g_assert (display->vk_instance != NULL);
display->vulkan_refcount--;
if (display->vulkan_refcount > 0)
return;
GDK_DEBUG (VULKAN, "Closing Vulkan instance");
GDK_DEBUG (VULKAN, "Destroy Vulkan instance");
display->vulkan_features = 0;
g_clear_pointer (&display->vk_dmabuf_formats, gdk_dmabuf_formats_unref);
g_hash_table_iter_init (&iter, display->vk_shader_modules);
@@ -1940,18 +1885,11 @@ gdk_vulkan_init_dmabuf (GdkDisplay *display)
if (display->vk_dmabuf_formats != NULL)
return;
if (!gdk_has_feature (GDK_FEATURE_DMABUF))
if (!gdk_has_feature (GDK_FEATURE_DMABUF) ||
!gdk_display_prepare_vulkan (display, NULL) ||
(display->vulkan_features & GDK_VULKAN_FEATURE_DMABUF) == 0)
return;
if (!gdk_display_init_vulkan (display, NULL))
return;
if ((display->vulkan_features & GDK_VULKAN_FEATURE_DMABUF) == 0)
{
gdk_display_unref_vulkan (display);
return;
}
vulkan_builder = gdk_dmabuf_formats_builder_new ();
for (i = 0; gdk_dmabuf_vk_get_nth (i, &fourcc, &vk_format); i++)

View File

@@ -73,10 +73,9 @@ gdk_vulkan_handle_result (VkResult res,
#define GDK_VK_CHECK(func, ...) gdk_vulkan_handle_result (func (__VA_ARGS__), G_STRINGIFY (func))
gboolean gdk_display_init_vulkan (GdkDisplay *display,
gboolean gdk_display_create_vulkan_instance (GdkDisplay *display,
GError **error);
void gdk_display_ref_vulkan (GdkDisplay *display);
void gdk_display_unref_vulkan (GdkDisplay *display);
void gdk_display_destroy_vulkan_instance (GdkDisplay *display);
void gdk_vulkan_init_dmabuf (GdkDisplay *display);

View File

@@ -928,6 +928,10 @@ preferred_changed (GdkWaylandColorSurface *color,
{
GdkWaylandSurface *self = GDK_WAYLAND_SURFACE (data);
GDK_DISPLAY_DEBUG (gdk_surface_get_display (GDK_SURFACE (self)), EVENTS,
"preferred color state, surface %p color state %s",
self, gdk_color_state_get_name (color_state));
gdk_surface_set_color_state (GDK_SURFACE (self), color_state);
self->color_state_changed = TRUE;

View File

@@ -343,8 +343,6 @@ gsk_vulkan_device_finalize (GObject *object)
g_clear_pointer (&self->allocators[i], gsk_vulkan_allocator_unref);
g_clear_pointer (&self->external_allocator, gsk_vulkan_allocator_unref);
gdk_display_unref_vulkan (display);
G_OBJECT_CLASS (gsk_vulkan_device_parent_class)->finalize (object);
}
@@ -422,7 +420,7 @@ gsk_vulkan_device_get_for_display (GdkDisplay *display,
if (self)
return GSK_GPU_DEVICE (g_object_ref (self));
if (!gdk_display_init_vulkan (display, error))
if (!gdk_display_prepare_vulkan (display, error))
return NULL;
self = g_object_new (GSK_TYPE_VULKAN_DEVICE, NULL);

View File

@@ -653,7 +653,16 @@ vulkan_supported_platform (GdkSurface *surface,
VkPhysicalDeviceProperties props;
GError *error = NULL;
if (!gdk_display_init_vulkan (display, &error))
#ifdef GDK_WINDOWING_WAYLAND
if (!GDK_IS_WAYLAND_DISPLAY (gdk_surface_get_display (surface)) && !as_fallback)
{
GSK_DEBUG (RENDERER, "Not using '%s': platform is not Wayland",
g_type_name (renderer_type));
return FALSE;
}
#endif
if (!gdk_display_prepare_vulkan (display, &error))
{
GSK_DEBUG (RENDERER, "Not using Vulkan%s: %s",
as_fallback ? " as fallback" : "",
@@ -666,11 +675,11 @@ vulkan_supported_platform (GdkSurface *surface,
return TRUE;
vkGetPhysicalDeviceProperties (display->vk_physical_device, &props);
if (props.deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU)
{
GSK_DEBUG (RENDERER, "Not using '%s': device is CPU",
g_type_name (renderer_type));
gdk_display_unref_vulkan (display);
return FALSE;
}
@@ -681,21 +690,11 @@ vulkan_supported_platform (GdkSurface *surface,
{
GSK_DEBUG (RENDERER, "Not using '%s': no dmabuf support",
g_type_name (renderer_type));
gdk_display_unref_vulkan (display);
return FALSE;
}
#endif
#ifdef GDK_WINDOWING_WAYLAND
if (GDK_IS_WAYLAND_DISPLAY (gdk_surface_get_display (surface)))
return TRUE;
#endif
GSK_DEBUG (RENDERER, "Not using '%s': platform is not Wayland",
g_type_name (renderer_type));
gdk_display_unref_vulkan (display);
return FALSE;
return TRUE;
}
static GType
@@ -715,14 +714,6 @@ get_renderer_for_vulkan_fallback (GdkSurface *surface)
return GSK_TYPE_VULKAN_RENDERER;
}
static void
vulkan_cleanup (GdkSurface *surface)
{
GdkDisplay *display = gdk_surface_get_display (surface);
gdk_display_unref_vulkan (display);
}
#endif
static GType
@@ -733,20 +724,19 @@ get_renderer_fallback (GdkSurface *surface)
static struct {
GType (* get_renderer) (GdkSurface *surface);
void (* cleanup) (GdkSurface *surface);
} renderer_possibilities[] = {
{ get_renderer_for_display, NULL },
{ get_renderer_for_env_var, NULL },
{ get_renderer_for_backend, NULL },
{ get_renderer_for_display },
{ get_renderer_for_env_var },
{ get_renderer_for_backend },
#ifdef GDK_RENDERING_VULKAN
{ get_renderer_for_vulkan, vulkan_cleanup },
{ get_renderer_for_vulkan },
#endif
{ get_renderer_for_gl, NULL },
{ get_renderer_for_gl },
#ifdef GDK_RENDERING_VULKAN
{ get_renderer_for_vulkan_fallback, vulkan_cleanup },
{ get_renderer_for_vulkan_fallback },
#endif
{ get_renderer_for_gl_fallback, NULL },
{ get_renderer_fallback, NULL },
{ get_renderer_for_gl_fallback },
{ get_renderer_fallback },
};
/**
@@ -783,20 +773,13 @@ gsk_renderer_new_for_surface (GdkSurface *surface)
if (gsk_renderer_realize (renderer, surface, &error))
{
if (renderer_possibilities[i].cleanup)
renderer_possibilities[i].cleanup (surface);
GSK_DEBUG (RENDERER,
"Using renderer '%s' for surface '%s'",
G_OBJECT_TYPE_NAME (renderer),
G_OBJECT_TYPE_NAME (surface));
return renderer;
}
if (renderer_possibilities[i].cleanup)
renderer_possibilities[i].cleanup (surface);
GSK_DEBUG (RENDERER,
"Failed to realize renderer '%s' for surface '%s': %s",
G_OBJECT_TYPE_NAME (renderer),

View File

@@ -590,6 +590,7 @@ populate_servers (GtkPlacesView *view)
gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
gtk_widget_add_css_class (button, "sidebar-button");
gtk_widget_set_tooltip_text (button, _("Remove server"));
gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 2);
gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), grid);

View File

@@ -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

View File

@@ -577,7 +577,7 @@ init_vulkan (GtkInspectorGeneral *gen)
const char *types[] = { "other", "integrated GPU", "discrete GPU", "virtual GPU", "CPU" };
GError *error = NULL;
if (!gdk_display_init_vulkan (gen->display, &error))
if (!gdk_display_prepare_vulkan (gen->display, &error))
{
gtk_label_set_text (GTK_LABEL (gen->vk_device), C_("Vulkan device", "None"));
gtk_widget_set_visible (gen->vk_error_row, TRUE);
@@ -617,8 +617,6 @@ init_vulkan (GtkInspectorGeneral *gen)
add_instance_extensions (gen->vulkan_extensions_list);
add_device_extensions (gen->display->vk_physical_device, gen->vulkan_extensions_list);
add_layers (gen->vulkan_layers_list);
gdk_display_unref_vulkan (gen->display);
#else
gtk_label_set_text (GTK_LABEL (gen->vk_device), C_("Vulkan device", "None"));
gtk_widget_set_visible (gen->vk_api_version_row, FALSE);

View File

@@ -183,8 +183,13 @@ update_allocation (GtkWidget *w,
char *size_label;
GEnumClass *class;
GEnumValue *value;
GtkWidget *target;
if (!gtk_widget_compute_bounds (w, gtk_widget_get_parent (w), &bounds))
target = gtk_widget_get_parent (w);
if (target == NULL)
target = w;
if (!gtk_widget_compute_bounds (w, target, &bounds))
graphene_rect_init (&bounds, 0, 0, 0, 0);
size_label = g_strdup_printf ("%g×%g+%g+%g",

View File

@@ -45,6 +45,7 @@
#include "gtklabel.h"
#include "gtklistitem.h"
#include "gtkpopover.h"
#include "gtknative.h"
#include "gtksettings.h"
#include "gtksingleselection.h"
#include "gtksignallistitemfactory.h"
@@ -132,6 +133,37 @@ object_tree_widget_get_children (GObject *object)
return G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (list)));
}
static GObject *
object_tree_window_get_parent (GObject *object)
{
return NULL;
}
static GListModel *
object_tree_native_get_children (GObject *object)
{
GtkNative *native = GTK_NATIVE (object);
GListStore *list;
GListModel *sublist;
list = g_list_store_new (G_TYPE_LIST_MODEL);
sublist = G_LIST_MODEL (g_list_store_new (G_TYPE_OBJECT));
if (gtk_native_get_surface (native))
g_list_store_append (G_LIST_STORE (sublist), gtk_native_get_surface (native));
if (gtk_native_get_renderer (native))
g_list_store_append (G_LIST_STORE (sublist), gtk_native_get_renderer (native));
g_list_store_append (list, sublist);
g_object_unref (sublist);
sublist = object_tree_widget_get_children (object);
g_list_store_append (list, sublist);
g_object_unref (sublist);
return G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (list)));
}
static GListModel *
object_tree_tree_model_sort_get_children (GObject *object)
{
@@ -518,6 +550,16 @@ static const ObjectTreeClassFuncs object_tree_class_funcs[] = {
object_tree_widget_get_parent,
object_tree_combo_box_get_children
},
{
gtk_window_get_type,
object_tree_window_get_parent,
object_tree_native_get_children,
},
{
gtk_popover_get_type,
object_tree_widget_get_parent,
object_tree_native_get_children,
},
{
gtk_widget_get_type,
object_tree_widget_get_parent,

View File

@@ -275,6 +275,7 @@
<property name="direction">0</property>
<property name="popover">recent_servers_popover</property>
<property name="icon-name">pan-down-symbolic</property>
<property name="tooltip-text" translatable="yes">Show recent servers</property>
<style>
<class name="server-list-button"/>
</style>

3607
po/is.po

File diff suppressed because it is too large Load Diff

View File

@@ -1708,6 +1708,7 @@ main (int argc, char **argv)
g_option_context_add_main_entries (context, args, GETTEXT_PACKAGE);
g_option_context_parse (context, &argc, &argv, NULL);
g_option_context_free (context);
path = argv[1];
#ifdef G_OS_WIN32