Compare commits

..

1 Commits

Author SHA1 Message Date
Matthias Clasen 70eec3ee01 listitemwidget: Update some accessible state
Pass the selected state on to a11y.

Fixes: #6663
2024-04-26 11:50:30 -04:00
212 changed files with 2570 additions and 4033 deletions
-48
View File
@@ -1,54 +1,6 @@
Overview of Changes in 4.15.1, xx-xx-xxxx
=========================================
* GtkGraphicsOffload:
- Don't crash without a child
* CSS:
- Support the :root selector
* Icontheme:
- Make symbolic svg loading more efficient
- Handle color-free symbolics more efficiently
* Accessibility:
- Make the gtk-demo sidebar search more accessible
- Stop emitting focus events
* GDK:
- Support XDG_ACTIVATION_TOKEN
- dmabuf: Be more defensive when importing unknown formats to GL
- dmabuf: Use narrow range for YUV
* GSK:
- Improve logging for GDK_DEBUG=offload
- Improve logging for GSK_DEBUG=renderer
- gpu: Warn about inefficient texture import
- gpu: Handle tiny offscreens correctly
- vulkan: Add profiler marks in various places
- vulkan: Fix a problem with imported dmabufs showing up black
* Wayland:
- Use wl_compositor version 6
* X11:
- Implement a missing method
* Build:
- Fix many ubsan warnings
* Debugging:
- Show more texture details in the recorder
* macOS:
- Fix problems with events handed back to the OS
- Respect GDK_DEBUG=default-settings
* Translation updates:
Korean
Turkish
Overview of Changes in 4.15.0, 21-04-2024
=========================================
+2 -6
View File
@@ -363,9 +363,7 @@ insert_markup_idle (gpointer data)
if (g_get_monotonic_time () - begin > G_TIME_SPAN_MILLISECOND)
{
guint id;
id = g_idle_add (insert_markup_idle, data);
g_source_set_name_by_id (id, "[gtk-demo] insert_markup_idle");
g_idle_add (insert_markup_idle, data);
return G_SOURCE_REMOVE;
}
@@ -400,9 +398,7 @@ parse_markup_idle (gpointer data)
do {
if (g_get_monotonic_time () - begin > G_TIME_SPAN_MILLISECOND)
{
guint id;
id = g_idle_add (parse_markup_idle, data);
g_source_set_name_by_id (id, "[gtk-demo] parse_markup_idle");
g_idle_add (parse_markup_idle, data);
return G_SOURCE_REMOVE;
}
+2 -1
View File
@@ -40,7 +40,7 @@ get_win32_all_locales_scripts (LPWSTR locale_w, DWORD flags, LPARAM param)
{
wchar_t *langname_w = NULL;
wchar_t locale_abbrev_w[9];
gchar *langname, *locale_abbrev, *locale;
gchar *langname, *locale_abbrev, *locale, *p;
gint i;
const LCTYPE iso639_lctypes[] = { LOCALE_SISO639LANGNAME, LOCALE_SISO639LANGNAME2 };
GHashTable *ht_scripts_langs = (GHashTable *) param;
@@ -59,6 +59,7 @@ get_win32_all_locales_scripts (LPWSTR locale_w, DWORD flags, LPARAM param)
GetLocaleInfoEx (locale_w, LOCALE_SLOCALIZEDDISPLAYNAME, langname_w, langname_size);
langname = g_utf16_to_utf8 (langname_w, -1, NULL, NULL, NULL);
locale = g_utf16_to_utf8 (locale_w, -1, NULL, NULL, NULL);
p = strchr (locale, '-');
lang = pango_language_from_string (locale);
if (g_hash_table_lookup (ht_scripts_langs, lang) == NULL)
g_hash_table_insert (ht_scripts_langs, lang, langname);
-30
View File
@@ -20,7 +20,6 @@
#include "config.h"
#include <gtk/gtk.h>
#include <glib/gstdio.h>
#include <glib/gi18n.h>
#include "demos.h"
#include "fontify.h"
@@ -924,34 +923,6 @@ clear_search (GtkSearchBar *bar)
}
}
static void
search_results_update (GObject *filter_model,
GParamSpec *pspec,
GtkEntry *entry)
{
gsize n_items = g_list_model_get_n_items (G_LIST_MODEL (filter_model));
if (strlen (gtk_editable_get_text (GTK_EDITABLE (entry))) > 0)
{
char *text;
if (n_items > 0)
text = g_strdup_printf (ngettext ("%ld search result", "%ld search results", n_items), n_items);
else
text = g_strdup (_("No search results"));
gtk_accessible_update_property (GTK_ACCESSIBLE (entry),
GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, text,
-1);
g_free (text);
}
else
{
gtk_accessible_reset_property (GTK_ACCESSIBLE (entry), GTK_ACCESSIBLE_PROPERTY_DESCRIPTION);
}
}
static void
activate (GApplication *app)
{
@@ -999,7 +970,6 @@ activate (GApplication *app)
search_entry = GTK_WIDGET (gtk_builder_get_object (builder, "search-entry"));
g_signal_connect (search_entry, "search-changed", G_CALLBACK (demo_search_changed_cb), filter);
g_signal_connect (filter_model, "notify::n-items", G_CALLBACK (search_results_update), search_entry);
selection = gtk_single_selection_new (G_LIST_MODEL (filter_model));
g_signal_connect (selection, "notify::selected-item", G_CALLBACK (selection_cb), NULL);
-2
View File
@@ -330,7 +330,6 @@ stroke bounds of the path.
| offset | `<point>` | 0 0 | non-default |
| hint-style | `<hint style>` | slight | non-default |
| antialias | `<antialias>` | gray | non-default |
| hint-metrics | `<hint metrics>` | off | non-default |
Creates a node like `gsk_text_node_new()` with the given properties.
@@ -347,7 +346,6 @@ font, an error node will be returned.
Possible values for hint-style are none, slight or full.
Possible value for antialias are none or gray.
Possible value for hint-metrics are on or off.
### texture
+2 -5
View File
@@ -5,11 +5,8 @@ Title: Cairo interaction
[Cairo](http://cairographics.org) is a graphics library that supports vector
graphics and image compositing that can be used with GTK.
GDK does not wrap the Cairo API and it is not possible to use cairo directly
to draw on a [class@Gdk.Surface]. You can either use a
[GtkDrawingArea](../gtk4/class.DrawingArea.html) widget or
[gtk_snapshot_append_cairo](../gtk4/func.Snapshot.append_cairo.html)
for drawing with cairo in a GTK4 application.
GDK does not wrap the Cairo API; instead it allows to create Cairo
drawing contexts which can be used to draw on [class@Gdk.Surface]s.
Additional functions allow use [struct@Gdk.Rectangle]s with Cairo
and to use [struct@Gdk.RGBA], `GdkPixbuf`, and [class@Gdk.Surface]
@@ -155,7 +155,6 @@ Each property name is part of the `GtkAccessibleProperty` enumeration.
| %GTK_ACCESSIBLE_PROPERTY_VALUE_MIN | “aria-valuemin” | double |
| %GTK_ACCESSIBLE_PROPERTY_VALUE_NOW | “aria-valuenow” | double |
| %GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT | “aria-valuetext” | translatable string |
| %GTK_ACCESSIBLE_PROPERTY_HELP_TEXT | N/A | translatable string |
#### List of accessible relations
@@ -217,10 +216,6 @@ are accessible as part of the development process. The GTK Inspector shows
the accessible attributes of each widget, and also provides an overlay that
can highlight accessibility issues.
If you support some non-standard keyboard interactions for a widget, you
**should** set an appropriate `GTK_ACCESSIBLE_PROPERTY_HELP_TEXT` to help
discoverability of the behavior.
It is possible to set accessible attributes in UI files as well:
```xml
<object class="GtkButton" id="button1">
+19 -43
View File
@@ -143,50 +143,31 @@ static const GdkDebugKey gdk_debug_keys[] = {
#ifdef G_HAS_CONSTRUCTORS
#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA
#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(stash_and_unset_environment)
#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(stash_desktop_startup_notification_id)
#endif
G_DEFINE_CONSTRUCTOR(stash_and_unset_environment)
G_DEFINE_CONSTRUCTOR(stash_desktop_startup_notification_id)
#endif
static char *startup_notification_id = NULL;
static char *xdg_activation_token = NULL;
static void
stash_and_unset_environment (void)
stash_desktop_startup_notification_id (void)
{
/* Copies environment variables and unsets them so they won't be inherited by
* child processes and confuse things.
*
* Changing environment variables can be racy so we try to do this as early as
* possible in the program flow and before any printing that might involve
* environment variables.
*/
struct {
const char *key;
char **dst;
} vars[] = {
{ "DESKTOP_STARTUP_ID", &startup_notification_id },
{ "XDG_ACTIVATION_TOKEN", &xdg_activation_token },
};
size_t i;
const char *desktop_startup_id;
for (i = 0; i < G_N_ELEMENTS (vars); i++)
*vars[i].dst = g_strdup (g_getenv (vars[i].key));
for (i = 0; i < G_N_ELEMENTS (vars); i++)
g_unsetenv (vars[i].key);
for (i = 0; i < G_N_ELEMENTS (vars); i++)
desktop_startup_id = g_getenv ("DESKTOP_STARTUP_ID");
if (desktop_startup_id && *desktop_startup_id != '\0')
{
if (*vars[i].dst == NULL)
continue;
if (!g_utf8_validate (*vars[i].dst, -1, NULL))
{
g_warning ("%s contains invalid UTF-8", vars[i].key);
g_clear_pointer (vars[i].dst, g_free);
}
if (!g_utf8_validate (desktop_startup_id, -1, NULL))
g_warning ("DESKTOP_STARTUP_ID contains invalid UTF-8");
else
startup_notification_id = g_strdup (desktop_startup_id);
}
/* Clear the environment variable so it won't be inherited by
* child processes and confuse things.
*/
g_unsetenv ("DESKTOP_STARTUP_ID");
}
static gpointer
@@ -311,7 +292,7 @@ gdk_pre_parse (void)
gdk_gl_backend_use (GDK_GL_WGL);
#ifndef G_HAS_CONSTRUCTORS
stash_and_unset_environment ();
stash_desktop_startup_notification_id ();
#endif
}
@@ -345,20 +326,15 @@ gdk_display_open_default (void)
/*< private >
* gdk_get_startup_notification_id:
*
* Returns the original value of the XDG_ACTIVATION_TOKEN environment
* variable if it was defined and valid, otherwise it returns the original
* value of the DESKTOP_STARTUP_ID environment variable if it was defined
* and valid, or %NULL if neither of them were defined and valid.
* Returns the original value of the DESKTOP_STARTUP_ID environment
* variable if it was defined and valid, or %NULL otherwise.
*
* Returns: (nullable) (transfer none): the original value of the
* XDG_ACTIVATION_TOKEN or DESKTOP_STARTUP_ID environment variable
* DESKTOP_STARTUP_ID environment variable
*/
const char *
gdk_get_startup_notification_id (void)
{
if (xdg_activation_token)
return xdg_activation_token;
return startup_notification_id;
}
+5 -5
View File
@@ -144,8 +144,8 @@ struct _YUVCoefficients
};
/* multiplied by 65536 */
static const YUVCoefficients itu601_narrow = { 104597, -25675, -53279, 132201 };
//static const YUVCoefficients itu601_wide = { 74711, -25864, -38050, 133176 };
//static const YUVCoefficients itu601_narrow = { 104597, -25675, -53279, 132201 };
static const YUVCoefficients itu601_wide = { 74711, -25864, -38050, 133176 };
static inline void
get_uv_values (const YUVCoefficients *coeffs,
@@ -229,7 +229,7 @@ download_nv12 (guchar *dst_data,
int r, g, b;
gsize xs, ys;
get_uv_values (&itu601_narrow, uv_data[x / X_SUB * 2 + U], uv_data[x / X_SUB * 2 + V], &r, &g, &b);
get_uv_values (&itu601_wide, uv_data[x / X_SUB * 2 + U], uv_data[x / X_SUB * 2 + V], &r, &g, &b);
for (ys = 0; ys < Y_SUB && y + ys < height; ys++)
for (xs = 0; xs < X_SUB && x + xs < width; xs++)
@@ -309,7 +309,7 @@ download_yuv_3 (guchar *dst_data,
int r, g, b;
gsize xs, ys;
get_uv_values (&itu601_narrow, u_data[x / X_SUB], v_data[x / X_SUB], &r, &g, &b);
get_uv_values (&itu601_wide, u_data[x / X_SUB], v_data[x / X_SUB], &r, &g, &b);
for (ys = 0; ys < Y_SUB && y + ys < height; ys++)
for (xs = 0; xs < X_SUB && x + xs < width; xs++)
@@ -365,7 +365,7 @@ download_yuyv (guchar *dst_data,
{
int r, g, b;
get_uv_values (&itu601_narrow, src_data[2 * x + U], src_data[2 * x + V], &r, &g, &b);
get_uv_values (&itu601_wide, src_data[2 * x + U], src_data[2 * x + V], &r, &g, &b);
set_rgb_values (&dst_data[3 * x], src_data[2 * x + Y1], r, g, b);
if (x + 1 < width)
set_rgb_values (&dst_data[3 * (x + 1)], src_data[2 * x + Y2], r, g, b);
+2 -8
View File
@@ -163,8 +163,6 @@ gdk_dmabuf_get_egl_downloader (GdkDisplay *display,
return NULL;
previous = gdk_gl_context_get_current ();
if (previous)
g_object_ref (previous);
formats = gdk_dmabuf_formats_builder_new ();
external = gdk_dmabuf_formats_builder_new ();
@@ -196,10 +194,7 @@ gdk_dmabuf_get_egl_downloader (GdkDisplay *display,
}
if (previous)
{
gdk_gl_context_make_current (previous);
g_object_unref (previous);
}
gdk_gl_context_make_current (previous);
return GDK_DMABUF_DOWNLOADER (renderer);
}
@@ -244,7 +239,7 @@ gdk_dmabuf_egl_create_image (GdkDisplay *display,
attribs[i++] = EGL_YUV_COLOR_SPACE_HINT_EXT;
attribs[i++] = EGL_ITU_REC601_EXT;
attribs[i++] = EGL_SAMPLE_RANGE_HINT_EXT;
attribs[i++] = EGL_YUV_NARROW_RANGE_EXT;
attribs[i++] = EGL_YUV_FULL_RANGE_EXT;
#define ADD_PLANE(plane) \
{ \
@@ -270,7 +265,6 @@ gdk_dmabuf_egl_create_image (GdkDisplay *display,
if (dmabuf->n_planes > 3) ADD_PLANE (3);
attribs[i++] = EGL_NONE;
g_assert (i < G_N_ELEMENTS (attribs));
image = eglCreateImageKHR (egl_display,
EGL_NO_CONTEXT,
+7
View File
@@ -192,6 +192,13 @@ compute_smooth_frame_time (GdkFrameClock *clock,
* and new_frame_time >= old_frame_time. */
frames_passed = (new_frame_time - smoothed_frame_time_base + frame_interval / 2) / frame_interval;
if (frames_passed > 1)
gdk_profiler_add_markf ((smoothed_frame_time_base - (frame_interval * (frames_passed-1))) * 1000L,
frame_interval * (frames_passed-1) * 1000L,
"Dropped Frames",
"%u frames may have been dropped",
frames_passed-1);
/* We use an approximately whole number of frames in the future from
* last smoothed frame time. This way we avoid minor jitter in the
* frame times making the animation speed uneven, but still animate
+35 -72
View File
@@ -1956,6 +1956,8 @@ gdk_gl_context_get_glsl_version_string (GdkGLContext *self)
return "#version 310 es";
else if (gdk_gl_version_greater_equal (&priv->gl_version, &GDK_GL_VERSION_INIT (3, 0)))
return "#version 300 es";
else if (gdk_gl_version_greater_equal (&priv->gl_version, &GDK_GL_VERSION_INIT (3, 0)))
return "#version 300 es";
else
return "#version 100";
}
@@ -2196,78 +2198,12 @@ gdk_gl_context_import_dmabuf (GdkGLContext *self,
gdk_display_init_dmabuf (display);
if (gdk_dmabuf_formats_contains (display->egl_dmabuf_formats, dmabuf->fourcc, dmabuf->modifier))
if (!gdk_dmabuf_formats_contains (display->egl_external_formats, dmabuf->fourcc, dmabuf->modifier))
{
/* This is the path for modern drivers that support modifiers */
if (!gdk_dmabuf_formats_contains (display->egl_external_formats, dmabuf->fourcc, dmabuf->modifier))
{
texture_id = gdk_gl_context_import_dmabuf_for_target (self,
width, height,
dmabuf,
GL_TEXTURE_2D);
if (texture_id == 0)
{
GDK_DISPLAY_DEBUG (display, DMABUF,
"Import of %dx%d %.4s:%#" G_GINT64_MODIFIER "x dmabuf failed",
width, height,
(char *) &dmabuf->fourcc, dmabuf->modifier);
return 0;
}
GDK_DISPLAY_DEBUG (display, DMABUF,
"Imported %dx%d %.4s:%#" G_GINT64_MODIFIER "x dmabuf as GL_TEXTURE_2D texture",
width, height,
(char *) &dmabuf->fourcc, dmabuf->modifier);
*external = FALSE;
return texture_id;
}
if (!gdk_gl_context_get_use_es (self))
{
GDK_DISPLAY_DEBUG (display, DMABUF,
"Can't import external_only %.4s:%#" G_GINT64_MODIFIER "x outside of GLES",
(char *) &dmabuf->fourcc, dmabuf->modifier);
return 0;
}
texture_id = gdk_gl_context_import_dmabuf_for_target (self,
width, height,
dmabuf,
GL_TEXTURE_EXTERNAL_OES);
if (texture_id == 0)
{
GDK_DISPLAY_DEBUG (display, DMABUF,
"Import of external_only %dx%d %.4s:%#" G_GINT64_MODIFIER "x dmabuf failed",
width, height,
(char *) &dmabuf->fourcc, dmabuf->modifier);
return 0;
}
GDK_DISPLAY_DEBUG (display, DMABUF,
"Imported %dx%d %.4s:%#" G_GINT64_MODIFIER "x dmabuf as GL_TEXTURE_EXTERNAL_OES texture",
width, height,
(char *) &dmabuf->fourcc, dmabuf->modifier);
*external = TRUE;
return texture_id;
}
else
{
/* This is the opportunistic path.
* We hit it both for drivers that do not support modifiers as well as for dmabufs
* that the driver did not explicitly advertise. */
int target;
if (gdk_gl_context_get_use_es (self))
target = GL_TEXTURE_EXTERNAL_OES;
else
target = GL_TEXTURE_2D;
texture_id = gdk_gl_context_import_dmabuf_for_target (self,
width, height,
dmabuf,
target);
GL_TEXTURE_2D);
if (texture_id == 0)
{
GDK_DISPLAY_DEBUG (display, DMABUF,
@@ -2278,13 +2214,40 @@ gdk_gl_context_import_dmabuf (GdkGLContext *self,
}
GDK_DISPLAY_DEBUG (display, DMABUF,
"Imported %dx%d %.4s:%#" G_GINT64_MODIFIER "x dmabuf as %s texture",
"Imported %dx%d %.4s:%#" G_GINT64_MODIFIER "x dmabuf as GL_TEXTURE_2D texture",
width, height,
(char *) &dmabuf->fourcc, dmabuf->modifier,
target == GL_TEXTURE_EXTERNAL_OES ? "GL_TEXTURE_EXTERNAL_OES" : "GL_TEXTURE_2D");
*external = target == GL_TEXTURE_EXTERNAL_OES;
(char *) &dmabuf->fourcc, dmabuf->modifier);
*external = FALSE;
return texture_id;
}
if (!gdk_gl_context_get_use_es (self))
{
GDK_DISPLAY_DEBUG (display, DMABUF,
"Can't import external_only %.4s:%#" G_GINT64_MODIFIER "x outside of GLES",
(char *) &dmabuf->fourcc, dmabuf->modifier);
return 0;
}
texture_id = gdk_gl_context_import_dmabuf_for_target (self,
width, height,
dmabuf,
GL_TEXTURE_EXTERNAL_OES);
if (texture_id == 0)
{
GDK_DISPLAY_DEBUG (display, DMABUF,
"Import of external_only %dx%d %.4s:%#" G_GINT64_MODIFIER "x dmabuf failed",
width, height,
(char *) &dmabuf->fourcc, dmabuf->modifier);
return 0;
}
GDK_DISPLAY_DEBUG (display, DMABUF,
"Imported %dx%d %.4s:%#" G_GINT64_MODIFIER "x dmabuf as GL_TEXTURE_EXTERNAL_OES texture",
width, height,
(char *) &dmabuf->fourcc, dmabuf->modifier);
*external = TRUE;
return texture_id;
}
gboolean
+1 -1
View File
@@ -563,7 +563,7 @@ gdk_texture_new_from_bytes_internal (GBytes *bytes,
{
if (gdk_is_png (bytes))
{
return gdk_load_png (bytes, NULL, error);
return gdk_load_png (bytes, error);
}
else if (gdk_is_jpeg (bytes))
{
+10 -45
View File
@@ -29,7 +29,6 @@
#include "gdkdmabuffourccprivate.h"
#include "gdkdmabuftextureprivate.h"
#include "gdkdisplayprivate.h"
#include "gdkprofilerprivate.h"
#include <glib/gi18n-lib.h>
#include <math.h>
@@ -632,7 +631,6 @@ gdk_vulkan_context_begin_frame (GdkDrawContext *draw_context,
{
GdkVulkanContext *context = GDK_VULKAN_CONTEXT (draw_context);
GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context);
VkResult acquire_result;
guint i;
if (depth != priv->current_format)
@@ -654,29 +652,12 @@ gdk_vulkan_context_begin_frame (GdkDrawContext *draw_context,
cairo_region_union (priv->regions[i], region);
}
acquire_next_image:
acquire_result = GDK_VK_CHECK (vkAcquireNextImageKHR, gdk_vulkan_context_get_device (context),
priv->swapchain,
UINT64_MAX,
priv->draw_semaphore,
VK_NULL_HANDLE,
&priv->draw_index);
if ((acquire_result == VK_ERROR_OUT_OF_DATE_KHR) ||
(acquire_result == VK_SUBOPTIMAL_KHR))
{
GError *error = NULL;
GDK_DEBUG (VULKAN, "Recreating the swapchain");
if (!gdk_vulkan_context_check_swapchain (context, &error))
{
g_warning ("%s", error->message);
g_error_free (error);
return;
}
goto acquire_next_image;
}
GDK_VK_CHECK (vkAcquireNextImageKHR, gdk_vulkan_context_get_device (context),
priv->swapchain,
UINT64_MAX,
priv->draw_semaphore,
VK_NULL_HANDLE,
&priv->draw_index);
cairo_region_union (region, priv->regions[priv->draw_index]);
}
@@ -1129,7 +1110,6 @@ gdk_display_load_pipeline_cache (GdkDisplay *display)
static gboolean
gdk_vulkan_save_pipeline_cache (GdkDisplay *display)
{
G_GNUC_UNUSED gint64 begin_time = GDK_PROFILER_CURRENT_TIME;
GError *error = NULL;
VkDevice device;
VkPipelineCache cache;
@@ -1144,13 +1124,14 @@ gdk_vulkan_save_pipeline_cache (GdkDisplay *display)
GDK_VK_CHECK (vkGetPipelineCacheData, device, cache, &size, NULL);
if (size == 0)
return TRUE;
if (size == display->vk_pipeline_cache_size)
{
GDK_DEBUG (VULKAN, "pipeline cache size (%zu bytes) unchanged, skipping save", size);
return TRUE;
}
data = g_malloc (size);
if (GDK_VK_CHECK (vkGetPipelineCacheData, device, cache, &size, data) != VK_SUCCESS)
{
@@ -1170,7 +1151,7 @@ gdk_vulkan_save_pipeline_cache (GdkDisplay *display)
file = gdk_vulkan_get_pipeline_cache_file (display);
GDK_DEBUG (VULKAN, "Saving pipeline cache of size %lu to %s", size, g_file_peek_path (file));
GDK_DEBUG (VULKAN, "Saving pipeline cache to %s", g_file_peek_path (file));
if (!g_file_replace_contents (file,
data,
@@ -1185,7 +1166,7 @@ gdk_vulkan_save_pipeline_cache (GdkDisplay *display)
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WRONG_ETAG))
{
VkPipelineCache new_cache;
GDK_DEBUG (VULKAN, "Pipeline cache file modified, merging into current");
new_cache = gdk_display_load_pipeline_cache (display);
if (new_cache)
@@ -1212,15 +1193,10 @@ gdk_vulkan_save_pipeline_cache (GdkDisplay *display)
return FALSE;
}
gdk_profiler_end_markf (begin_time,
"Save Vulkan pipeline cache", "%s size %lu",
g_file_peek_path (file), size);
g_object_unref (file);
g_free (data);
g_free (display->vk_pipeline_cache_etag);
display->vk_pipeline_cache_etag = etag;
display->vk_pipeline_cache_size = size;
return TRUE;
}
@@ -1260,11 +1236,6 @@ gdk_display_create_pipeline_cache (GdkDisplay *display)
},
NULL,
&display->vk_pipeline_cache);
GDK_DEBUG (VULKAN, "Creating empty pipeline cache");
}
else
{
GDK_DEBUG (VULKAN, "Loading pipeline cache (%lu bytes)", display->vk_pipeline_cache_size);
}
}
@@ -1374,7 +1345,6 @@ static gboolean
gdk_display_create_vulkan_device (GdkDisplay *display,
GError **error)
{
G_GNUC_UNUSED gint64 start_time = GDK_PROFILER_CURRENT_TIME;
uint32_t i, j, k;
const char *override;
gboolean list_devices;
@@ -1583,8 +1553,6 @@ gdk_display_create_vulkan_device (GdkDisplay *display,
"Hum, what? This should not happen.")));
}
gdk_profiler_end_mark (start_time, "Create Vulkan device", NULL);
return TRUE;
}
}
@@ -1623,7 +1591,6 @@ static gboolean
gdk_display_create_vulkan_instance (GdkDisplay *display,
GError **error)
{
G_GNUC_UNUSED gint64 start_time = GDK_PROFILER_CURRENT_TIME;
uint32_t i;
GPtrArray *used_extensions;
GPtrArray *used_layers;
@@ -1785,8 +1752,6 @@ gdk_display_create_vulkan_instance (GdkDisplay *display,
display->vk_shader_modules = g_hash_table_new (g_str_hash, g_str_equal);
gdk_profiler_end_mark (start_time, "Create Vulkan instance", NULL);
return TRUE;
}
+3 -17
View File
@@ -127,18 +127,15 @@ png_simple_warning_callback (png_structp png,
}
/* }}} */
/* {{{ Public API */
/* {{{ Public API */
GdkTexture *
gdk_load_png (GBytes *bytes,
GHashTable *options,
GError **error)
gdk_load_png (GBytes *bytes,
GError **error)
{
png_io io;
png_struct *png = NULL;
png_info *info;
png_textp text;
int num_texts;
guint width, height;
gsize i, stride;
int depth, color_type;
@@ -300,17 +297,6 @@ gdk_load_png (GBytes *bytes,
texture = gdk_memory_texture_new (width, height, format, out_bytes, stride);
g_bytes_unref (out_bytes);
if (options && png_get_text (png, info, &text, &num_texts))
{
for (i = 0; i < num_texts; i++)
{
if (text->compression != -1)
continue;
g_hash_table_insert (options, g_strdup (text->key), g_strdup (text->text));
}
}
g_free (row_pointers);
png_destroy_read_struct (&png, &info, NULL);
-1
View File
@@ -23,7 +23,6 @@
#define PNG_SIGNATURE "\x89PNG"
GdkTexture *gdk_load_png (GBytes *bytes,
GHashTable *options,
GError **error);
GBytes *gdk_save_png (GdkTexture *texture);
+98 -7
View File
@@ -287,6 +287,97 @@ static const struct wl_shm_listener wl_shm_listener = {
wl_shm_format
};
static void
linux_dmabuf_done (void *data,
struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1)
{
GDK_DEBUG (MISC, "dmabuf feedback done");
}
static void
linux_dmabuf_format_table (void *data,
struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1,
int32_t fd,
uint32_t size)
{
GdkWaylandDisplay *display_wayland = data;
display_wayland->linux_dmabuf_n_formats = size / 16;
display_wayland->linux_dmabuf_formats = mmap (NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
GDK_DEBUG (MISC, "got dmabuf format table (%lu entries)", display_wayland->linux_dmabuf_n_formats);
}
static void
linux_dmabuf_main_device (void *data,
struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1,
struct wl_array *device)
{
dev_t dev G_GNUC_UNUSED;
memcpy (&dev, device->data, sizeof (dev_t));
GDK_DEBUG (MISC, "got dmabuf main device: %u %u", major (dev), minor (dev));
}
static void
linux_dmabuf_tranche_done (void *data,
struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1)
{
GDK_DEBUG (MISC, "dmabuf feedback tranche done");
}
static void
linux_dmabuf_tranche_target_device (void *data,
struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1,
struct wl_array *device)
{
dev_t dev G_GNUC_UNUSED;
memcpy (&dev, device->data, sizeof (dev_t));
GDK_DEBUG (MISC, "got dmabuf tranche target device: %u %u", major (dev), minor (dev));
}
static void
linux_dmabuf_tranche_formats (void *data,
struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1,
struct wl_array *indices)
{
GdkWaylandDisplay *display_wayland = data;
GDK_DEBUG (MISC, "got dmabuf tranche formats (%lu entries):", indices->size / sizeof (guint16));
guint16 *pos;
wl_array_for_each (pos, indices)
{
LinuxDmabufFormat *fmt G_GNUC_UNUSED = &display_wayland->linux_dmabuf_formats[*pos];
uint32_t f G_GNUC_UNUSED = fmt->fourcc;
uint64_t m G_GNUC_UNUSED = fmt->modifier;
GDK_DEBUG (MISC, " %.4s:%#" G_GINT64_MODIFIER "x", (char *) &f, m);
}
}
static void
linux_dmabuf_tranche_flags (void *data,
struct zwp_linux_dmabuf_feedback_v1 *zwp_linux_dmabuf_feedback_v1,
uint32_t flags)
{
GDK_DEBUG (MISC,
"got dmabuf tranche flags: %s",
flags & ZWP_LINUX_DMABUF_FEEDBACK_V1_TRANCHE_FLAGS_SCANOUT ? "scanout" : "");
}
static const struct zwp_linux_dmabuf_feedback_v1_listener linux_dmabuf_feedback_listener = {
linux_dmabuf_done,
linux_dmabuf_format_table,
linux_dmabuf_main_device,
linux_dmabuf_tranche_done,
linux_dmabuf_tranche_target_device,
linux_dmabuf_tranche_formats,
linux_dmabuf_tranche_flags,
};
static void
server_decoration_manager_default_mode (void *data,
struct org_kde_kwin_server_decoration_manager *manager,
@@ -363,14 +454,12 @@ gdk_registry_handle_global (void *data,
}
else if (strcmp (interface, "zwp_linux_dmabuf_v1") == 0 && version >= 4)
{
struct zwp_linux_dmabuf_feedback_v1 *feedback;
display_wayland->linux_dmabuf =
wl_registry_bind (display_wayland->wl_registry, id, &zwp_linux_dmabuf_v1_interface, version);
feedback = zwp_linux_dmabuf_v1_get_default_feedback (display_wayland->linux_dmabuf);
display_wayland->dmabuf_formats_info = dmabuf_formats_info_new (GDK_DISPLAY (display_wayland),
"default",
feedback);
display_wayland->linux_dmabuf_feedback =
zwp_linux_dmabuf_v1_get_default_feedback (display_wayland->linux_dmabuf);
zwp_linux_dmabuf_feedback_v1_add_listener (display_wayland->linux_dmabuf_feedback,
&linux_dmabuf_feedback_listener, display_wayland);
_gdk_wayland_display_async_roundtrip (display_wayland);
}
else if (strcmp (interface, "xdg_wm_base") == 0)
@@ -743,7 +832,9 @@ gdk_wayland_display_dispose (GObject *object)
g_clear_pointer (&display_wayland->presentation, wp_presentation_destroy);
g_clear_pointer (&display_wayland->single_pixel_buffer, wp_single_pixel_buffer_manager_v1_destroy);
g_clear_pointer (&display_wayland->linux_dmabuf, zwp_linux_dmabuf_v1_destroy);
g_clear_pointer (&display_wayland->dmabuf_formats_info, dmabuf_formats_info_free);
g_clear_pointer (&display_wayland->linux_dmabuf_feedback, zwp_linux_dmabuf_feedback_v1_destroy);
if (display_wayland->linux_dmabuf_formats)
munmap (display_wayland->linux_dmabuf_formats, display_wayland->linux_dmabuf_n_formats * 16);
g_clear_pointer (&display_wayland->shm, wl_shm_destroy);
g_clear_pointer (&display_wayland->wl_registry, wl_registry_destroy);
+10 -2
View File
@@ -49,7 +49,6 @@
#include "gdkdisplayprivate.h"
#include "gdkwaylanddevice.h"
#include "gdkdmabuf-wayland-private.h"
#include "cursor/wayland-cursor.h"
#include <epoxy/egl.h>
@@ -74,6 +73,13 @@ typedef enum _GdkWaylandShellVariant
GDK_WAYLAND_SHELL_VARIANT_ZXDG_SHELL_V6
} GdkWaylandShellVariant;
typedef struct
{
uint32_t fourcc;
uint32_t padding;
uint64_t modifier;
} LinuxDmabufFormat;
struct _GdkWaylandDisplay
{
GdkDisplay parent_instance;
@@ -99,7 +105,9 @@ struct _GdkWaylandDisplay
struct wl_compositor *compositor;
struct wl_shm *shm;
struct zwp_linux_dmabuf_v1 *linux_dmabuf;
DmabufFormatsInfo *dmabuf_formats_info;
struct zwp_linux_dmabuf_feedback_v1 *linux_dmabuf_feedback;
gsize linux_dmabuf_n_formats;
LinuxDmabufFormat *linux_dmabuf_formats;
struct xdg_wm_base *xdg_wm_base;
struct zxdg_shell_v6 *zxdg_shell_v6;
struct gtk_shell1 *gtk_shell;
-77
View File
@@ -1,77 +0,0 @@
/*
* gdkdmabuf-wayland.h
*
* Copyright 2023 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config.h"
#include <stdint.h>
#include <wayland-client.h>
#include <wayland-egl.h>
#include <glib.h>
#include <gdk/gdkkeys.h>
#include <gdk/gdksurface.h>
G_BEGIN_DECLS
typedef struct
{
uint32_t fourcc;
uint32_t padding;
uint64_t modifier;
} DmabufFormat;
typedef struct
{
dev_t target_device;
guint32 flags;
gsize n_formats;
DmabufFormat *formats;
} DmabufTranche;
typedef struct
{
dev_t main_device;
GPtrArray *tranches;
} DmabufFormats;
typedef struct DmabufFormatsInfo DmabufFormatsInfo;
struct DmabufFormatsInfo
{
GdkDisplay *display;
char *name;
struct zwp_linux_dmabuf_feedback_v1 *feedback;
gsize n_dmabuf_formats;
DmabufFormat *dmabuf_format_table;
DmabufFormats *dmabuf_formats;
DmabufFormats *pending_dmabuf_formats;
DmabufTranche *pending_tranche;
};
DmabufFormatsInfo * dmabuf_formats_info_new (GdkDisplay *display,
const char *name,
struct zwp_linux_dmabuf_feedback_v1 *feedback);
void dmabuf_formats_info_free (DmabufFormatsInfo *info);
G_END_DECLS
-241
View File
@@ -1,241 +0,0 @@
#include "config.h"
#include "gdkdmabuf-wayland-private.h"
#include "gdkdebugprivate.h"
#include "gdkdmabufformatsprivate.h"
#include "gdkdmabufformatsbuilderprivate.h"
#include "gdkdmabufformatsprivate.h"
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/sysmacros.h>
#include "linux-dmabuf-unstable-v1-client-protocol.h"
static DmabufTranche *
dmabuf_tranche_new (void)
{
return g_new0 (DmabufTranche, 1);
}
static void
dmabuf_tranche_free (DmabufTranche *tranche)
{
g_free (tranche->formats);
g_free (tranche);
}
static DmabufFormats *
dmabuf_formats_new (void)
{
DmabufFormats *formats;
formats = g_new0 (DmabufFormats, 1);
formats->tranches = g_ptr_array_new_with_free_func ((GDestroyNotify) dmabuf_tranche_free);
return formats;
}
static void
dmabuf_formats_free (DmabufFormats *formats)
{
g_ptr_array_unref (formats->tranches);
g_free (formats);
}
static void
update_dmabuf_formats (DmabufFormatsInfo *info)
{
DmabufFormats *formats = info->dmabuf_formats;
GDK_DISPLAY_DEBUG (info->display, MISC,
"dmabuf format table (%lu entries)", info->n_dmabuf_formats);
GDK_DISPLAY_DEBUG (info->display, MISC,
"dmabuf main device: %u %u",
major (formats->main_device),
minor (formats->main_device));
for (gsize i = 0; i < formats->tranches->len; i++)
{
DmabufTranche *tranche = g_ptr_array_index (formats->tranches, i);
GDK_DISPLAY_DEBUG (info->display, MISC,
"dmabuf tranche target device: %u %u",
major (tranche->target_device),
minor (tranche->target_device));
GDK_DISPLAY_DEBUG (info->display, MISC,
"dmabuf%s tranche (%lu entries):",
tranche->flags & ZWP_LINUX_DMABUF_FEEDBACK_V1_TRANCHE_FLAGS_SCANOUT ? " scanout" : "",
tranche->n_formats);
for (gsize j = 0; j < tranche->n_formats; j++)
{
GDK_DISPLAY_DEBUG (info->display, MISC,
" %.4s:%#" G_GINT64_MODIFIER "x",
(char *) &(tranche->formats[j].fourcc),
tranche->formats[j].modifier);
}
}
}
static void
linux_dmabuf_done (void *data,
struct zwp_linux_dmabuf_feedback_v1 *feedback)
{
DmabufFormatsInfo *info = data;
g_clear_pointer (&info->dmabuf_formats, dmabuf_formats_free);
info->dmabuf_formats = info->pending_dmabuf_formats;
info->pending_dmabuf_formats = NULL;
update_dmabuf_formats (info);
}
static void
linux_dmabuf_format_table (void *data,
struct zwp_linux_dmabuf_feedback_v1 *feedback,
int32_t fd,
uint32_t size)
{
DmabufFormatsInfo *info = data;
if (info->dmabuf_formats)
munmap (info->dmabuf_formats, sizeof (DmabufFormat) * info->n_dmabuf_formats);
info->n_dmabuf_formats = size / 16;
info->dmabuf_format_table = mmap (NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
}
static void
linux_dmabuf_main_device (void *data,
struct zwp_linux_dmabuf_feedback_v1 *feedback,
struct wl_array *device)
{
DmabufFormatsInfo *info = data;
dev_t dev;
memcpy (&dev, device->data, sizeof (dev_t));
g_assert (info->pending_dmabuf_formats == NULL);
info->pending_dmabuf_formats = dmabuf_formats_new ();
info->pending_dmabuf_formats->main_device = dev;
}
static void
linux_dmabuf_tranche_done (void *data,
struct zwp_linux_dmabuf_feedback_v1 *feedback)
{
DmabufFormatsInfo *info = data;
g_ptr_array_add (info->pending_dmabuf_formats->tranches,
info->pending_tranche);
info->pending_tranche = NULL;
}
static void
linux_dmabuf_tranche_target_device (void *data,
struct zwp_linux_dmabuf_feedback_v1 *feedback,
struct wl_array *device)
{
DmabufFormatsInfo *info = data;
dev_t dev;
DmabufTranche *tranche;
memcpy (&dev, device->data, sizeof (dev_t));
g_assert (info->pending_tranche == NULL);
tranche = dmabuf_tranche_new ();
tranche->target_device = dev;
info->pending_tranche = tranche;
}
static void
linux_dmabuf_tranche_formats (void *data,
struct zwp_linux_dmabuf_feedback_v1 *feedback,
struct wl_array *indices)
{
DmabufFormatsInfo *info = data;
DmabufTranche *tranche;
int i;
guint16 *pos;
g_assert (info->pending_tranche != NULL);
tranche = info->pending_tranche;
tranche->n_formats = indices->size / sizeof (guint16);
tranche->formats = g_new (DmabufFormat, tranche->n_formats);
i = 0;
wl_array_for_each (pos, indices)
{
tranche->formats[i++] = info->dmabuf_format_table[*pos];
}
}
static void
linux_dmabuf_tranche_flags (void *data,
struct zwp_linux_dmabuf_feedback_v1 *feedback,
uint32_t flags)
{
DmabufFormatsInfo *info = data;
DmabufTranche *tranche;
g_assert (info->pending_tranche != NULL);
tranche = info->pending_tranche;
tranche->flags = flags;
}
static const struct zwp_linux_dmabuf_feedback_v1_listener feedback_listener = {
linux_dmabuf_done,
linux_dmabuf_format_table,
linux_dmabuf_main_device,
linux_dmabuf_tranche_done,
linux_dmabuf_tranche_target_device,
linux_dmabuf_tranche_formats,
linux_dmabuf_tranche_flags,
};
DmabufFormatsInfo *
dmabuf_formats_info_new (GdkDisplay *display,
const char *name,
struct zwp_linux_dmabuf_feedback_v1 *feedback)
{
DmabufFormatsInfo *info;
info = g_new0 (DmabufFormatsInfo, 1);
info->display = display;
info->name = g_strdup (name);
info->feedback = feedback;
if (info->feedback)
zwp_linux_dmabuf_feedback_v1_add_listener (info->feedback,
&feedback_listener, info);
return info;
}
void
dmabuf_formats_info_free (DmabufFormatsInfo *info)
{
g_free (info->name);
g_clear_pointer (&info->feedback, zwp_linux_dmabuf_feedback_v1_destroy);
if (info->dmabuf_format_table)
{
munmap (info->dmabuf_format_table, info->n_dmabuf_formats * 16);
info->dmabuf_format_table = NULL;
}
g_clear_pointer (&info->dmabuf_formats, dmabuf_formats_free);
g_clear_pointer (&info->pending_dmabuf_formats, dmabuf_formats_free);
g_clear_pointer (&info->pending_tranche, dmabuf_tranche_free);
g_free (info);
}
-1
View File
@@ -8,7 +8,6 @@ gdk_wayland_sources = files([
'gdkdevice-wayland.c',
'gdkdevicepad-wayland.c',
'gdkdisplay-wayland.c',
'gdkdmabuf-wayland.c',
'gdkdrag-wayland.c',
'gdkdragsurface-wayland.c',
'gdkdrop-wayland.c',
-2
View File
@@ -908,9 +908,7 @@ _gdk_win32_create_hicon_for_texture (GdkTexture *texture,
width = cairo_image_surface_get_width (surface);
height = cairo_image_surface_get_height (surface);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, width, height);
G_GNUC_END_IGNORE_DEPRECATIONS
icon = pixbuf_to_hicon (pixbuf, is_icon, x, y);
+1 -1
View File
@@ -267,7 +267,7 @@ create_dummy_gl_window (void)
{
WNDCLASS wclass = { 0, };
ATOM klass;
HWND hwnd = NULL;
HWND hwnd;
wclass.lpszClassName = "GdkGLDummyWindow";
wclass.lpfnWndProc = DefWindowProc;
+1
View File
@@ -38,6 +38,7 @@ gdk_win32_vulkan_context_create_surface (GdkVulkanContext *context,
{
GdkSurface *window = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (context));
GdkDisplay *display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (context));
GdkWin32Surface *win32_surface = GDK_WIN32_SURFACE (window);
VkWin32SurfaceCreateInfoKHR info;
VkResult result;
-6
View File
@@ -68,11 +68,6 @@ gdk_x11_vulkan_context_end_frame (GdkDrawContext *context,
GDK_DRAW_CONTEXT_CLASS (gdk_x11_vulkan_context_parent_class)->end_frame (context, painted);
}
static void
gdk_x11_vulkan_context_empty_frame (GdkDrawContext *draw_context)
{
}
static void
gdk_x11_vulkan_context_class_init (GdkX11VulkanContextClass *klass)
{
@@ -80,7 +75,6 @@ gdk_x11_vulkan_context_class_init (GdkX11VulkanContextClass *klass)
GdkDrawContextClass *draw_context_class = GDK_DRAW_CONTEXT_CLASS (klass);
draw_context_class->end_frame = gdk_x11_vulkan_context_end_frame;
draw_context_class->empty_frame = gdk_x11_vulkan_context_empty_frame;
context_class->create_surface = gdk_x11_vulkan_context_create_surface;
}
+1 -1
View File
@@ -19,7 +19,7 @@ static gint64 profiler_buffer_uploads;
static void
gsk_gpu_buffer_class_init (GskGpuBufferClass *klass)
{
profiler_buffer_uploads_id = gdk_profiler_define_int_counter ("buffer-uploads", "Number of bytes uploaded to GPU");
profiler_buffer_uploads_id = gdk_profiler_define_int_counter ("ngl-buffer-uploads", "Number of bytes uploaded to GPU");
}
static void
+1 -1
View File
@@ -546,7 +546,7 @@ gsk_gpu_device_maybe_gc (GskGpuDevice *self)
if (priv->cache_timeout == 0 || dead_texture_pixels > 1000000)
{
GSK_DEBUG (GLYPH_CACHE, "Pre-frame GC (%" G_GSIZE_FORMAT " dead pixels)", dead_texture_pixels);
GSK_DEBUG (GLYPH_CACHE, "Pre-frame GC (%lu dead pixels)", dead_texture_pixels);
gsk_gpu_device_gc (self, g_get_monotonic_time ());
}
}
+2 -2
View File
@@ -345,8 +345,8 @@ gsk_gpu_node_processor_init_draw (GskGpuNodeProcessor *self,
area.x = 0;
area.y = 0;
area.width = MAX (1, ceilf (graphene_vec2_get_x (scale) * viewport->size.width - EPSILON));
area.height = MAX (1, ceilf (graphene_vec2_get_y (scale) * viewport->size.height - EPSILON));
area.width = ceilf (graphene_vec2_get_x (scale) * viewport->size.width - EPSILON);
area.height = ceilf (graphene_vec2_get_y (scale) * viewport->size.height - EPSILON);
image = gsk_gpu_device_create_offscreen_image (gsk_gpu_frame_get_device (frame),
FALSE,
-5
View File
@@ -313,11 +313,6 @@ gsk_gpu_upload_texture_op_try (GskGpuFrame *frame,
{
GEnumClass *enum_class = g_type_class_ref (GDK_TYPE_MEMORY_FORMAT);
if (!GDK_IS_MEMORY_TEXTURE (texture))
{
gdk_debug_message ("Unoptimized upload for %s", G_OBJECT_TYPE_NAME (texture));
}
if (gdk_texture_get_format (texture) != gsk_gpu_image_get_format (image))
{
gdk_debug_message ("Unsupported format %s, converting on CPU to %s",
+3 -22
View File
@@ -787,7 +787,7 @@ gsk_vulkan_device_get_vk_conversion (GskVulkanDevice *self,
.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
.format = vk_format,
.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601,
.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW,
.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
.components = (VkComponentMapping) {
VK_COMPONENT_SWIZZLE_IDENTITY,
VK_COMPONENT_SWIZZLE_IDENTITY,
@@ -951,8 +951,6 @@ gsk_vulkan_device_get_vk_pipeline (GskVulkanDevice *self,
const char *version_string;
char *vertex_shader_name, *fragment_shader_name;
G_GNUC_UNUSED gint64 begin_time = GDK_PROFILER_CURRENT_TIME;
const char *clip_name[] = { "NONE", "RECT", "ROUNDED" };
const char *blend_name[] = { "OVER", "ADD", "CLEAR" };
cache_key = (PipelineCacheKey) {
.op_class = op_class,
@@ -1130,25 +1128,8 @@ gsk_vulkan_device_get_vk_pipeline (GskVulkanDevice *self,
&pipeline);
gdk_profiler_end_markf (begin_time,
"Create Vulkan pipeline", "%s version=%s variation=%u clip=%s blend=%s format=%u",
op_class->shader_name,
version_string + 1,
variation,
clip_name[clip],
blend_name[blend],
format);
GSK_DEBUG (SHADERS,
"Create Vulkan pipeline (%s %s, %u/%s/%s/%u) for layout (%" G_GSIZE_FORMAT "/%" G_GSIZE_FORMAT "/%" G_GSIZE_FORMAT ")",
op_class->shader_name,
version_string + 1,
variation,
clip_name[clip],
blend_name[blend],
format,
layout->setup.n_buffers,
layout->setup.n_samplers,
layout->setup.n_immutable_samplers);
"Create Vulkan pipeline frag=%s vert=%s",
fragment_shader_name, vertex_shader_name);
g_free (fragment_shader_name);
g_free (vertex_shader_name);
+3 -3
View File
@@ -1143,10 +1143,10 @@ gsk_path_builder_rel_conic_to (GskPathBuilder *self,
* @x2: x coordinate of second control point
* @y2: y coordinate of second control point
*
* Adds an elliptical arc from the current point to @x2, @y2
* Adds an elliptical arc from the current point to @x3, @y3
* with @x1, @y1 determining the tangent directions.
*
* After this, @x2, @y2 will be the new current point.
* After this, @x3, @y3 will be the new current point.
*
* Note: Two points and their tangents do not determine
* a unique ellipse, so GSK just picks one. If you need more
@@ -1180,7 +1180,7 @@ gsk_path_builder_arc_to (GskPathBuilder *self,
* @x2: x coordinate of second control point
* @y2: y coordinate of second control point
*
* Adds an elliptical arc from the current point to @x2, @y2
* Adds an elliptical arc from the current point to @x3, @y3
* with @x1, @y1 determining the tangent directions.
*
* All coordinates are given relative to the current point.
-2
View File
@@ -28,9 +28,7 @@ G_BEGIN_DECLS
typedef enum
{
/* path has only lines */
GSK_PATH_FLAT,
/* all contours are closed */
GSK_PATH_CLOSED
} GskPathFlags;
+72 -85
View File
@@ -428,6 +428,21 @@ gsk_renderer_render_texture (GskRenderer *renderer,
texture = GSK_RENDERER_GET_CLASS (renderer)->render_texture (renderer, root, viewport);
if (GSK_RENDERER_DEBUG_CHECK (renderer, RENDERER))
{
GString *buf = g_string_new ("*** Texture stats ***\n\n");
gsk_profiler_append_counters (priv->profiler, buf);
g_string_append_c (buf, '\n');
gsk_profiler_append_timers (priv->profiler, buf);
g_string_append_c (buf, '\n');
g_print ("%s\n***\n\n", buf->str);
g_string_free (buf, TRUE);
}
return texture;
}
@@ -494,6 +509,21 @@ gsk_renderer_render (GskRenderer *renderer,
renderer_class->render (renderer, root, clip);
if (GSK_RENDERER_DEBUG_CHECK (renderer, RENDERER))
{
GString *buf = g_string_new ("*** Frame stats ***\n\n");
gsk_profiler_append_counters (priv->profiler, buf);
g_string_append_c (buf, '\n');
gsk_profiler_append_timers (priv->profiler, buf);
g_string_append_c (buf, '\n');
g_print ("%s\n***\n\n", buf->str);
g_string_free (buf, TRUE);
}
g_clear_pointer (&priv->prev_node, gsk_render_node_unref);
cairo_region_destroy (clip);
g_clear_pointer (&offload, gsk_offload_free);
@@ -579,17 +609,12 @@ get_renderer_for_display (GdkSurface *surface)
static GType
get_renderer_for_env_var (GdkSurface *surface)
{
static GType env_var_type = G_TYPE_INVALID;
static GType env_var_type = G_TYPE_NONE;
if (env_var_type == G_TYPE_INVALID)
if (env_var_type == G_TYPE_NONE)
{
const char *renderer_name = g_getenv ("GSK_RENDERER");
env_var_type = get_renderer_for_name (renderer_name);
if (env_var_type != G_TYPE_INVALID)
GSK_DEBUG (RENDERER,
"Environment variable GSK_RENDERER=%s set, trying %s",
renderer_name,
g_type_name (env_var_type));
}
return env_var_type;
@@ -607,115 +632,83 @@ get_renderer_for_backend (GdkSurface *surface)
}
static gboolean
gl_supported_platform (GdkSurface *surface,
GType renderer_type,
gboolean as_fallback)
gl_software_rendering (GdkSurface *surface)
{
GdkDisplay *display = gdk_surface_get_display (surface);
GdkGLContext *context;
GError *error = NULL;
if (!gdk_display_prepare_gl (display, &error))
{
if (!as_fallback)
GSK_DEBUG (RENDERER, "Not using GL: %s", error->message);
g_clear_error (&error);
return FALSE;
}
if (as_fallback)
return TRUE;
if (!gdk_display_prepare_gl (display, NULL))
return G_TYPE_INVALID;
context = gdk_display_get_gl_context (display);
gdk_gl_context_make_current (context);
if (strstr ((const char *) glGetString (GL_RENDERER), "llvmpipe") != NULL)
{
GSK_DEBUG (RENDERER, "Not using '%s': renderer is llvmpipe", g_type_name (renderer_type));
return FALSE;
}
return TRUE;
return strstr ((const char *) glGetString (GL_RENDERER), "llvmpipe") != NULL;
}
static GType
get_renderer_for_gl (GdkSurface *surface)
{
if (!gl_supported_platform (surface, gsk_ngl_renderer_get_type (), FALSE))
if (gl_software_rendering (surface))
return G_TYPE_INVALID;
return gsk_ngl_renderer_get_type ();
}
static GType
get_renderer_for_gl_fallback (GdkSurface *surface)
{
if (!gl_supported_platform (surface, GSK_TYPE_GL_RENDERER, TRUE))
return G_TYPE_INVALID;
return GSK_TYPE_GL_RENDERER;
}
#ifdef GDK_RENDERING_VULKAN
static gboolean
vulkan_supported_platform (GdkSurface *surface,
GType renderer_type,
gboolean as_fallback)
vulkan_software_rendering (GdkSurface *surface)
{
GdkDisplay *display = gdk_surface_get_display (surface);
VkPhysicalDeviceProperties props;
GError *error = NULL;
if (!gdk_display_init_vulkan (display, &error))
{
if (!as_fallback)
GSK_DEBUG (RENDERER, "Not using Vulkan: %s", error->message);
g_clear_error (&error);
return FALSE;
}
if (!gdk_display_init_vulkan (display, NULL))
return G_TYPE_INVALID;
vkGetPhysicalDeviceProperties (display->vk_physical_device, &props);
if (props.deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU)
{
if (!as_fallback)
GSK_DEBUG (RENDERER,
"Not using '%s': device is CPU",
g_type_name (renderer_type));
return FALSE;
}
return props.deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU;
}
#endif
if (as_fallback)
return TRUE;
static GType
get_renderer_for_vulkan (GdkSurface *surface)
{
#ifdef GDK_RENDERING_VULKAN
if (vulkan_software_rendering (surface))
return G_TYPE_INVALID;
return GSK_TYPE_VULKAN_RENDERER;
#else
return G_TYPE_INVALID;
#endif
}
static gboolean
vulkan_friendly_platform (GdkSurface *surface)
{
#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;
}
static GType
get_renderer_for_vulkan (GdkSurface *surface)
get_renderer_for_vulkan_friendly_platform (GdkSurface *surface)
{
if (!vulkan_supported_platform (surface, GSK_TYPE_VULKAN_RENDERER, FALSE))
return G_TYPE_INVALID;
if (vulkan_friendly_platform (surface))
return get_renderer_for_vulkan (surface);
return GSK_TYPE_VULKAN_RENDERER;
return G_TYPE_INVALID;
}
static GType
get_renderer_for_vulkan_fallback (GdkSurface *surface)
get_renderer_for_gles2 (GdkSurface *surface)
{
if (!vulkan_supported_platform (surface, GSK_TYPE_VULKAN_RENDERER, TRUE))
return G_TYPE_INVALID;
return GSK_TYPE_VULKAN_RENDERER;
return GSK_TYPE_GL_RENDERER;
}
#endif
static GType
get_renderer_fallback (GdkSurface *surface)
@@ -729,14 +722,10 @@ static struct {
{ get_renderer_for_display },
{ get_renderer_for_env_var },
{ get_renderer_for_backend },
#ifdef GDK_RENDERING_VULKAN
{ get_renderer_for_vulkan },
#endif
{ get_renderer_for_vulkan_friendly_platform },
{ get_renderer_for_gl },
#ifdef GDK_RENDERING_VULKAN
{ get_renderer_for_vulkan_fallback },
#endif
{ get_renderer_for_gl_fallback },
{ get_renderer_for_vulkan },
{ get_renderer_for_gles2 },
{ get_renderer_fallback },
};
@@ -774,19 +763,17 @@ gsk_renderer_new_for_surface (GdkSurface *surface)
if (gsk_renderer_realize (renderer, surface, &error))
{
GSK_DEBUG (RENDERER,
"Using renderer '%s' for surface '%s'",
G_OBJECT_TYPE_NAME (renderer),
G_OBJECT_TYPE_NAME (surface));
GSK_RENDERER_DEBUG (renderer, RENDERER,
"Using renderer of type '%s' for surface '%s'",
G_OBJECT_TYPE_NAME (renderer),
G_OBJECT_TYPE_NAME (surface));
return renderer;
}
GSK_DEBUG (RENDERER,
"Failed to realize renderer '%s' for surface '%s': %s",
g_message ("Failed to realize renderer of type '%s' for surface '%s': %s\n",
G_OBJECT_TYPE_NAME (renderer),
G_OBJECT_TYPE_NAME (surface),
error->message);
g_object_unref (renderer);
g_clear_error (&error);
}
+6 -35
View File
@@ -2312,25 +2312,6 @@ parse_antialias (GtkCssParser *parser,
return TRUE;
}
static gboolean
parse_hint_metrics (GtkCssParser *parser,
Context *context,
gpointer out)
{
if (!parse_enum (parser, CAIRO_GOBJECT_TYPE_HINT_METRICS, out))
return FALSE;
if (*(cairo_hint_metrics_t *) out != CAIRO_HINT_METRICS_OFF &&
*(cairo_hint_metrics_t *) out != CAIRO_HINT_METRICS_ON)
{
gtk_css_parser_error_value (parser, "Unsupported value for enum \"%s\"",
g_type_name (CAIRO_GOBJECT_TYPE_HINT_METRICS));
return FALSE;
}
return TRUE;
}
static GskRenderNode *
parse_text_node (GtkCssParser *parser,
Context *context)
@@ -2341,7 +2322,6 @@ parse_text_node (GtkCssParser *parser,
PangoGlyphString *glyphs = NULL;
cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_SLIGHT;
cairo_antialias_t antialias = CAIRO_ANTIALIAS_GRAY;
cairo_hint_metrics_t hint_metrics = CAIRO_HINT_METRICS_OFF;
PangoFont *hinted;
const Declaration declarations[] = {
{ "font", parse_font, clear_font, &font },
@@ -2350,7 +2330,6 @@ parse_text_node (GtkCssParser *parser,
{ "glyphs", parse_glyphs, clear_glyphs, &glyphs },
{ "hint-style", parse_hint_style, NULL, &hint_style },
{ "antialias", parse_antialias, NULL, &antialias },
{ "hint-metrics", parse_hint_metrics, NULL, &hint_metrics },
};
GskRenderNode *result;
@@ -2362,7 +2341,7 @@ parse_text_node (GtkCssParser *parser,
g_assert (font);
}
hinted = gsk_reload_font (font, 1.0, hint_metrics, hint_style, antialias);
hinted = gsk_reload_font (font, 1.0, CAIRO_HINT_METRICS_OFF, hint_style, antialias);
g_object_unref (font);
font = hinted;
@@ -3560,13 +3539,13 @@ append_texture_param (Printer *p,
case GDK_MEMORY_U8:
case GDK_MEMORY_U16:
bytes = gdk_texture_save_to_png_bytes (texture);
g_string_append (p->str, "url(\"data:image/png;base64,\\\n");
g_string_append (p->str, "url(\"data:image/png;base64,");
break;
case GDK_MEMORY_FLOAT16:
case GDK_MEMORY_FLOAT32:
bytes = gdk_texture_save_to_tiff_bytes (texture);
g_string_append (p->str, "url(\"data:image/tiff;base64,\\\n");
g_string_append (p->str, "url(\"data:image/tiff;base64,");
break;
default:
@@ -3625,7 +3604,7 @@ gsk_text_node_serialize_font (GskRenderNode *node,
b64 = base64_encode_with_linebreaks ((const guchar *) data, len);
g_string_append (p->str, " url(\"data:font/ttf;base64,\\\n");
g_string_append (p->str, " url(\"data:font/ttf;base64,");
append_escaping_newlines (p->str, b64);
g_string_append (p->str, "\")");
@@ -3644,13 +3623,11 @@ gsk_text_node_serialize_font_options (GskRenderNode *node,
cairo_font_options_t *options;
cairo_hint_style_t hint_style;
cairo_antialias_t antialias;
cairo_hint_metrics_t hint_metrics;
options = cairo_font_options_create ();
cairo_scaled_font_get_font_options (sf, options);
hint_style = cairo_font_options_get_hint_style (options);
antialias = cairo_font_options_get_antialias (options);
hint_metrics = cairo_font_options_get_hint_metrics (options);
cairo_font_options_destroy (options);
/* medium and full are identical in the absence of subpixel modes */
@@ -3666,12 +3643,6 @@ gsk_text_node_serialize_font_options (GskRenderNode *node,
*/
if (antialias == CAIRO_ANTIALIAS_NONE)
append_enum_param (p, "antialias", CAIRO_GOBJECT_TYPE_ANTIALIAS, antialias);
/* CAIRO_HINT_METRICS_ON is the only value we ever emit here, since off is the default,
* and we don't accept any other values.
*/
if (hint_metrics == CAIRO_HINT_METRICS_ON)
append_enum_param (p, "hint-metrics", CAIRO_GOBJECT_TYPE_HINT_METRICS, CAIRO_HINT_METRICS_ON);
}
void
@@ -4443,7 +4414,7 @@ render_node_print (Printer *p,
cairo_surface_write_to_png_stream (surface, cairo_write_array, array);
_indent (p);
g_string_append (p->str, "pixels: url(\"data:image/png;base64,\\\n");
g_string_append (p->str, "pixels: url(\"data:image/png;base64,");
b64 = base64_encode_with_linebreaks (array->data, array->len);
append_escaping_newlines (p->str, b64);
g_free (b64);
@@ -4463,7 +4434,7 @@ render_node_print (Printer *p,
if (cairo_script_from_recording_surface (script, surface) == CAIRO_STATUS_SUCCESS)
{
_indent (p);
g_string_append (p->str, "script: url(\"data:;base64,\\\n");
g_string_append (p->str, "script: url(\"data:;base64,");
b64 = base64_encode_with_linebreaks (array->data, array->len);
append_escaping_newlines (p->str, b64);
g_free (b64);
+6
View File
@@ -184,4 +184,10 @@
</signal>
</interface>
<interface name="org.a11y.atspi.Event.Focus">
<signal name="Focus"><arg direction="in" type="(suuv)"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
</signal>
</interface>
</node>
+20 -19
View File
@@ -720,16 +720,6 @@ handle_accessible_get_property (GDBusConnection *connection,
res = get_parent_context_ref (accessible);
else if (g_strcmp0 (property_name, "ChildCount") == 0)
res = g_variant_new_int32 (gtk_at_spi_context_get_child_count (self));
else if (g_strcmp0 (property_name, "HelpText"))
{
if (gtk_at_context_has_accessible_property (GTK_AT_CONTEXT (self), GTK_ACCESSIBLE_PROPERTY_HELP_TEXT))
{
GtkAccessibleValue *value = gtk_at_context_get_accessible_property (GTK_AT_CONTEXT (self), GTK_ACCESSIBLE_PROPERTY_HELP_TEXT);
res = g_variant_new_string (gtk_string_accessible_value_get (value));
}
else
res = g_variant_new_string ("");
}
else
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"Unknown property '%s'", property_name);
@@ -909,6 +899,24 @@ emit_children_changed (GtkAtSpiContext *self,
context_ref);
}
static void
emit_focus (GtkAtSpiContext *self,
gboolean focus_in)
{
if (self->connection == NULL)
return;
if (focus_in)
g_dbus_connection_emit_signal (self->connection,
NULL,
self->context_path,
"org.a11y.atspi.Event.Focus",
"Focus",
g_variant_new ("(siiva{sv})",
"", 0, 0, g_variant_new_string ("0"), NULL),
NULL);
}
static void
emit_window_event (GtkAtSpiContext *self,
const char *event_type)
@@ -1146,7 +1154,7 @@ gtk_at_spi_context_state_change (GtkATContext *ctx,
}
if (changed_properties & GTK_ACCESSIBLE_PROPERTY_CHANGE_DESCRIPTION)
{
{
char *label = gtk_at_context_get_description (GTK_AT_CONTEXT (self));
GVariant *v = g_variant_new_take_string (label);
emit_property_changed (self, "accessible-description", v);
@@ -1159,14 +1167,6 @@ gtk_at_spi_context_state_change (GtkATContext *ctx,
"accessible-value",
g_variant_new_double (gtk_number_accessible_value_get (value)));
}
if (changed_properties & GTK_ACCESSIBLE_PROPERTY_CHANGE_HELP_TEXT)
{
value = gtk_accessible_attribute_set_get_value (properties, GTK_ACCESSIBLE_PROPERTY_HELP_TEXT);
emit_property_changed (self,
"accessible-help-text",
g_variant_new_string (gtk_string_accessible_value_get (value)));
}
}
static void
@@ -1196,6 +1196,7 @@ gtk_at_spi_context_platform_change (GtkATContext *ctx,
gboolean state = gtk_accessible_get_platform_state (GTK_ACCESSIBLE (widget),
GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSED);
emit_state_changed (self, "focused", state);
emit_focus (self, state);
}
if (changed_platform & GTK_ACCESSIBLE_PLATFORM_CHANGE_ACTIVE)
+2 -2
View File
@@ -97,7 +97,7 @@ gtk_accessible_role_to_atspi_role (GtkAccessibleRole role)
return ATSPI_ROLE_FORM;
case GTK_ACCESSIBLE_ROLE_GENERIC:
return ATSPI_ROLE_PANEL;
return ATSPI_ROLE_FILLER;
case GTK_ACCESSIBLE_ROLE_GRID:
return ATSPI_ROLE_TABLE;
@@ -106,7 +106,7 @@ gtk_accessible_role_to_atspi_role (GtkAccessibleRole role)
return ATSPI_ROLE_TABLE_CELL;
case GTK_ACCESSIBLE_ROLE_GROUP:
return ATSPI_ROLE_GROUPING;
return ATSPI_ROLE_PANEL;
case GTK_ACCESSIBLE_ROLE_HEADING:
return ATSPI_ROLE_HEADING;
+33 -54
View File
@@ -28,33 +28,6 @@
typedef struct _GtkCssParserBlock GtkCssParserBlock;
struct _GtkCssParserBlock
{
GtkCssLocation start_location;
GtkCssTokenType end_token;
GtkCssTokenType inherited_end_token;
GtkCssTokenType alternative_token;
};
#define GDK_ARRAY_NAME gtk_css_parser_blocks
#define GDK_ARRAY_TYPE_NAME GtkCssParserBlocks
#define GDK_ARRAY_ELEMENT_TYPE GtkCssParserBlock
#define GDK_ARAY_PREALLOC 32
#define GDK_ARRAY_NO_MEMSET 1
#include "gdk/gdkarrayimpl.c"
static inline GtkCssParserBlock *
gtk_css_parser_blocks_get_last (GtkCssParserBlocks *blocks)
{
return gtk_css_parser_blocks_index (blocks, gtk_css_parser_blocks_get_size (blocks) - 1);
}
static inline void
gtk_css_parser_blocks_drop_last (GtkCssParserBlocks *blocks)
{
gtk_css_parser_blocks_set_size (blocks, gtk_css_parser_blocks_get_size (blocks) - 1);
}
struct _GtkCssParser
{
volatile int ref_count;
@@ -66,11 +39,19 @@ struct _GtkCssParser
gpointer user_data;
GDestroyNotify user_destroy;
GtkCssParserBlocks blocks;
GArray *blocks;
GtkCssLocation location;
GtkCssToken token;
};
struct _GtkCssParserBlock
{
GtkCssLocation start_location;
GtkCssTokenType end_token;
GtkCssTokenType inherited_end_token;
GtkCssTokenType alternative_token;
};
static GtkCssParser *
gtk_css_parser_new (GtkCssTokenizer *tokenizer,
GFile *file,
@@ -85,12 +66,15 @@ gtk_css_parser_new (GtkCssTokenizer *tokenizer,
self->ref_count = 1;
self->tokenizer = gtk_css_tokenizer_ref (tokenizer);
if (file)
self->file = g_object_ref (file);
{
self->file = g_object_ref (file);
self->directory = g_file_get_parent (file);
}
self->error_func = error_func;
self->user_data = user_data;
self->user_destroy = user_destroy;
gtk_css_parser_blocks_init (&self->blocks);
self->blocks = g_array_new (FALSE, FALSE, sizeof (GtkCssParserBlock));
return self;
}
@@ -142,9 +126,9 @@ gtk_css_parser_finalize (GtkCssParser *self)
g_clear_pointer (&self->tokenizer, gtk_css_tokenizer_unref);
g_clear_object (&self->file);
g_clear_object (&self->directory);
if (gtk_css_parser_blocks_get_size (&self->blocks) > 0)
g_critical ("Finalizing CSS parser with %lu remaining blocks", gtk_css_parser_blocks_get_size (&self->blocks));
gtk_css_parser_blocks_clear (&self->blocks);
if (self->blocks->len)
g_critical ("Finalizing CSS parser with %u remaining blocks", self->blocks->len);
g_array_free (self->blocks, TRUE);
g_free (self);
}
@@ -204,12 +188,7 @@ gtk_css_parser_resolve_url (GtkCssParser *self,
}
if (self->directory == NULL)
{
if (self->file)
self->directory = g_file_get_parent (self->file);
if (self->directory == NULL)
return NULL;
}
return NULL;
return g_file_resolve_relative_path (self->directory, url);
}
@@ -280,13 +259,13 @@ gtk_css_parser_get_block_location (GtkCssParser *self)
{
const GtkCssParserBlock *block;
if (gtk_css_parser_blocks_get_size (&self->blocks) == 0)
if (self->blocks->len == 0)
{
static const GtkCssLocation start_of_document = { 0, };
return &start_of_document;
}
block = gtk_css_parser_blocks_get_last (&self->blocks);
block = &g_array_index (self->blocks, GtkCssParserBlock, self->blocks->len - 1);
return &block->start_location;
}
@@ -316,9 +295,9 @@ gtk_css_parser_peek_token (GtkCssParser *self)
gtk_css_parser_ensure_token (self);
if (gtk_css_parser_blocks_get_size (&self->blocks) > 0)
if (self->blocks->len)
{
const GtkCssParserBlock *block = gtk_css_parser_blocks_get_last (&self->blocks);
const GtkCssParserBlock *block = &g_array_index (self->blocks, GtkCssParserBlock, self->blocks->len - 1);
if (gtk_css_token_is (&self->token, block->end_token) ||
gtk_css_token_is (&self->token, block->inherited_end_token) ||
gtk_css_token_is (&self->token, block->alternative_token))
@@ -373,7 +352,7 @@ gtk_css_parser_start_block (GtkCssParser *self)
block.inherited_end_token = GTK_CSS_TOKEN_EOF;
block.alternative_token = GTK_CSS_TOKEN_EOF;
block.start_location = self->location;
gtk_css_parser_blocks_append (&self->blocks, block);
g_array_append_val (self->blocks, block);
gtk_css_token_clear (&self->token);
}
@@ -385,13 +364,13 @@ gtk_css_parser_start_semicolon_block (GtkCssParser *self,
GtkCssParserBlock block;
block.end_token = GTK_CSS_TOKEN_SEMICOLON;
if (gtk_css_parser_blocks_get_size (&self->blocks) > 0)
block.inherited_end_token = gtk_css_parser_blocks_get_last (&self->blocks)->end_token;
if (self->blocks->len)
block.inherited_end_token = g_array_index (self->blocks, GtkCssParserBlock, self->blocks->len - 1).end_token;
else
block.inherited_end_token = GTK_CSS_TOKEN_EOF;
block.alternative_token = alternative_token;
block.start_location = self->location;
gtk_css_parser_blocks_append (&self->blocks, block);
g_array_append_val (self->blocks, block);
}
void
@@ -399,9 +378,9 @@ gtk_css_parser_end_block_prelude (GtkCssParser *self)
{
GtkCssParserBlock *block;
g_return_if_fail (gtk_css_parser_blocks_get_size (&self->blocks) > 0);
g_return_if_fail (self->blocks->len > 0);
block = gtk_css_parser_blocks_get_last (&self->blocks);
block = &g_array_index (self->blocks, GtkCssParserBlock, self->blocks->len - 1);
if (block->alternative_token == GTK_CSS_TOKEN_EOF)
return;
@@ -426,11 +405,11 @@ gtk_css_parser_end_block (GtkCssParser *self)
{
GtkCssParserBlock *block;
g_return_if_fail (gtk_css_parser_blocks_get_size (&self->blocks) > 0);
g_return_if_fail (self->blocks->len > 0);
gtk_css_parser_skip_until (self, GTK_CSS_TOKEN_EOF);
block = gtk_css_parser_blocks_get_last (&self->blocks);
block = &g_array_index (self->blocks, GtkCssParserBlock, self->blocks->len - 1);
if (gtk_css_token_is (&self->token, GTK_CSS_TOKEN_EOF))
{
@@ -439,7 +418,7 @@ gtk_css_parser_end_block (GtkCssParser *self)
gtk_css_parser_get_block_location (self),
gtk_css_parser_get_start_location (self),
"Unterminated block at end of document");
gtk_css_parser_blocks_drop_last (&self->blocks);
g_array_set_size (self->blocks, self->blocks->len - 1);
}
else if (gtk_css_token_is (&self->token, block->inherited_end_token))
{
@@ -449,11 +428,11 @@ gtk_css_parser_end_block (GtkCssParser *self)
gtk_css_parser_get_block_location (self),
gtk_css_parser_get_start_location (self),
"Expected ';' at end of block");
gtk_css_parser_blocks_drop_last (&self->blocks);
g_array_set_size (self->blocks, self->blocks->len - 1);
}
else
{
gtk_css_parser_blocks_drop_last (&self->blocks);
g_array_set_size (self->blocks, self->blocks->len - 1);
if (gtk_css_token_is_preserved (&self->token, NULL))
{
gtk_css_token_clear (&self->token);
+103 -289
View File
@@ -21,16 +21,9 @@
#include "gtkscalerprivate.h"
#include "gdk/gdktextureprivate.h"
#include "gdk/loaders/gdkpngprivate.h"
/* {{{ Pixbuf helpers */
static inline gboolean
pixbuf_is_only_fg (GdkPixbuf *pixbuf)
{
return gdk_pixbuf_get_option (pixbuf, "tEXt::only-foreground") != NULL;
}
static GdkPixbuf *
load_from_stream (GdkPixbufLoader *loader,
GInputStream *stream,
@@ -206,7 +199,6 @@ _gdk_pixbuf_new_from_resource_at_scale (const char *resource_path,
static GdkPixbuf *
load_symbolic_svg (const char *escaped_file_data,
gsize len,
int width,
int height,
const char *icon_width_str,
@@ -222,38 +214,37 @@ load_symbolic_svg (const char *escaped_file_data,
char *data;
data = g_strconcat ("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
"<svg version=\"1.1\" "
"xmlns=\"http://www.w3.org/2000/svg\" "
"xmlns:xi=\"http://www.w3.org/2001/XInclude\" "
"width=\"", icon_width_str, "\" "
"height=\"", icon_height_str, "\">"
"<style type=\"text/css\">"
"rect,circle,path {"
"fill: ", fg_string," !important;"
"}\n"
".warning {"
"fill: ", warning_color_string, " !important;"
"}\n"
".error {"
"fill: ", error_color_string ," !important;"
"}\n"
".success {"
"fill: ", success_color_string, " !important;"
"}"
"</style>"
"<xi:include href=\"data:text/xml;base64,",
"<svg version=\"1.1\"\n"
" xmlns=\"http://www.w3.org/2000/svg\"\n"
" xmlns:xi=\"http://www.w3.org/2001/XInclude\"\n"
" width=\"", icon_width_str, "\"\n"
" height=\"", icon_height_str, "\">\n"
" <style type=\"text/css\">\n"
" rect,circle,path {\n"
" fill: ", fg_string," !important;\n"
" }\n"
" .warning {\n"
" fill: ", warning_color_string, " !important;\n"
" }\n"
" .error {\n"
" fill: ", error_color_string ," !important;\n"
" }\n"
" .success {\n"
" fill: ", success_color_string, " !important;\n"
" }\n"
" </style>\n"
" <xi:include href=\"data:text/xml;base64,", escaped_file_data, "\"/>\n"
"</svg>",
NULL);
stream = g_memory_input_stream_new_from_data (data, -1, g_free);
g_memory_input_stream_add_data (G_MEMORY_INPUT_STREAM (stream), escaped_file_data, len, NULL);
g_memory_input_stream_add_data (G_MEMORY_INPUT_STREAM (stream), "\"/></svg>", strlen ("\"/></svg>"), NULL);
pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream, width, height, TRUE, NULL, error);
g_object_unref (stream);
return pixbuf;
}
static gboolean
static void
extract_plane (GdkPixbuf *src,
GdkPixbuf *dst,
int from_plane,
@@ -264,7 +255,6 @@ extract_plane (GdkPixbuf *src,
gsize src_stride, dst_stride;
guchar *src_row, *dst_row;
int x, y;
gboolean all_clear = TRUE;
width = gdk_pixbuf_get_width (src);
height = gdk_pixbuf_get_height (src);
@@ -284,109 +274,11 @@ extract_plane (GdkPixbuf *src,
dst_row = dst_data + dst_stride * y;
for (x = 0; x < width; x++)
{
if (src_row[from_plane] != 0)
all_clear = FALSE;
dst_row[to_plane] = src_row[from_plane];
src_row += 4;
dst_row += 4;
}
}
return all_clear;
}
static void
keep_alpha (GdkPixbuf *src)
{
guchar *data;
int width, height;
gsize stride;
data = gdk_pixbuf_get_pixels (src);
width = gdk_pixbuf_get_width (src);
height = gdk_pixbuf_get_height (src);
stride = gdk_pixbuf_get_rowstride (src);
for (int y = 0; y < height; y++)
{
guchar *row = data + stride * y;
for (int x = 0; x < width; x++)
{
row[0] = row[1] = row[2] = 0;
row += 4;
}
}
}
static void
svg_find_size_strings (const char *data,
gsize len,
char **width,
char **height)
{
gsize i, j, k, l;
*width = NULL;
*height = NULL;
for (i = 0; i < len - 4; i++)
{
if (strncmp (data + i, "<svg", 4) == 0)
{
for (j = i + strlen ("<svg"); j < len - 9; j++)
{
if (strncmp (data + j, "height=\"", strlen ("height=\"")) == 0)
{
k = l = j + strlen ("height=\"");
while (l < len && data[l] != '\"')
l++;
*height = g_strndup (data + k, l - k);
if (*width && *height)
return;
j = l;
}
else if (strncmp (data + j, "width=\"", strlen ("width=\"")) == 0)
{
k = l = j + strlen ("width=\"");
while (l < len && data[l] != '\"')
l++;
*width = g_strndup (data + k, l - k);
if (*width && *height)
return;
j = l;
}
else if (data[j] == '>')
{
break;
}
}
break;
}
}
*width = g_strdup ("16px");
*height = g_strdup ("16px");
}
static gboolean
svg_has_symbolic_classes (const char *data,
gsize len)
{
#ifdef HAVE_MEMMEM
return memmem (data, len, "class=\"error\"", strlen ("class=\"error\"")) != NULL ||
memmem (data, len, "class=\"warning\"", strlen ("class=\"warning\"")) != NULL ||
memmem (data, len, "class=\"success\"", strlen ("class=\"success\"")) != NULL;
#else
return TRUE;
#endif
}
GdkPixbuf *
@@ -401,46 +293,38 @@ gtk_make_symbolic_pixbuf_from_data (const char *file_data,
{
const char *r_string = "rgb(255,0,0)";
const char *g_string = "rgb(0,255,0)";
char *icon_width_str = NULL;
char *icon_height_str = NULL;
char *escaped_file_data = NULL;
gsize len;
char *icon_width_str;
char *icon_height_str;
GdkPixbuf *loaded;
GdkPixbuf *pixbuf = NULL;
gboolean has_symbolic_classes;
gboolean only_fg = TRUE;
has_symbolic_classes = svg_has_symbolic_classes (file_data, file_len);
int plane;
int icon_width, icon_height;
char *escaped_file_data;
/* Fetch size from the original icon */
if (has_symbolic_classes || width == 0 || height == 0)
svg_find_size_strings (file_data, file_len, &icon_width_str, &icon_height_str);
GInputStream *stream = g_memory_input_stream_new_from_data (file_data, file_len, NULL);
GdkPixbuf *reference = gdk_pixbuf_new_from_stream (stream, NULL, error);
if (width == 0)
width = (int) (g_ascii_strtoull (icon_width_str, NULL, 0) * scale);
if (height == 0)
height = (int) (g_ascii_strtoull (icon_height_str, NULL, 0) * scale);
g_object_unref (stream);
if (!has_symbolic_classes)
{
GInputStream *stream;
if (!reference)
return NULL;
stream = g_memory_input_stream_new_from_data (file_data, file_len, NULL);
pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream, width, height, TRUE, NULL, error);
g_object_unref (stream);
if (pixbuf)
keep_alpha (pixbuf);
goto out;
}
icon_width = gdk_pixbuf_get_width (reference);
icon_height = gdk_pixbuf_get_height (reference);
g_object_unref (reference);
escaped_file_data = g_base64_encode ((guchar *) file_data, file_len);
len = strlen (escaped_file_data);
icon_width_str = g_strdup_printf ("%d", icon_width);
icon_height_str = g_strdup_printf ("%d", icon_height);
for (int plane = 0; plane < 3; plane++)
if (width == 0)
width = icon_width * scale;
if (height == 0)
height = icon_height * scale;
for (plane = 0; plane < 3; plane++)
{
GdkPixbuf *loaded;
/* Here we render the svg with all colors solid, this should
* always make the alpha channel the same and it should match
* the final alpha channel for all possible renderings. We
@@ -453,7 +337,7 @@ gtk_make_symbolic_pixbuf_from_data (const char *file_data,
* channels, with the color of the fg being implicitly
* the "rest", as all color fractions should add up to 1.
*/
loaded = load_symbolic_svg (escaped_file_data, len, width, height,
loaded = load_symbolic_svg (escaped_file_data, width, height,
icon_width_str,
icon_height_str,
g_string,
@@ -474,26 +358,25 @@ gtk_make_symbolic_pixbuf_from_data (const char *file_data,
g_free (filename);
}
if (plane == 0)
if (pixbuf == NULL)
{
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8,
gdk_pixbuf_get_width (loaded),
gdk_pixbuf_get_height (loaded));
memset (gdk_pixbuf_get_pixels (pixbuf), 0, gdk_pixbuf_get_byte_length (pixbuf));
extract_plane (loaded, pixbuf, 3, 3);
gdk_pixbuf_fill (pixbuf, 0);
}
only_fg &= extract_plane (loaded, pixbuf, 0, plane);
if (plane == 0)
extract_plane (loaded, pixbuf, 3, 3);
extract_plane (loaded, pixbuf, 0, plane);
g_object_unref (loaded);
}
out:
if (only_fg && pixbuf)
gdk_pixbuf_set_option (pixbuf, "tEXt::only-foreground", "true");
g_free (escaped_file_data);
out:
g_free (icon_width_str);
g_free (icon_height_str);
@@ -526,17 +409,17 @@ make_symbolic_pixbuf_from_resource (const char *path,
}
static GdkPixbuf *
make_symbolic_pixbuf_from_filename (const char *filename,
int width,
int height,
double scale,
GError **error)
make_symbolic_pixbuf_from_path (const char *path,
int width,
int height,
double scale,
GError **error)
{
char *data;
gsize size;
GdkPixbuf *pixbuf;
if (!g_file_get_contents (filename, &data, &size, error))
if (!g_file_get_contents (path, &data, &size, error))
return NULL;
pixbuf = gtk_make_symbolic_pixbuf_from_data (data, size, width, height, scale, NULL, error);
@@ -570,85 +453,11 @@ make_symbolic_pixbuf_from_file (GFile *file,
/* }}} */
/* {{{ Texture API */
static GdkTexture *
texture_new_from_bytes (GBytes *bytes,
gboolean *only_fg,
GError **error)
{
GHashTable *options;
GdkTexture *texture;
if (!gdk_is_png (bytes))
return gdk_texture_new_from_bytes (bytes, error);
options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
texture = gdk_load_png (bytes, options, error);
*only_fg = g_hash_table_contains (options, "foreground-only");
g_hash_table_unref (options);
return texture;
}
GdkTexture *
gdk_texture_new_from_filename_with_fg (const char *filename,
gboolean *only_fg,
GError **error)
{
GFile *file;
GBytes *bytes;
GdkTexture *texture = NULL;
file = g_file_new_for_path (filename);
bytes = g_file_load_bytes (file, NULL, NULL, error);
if (bytes)
texture = texture_new_from_bytes (bytes, only_fg, error);
g_bytes_unref (bytes);
g_object_unref (file);
return texture;
}
GdkTexture *
gdk_texture_new_from_resource_with_fg (const char *path,
gboolean *only_fg)
{
GBytes *bytes;
GdkTexture *texture = NULL;
bytes = g_resources_lookup_data (path, 0, NULL);
if (bytes)
texture = texture_new_from_bytes (bytes, only_fg, NULL);
g_bytes_unref (bytes);
return texture;
}
GdkTexture *
gdk_texture_new_from_stream_with_fg (GInputStream *stream,
gboolean *only_fg,
GCancellable *cancellable,
GError **error)
{
GdkPixbuf *pixbuf;
GdkTexture *texture = NULL;
pixbuf = _gdk_pixbuf_new_from_stream_scaled (stream, 0, cancellable, error);
if (pixbuf)
{
*only_fg = pixbuf_is_only_fg (pixbuf);
texture = gdk_texture_new_for_pixbuf (pixbuf);
g_object_unref (pixbuf);
}
return texture;
}
GdkTexture *
gdk_texture_new_from_stream_at_scale (GInputStream *stream,
int width,
int height,
gboolean aspect,
gboolean *only_fg,
GCancellable *cancellable,
GError **error)
{
@@ -658,7 +467,24 @@ gdk_texture_new_from_stream_at_scale (GInputStream *stream,
pixbuf = _gdk_pixbuf_new_from_stream_at_scale (stream, width, height, aspect, cancellable, error);
if (pixbuf)
{
*only_fg = pixbuf_is_only_fg (pixbuf);
texture = gdk_texture_new_for_pixbuf (pixbuf);
g_object_unref (pixbuf);
}
return texture;
}
GdkTexture *
gdk_texture_new_from_stream (GInputStream *stream,
GCancellable *cancellable,
GError **error)
{
GdkPixbuf *pixbuf;
GdkTexture *texture = NULL;
pixbuf = _gdk_pixbuf_new_from_stream_scaled (stream, 0, cancellable, error);
if (pixbuf)
{
texture = gdk_texture_new_for_pixbuf (pixbuf);
g_object_unref (pixbuf);
}
@@ -671,7 +497,6 @@ gdk_texture_new_from_resource_at_scale (const char *path,
int width,
int height,
gboolean preserve_aspect,
gboolean *only_fg,
GError **error)
{
GdkPixbuf *pixbuf;
@@ -680,7 +505,6 @@ gdk_texture_new_from_resource_at_scale (const char *path,
pixbuf = _gdk_pixbuf_new_from_resource_at_scale (path, width, height, preserve_aspect, error);
if (pixbuf)
{
*only_fg = pixbuf_is_only_fg (pixbuf);
texture = gdk_texture_new_for_pixbuf (pixbuf);
g_object_unref (pixbuf);
}
@@ -692,20 +516,18 @@ gdk_texture_new_from_resource_at_scale (const char *path,
/* {{{ Symbolic texture API */
GdkTexture *
gdk_texture_new_from_filename_symbolic (const char *filename,
int width,
int height,
double scale,
gboolean *only_fg,
GError **error)
gdk_texture_new_from_path_symbolic (const char *path,
int width,
int height,
double scale,
GError **error)
{
GdkPixbuf *pixbuf;
GdkTexture *texture = NULL;
pixbuf = make_symbolic_pixbuf_from_filename (filename, width, height, scale, error);
pixbuf = make_symbolic_pixbuf_from_path (path, width, height, scale, error);
if (pixbuf)
{
*only_fg = pixbuf_is_only_fg (pixbuf);
texture = gdk_texture_new_for_pixbuf (pixbuf);
g_object_unref (pixbuf);
}
@@ -724,7 +546,6 @@ gdk_texture_new_from_resource_symbolic (const char *path,
int width,
int height,
double scale,
gboolean *only_fg,
GError **error)
{
GdkPixbuf *pixbuf;
@@ -733,7 +554,6 @@ gdk_texture_new_from_resource_symbolic (const char *path,
pixbuf = make_symbolic_pixbuf_from_resource (path, width, height, scale, error);
if (pixbuf)
{
*only_fg = pixbuf_is_only_fg (pixbuf);
texture = gdk_texture_new_for_pixbuf (pixbuf);
g_object_unref (pixbuf);
}
@@ -768,19 +588,14 @@ gdk_texture_new_from_file_symbolic (GFile *file,
int width,
int height,
double scale,
gboolean *only_fg,
GError **error)
{
GdkPixbuf *pixbuf;
GdkTexture *texture = NULL;
GdkTexture *texture;
pixbuf = make_symbolic_pixbuf_from_file (file, width, height, scale, error);
if (pixbuf)
{
*only_fg = pixbuf_is_only_fg (pixbuf);
texture = gdk_texture_new_for_pixbuf (pixbuf);
g_object_unref (pixbuf);
}
texture = gdk_texture_new_for_pixbuf (pixbuf);
g_object_unref (pixbuf);
return texture;
}
@@ -789,7 +604,7 @@ gdk_texture_new_from_file_symbolic (GFile *file,
/* {{{ Scaled paintable API */
typedef struct {
double scale;
int scale_factor;
} LoaderData;
static void
@@ -805,24 +620,24 @@ on_loader_size_prepared (GdkPixbufLoader *loader,
format = gdk_pixbuf_loader_get_format (loader);
if (!gdk_pixbuf_format_is_scalable (format))
{
loader_data->scale = 1.0;
loader_data->scale_factor = 1;
return;
}
gdk_pixbuf_loader_set_size (loader,
width * loader_data->scale,
height * loader_data->scale);
width * loader_data->scale_factor,
height * loader_data->scale_factor);
}
static GdkPaintable *
gdk_paintable_new_from_bytes_scaled (GBytes *bytes,
double scale)
int scale_factor)
{
LoaderData loader_data;
GdkTexture *texture;
GdkPaintable *paintable;
loader_data.scale = scale;
loader_data.scale_factor = scale_factor;
if (gdk_texture_can_load (bytes))
{
@@ -852,8 +667,8 @@ gdk_paintable_new_from_bytes_scaled (GBytes *bytes,
texture = gdk_texture_new_for_pixbuf (gdk_pixbuf_loader_get_pixbuf (loader));
g_object_unref (loader);
if (loader_data.scale != 1.0)
paintable = gtk_scaler_new (GDK_PAINTABLE (texture), loader_data.scale);
if (loader_data.scale_factor != 1)
paintable = gtk_scaler_new (GDK_PAINTABLE (texture), loader_data.scale_factor);
else
paintable = g_object_ref (GDK_PAINTABLE (texture));
@@ -864,20 +679,20 @@ gdk_paintable_new_from_bytes_scaled (GBytes *bytes,
}
GdkPaintable *
gdk_paintable_new_from_filename_scaled (const char *filename,
double scale)
gdk_paintable_new_from_path_scaled (const char *path,
int scale_factor)
{
char *contents;
gsize length;
GBytes *bytes;
GdkPaintable *paintable;
if (!g_file_get_contents (filename, &contents, &length, NULL))
if (!g_file_get_contents (path, &contents, &length, NULL))
return NULL;
bytes = g_bytes_new_take (contents, length);
paintable = gdk_paintable_new_from_bytes_scaled (bytes, scale);
paintable = gdk_paintable_new_from_bytes_scaled (bytes, scale_factor);
g_bytes_unref (bytes);
@@ -886,7 +701,7 @@ gdk_paintable_new_from_filename_scaled (const char *filename,
GdkPaintable *
gdk_paintable_new_from_resource_scaled (const char *path,
double scale)
int scale_factor)
{
GBytes *bytes;
GdkPaintable *paintable;
@@ -895,16 +710,15 @@ gdk_paintable_new_from_resource_scaled (const char *path,
if (!bytes)
return NULL;
paintable = gdk_paintable_new_from_bytes_scaled (bytes, scale);
paintable = gdk_paintable_new_from_bytes_scaled (bytes, scale_factor);
g_bytes_unref (bytes);
return paintable;
}
GdkPaintable *
gdk_paintable_new_from_file_scaled (GFile *file,
double scale)
gdk_paintable_new_from_file_scaled (GFile *file,
int scale_factor)
{
GBytes *bytes;
GdkPaintable *paintable;
@@ -913,7 +727,7 @@ gdk_paintable_new_from_file_scaled (GFile *file,
if (!bytes)
return NULL;
paintable = gdk_paintable_new_from_bytes_scaled (bytes, scale);
paintable = gdk_paintable_new_from_bytes_scaled (bytes, scale_factor);
g_bytes_unref (bytes);
+7 -18
View File
@@ -29,56 +29,45 @@ GdkPixbuf *gtk_make_symbolic_pixbuf_from_data (const char *data,
const char *debug_output_to,
GError **error);
GdkTexture *gdk_texture_new_from_filename_with_fg (const char *filename,
gboolean *only_fg,
GError **error);
GdkTexture *gdk_texture_new_from_resource_with_fg (const char *path,
gboolean *only_fg);
GdkTexture *gdk_texture_new_from_stream_with_fg (GInputStream *stream,
gboolean *only_fg,
GdkTexture *gdk_texture_new_from_stream (GInputStream *stream,
GCancellable *cancellable,
GError **error);
GdkTexture *gdk_texture_new_from_stream_at_scale (GInputStream *stream,
int width,
int height,
gboolean aspect,
gboolean *only_fg,
GCancellable *cancellable,
GError **error);
GdkTexture *gdk_texture_new_from_resource_at_scale (const char *path,
int width,
int height,
gboolean aspect,
gboolean *only_fg,
GError **error);
GdkTexture *gdk_texture_new_from_filename_symbolic (const char *path,
GdkTexture *gdk_texture_new_from_path_symbolic (const char *path,
int width,
int height,
double scale,
gboolean *only_fg,
GError **error);
GdkTexture *gdk_texture_new_from_file_symbolic (GFile *file,
int width,
int height,
double scale,
gboolean *only_fg,
GError **error);
GdkTexture *gdk_texture_new_from_resource_symbolic (const char *path,
int width,
int height,
double scale,
gboolean *only_fg,
GError **error);
GdkTexture *gtk_load_symbolic_texture_from_file (GFile *file);
GdkTexture *gtk_load_symbolic_texture_from_resource (const char *path);
GdkTexture *gtk_load_symbolic_texture_from_resource (const char *data);
GdkPaintable *gdk_paintable_new_from_filename_scaled (const char *filename,
double scale);
GdkPaintable *gdk_paintable_new_from_path_scaled (const char *path,
int scale_factor);
GdkPaintable *gdk_paintable_new_from_resource_scaled (const char *path,
double scale);
int scale_factor);
GdkPaintable *gdk_paintable_new_from_file_scaled (GFile *file,
double scale);
int scale_factor);
G_END_DECLS
-1
View File
@@ -163,7 +163,6 @@
#include <gtk/gtkgridview.h>
#include <gtk/gtkheaderbar.h>
#include <gtk/gtkicontheme.h>
#include <gtk/gtkiconprovider.h>
#include <gtk/deprecated/gtkiconview.h>
#include <gtk/gtkimage.h>
#include <gtk/gtkimcontext.h>
+5 -11
View File
@@ -808,11 +808,6 @@ static const GtkAccessibleCollect collect_props[] = {
.ctype = GTK_ACCESSIBLE_COLLECT_STRING,
.name = "valuetext"
},
[GTK_ACCESSIBLE_PROPERTY_HELP_TEXT] = {
.value = GTK_ACCESSIBLE_PROPERTY_HELP_TEXT,
.ctype = GTK_ACCESSIBLE_COLLECT_STRING,
.name = "helptext"
},
};
/* § 6.6.4 Relationship Attributes */
@@ -1667,7 +1662,7 @@ gtk_accessible_value_get_default_for_property (GtkAccessibleProperty property)
{
const GtkAccessibleCollect *cstate = &collect_props[property];
g_return_val_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_HELP_TEXT, NULL);
g_return_val_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT, NULL);
switch (cstate->value)
{
@@ -1697,7 +1692,6 @@ gtk_accessible_value_get_default_for_property (GtkAccessibleProperty property)
case GTK_ACCESSIBLE_PROPERTY_PLACEHOLDER:
case GTK_ACCESSIBLE_PROPERTY_ROLE_DESCRIPTION:
case GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT:
case GTK_ACCESSIBLE_PROPERTY_HELP_TEXT:
return gtk_undefined_accessible_value_new ();
/* Token properties */
@@ -1738,7 +1732,7 @@ gtk_accessible_value_collect_for_property (GtkAccessibleProperty property,
{
const GtkAccessibleCollect *cstate = &collect_props[property];
g_return_val_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_HELP_TEXT, NULL);
g_return_val_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT, NULL);
return gtk_accessible_value_collect_valist (cstate, error, args);
}
@@ -1766,7 +1760,7 @@ gtk_accessible_value_collect_for_property_value (GtkAccessibleProperty propert
{
const GtkAccessibleCollect *cstate = &collect_props[property];
g_return_val_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_HELP_TEXT, NULL);
g_return_val_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT, NULL);
return gtk_accessible_value_collect_value (cstate, value, error);
}
@@ -1779,7 +1773,7 @@ gtk_accessible_value_parse_for_property (GtkAccessibleProperty property,
{
const GtkAccessibleCollect *cstate = &collect_props[property];
g_return_val_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_HELP_TEXT, NULL);
g_return_val_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT, NULL);
return gtk_accessible_value_parse (cstate, str, len, error);
}
@@ -1800,7 +1794,7 @@ gtk_accessible_property_init_value (GtkAccessibleProperty property,
{
const GtkAccessibleCollect *cstate = &collect_props[property];
g_return_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_HELP_TEXT);
g_return_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT);
gtk_accessible_attribute_init_value (cstate, value);
}
+4 -6
View File
@@ -328,7 +328,6 @@ static const char *property_attrs[] = {
[GTK_ACCESSIBLE_PROPERTY_VALUE_MIN] = "valuemin",
[GTK_ACCESSIBLE_PROPERTY_VALUE_NOW] = "valuenow",
[GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT] = "valuetext",
[GTK_ACCESSIBLE_PROPERTY_HELP_TEXT] = "helptext",
};
/*< private >
@@ -343,7 +342,7 @@ const char *
gtk_accessible_property_get_attribute_name (GtkAccessibleProperty property)
{
g_return_val_if_fail (property >= GTK_ACCESSIBLE_PROPERTY_AUTOCOMPLETE &&
property <= GTK_ACCESSIBLE_PROPERTY_HELP_TEXT,
property <= GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT,
"<none>");
return property_attrs[property];
@@ -1056,7 +1055,6 @@ gtk_at_context_get_accessible_relation (GtkATContext *self,
static guint8 naming[] = {
[GTK_ACCESSIBLE_ROLE_ALERT] = NAME_FROM_AUTHOR,
[GTK_ACCESSIBLE_ROLE_ALERT_DIALOG] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_APPLICATION] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_ARTICLE] = NAME_FROM_AUTHOR,
[GTK_ACCESSIBLE_ROLE_BANNER] = GTK_ACCESSIBLE_NAME_PROHIBITED,
[GTK_ACCESSIBLE_ROLE_BLOCK_QUOTE] = NAME_FROM_AUTHOR,
@@ -1101,7 +1099,6 @@ static guint8 naming[] = {
[GTK_ACCESSIBLE_ROLE_NONE] = GTK_ACCESSIBLE_NAME_PROHIBITED,
[GTK_ACCESSIBLE_ROLE_NOTE] = NAME_FROM_AUTHOR,
[GTK_ACCESSIBLE_ROLE_OPTION] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_PARAGRAPH] = GTK_ACCESSIBLE_NAME_PROHIBITED,
[GTK_ACCESSIBLE_ROLE_PRESENTATION] = GTK_ACCESSIBLE_NAME_PROHIBITED,
[GTK_ACCESSIBLE_ROLE_PROGRESS_BAR] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_RADIO] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
@@ -1127,11 +1124,9 @@ static guint8 naming[] = {
[GTK_ACCESSIBLE_ROLE_TABLE] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_TAB_LIST] = NAME_FROM_AUTHOR,
[GTK_ACCESSIBLE_ROLE_TAB_PANEL] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_TERMINAL] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_TEXT_BOX] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_TIME] = GTK_ACCESSIBLE_NAME_PROHIBITED,
[GTK_ACCESSIBLE_ROLE_TIMER] = NAME_FROM_AUTHOR,
[GTK_ACCESSIBLE_ROLE_TOGGLE_BUTTON] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_TOOLBAR] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_RECOMMENDED,
[GTK_ACCESSIBLE_ROLE_TOOLTIP] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT,
[GTK_ACCESSIBLE_ROLE_TREE] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
@@ -1139,6 +1134,9 @@ static guint8 naming[] = {
[GTK_ACCESSIBLE_ROLE_TREE_ITEM] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_WIDGET] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT,
[GTK_ACCESSIBLE_ROLE_WINDOW] = NAME_FROM_AUTHOR,
[GTK_ACCESSIBLE_ROLE_TOGGLE_BUTTON] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_APPLICATION] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
[GTK_ACCESSIBLE_ROLE_PARAGRAPH] = GTK_ACCESSIBLE_NAME_PROHIBITED,
};
/* < private >
+1 -2
View File
@@ -47,8 +47,7 @@ typedef enum {
GTK_ACCESSIBLE_PROPERTY_CHANGE_VALUE_MAX = 1 << GTK_ACCESSIBLE_PROPERTY_VALUE_MAX,
GTK_ACCESSIBLE_PROPERTY_CHANGE_VALUE_MIN = 1 << GTK_ACCESSIBLE_PROPERTY_VALUE_MIN,
GTK_ACCESSIBLE_PROPERTY_CHANGE_VALUE_NOW = 1 << GTK_ACCESSIBLE_PROPERTY_VALUE_NOW,
GTK_ACCESSIBLE_PROPERTY_CHANGE_VALUE_TEXT = 1 << GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT,
GTK_ACCESSIBLE_PROPERTY_CHANGE_HELP_TEXT = 1 << GTK_ACCESSIBLE_PROPERTY_HELP_TEXT,
GTK_ACCESSIBLE_PROPERTY_CHANGE_VALUE_TEXT = 1 << GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT
} GtkAccessiblePropertyChange;
typedef enum {
+3 -7
View File
@@ -32,12 +32,8 @@
* `GtkBuilderListItemFactory` is a `GtkListItemFactory` that creates
* widgets by instantiating `GtkBuilder` UI templates.
*
* The templates must extend the class that the parent widget expects.
* For example, a factory provided to [property@Gtk.ListView:factory] must have
* a template that extends [class@Gtk.ListItem].
*
* Templates typically use `GtkExpression`s to obtain data from the items
* in the model.
* The templates must be extending `GtkListItem`, and typically use
* `GtkExpression`s to obtain data from the items in the model.
*
* Example:
* ```xml
@@ -207,7 +203,7 @@ gtk_builder_list_item_factory_set_property (GObject *object,
case PROP_RESOURCE:
{
GError *error = NULL;
GBytes *bytes;
GBytes *bytes;
const char *resource;
resource = g_value_get_string (value);
-4
View File
@@ -861,8 +861,6 @@ gtk_column_view_class_init (GtkColumnViewClass *klass)
*
* The factory used for configuring rows.
*
* The factory must be for configuring [class@Gtk.ColumnViewRow] objects.
*
* Since: 4.12
*/
properties[PROP_ROW_FACTORY] =
@@ -928,8 +926,6 @@ gtk_column_view_class_init (GtkColumnViewClass *klass)
*
* Factory for creating header widgets.
*
* The factory must be for configuring [class@Gtk.ListHeader] objects.
*
* Since: 4.12
*/
properties[PROP_HEADER_FACTORY] =
+1 -3
View File
@@ -255,8 +255,6 @@ gtk_column_view_column_class_init (GtkColumnViewColumnClass *klass)
* GtkColumnViewColumn:factory: (attributes org.gtk.Property.get=gtk_column_view_column_get_factory org.gtk.Property.set=gtk_column_view_column_set_factory)
*
* Factory for populating list items.
*
* The factory must be for configuring [class@Gtk.ColumnViewCell] objects.
*/
properties[PROP_FACTORY] =
g_param_spec_object ("factory", NULL, NULL,
@@ -763,7 +761,7 @@ gtk_column_view_column_remove_from_sorter (GtkColumnViewColumn *self)
{
if (self->view == NULL)
return;
gtk_column_view_sorter_remove_column (GTK_COLUMN_VIEW_SORTER (gtk_column_view_get_sorter (self->view)), self);
}
+1 -1
View File
@@ -156,7 +156,7 @@ gtk_css_image_icon_theme_compute (GtkCssImage *image,
copy->icon_theme = gtk_icon_theme_get_for_display (display);
copy->serial = gtk_icon_theme_get_serial (copy->icon_theme);
copy->scale = gtk_style_provider_get_scale (provider);
gtk_css_style_lookup_symbolic_colors (style, copy->colors);
gtk_icon_theme_lookup_symbolic_colors (style, copy->colors);
return GTK_CSS_IMAGE (copy);
}
+2 -3
View File
@@ -97,7 +97,6 @@ gtk_css_image_recolor_load_texture (GtkCssImageRecolor *recolor,
GError **error)
{
char *uri;
gboolean only_fg;
if (recolor->texture)
return;
@@ -111,7 +110,7 @@ gtk_css_image_recolor_load_texture (GtkCssImageRecolor *recolor,
if (g_str_has_suffix (uri, ".symbolic.png"))
recolor->texture = gtk_load_symbolic_texture_from_resource (resource_path);
else
recolor->texture = gdk_texture_new_from_resource_symbolic (resource_path, 0, 0, 1.0, &only_fg, NULL);
recolor->texture = gdk_texture_new_from_resource_symbolic (resource_path, 0, 0, 1.0, NULL);
g_free (resource_path);
}
@@ -120,7 +119,7 @@ gtk_css_image_recolor_load_texture (GtkCssImageRecolor *recolor,
if (g_str_has_suffix (uri, ".symbolic.png"))
recolor->texture = gtk_load_symbolic_texture_from_file (recolor->file);
else
recolor->texture = gdk_texture_new_from_file_symbolic (recolor->file, 0, 0, 1.0, &only_fg, NULL);
recolor->texture = gdk_texture_new_from_file_symbolic (recolor->file, 0, 0, 1.0, NULL);
}
g_free (uri);
-28
View File
@@ -29,7 +29,6 @@
#include "gtkcssinitialvalueprivate.h"
#include "gtkcssnumbervalueprivate.h"
#include "gtkcsscolorvalueprivate.h"
#include "gtkcsspalettevalueprivate.h"
#include "gtkcssshorthandpropertyprivate.h"
#include "gtkcssstringvalueprivate.h"
#include "gtkcssfontvariationsvalueprivate.h"
@@ -751,33 +750,6 @@ gtk_css_style_get_pango_font (GtkCssStyle *style)
return description;
}
void
gtk_css_style_lookup_symbolic_colors (GtkCssStyle *style,
GdkRGBA color_out[4])
{
GtkCssValue *palette, *color;
const char *names[4] = {
[GTK_SYMBOLIC_COLOR_ERROR] = "error",
[GTK_SYMBOLIC_COLOR_WARNING] = "warning",
[GTK_SYMBOLIC_COLOR_SUCCESS] = "success"
};
color = style->core->color;
palette = style->core->icon_palette;
color_out[GTK_SYMBOLIC_COLOR_FOREGROUND] = *gtk_css_color_value_get_rgba (color);
for (gsize i = 1; i < 4; i++)
{
const GdkRGBA *lookup;
lookup = gtk_css_palette_value_get_color (palette, names[i]);
if (lookup)
color_out[i] = *lookup;
else
color_out[i] = color_out[GTK_SYMBOLIC_COLOR_FOREGROUND];
}
}
/* Refcounted value structs */
static const int values_size[] = {
-3
View File
@@ -268,9 +268,6 @@ char * gtk_css_style_compute_font_features (GtkCssStyle
PangoAttrList * gtk_css_style_get_pango_attributes (GtkCssStyle *style);
PangoFontDescription * gtk_css_style_get_pango_font (GtkCssStyle *style);
void gtk_css_style_lookup_symbolic_colors (GtkCssStyle *style,
GdkRGBA color_out[4]);
GtkCssValues *gtk_css_values_new (GtkCssValuesType type);
GtkCssValues *gtk_css_values_ref (GtkCssValues *values);
void gtk_css_values_unref (GtkCssValues *values);
+6 -6
View File
@@ -258,9 +258,9 @@ gtk_drop_target_async_handle_event (GtkEventController *controller,
static void
gtk_drop_target_async_handle_crossing (GtkEventController *controller,
const GtkCrossingData *crossing,
double x,
double y)
const GtkCrossingData *crossing,
double x,
double y)
{
GtkDropTargetAsync *self = GTK_DROP_TARGET_ASYNC (controller);
GtkWidget *widget = gtk_event_controller_get_widget (controller);
@@ -340,9 +340,9 @@ gtk_drop_target_async_set_property (GObject *object,
static void
gtk_drop_target_async_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GtkDropTargetAsync *self = GTK_DROP_TARGET_ASYNC (object);
+1 -11
View File
@@ -1632,15 +1632,6 @@ typedef enum {
*
* The possible accessible properties of a [iface@Accessible].
*/
/**
* GTK_ACCESSIBLE_PROPERTY_HELP_TEXT:
*
* Defines a string value that provides a description of non-standard keyboard
* interactions of the current element. Value type: string
*
* Since: 4.16
*/
typedef enum {
GTK_ACCESSIBLE_PROPERTY_AUTOCOMPLETE,
GTK_ACCESSIBLE_PROPERTY_DESCRIPTION,
@@ -1660,8 +1651,7 @@ typedef enum {
GTK_ACCESSIBLE_PROPERTY_VALUE_MAX,
GTK_ACCESSIBLE_PROPERTY_VALUE_MIN,
GTK_ACCESSIBLE_PROPERTY_VALUE_NOW,
GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT,
GTK_ACCESSIBLE_PROPERTY_HELP_TEXT
GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT
} GtkAccessibleProperty;
/**
-2
View File
@@ -1109,8 +1109,6 @@ gtk_grid_view_class_init (GtkGridViewClass *klass)
* GtkGridView:factory: (attributes org.gtk.Property.get=gtk_grid_view_get_factory org.gtk.Property.set=gtk_grid_view_set_factory)
*
* Factory for populating list items.
*
* The factory must be for configuring [class@Gtk.ListItem] objects.
*/
properties[PROP_FACTORY] =
g_param_spec_object ("factory", NULL, NULL,
+12 -19
View File
@@ -34,7 +34,6 @@
#include "gtkwidgetprivate.h"
#include "gdk/gdkprofilerprivate.h"
#include "gtksymbolicpaintable.h"
#include "gtkiconprovider.h"
struct _GtkIconHelper
{
@@ -112,25 +111,13 @@ ensure_paintable_for_gicon (GtkIconHelper *self,
return GDK_PAINTABLE (icon);
}
static GdkPaintable *
ensure_paintable_for_icon_name (GtkIconHelper *self,
const char *name)
{
int size;
float scale;
size = gtk_icon_helper_get_size (self);
scale = gtk_widget_get_scale_factor (self->owner);
return gtk_lookup_icon (gtk_widget_get_display (self->owner), name, size, scale);
}
static GdkPaintable *
gtk_icon_helper_load_paintable (GtkIconHelper *self,
gboolean preload,
gboolean *out_symbolic)
{
GdkPaintable *paintable;
GIcon *gicon;
gboolean symbolic;
switch (gtk_image_definition_get_storage_type (self->def))
@@ -141,12 +128,18 @@ gtk_icon_helper_load_paintable (GtkIconHelper *self,
break;
case GTK_IMAGE_ICON_NAME:
paintable = ensure_paintable_for_icon_name (self,
gtk_image_definition_get_icon_name (self->def));
if (GTK_IS_ICON_PAINTABLE (paintable))
symbolic = gtk_icon_paintable_is_symbolic (GTK_ICON_PAINTABLE (paintable));
if (self->use_fallback)
gicon = g_themed_icon_new_with_default_fallbacks (gtk_image_definition_get_icon_name (self->def));
else
symbolic = GTK_IS_SYMBOLIC_PAINTABLE (paintable);
gicon = g_themed_icon_new (gtk_image_definition_get_icon_name (self->def));
paintable = ensure_paintable_for_gicon (self,
gtk_css_node_get_style (self->node),
gtk_widget_get_scale_factor (self->owner),
gtk_widget_get_direction (self->owner),
preload,
gicon,
&symbolic);
g_object_unref (gicon);
break;
case GTK_IMAGE_GICON:
-164
View File
@@ -1,164 +0,0 @@
/*
* Copyright © 2024 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen <mclasen@redhat.com>
*/
#include "config.h"
#include "gtkiconprovider.h"
#include "gtkicontheme.h"
#include "gtkenums.h"
#include "gtkwidgetprivate.h"
#include "gtkprivate.h"
G_DEFINE_INTERFACE (GtkIconProvider, gtk_icon_provider, G_TYPE_OBJECT)
static void
gtk_icon_provider_default_init (GtkIconProviderInterface *iface)
{
}
void
gtk_icon_provider_set_for_display (GdkDisplay *display,
GtkIconProvider *provider)
{
g_object_set_data_full (G_OBJECT (display), "--gtk-icon-provider",
g_object_ref (provider), g_object_unref);
gtk_system_setting_changed (display, GTK_SYSTEM_SETTING_ICON_THEME);
}
GtkIconProvider *
gtk_icon_provider_get_for_display (GdkDisplay *display)
{
GtkIconProvider *provider;
provider = g_object_get_data (G_OBJECT (display), "--gtk-icon-provider");
if (provider)
return provider;
return GTK_ICON_PROVIDER (gtk_icon_theme_get_for_display (display));
}
static GdkPaintable *gtk_lookup_builtin_icon (GdkDisplay *display,
const char *name,
int size,
float scale);
GdkPaintable *
gtk_lookup_icon (GdkDisplay *display,
const char *name,
int size,
float scale)
{
GtkIconProvider *provider;
GdkPaintable *icon;
provider = gtk_icon_provider_get_for_display (display);
icon = GTK_ICON_PROVIDER_GET_IFACE (provider)->lookup_icon (provider, name, size, scale);
if (!icon)
{
GTK_DISPLAY_DEBUG (display, ICONTHEME,
"%s: Looking up icon %s size %d@%f: not found",
G_OBJECT_TYPE_NAME (provider), name, size, scale);
icon = gtk_lookup_builtin_icon (display, name, size, scale);
}
return icon;
}
static GdkPaintable *
gtk_lookup_builtin_icon (GdkDisplay *display,
const char *name,
int size,
float scale)
{
int sizes[] = { 16, 32, 64 };
char pixel_size[24] = { 0, };
const char *contexts[] = {
"actions",
"categories",
"devices",
"emblems",
"emotes",
"mimetypes",
"places",
"status",
};
const char *extension;
GdkPaintable *icon = NULL;
for (int i = 0; i < G_N_ELEMENTS (sizes); i++)
{
if (sizes[i] >= size * scale)
{
size = sizes[i];
g_snprintf (pixel_size, sizeof (pixel_size), "%dx%d", size, size);
break;
}
}
if (pixel_size[0] == '\0')
{
g_snprintf (pixel_size, sizeof (pixel_size), "64x64");
size = 64;
}
if (g_str_has_suffix (name, "-symbolic"))
extension = ".symbolic.png";
else
extension = ".png";
for (int i = 0; i < G_N_ELEMENTS (contexts); i++)
{
char *uri;
GFile *file;
uri = g_strconcat ("resource:///org/gtk/libgtk/icons/", pixel_size, "/", contexts[i], "/", name, extension, NULL);
file = g_file_new_for_uri (uri);
if (g_file_query_exists (file, NULL))
{
GTK_DISPLAY_DEBUG (display, ICONTHEME,
"Looking up builtin icon %s size %d@%f: %s",
name, size, scale, uri);
icon = GDK_PAINTABLE (gtk_icon_paintable_new_for_file (file, size, 1));
}
g_object_unref (file);
g_free (uri);
if (icon)
break;
}
if (!icon)
{
GTK_DISPLAY_DEBUG (display, ICONTHEME,
"Looking up builtin icon %s size %d@%f: not found",
name, size, scale);
icon = GDK_PAINTABLE (gdk_texture_new_from_resource ("/org/gtk/libgtk/icons/16x16/status/image-missing.png"));
}
return icon;
}
-62
View File
@@ -1,62 +0,0 @@
/*
* Copyright © 2024 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors: Matthias Clasen <mclasen@redhat.com>
*/
#pragma once
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
#error "Only <gtk/gtk.h> can be included directly."
#endif
#include <gtk/gtktypes.h>
#include <gdk/gdkpaintable.h>
#include <gdk/gdkdisplay.h>
G_BEGIN_DECLS
#define GTK_TYPE_ICON_PROVIDER (gtk_icon_provider_get_type ())
GDK_AVAILABLE_IN_4_16
G_DECLARE_INTERFACE (GtkIconProvider, gtk_icon_provider, GTK, ICON_PROVIDER, GObject)
struct _GtkIconProviderInterface
{
GTypeInterface g_iface;
GdkPaintable * (* lookup_icon) (GtkIconProvider *provider,
const char *icon_name,
int size,
float scale);
};
GDK_AVAILABLE_IN_4_16
void gtk_icon_provider_set_for_display (GdkDisplay *display,
GtkIconProvider *provider);
GDK_AVAILABLE_IN_4_16
GtkIconProvider * gtk_icon_provider_get_for_display (GdkDisplay *display);
GDK_AVAILABLE_IN_4_16
GdkPaintable * gtk_lookup_icon (GdkDisplay *display,
const char *icon_name,
int size,
float scale);
G_END_DECLS
+65 -81
View File
@@ -54,7 +54,6 @@
#include "gdktextureutilsprivate.h"
#include "gdk/gdktextureprivate.h"
#include "gdk/gdkprofilerprivate.h"
#include "gtkiconprovider.h"
#define GDK_ARRAY_ELEMENT_TYPE char *
#define GDK_ARRAY_NULL_TERMINATED 1
@@ -415,7 +414,6 @@ struct _GtkIconPaintable
guint is_svg : 1;
guint is_resource : 1;
guint is_symbolic : 1;
guint only_fg : 1;
/* Cached information if we go ahead and try to load the icon.
*
@@ -813,25 +811,7 @@ icon_cache_clear (GtkIconTheme *theme)
/****************** End of icon cache ***********************/
static GdkPaintable *
gtk_icon_theme_lookup_icon_as_provider (GtkIconProvider *provider,
const char *name,
int size,
float scale)
{
GtkIconTheme *self = GTK_ICON_THEME (provider);
return GDK_PAINTABLE (gtk_icon_theme_lookup_icon (self, name, NULL, size, (int) ceilf (scale), GTK_TEXT_DIR_LTR, 0));
}
static void
gtk_icon_provider_init (GtkIconProviderInterface *iface)
{
iface->lookup_icon = gtk_icon_theme_lookup_icon_as_provider;
}
G_DEFINE_TYPE_WITH_CODE (GtkIconTheme, gtk_icon_theme, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GTK_TYPE_ICON_PROVIDER, gtk_icon_provider_init))
G_DEFINE_TYPE (GtkIconTheme, gtk_icon_theme, G_TYPE_OBJECT)
/**
* gtk_icon_theme_new:
@@ -2453,7 +2433,7 @@ load_icon_thread (GTask *task,
* @self: a `GtkIconTheme`
* @icon_name: the name of the icon to lookup
* @fallbacks: (nullable) (array zero-terminated=1):
* @size: desired icon size, in application pixels
* @size: desired icon size.
* @scale: the window scale this will be displayed on
* @direction: text direction the icon will be displayed in
* @flags: flags modifying the behavior of the icon lookup
@@ -2552,6 +2532,34 @@ gtk_icon_theme_error_quark (void)
return g_quark_from_static_string ("gtk-icon-theme-error-quark");
}
void
gtk_icon_theme_lookup_symbolic_colors (GtkCssStyle *style,
GdkRGBA color_out[4])
{
GtkCssValue *palette, *color;
const char *names[4] = {
[GTK_SYMBOLIC_COLOR_ERROR] = "error",
[GTK_SYMBOLIC_COLOR_WARNING] = "warning",
[GTK_SYMBOLIC_COLOR_SUCCESS] = "success"
};
const GdkRGBA *lookup;
gsize i;
color = style->core->color;
palette = style->core->icon_palette;
color_out[GTK_SYMBOLIC_COLOR_FOREGROUND] = *gtk_css_color_value_get_rgba (color);
for (i = 1; i < 4; i++)
{
lookup = gtk_css_palette_value_get_color (palette, names[i]);
if (lookup)
color_out[i] = *lookup;
else
color_out[i] = color_out[GTK_SYMBOLIC_COLOR_FOREGROUND];
}
}
/**
* gtk_icon_theme_has_icon:
* @self: a `GtkIconTheme`
@@ -3704,7 +3712,6 @@ icon_ensure_texture__locked (GtkIconPaintable *icon,
gint64 before;
int pixel_size;
GError *load_error = NULL;
gboolean only_fg = FALSE;
icon_cache_mark_used_if_cached (icon);
@@ -3732,32 +3739,28 @@ icon_ensure_texture__locked (GtkIconPaintable *icon,
{
if (icon->is_svg)
{
if (icon->is_symbolic)
if (gtk_icon_paintable_is_symbolic (icon))
icon->texture = gdk_texture_new_from_resource_symbolic (icon->filename,
pixel_size, pixel_size,
icon->desired_scale,
&only_fg,
&load_error);
else
icon->texture = gdk_texture_new_from_resource_at_scale (icon->filename,
pixel_size, pixel_size,
TRUE,
&only_fg,
&load_error);
TRUE, &load_error);
}
else
icon->texture = gdk_texture_new_from_resource_with_fg (icon->filename, &only_fg);
icon->texture = gdk_texture_new_from_resource (icon->filename);
}
else if (icon->filename)
{
if (icon->is_svg)
{
if (icon->is_symbolic)
icon->texture = gdk_texture_new_from_filename_symbolic (icon->filename,
pixel_size, pixel_size,
icon->desired_scale,
&only_fg,
&load_error);
if (gtk_icon_paintable_is_symbolic (icon))
icon->texture = gdk_texture_new_from_path_symbolic (icon->filename,
pixel_size, pixel_size,
icon->desired_scale,
&load_error);
else
{
GFile *file = g_file_new_for_path (icon->filename);
@@ -3767,9 +3770,7 @@ icon_ensure_texture__locked (GtkIconPaintable *icon,
{
icon->texture = gdk_texture_new_from_stream_at_scale (stream,
pixel_size, pixel_size,
TRUE,
&only_fg,
NULL,
TRUE, NULL,
&load_error);
g_object_unref (stream);
}
@@ -3779,7 +3780,7 @@ icon_ensure_texture__locked (GtkIconPaintable *icon,
}
else
{
icon->texture = gdk_texture_new_from_filename_with_fg (icon->filename, &only_fg, &load_error);
icon->texture = gdk_texture_new_from_filename (icon->filename, &load_error);
}
}
else
@@ -3797,19 +3798,15 @@ icon_ensure_texture__locked (GtkIconPaintable *icon,
if (icon->is_svg)
icon->texture = gdk_texture_new_from_stream_at_scale (stream,
pixel_size, pixel_size,
TRUE,
&only_fg,
NULL,
TRUE, NULL,
&load_error);
else
icon->texture = gdk_texture_new_from_stream_with_fg (stream, &only_fg, NULL, &load_error);
icon->texture = gdk_texture_new_from_stream (stream, NULL, &load_error);
g_object_unref (stream);
}
}
icon->only_fg = only_fg;
if (!icon->texture)
{
g_warning ("Failed to load icon %s: %s", icon->filename, load_error ? load_error->message : "");
@@ -3817,7 +3814,6 @@ icon_ensure_texture__locked (GtkIconPaintable *icon,
icon->texture = gdk_texture_new_from_resource (IMAGE_MISSING_RESOURCE_PATH);
icon->icon_name = g_strdup ("image-missing");
icon->is_symbolic = FALSE;
icon->only_fg = FALSE;
}
if (GDK_PROFILER_IS_RUNNING)
@@ -3900,9 +3896,22 @@ gtk_icon_paintable_snapshot_symbolic (GtkSymbolicPaintable *paintable,
int texture_width, texture_height;
double render_width;
double render_height;
graphene_rect_t render_rect;
gboolean symbolic;
texture = gtk_icon_paintable_ensure_texture (icon);
symbolic = gtk_icon_paintable_is_symbolic (icon);
if (symbolic)
{
graphene_matrix_t matrix;
graphene_vec4_t offset;
init_color_matrix (&matrix, &offset,
&colors[0], &colors[3],
&colors[2], &colors[1]);
gtk_snapshot_push_color_matrix (snapshot, &matrix, &offset);
}
texture_width = gdk_texture_get_width (texture);
texture_height = gdk_texture_get_height (texture);
@@ -3919,39 +3928,14 @@ gtk_icon_paintable_snapshot_symbolic (GtkSymbolicPaintable *paintable,
render_height = height;
}
graphene_rect_init (&render_rect,
(width - render_width) / 2,
(height - render_height) / 2,
render_width,
render_height);
gtk_snapshot_append_texture (snapshot, texture,
&GRAPHENE_RECT_INIT ((width - render_width) / 2,
(height - render_height) / 2,
render_width,
render_height));
if (icon->is_symbolic && icon->only_fg)
{
g_debug ("snapshot symbolic icon using mask");
gtk_snapshot_push_mask (snapshot, GSK_MASK_MODE_ALPHA);
gtk_snapshot_append_texture (snapshot, texture, &render_rect);
gtk_snapshot_pop (snapshot);
gtk_snapshot_append_color (snapshot, &colors[0], &render_rect);
gtk_snapshot_pop (snapshot);
}
else if (icon->is_symbolic)
{
graphene_matrix_t matrix;
graphene_vec4_t offset;
g_debug ("snapshot symbolic icon using color-matrix");
init_color_matrix (&matrix, &offset,
&colors[0], &colors[3],
&colors[2], &colors[1]);
gtk_snapshot_push_color_matrix (snapshot, &matrix, &offset);
gtk_snapshot_append_texture (snapshot, texture, &render_rect);
gtk_snapshot_pop (snapshot);
}
else
{
gtk_snapshot_append_texture (snapshot, texture, &render_rect);
}
if (symbolic)
gtk_snapshot_pop (snapshot);
}
static GdkPaintableFlags
@@ -3994,7 +3978,7 @@ icon_symbolic_paintable_init (GtkSymbolicPaintableInterface *iface)
/**
* gtk_icon_paintable_new_for_file:
* @file: a `GFile`
* @size: desired icon size, in application pixels
* @size: desired icon size
* @scale: the desired scale
*
* Creates a `GtkIconPaintable` for a file with a given size and scale.
@@ -4038,7 +4022,7 @@ gtk_icon_paintable_new_for_file (GFile *file,
* gtk_icon_theme_lookup_by_gicon:
* @self: a `GtkIconTheme`
* @icon: the `GIcon` to look up
* @size: desired icon size, in application pixels
* @size: desired icon size
* @scale: the desired scale
* @direction: text direction the icon will be displayed in
* @flags: flags modifying the behavior of the icon lookup
+3
View File
@@ -26,5 +26,8 @@ const char *gtk_string_set_add (GtkStringSet *set,
#define IMAGE_MISSING_RESOURCE_PATH "/org/gtk/libgtk/icons/16x16/status/image-missing.png"
void gtk_icon_theme_lookup_symbolic_colors (GtkCssStyle *style,
GdkRGBA color_out[4]);
int gtk_icon_theme_get_serial (GtkIconTheme *self);
+1 -1
View File
@@ -598,7 +598,7 @@ gtk_image_set_from_file (GtkImage *image,
}
scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (image));
paintable = gdk_paintable_new_from_filename_scaled (filename, scale_factor);
paintable = gdk_paintable_new_from_path_scaled (filename, scale_factor);
if (paintable == NULL)
{
+1 -1
View File
@@ -117,7 +117,7 @@ static inline void
istring_prepend (IString *str,
IString *other)
{
if G_LIKELY (str->n_bytes + other->n_bytes <= (sizeof str->u.buf - 1))
if G_LIKELY (str->n_bytes + other->n_bytes < sizeof str->u.buf - 1)
{
memmove (str->u.buf + other->n_bytes, str->u.buf, str->n_bytes);
memcpy (str->u.buf, other->u.buf, other->n_bytes);
+2 -24
View File
@@ -2113,28 +2113,6 @@ gtk_label_unroot (GtkWidget *widget)
GTK_WIDGET_CLASS (gtk_label_parent_class)->unroot (widget);
}
static void
launch_done (GObject *source,
GAsyncResult *result,
gpointer data)
{
GError *error = NULL;
gboolean success;
if (GTK_IS_FILE_LAUNCHER (source))
success = gtk_file_launcher_launch_finish (GTK_FILE_LAUNCHER (source), result, &error);
else if (GTK_IS_URI_LAUNCHER (source))
success = gtk_uri_launcher_launch_finish (GTK_URI_LAUNCHER (source), result, &error);
else
g_assert_not_reached ();
if (!success)
{
g_warning ("Failed to launch handler: %s", error->message);
g_error_free (error);
}
}
static gboolean
gtk_label_activate_link (GtkLabel *self,
const char *uri)
@@ -2154,7 +2132,7 @@ gtk_label_activate_link (GtkLabel *self,
file = g_file_new_for_uri (uri);
launcher = gtk_file_launcher_new (file);
gtk_file_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, launch_done, NULL);
gtk_file_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, NULL, NULL);
g_object_unref (launcher);
g_object_unref (file);
}
@@ -2163,7 +2141,7 @@ gtk_label_activate_link (GtkLabel *self,
GtkUriLauncher *launcher;
launcher = gtk_uri_launcher_new (uri);
gtk_uri_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, launch_done, NULL);
gtk_uri_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, NULL, NULL);
g_object_unref (launcher);
}
+2 -24
View File
@@ -480,28 +480,6 @@ gtk_link_button_pressed_cb (GtkGestureClick *gesture,
}
}
static void
launch_done (GObject *source,
GAsyncResult *result,
gpointer data)
{
GError *error = NULL;
gboolean success;
if (GTK_IS_FILE_LAUNCHER (source))
success = gtk_file_launcher_launch_finish (GTK_FILE_LAUNCHER (source), result, &error);
else if (GTK_IS_URI_LAUNCHER (source))
success = gtk_uri_launcher_launch_finish (GTK_URI_LAUNCHER (source), result, &error);
else
g_assert_not_reached ();
if (!success)
{
g_warning ("Failed to launch handler: %s", error->message);
g_error_free (error);
}
}
static gboolean
gtk_link_button_activate_link (GtkLinkButton *link_button)
{
@@ -518,7 +496,7 @@ gtk_link_button_activate_link (GtkLinkButton *link_button)
launcher = gtk_file_launcher_new (file);
gtk_file_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, launch_done, NULL);
gtk_file_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, NULL, NULL);
g_object_unref (launcher);
g_object_unref (file);
@@ -527,7 +505,7 @@ gtk_link_button_activate_link (GtkLinkButton *link_button)
{
GtkUriLauncher *launcher = gtk_uri_launcher_new (link_button->uri);
gtk_uri_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, launch_done, NULL);
gtk_uri_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, NULL, NULL);
g_object_unref (launcher);
}
+13
View File
@@ -123,6 +123,14 @@ gtk_list_item_widget_setup_object (GtkListFactoryWidget *fw,
gtk_list_factory_widget_set_selectable (fw, list_item->selectable);
gtk_widget_set_focusable (GTK_WIDGET (self), list_item->focusable);
if (list_item->selectable)
gtk_accessible_update_state (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_STATE_SELECTED, FALSE,
-1);
else
gtk_accessible_reset_state (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_STATE_SELECTED);
gtk_accessible_update_property (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_PROPERTY_LABEL, list_item->accessible_label,
GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, list_item->accessible_description,
@@ -176,6 +184,11 @@ gtk_list_item_widget_update_object (GtkListFactoryWidget *fw,
/* Track notify manually instead of freeze/thaw_notify for performance reasons. */
gboolean notify_item = FALSE, notify_position = FALSE, notify_selected = FALSE;
if (list_item->selectable)
gtk_accessible_update_state (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_STATE_SELECTED, selected,
-1);
/* FIXME: It's kinda evil to notify external objects from here... */
notify_item = gtk_list_item_base_get_item (base) != item;
notify_position = gtk_list_item_base_get_position (base) != position;
+1 -5
View File
@@ -881,8 +881,6 @@ gtk_list_view_class_init (GtkListViewClass *klass)
* GtkListView:factory: (attributes org.gtk.Property.get=gtk_list_view_get_factory org.gtk.Property.set=gtk_list_view_set_factory)
*
* Factory for populating list items.
*
* The factory must be for configuring [class@Gtk.ListItem] objects.
*/
properties[PROP_FACTORY] =
g_param_spec_object ("factory", NULL, NULL,
@@ -894,8 +892,6 @@ gtk_list_view_class_init (GtkListViewClass *klass)
*
* Factory for creating header widgets.
*
* The factory must be for configuring [class@Gtk.ListHeader] objects.
*
* Since: 4.12
*/
properties[PROP_HEADER_FACTORY] =
@@ -1359,7 +1355,7 @@ gtk_list_view_get_tab_behavior (GtkListView *self)
* @pos: position of the item
* @flags: actions to perform
* @scroll: (nullable) (transfer full): details of how to perform
* the scroll operation or %NULL to scroll into view
* the scroll operation or %NULL to scroll into view
*
* Scrolls to the item at the given position and performs the actions
* specified in @flags.
+1 -2
View File
@@ -21,7 +21,6 @@
#include "gtkrendericonprivate.h"
#include "gtkcsscolorvalueprivate.h"
#include "gtkcssfiltervalueprivate.h"
#include "gtkcssimagevalueprivate.h"
#include "gtkcssshadowvalueprivate.h"
@@ -117,7 +116,7 @@ gtk_css_style_snapshot_icon_paintable (GtkCssStyle *style,
is_symbolic_paintable = GTK_IS_SYMBOLIC_PAINTABLE (paintable);
if (is_symbolic_paintable)
{
gtk_css_style_lookup_symbolic_colors (style, colors);
gtk_icon_theme_lookup_symbolic_colors (style, colors);
if (gdk_rgba_is_clear (&colors[0]))
goto transparent;
+11 -11
View File
@@ -28,7 +28,7 @@ struct _GtkScaler
GObject parent_instance;
GdkPaintable *paintable;
double scale;
double scale_factor;
};
struct _GtkScalerClass
@@ -46,12 +46,12 @@ gtk_scaler_paintable_snapshot (GdkPaintable *paintable,
gtk_snapshot_save (snapshot);
gtk_snapshot_scale (snapshot, 1.0 / self->scale, 1.0 / self->scale);
gtk_snapshot_scale (snapshot, 1.0 / self->scale_factor, 1.0 / self->scale_factor);
gdk_paintable_snapshot (self->paintable,
snapshot,
width * self->scale,
height * self->scale);
width * self->scale_factor,
height * self->scale_factor);
gtk_snapshot_restore (snapshot);
}
@@ -63,7 +63,7 @@ gtk_scaler_paintable_get_current_image (GdkPaintable *paintable)
GdkPaintable *current_paintable, *current_self;
current_paintable = gdk_paintable_get_current_image (self->paintable);
current_self = gtk_scaler_new (current_paintable, self->scale);
current_self = gtk_scaler_new (current_paintable, self->scale_factor);
g_object_unref (current_paintable);
return current_self;
@@ -82,7 +82,7 @@ gtk_scaler_paintable_get_intrinsic_width (GdkPaintable *paintable)
{
GtkScaler *self = GTK_SCALER (paintable);
return gdk_paintable_get_intrinsic_width (self->paintable) / self->scale;
return gdk_paintable_get_intrinsic_width (self->paintable) / self->scale_factor;
}
static int
@@ -90,7 +90,7 @@ gtk_scaler_paintable_get_intrinsic_height (GdkPaintable *paintable)
{
GtkScaler *self = GTK_SCALER (paintable);
return gdk_paintable_get_intrinsic_height (self->paintable) / self->scale;
return gdk_paintable_get_intrinsic_height (self->paintable) / self->scale_factor;
}
static double gtk_scaler_paintable_get_intrinsic_aspect_ratio (GdkPaintable *paintable)
@@ -147,18 +147,18 @@ gtk_scaler_class_init (GtkScalerClass *klass)
static void
gtk_scaler_init (GtkScaler *self)
{
self->scale = 1.0;
self->scale_factor = 1.0;
}
GdkPaintable *
gtk_scaler_new (GdkPaintable *paintable,
double scale)
double scale_factor)
{
GtkScaler *self;
guint flags;
g_return_val_if_fail (GDK_IS_PAINTABLE (paintable), NULL);
g_return_val_if_fail (scale > 0.0, NULL);
g_return_val_if_fail (scale_factor > 0.0, NULL);
self = g_object_new (GTK_TYPE_SCALER, NULL);
@@ -171,7 +171,7 @@ gtk_scaler_new (GdkPaintable *paintable,
if ((flags & GDK_PAINTABLE_STATIC_SIZE) == 0)
g_signal_connect_swapped (paintable, "invalidate-size", G_CALLBACK (gdk_paintable_invalidate_size), self);
self->scale = scale;
self->scale_factor = scale_factor;
return GDK_PAINTABLE (self);
}
+1 -1
View File
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (GtkScaler, gtk_scaler, GTK, SCALER, GObject)
GdkPaintable * gtk_scaler_new (GdkPaintable *paintable,
double scale);
double scale_factor);
G_END_DECLS
Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 B

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 B

After

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 B

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 B

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 B

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 B

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 B

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 324 B

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 B

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 B

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 B

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 B

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 B

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 B

After

Width:  |  Height:  |  Size: 161 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

After

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

After

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 B

After

Width:  |  Height:  |  Size: 161 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 B

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 B

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

After

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 B

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 B

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 B

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 B

After

Width:  |  Height:  |  Size: 105 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 B

After

Width:  |  Height:  |  Size: 104 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 B

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

After

Width:  |  Height:  |  Size: 186 B

Some files were not shown because too many files have changed in this diff Show More