Compare commits
10 Commits
amolenaar/
...
bilelmouss
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b800a5ea2d | ||
|
|
e37d15f75c | ||
|
|
ae180f85ca | ||
|
|
58036ece96 | ||
|
|
9d8679e211 | ||
|
|
bdb4d28acb | ||
|
|
11b28c24c2 | ||
|
|
aadf18579a | ||
|
|
29fd4ee16e | ||
|
|
cb0c4d6e88 |
@@ -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`
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
@@ -1941,11 +1886,9 @@ gdk_vulkan_init_dmabuf (GdkDisplay *display)
|
||||
return;
|
||||
|
||||
if (!gdk_has_feature (GDK_FEATURE_DMABUF) ||
|
||||
!gdk_display_init_vulkan (display, NULL) ||
|
||||
((display->vulkan_features & GDK_VULKAN_FEATURE_DMABUF) == 0))
|
||||
{
|
||||
return;
|
||||
}
|
||||
!gdk_display_prepare_vulkan (display, NULL) ||
|
||||
(display->vulkan_features & GDK_VULKAN_FEATURE_DMABUF) == 0)
|
||||
return;
|
||||
|
||||
vulkan_builder = gdk_dmabuf_formats_builder_new ();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
#include "linux-dmabuf-unstable-v1-client-protocol.h"
|
||||
#include "presentation-time-client-protocol.h"
|
||||
#include "xx-color-management-v4-client-protocol.h"
|
||||
#include "xdg-toplevel-tag-v1-client-protocol.h"
|
||||
|
||||
#include "wm-button-layout-translation.h"
|
||||
|
||||
@@ -554,6 +555,12 @@ gdk_registry_handle_global (void *data,
|
||||
wl_registry_bind (display_wayland->wl_registry, id,
|
||||
&xdg_system_bell_v1_interface, 1);
|
||||
}
|
||||
else if (strcmp (interface, xdg_toplevel_tag_manager_v1_interface.name) == 0)
|
||||
{
|
||||
display_wayland->xdg_toplevel_tag =
|
||||
wl_registry_bind (display_wayland->wl_registry, id,
|
||||
&xdg_toplevel_tag_manager_v1_interface, 1);
|
||||
}
|
||||
|
||||
g_hash_table_insert (display_wayland->known_globals,
|
||||
GUINT_TO_POINTER (id), g_strdup (interface));
|
||||
@@ -770,6 +777,7 @@ gdk_wayland_display_dispose (GObject *object)
|
||||
g_clear_pointer (&display_wayland->dmabuf_formats_info, dmabuf_formats_info_free);
|
||||
g_clear_pointer (&display_wayland->color, gdk_wayland_color_free);
|
||||
g_clear_pointer (&display_wayland->system_bell, xdg_system_bell_v1_destroy);
|
||||
g_clear_pointer (&display_wayland->xdg_toplevel_tag, xdg_toplevel_tag_manager_v1_destroy);
|
||||
|
||||
g_clear_pointer (&display_wayland->shm, wl_shm_destroy);
|
||||
g_clear_pointer (&display_wayland->wl_registry, wl_registry_destroy);
|
||||
@@ -2032,7 +2040,7 @@ init_settings (GdkDisplay *display)
|
||||
if (entry)
|
||||
{
|
||||
char *a = g_variant_print (v, FALSE);
|
||||
g_debug ("Using portal setting for %s %s: %s\n", schema_str, key, a);
|
||||
g_debug ("Using portal setting for %s %s: %s", schema_str, key, a);
|
||||
g_free (a);
|
||||
entry->valid = TRUE;
|
||||
apply_portal_setting (entry, v, display);
|
||||
|
||||
@@ -126,6 +126,7 @@ struct _GdkWaylandDisplay
|
||||
struct wp_viewporter *viewporter;
|
||||
struct wp_presentation *presentation;
|
||||
struct wp_single_pixel_buffer_manager_v1 *single_pixel_buffer;
|
||||
struct xdg_toplevel_tag_manager_v1 *xdg_toplevel_tag;
|
||||
GdkWaylandColor *color;
|
||||
|
||||
GList *async_roundtrips;
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <wayland/xdg-shell-unstable-v6-client-protocol.h>
|
||||
#include <wayland/xdg-foreign-unstable-v2-client-protocol.h>
|
||||
#include <wayland/xdg-dialog-v1-client-protocol.h>
|
||||
#include "xdg-toplevel-tag-v1-client-protocol.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -1257,7 +1258,7 @@ gdk_wayland_toplevel_set_transient_for (GdkWaylandToplevel *toplevel,
|
||||
|
||||
#define LAST_PROP 1
|
||||
|
||||
static void
|
||||
static void
|
||||
gdk_wayland_toplevel_set_decorated (GdkWaylandToplevel *self,
|
||||
gboolean decorated)
|
||||
{
|
||||
@@ -2480,6 +2481,50 @@ gdk_wayland_toplevel_set_application_id (GdkToplevel *toplevel,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* gdk_wayland_toplevel_set_tag:
|
||||
* @toplevel: (type GdkWaylandToplevel): a `GdkToplevel` to set the tag for
|
||||
* @tag: A preferably human-readable tag
|
||||
*
|
||||
* Set a tag to the toplevel allowing to uniquely identify it from the compositor
|
||||
* side.
|
||||
*
|
||||
* The tag along with the application ID can be used to create a unique identifier
|
||||
* per app / window.
|
||||
*
|
||||
* The tag may be shown to the user in UI, so it's preferable for
|
||||
* it to be human readable. Suitable tags would for example be
|
||||
* “main window”, “settings”, “e-mail composer” or similar.
|
||||
*
|
||||
* The tag does not need to be unique across applications.
|
||||
|
||||
* Returns: whether the tag was set.
|
||||
*
|
||||
* Since: 4.18
|
||||
*/
|
||||
gboolean
|
||||
gdk_wayland_toplevel_set_tag (GdkToplevel *toplevel,
|
||||
const char *tag)
|
||||
{
|
||||
GdkWaylandToplevel *wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel);
|
||||
GdkSurface *surface = GDK_SURFACE (toplevel);
|
||||
GdkDisplay *display = gdk_surface_get_display (surface);
|
||||
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
|
||||
if (!display_wayland->xdg_toplevel_tag)
|
||||
{
|
||||
g_warning ("Server is missing xdg_toplevel_tag support");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xdg_toplevel_tag_manager_v1_set_toplevel_tag (display_wayland->xdg_toplevel_tag,
|
||||
wayland_toplevel->display_server.xdg_toplevel,
|
||||
tag);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gdk_wayland_toplevel_inhibit_idle (GdkToplevel *toplevel)
|
||||
{
|
||||
|
||||
@@ -67,4 +67,8 @@ GDK_AVAILABLE_IN_ALL
|
||||
void gdk_wayland_toplevel_set_application_id (GdkToplevel *toplevel,
|
||||
const char *application_id);
|
||||
|
||||
GDK_AVAILABLE_IN_4_18
|
||||
gboolean gdk_wayland_toplevel_set_tag (GdkToplevel *toplevel,
|
||||
const char *tag);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@@ -156,6 +156,11 @@ proto_sources = [
|
||||
'stability': 'private',
|
||||
'version': 1,
|
||||
},
|
||||
{
|
||||
'name': 'xdg-toplevel-tag',
|
||||
'stability': 'private',
|
||||
'version': 1,
|
||||
},
|
||||
]
|
||||
|
||||
gdk_wayland_gen_headers = []
|
||||
|
||||
70
gdk/wayland/protocol/xdg-toplevel-tag-v1.xml
Normal file
70
gdk/wayland/protocol/xdg-toplevel-tag-v1.xml
Normal file
@@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="xdg_toplevel_tag_v1">
|
||||
<copyright>
|
||||
Copyright © 2024 Xaver Hugl
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<interface name="xdg_toplevel_tag_manager_v1" version="1">
|
||||
<description summary="protocol for setting toplevel tags">
|
||||
In order to make some window properties like position, size, "always on top"
|
||||
or user defined rules for window behavior persistent, the compositor needs
|
||||
some way to identify windows even after the application has been restarted.
|
||||
This protocol allows clients to make this possible by setting a tag for
|
||||
toplevels.
|
||||
|
||||
Warning! The protocol described in this file is currently in the testing
|
||||
phase. Backward compatible changes may be added together with the
|
||||
corresponding interface version bump. Backward incompatible changes can
|
||||
only be done by creating a new major version of the extension.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy toplevel tag object">
|
||||
Destroy this toplevel tag factory object. This request has no other effects.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="tag_on_mapped" value="0"
|
||||
summary="attempted to tag an already mapped toplevel"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_toplevel_tag">
|
||||
<description summary="set tag">
|
||||
Set a tag for a toplevel. The tag may be shown to the user in UI, so it's preferable for
|
||||
it to be human readable. Suitable tags would for example be "main window", "settings",
|
||||
"e-mail composer" or similar.
|
||||
|
||||
The tag does not need to be unique across applications, and the client may set the same
|
||||
tag for multiple windows, for example if the user has opened the same UI twice.
|
||||
How the potentially resulting conflicts are handled is compositor policy.
|
||||
|
||||
If a tag is set at all, the client must set the tag as part of the initial commit on the
|
||||
associated toplevel. If the toplevel is already mapped, or the following wl_surface.commit
|
||||
after this request maps the surface, the tag_on_mapped error is emitted.
|
||||
</description>
|
||||
<arg name="toplevel" type="object" interface="xdg_toplevel"/>
|
||||
<arg name="tag" type="string"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
</protocol>
|
||||
@@ -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);
|
||||
|
||||
@@ -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" : "",
|
||||
@@ -685,15 +694,7 @@ vulkan_supported_platform (GdkSurface *surface,
|
||||
}
|
||||
#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));
|
||||
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static GType
|
||||
|
||||
@@ -2638,11 +2638,11 @@ unpack_glyphs (PangoFont *font,
|
||||
}
|
||||
else
|
||||
{
|
||||
PangoRectangle ink_rect;
|
||||
PangoRectangle rect;
|
||||
|
||||
pango_font_get_glyph_extents (font, gi->glyph, &ink_rect, NULL);
|
||||
pango_font_get_glyph_extents (font, gi->glyph, NULL, &rect);
|
||||
|
||||
gi->geometry.width = ink_rect.width;
|
||||
gi->geometry.width = rect.width;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
@@ -745,6 +743,7 @@ add_wayland_protocols (GdkDisplay *display,
|
||||
append_wayland_protocol_row (gen, (struct wl_proxy *)d->single_pixel_buffer);
|
||||
append_wayland_protocol_row (gen, d->color ? gdk_wayland_color_get_color_manager (d->color) : NULL);
|
||||
append_wayland_protocol_row (gen, (struct wl_proxy *)d->system_bell);
|
||||
append_wayland_protocol_row (gen, (struct wl_proxy *)d->xdg_toplevel_tag);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
181
po/sr.po
181
po/sr.po
@@ -3,26 +3,26 @@
|
||||
# This file is distributed under the same license as the gtk package.
|
||||
# Translators:
|
||||
# Данило Шеган <dsegan@gmx.net>, 2004–2005.
|
||||
# Милош Поповић <gpopac@gmail.com>, 2010–2017.
|
||||
# Марко М. Костић (Marko M. Kostić) <marko.m.kostic@gmail.com>, 2015.
|
||||
# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011–20-2024.
|
||||
# Милош Поповић <gpopac@gmail.com>, 2010–20-2024.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gtk+ 2.14\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gtk/-/issues/\n"
|
||||
"POT-Creation-Date: 2024-11-01 19:50+0000\n"
|
||||
"PO-Revision-Date: 2024-11-07 19:03+0100\n"
|
||||
"Last-Translator: Марко М. Костић <marko.m.kostic@gmail.com>\n"
|
||||
"Language-Team: Serbian <српски <gnome-sr@googlegroups.org>>\n"
|
||||
"POT-Creation-Date: 2024-11-07 18:03+0000\n"
|
||||
"PO-Revision-Date: 2024-11-11 14:13+0100\n"
|
||||
"Last-Translator: Милош Поповић <gpopac@gmail.com>\n"
|
||||
"Language-Team: Serbian <Serbian <gnome-sr@googlegroups.com>>\n"
|
||||
"Language: sr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
|
||||
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
"X-Generator: Poedit 3.4.4\n"
|
||||
"X-Generator: Gtranslator 46.1\n"
|
||||
|
||||
#: gdk/broadway/gdkbroadway-server.c:135
|
||||
#, c-format
|
||||
@@ -52,16 +52,14 @@ msgid "cicp: Unspecified parameters not supported"
|
||||
msgstr "cicp: ненаведени параметри нису подржани"
|
||||
|
||||
#: gdk/gdkcolorstate.c:724
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Format %s not supported"
|
||||
#, c-format
|
||||
msgid "cicp: Transfer function %u not supported"
|
||||
msgstr "Формат „%s“ није подржан"
|
||||
msgstr "cicp: није подржаја функција преноса „%u“"
|
||||
|
||||
#: gdk/gdkcolorstate.c:754
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Format %s not supported"
|
||||
#, c-format
|
||||
msgid "cicp: Color primaries %u not supported"
|
||||
msgstr "Формат „%s“ није подржан"
|
||||
msgstr "cicp: нису подржане основне боје „%u“"
|
||||
|
||||
#: gdk/gdkcontentprovider.c:106 gdk/gdkcontentproviderimpl.c:313
|
||||
#: gdk/gdkcontentproviderimpl.c:532
|
||||
@@ -79,16 +77,12 @@ msgid "The current backend does not support OpenGL"
|
||||
msgstr "Текући позадинац не подржава ОупенГЛ"
|
||||
|
||||
#: gdk/gdkdisplay.c:1317 gdk/gdkvulkancontext.c:1710
|
||||
#, fuzzy
|
||||
#| msgid "Vulkan support disabled via GDK_DEBUG"
|
||||
msgid "Vulkan support disabled via GDK_DISABLE"
|
||||
msgstr "Подршка за Вулкан је онемогућена са „GDK_DEBUG“"
|
||||
msgstr "Подршка за Вулкан је онемогућена са „GDK_DISABLE“"
|
||||
|
||||
#: gdk/gdkdisplay.c:1371
|
||||
#, fuzzy
|
||||
#| msgid "GL support disabled via GDK_DEBUG"
|
||||
msgid "OpenGL support disabled via GDK_DISABLE"
|
||||
msgstr "Подршка за ГЛ је онемогућена са „GDK_DEBUG“"
|
||||
msgstr "Подршка за OypenГЛ је онемогућена са „GDK_DISABLE“"
|
||||
|
||||
#: gdk/gdkdisplay.c:1685
|
||||
msgid "No EGL configuration available"
|
||||
@@ -155,16 +149,12 @@ msgid "Unable to create a GL context"
|
||||
msgstr "Не могу да направим ГЛ садржај"
|
||||
|
||||
#: gdk/gdkglcontext.c:1338
|
||||
#, fuzzy
|
||||
#| msgid "OpenGL ES disabled via GDK_DEBUG"
|
||||
msgid "OpenGL ES API disabled via GDK_DISABLE"
|
||||
msgstr "Све осим ОупенГЛЕС-а је искључено преко „GDK_DEBUG“"
|
||||
msgstr "ОупенГЛ ЕС АПИ је онемогућен преко „GDK_DISABLE“"
|
||||
|
||||
#: gdk/gdkglcontext.c:1350
|
||||
#, fuzzy
|
||||
#| msgid "OpenGL disabled via GDK_DEBUG"
|
||||
msgid "OpenGL API disabled via GDK_DISABLE"
|
||||
msgstr "Подршка за ОупенГЛ је онемогућена преко „GDK_DEBUG“"
|
||||
msgstr "ОупенГЛ АПИ је онемогућен преко „GDK_DISABLE“"
|
||||
|
||||
#: gdk/gdkglcontext.c:1361
|
||||
#, c-format
|
||||
@@ -180,10 +170,9 @@ msgid "Trying to use %s, but %s is already in use"
|
||||
msgstr "Покушавам да користим „%s“, али је „%s“ већ у употреби"
|
||||
|
||||
#: gdk/gdkglcontext.c:2182
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Trying to use %s, but %s is already in use"
|
||||
#, c-format
|
||||
msgid "Trying to use %s, but it is disabled via GDK_DISABLE"
|
||||
msgstr "Покушавам да користим „%s“, али је „%s“ већ у употреби"
|
||||
msgstr "Покушавам да користим „%s“, али је онемогућен преко „GDK_DISABLE“"
|
||||
|
||||
#: gdk/gdktexture.c:672
|
||||
msgid "Unknown image format."
|
||||
@@ -7454,10 +7443,9 @@ msgid "%s only accepts three children"
|
||||
msgstr "%s прихвата само три нижа елемента"
|
||||
|
||||
#: tools/gtk-builder-tool-simplify.c:1773
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s only accepts three children"
|
||||
#, c-format
|
||||
msgid "%s only accepts one center child"
|
||||
msgstr "%s прихвата само три нижа елемента"
|
||||
msgstr "%s прихвата само један нижи елемент на средини"
|
||||
|
||||
#: tools/gtk-builder-tool-simplify.c:2549
|
||||
#, c-format
|
||||
@@ -7517,20 +7505,7 @@ msgid "Validate the file."
|
||||
msgstr "Потврди датотеку."
|
||||
|
||||
#: tools/gtk-image-tool.c:36
|
||||
#, fuzzy, c-format
|
||||
#| msgid ""
|
||||
#| "Usage:\n"
|
||||
#| " gtk4-rendernode-tool [COMMAND] [OPTION…] FILE\n"
|
||||
#| "\n"
|
||||
#| "Perform various tasks on GTK render nodes.\n"
|
||||
#| "\n"
|
||||
#| "Commands:\n"
|
||||
#| " benchmark Benchmark rendering of a node\n"
|
||||
#| " compare Compare nodes or images\n"
|
||||
#| " info Provide information about the node\n"
|
||||
#| " show Show the node\n"
|
||||
#| " render Take a screenshot of the node\n"
|
||||
#| "\n"
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage:\n"
|
||||
" gtk4-image-tool [COMMAND] [OPTION…] FILE…\n"
|
||||
@@ -7546,16 +7521,16 @@ msgid ""
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Коришћење:\n"
|
||||
" gtk4-rendernode-tool [НАРЕДБА] [ОПЦИЈА…] ДАТОТЕКА\n"
|
||||
" gtk4-image-tool [НАРЕДБА] [ОПЦИЈА…] ДАТОТЕКА…\n"
|
||||
"\n"
|
||||
"Обавља разне задатке на чворовима Гтк цртача.\n"
|
||||
"Обавља разне задатке на сликама.\n"
|
||||
"\n"
|
||||
"Наредбе:\n"
|
||||
" benchmark Прати учинак исцртавања чвора\n"
|
||||
" compare Упореди чворове или слике\n"
|
||||
" info Обезбеђује податке о чвору\n"
|
||||
" show Приказује чвор\n"
|
||||
" render Прави снимак екрана чвора\n"
|
||||
" compare Приказује разлике између две слике\n"
|
||||
" convert Претвара слику у други формат или стање боја\n"
|
||||
" info Приказује опште податке о слици\n"
|
||||
" relabel Мења стање боја слике без претварања у други формат\n"
|
||||
" show Приказује слику\n"
|
||||
"\n"
|
||||
|
||||
#: tools/gtk-image-tool-compare.c:43 tools/gtk-rendernode-tool-compare.c:67
|
||||
@@ -7569,16 +7544,14 @@ msgstr "Упореди две слике"
|
||||
#: tools/gtk-image-tool-compare.c:70 tools/gtk-image-tool-convert.c:113
|
||||
#: tools/gtk-image-tool-info.c:90 tools/gtk-image-tool-relabel.c:109
|
||||
#: tools/gtk-image-tool-show.c:141
|
||||
#, fuzzy, c-format
|
||||
#| msgid "No .ui file specified\n"
|
||||
#, c-format
|
||||
msgid "No image file specified\n"
|
||||
msgstr "Није наведена „.ui“ датотека\n"
|
||||
msgstr "Није одређена датотека са сликом\n"
|
||||
|
||||
#: tools/gtk-image-tool-compare.c:76
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Can only accept a single .node file\n"
|
||||
#, c-format
|
||||
msgid "Can only accept two image files\n"
|
||||
msgstr "Може да прихвати само једну .node датотеку\n"
|
||||
msgstr "Може да прихвати само две датотеке са сликом\n"
|
||||
|
||||
#: tools/gtk-image-tool-compare.c:85 tools/gtk-rendernode-tool-compare.c:111
|
||||
#, c-format
|
||||
@@ -7606,10 +7579,8 @@ msgid "No differences.\n"
|
||||
msgstr "Нема разлике.\n"
|
||||
|
||||
#: tools/gtk-image-tool-convert.c:86
|
||||
#, fuzzy
|
||||
#| msgid "_Format for:"
|
||||
msgid "Format to use"
|
||||
msgstr "_Формат за:"
|
||||
msgstr "Формат за коришћење"
|
||||
|
||||
#: tools/gtk-image-tool-convert.c:86
|
||||
msgid "FORMAT"
|
||||
@@ -7620,10 +7591,8 @@ msgid "Color state to use"
|
||||
msgstr "Стање боје за коришћење"
|
||||
|
||||
#: tools/gtk-image-tool-convert.c:87 tools/gtk-image-tool-relabel.c:84
|
||||
#, fuzzy
|
||||
#| msgid "COLOR"
|
||||
msgid "COLORSTATE"
|
||||
msgstr "БОЈА"
|
||||
msgstr "СТАЊЕ_БОЈА"
|
||||
|
||||
#: tools/gtk-image-tool-convert.c:88 tools/gtk-image-tool-relabel.c:85
|
||||
msgid "Color state to use, as cicp tuple"
|
||||
@@ -7638,10 +7607,9 @@ msgid "Convert the image to a different format or color state."
|
||||
msgstr "Претвори слику у други формат или стање боје."
|
||||
|
||||
#: tools/gtk-image-tool-convert.c:119 tools/gtk-image-tool-relabel.c:115
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Can only render a single .ui file to a single output file\n"
|
||||
#, c-format
|
||||
msgid "Can only accept a single image file and output file\n"
|
||||
msgstr "Могу да исцртам само једну .ui датотеку у једну излазну датотеку\n"
|
||||
msgstr "Може да прихвати само једну датотеку са сликом и излазну датотеку\n"
|
||||
|
||||
#: tools/gtk-image-tool-convert.c:133
|
||||
#, c-format
|
||||
@@ -7661,16 +7629,19 @@ msgid ""
|
||||
"Possible values:\n"
|
||||
" %s\n"
|
||||
msgstr ""
|
||||
"Није стање боја: %s\n"
|
||||
"Могуће вредности:\n"
|
||||
" %s\n"
|
||||
|
||||
#: tools/gtk-image-tool-convert.c:160 tools/gtk-image-tool-relabel.c:140
|
||||
#, c-format
|
||||
msgid "Can't specify both --color-state and --cicp\n"
|
||||
msgstr ""
|
||||
msgstr "Не можете да одредите и --color-state и --cicp\n"
|
||||
|
||||
#: tools/gtk-image-tool-convert.c:168 tools/gtk-image-tool-relabel.c:148
|
||||
#, c-format
|
||||
msgid "Not a supported cicp tuple: %s\n"
|
||||
msgstr ""
|
||||
msgstr "Није подржан cicp типл: %s\n"
|
||||
|
||||
#: tools/gtk-image-tool-info.c:55
|
||||
msgid "Format:"
|
||||
@@ -7681,20 +7652,17 @@ msgid "Color state:"
|
||||
msgstr "Стање боје:"
|
||||
|
||||
#: tools/gtk-image-tool-info.c:77
|
||||
#, fuzzy
|
||||
#| msgid "Provide information about the render node."
|
||||
msgid "Provide information about the image."
|
||||
msgstr "Обезбеђује податке о чвору цртача."
|
||||
msgstr "Обезбеђује податке о слици."
|
||||
|
||||
#: tools/gtk-image-tool-info.c:96
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Can only accept a single .node file\n"
|
||||
#, c-format
|
||||
msgid "Can only accept a single image file\n"
|
||||
msgstr "Може да прихвати само једну .node датотеку\n"
|
||||
msgstr "Може да прихвати само једну датотеку са сликом\n"
|
||||
|
||||
#: tools/gtk-image-tool-relabel.c:96
|
||||
msgid "Change the color state of the image without conversion."
|
||||
msgstr ""
|
||||
msgstr "Мења стање боја слике без њеног претварања у други формат."
|
||||
|
||||
#: tools/gtk-image-tool-relabel.c:130
|
||||
#, c-format
|
||||
@@ -7702,6 +7670,8 @@ msgid ""
|
||||
"Not a color state: %s\n"
|
||||
"Possible values: %s\n"
|
||||
msgstr ""
|
||||
"Није стање боје: %s\n"
|
||||
"Могуће вредности: %s\n"
|
||||
|
||||
#: tools/gtk-image-tool-show.c:117 tools/gtk-rendernode-tool-show.c:115
|
||||
msgid "Don't add a titlebar"
|
||||
@@ -7709,12 +7679,12 @@ msgstr "Без траке за наслов"
|
||||
|
||||
#: tools/gtk-image-tool-show.c:128
|
||||
msgid "Show one or more images."
|
||||
msgstr ""
|
||||
msgstr "Прикажи једну или више слика."
|
||||
|
||||
#: tools/gtk-image-tool-utils.c:234
|
||||
#, c-format
|
||||
msgid "cicp must be 4 numbers, separated by /\n"
|
||||
msgstr ""
|
||||
msgstr "cicp мора да садржи 4 броја раздвојена са „/“\n"
|
||||
|
||||
#: tools/gtk-launch.c:40
|
||||
msgid "Show program version"
|
||||
@@ -8082,20 +8052,7 @@ msgid "Failed to parse '%s' as number"
|
||||
msgstr "Не могу да рашчланим „%s“ као број"
|
||||
|
||||
#: tools/gtk-rendernode-tool.c:35
|
||||
#, fuzzy, c-format
|
||||
#| msgid ""
|
||||
#| "Usage:\n"
|
||||
#| " gtk4-rendernode-tool [COMMAND] [OPTION…] FILE\n"
|
||||
#| "\n"
|
||||
#| "Perform various tasks on GTK render nodes.\n"
|
||||
#| "\n"
|
||||
#| "Commands:\n"
|
||||
#| " benchmark Benchmark rendering of a node\n"
|
||||
#| " compare Compare nodes or images\n"
|
||||
#| " info Provide information about the node\n"
|
||||
#| " show Show the node\n"
|
||||
#| " render Take a screenshot of the node\n"
|
||||
#| "\n"
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Usage:\n"
|
||||
" gtk4-rendernode-tool [COMMAND] [OPTION…] FILE\n"
|
||||
@@ -8117,11 +8074,12 @@ msgstr ""
|
||||
"Обавља разне задатке на чворовима Гтк цртача.\n"
|
||||
"\n"
|
||||
"Наредбе:\n"
|
||||
" benchmark Прати учинак исцртавања чвора\n"
|
||||
" benchmark Прати учинак исцртавања чвора\n"
|
||||
" compare Упореди чворове или слике\n"
|
||||
" info Обезбеђује податке о чвору\n"
|
||||
" show Приказује чвор\n"
|
||||
" render Прави снимак екрана чвора\n"
|
||||
" extract Извлачи урл адресе са подацима\n"
|
||||
" info Обезбеђује податке о чвору\n"
|
||||
" show Приказује чвор\n"
|
||||
" render Прави снимак екрана чвора\n"
|
||||
"\n"
|
||||
|
||||
#: tools/gtk-rendernode-tool-benchmark.c:96
|
||||
@@ -8188,16 +8146,13 @@ msgstr "Не могу да направим цртач: %s\n"
|
||||
|
||||
#: tools/gtk-rendernode-tool-extract.c:73
|
||||
#: tools/gtk-rendernode-tool-extract.c:149
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Failed to write header\n"
|
||||
#, c-format
|
||||
msgid "Failed to write %s\n"
|
||||
msgstr "Нисам успео да запишем заглавље\n"
|
||||
msgstr "Не могу да упишем %s\n"
|
||||
|
||||
#: tools/gtk-rendernode-tool-extract.c:292
|
||||
#, fuzzy
|
||||
#| msgid "Renderer to use"
|
||||
msgid "Directory to use"
|
||||
msgstr "Цртач који се користи"
|
||||
msgstr "Директоријум за коришћење"
|
||||
|
||||
#: tools/gtk-rendernode-tool-extract.c:292
|
||||
msgid "DIRECTORY"
|
||||
@@ -8208,10 +8163,8 @@ msgid "Be verbose"
|
||||
msgstr "Опширнији испис"
|
||||
|
||||
#: tools/gtk-rendernode-tool-extract.c:303
|
||||
#, fuzzy
|
||||
#| msgid "Show the render node."
|
||||
msgid "Extract data urls from the render node."
|
||||
msgstr "Приказује исцртани чвор."
|
||||
msgstr "Извлачи адресе података из чвора цртача."
|
||||
|
||||
#: tools/gtk-rendernode-tool-extract.c:322 tools/gtk-rendernode-tool-info.c:254
|
||||
#, c-format
|
||||
@@ -8219,32 +8172,24 @@ msgid "Can only accept a single .node file\n"
|
||||
msgstr "Може да прихвати само једну .node датотеку\n"
|
||||
|
||||
#: tools/gtk-rendernode-tool-info.c:193
|
||||
#, fuzzy
|
||||
#| msgid "Number of nodes: %u\n"
|
||||
msgid "Number of nodes:"
|
||||
msgstr "Број чворова: %u\n"
|
||||
msgstr "Број чворова:"
|
||||
|
||||
#: tools/gtk-rendernode-tool-info.c:200
|
||||
#, fuzzy
|
||||
#| msgid "Depth: %u\n"
|
||||
msgid "Depth:"
|
||||
msgstr "Дубина: %u\n"
|
||||
msgstr "Дубина:"
|
||||
|
||||
#: tools/gtk-rendernode-tool-info.c:203
|
||||
#, fuzzy
|
||||
#| msgid "Bounds"
|
||||
msgid "Bounds:"
|
||||
msgstr "Границе"
|
||||
msgstr "Границе:"
|
||||
|
||||
#: tools/gtk-rendernode-tool-info.c:204
|
||||
#, fuzzy
|
||||
#| msgid "Origin: %g %g\n"
|
||||
msgid "Origin:"
|
||||
msgstr "Почетак: %g %g\n"
|
||||
msgstr "Почетак:"
|
||||
|
||||
#: tools/gtk-rendernode-tool-info.c:208 tools/gtk-rendernode-tool-info.c:214
|
||||
msgid "Opaque part:"
|
||||
msgstr ""
|
||||
msgstr "Непровидни део:"
|
||||
|
||||
#: tools/gtk-rendernode-tool-info.c:235
|
||||
msgid "Provide information about the render node."
|
||||
|
||||
11152
po/sr@latin.po
11152
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
text {
|
||||
color: rgb(50,50,50);
|
||||
font: "Cantarell 14px";
|
||||
glyphs: "N", 430 4.2002, 406 6.10352, 417 7, 772 4, 783 5, 783 5, 793 6 0 0 same-cluster;
|
||||
glyphs: "Ntp", 417 7, 772 4, 783 5, 783 5, 793 6 0 0 same-cluster;
|
||||
offset: 0 32.0186;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user