Compare commits

...

10 Commits

Author SHA1 Message Date
Bilal Elmoussaoui
b800a5ea2d gdk/wayland: Implement toplevel tag protocol
The toplevel tag would an application developer to tag a toplevel
surface with a tag.

When combined with the application-id, the compositor can use that
information to identify specific windows and use it for
configurability/scriptability.

The protocol:
https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/238
2024-11-13 13:33:10 +01: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
Matthias Clasen
9d8679e211 Merge branch 'wip/chergert/drop-g_debug-newline' into 'main'
gdk/wayland: remove trailing \n from g_debug()

See merge request GNOME/gtk!7913
2024-11-11 20:55:22 +00:00
Christian Hergert
bdb4d28acb gdk/wayland: remove trailing \n from g_debug()
Log messages do not need newlines.
2024-11-11 11:38:06 -08:00
Милош Поповић
11b28c24c2 Update Serbian (Latin) translation
(cherry picked from commit 60fec7db51)
2024-11-11 13:15:47 +00:00
Милош Поповић
aadf18579a Update Serbian translation
(cherry picked from commit 3c56a2915c)
2024-11-11 13:14:08 +00:00
Matthias Clasen
29fd4ee16e Merge branch 'for-main' into 'main'
rendernodeparser: Use advance width for glyphs

See merge request GNOME/gtk!7896
2024-11-10 02:11:32 +00:00
Matthias Clasen
cb0c4d6e88 rendernodeparser: Use advance width for glyphs
Commit f5159e1ecb introduced more flexible ways of specifying
glyph strings in node files, but it used ink rect width instead
of the more appropriate advance width when reconstrucing the
glyph string.

Fix expected output of one test to match.
2024-11-07 15:46:09 -05:00
17 changed files with 7702 additions and 3950 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);
@@ -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 ();

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

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

View File

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

View File

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

View File

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

View File

@@ -156,6 +156,11 @@ proto_sources = [
'stability': 'private',
'version': 1,
},
{
'name': 'xdg-toplevel-tag',
'stability': 'private',
'version': 1,
},
]
gdk_wayland_gen_headers = []

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

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" : "",
@@ -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

View File

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

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);
@@ -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
View File

@@ -3,26 +3,26 @@
# This file is distributed under the same license as the gtk package.
# Translators:
# Данило Шеган <dsegan@gmx.net>, 20042005.
# Милош Поповић <gpopac@gmail.com>, 20102017.
# Марко М. Костић (Marko M. Kostić) <marko.m.kostic@gmail.com>, 2015.
# Мирослав Николић <miroslavnikolic@rocketmail.com>, 201120-2024.
# Милош Поповић <gpopac@gmail.com>, 201020-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."

File diff suppressed because it is too large Load Diff

View File

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