Compare commits

..

12 Commits

Author SHA1 Message Date
Matthias Clasen 406a32d825 Fix the build 2023-02-12 16:31:40 -05:00
Matthias Clasen beabe8c33b gsk: Drop an unnecessary call
The renderer should make all the necessary
make_current calls.
2023-02-12 15:12:43 -05:00
Matthias Clasen 90500519d6 gst: Add a comment about context confusion 2023-02-12 15:12:43 -05:00
Matthias Clasen 06921674a9 gsk: Only wait if we need to
If the texture was created in the same context
we are using it in, then waiting on the sync
will be a no-op.
2023-02-12 15:12:43 -05:00
Matthias Clasen a91fa9a680 gltexture: Only wait if we need to
If the texture was created in the same context
we are downloading it from, then waiting on the
sync will be a no-op.
2023-02-12 15:12:43 -05:00
Matthias Clasen ead40dc834 gldriver: Add a sync when creating textures 2023-02-12 15:12:43 -05:00
Matthias Clasen 2be928b569 gstreamer: Defer the sync
Don't sync right when we receive the buffer,
pass it along with the texture to be executed
later in the renderer.
2023-02-12 15:12:43 -05:00
Matthias Clasen 621ba6d67c Export gdk_gl_texture_new_with_sync
Otherwise we can't use it in the loadable modules,
like the GStreamer media stream.

This change puts gdk_gl_texture_new_with_sync into
the private, but exported bucket for now. We will
make new public APIs for textures (including
synchronization) when we add color management support.
2023-02-12 15:12:43 -05:00
Matthias Clasen af929a8787 glarea: Synchronize
Create a fence object and pass it along when
creating the GL texture, so that the GL renderer
can wait for the texture to be ready.
2023-02-12 15:12:43 -05:00
Matthias Clasen ef986f4256 gsk: Synchronize when using textures
Pass the GLsync object from texture into our
command queue, and when executing the queue,
wait on the sync object the first time we
use its associated texture.
2023-02-12 15:12:41 -05:00
Matthias Clasen ab36c275cf gltexture: Synchronize when downloading
If the GL texture has a sync object, wait
on it before downloading the data.
2023-02-12 15:09:21 -05:00
Matthias Clasen 720327bc00 gltexture: Optionally take a sync object
Add a new (private, for now) constructor takes
a GLsync together with a texture id, for synchronization.
2023-02-12 15:09:21 -05:00
146 changed files with 4955 additions and 6814 deletions
+56 -73
View File
@@ -26,31 +26,25 @@ variables:
BACKEND_FLAGS: "-Dx11-backend=true -Dwayland-backend=true -Dbroadway-backend=true"
FEATURE_FLAGS: "-Dvulkan=enabled -Dcloudproviders=enabled -Ddemos=false -Dbuild-examples=false -Dbuild-tests=false -Dbuild-testsuite=true"
MESON_TEST_TIMEOUT_MULTIPLIER: 3
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v41"
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v40"
FLATPAK_IMAGE: "quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master"
workflow:
rules:
- if: $CI_COMMIT_TAG
- if: $CI_COMMIT_BRANCH
default:
retry:
max: 2
when:
- 'runner_system_failure'
- 'stuck_or_timeout_failure'
- 'scheduler_failure'
- 'api_failure'
interruptible: true
.only-default:
only:
- branches
except:
- tags
style-check-diff:
extends: .only-default
image: $FEDORA_IMAGE
stage: check
when: manual
allow_failure: true
script:
- .gitlab-ci/run-style-check-diff.sh
.build-fedora-default:
extends: .only-default
image: $FEDORA_IMAGE
artifacts:
when: always
@@ -166,6 +160,7 @@ fedora-mingw64:
- ninja -C _build
.mingw-defaults:
extends: .only-default
stage: build
tags:
- win32-ps
@@ -197,8 +192,9 @@ msys2-mingw64:
macos:
# Sadly, this fails regularly, and its failure is never enlightening
allow_failure: true
rules:
- if: $CI_PROJECT_NAMESPACE == "GNOME"
extends: .only-default
only:
- branches@GNOME/gtk
stage: build
tags:
- macos
@@ -231,9 +227,10 @@ macos:
- "${CI_PROJECT_DIR}/_build/meson-logs"
vs2017-x64:
extends: .only-default
# TODO: Uncomment this when ready to merge.
# rules:
# - if: $CI_PROJECT_NAMESPACE == "GNOME"
#only:
# - branches@GNOME/gtk
stage: build
tags:
- win32-ps
@@ -246,7 +243,7 @@ vs2017-x64:
- "${CI_PROJECT_DIR}/_build/meson-logs"
.flatpak-defaults:
image: "quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master"
image: $FLATPAK_IMAGE
stage: flatpak
allow_failure: true
tags:
@@ -256,67 +253,65 @@ vs2017-x64:
- "${APPID}-dev.flatpak"
- 'repo.tar'
expire_in: 1 day
rules:
# Only build Flatpak bundles automatically on main
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_BRANCH != "main"
when: "manual"
script:
- bash -x ./.gitlab-ci/flatpak-build.sh "${APPID}"
flatpak:demo:
extends: '.flatpak-defaults'
# Manual jobs, for branches and MRs
.flatpak-manual:
extends: .flatpak-defaults
when: manual
# Only build Flatpak bundles automatically on main
.flatpak-main:
extends: .flatpak-defaults
only:
- main
flatpak-manual:demo:
extends: .flatpak-manual
needs: []
variables:
APPID: org.gtk.Demo4
flatpak:demo:aarch64:
extends: '.flatpak-defaults'
flatpak-main:demo:
extends: .flatpak-main
needs: []
tags:
- flatpak-aarch64
variables:
APPID: org.gtk.Demo4
flatpak:widget-factory:
extends: '.flatpak-defaults'
flatpak-manual:widget-factory:
extends: .flatpak-manual
needs: []
variables:
APPID: org.gtk.WidgetFactory4
flatpak:widget-factory:aarch64:
extends: '.flatpak-defaults'
flatpak-main:widget-factory:
extends: .flatpak-main
needs: []
tags:
- flatpak-aarch64
variables:
APPID: org.gtk.WidgetFactory4
flatpak:icon-browser:
extends: '.flatpak-defaults'
flatpak-manual:icon-browser:
extends: .flatpak-manual
needs: []
variables:
APPID: org.gtk.IconBrowser4
flatpak:icon-browser:aarch64:
extends: '.flatpak-defaults'
flatpak-main:icon-browser:
extends: .flatpak-main
needs: []
tags:
- flatpak-aarch64
variables:
APPID: org.gtk.IconBrowser4
flatpak:node-editor:
extends: '.flatpak-defaults'
flatpak-manual:node-editor:
extends: .flatpak-manual
needs: []
variables:
APPID: org.gtk.gtk4.NodeEditor
flatpak:node-editor:aarch64:
extends: '.flatpak-defaults'
flatpak-main:node-editor:
extends: .flatpak-main
needs: []
tags:
- flatpak-aarch64
variables:
APPID: org.gtk.gtk4.NodeEditor
@@ -325,35 +320,23 @@ flatpak:node-editor:aarch64:
# https://gitlab.gnome.org/GNOME/Initiatives/-/wikis/DevOps-with-Flatpak
nightly demo:
extends: '.publish_nightly'
needs: ['flatpak:demo']
nightly demo aarch64:
extends: '.publish_nightly'
needs: ['flatpak:demo:aarch64']
dependencies: ['flatpak-main:demo']
needs: ['flatpak-main:demo']
nightly factory:
extends: '.publish_nightly'
needs: ['flatpak:widget-factory']
nightly factory aarch64:
extends: '.publish_nightly'
needs: ['flatpak:widget-factory:aarch64']
dependencies: ['flatpak-main:widget-factory']
needs: ['flatpak-main:widget-factory']
nightly icon-browser:
extends: '.publish_nightly'
needs: ['flatpak:icon-browser']
nightly icon-browser aarch64:
extends: '.publish_nightly'
needs: ['flatpak:icon-browser:aarch64']
dependencies: ['flatpak-main:icon-browser']
needs: ['flatpak-main:icon-browser']
nightly node-editor:
extends: '.publish_nightly'
needs: ['flatpak:node-editor']
nightly node-editor aarch64:
extends: '.publish_nightly'
needs: ['flatpak:node-editor:aarch64']
dependencies: ['flatpak-main:node-editor']
needs: ['flatpak-main:node-editor']
static-scan:
image: $FEDORA_IMAGE
@@ -436,9 +419,9 @@ reference:
publish-docs:
image: fedora:latest
stage: publish
interruptible: false
needs: ['reference']
script:
- "curl -X POST -F token=${PAGES_TRIGGER_TOKEN} -F ref=docs-gtk-org https://gitlab.gnome.org/api/v4/projects/665/trigger/pipeline"
rules:
- if: $CI_COMMIT_REF_NAME == "main"
only:
refs:
- main
-1
View File
@@ -82,7 +82,6 @@ RUN dnf -y install \
python3-gobject \
python3-jinja2 \
python3-markdown \
python3-packaging \
python3-pip \
python3-pygments \
python3-typogrify \
+5 -17
View File
@@ -23,7 +23,6 @@ push=0
list=0
print_help=0
no_login=0
no_cache=0
while (($# > 0)); do
case "${1%%=*}" in
@@ -35,7 +34,6 @@ while (($# > 0)); do
--base|-b) read_arg base "$@" || shift;;
--version|-v) read_arg base_version "$@" || shift;;
--no-login) no_login=1;;
--no-cache) no_cache=1;;
*) echo -e "\e[1;31mERROR\e[0m: Unknown option '$1'"; exit 1;;
esac
shift
@@ -105,21 +103,11 @@ TAG="${REGISTRY}/gnome/gtk/${base}:${base_version}"
if [ $build == 1 ]; then
echo -e "\e[1;32mBUILDING\e[0m: ${base} as ${TAG}"
if [ $no_cache == 0 ]; then
${CMD} build \
${format} \
--build-arg HOST_USER_ID="$UID" \
--tag "${TAG}" \
--file "${base}.Dockerfile" .
else
${CMD} build \
${format} \
--no-cache \
--build-arg HOST_USER_ID="$UID" \
--tag "${TAG}" \
--file "${base}.Dockerfile" .
fi
${CMD} build \
${format} \
--build-arg HOST_USER_ID="$UID" \
--tag "${TAG}" \
--file "${base}.Dockerfile" .
exit $?
fi
+2 -14
View File
@@ -1,12 +1,8 @@
Overview of Changes in 4.9.5, xx-xx-xxxx
========================================
Overview of Changes in 4.9.4, 12-02-2023
Overview of Changes in 4.9.4, xx-xx-xxxx
========================================
* Printing:
- Add a CPDB backend
- Drop the lpr backend
- Add a CPDB print backend
* GtkFileDialog:
- Robustness fixes
@@ -14,28 +10,20 @@ Overview of Changes in 4.9.4, 12-02-2023
* GtkScaleButton:
- Add an 'active' property
* GtkSearchEntry:
- Add placeholder text
* Fix conflicting type names between gtk and gio
* Gsk:
- Settable filtering for scaled textures
- Add mask nodes
- Some robustness and crash fixes
* Wayland:
- Handle dispatch failing in more places
* Deprecations:
- GtkVolumeButton
* Translation updates:
Belarusian
Chinese (Taiwan)
Georgian
Turkish
Ukrainian
Overview of Changes in 4.9.3, 04-02-2023
+4 -107
View File
@@ -2,19 +2,12 @@
#include "demo4widget.h"
#include "hsla.h"
enum
{
PROP_0,
PROP_PROGRESS,
};
struct _Demo4Widget
{
GtkWidget parent_instance;
PangoLayout *layout;
GskColorStop stops[8];
gsize n_stops;
double progress;
guint tick;
};
@@ -56,8 +49,6 @@ demo4_widget_init (Demo4Widget *self)
{
PangoFontDescription *desc;
self->progress = 0.5;
self->n_stops = 8;
self->stops[0].offset = 0;
self->stops[0].color = (GdkRGBA) { 1, 0, 0, 1 };
@@ -92,24 +83,16 @@ demo4_widget_dispose (GObject *object)
}
static void
demo4_widget_snapshot_content (GtkWidget *widget,
GtkSnapshot *snapshot,
GskMaskMode mode)
demo4_widget_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot)
{
Demo4Widget *self = DEMO4_WIDGET (widget);
int width, height, layout_width, layout_height;
double scale;
int width, height;
width = gtk_widget_get_width (widget);
height = gtk_widget_get_height (widget);
gtk_snapshot_push_mask (snapshot, mode);
pango_layout_get_pixel_size (self->layout, &layout_width, &layout_height);
scale = MIN ((double) width / layout_width, (double) height / layout_height);
gtk_snapshot_translate (snapshot,
&GRAPHENE_POINT_INIT ((width - scale * layout_width) / 2,
(height - scale * layout_height) / 2));
gtk_snapshot_scale (snapshot, scale, scale);
gtk_snapshot_push_mask (snapshot);
gtk_snapshot_append_layout (snapshot, self->layout, &(GdkRGBA) { 0, 0, 0, 1 });
gtk_snapshot_pop (snapshot);
@@ -122,84 +105,6 @@ demo4_widget_snapshot_content (GtkWidget *widget,
gtk_snapshot_pop (snapshot);
}
static void
demo4_widget_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot)
{
Demo4Widget *self = DEMO4_WIDGET (widget);
int width, height;
width = gtk_widget_get_width (widget);
height = gtk_widget_get_height (widget);
gtk_snapshot_push_mask (snapshot, GSK_MASK_MODE_INVERTED_LUMINANCE);
gtk_snapshot_append_linear_gradient (snapshot,
&GRAPHENE_RECT_INIT (0, 0, width, height),
&GRAPHENE_POINT_INIT (0, 0),
&GRAPHENE_POINT_INIT (width, 0),
(GskColorStop[2]) {
{ MAX (0.0, self->progress - 5.0 / width), { 1, 1, 1, 1 } },
{ MIN (1.0, self->progress + 5.0 / width), { 0, 0, 0, 1 } }
}, 2);
gtk_snapshot_pop (snapshot);
demo4_widget_snapshot_content (widget, snapshot, GSK_MASK_MODE_INVERTED_ALPHA);
gtk_snapshot_pop (snapshot);
gtk_snapshot_push_mask (snapshot, GSK_MASK_MODE_LUMINANCE);
gtk_snapshot_append_linear_gradient (snapshot,
&GRAPHENE_RECT_INIT (0, 0, width, height),
&GRAPHENE_POINT_INIT (0, 0),
&GRAPHENE_POINT_INIT (width, 0),
(GskColorStop[2]) {
{ MAX (0.0, self->progress - 5.0 / width), { 1, 1, 1, 1 } },
{ MIN (1.0, self->progress + 5.0 / width), { 0, 0, 0, 1 } }
}, 2);
gtk_snapshot_pop (snapshot);
demo4_widget_snapshot_content (widget, snapshot, GSK_MASK_MODE_ALPHA);
gtk_snapshot_pop (snapshot);
}
static void
demo4_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
Demo4Widget *self = DEMO4_WIDGET (object);
switch (prop_id)
{
case PROP_PROGRESS:
self->progress = g_value_get_double (value);
gtk_widget_queue_draw (GTK_WIDGET (object));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
demo4_widget_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
Demo4Widget *self = DEMO4_WIDGET (object);
switch (prop_id)
{
case PROP_PROGRESS:
g_value_set_double (value, self->progress);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
demo4_widget_class_init (Demo4WidgetClass *class)
{
@@ -207,15 +112,8 @@ demo4_widget_class_init (Demo4WidgetClass *class)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->dispose = demo4_widget_dispose;
object_class->get_property = demo4_widget_get_property;
object_class->set_property = demo4_widget_set_property;
widget_class->snapshot = demo4_widget_snapshot;
g_object_class_install_property (object_class, PROP_PROGRESS,
g_param_spec_double ("progress", NULL, NULL,
0.0, 1.0, 0.5,
G_PARAM_READWRITE));
}
GtkWidget *
@@ -223,4 +121,3 @@ demo4_widget_new (void)
{
return g_object_new (DEMO4_TYPE_WIDGET, NULL);
}
+1 -12
View File
@@ -356,10 +356,6 @@ canvas_item_start_editing (CanvasItem *item)
}
typedef struct {
double x, y;
} Hotspot;
static GdkContentProvider *
prepare (GtkDragSource *source,
double x,
@@ -367,7 +363,6 @@ prepare (GtkDragSource *source,
{
GtkWidget *canvas;
GtkWidget *item;
Hotspot *hotspot;
canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
item = gtk_widget_pick (canvas, x, y, GTK_PICK_DEFAULT);
@@ -378,10 +373,6 @@ prepare (GtkDragSource *source,
g_object_set_data (G_OBJECT (canvas), "dragged-item", item);
hotspot = g_new (Hotspot, 1);
gtk_widget_translate_coordinates (canvas, item, x, y, &hotspot->x, &hotspot->y);
g_object_set_data_full (G_OBJECT (canvas), "hotspot", hotspot, g_free);
return gdk_content_provider_new_typed (GTK_TYPE_WIDGET, item);
}
@@ -392,14 +383,12 @@ drag_begin (GtkDragSource *source,
GtkWidget *canvas;
CanvasItem *item;
GdkPaintable *paintable;
Hotspot *hotspot;
canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
item = CANVAS_ITEM (g_object_get_data (G_OBJECT (canvas), "dragged-item"));
hotspot = (Hotspot *) g_object_get_data (G_OBJECT (canvas), "hotspot");
paintable = canvas_item_get_drag_icon (item);
gtk_drag_source_set_icon (source, paintable, hotspot->x, hotspot->y);
gtk_drag_source_set_icon (source, paintable, item->r, item->r);
g_object_unref (paintable);
gtk_widget_set_opacity (GTK_WIDGET (item), 0.3);
+10 -12
View File
@@ -48,16 +48,14 @@
#define VERTICES_PER_TOOTH 34
#define GEAR_VERTEX_STRIDE 6
static inline void
_sincos (double x, double *_sin, double *_cos)
#ifndef HAVE_SINCOS
static void
sincos (double x, double *_sin, double *_cos)
{
#ifdef HAVE_SINCOS
sincos (x, _sin, _cos);
#else
*_sin = sin (x);
*_cos = cos (x);
#endif
}
#endif
/**
* Struct describing the vertices in triangle strip
@@ -309,11 +307,11 @@ create_gear (GLfloat inner_radius,
struct point p[7];
/* Calculate needed sin/cos for various angles */
_sincos(i * 2.0 * G_PI / teeth + da * 0, &s[0], &c[0]);
_sincos(i * 2.0 * M_PI / teeth + da * 1, &s[1], &c[1]);
_sincos(i * 2.0 * M_PI / teeth + da * 2, &s[2], &c[2]);
_sincos(i * 2.0 * M_PI / teeth + da * 3, &s[3], &c[3]);
_sincos(i * 2.0 * M_PI / teeth + da * 4, &s[4], &c[4]);
sincos(i * 2.0 * G_PI / teeth + da * 0, &s[0], &c[0]);
sincos(i * 2.0 * M_PI / teeth + da * 1, &s[1], &c[1]);
sincos(i * 2.0 * M_PI / teeth + da * 2, &s[2], &c[2]);
sincos(i * 2.0 * M_PI / teeth + da * 3, &s[3], &c[3]);
sincos(i * 2.0 * M_PI / teeth + da * 4, &s[4], &c[4]);
GEAR_POINT(p[0], r2, 1);
GEAR_POINT(p[1], r2, 2);
@@ -522,7 +520,7 @@ void perspective(GLfloat *m, GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloa
identity(tmp);
deltaZ = zFar - zNear;
_sincos(radians, &sine, &cosine);
sincos(radians, &sine, &cosine);
if ((deltaZ == 0) || (sine == 0) || (aspect == 0))
return;
+5 -12
View File
@@ -18,8 +18,7 @@ do_mask (GtkWidget *do_widget)
if (!window)
{
GtkWidget *box;
GtkWidget *demo;
GtkWidget *scale;
GtkWidget *widget;
window = gtk_window_new ();
gtk_window_set_title (GTK_WINDOW (window), "Mask Nodes");
@@ -31,17 +30,11 @@ do_mask (GtkWidget *do_widget)
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_window_set_child (GTK_WINDOW (window), box);
demo = demo4_widget_new ();
gtk_widget_set_hexpand (demo, TRUE);
gtk_widget_set_vexpand (demo, TRUE);
widget = demo4_widget_new ();
gtk_widget_set_hexpand (widget, TRUE);
gtk_widget_set_vexpand (widget, TRUE);
gtk_box_append (GTK_BOX (box), demo);
scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 1, 0.1);
gtk_range_set_value (GTK_RANGE (scale), 0.5);
g_object_bind_property (gtk_range_get_adjustment (GTK_RANGE (scale)), "value", demo, "progress", 0);
gtk_box_append (GTK_BOX (box), scale);
gtk_box_append (GTK_BOX (box), widget);
}
if (!gtk_widget_get_visible (window))
-10
View File
@@ -178,16 +178,6 @@ Creates a node like `gsk_inset_shadow_node_new()` with the given properties.
Creates a node like `gsk_linear_gradient_node_new()` with the given properties.
### mask
| property | syntax | default | printed |
| -------- | ---------------- | ---------------------- | ----------- |
| source | `<node>` | color { } | always |
| mode | `<blend-mode>` | alpha | non-default |
| mask | `<node>` | color { } | always |
Creates a node like `gsk_mask_node_new()` with the given properties.
### opacity
| property | syntax | default | printed |
+5 -5
View File
@@ -239,14 +239,14 @@ control whether Vulkan should be used.
### `media-gstreamer` and `media-ffmpeg`
By default, GTK will try to build the gstreamer backend for
media playback support. These options can be used to explicitly
media playback support. These option can be used to explicitly
control which media backends should be built.
### `print-cups` and `print-cpdb`
### `print-cups`
By default, GTK will try to build the cups and file print backends
if their dependencies are found. These options can be used to
explicitly control which print backends should be built.
By default, GTK will try to build various print backends
if their dependencies are found. This option can be used
to explicitly control whether the cups print backend should be built.
### `cloudproviders`
-5
View File
@@ -33,11 +33,6 @@ Validation
The ``validate`` command validates the given UI definition file and reports
errors to ``stderr``.
Note that there are limitations to the validation that can be done for templates,
since they are closely tied to the class_init function they are used in.
If your UI file uses types from third-party libraries, it may help to add those
libraries to the `LD_PRELOAD` environment variable.
``--deprecations``
Warn about uses of deprecated types in the UI definition file.
+47 -63
View File
@@ -7,50 +7,37 @@ the question you have, this list is a good place to start.
## General Questions
* How do I get started with GTK?
1. How do I get started with GTK?
The GTK [website](https://www.gtk.org) offers some
[tutorials](https://www.gtk.org/documentation.php) and other documentation
This reference manual also contains a introductory
(most of it about GTK 2.x and 3.x, but still somewhat applicable). This
reference manual also contains a introductory
[Getting Started](#gtk-getting-started) part.
More documentation ranging from whitepapers to online books can be found at
the [GNOME developer's site](https://developer.gnome.org). After studying these
materials you should be well prepared to come back to this reference manual for details.
* Where can I get help with GTK, submit a bug report, or make a feature request?
2. Where can I get help with GTK, submit a bug report, or make a feature request?
See the [documentation](#gtk-resources) on this topic.
* How do I port from one GTK version to another?
3. How do I port from one GTK version to another?
Every major version of GTK comes with a [migration guide](#migrating). You may also
find useful information in the documentation for specific widgets and functions. If
you have a question not covered in the manual, feel free to ask, and please
See the [migration guide](#migrating). You may also find useful information in
the documentation for specific widgets and functions. If you have a question not
covered in the manual, feel free to ask, and please
[file a bug report](https://gitlab.gnome.org/GNOME/gtk/issues/new) against the
documentation.
* Should I maintain parallel versions of my UI in GTK x and GTK y?
At the end of the day, that is up to you.
Our experience is that it is a lot of work, and usually not a good idea.
If you are not ready to make the jump to the next major version of GTK,
it is perfectly fine to stick with the stable release. We maintain them
for that reason.
* How does memory management work in GTK? Should I free data returned from functions?
4. How does memory management work in GTK? Should I free data returned from functions?
See the documentation for `GObject` and `GInitiallyUnowned`. For `GObject` note
specifically `g_object_ref()` and `g_object_unref()`. `GInitiallyUnowned` is a
subclass of `GObject` so the same points apply, except that it has a "floating"
state (explained in its documentation).
In a widget tree, each container owns a reference to its children. The root
object (typically a `GtkWindow`) is owned by GTK. GTK will drop its reference
when you call [method@Gtk.Window.destroy].
For strings returned from functions, they will be declared "const" if they should
not be freed. Non-const strings should be freed with `g_free()`. Arrays follow the
same rule. If you find an undocumented exception to the rules, please
@@ -59,7 +46,7 @@ the question you have, this list is a good place to start.
The transfer annotations for gobject-introspection that are part of the
documentation can provide useful hints for memory handling semantics as well.
* Why does my program leak memory, if I destroy a widget immediately
5. Why does my program leak memory, if I destroy a widget immediately
after creating it?
If `GtkFoo` isn't a toplevel window, then
@@ -82,7 +69,7 @@ the question you have, this list is a good place to start.
the initial floating reference and you don't have to worry about reference
counting at all ... just remove the widget from the container to get rid of it.
* How do I use GTK with threads?
6. How do I use GTK with threads?
GTK requires that all GTK API calls are made from the same thread in which
the `GtkApplication` was created, or `gtk_init()` was called (the _main thread_).
@@ -92,7 +79,7 @@ the question you have, this list is a good place to start.
the results back to the main thread using `g_idle_add()` or `GAsyncQueue`. GIO
offers useful tools for such an approach such as `GTask`.
* How do I internationalize a GTK program?
7. How do I internationalize a GTK program?
Most people use [GNU gettext](https://www.gnu.org/software/gettext/),
already required in order to install GLib. On a UNIX or Linux system with
@@ -147,7 +134,7 @@ the question you have, this list is a good place to start.
#define _(x) dgettext (GETTEXT_PACKAGE, x)
* How do I use non-ASCII characters in GTK programs ?
8. How do I use non-ASCII characters in GTK programs ?
GTK uses [Unicode](http://www.unicode.org) (more exactly UTF-8) for all text.
UTF-8 encodes each Unicode codepoint as a sequence of one to six bytes and
@@ -230,7 +217,7 @@ the question you have, this list is a good place to start.
to call bind_textdomain_codeset() to ensure that translated strings
are returned in UTF-8 encoding.
* How do I use GTK with C++?
9. How do I use GTK with C++?
There are two ways to approach this. The GTK header files use the subset
of C that's also valid C++, so you can simply use the normal GTK API
@@ -255,23 +242,19 @@ the question you have, this list is a good place to start.
There are very few functions that require this cast, however.
* How do I use GTK with other non-C languages?
10. How do I use GTK with other non-C languages?
See the list of [language bindings](https://www.gtk.org/language-bindings.php)
on the GTK [website](https://www.gtk.org).
* How do I load an image or animation from a file?
11. How do I load an image or animation from a file?
To load an image file straight into a display widget, use
[ctor@Gtk.Picture.new_for_file] or [ctor@GTk.Picture.new_for_filename].
To load an image for another purpose, use [ctor@Gdk.Texture.new_from_file].
To load a video from a file, use [ctor@Gtk.MediaFile.new_for_file].
[ctor@Gtk.Image.new_from_file]. To load an image for another purpose, use
[ctor@Gdk.Texture.new_from_file]. To load a video from a file, use
[ctor@Gtk.MediaFile.new_for_file].
* How do I draw text?
If you just want to put text into your user interface somewhere, it is
usually easiest to just use one of ready-made widgets for this purpose,
such as [class@Gtk.Label].
12. How do I draw text?
To draw a piece of text onto a cairo surface, use a Pango layout and
[func@PangoCairo.show_layout].
@@ -289,7 +272,7 @@ the question you have, this list is a good place to start.
To draw a piece of text in a widget [vfunc@Gtk.Widget.snapshot] implementation,
use [method@Gtk.Snapshot.append_layout].
* How do I measure the size of a piece of text?
13. How do I measure the size of a piece of text?
To obtain the size of a piece of text, use a Pango layout and
[method@Pango.Layout.get_pixel_size], using code like the following:
@@ -304,7 +287,7 @@ the question you have, this list is a good place to start.
See also the [Layout Objects](https://developer.gnome.org/pango/stable/pango-Layout-Objects.html)
section of the [Pango documentation](https://developer.gnome.org/pango/stable/).
* Why are types not registered if I use their `GTK_TYPE_BLAH` macro?
14. Why are types not registered if I use their `GTK_TYPE_BLAH` macro?
The %GTK_TYPE_BLAH macros are defined as calls to gtk_blah_get_type(), and
the `_get_type()` functions are declared as %G_GNUC_CONST which allows the
@@ -315,14 +298,14 @@ the question you have, this list is a good place to start.
g_type_ensure (GTK_TYPE_BLAH);
* How do I create a transparent toplevel window?
15. How do I create a transparent toplevel window?
Any toplevel window can be transparent. It is just a matter of setting a
transparent background in the CSS style for it.
## Which widget should I use...
* ...for lists and trees?
16. ...for lists and trees?
This question has different answers, depending on the size of the dataset
and the required formatting flexibility.
@@ -338,7 +321,7 @@ the question you have, this list is a good place to start.
and widgetry inside the list, then you probably want to use a [class@Gtk.ListBox],
which uses regular widgets for display.
* ...for multi-line text display or editing?
17. ...for multi-line text display or editing?
See the [text widget overview](#TextWidget) -- you should use the
[class@Gtk.TextView] widget.
@@ -347,7 +330,7 @@ the question you have, this list is a good place to start.
of course. It can be made selectable with [method@Gtk.Label.set_selectable]. For a
single-line text entry, see [class@Gtk.Entry].
* ...to display an image or animation?
18. ...to display an image or animation?
GTK has two widgets that are dedicated to displaying images. [class@Gtk.Image], for
small, fixed-size icons and [class@Gtk.Picture] for content images.
@@ -363,14 +346,17 @@ the question you have, this list is a good place to start.
mediafile = gtk_media_file_new_for_filename ("example.webm");
picture = gtk_picture_new_for_paintable (GDK_PAINTABLE (mediafile));
* ...for presenting a set of mutually-exclusive choices, where Windows
19. ...for presenting a set of mutually-exclusive choices, where Windows
would use a combo box?
With GTK, a [class@Gtk.DropDown] is the recommended widget to use for this use case.
With GTK, a [class@Gtk.ComboBox] is the recommended widget to use for this use case.
If you need an editable text entry, use the [property@Gtk.ComboBox:has-entry] property.
A newer alternative is [class@Gtk.DropDown].
## Questions about GtkWidget
* How do I change the color of a widget?
20. How do I change the color of a widget?
The background color of a widget is determined by the CSS style that applies
to it. To change that, you can set style classes on the widget, and provide
@@ -378,7 +364,7 @@ the question you have, this list is a good place to start.
[method@Gtk.CssProvider.load_from_file] and its variants.
See [method@Gtk.StyleContext.add_provider].
* How do I change the font of a widget?
21. How do I change the font of a widget?
If you want to make the text of a label larger, you can use
gtk_label_set_markup():
@@ -402,14 +388,14 @@ the question you have, this list is a good place to start.
of this approach is that users can then override the font you have chosen.
See the `GtkStyleContext` documentation for more discussion.
* How do I disable/ghost/desensitize a widget?
22. How do I disable/ghost/desensitize a widget?
In GTK a disabled widget is termed _insensitive_.
See [method@Gtk.Widget.set_sensitive].
## GtkTextView questions
* How do I get the contents of the entire text widget as a string?
23. How do I get the contents of the entire text widget as a string?
See [method@Gtk.TextBuffer.get_bounds] and [method@Gtk.TextBuffer.get_text]
or [method@Gtk.TextIter.get_text].
@@ -424,14 +410,14 @@ the question you have, this list is a good place to start.
/* use text */
g_free (text);
* How do I make a text widget display its complete contents in a specific font?
24. How do I make a text widget display its complete contents in a specific font?
If you use [method@Gtk.TextBuffer.insert_with_tags] with appropriate tags to
select the font, the inserted text will have the desired appearance, but
text typed in by the user before or after the tagged block will appear in
the default style.
* How do I make a text view scroll to the end of the buffer automatically ?
25. How do I make a text view scroll to the end of the buffer automatically ?
A good way to keep a text buffer scrolled to the end is to place a
[mark](#GtkTextMark) at the end of the buffer, and give it right gravity.
@@ -446,21 +432,21 @@ the question you have, this list is a good place to start.
## GtkTreeView questions
* How do I associate some data with a row in the tree?
26. How do I associate some data with a row in the tree?
Remember that the [iface@Gtk.TreeModel] columns don't necessarily have to be
displayed. So you can put non-user-visible data in your model just
like any other data, and retrieve it with [method@Gtk.TreeModel.get].
See the [tree widget overview](#TreeWidget).
* How do I put an image and some text in the same column?
27. How do I put an image and some text in the same column?
You can pack more than one [class@Gtk.CellRenderer] into a single [class@Gtk.TreeViewColumn]
using [method@Gtk.TreeViewColumn.pack_start] or [method@Gtk.TreeViewColumn.pack_end].
So pack both a [class@Gtk.CellRendererPixbuf] and a [class@Gtk.CellRendererText] into the
column.
* I can set data easily on my [class@Gtk.TreeStore] or [class@Gtk.ListStore] models using
28. I can set data easily on my [class@Gtk.TreeStore] or [class@Gtk.ListStore] models using
[method@Gtk.ListStore.set] and [method@Gtk.TreeStore.set], but can't read it back?
Both the [class@Gtk.TreeStore] and the [class@Gtk.ListStore] implement the [iface@Gtk.TreeModel]
@@ -468,7 +454,7 @@ the question you have, this list is a good place to start.
implements. The easiest way to read a set of data back is to use
[method@Gtk.TreeModel.get].
* How do I change the way that numbers are formatted by `GtkTreeView`?
29. How do I change the way that numbers are formatted by `GtkTreeView`?
Use [method@Gtk.TreeView.insert_column_with_data_func] or
[method@Gtk.TreeViewColumn.set_cell_data_func] and do the conversion
@@ -542,21 +528,19 @@ the question you have, this list is a good place to start.
(gpointer)DOUBLE_COLUMN, NULL);
}
* How do I hide the expander arrows in my tree view?
30. How do I hide the expander arrows in my tree view?
Set the expander-column property of the tree view to a hidden column.
See [method@Gtk.TreeView.set_expander_column] and [method@Gtk.TreeViewColumn.set_visible].
## Using cairo with GTK
* How do I use cairo to draw in GTK applications?
31. How do I use cairo to draw in GTK applications?
[class@Gtk.DrawingArea] is a ready-made widget for drawing with cairo.
Use [method@Gtk.Snapshot.append_cairo] in your [vfunc@Gtk.Widget.snapshot] vfunc
to obtain a cairo context and draw with that.
If you implement a custom widget, use [method@Gtk.Snapshot.append_cairo]
in your [vfunc@Gtk.Widget.snapshot] vfunc to obtain a cairo context and draw with that.
* Can I improve the performance of my application by using another backend
32. Can I improve the performance of my application by using another backend
of cairo (such as GL)?
No. Most drawing in GTK is not done via cairo anymore (but instead
@@ -567,7 +551,7 @@ the question you have, this list is a good place to start.
If you are interested in using GL for your own drawing, see [class@Gtk.GLArea].
* Can I use cairo to draw on a `GdkPixbuf`?
33. Can I use cairo to draw on a `GdkPixbuf`?
No. The cairo image surface does not support the pixel format used by `GdkPixbuf`.
-1
View File
@@ -69,7 +69,6 @@
#include <gdk/gdksnapshot.h>
#include <gdk/gdksurface.h>
#include <gdk/gdktexture.h>
#include <gdk/gdktexturedownloader.h>
#include <gdk/gdktoplevel.h>
#include <gdk/gdktoplevellayout.h>
#include <gdk/gdktoplevelsize.h>
-11
View File
@@ -584,8 +584,6 @@ gdk_frame_clock_paint_idle (void *data)
{
priv->requested &= ~GDK_FRAME_CLOCK_PHASE_LAYOUT;
_gdk_frame_clock_emit_layout (clock);
if (priv->requested & GDK_FRAME_CLOCK_PHASE_LAYOUT)
g_print ("looping in layout %d\n", iter);
}
if (iter == 5)
g_warning ("gdk-frame-clock: layout continuously requested, giving up after 4 tries");
@@ -811,12 +809,3 @@ _gdk_frame_clock_idle_new (void)
return GDK_FRAME_CLOCK (clock);
}
GdkFrameClockPhase
gdk_frame_clock_get_current_phase (GdkFrameClock *clock)
{
GdkFrameClockIdle *clock_idle = GDK_FRAME_CLOCK_IDLE (clock);
GdkFrameClockIdlePrivate *priv = clock_idle->priv;
return priv->phase;
}
-2
View File
@@ -127,8 +127,6 @@ void _gdk_frame_clock_emit_paint (GdkFrameClock *frame_clock);
void _gdk_frame_clock_emit_after_paint (GdkFrameClock *frame_clock);
void _gdk_frame_clock_emit_resume_events (GdkFrameClock *frame_clock);
GdkFrameClockPhase gdk_frame_clock_get_current_phase (GdkFrameClock *frame_clock);
G_END_DECLS
#endif /* __GDK_FRAME_CLOCK_PRIVATE_H__ */
+53
View File
@@ -24,6 +24,7 @@
#include "gdkglcontextprivate.h"
#include "gdkmemoryformatprivate.h"
#include "gdkmemorytextureprivate.h"
#include "gdktextureprivate.h"
#include <epoxy/gl.h>
@@ -38,6 +39,7 @@ struct _GdkGLTexture {
GdkGLContext *context;
guint id;
GLsync sync;
GdkTexture *saved;
@@ -63,6 +65,7 @@ drop_gl_resources (GdkGLTexture *self)
g_clear_object (&self->context);
self->id = 0;
self->sync = NULL;
}
static void
@@ -98,6 +101,10 @@ gdk_gl_texture_invoke_callback (gpointer data)
context = gdk_display_get_gl_context (gdk_gl_context_get_display (invoke->self->context));
gdk_gl_context_make_current (context);
if (invoke->self->sync && context != invoke->self->context)
glWaitSync (invoke->self->sync, 0, GL_TIMEOUT_IGNORED);
glBindTexture (GL_TEXTURE_2D, invoke->self->id);
invoke->func (invoke->self, context, invoke->data);
@@ -439,6 +446,46 @@ gdk_gl_texture_new (GdkGLContext *context,
int height,
GDestroyNotify destroy,
gpointer data)
{
g_return_val_if_fail (GDK_IS_GL_CONTEXT (context), NULL);
g_return_val_if_fail (id != 0, NULL);
g_return_val_if_fail (width > 0, NULL);
g_return_val_if_fail (height > 0, NULL);
return gdk_gl_texture_new_with_sync (context, id, NULL, width, height, destroy, data);
}
/*< private >
* gdk_gl_texture_new_with_sync:
* @context: a `GdkGLContext`
* @id: the ID of a texture that was created with @context
* @sync: (nullable): an optional GLsync object
* @width: the nominal width of the texture
* @height: the nominal height of the texture
* @destroy: a destroy notify that will be called when the GL resources
* are released
* @data: data that gets passed to @destroy
*
* Creates a new texture for an existing GL texture.
*
* If @sync is given, consumers of the texture are required to wait on
* it before attempting to use the GL texture.
*
* The GL texture and the sync object must stay alive unmodified until
* @destroy is called, which will happen when the GdkTexture object is
* finalized, or due to an explicit call of [method@Gdk.GLTexture.release].
*
* Return value: (transfer full) (type GdkGLTexture): A newly-created
* `GdkTexture`
*/
GdkTexture *
gdk_gl_texture_new_with_sync (GdkGLContext *context,
guint id,
gpointer sync,
int width,
int height,
GDestroyNotify destroy,
gpointer data)
{
GdkGLTexture *self;
@@ -454,6 +501,7 @@ gdk_gl_texture_new (GdkGLContext *context,
self->context = g_object_ref (context);
self->id = id;
self->sync = sync;
self->destroy = destroy;
self->data = data;
@@ -462,3 +510,8 @@ gdk_gl_texture_new (GdkGLContext *context,
return GDK_TEXTURE (self);
}
gpointer
gdk_gl_texture_get_sync (GdkGLTexture *self)
{
return self->sync;
}
+10
View File
@@ -9,6 +9,16 @@ G_BEGIN_DECLS
GdkGLContext * gdk_gl_texture_get_context (GdkGLTexture *self);
guint gdk_gl_texture_get_id (GdkGLTexture *self);
gpointer gdk_gl_texture_get_sync (GdkGLTexture *self);
GDK_AVAILABLE_IN_4_10
GdkTexture * gdk_gl_texture_new_with_sync (GdkGLContext *context,
guint id,
gpointer sync,
int width,
int height,
GDestroyNotify destroy,
gpointer data);
G_END_DECLS
+10 -6
View File
@@ -222,7 +222,7 @@ gdk_memory_texture_from_texture (GdkTexture *texture,
data = g_malloc_n (stride, texture->height);
gdk_texture_do_download (texture, format, data, stride);
bytes = g_bytes_new_take (data, stride * texture->height);
bytes = g_bytes_new_take (data, stride);
result = gdk_memory_texture_new (texture->width,
texture->height,
format,
@@ -233,11 +233,15 @@ gdk_memory_texture_from_texture (GdkTexture *texture,
return GDK_MEMORY_TEXTURE (result);
}
GBytes *
gdk_memory_texture_get_bytes (GdkMemoryTexture *self,
gsize *out_stride)
const guchar *
gdk_memory_texture_get_data (GdkMemoryTexture *self)
{
*out_stride = self->stride;
return self->bytes;
return g_bytes_get_data (self->bytes, NULL);
}
gsize
gdk_memory_texture_get_stride (GdkMemoryTexture *self)
{
return self->stride;
}
+2 -2
View File
@@ -37,8 +37,8 @@ GdkTexture * gdk_memory_texture_new_subtexture (GdkMemoryTexture *
int width,
int height);
GBytes * gdk_memory_texture_get_bytes (GdkMemoryTexture *self,
gsize *out_stride);
const guchar * gdk_memory_texture_get_data (GdkMemoryTexture *self);
gsize gdk_memory_texture_get_stride (GdkMemoryTexture *self);
G_END_DECLS
+12 -17
View File
@@ -27,7 +27,7 @@
#include "gdkmemoryformatprivate.h"
#include "gdkmemorytextureprivate.h"
#include "gdksurface.h"
#include "gdktexturedownloaderprivate.h"
#include "gdktextureprivate.h"
#include <gdk-pixbuf/gdk-pixbuf.h>
@@ -218,9 +218,9 @@ gdk_pixbuf_get_from_surface (cairo_surface_t *surface,
static void
pixbuf_texture_unref_cb (guchar *pixels,
gpointer bytes)
gpointer texture)
{
g_bytes_unref (bytes);
g_object_unref (texture);
}
/**
@@ -238,27 +238,22 @@ pixbuf_texture_unref_cb (guchar *pixels,
GdkPixbuf *
gdk_pixbuf_get_from_texture (GdkTexture *texture)
{
GdkTextureDownloader downloader;
GBytes *bytes;
gsize stride;
GdkMemoryTexture *memtex;
gboolean alpha;
alpha = gdk_memory_format_alpha (gdk_texture_get_format (texture)) != GDK_MEMORY_ALPHA_OPAQUE;
gdk_texture_downloader_init (&downloader, texture);
gdk_texture_downloader_set_format (&downloader,
alpha ? GDK_MEMORY_GDK_PIXBUF_ALPHA
: GDK_MEMORY_GDK_PIXBUF_OPAQUE);
bytes = gdk_texture_downloader_download_bytes (&downloader, &stride);
gdk_texture_downloader_finish (&downloader);
memtex = gdk_memory_texture_from_texture (texture,
alpha ? GDK_MEMORY_GDK_PIXBUF_ALPHA
: GDK_MEMORY_GDK_PIXBUF_OPAQUE);
return gdk_pixbuf_new_from_data (g_bytes_get_data (bytes, NULL),
return gdk_pixbuf_new_from_data (gdk_memory_texture_get_data (memtex),
GDK_COLORSPACE_RGB,
alpha,
8,
gdk_texture_get_width (texture),
gdk_texture_get_height (texture),
stride,
gdk_texture_get_width (GDK_TEXTURE (memtex)),
gdk_texture_get_height (GDK_TEXTURE (memtex)),
gdk_memory_texture_get_stride (memtex),
pixbuf_texture_unref_cb,
bytes);
memtex);
}
-23
View File
@@ -722,9 +722,6 @@ gdk_texture_download_surface (GdkTexture *texture)
* cairo_image_surface_get_stride (surface));
* cairo_surface_mark_dirty (surface);
* ```
*
* For more flexible download capabilites, see
* [struct@Gdk.TextureDownloader].
*/
void
gdk_texture_download (GdkTexture *texture,
@@ -741,29 +738,9 @@ gdk_texture_download (GdkTexture *texture,
stride);
}
/**
* gdk_texture_get_format:
* @self: a GdkTexture
*
* Gets the memory format most closely associated with the data of
* the texture.
*
* Note that it may not be an exact match for texture data
* stored on the GPU or with compression.
*
* The format can give an indication about the bit depth and opacity
* of the texture and is useful to determine the best format for
* downloading the texture.
*
* Returns: the preferred format for the texture's data
*
* Since: 4.10
**/
GdkMemoryFormat
gdk_texture_get_format (GdkTexture *self)
{
g_return_val_if_fail (GDK_IS_TEXTURE (self), GDK_MEMORY_DEFAULT);
return self->format;
}
-3
View File
@@ -24,7 +24,6 @@
#endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdkenums.h>
#include <gdk/gdktypes.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
@@ -83,8 +82,6 @@ GDK_AVAILABLE_IN_ALL
int gdk_texture_get_width (GdkTexture *texture) G_GNUC_PURE;
GDK_AVAILABLE_IN_ALL
int gdk_texture_get_height (GdkTexture *texture) G_GNUC_PURE;
GDK_AVAILABLE_IN_4_10
GdkMemoryFormat gdk_texture_get_format (GdkTexture *self) G_GNUC_PURE;
GDK_AVAILABLE_IN_ALL
void gdk_texture_download (GdkTexture *texture,
-268
View File
@@ -1,268 +0,0 @@
/* GTK - The GIMP Toolkit
* Copyright (C) 2023 Benjamin Otte
*
* 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 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/>.
*/
/**
* GdkTextureDownloader:
*
* The `GdkTextureDownloader` is used to download the contents of a
* [class@Gdk.Texture].
*
* It is intended to be created as a short-term object for a single download,
* but can be used for multipe downloads of different textures or with different
* settings.
*
* `GdkTextureDownloader` can be used to convert data between different formats.
* Create a `GdkTexture` for the existing format and then download it in a
* different format.
*
* Since: 4.10
*/
#include "config.h"
#include "gdktexturedownloaderprivate.h"
#include "gdkmemoryformatprivate.h"
#include "gdkmemorytextureprivate.h"
#include "gdktextureprivate.h"
G_DEFINE_BOXED_TYPE (GdkTextureDownloader, gdk_texture_downloader,
gdk_texture_downloader_copy,
gdk_texture_downloader_free)
void
gdk_texture_downloader_init (GdkTextureDownloader *self,
GdkTexture *texture)
{
self->texture = g_object_ref (texture);
self->format = GDK_MEMORY_DEFAULT;
}
void
gdk_texture_downloader_finish (GdkTextureDownloader *self)
{
g_object_unref (self->texture);
}
/**
* gdk_texture_downloader_new:
* @texture: texture to download
*
* Creates a new texture downloader for @texture.
*
* Returns: A new texture downloader
*
* Since: 4.10
**/
GdkTextureDownloader *
gdk_texture_downloader_new (GdkTexture *texture)
{
GdkTextureDownloader *self;
g_return_val_if_fail (GDK_IS_TEXTURE (texture), NULL);
self = g_slice_new (GdkTextureDownloader);
gdk_texture_downloader_init (self, texture);
return self;
}
/**
* gdk_texture_downloader_copy:
* @self: the downloader to copy
*
* Creates a copy of the downloader.
*
* This function is meant for language bindings.
*
* Returns: A copy of the downloader
*
* Since: 4.10
**/
GdkTextureDownloader *
gdk_texture_downloader_copy (const GdkTextureDownloader *self)
{
GdkTextureDownloader *copy;
g_return_val_if_fail (self != NULL, NULL);
copy = gdk_texture_downloader_new (self->texture);
gdk_texture_downloader_set_format (copy, self->format);
return copy;
}
/**
* gdk_texture_downloader_free:
* @self: texture downloader to free
*
* Frees the given downloader and all its associated resources.
*
* Since: 4.10
**/
void
gdk_texture_downloader_free (GdkTextureDownloader *self)
{
g_return_if_fail (self != NULL);
gdk_texture_downloader_finish (self);
g_slice_free (GdkTextureDownloader, self);
}
/**
* gdk_texture_downloader_set_texture:
* @self: a texture downloader
* @texture: the new texture to download
*
* Changes the texture the downloader will download.
*
* Since: 4.10
**/
void
gdk_texture_downloader_set_texture (GdkTextureDownloader *self,
GdkTexture *texture)
{
g_return_if_fail (self != NULL);
g_return_if_fail (GDK_IS_TEXTURE (texture));
g_set_object (&self->texture, texture);
}
/**
* gdk_texture_downloader_get_texture:
* @self: a texture downloader
*
* Gets the texture that the downloader will download.
*
* Returns: (transfer none): The texture to download
*
* Since: 4.10
**/
GdkTexture *
gdk_texture_downloader_get_texture (const GdkTextureDownloader *self)
{
g_return_val_if_fail (self != NULL, NULL);
return self->texture;
}
/**
* gdk_texture_downloader_set_format:
* @self: a texture downloader
* @format: the format to use
*
* Sets the format the downloader will download.
*
* By default, GDK_MEMORY_DEFAULT is set.
*
* Since: 4.10
*/
void
gdk_texture_downloader_set_format (GdkTextureDownloader *self,
GdkMemoryFormat format)
{
g_return_if_fail (self != NULL);
self->format = format;
}
/**
* gdk_texture_downloader_get_format:
* @self: a texture downloader
*
* Gets the format that the data will be downloaded in.
*
* Returns: The format of the download
*
* Since: 4.10
**/
GdkMemoryFormat
gdk_texture_downloader_get_format (const GdkTextureDownloader *self)
{
g_return_val_if_fail (self != NULL, GDK_MEMORY_DEFAULT);
return self->format;
}
/**
* gdk_texture_downloader_download_into:
* @self: a texture downloader
* @data: (array): pointer to enough memory to be filled with the
* downloaded data of the texture
* @stride: rowstride in bytes
*
* Downloads the @texture into local memory.
*
* Since: 4.10
**/
void
gdk_texture_downloader_download_into (const GdkTextureDownloader *self,
guchar *data,
gsize stride)
{
g_return_if_fail (self != NULL);
g_return_if_fail (data != NULL);
g_return_if_fail (stride >= gdk_texture_get_width (self->texture) * gdk_memory_format_bytes_per_pixel (self->format));
gdk_texture_do_download (self->texture, self->format, data, stride);
}
/**
* gdk_texture_downloader_download_bytes:
* @self: the downloader
* @out_stride: (out): The stride of the resulting data in bytes.
*
* Downloads the given texture pixels into a `GBytes`. The rowstride will
* be stored in the stride value.
*
* This function will abort if it tries to download a large texture and
* fails to allocate memory. If you think that may happen, you should
* handle memory allocation yourself and use
* gdk_texture_downloader_download_into() once allocation succeeded.
*
* Returns: The downloaded pixels.
*
* Since: 4.10
**/
GBytes *
gdk_texture_downloader_download_bytes (const GdkTextureDownloader *self,
gsize *out_stride)
{
guchar *data;
gsize stride;
g_return_val_if_fail (self != NULL, NULL);
g_return_val_if_fail (out_stride != NULL, NULL);
if (GDK_IS_MEMORY_TEXTURE (self->texture) &&
gdk_texture_get_format (self->texture) == self->format)
{
GdkMemoryTexture *memtex = GDK_MEMORY_TEXTURE (self->texture);
return g_bytes_ref (gdk_memory_texture_get_bytes (memtex, out_stride));
}
stride = self->texture->width * gdk_memory_format_bytes_per_pixel (self->format);
data = g_malloc_n (stride, self->texture->height);
gdk_texture_do_download (self->texture, self->format, data, stride);
*out_stride = stride;
return g_bytes_new_take (data, stride * self->texture->height);
}
-69
View File
@@ -1,69 +0,0 @@
/* GTK - The GIMP Toolkit
* Copyright (C) 2023 Benjamin Otte
*
* 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 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/>.
*/
#ifndef __GTK_TEXTURE_DOWNLOADER_H__
#define __GTK_TEXTURE_DOWNLOADER_H__
#if !defined (__GDK_H_INSIDE__) && !defined (GTK_COMPILATION)
#error "Only <gdk/gdk.h> can be included directly."
#endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdkenums.h>
#include <gdk/gdktypes.h>
G_BEGIN_DECLS
#define GDK_TYPE_TEXTURE_DOWNLOADER (gdk_texture_downloader_get_type ())
GDK_AVAILABLE_IN_4_10
GType gdk_texture_downloader_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_4_10
GdkTextureDownloader * gdk_texture_downloader_new (GdkTexture *texture);
GDK_AVAILABLE_IN_4_10
GdkTextureDownloader * gdk_texture_downloader_copy (const GdkTextureDownloader *self);
GDK_AVAILABLE_IN_4_10
void gdk_texture_downloader_free (GdkTextureDownloader *self);
GDK_AVAILABLE_IN_4_10
void gdk_texture_downloader_set_texture (GdkTextureDownloader *self,
GdkTexture *texture);
GDK_AVAILABLE_IN_4_10
GdkTexture * gdk_texture_downloader_get_texture (const GdkTextureDownloader *self);
GDK_AVAILABLE_IN_4_10
void gdk_texture_downloader_set_format (GdkTextureDownloader *self,
GdkMemoryFormat format);
GDK_AVAILABLE_IN_4_10
GdkMemoryFormat gdk_texture_downloader_get_format (const GdkTextureDownloader *self);
GDK_AVAILABLE_IN_4_10
void gdk_texture_downloader_download_into (const GdkTextureDownloader *self,
guchar *data,
gsize stride);
GDK_AVAILABLE_IN_4_10
GBytes * gdk_texture_downloader_download_bytes (const GdkTextureDownloader *self,
gsize *out_stride);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkTextureDownloader, gdk_texture_downloader_free)
G_END_DECLS
#endif /* __GTK_TEXTURE_DOWNLOADER_H__ */
-41
View File
@@ -1,41 +0,0 @@
/* GTK - The GIMP Toolkit
*
* Copyright (C) 2023 Benjamin Otte
*
* 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/>.
*/
#ifndef __GTK_TEXTURE_DOWNLOADER_PRIVATE_H__
#define __GTK_TEXTURE_DOWNLOADER_PRIVATE_H__
#include "gdktexturedownloader.h"
G_BEGIN_DECLS
struct _GdkTextureDownloader
{
/*< private >*/
GdkTexture *texture;
GdkMemoryFormat format;
};
void gdk_texture_downloader_init (GdkTextureDownloader *self,
GdkTexture *texture);
void gdk_texture_downloader_finish (GdkTextureDownloader *self);
G_END_DECLS
#endif /* __GTK_TEXTURE_DOWNLOADER_PRIVATE_H__ */
+1
View File
@@ -43,6 +43,7 @@ void gdk_texture_do_download (GdkTexture
GdkMemoryFormat format,
guchar *data,
gsize stride);
GdkMemoryFormat gdk_texture_get_format (GdkTexture *self);
gboolean gdk_texture_set_render_data (GdkTexture *self,
gpointer key,
gpointer data,
-1
View File
@@ -77,7 +77,6 @@ typedef struct _GdkContentFormats GdkContentFormats;
typedef struct _GdkContentProvider GdkContentProvider;
typedef struct _GdkCursor GdkCursor;
typedef struct _GdkTexture GdkTexture;
typedef struct _GdkTextureDownloader GdkTextureDownloader;
typedef struct _GdkDevice GdkDevice;
typedef struct _GdkDrag GdkDrag;
typedef struct _GdkDrop GdkDrop;
+8 -10
View File
@@ -23,7 +23,7 @@
#include <glib/gi18n-lib.h>
#include "gdktexture.h"
#include "gdktexturedownloaderprivate.h"
#include "gdkmemorytextureprivate.h"
#include "gdkprofilerprivate.h"
@@ -251,8 +251,7 @@ gdk_save_jpeg (GdkTexture *texture)
guchar *data = NULL;
gulong size = 0;
guchar *input = NULL;
GdkTextureDownloader downloader;
GBytes *texbytes;
GdkMemoryTexture *memtex = NULL;
const guchar *texdata;
gsize texstride;
guchar *row;
@@ -271,7 +270,7 @@ gdk_save_jpeg (GdkTexture *texture)
free (data);
g_free (input);
jpeg_destroy_compress (&info);
g_clear_pointer (&texbytes, g_bytes_unref);
g_clear_object (&memtex);
return NULL;
}
@@ -290,11 +289,10 @@ gdk_save_jpeg (GdkTexture *texture)
jpeg_mem_dest (&info, &data, &size);
gdk_texture_downloader_init (&downloader, texture);
gdk_texture_downloader_set_format (&downloader, GDK_MEMORY_R8G8B8);
texbytes = gdk_texture_downloader_download_bytes (&downloader, &texstride);
gdk_texture_downloader_finish (&downloader);
texdata = g_bytes_get_data (texbytes, NULL);
memtex = gdk_memory_texture_from_texture (texture,
GDK_MEMORY_R8G8B8);
texdata = gdk_memory_texture_get_data (memtex);
texstride = gdk_memory_texture_get_stride (memtex);
jpeg_start_compress (&info, TRUE);
@@ -306,7 +304,7 @@ gdk_save_jpeg (GdkTexture *texture)
jpeg_finish_compress (&info);
g_bytes_unref (texbytes);
g_object_unref (memtex);
g_free (input);
jpeg_destroy_compress (&info);
+11 -13
View File
@@ -21,9 +21,10 @@
#include <glib/gi18n-lib.h>
#include "gdkmemoryformatprivate.h"
#include "gdkmemorytexture.h"
#include "gdkmemorytextureprivate.h"
#include "gdkprofilerprivate.h"
#include "gdktexturedownloaderprivate.h"
#include "gdktexture.h"
#include "gdktextureprivate.h"
#include "gsk/gl/fp16private.h"
#include <png.h>
#include <stdio.h>
@@ -296,12 +297,11 @@ gdk_save_png (GdkTexture *texture)
png_info *info;
png_io io = { NULL, 0, 0 };
int width, height;
int y;
GdkMemoryFormat format;
GdkTextureDownloader downloader;
GBytes *bytes;
gsize stride;
const guchar *data;
int y;
GdkMemoryTexture *memtex;
GdkMemoryFormat format;
int png_format;
int depth;
@@ -370,15 +370,11 @@ gdk_save_png (GdkTexture *texture)
return NULL;
}
gdk_texture_downloader_init (&downloader, texture);
gdk_texture_downloader_set_format (&downloader, format);
bytes = gdk_texture_downloader_download_bytes (&downloader, &stride);
gdk_texture_downloader_finish (&downloader);
data = g_bytes_get_data (bytes, NULL);
memtex = gdk_memory_texture_from_texture (texture, format);
if (sigsetjmp (png_jmpbuf (png), 1))
{
g_bytes_unref (bytes);
g_object_unref (memtex);
g_free (io.data);
png_destroy_read_struct (&png, &info, NULL);
return NULL;
@@ -398,6 +394,8 @@ gdk_save_png (GdkTexture *texture)
png_set_swap (png);
#endif
data = gdk_memory_texture_get_data (memtex);
stride = gdk_memory_texture_get_stride (memtex);
for (y = 0; y < height; y++)
png_write_row (png, data + y * stride);
@@ -405,7 +403,7 @@ gdk_save_png (GdkTexture *texture)
png_destroy_write_struct (&png, &info);
g_bytes_unref (bytes);
g_object_unref (memtex);
return g_bytes_new_take (io.data, io.size);
}
+11 -13
View File
@@ -21,9 +21,10 @@
#include <glib/gi18n-lib.h>
#include "gdkmemoryformatprivate.h"
#include "gdkmemorytexture.h"
#include "gdkmemorytextureprivate.h"
#include "gdkprofilerprivate.h"
#include "gdktexturedownloaderprivate.h"
#include "gdktexture.h"
#include "gdktextureprivate.h"
#include <tiffio.h>
@@ -259,12 +260,11 @@ GBytes *
gdk_save_tiff (GdkTexture *texture)
{
TIFF *tif;
int width, height;
gsize stride;
int width, height, stride;
const guchar *line;
const guchar *data;
GBytes *bytes, *result = NULL;
GdkTextureDownloader downloader;
GBytes *result = NULL;
GdkMemoryTexture *memtex;
GdkMemoryFormat format;
const FormatData *fdata = NULL;
@@ -292,11 +292,9 @@ gdk_save_tiff (GdkTexture *texture)
TIFFSetField (tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
TIFFSetField (tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
gdk_texture_downloader_init (&downloader, texture);
gdk_texture_downloader_set_format (&downloader, fdata->format);
bytes = gdk_texture_downloader_download_bytes (&downloader, &stride);
gdk_texture_downloader_finish (&downloader);
data = g_bytes_get_data (bytes, NULL);
memtex = gdk_memory_texture_from_texture (texture, fdata->format);
data = gdk_memory_texture_get_data (memtex);
stride = gdk_memory_texture_get_stride (memtex);
line = (const guchar *)data;
for (int y = 0; y < height; y++)
@@ -304,7 +302,7 @@ gdk_save_tiff (GdkTexture *texture)
if (TIFFWriteScanline (tif, (void *)line, y, 0) == -1)
{
TIFFClose (tif);
g_bytes_unref (bytes);
g_object_unref (memtex);
return NULL;
}
@@ -316,7 +314,7 @@ gdk_save_tiff (GdkTexture *texture)
g_assert (result);
g_bytes_unref (bytes);
g_object_unref (memtex);
return result;
}
-2
View File
@@ -43,7 +43,6 @@ gdk_public_sources = files([
'gdkseatdefault.c',
'gdksnapshot.c',
'gdktexture.c',
'gdktexturedownloader.c',
'gdkvulkancontext.c',
'gdksurface.c',
'gdkpopuplayout.c',
@@ -96,7 +95,6 @@ gdk_public_headers = files([
'gdkseat.h',
'gdksnapshot.h',
'gdktexture.h',
'gdktexturedownloader.h',
'gdktypes.h',
'gdkvulkancontext.h',
'gdksurface.h',
-8
View File
@@ -25,7 +25,6 @@
#include "gdkdisplay-wayland.h"
#include "gdksurface-wayland.h"
#include "gdksurface-wayland-private.h"
#include "gdkwaylanddisplay.h"
#include "gdkwaylandglcontext.h"
@@ -61,17 +60,10 @@ gdk_wayland_gl_context_end_frame (GdkDrawContext *draw_context,
cairo_region_t *painted)
{
GdkSurface *surface = gdk_draw_context_get_surface (draw_context);
GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
int dx = impl->pending_buffer_offset_x;
int dy = impl->pending_buffer_offset_y;
gdk_wayland_surface_sync (surface);
gdk_wayland_surface_request_frame (surface);
if (wl_surface_get_version (impl->display_server.wl_surface) >=
WL_SURFACE_OFFSET_SINCE_VERSION)
wl_surface_offset (impl->display_server.wl_surface, dx, dy);
GDK_DRAW_CONTEXT_CLASS (gdk_wayland_gl_context_parent_class)->end_frame (draw_context, painted);
gdk_wayland_surface_notify_committed (surface);
+22 -1
View File
@@ -229,7 +229,7 @@ gdk_wayland_surface_update_size (GdkSurface *surface,
if (impl->display_server.egl_window)
wl_egl_window_resize (impl->display_server.egl_window, width * scale, height * scale, 0, 0);
if (impl->display_server.wl_surface && scale_changed)
if (impl->display_server.wl_surface)
wl_surface_set_buffer_scale (impl->display_server.wl_surface, scale);
gdk_surface_invalidate_rect (surface, NULL);
@@ -579,12 +579,33 @@ gdk_wayland_surface_attach_image (GdkSurface *surface,
}
}
static void
gdk_wayland_surface_sync_offset (GdkSurface *surface)
{
GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
if (wl_surface_get_version (impl->display_server.wl_surface) <
WL_SURFACE_OFFSET_SINCE_VERSION)
return;
if (impl->pending_buffer_offset_x == 0 &&
impl->pending_buffer_offset_y == 0)
return;
wl_surface_offset (impl->display_server.wl_surface,
impl->pending_buffer_offset_x,
impl->pending_buffer_offset_y);
impl->pending_buffer_offset_x = 0;
impl->pending_buffer_offset_y = 0;
}
void
gdk_wayland_surface_sync (GdkSurface *surface)
{
gdk_wayland_surface_sync_shadow (surface);
gdk_wayland_surface_sync_opaque_region (surface);
gdk_wayland_surface_sync_input_region (surface);
gdk_wayland_surface_sync_offset (surface);
}
static gboolean
+1 -1
View File
@@ -1912,7 +1912,7 @@ drag_grab (GdkDrag *drag)
root = GDK_DISPLAY_XROOTWIN (display);
seat = gdk_device_get_seat (gdk_drag_get_device (drag));
capabilities = GDK_SEAT_CAPABILITY_ALL_POINTING | GDK_SEAT_CAPABILITY_KEYBOARD;
capabilities = GDK_SEAT_CAPABILITY_ALL_POINTING;
cursor = gdk_drag_get_cursor (drag, x11_drag->current_action);
g_set_object (&x11_drag->cursor, cursor);
+18 -10
View File
@@ -27,8 +27,8 @@
#include <gdk/gdkglcontextprivate.h>
#include <gdk/gdkmemoryformatprivate.h>
#include <gdk/gdkmemorytextureprivate.h>
#include <gdk/gdkprofilerprivate.h>
#include <gdk/gdktexturedownloaderprivate.h>
#include <gsk/gskdebugprivate.h>
#include <gsk/gskroundedrectprivate.h>
@@ -403,6 +403,7 @@ gsk_gl_command_queue_dispose (GObject *object)
gsk_gl_command_batches_clear (&self->batches);
gsk_gl_command_binds_clear (&self->batch_binds);
gsk_gl_command_uniforms_clear (&self->batch_uniforms);
gsk_gl_syncs_clear (&self->syncs);
gsk_gl_buffer_destroy (&self->vertices);
@@ -425,6 +426,7 @@ gsk_gl_command_queue_init (GskGLCommandQueue *self)
gsk_gl_command_batches_init (&self->batches, 128);
gsk_gl_command_binds_init (&self->batch_binds, 1024);
gsk_gl_command_uniforms_init (&self->batch_uniforms, 2048);
gsk_gl_syncs_init (&self->syncs, 10);
gsk_gl_buffer_init (&self->vertices, GL_ARRAY_BUFFER, sizeof (GskGLDrawVertex));
}
@@ -1098,17 +1100,25 @@ gsk_gl_command_queue_execute (GskGLCommandQueue *self,
if G_UNLIKELY (batch->draw.bind_count > 0)
{
const GskGLCommandBind *bind = &self->batch_binds.items[batch->draw.bind_offset];
for (guint i = 0; i < batch->draw.bind_count; i++)
{
if (textures[bind->texture] != bind->id)
{
GskGLSync *s;
if (active != bind->texture)
{
active = bind->texture;
glActiveTexture (GL_TEXTURE0 + bind->texture);
}
s = gsk_gl_syncs_get_sync (&self->syncs, bind->id);
if (s && s->sync)
{
glWaitSync ((GLsync) s->sync, 0, GL_TIMEOUT_IGNORED);
s->sync = NULL;
}
glBindTexture (GL_TEXTURE_2D, bind->id);
textures[bind->texture] = bind->id;
}
@@ -1236,6 +1246,7 @@ gsk_gl_command_queue_end_frame (GskGLCommandQueue *self)
self->batches.len = 0;
self->batch_binds.len = 0;
self->batch_uniforms.len = 0;
self->syncs.len = 0;
self->n_uploads = 0;
self->tail_batch_index = -1;
self->in_frame = FALSE;
@@ -1359,8 +1370,7 @@ gsk_gl_command_queue_do_upload_texture (GskGLCommandQueue *self,
GdkGLContext *context;
const guchar *data;
gsize stride;
GBytes *bytes;
GdkTextureDownloader downloader;
GdkMemoryTexture *memtex;
GdkMemoryFormat data_format;
int width, height;
GLenum gl_internalformat;
@@ -1395,11 +1405,9 @@ gsk_gl_command_queue_do_upload_texture (GskGLCommandQueue *self,
}
}
gdk_texture_downloader_init (&downloader, texture);
gdk_texture_downloader_set_format (&downloader, data_format);
bytes = gdk_texture_downloader_download_bytes (&downloader, &stride);
gdk_texture_downloader_finish (&downloader);
data = g_bytes_get_data (bytes, NULL);
memtex = gdk_memory_texture_from_texture (texture, data_format);
data = gdk_memory_texture_get_data (memtex);
stride = gdk_memory_texture_get_stride (memtex);
bpp = gdk_memory_format_bytes_per_pixel (data_format);
glPixelStorei (GL_UNPACK_ALIGNMENT, gdk_memory_format_alignment (data_format));
@@ -1429,7 +1437,7 @@ gsk_gl_command_queue_do_upload_texture (GskGLCommandQueue *self,
}
glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
g_bytes_unref (bytes);
g_object_unref (memtex);
}
int
+39
View File
@@ -167,9 +167,15 @@ typedef union _GskGLCommandBatch
G_STATIC_ASSERT (sizeof (GskGLCommandBatch) == 32);
typedef struct _GskGLSync {
guint id;
gpointer sync;
} GskGLSync;
DEFINE_INLINE_ARRAY (GskGLCommandBatches, gsk_gl_command_batches, GskGLCommandBatch)
DEFINE_INLINE_ARRAY (GskGLCommandBinds, gsk_gl_command_binds, GskGLCommandBind)
DEFINE_INLINE_ARRAY (GskGLCommandUniforms, gsk_gl_command_uniforms, GskGLCommandUniform)
DEFINE_INLINE_ARRAY (GskGLSyncs, gsk_gl_syncs, GskGLSync)
struct _GskGLCommandQueue
{
@@ -225,6 +231,8 @@ struct _GskGLCommandQueue
*/
GskGLCommandUniforms batch_uniforms;
GskGLSyncs syncs;
/* Discovered max texture size when loading the command queue so that we
* can either scale down or slice textures to fit within this size. Assumed
* to be both height and width.
@@ -354,6 +362,37 @@ gsk_gl_command_queue_bind_framebuffer (GskGLCommandQueue *self,
return ret;
}
static inline GskGLSync *
gsk_gl_syncs_get_sync (GskGLSyncs *syncs,
guint id)
{
for (unsigned int i = 0; i < syncs->len; i++)
{
GskGLSync *sync = &syncs->items[i];
if (sync->id == id)
return sync;
}
return NULL;
}
static inline void
gsk_gl_syncs_add_sync (GskGLSyncs *syncs,
guint id,
gpointer sync)
{
GskGLSync *s;
s = gsk_gl_syncs_get_sync (syncs, id);
if (s)
g_assert (s->sync == sync);
else
{
s = gsk_gl_syncs_append (syncs);
s->id = id;
s->sync = sync;
}
}
G_END_DECLS
#endif /* __GSK_GL_COMMAND_QUEUE_PRIVATE_H__ */
+12 -6
View File
@@ -35,6 +35,7 @@
#include "gskgliconlibraryprivate.h"
#include "gskglprogramprivate.h"
#include "gskglshadowlibraryprivate.h"
#include "gskgltextureprivate.h"
#include "fp16private.h"
#include <gdk/gdkglcontextprivate.h>
@@ -1328,6 +1329,7 @@ typedef struct _GskGLTextureState
{
GdkGLContext *context;
GLuint texture_id;
GLsync sync;
} GskGLTextureState;
static void
@@ -1340,6 +1342,7 @@ create_texture_from_texture_destroy (gpointer data)
gdk_gl_context_make_current (state->context);
glDeleteTextures (1, &state->texture_id);
glDeleteSync (state->sync);
g_clear_object (&state->context);
g_slice_free (GskGLTextureState, state);
}
@@ -1374,10 +1377,13 @@ gsk_gl_driver_create_gdk_texture (GskGLDriver *self,
texture->texture_id = 0;
gsk_gl_texture_free (texture);
return gdk_gl_texture_new (self->command_queue->context,
texture_id,
width,
height,
create_texture_from_texture_destroy,
state);
state->sync = glFenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
return gdk_gl_texture_new_with_sync (self->command_queue->context,
texture_id,
state->sync,
width,
height,
create_texture_from_texture_destroy,
state);
}
+21
View File
@@ -264,6 +264,27 @@ gsk_gl_program_set_uniform_texture (GskGLProgram *self,
texture_slot);
}
static inline void
gsk_gl_program_set_uniform_texture_with_sync (GskGLProgram *self,
guint key,
guint stamp,
GLenum texture_target,
GLenum texture_slot,
guint texture_id,
gpointer sync)
{
gsk_gl_attachment_state_bind_texture (self->driver->command_queue->attachments,
texture_target,
texture_slot,
texture_id);
gsk_gl_uniform_state_set_texture (self->uniforms,
self->program_info,
key,
stamp,
texture_slot);
gsk_gl_syncs_add_sync (&self->driver->command_queue->syncs, texture_id, sync);
}
static inline void
gsk_gl_program_set_uniform_matrix (GskGLProgram *self,
guint key,
+1 -2
View File
@@ -62,8 +62,7 @@ GSK_GL_DEFINE_PROGRAM (linear_gradient,
GSK_GL_DEFINE_PROGRAM (mask,
GSK_GL_SHADER_SINGLE (GSK_GL_SHADER_RESOURCE ("mask.glsl")),
GSK_GL_ADD_UNIFORM (1, MASK_SOURCE, u_mask)
GSK_GL_ADD_UNIFORM (2, MASK_MODE, u_mode))
GSK_GL_ADD_UNIFORM (1, MASK_SOURCE, u_mask))
GSK_GL_DEFINE_PROGRAM (outset_shadow,
GSK_GL_SHADER_SINGLE (GSK_GL_SHADER_RESOURCE ("outset_shadow.glsl")),
+19 -13
View File
@@ -190,6 +190,7 @@ typedef struct _GskGLRenderOffscreen
/* Return location for texture ID */
guint texture_id;
gpointer sync;
/* Whether to force creating a new texture, even if the
* input already is a texture
@@ -3278,8 +3279,8 @@ gsk_gl_render_job_visit_blend_node (GskGLRenderJob *job,
}
static inline void
gsk_gl_render_job_visit_mask_node (GskGLRenderJob *job,
const GskRenderNode *node)
gsk_gl_render_job_visit_mask_node (GskGLRenderJob *job,
const GskRenderNode *node)
{
const GskRenderNode *source = gsk_mask_node_get_source (node);
const GskRenderNode *mask = gsk_mask_node_get_mask (node);
@@ -3293,7 +3294,6 @@ gsk_gl_render_job_visit_mask_node (GskGLRenderJob *job,
mask_offscreen.bounds = &node->bounds;
mask_offscreen.force_offscreen = TRUE;
mask_offscreen.reset_clip = TRUE;
mask_offscreen.do_not_cache = TRUE;
/* TODO: We create 2 textures here as big as the mask node, but both
* nodes might be a lot smaller than that.
@@ -3324,9 +3324,6 @@ gsk_gl_render_job_visit_mask_node (GskGLRenderJob *job,
GL_TEXTURE_2D,
GL_TEXTURE1,
mask_offscreen.texture_id);
gsk_gl_program_set_uniform1i (job->current_program,
UNIFORM_MASK_MODE, 0,
gsk_mask_node_get_mask_mode (node));
gsk_gl_render_job_draw_offscreen_rect (job, &node->bounds);
gsk_gl_render_job_end_draw (job);
}
@@ -3501,12 +3498,17 @@ gsk_gl_render_job_upload_texture (GskGLRenderJob *job,
int mag_filter,
GskGLRenderOffscreen *offscreen)
{
GdkGLTexture *gl_texture = NULL;
if (GDK_IS_GL_TEXTURE (texture))
gl_texture = (GdkGLTexture *) texture;
if (min_filter == GL_LINEAR &&
mag_filter == GL_LINEAR &&
gsk_gl_texture_library_can_cache ((GskGLTextureLibrary *)job->driver->icons_library,
texture->width,
texture->height) &&
!GDK_IS_GL_TEXTURE (texture))
!gl_texture)
{
const GskGLIconData *icon_data;
@@ -3518,6 +3520,9 @@ gsk_gl_render_job_upload_texture (GskGLRenderJob *job,
{
offscreen->texture_id = gsk_gl_driver_load_texture (job->driver, texture, min_filter, mag_filter);
init_full_texture_region (offscreen);
if (gl_texture && offscreen->texture_id == gdk_gl_texture_get_id (gl_texture) &&
gdk_gl_texture_get_context (gl_texture) != gsk_gl_command_queue_get_context (job->command_queue))
offscreen->sync = gdk_gl_texture_get_sync (gl_texture);
}
}
@@ -3539,11 +3544,12 @@ gsk_gl_render_job_visit_texture (GskGLRenderJob *job,
g_assert (offscreen.was_offscreen == FALSE);
gsk_gl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, blit));
gsk_gl_program_set_uniform_texture (job->current_program,
UNIFORM_SHARED_SOURCE, 0,
GL_TEXTURE_2D,
GL_TEXTURE0,
offscreen.texture_id);
gsk_gl_program_set_uniform_texture_with_sync (job->current_program,
UNIFORM_SHARED_SOURCE, 0,
GL_TEXTURE_2D,
GL_TEXTURE0,
offscreen.texture_id,
offscreen.sync);
gsk_gl_render_job_draw_offscreen (job, bounds, &offscreen);
gsk_gl_render_job_end_draw (job);
}
@@ -3691,8 +3697,8 @@ gsk_gl_render_job_visit_texture_scale_node (GskGLRenderJob *job,
gsk_gl_render_job_end_draw (job);
}
else
slice:
{
slice:
float min_x = bounds->origin.x;
float min_y = bounds->origin.y;
float max_x = min_x + bounds->size.width;
+1 -15
View File
@@ -10,24 +10,10 @@ void main() {
// FRAGMENT_SHADER:
// mask.glsl
uniform int u_mode;
uniform sampler2D u_mask;
void main() {
vec4 source = GskTexture(u_source, vUv);
vec4 mask = GskTexture(u_mask, vUv);
float mask_value;
if (u_mode == 0)
mask_value = mask.a;
else if (u_mode == 1)
mask_value = 1.0 - mask.a;
else if (u_mode == 2)
mask_value = (0.2126 * mask.r + 0.7152 * mask.g + 0.0722 * mask.b) * mask.a;
else if (u_mode == 3)
mask_value = 1.0 - (0.2126 * mask.r + 0.7152 * mask.g + 0.0722 * mask.b) * mask.a;
else
mask_value = 0.0;
gskSetOutputColor(vec4 (source * mask_value));
gskSetOutputColor(vec4 (source * mask.a));
}
+5 -25
View File
@@ -35,6 +35,7 @@
* @GSK_CONIC_GRADIENT_NODE: A node drawing a conic gradient
* @GSK_BORDER_NODE: A node stroking a border around an area
* @GSK_TEXTURE_NODE: A node drawing a `GdkTexture`
* @GSK_TEXTURE_SCALE_NODE: A node drawing a `GdkTexture` scaled and filtered
* @GSK_INSET_SHADOW_NODE: A node drawing an inset shadow
* @GSK_OUTSET_SHADOW_NODE: A node drawing an outset shadow
* @GSK_TRANSFORM_NODE: A node that renders its child after applying a matrix transform
@@ -45,13 +46,12 @@
* @GSK_ROUNDED_CLIP_NODE: A node that clips its child to a rounded rectangle
* @GSK_SHADOW_NODE: A node that draws a shadow below its child
* @GSK_BLEND_NODE: A node that blends two children together
* @GSK_MASK_NODE: A node that masks one child with another
* @GSK_CROSS_FADE_NODE: A node that cross-fades between two children
* @GSK_TEXT_NODE: A node containing a glyph string
* @GSK_BLUR_NODE: A node that applies a blur
* @GSK_DEBUG_NODE: Debug information that does not affect the rendering
* @GSK_GL_SHADER_NODE: A node that uses OpenGL fragment shaders to render
* @GSK_TEXTURE_SCALE_NODE: A node drawing a `GdkTexture` scaled and filtered (Since: 4.10)
* @GSK_MASK_NODE: A node that masks one child with another (Since: 4.10)
* The type of a node determines what the node is rendering.
*/
@@ -67,6 +67,7 @@ typedef enum {
GSK_CONIC_GRADIENT_NODE,
GSK_BORDER_NODE,
GSK_TEXTURE_NODE,
GSK_TEXTURE_SCALE_NODE,
GSK_INSET_SHADOW_NODE,
GSK_OUTSET_SHADOW_NODE,
GSK_TRANSFORM_NODE,
@@ -77,13 +78,12 @@ typedef enum {
GSK_ROUNDED_CLIP_NODE,
GSK_SHADOW_NODE,
GSK_BLEND_NODE,
GSK_MASK_NODE,
GSK_CROSS_FADE_NODE,
GSK_TEXT_NODE,
GSK_BLUR_NODE,
GSK_DEBUG_NODE,
GSK_GL_SHADER_NODE,
GSK_TEXTURE_SCALE_NODE,
GSK_MASK_NODE
GSK_GL_SHADER_NODE
} GskRenderNodeType;
/**
@@ -255,25 +255,5 @@ typedef enum
GSK_GL_UNIFORM_TYPE_VEC4,
} GskGLUniformType;
/**
* GskMaskMode:
* @GSK_MASK_MODE_ALPHA: Use the alpha channel of the mask
* @GSK_MASK_MODE_INVERTED_ALPHA: Use the inverted alpha channel of the mask
* @GSK_MASK_MODE_LUMINANCE: Use the luminance of the mask,
* multiplied by mask alpha
* @GSK_MASK_MODE_INVERTED_LUMINANCE: Use the inverted luminance of the mask,
* multiplied by mask alpha
*
* The mask modes available for mask nodes.
*
* Since: 4.10
*/
typedef enum
{
GSK_MASK_MODE_ALPHA,
GSK_MASK_MODE_INVERTED_ALPHA,
GSK_MASK_MODE_LUMINANCE,
GSK_MASK_MODE_INVERTED_LUMINANCE
} GskMaskMode;
#endif /* __GSK_TYPES_H__ */
+1 -4
View File
@@ -535,14 +535,11 @@ GDK_AVAILABLE_IN_4_10
GType gsk_mask_node_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_4_10
GskRenderNode * gsk_mask_node_new (GskRenderNode *source,
GskRenderNode *mask,
GskMaskMode mask_mode);
GskRenderNode *mask);
GDK_AVAILABLE_IN_4_10
GskRenderNode * gsk_mask_node_get_source (const GskRenderNode *node);
GDK_AVAILABLE_IN_4_10
GskRenderNode * gsk_mask_node_get_mask (const GskRenderNode *node);
GDK_AVAILABLE_IN_4_10
GskMaskMode gsk_mask_node_get_mask_mode (const GskRenderNode *node);
GDK_AVAILABLE_IN_ALL
GType gsk_gl_shader_node_get_type (void) G_GNUC_CONST;
+29 -114
View File
@@ -1588,8 +1588,6 @@ gsk_texture_node_new (GdkTexture *texture,
* GskTextureScaleNode:
*
* A render node for a `GdkTexture`.
*
* Since: 4.10
*/
struct _GskTextureScaleNode
{
@@ -1691,7 +1689,7 @@ gsk_texture_scale_node_diff (GskRenderNode *node1,
/**
* gsk_texture_scale_node_get_texture:
* @node: (type GskTextureScaleNode): a `GskRenderNode` of type %GSK_TEXTURE_SCALE_NODE
* @node: (type GskTextureNode): a `GskRenderNode` of type %GSK_TEXTURE_SCALE_NODE
*
* Retrieves the `GdkTexture` used when creating this `GskRenderNode`.
*
@@ -1709,7 +1707,7 @@ gsk_texture_scale_node_get_texture (const GskRenderNode *node)
/**
* gsk_texture_scale_node_get_filter:
* @node: (type GskTextureScaleNode): a `GskRenderNode` of type %GSK_TEXTURE_SCALE_NODE
* @node: (type GskTextureNode): a `GskRenderNode` of type %GSK_TEXTURE_SCALE_NODE
*
* Retrieves the `GskScalingFilter` used when creating this `GskRenderNode`.
*
@@ -3412,18 +3410,29 @@ gsk_color_matrix_node_finalize (GskRenderNode *node)
}
static void
apply_color_matrix_to_pattern (cairo_pattern_t *pattern,
const graphene_matrix_t *color_matrix,
const graphene_vec4_t *color_offset,
gboolean multiply_alpha)
gsk_color_matrix_node_draw (GskRenderNode *node,
cairo_t *cr)
{
GskColorMatrixNode *self = (GskColorMatrixNode *) node;
cairo_pattern_t *pattern;
cairo_surface_t *surface, *image_surface;
graphene_vec4_t pixel;
guint32* pixel_data;
guchar *data;
gsize x, y, width, height, stride;
float alpha;
graphene_vec4_t pixel;
guint32* pixel_data;
cairo_save (cr);
/* clip so the push_group() creates a smaller surface */
gsk_cairo_rectangle (cr, &node->bounds);
cairo_clip (cr);
cairo_push_group (cr);
gsk_render_node_draw (self->child, cr);
pattern = cairo_pop_group (cr);
cairo_pattern_get_surface (pattern, &surface);
image_surface = cairo_surface_map_to_image (surface, NULL);
@@ -3450,20 +3459,12 @@ apply_color_matrix_to_pattern (cairo_pattern_t *pattern,
((pixel_data[x] >> 8) & 0xFF) / (255.0 * alpha),
( pixel_data[x] & 0xFF) / (255.0 * alpha),
alpha);
graphene_matrix_transform_vec4 (color_matrix, &pixel, &pixel);
graphene_matrix_transform_vec4 (&self->color_matrix, &pixel, &pixel);
}
if (multiply_alpha)
graphene_vec4_init (&pixel,
graphene_vec4_get_x (&pixel),
graphene_vec4_get_y (&pixel),
graphene_vec4_get_z (&pixel),
alpha * graphene_vec4_get_w (&pixel));
graphene_vec4_add (&pixel, color_offset, &pixel);
graphene_vec4_add (&pixel, &self->color_offset, &pixel);
alpha = graphene_vec4_get_w (&pixel);
if (alpha > 0.0)
{
alpha = MIN (alpha, 1.0);
@@ -3482,28 +3483,6 @@ apply_color_matrix_to_pattern (cairo_pattern_t *pattern,
cairo_surface_mark_dirty (image_surface);
cairo_surface_unmap_image (surface, image_surface);
}
static void
gsk_color_matrix_node_draw (GskRenderNode *node,
cairo_t *cr)
{
GskColorMatrixNode *self = (GskColorMatrixNode *) node;
cairo_pattern_t *pattern;
cairo_save (cr);
/* clip so the push_group() creates a smaller surface */
gsk_cairo_rectangle (cr, &node->bounds);
cairo_clip (cr);
cairo_push_group (cr);
gsk_render_node_draw (self->child, cr);
pattern = cairo_pop_group (cr);
apply_color_matrix_to_pattern (pattern, &self->color_matrix, &self->color_offset, FALSE);
cairo_set_source (cr, pattern);
cairo_paint (cr);
@@ -5223,7 +5202,6 @@ struct _GskMaskNode
GskRenderNode *mask;
GskRenderNode *source;
GskMaskMode mask_mode;
};
static void
@@ -5241,8 +5219,6 @@ gsk_mask_node_draw (GskRenderNode *node,
{
GskMaskNode *self = (GskMaskNode *) node;
cairo_pattern_t *mask_pattern;
graphene_matrix_t color_matrix;
graphene_vec4_t color_offset;
cairo_push_group (cr);
gsk_render_node_draw (self->source, cr);
@@ -5252,41 +5228,6 @@ gsk_mask_node_draw (GskRenderNode *node,
gsk_render_node_draw (self->mask, cr);
mask_pattern = cairo_pop_group (cr);
switch (self->mask_mode)
{
case GSK_MASK_MODE_ALPHA:
break;
case GSK_MASK_MODE_INVERTED_ALPHA:
graphene_matrix_init_from_float (&color_matrix, (float[]){ 1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, -1 });
graphene_vec4_init (&color_offset, 0, 0, 0, 1);
apply_color_matrix_to_pattern (mask_pattern, &color_matrix, &color_offset, FALSE);
break;
case GSK_MASK_MODE_LUMINANCE:
graphene_matrix_init_from_float (&color_matrix, (float[]){ 1, 0, 0, 0.2126,
0, 1, 0, 0.7152,
0, 0, 1, 0.0722,
0, 0, 0, 0 });
graphene_vec4_init (&color_offset, 0, 0, 0, 0);
apply_color_matrix_to_pattern (mask_pattern, &color_matrix, &color_offset, TRUE);
break;
case GSK_MASK_MODE_INVERTED_LUMINANCE:
graphene_matrix_init_from_float (&color_matrix, (float[]){ 1, 0, 0, -0.2126,
0, 1, 0, -0.7152,
0, 0, 1, -0.0722,
0, 0, 0, 0 });
graphene_vec4_init (&color_offset, 0, 0, 0, 1);
apply_color_matrix_to_pattern (mask_pattern, &color_matrix, &color_offset, TRUE);
break;
default:
g_assert_not_reached ();
}
gsk_cairo_rectangle (cr, &node->bounds);
cairo_clip (cr);
cairo_mask (cr, mask_pattern);
}
@@ -5304,15 +5245,11 @@ gsk_mask_node_diff (GskRenderNode *node1,
/**
* gsk_mask_node_new:
* @source: The source node to be drawn
* @mask: The node to be used as mask
* @mask_mode: The mask mode to use
* @source: The bottom node to be drawn
* @mask: The node to be blended onto the @bottom node
*
* Creates a `GskRenderNode` that will mask a given node by another.
*
* The @mask_mode determines how the 'mask values' are derived from
* the colors of the @mask. Applying the mask consists of multiplying
* the 'mask value' with the alpha of the source.
* Creates a `GskRenderNode` that will use @blend_mode to blend the @top
* node onto the @bottom node.
*
* Returns: (transfer full) (type GskMaskNode): A new `GskRenderNode`
*
@@ -5320,8 +5257,7 @@ gsk_mask_node_diff (GskRenderNode *node1,
*/
GskRenderNode *
gsk_mask_node_new (GskRenderNode *source,
GskRenderNode *mask,
GskMaskMode mask_mode)
GskRenderNode *mask)
{
GskMaskNode *self;
@@ -5331,18 +5267,15 @@ gsk_mask_node_new (GskRenderNode *source,
self = gsk_render_node_alloc (GSK_MASK_NODE);
self->source = gsk_render_node_ref (source);
self->mask = gsk_render_node_ref (mask);
self->mask_mode = mask_mode;
self->render_node.bounds = source->bounds;
self->render_node.prefers_high_depth = gsk_render_node_prefers_high_depth (source);
graphene_rect_union (&source->bounds, &mask->bounds, &self->render_node.bounds);
return &self->render_node;
}
/**
* gsk_mask_node_get_source:
* @node: (type GskMaskNode): a mask `GskRenderNode`
* @node: (type GskBlendNode): a mask `GskRenderNode`
*
* Retrieves the source `GskRenderNode` child of the @node.
*
@@ -5362,7 +5295,7 @@ gsk_mask_node_get_source (const GskRenderNode *node)
/**
* gsk_mask_node_get_mask:
* @node: (type GskMaskNode): a mask `GskRenderNode`
* @node: (type GskBlendNode): a mask `GskRenderNode`
*
* Retrieves the mask `GskRenderNode` child of the @node.
*
@@ -5380,24 +5313,6 @@ gsk_mask_node_get_mask (const GskRenderNode *node)
return self->mask;
}
/**
* gsk_mask_node_get_mask_mode:
* @node: (type GskMaskNode): a blending `GskRenderNode`
*
* Retrieves the mask mode used by @node.
*
* Returns: the mask mode
*
* Since: 4.10
*/
GskMaskMode
gsk_mask_node_get_mask_mode (const GskRenderNode *node)
{
const GskMaskNode *self = (const GskMaskNode *) node;
return self->mask_mode;
}
/* }}} */
/* {{{ GSK_DEBUG_NODE */
+10 -70
View File
@@ -623,8 +623,6 @@ parse_scaling_filter (GtkCssParser *parser,
}
}
gtk_css_parser_error_syntax (parser, "Not a valid scaling filter.");
return FALSE;
}
@@ -651,18 +649,6 @@ static const struct
{ GSK_BLEND_MODE_LUMINOSITY, "luminosity" }
};
static const char *
get_blend_mode_name (GskBlendMode mode)
{
for (unsigned int i = 0; i < G_N_ELEMENTS (blend_modes); i++)
{
if (blend_modes[i].mode == mode)
return blend_modes[i].name;
}
return NULL;
}
static gboolean
parse_blend_mode (GtkCssParser *parser,
gpointer out_mode)
@@ -678,51 +664,6 @@ parse_blend_mode (GtkCssParser *parser,
}
}
gtk_css_parser_error_syntax (parser, "Not a valid blend mode.");
return FALSE;
}
static const struct
{
GskMaskMode mode;
const char *name;
} mask_modes[] = {
{ GSK_MASK_MODE_ALPHA, "alpha" },
{ GSK_MASK_MODE_INVERTED_ALPHA, "inverted-alpha" },
{ GSK_MASK_MODE_LUMINANCE, "luminance" },
{ GSK_MASK_MODE_INVERTED_LUMINANCE, "inverted-luminance" },
};
static const char *
get_mask_mode_name (GskMaskMode mode)
{
for (unsigned int i = 0; i < G_N_ELEMENTS (mask_modes); i++)
{
if (mask_modes[i].mode == mode)
return mask_modes[i].name;
}
return NULL;
}
static gboolean
parse_mask_mode (GtkCssParser *parser,
gpointer out_mode)
{
guint i;
for (i = 0; i < G_N_ELEMENTS (mask_modes); i++)
{
if (gtk_css_parser_try_ident (parser, mask_modes[i].name))
{
*(GskMaskMode *) out_mode = mask_modes[i].mode;
return TRUE;
}
}
gtk_css_parser_error_syntax (parser, "Not a valid mask mode.");
return FALSE;
}
@@ -1440,9 +1381,7 @@ parse_mask_node (GtkCssParser *parser)
{
GskRenderNode *source = NULL;
GskRenderNode *mask = NULL;
GskMaskMode mode = GSK_MASK_MODE_ALPHA;
const Declaration declarations[] = {
{ "mode", parse_mask_mode, NULL, &mode },
{ "source", parse_node, clear_node, &source },
{ "mask", parse_node, clear_node, &mask },
};
@@ -1454,7 +1393,7 @@ parse_mask_node (GtkCssParser *parser)
if (mask == NULL)
mask = gsk_color_node_new (&GDK_RGBA("AAFF00"), &GRAPHENE_RECT_INIT (0, 0, 50, 50));
result = gsk_mask_node_new (source, mask, mode);
result = gsk_mask_node_new (source, mask);
gsk_render_node_unref (source);
gsk_render_node_unref (mask);
@@ -3164,13 +3103,21 @@ render_node_print (Printer *p,
case GSK_BLEND_NODE:
{
GskBlendMode mode = gsk_blend_node_get_blend_mode (node);
guint i;
start_node (p, "blend");
if (mode != GSK_BLEND_MODE_DEFAULT)
{
_indent (p);
g_string_append_printf (p->str, "mode: %s;\n", get_blend_mode_name (mode));
for (i = 0; i < G_N_ELEMENTS (blend_modes); i++)
{
if (blend_modes[i].mode == mode)
{
g_string_append_printf (p->str, "mode: %s;\n", blend_modes[i].name);
break;
}
}
}
append_node_param (p, "bottom", gsk_blend_node_get_bottom_child (node));
append_node_param (p, "top", gsk_blend_node_get_top_child (node));
@@ -3181,15 +3128,8 @@ render_node_print (Printer *p,
case GSK_MASK_NODE:
{
GskMaskMode mode = gsk_mask_node_get_mask_mode (node);
start_node (p, "mask");
if (mode != GSK_MASK_MODE_ALPHA)
{
_indent (p);
g_string_append_printf (p->str, "mode: %s;\n", get_mask_mode_name (mode));
}
append_node_param (p, "source", gsk_mask_node_get_source (node));
append_node_param (p, "mask", gsk_mask_node_get_mask (node));
+1 -1
View File
@@ -13,7 +13,7 @@ typedef struct _GskRenderNodeClass GskRenderNodeClass;
* We don't add an "n-types" value to avoid having to handle
* it in every single switch.
*/
#define GSK_RENDER_NODE_TYPE_N_TYPES (GSK_MASK_NODE + 1)
#define GSK_RENDER_NODE_TYPE_N_TYPES (GSK_GL_SHADER_NODE + 1)
extern GType gsk_render_node_types[];
-74
View File
@@ -60,16 +60,12 @@
*
* `GtkAssistant` has a single CSS node with the name window and style
* class .assistant.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
/**
* GtkAssistantPage:
*
* `GtkAssistantPage` is an auxiliary object used by `GtkAssistant.
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
#include "config.h"
@@ -279,8 +275,6 @@ gtk_assistant_page_class_init (GtkAssistantPageClass *class)
* GtkAssistantPage:page-type:
*
* The type of the assistant page.
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
g_object_class_install_property (object_class,
CHILD_PROP_PAGE_TYPE,
@@ -293,8 +287,6 @@ gtk_assistant_page_class_init (GtkAssistantPageClass *class)
* GtkAssistantPage:title:
*
* The title of the page.
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
g_object_class_install_property (object_class,
CHILD_PROP_PAGE_TITLE,
@@ -309,8 +301,6 @@ gtk_assistant_page_class_init (GtkAssistantPageClass *class)
*
* GTK uses this information to control the sensitivity
* of the navigation buttons.
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
g_object_class_install_property (object_class,
CHILD_PROP_PAGE_COMPLETE,
@@ -322,8 +312,6 @@ gtk_assistant_page_class_init (GtkAssistantPageClass *class)
* GtkAssistantPage:child:
*
* The child widget.
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
g_object_class_install_property (object_class,
CHILD_PROP_CHILD,
@@ -530,8 +518,6 @@ gtk_assistant_class_init (GtkAssistantClass *class)
* @assistant: the `GtkAssistant`
*
* Emitted when then the cancel button is clicked.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
signals[CANCEL] =
g_signal_new (I_("cancel"),
@@ -552,8 +538,6 @@ gtk_assistant_class_init (GtkAssistantClass *class)
*
* A handler for this signal can do any preparations which are
* necessary before showing @page.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
signals[PREPARE] =
g_signal_new (I_("prepare"),
@@ -579,8 +563,6 @@ gtk_assistant_class_init (GtkAssistantClass *class)
* %GTK_ASSISTANT_PAGE_PROGRESS after the confirmation page and handle
* this operation within the [signal@Gtk.Assistant::prepare] signal of
* the progress page.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
signals[APPLY] =
g_signal_new (I_("apply"),
@@ -598,8 +580,6 @@ gtk_assistant_class_init (GtkAssistantClass *class)
* Emitted either when the close button of a summary page is clicked,
* or when the apply button in the last page in the flow (of type
* %GTK_ASSISTANT_PAGE_CONFIRM) is clicked.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
signals[CLOSE] =
g_signal_new (I_("close"),
@@ -615,8 +595,6 @@ gtk_assistant_class_init (GtkAssistantClass *class)
* @assistant: the `GtkAssistant`
*
* The action signal for the Escape binding.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
signals[ESCAPE] =
g_signal_new_class_handler (I_("escape"),
@@ -640,8 +618,6 @@ gtk_assistant_class_init (GtkAssistantClass *class)
*
* For technical reasons, this property is declared as an integer
* property, but you should only set it to %TRUE or %FALSE.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
g_object_class_install_property (gobject_class,
PROP_USE_HEADER_BAR,
@@ -1459,8 +1435,6 @@ gtk_assistant_close_request (GtkWindow *window)
* Creates a new `GtkAssistant`.
*
* Returns: a newly created `GtkAssistant`
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
GtkWidget*
gtk_assistant_new (void)
@@ -1481,8 +1455,6 @@ gtk_assistant_new (void)
* Returns: The index (starting from 0) of the current
* page in the @assistant, or -1 if the @assistant has no pages,
* or no current page
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
int
gtk_assistant_get_current_page (GtkAssistant *assistant)
@@ -1508,8 +1480,6 @@ gtk_assistant_get_current_page (GtkAssistant *assistant)
* Note that this will only be necessary in custom buttons,
* as the @assistant flow can be set with
* gtk_assistant_set_forward_page_func().
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_set_current_page (GtkAssistant *assistant,
@@ -1555,8 +1525,6 @@ gtk_assistant_set_current_page (GtkAssistant *assistant,
*
* This function is for use when creating pages of the
* %GTK_ASSISTANT_PAGE_CUSTOM type.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_next_page (GtkAssistant *assistant)
@@ -1580,8 +1548,6 @@ gtk_assistant_next_page (GtkAssistant *assistant)
*
* This function is for use when creating pages of the
* %GTK_ASSISTANT_PAGE_CUSTOM type.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_previous_page (GtkAssistant *assistant)
@@ -1615,8 +1581,6 @@ gtk_assistant_previous_page (GtkAssistant *assistant)
* Returns the number of pages in the @assistant
*
* Returns: the number of pages in the @assistant
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
int
gtk_assistant_get_n_pages (GtkAssistant *assistant)
@@ -1636,8 +1600,6 @@ gtk_assistant_get_n_pages (GtkAssistant *assistant)
*
* Returns: (nullable) (transfer none): the child widget, or %NULL
* if @page_num is out of bounds
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
GtkWidget*
gtk_assistant_get_nth_page (GtkAssistant *assistant,
@@ -1670,8 +1632,6 @@ gtk_assistant_get_nth_page (GtkAssistant *assistant,
* Prepends a page to the @assistant.
*
* Returns: the index (starting at 0) of the inserted page
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
int
gtk_assistant_prepend_page (GtkAssistant *assistant,
@@ -1691,8 +1651,6 @@ gtk_assistant_prepend_page (GtkAssistant *assistant,
* Appends a page to the @assistant.
*
* Returns: the index (starting at 0) of the inserted page
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
int
gtk_assistant_append_page (GtkAssistant *assistant,
@@ -1714,8 +1672,6 @@ gtk_assistant_append_page (GtkAssistant *assistant,
* Inserts a page in the @assistant at a given position.
*
* Returns: the index (starting from 0) of the inserted page
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
int
gtk_assistant_insert_page (GtkAssistant *assistant,
@@ -1814,8 +1770,6 @@ gtk_assistant_add_page (GtkAssistant *assistant,
* or -1 to remove the last page
*
* Removes the @page_nums page from @assistant.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_remove_page (GtkAssistant *assistant,
@@ -1851,8 +1805,6 @@ gtk_assistant_remove_page (GtkAssistant *assistant,
* Setting @page_func to %NULL will make the assistant to
* use the default forward function, which just goes to the
* next visible page.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_set_forward_page_func (GtkAssistant *assistant,
@@ -1901,8 +1853,6 @@ add_to_action_area (GtkAssistant *assistant,
* @child: a `GtkWidget`
*
* Adds a widget to the action area of a `GtkAssistant`.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_add_action_widget (GtkAssistant *assistant,
@@ -1931,8 +1881,6 @@ gtk_assistant_add_action_widget (GtkAssistant *assistant,
* @child: a `GtkWidget`
*
* Removes a widget from the action area of a `GtkAssistant`.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_remove_action_widget (GtkAssistant *assistant,
@@ -1962,8 +1910,6 @@ gtk_assistant_remove_action_widget (GtkAssistant *assistant,
*
* The title is displayed in the header area of the assistant
* when @page is the current page.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_set_page_title (GtkAssistant *assistant,
@@ -1993,8 +1939,6 @@ gtk_assistant_set_page_title (GtkAssistant *assistant,
* Gets the title for @page.
*
* Returns: the title for @page
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
const char *
gtk_assistant_get_page_title (GtkAssistant *assistant,
@@ -2024,8 +1968,6 @@ gtk_assistant_get_page_title (GtkAssistant *assistant,
* Sets the page type for @page.
*
* The page type determines the page behavior in the @assistant.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_set_page_type (GtkAssistant *assistant,
@@ -2055,8 +1997,6 @@ gtk_assistant_set_page_type (GtkAssistant *assistant,
* Gets the page type of @page.
*
* Returns: the page type of @page
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
GtkAssistantPageType
gtk_assistant_get_page_type (GtkAssistant *assistant,
@@ -2087,8 +2027,6 @@ gtk_assistant_get_page_type (GtkAssistant *assistant,
*
* This will make @assistant update the buttons state
* to be able to continue the task.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_set_page_complete (GtkAssistant *assistant,
@@ -2118,8 +2056,6 @@ gtk_assistant_set_page_complete (GtkAssistant *assistant,
* Gets whether @page is complete.
*
* Returns: %TRUE if @page is complete.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
gboolean
gtk_assistant_get_page_complete (GtkAssistant *assistant,
@@ -2153,8 +2089,6 @@ gtk_assistant_get_page_complete (GtkAssistant *assistant,
* One situation where it can be necessary to call this
* function is when changing a value on the current page
* affects the future page flow of the assistant.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_update_buttons_state (GtkAssistant *assistant)
@@ -2178,8 +2112,6 @@ gtk_assistant_update_buttons_state (GtkAssistant *assistant)
* or undone. For example, showing a progress page to track
* a long-running, unreversible operation after the user has
* clicked apply on a confirmation page.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_assistant_commit (GtkAssistant *assistant)
@@ -2257,8 +2189,6 @@ gtk_assistant_buildable_custom_finished (GtkBuildable *buildable,
* Returns the `GtkAssistantPage` object for @child.
*
* Returns: (transfer none): the `GtkAssistantPage` for @child
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
GtkAssistantPage *
gtk_assistant_get_page (GtkAssistant *assistant,
@@ -2275,8 +2205,6 @@ gtk_assistant_get_page (GtkAssistant *assistant,
* Returns the child to which @page belongs.
*
* Returns: (transfer none): the child to which @page belongs
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
GtkWidget *
gtk_assistant_page_get_child (GtkAssistantPage *page)
@@ -2388,8 +2316,6 @@ gtk_assistant_pages_new (GtkAssistant *assistant)
* Gets a list model of the assistant pages.
*
* Returns: (transfer full) (attributes element-type=GtkAssistantPage): A list model of the pages.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
GListModel *
gtk_assistant_get_pages (GtkAssistant *assistant)
+10 -22
View File
@@ -34,8 +34,6 @@
* same context which was used to request sizes for a given `GtkTreeModel`
* row also be used for the same row when calling other `GtkCellArea` APIs
* such as gtk_cell_area_render() and gtk_cell_area_event().
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
#include "config.h"
@@ -109,8 +107,6 @@ gtk_cell_area_context_class_init (GtkCellAreaContextClass *class)
* GtkCellAreaContext:area:
*
* The `GtkCellArea` this context was created by
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
g_object_class_install_property (object_class,
PROP_CELL_AREA,
@@ -124,8 +120,6 @@ gtk_cell_area_context_class_init (GtkCellAreaContextClass *class)
* The minimum width for the `GtkCellArea` in this context
* for all `GtkTreeModel` rows that this context was requested
* for using gtk_cell_area_get_preferred_width().
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
g_object_class_install_property (object_class,
PROP_MIN_WIDTH,
@@ -139,8 +133,6 @@ gtk_cell_area_context_class_init (GtkCellAreaContextClass *class)
* The natural width for the `GtkCellArea` in this context
* for all `GtkTreeModel` rows that this context was requested
* for using gtk_cell_area_get_preferred_width().
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
g_object_class_install_property (object_class,
PROP_NAT_WIDTH,
@@ -154,8 +146,6 @@ gtk_cell_area_context_class_init (GtkCellAreaContextClass *class)
* The minimum height for the `GtkCellArea` in this context
* for all `GtkTreeModel` rows that this context was requested
* for using gtk_cell_area_get_preferred_height().
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
g_object_class_install_property (object_class,
PROP_MIN_HEIGHT,
@@ -169,8 +159,6 @@ gtk_cell_area_context_class_init (GtkCellAreaContextClass *class)
* The natural height for the `GtkCellArea` in this context
* for all `GtkTreeModel` rows that this context was requested
* for using gtk_cell_area_get_preferred_height().
*
* Deprecated: 4.10: This object will be removed in GTK 5
*/
g_object_class_install_property (object_class,
PROP_NAT_HEIGHT,
@@ -321,7 +309,7 @@ gtk_cell_area_context_real_allocate (GtkCellAreaContext *context,
*
* Returns: (transfer none): the `GtkCellArea` this context was created by.
*
* Deprecated: 4.10: This object will be removed in GTK 5
* Deprecated: 4.10
*/
GtkCellArea *
gtk_cell_area_context_get_area (GtkCellAreaContext *context)
@@ -360,7 +348,7 @@ gtk_cell_area_context_get_area (GtkCellAreaContext *context)
* of all the displayed row heights using
* gtk_cell_area_get_preferred_height_for_width().
*
* Deprecated: 4.10: This object will be removed in GTK 5
* Deprecated: 4.10
*/
void
gtk_cell_area_context_reset (GtkCellAreaContext *context)
@@ -389,7 +377,7 @@ gtk_cell_area_context_reset (GtkCellAreaContext *context)
* rows. This is generally the case for `GtkTreeView` when
* `GtkTreeView:fixed-height-mode` is enabled.
*
* Deprecated: 4.10: This object will be removed in GTK 5
* Deprecated: 4.10
*/
void
gtk_cell_area_context_allocate (GtkCellAreaContext *context,
@@ -413,7 +401,7 @@ gtk_cell_area_context_allocate (GtkCellAreaContext *context,
* After gtk_cell_area_context_reset() is called and/or before ever
* requesting the size of a `GtkCellArea`, the returned values are 0.
*
* Deprecated: 4.10: This object will be removed in GTK 5
* Deprecated: 4.10
*/
void
gtk_cell_area_context_get_preferred_width (GtkCellAreaContext *context,
@@ -443,7 +431,7 @@ gtk_cell_area_context_get_preferred_width (GtkCellAreaContext *context,
* After gtk_cell_area_context_reset() is called and/or before ever
* requesting the size of a `GtkCellArea`, the returned values are 0.
*
* Deprecated: 4.10: This object will be removed in GTK 5
* Deprecated: 4.10
*/
void
gtk_cell_area_context_get_preferred_height (GtkCellAreaContext *context,
@@ -474,7 +462,7 @@ gtk_cell_area_context_get_preferred_height (GtkCellAreaContext *context,
* After gtk_cell_area_context_reset() is called and/or before ever
* requesting the size of a `GtkCellArea`, the returned values are -1.
*
* Deprecated: 4.10: This object will be removed in GTK 5
* Deprecated: 4.10
*/
void
gtk_cell_area_context_get_preferred_height_for_width (GtkCellAreaContext *context,
@@ -504,7 +492,7 @@ gtk_cell_area_context_get_preferred_height_for_width (GtkCellAreaContext *contex
* After gtk_cell_area_context_reset() is called and/or before ever
* requesting the size of a `GtkCellArea`, the returned values are -1.
*
* Deprecated: 4.10: This object will be removed in GTK 5
* Deprecated: 4.10
*/
void
gtk_cell_area_context_get_preferred_width_for_height (GtkCellAreaContext *context,
@@ -533,7 +521,7 @@ gtk_cell_area_context_get_preferred_width_for_height (GtkCellAreaContext *contex
* context was recently reset with gtk_cell_area_context_reset(),
* the returned value will be -1.
*
* Deprecated: 4.10: This object will be removed in GTK 5
* Deprecated: 4.10
*/
void
gtk_cell_area_context_get_allocation (GtkCellAreaContext *context,
@@ -565,7 +553,7 @@ gtk_cell_area_context_get_allocation (GtkCellAreaContext *context,
* progressively push the requested width over a series of
* gtk_cell_area_get_preferred_width() requests.
*
* Deprecated: 4.10: This object will be removed in GTK 5
* Deprecated: 4.10
*/
void
gtk_cell_area_context_push_preferred_width (GtkCellAreaContext *context,
@@ -609,7 +597,7 @@ gtk_cell_area_context_push_preferred_width (GtkCellAreaContext *context,
* progressively push the requested height over a series of
* gtk_cell_area_get_preferred_height() requests.
*
* Deprecated: 4.10: This object will be removed in GTK 5
* Deprecated: 4.10
*/
void
gtk_cell_area_context_push_preferred_height (GtkCellAreaContext *context,
+1
View File
@@ -20,6 +20,7 @@
#include "gtkcellrendererpixbuf.h"
#include "gtkiconhelperprivate.h"
#include "gtkicontheme.h"
#include "gtkprivate.h"
#include "gtksnapshot.h"
#include "gtkstylecontextprivate.h"
-20
View File
@@ -70,8 +70,6 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
* [property@Gtk.LockButton:tooltip-lock],
* [property@Gtk.LockButton:tooltip-unlock] and
* [property@Gtk.LockButton:tooltip-not-authorized] properties.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
struct _GtkLockButton
@@ -273,8 +271,6 @@ gtk_lock_button_class_init (GtkLockButtonClass *klass)
* GtkLockButton:permission: (attributes org.gtk.Property.get=gtk_lock_button_get_permission org.gtk.Property.set=gtk_lock_button_set_permission)
*
* The `GPermission object controlling this button.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
g_object_class_install_property (gobject_class, PROP_PERMISSION,
g_param_spec_object ("permission", NULL, NULL,
@@ -286,8 +282,6 @@ gtk_lock_button_class_init (GtkLockButtonClass *klass)
* GtkLockButton:text-lock:
*
* The text to display when prompting the user to lock.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
g_object_class_install_property (gobject_class, PROP_TEXT_LOCK,
g_param_spec_string ("text-lock", NULL, NULL,
@@ -300,8 +294,6 @@ gtk_lock_button_class_init (GtkLockButtonClass *klass)
* GtkLockButton:text-unlock:
*
* The text to display when prompting the user to unlock.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
g_object_class_install_property (gobject_class, PROP_TEXT_UNLOCK,
g_param_spec_string ("text-unlock", NULL, NULL,
@@ -314,8 +306,6 @@ gtk_lock_button_class_init (GtkLockButtonClass *klass)
* GtkLockButton:tooltip-lock:
*
* The tooltip to display when prompting the user to lock.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
g_object_class_install_property (gobject_class, PROP_TOOLTIP_LOCK,
g_param_spec_string ("tooltip-lock", NULL, NULL,
@@ -328,8 +318,6 @@ gtk_lock_button_class_init (GtkLockButtonClass *klass)
* GtkLockButton:tooltip-unlock:
*
* The tooltip to display when prompting the user to unlock.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
g_object_class_install_property (gobject_class, PROP_TOOLTIP_UNLOCK,
g_param_spec_string ("tooltip-unlock", NULL, NULL,
@@ -342,8 +330,6 @@ gtk_lock_button_class_init (GtkLockButtonClass *klass)
* GtkLockButton:tooltip-not-authorized:
*
* The tooltip to display when the user cannot obtain authorization.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
g_object_class_install_property (gobject_class, PROP_TOOLTIP_NOT_AUTHORIZED,
g_param_spec_string ("tooltip-not-authorized", NULL, NULL,
@@ -525,8 +511,6 @@ gtk_lock_button_clicked (GtkButton *widget)
* Creates a new lock button which reflects the @permission.
*
* Returns: a new `GtkLockButton`
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
GtkWidget *
gtk_lock_button_new (GPermission *permission)
@@ -543,8 +527,6 @@ gtk_lock_button_new (GPermission *permission)
* Obtains the `GPermission` object that controls @button.
*
* Returns: (transfer none) (nullable): the `GPermission` of @button
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
GPermission *
gtk_lock_button_get_permission (GtkLockButton *button)
@@ -560,8 +542,6 @@ gtk_lock_button_get_permission (GtkLockButton *button)
* @permission: (nullable): a `GPermission` object
*
* Sets the `GPermission` object that controls @button.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_lock_button_set_permission (GtkLockButton *button,
-20
View File
@@ -77,8 +77,6 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
* ## CSS node
*
* `GtkStatusbar` has a single CSS node with name `statusbar`.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
typedef struct _GtkStatusbarMsg GtkStatusbarMsg;
@@ -169,8 +167,6 @@ gtk_statusbar_class_init (GtkStatusbarClass *class)
* @text: the message that was pushed
*
* Emitted whenever a new message gets pushed onto a statusbar's stack.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
statusbar_signals[SIGNAL_TEXT_PUSHED] =
g_signal_new (I_("text-pushed"),
@@ -190,8 +186,6 @@ gtk_statusbar_class_init (GtkStatusbarClass *class)
* @text: the message that was just popped
*
* Emitted whenever a new message is popped off a statusbar's stack.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
statusbar_signals[SIGNAL_TEXT_POPPED] =
g_signal_new (I_("text-popped"),
@@ -231,8 +225,6 @@ gtk_statusbar_init (GtkStatusbar *statusbar)
* Creates a new `GtkStatusbar` ready for messages.
*
* Returns: the new `GtkStatusbar`
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
GtkWidget*
gtk_statusbar_new (void)
@@ -265,8 +257,6 @@ gtk_statusbar_update (GtkStatusbar *statusbar,
* Note that the description is not shown in the UI.
*
* Returns: an integer id
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
guint
gtk_statusbar_get_context_id (GtkStatusbar *statusbar,
@@ -327,8 +317,6 @@ gtk_statusbar_msg_free (GtkStatusbarMsg *msg)
*
* Returns: a message id that can be used with
* [method@Gtk.Statusbar.remove].
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
guint
gtk_statusbar_push (GtkStatusbar *statusbar,
@@ -363,8 +351,6 @@ gtk_statusbar_push (GtkStatusbar *statusbar,
* Note that this may not change the displayed message,
* if the message at the top of the stack has a different
* context id.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_statusbar_pop (GtkStatusbar *statusbar,
@@ -409,8 +395,6 @@ gtk_statusbar_pop (GtkStatusbar *statusbar,
*
* Forces the removal of a message from a statusbars stack.
* The exact @context_id and @message_id must be specified.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_statusbar_remove (GtkStatusbar *statusbar,
@@ -459,8 +443,6 @@ gtk_statusbar_remove (GtkStatusbar *statusbar,
*
* Forces the removal of all messages from a statusbar's
* stack with the exact @context_id.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
void
gtk_statusbar_remove_all (GtkStatusbar *statusbar,
@@ -517,8 +499,6 @@ gtk_statusbar_remove_all (GtkStatusbar *statusbar,
* Retrieves the contents of the label in `GtkStatusbar`.
*
* Returns: (transfer none): the contents of the statusbar
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
const char *
gtk_statusbar_get_message (GtkStatusbar *statusbar)
-6
View File
@@ -44,8 +44,6 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
* volume control.
*
* ![An example GtkVolumeButton](volumebutton.png)
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
typedef struct _GtkVolumeButtonClass GtkVolumeButtonClass;
@@ -170,8 +168,6 @@ gtk_volume_button_class_init (GtkVolumeButtonClass *klass)
*
* Note that if the symbolic icons are not available in your installed
* theme, then the normal (potentially colorful) icons will be used.
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
g_object_class_install_property (gobject_class,
PROP_SYMBOLIC,
@@ -204,8 +200,6 @@ gtk_volume_button_init (GtkVolumeButton *button)
* [class@Gtk.ScaleButton].
*
* Returns: a new `GtkVolumeButton`
*
* Deprecated: 4.10: This widget will be removed in GTK 5
*/
GtkWidget *
gtk_volume_button_new (void)
+7
View File
@@ -36,15 +36,22 @@
#include "gtkbutton.h"
#include "gtkgrid.h"
#include "gtkbox.h"
#include "gtkicontheme.h"
#include "gtkimage.h"
#include "gtklabel.h"
#include "gtkmarshalers.h"
#include "gtkstack.h"
#include "gtkorientable.h"
#include "gtkscrolledwindow.h"
#include "gtktextview.h"
#include "gtkmain.h"
#include "gtktogglebutton.h"
#include "gtktypebuiltins.h"
#include "gtkstack.h"
#include "gtkstackswitcher.h"
#include "gtksettings.h"
#include "gtkurilauncher.h"
#include "gtkheaderbar.h"
#include "gtkprivate.h"
#include <glib/gi18n-lib.h>
#include "gtkeventcontrollermotion.h"
+2 -93
View File
@@ -45,11 +45,6 @@
* [vfunc@Gtk.Accessible.get_next_accessible_sibling] virtual functions.
* Note that you can not create a top-level accessible object as of now,
* which means that you must always have a parent accessible object.
* Also note that when an accessible object does not correspond to a widget,
* and it has children, whose implementation you don't control,
* it is necessary to ensure the correct shape of the a11y tree
* by calling [method@Gtk.Accessible.set_accessible_parent] and
* updating the sibling by [method@Gtk.Accessible.update_next_accessible_sibling].
*/
#include "config.h"
@@ -94,8 +89,6 @@ gtk_accessible_default_init (GtkAccessibleInterface *iface)
* Retrieves the `GtkATContext` for the given `GtkAccessible`.
*
* Returns: (transfer none): the `GtkATContext`
*
* Since: 4.10
*/
GtkATContext *
gtk_accessible_get_at_context (GtkAccessible *self)
@@ -122,85 +115,7 @@ gtk_accessible_get_accessible_parent (GtkAccessible *self)
{
g_return_val_if_fail (GTK_IS_ACCESSIBLE (self), NULL);
GtkATContext *context;
GtkAccessible *parent = NULL;
context = gtk_accessible_get_at_context (self);
if (context != NULL)
parent = gtk_at_context_get_accessible_parent (context);
if (parent != NULL)
return parent;
else
return GTK_ACCESSIBLE_GET_IFACE (self)->get_accessible_parent (self);
}
/**
* gtk_accessible_set_accessible_parent:
* @self: an accessible object
* @parent: (nullable): the parent accessible object
* @next_sibling: (nullable): the sibling accessible object
*
* Sets the parent and sibling of an accessible object.
*
* This function is meant to be used by accessible implementations that are
* not part of the widget hierarchy, and but act as a logical bridge between
* widgets. For instance, if a widget creates an object that holds metadata
* for each child, and you want that object to implement the `GtkAccessible`
* interface, you will use this function to ensure that the parent of each
* child widget is the metadata object, and the parent of each metadata
* object is the container widget.
*
* Since: 4.10
*/
void
gtk_accessible_set_accessible_parent (GtkAccessible *self,
GtkAccessible *parent,
GtkAccessible *next_sibling)
{
g_return_if_fail (GTK_IS_ACCESSIBLE (self));
g_return_if_fail (parent == NULL || GTK_IS_ACCESSIBLE (parent));
g_return_if_fail (next_sibling == NULL || GTK_IS_ACCESSIBLE (parent));
GtkATContext *context;
context = gtk_accessible_get_at_context (self);
if (context != NULL)
{
gtk_at_context_set_accessible_parent (context, parent);
gtk_at_context_set_next_accessible_sibling (context, next_sibling);
}
}
/**
* gtk_accessible_update_next_accessible_sibling:
* @self: a `GtkAccessible`
* @new_sibling: (nullable): the new next accessible sibling to set
*
* Updates the next accessible sibling of @self.
* That might be useful when a new child of a custom `GtkAccessible`
* is created, and it needs to be linked to a previous child.
*
* Since: 4.10
*/
void
gtk_accessible_update_next_accessible_sibling (GtkAccessible *self,
GtkAccessible *new_sibling)
{
GtkATContext *context;
g_return_if_fail (GTK_IS_ACCESSIBLE (self));
context = gtk_accessible_get_at_context (self);
if (!context)
return;
if (gtk_at_context_get_accessible_parent (context) == NULL)
{
g_critical ("Failed to update next accessible sibling: no parent accessible set for this accessible");
return;
}
gtk_at_context_set_next_accessible_sibling (context, new_sibling);
return GTK_ACCESSIBLE_GET_IFACE (self)->get_accessible_parent (self);
}
/**
@@ -236,13 +151,7 @@ gtk_accessible_get_next_accessible_sibling (GtkAccessible *self)
{
g_return_val_if_fail (GTK_IS_ACCESSIBLE (self), NULL);
GtkATContext *context;
context = gtk_accessible_get_at_context (self);
if (context != NULL && gtk_at_context_get_accessible_parent (context) != NULL)
return gtk_at_context_get_next_accessible_sibling (context);
else
return GTK_ACCESSIBLE_GET_IFACE (self)->get_next_accessible_sibling (self);
return GTK_ACCESSIBLE_GET_IFACE (self)->get_next_accessible_sibling (self);
}
/**
-9
View File
@@ -164,20 +164,11 @@ gboolean gtk_accessible_get_platform_state (GtkAccessible *self,
GDK_AVAILABLE_IN_4_10
GtkAccessible * gtk_accessible_get_accessible_parent (GtkAccessible *self);
GDK_AVAILABLE_IN_4_10
void gtk_accessible_set_accessible_parent (GtkAccessible *self,
GtkAccessible *parent,
GtkAccessible *next_sibling);
GDK_AVAILABLE_IN_4_10
GtkAccessible * gtk_accessible_get_first_accessible_child (GtkAccessible *self);
GDK_AVAILABLE_IN_4_10
GtkAccessible * gtk_accessible_get_next_accessible_sibling (GtkAccessible *self);
GDK_AVAILABLE_IN_4_10
void gtk_accessible_update_next_accessible_sibling (GtkAccessible *self,
GtkAccessible *new_sibling);
GDK_AVAILABLE_IN_4_10
gboolean gtk_accessible_get_bounds (GtkAccessible *self,
+6
View File
@@ -23,6 +23,10 @@
#include "gtkapplication.h"
#include "gdkprofilerprivate.h"
#ifdef G_OS_UNIX
#include <gio/gunixfdlist.h>
#endif
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
@@ -32,8 +36,10 @@
#include "gtkapplicationprivate.h"
#include "gtkmarshalers.h"
#include "gtkmain.h"
#include "gtkrecentmanager.h"
#include "gtkicontheme.h"
#include "gtkbuilder.h"
#include "gtkshortcutswindow.h"
#include "gtkprivate.h"
/* NB: please do not add backend-specific GDK headers here. This should
+5
View File
@@ -24,11 +24,16 @@
#include "gtkapplicationprivate.h"
#include "gtkwidgetprivate.h"
#include "gtkwindowprivate.h"
#include "gtkheaderbar.h"
#include "gtkpopovermenubar.h"
#include "gtksettings.h"
#include "gtkshortcutswindowprivate.h"
#include "gtktooltipprivate.h"
#if defined(HAVE_GIO_UNIX) && !defined(__APPLE__)
#include <gio/gdesktopappinfo.h>
#endif
/**
* GtkApplicationWindow:
*
-64
View File
@@ -447,70 +447,6 @@ gtk_at_context_get_accessible_role (GtkATContext *self)
return self->accessible_role;
}
/*< private >
* gtk_at_context_get_accessible_parent:
* @self: a `GtkAtContext`
*
* Retrieves the parent accessible object of the given `GtkAtContext`.
*
* Returns: (nullable) (transfer none): the parent accessible object, or `NULL` if not set.
*/
GtkAccessible *
gtk_at_context_get_accessible_parent (GtkATContext *self)
{
g_return_val_if_fail (GTK_IS_AT_CONTEXT (self), NULL);
return self->accessible_parent;
}
/*< private >
* gtk_at_context_set_accessible_parent:
* @self: a `GtkAtContext`
* @parent: the parent `GtkAccessible` to set
*
* Sets the parent accessible object of the given `GtkAtContext`.
*/
void
gtk_at_context_set_accessible_parent (GtkATContext *self,
GtkAccessible *parent)
{
g_return_if_fail (GTK_IS_AT_CONTEXT (self));
g_set_object (&self->accessible_parent, parent);
}
/*< private >
* gtk_at_context_get_next_accessible_sibling:
* @self: a `GtkAtContext`
*
* Retrieves the next accessible sibling of the given `GtkAtContext`.
*
* Returns: (nullable) (transfer none): the next accessible sibling.
*/
GtkAccessible *
gtk_at_context_get_next_accessible_sibling (GtkATContext *self)
{
g_return_val_if_fail (GTK_IS_AT_CONTEXT (self), NULL);
return self->next_accessible_sibling;
}
/*< private >
* gtk_at_context_set_next_accessible_sibling:
* @self: a `GtkAtContext`
* @sibling: (nullable): the next accessible sibling
*
* Sets the next accessible sibling object of the given `GtkAtContext`.
*/
void
gtk_at_context_set_next_accessible_sibling (GtkATContext *self,
GtkAccessible *sibling)
{
g_return_if_fail (GTK_IS_AT_CONTEXT (self));
g_set_object (&self->next_accessible_sibling, sibling);
}
/*< private >
* gtk_at_context_set_display:
* @self: a `GtkATContext`
-13
View File
@@ -87,8 +87,6 @@ struct _GtkATContext
GtkAccessibleRole accessible_role;
GtkAccessible *accessible;
GtkAccessible *accessible_parent;
GtkAccessible *next_accessible_sibling;
GdkDisplay *display;
GtkAccessibleAttributeSet *states;
@@ -181,15 +179,4 @@ const char * gtk_accessible_property_get_attribute_name (GtkAccessiblePr
const char * gtk_accessible_relation_get_attribute_name (GtkAccessibleRelation relation);
const char * gtk_accessible_state_get_attribute_name (GtkAccessibleState state);
GtkAccessible *
gtk_at_context_get_accessible_parent (GtkATContext *self);
void
gtk_at_context_set_accessible_parent (GtkATContext *self,
GtkAccessible *parent);
GtkAccessible *
gtk_at_context_get_next_accessible_sibling (GtkATContext *self);
void
gtk_at_context_set_next_accessible_sibling (GtkATContext *self,
GtkAccessible *sibling);
G_END_DECLS
+1
View File
@@ -67,6 +67,7 @@
#include "gtkorientable.h"
#include "gtkprivate.h"
#include "gtktypebuiltins.h"
#include "gtksizerequest.h"
#include "gtkwidgetprivate.h"
+3
View File
@@ -216,10 +216,13 @@
#include "gtkdebug.h"
#include "gtkexpression.h"
#include "gtkmain.h"
#include "gtkicontheme.h"
#include "gtkprivate.h"
#include "gtkshortcutactionprivate.h"
#include "gtkshortcuttrigger.h"
#include "gtktestutils.h"
#include "gtktypebuiltins.h"
#include "gtkicontheme.h"
#include "gtkiconthemeprivate.h"
#include "gtkdebug.h"
+6 -1
View File
@@ -69,6 +69,7 @@
#include "gtkbinlayout.h"
#include "gtkimage.h"
#include "gtklabel.h"
#include "gtkmain.h"
#include "gtkmarshalers.h"
#include "gtkprivate.h"
#include "gtktypebuiltins.h"
@@ -638,7 +639,7 @@ gtk_button_new_with_label (const char *label)
/**
* gtk_button_new_from_icon_name:
* @icon_name: an icon name
* @icon_name: (nullable): an icon name
*
* Creates a new button containing an icon from the current icon theme.
*
@@ -968,6 +969,10 @@ gtk_button_set_icon_name (GtkButton *button,
gtk_image_set_from_icon_name (GTK_IMAGE (priv->child), icon_name);
}
gtk_accessible_update_relation (GTK_ACCESSIBLE (button),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, priv->child, NULL,
-1);
gtk_button_set_child_type (button, ICON_CHILD);
g_object_notify_by_pspec (G_OBJECT (button), props[PROP_ICON_NAME]);
}
+1
View File
@@ -114,6 +114,7 @@
#include "gtkeventcontrollerfocus.h"
#include "gtkdragsource.h"
#include "gtknative.h"
#include "gtkicontheme.h"
#include "gtkdragicon.h"
#include "gtkbutton.h"
#include "gtkbox.h"
+2
View File
@@ -29,6 +29,7 @@
#include "gtkactionhelperprivate.h"
#include "gtkboxlayout.h"
#include "gtkbuiltiniconprivate.h"
#include "gtkcssnumbervalueprivate.h"
#include "gtkgestureclick.h"
#include <glib/gi18n-lib.h>
#include "gtklabel.h"
@@ -36,6 +37,7 @@
#include "gtkshortcuttrigger.h"
#include "gtkcssnodeprivate.h"
#include "gtkwidgetprivate.h"
#include "gtkmodelbuttonprivate.h"
/**
* GtkCheckButton:
+1
View File
@@ -26,6 +26,7 @@
#include "gtkgesturelongpress.h"
#include "gtkgestureclick.h"
#include "gtkgesturesingle.h"
#include "gtkicontheme.h"
#include "gtkimage.h"
#include <glib/gi18n-lib.h>
#include "gtkmain.h"
+1
View File
@@ -23,6 +23,7 @@
#include "gtkcssimageprivate.h"
#include "gtkcsspalettevalueprivate.h"
#include "gtkcsscolorvalueprivate.h"
#include "gtkiconthemeprivate.h"
#include "gdkpixbufutilsprivate.h"
#include "gtkstyleproviderprivate.h"
+1
View File
@@ -35,6 +35,7 @@
#include "gtkdragicon.h"
#include "gtkprivate.h"
#include "gtkmarshalers.h"
#include "gtkicontheme.h"
#include "gtkpicture.h"
#include "gtksettingsprivate.h"
#include "gtkgesturesingle.h"
+8
View File
@@ -32,6 +32,8 @@
#include "gtkaccessibleprivate.h"
#include "gtkadjustment.h"
#include "gtkbox.h"
#include "gtkbutton.h"
#include "deprecated/gtkcelleditable.h"
#include "gtkdebug.h"
#include "gtkeditable.h"
@@ -39,19 +41,25 @@
#include "gtkemojicompletion.h"
#include "gtkentrybuffer.h"
#include "gtkgesturedrag.h"
#include "gtkimageprivate.h"
#include "gtkimcontextsimple.h"
#include <glib/gi18n-lib.h>
#include "gtklabel.h"
#include "gtkmain.h"
#include "gtkmarshalers.h"
#include "gtkpangoprivate.h"
#include "gtkpopover.h"
#include "gtkprivate.h"
#include "gtkprogressbar.h"
#include "gtksettings.h"
#include "gtksnapshot.h"
#include "gtktextprivate.h"
#include "gtktexthandleprivate.h"
#include "gtktextutilprivate.h"
#include "gtktooltip.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetprivate.h"
#include "gtkwindow.h"
#include "gtknative.h"
#include "gtkgestureclick.h"
#include "gtkdragsourceprivate.h"
+5
View File
@@ -60,8 +60,10 @@
#include "gtksizegroup.h"
#include "gtksizerequest.h"
#include "gtkstack.h"
#include "gtktooltip.h"
#include "gtkbox.h"
#include "gtkcheckbutton.h"
#include "gtkwindowgroup.h"
#include <glib/gi18n-lib.h>
#include "gtkfilelauncher.h"
#include "gtkmain.h"
@@ -69,6 +71,8 @@
#include "gtkpopover.h"
#include "gtkrevealer.h"
#include "gtkspinner.h"
#include "gtkseparator.h"
#include "gtkmodelbuttonprivate.h"
#include "gtkeventcontrollerkey.h"
#include "gtkdebug.h"
#include "gtkfilechoosererrorstackprivate.h"
@@ -82,6 +86,7 @@
#include "gtkshortcuttrigger.h"
#include "gtkshortcutaction.h"
#include "gtkshortcut.h"
#include "gtkstringlist.h"
#include "gtkfilterlistmodel.h"
#include "gtkcustomfilter.h"
#include "gtkcustomsorter.h"
+1
View File
@@ -26,6 +26,7 @@
#include "deprecated/gtkfontchooserwidget.h"
#include "gtkfontchooserwidgetprivate.h"
#include "gtkfontchooserutils.h"
#include "gtkbox.h"
#include <glib/gi18n-lib.h>
#include "gtkbuildable.h"
#include "gtkprivate.h"
-1
View File
@@ -919,7 +919,6 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass)
gtk_widget_class_bind_template_child (widget_class, GtkFontChooserWidget, selection);
gtk_widget_class_bind_template_child (widget_class, GtkFontChooserWidget, custom_filter);
gtk_widget_class_bind_template_child (widget_class, GtkFontChooserWidget, user_filter);
gtk_widget_class_bind_template_child (widget_class, GtkFontChooserWidget, multi_filter);
gtk_widget_class_bind_template_child (widget_class, GtkFontChooserWidget, preview);
gtk_widget_class_bind_template_child (widget_class, GtkFontChooserWidget, preview2);
gtk_widget_class_bind_template_child (widget_class, GtkFontChooserWidget, size_label);
+4 -4
View File
@@ -223,8 +223,8 @@ gtk_gesture_drag_new (void)
/**
* gtk_gesture_drag_get_start_point:
* @gesture: a `GtkGesture`
* @x: (out) (optional): X coordinate for the drag start point
* @y: (out) (optional): Y coordinate for the drag start point
* @x: (out) (nullable): X coordinate for the drag start point
* @y: (out) (nullable): Y coordinate for the drag start point
*
* Gets the point where the drag started.
*
@@ -263,8 +263,8 @@ gtk_gesture_drag_get_start_point (GtkGestureDrag *gesture,
/**
* gtk_gesture_drag_get_offset:
* @gesture: a `GtkGesture`
* @x: (out) (optional): X offset for the current point
* @y: (out) (optional): Y offset for the current point
* @x: (out) (nullable): X offset for the current point
* @y: (out) (nullable): Y offset for the current point
*
* Gets the offset from the start point.
*
+12 -5
View File
@@ -32,6 +32,7 @@
#include "gtksnapshot.h"
#include "gtkrenderlayoutprivate.h"
#include "gtkcssnodeprivate.h"
#include "gdk/gdkgltextureprivate.h"
#include <epoxy/gl.h>
@@ -144,6 +145,7 @@
typedef struct {
guint id;
GLsync sync;
int width;
int height;
GdkTexture *holder;
@@ -394,6 +396,8 @@ delete_one_texture (gpointer data)
texture->id = 0;
}
g_clear_pointer (&texture->sync, glDeleteSync);
g_free (texture);
}
@@ -673,6 +677,7 @@ release_texture (gpointer data)
{
Texture *texture = data;
texture->holder = NULL;
g_clear_pointer (&texture->sync, glDeleteSync);
}
static void
@@ -735,11 +740,13 @@ gtk_gl_area_snapshot (GtkWidget *widget,
priv->texture = NULL;
priv->textures = g_list_prepend (priv->textures, texture);
texture->holder = gdk_gl_texture_new (priv->context,
texture->id,
texture->width,
texture->height,
release_texture, texture);
texture->sync = glFenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
texture->holder = gdk_gl_texture_new_with_sync (priv->context,
texture->id,
texture->sync,
texture->width,
texture->height,
release_texture, texture);
/* Our texture is rendered by OpenGL, so it is upside down,
* compared to what GSK expects, so flip it back.
+2
View File
@@ -26,7 +26,9 @@
#include "gtkbuildable.h"
#include "gtkcenterbox.h"
#include "gtklabel.h"
#include "gtknative.h"
#include "gtkprivate.h"
#include "gtksizerequest.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetprivate.h"
#include "gtkwindowcontrols.h"
+1
View File
@@ -27,6 +27,7 @@
#include "gtkimageprivate.h"
#include "gtkiconhelperprivate.h"
#include "gtkicontheme.h"
#include "gtkprivate.h"
#include "gtksnapshot.h"
#include "gtktypebuiltins.h"
+3 -3
View File
@@ -606,9 +606,9 @@ gtk_list_view_size_allocate (GtkWidget *widget,
}
/* step 1: determine width of the list */
gtk_list_view_measure_across (widget, opposite_orientation,
-1,
&min, &nat);
gtk_widget_measure (widget, opposite_orientation,
-1,
&min, &nat, NULL, NULL);
self->list_width = orientation == GTK_ORIENTATION_VERTICAL ? width : height;
if (opposite_scroll_policy == GTK_SCROLL_MINIMUM)
self->list_width = MAX (min, self->list_width);
+2
View File
@@ -52,6 +52,7 @@
#include <glib/gi18n-lib.h>
#include "gtkbox.h"
#include "gtkdebug.h"
#include "gtkdropprivate.h"
#include "gtkmain.h"
@@ -59,6 +60,7 @@
#include "gtkmodulesprivate.h"
#include "gtkprivate.h"
#include "gtkrecentmanager.h"
#include "gtksettingsprivate.h"
#include "gtktooltipprivate.h"
#include "gtkwidgetprivate.h"
#include "gtkwindowprivate.h"
-63
View File
@@ -150,7 +150,6 @@ enum
PROP_HAS_FRAME,
PROP_PRIMARY,
PROP_CHILD,
PROP_ACTIVE,
LAST_PROP
};
@@ -209,9 +208,6 @@ gtk_menu_button_set_property (GObject *object,
case PROP_CHILD:
gtk_menu_button_set_child (self, g_value_get_object (value));
break;
case PROP_ACTIVE:
gtk_menu_button_set_active (self, g_value_get_boolean (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
@@ -257,9 +253,6 @@ gtk_menu_button_get_property (GObject *object,
case PROP_CHILD:
g_value_set_object (value, gtk_menu_button_get_child (self));
break;
case PROP_ACTIVE:
g_value_set_boolean (value, gtk_menu_button_get_active (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
@@ -321,8 +314,6 @@ gtk_menu_button_toggled (GtkMenuButton *self)
GTK_ACCESSIBLE_STATE_EXPANDED);
}
}
g_object_notify_by_pspec (G_OBJECT (self), menu_button_props[PROP_ACTIVE]);
}
static void
@@ -522,18 +513,6 @@ gtk_menu_button_class_init (GtkMenuButtonClass *klass)
GTK_TYPE_WIDGET,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkMenuButton:active: (attributes org.gtk.Property.get=gtk_menu_button_get_active org.gtk.Property.set=gtk_menu_button_set_active)
*
* Whether the menu button is active.
*
* Since: 4.10
*/
menu_button_props[PROP_ACTIVE] =
g_param_spec_boolean ("active", NULL, NULL,
FALSE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (gobject_class, LAST_PROP, menu_button_props);
/**
@@ -1520,45 +1499,3 @@ gtk_menu_button_get_child (GtkMenuButton *menu_button)
return menu_button->child;
}
/**
* gtk_menu_button_set_active: (attributes org.gtk.Method.set_property=active)
* @menu_button: a `GtkMenuButton`
* @active: whether the menu button is active
*
* Sets whether menu button acts is active.
*
* Since: 4.10
*/
void
gtk_menu_button_set_active (GtkMenuButton *menu_button,
gboolean active)
{
g_return_if_fail (GTK_IS_MENU_BUTTON (menu_button));
if (active == gtk_menu_button_get_active (menu_button))
return;
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (menu_button->button),
active);
g_object_notify_by_pspec (G_OBJECT (menu_button), menu_button_props[PROP_ACTIVE]);
}
/**
* gtk_menu_button_get_active: (attributes org.gtk.Method.get_property=active)
* @menu_button: a `GtkMenuButton`
*
* Returns whether the menu button is active.
*
* Returns: TRUE if the button is active
*
* Since: 4.10
*/
gboolean
gtk_menu_button_get_active (GtkMenuButton *menu_button)
{
g_return_val_if_fail (GTK_IS_MENU_BUTTON (menu_button), FALSE);
return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (menu_button->button));
}
-6
View File
@@ -127,12 +127,6 @@ void gtk_menu_button_set_child (GtkMenuButton *menu_button,
GDK_AVAILABLE_IN_4_6
GtkWidget * gtk_menu_button_get_child (GtkMenuButton *menu_button);
GDK_AVAILABLE_IN_4_10
void gtk_menu_button_set_active (GtkMenuButton *menu_button,
gboolean active);
GDK_AVAILABLE_IN_4_10
gboolean gtk_menu_button_get_active (GtkMenuButton *menu_button);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkMenuButton, g_object_unref)
G_END_DECLS
+1
View File
@@ -32,6 +32,7 @@
#include <gio/gio.h>
#include "x11/gdkx.h"
#include <X11/Xatom.h>
#include <gtk/gtkicontheme.h>
#include <glib/gi18n-lib.h>
/* for the kill(2) system call and errno - POSIX.1-2001 and later */
+2
View File
@@ -27,6 +27,8 @@
#include "gtkeditable.h"
#include "gtkeventcontrollerkey.h"
#include "gtkgestureclick.h"
#include "gtkbox.h"
#include "gtkimage.h"
#include <glib/gi18n-lib.h>
#include "gtkmarshalers.h"
#include "gtkpasswordentrybuffer.h"
+1
View File
@@ -25,6 +25,7 @@
#include "gtkbinlayout.h"
#include "gtkbox.h"
#include "gtkdragsource.h"
#include "gtkicontheme.h"
#include "gtkimage.h"
#include <glib/gi18n-lib.h>
#include "gtklabel.h"
+1
View File
@@ -33,6 +33,7 @@
#include "gdk/gdkkeysyms.h"
#include "gtkbookmarksmanagerprivate.h"
#include "gtkfilechooserutils.h"
#include "gtkicontheme.h"
#include <glib/gi18n-lib.h>
#include "gtkmain.h"
#include "gtkmarshalers.h"
+2 -2
View File
@@ -2484,8 +2484,8 @@ gtk_popover_set_offset (GtkPopover *popover,
/**
* gtk_popover_get_offset:
* @popover: a `GtkPopover`
* @x_offset: (out) (optional): a location for the x_offset
* @y_offset: (out) (optional): a location for the y_offset
* @x_offset: (out) (nullable): a location for the x_offset
* @y_offset: (out) (nullable): a location for the y_offset
*
* Gets the offset previous set with [method@Gtk.Popover.set_offset()].
*/
+1
View File
@@ -31,6 +31,7 @@
#include "gtkbuildable.h"
#include "gtkbuilderprivate.h"
#include "gtkgizmoprivate.h"
#include "gtkicontheme.h"
#include "gtklabel.h"
#include "gtkmarshalers.h"
#include "gtkorientable.h"
-2
View File
@@ -261,8 +261,6 @@ gtk_scale_button_class_init (GtkScaleButtonClass *klass)
* GtkScaleButton:active: (attributes org.gtk.Property.get=gtk_scale_button_get_active)
*
* If the scale button should be pressed in.
*
* Since: 4.10
*/
g_object_class_install_property (gobject_class,
PROP_ACTIVE,
+1 -37
View File
@@ -623,7 +623,7 @@ gtk_search_entry_init (GtkSearchEntry *entry)
"accessible-role", GTK_ACCESSIBLE_ROLE_PRESENTATION,
"icon-name", "edit-clear-symbolic",
NULL);
gtk_widget_set_tooltip_text (entry->icon, _("Clear Entry"));
gtk_widget_set_tooltip_text (entry->icon, _("Clear entry"));
gtk_widget_set_parent (entry->icon, GTK_WIDGET (entry));
gtk_widget_set_child_visible (entry->icon, FALSE);
@@ -832,42 +832,6 @@ gtk_search_entry_get_key_controller (GtkSearchEntry *entry)
return gtk_text_get_key_controller (GTK_TEXT (entry->entry));
}
/**
* gtk_search_entry_get_placeholder_text:
* @entry: a `GtkSearchEntry`
*
* Gets the placeholder text associated with @entry.
*
* Returns: (nullable): The placeholder text.
*
* Since: 4.10
*/
const char *
gtk_search_entry_get_placeholder_text (GtkSearchEntry *entry)
{
g_return_val_if_fail (GTK_IS_SEARCH_ENTRY (entry), NULL);
return gtk_text_get_placeholder_text (GTK_TEXT (entry->entry));
}
/**
* gtk_search_entry_set_placeholder_text:
* @entry: a `GtkSearchEntry`
* @text: (nullable): the text to set as a placeholder
*
* Sets the placeholder text associated with @entry.
*
* Since: 4.10
*/
void
gtk_search_entry_set_placeholder_text (GtkSearchEntry *entry,
const char *text)
{
g_return_if_fail (GTK_IS_SEARCH_ENTRY (entry));
gtk_text_set_placeholder_text (GTK_TEXT (entry->entry), text);
}
GtkText *
gtk_search_entry_get_text_widget (GtkSearchEntry *entry)
{
-6
View File
@@ -60,12 +60,6 @@ void gtk_search_entry_set_search_delay (GtkSearchEntry *entry,
GDK_AVAILABLE_IN_4_8
guint gtk_search_entry_get_search_delay (GtkSearchEntry *entry);
GDK_AVAILABLE_IN_4_10
void gtk_search_entry_set_placeholder_text (GtkSearchEntry *entry,
const char *text);
GDK_AVAILABLE_IN_4_10
const char * gtk_search_entry_get_placeholder_text (GtkSearchEntry *entry);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkSearchEntry, g_object_unref)
G_END_DECLS
+4 -4
View File
@@ -35,7 +35,7 @@
#include <sys/types.h>
#if defined(HAVE_SYS_MMAN_H)
#if defined(HAVE_MLOCK)
#include <sys/mman.h>
#endif
@@ -229,7 +229,7 @@ pool_alloc (void)
return NULL;
}
#if defined(HAVE_MMAP) && defined(HAVE_GETPAGESIZE)
#ifdef HAVE_MMAP
/* A pool with an available item */
Pool *pool = NULL;
@@ -916,7 +916,7 @@ sec_acquire_pages (size_t *sz,
g_assert (*sz);
g_assert (during_tag);
#if defined(HAVE_MLOCK) && defined(HAVE_MMAP) && defined(HAVE_GETPAGESIZE)
#if defined(HAVE_MLOCK) && defined(HAVE_MMAP)
/* Make sure sz is a multiple of the page size */
unsigned long pgsize = getpagesize ();
@@ -1000,7 +1000,7 @@ sec_release_pages (void *pages, size_t sz)
{
g_assert (pages);
#if defined(HAVE_MLOCK) && defined(HAVE_GETPAGESIZE)
#if defined(HAVE_MLOCK)
g_assert (sz % getpagesize () == 0);
if (munlock (pages, sz) < 0 && gtk_secure_warnings)
+2 -8
View File
@@ -122,7 +122,6 @@ struct _GtkSnapshotState {
char *message;
} debug;
struct {
GskMaskMode mask_mode;
GskRenderNode *mask_node;
} mask;
} data;
@@ -1259,7 +1258,7 @@ gtk_snapshot_collect_mask_source (GtkSnapshot *snapshot,
if (source_child == NULL || mask_child == NULL)
return NULL;
mask_node = gsk_mask_node_new (source_child, mask_child, state->data.mask.mask_mode);
mask_node = gsk_mask_node_new (source_child, mask_child);
gsk_render_node_unref (source_child);
gsk_render_node_unref (mask_child);
@@ -1291,11 +1290,9 @@ gtk_snapshot_collect_mask_mask (GtkSnapshot *snapshot,
/**
* gtk_snapshot_push_mask:
* @snapshot: a #GtkSnapshot
* @mask_mode: mask mode to use
*
* Until the first call to [method@Gtk.Snapshot.pop], the
* mask image for the mask operation will be recorded.
*
* After that call, the source image will be recorded until
* the second call to [method@Gtk.Snapshot.pop].
*
@@ -1304,8 +1301,7 @@ gtk_snapshot_collect_mask_mask (GtkSnapshot *snapshot,
* Since: 4.10
*/
void
gtk_snapshot_push_mask (GtkSnapshot *snapshot,
GskMaskMode mask_mode)
gtk_snapshot_push_mask (GtkSnapshot *snapshot)
{
GtkSnapshotState *current_state = gtk_snapshot_get_current_state (snapshot);
GtkSnapshotState *source_state;
@@ -1315,8 +1311,6 @@ gtk_snapshot_push_mask (GtkSnapshot *snapshot,
gtk_snapshot_collect_mask_source,
gtk_snapshot_clear_mask_source);
source_state->data.mask.mask_mode = mask_mode;
gtk_snapshot_push_state (snapshot,
source_state->transform,
gtk_snapshot_collect_mask_mask,
+1 -2
View File
@@ -96,8 +96,7 @@ GDK_AVAILABLE_IN_ALL
void gtk_snapshot_push_blend (GtkSnapshot *snapshot,
GskBlendMode blend_mode);
GDK_AVAILABLE_IN_4_10
void gtk_snapshot_push_mask (GtkSnapshot *snapshot,
GskMaskMode mask_mode);
void gtk_snapshot_push_mask (GtkSnapshot *snapshot);
GDK_AVAILABLE_IN_ALL
void gtk_snapshot_push_cross_fade (GtkSnapshot *snapshot,
+3
View File
@@ -34,10 +34,12 @@
#include "gtkaccessibleprivate.h"
#include "gtkaccessiblerange.h"
#include "gtkadjustment.h"
#include "gtkbox.h"
#include "gtkbutton.h"
#include "gtkbuttonprivate.h"
#include "gtkeditable.h"
#include "deprecated/gtkcelleditable.h"
#include "gtkimage.h"
#include "gtktext.h"
#include "gtkeventcontrollerkey.h"
#include "gtkeventcontrollerfocus.h"
@@ -45,6 +47,7 @@
#include "gtkeventcontrollerscroll.h"
#include "gtkgestureclick.h"
#include "gtkgestureswipe.h"
#include "gtkicontheme.h"
#include "gtkmarshalers.h"
#include "gtkorientable.h"
#include "gtkprivate.h"
-3
View File
@@ -410,9 +410,6 @@ gtk_stack_page_set_property (GObject *object,
{
case CHILD_PROP_CHILD:
g_set_object (&info->widget, g_value_get_object (value));
gtk_accessible_set_accessible_parent (GTK_ACCESSIBLE (info->widget),
GTK_ACCESSIBLE (info),
NULL);
break;
case CHILD_PROP_NAME:
+1 -6
View File
@@ -485,12 +485,7 @@ gtk_text_tag_class_init (GtkTextTagClass *klass)
/**
* GtkTextTag:indent:
*
* Amount to indent the paragraph, in pixels.
*
* A negative value of indent will produce a hanging indentation.
* That is, the first line will have the full width, and subsequent
* lines will be indented by the absolute value of indent.
*
* Amount to indent the paragraph, in pixels.
*/
g_object_class_install_property (object_class,
PROP_INDENT,
+4 -10
View File
@@ -998,11 +998,6 @@ gtk_text_view_class_init (GtkTextViewClass *klass)
* GtkTextView:indent: (attributes org.gtk.Property.get=gtk_text_view_get_indent org.gtk.Property.set=gtk_text_view_set_indent)
*
* Amount to indent the paragraph, in pixels.
*
* A negative value of indent will produce a hanging indentation.
* That is, the first line will have the full width, and subsequent
* lines will be indented by the absolute value of indent.
*
*/
g_object_class_install_property (gobject_class,
PROP_INDENT,
@@ -4689,6 +4684,10 @@ gtk_text_view_size_allocate (GtkWidget *widget,
}
g_object_unref (layout);
/* The GTK resize loop processes all the pending exposes right
* after doing the resize stuff, so the idle sizer won't have a
* chance to run. So we do the work here.
*/
gtk_text_view_flush_first_validate (text_view);
chooser = g_object_get_data (G_OBJECT (text_view), "gtk-emoji-chooser");
@@ -4872,8 +4871,6 @@ gtk_text_view_invalidate (GtkTextView *text_view)
DV (g_print (G_STRLOC": adding incremental validate idle %d\n",
priv->incremental_validate_idle));
}
gtk_widget_queue_allocate (GTK_WIDGET (text_view));
}
static void
@@ -5841,9 +5838,6 @@ gtk_text_view_paint (GtkWidget *widget,
g_return_if_fail (priv->xoffset >= - priv->left_padding);
g_return_if_fail (priv->yoffset >= - priv->top_margin);
if (priv->first_validate_idle != 0)
g_critical ("textview: paint with unfinished validation\n");
while (priv->first_validate_idle != 0)
{
DV (g_print (G_STRLOC": first_validate_idle: %d\n",
+6 -11
View File
@@ -42,6 +42,10 @@
#include "gtkcssnumbervalueprivate.h"
#include "gtkcsswidgetnodeprivate.h"
#include "gtkdebug.h"
#include "gtkgesturedrag.h"
#include "gtkgestureprivate.h"
#include "gtkgesturesingle.h"
#include "gtkgestureswipe.h"
#include "gtkgestureprivate.h"
#include "gtklayoutmanagerprivate.h"
#include "gtkmain.h"
@@ -66,6 +70,7 @@
#include "gtktooltipprivate.h"
#include "gsktransformprivate.h"
#include "gtktypebuiltins.h"
#include "gtkversion.h"
#include "gtkwidgetpaintableprivate.h"
#include "gtkwindowgroup.h"
#include "gtkwindowprivate.h"
@@ -75,7 +80,6 @@
#include "gdk/gdkeventsprivate.h"
#include "gdk/gdkprofilerprivate.h"
#include "gdk/gdkframeclockprivate.h"
#include "gsk/gskdebugprivate.h"
#include "gsk/gskrendererprivate.h"
@@ -10572,14 +10576,6 @@ static void
gtk_widget_set_alloc_needed (GtkWidget *widget)
{
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GdkFrameClock *frame_clock = gtk_widget_get_frame_clock (widget);
if (frame_clock != NULL &&
gdk_frame_clock_get_current_phase (frame_clock) == GDK_FRAME_CLOCK_PHASE_PAINT)
{
g_warning ("%s %p set alloc-needed during PAINT\n",
G_OBJECT_TYPE_NAME (widget), widget);
}
priv->alloc_needed = TRUE;
@@ -12602,8 +12598,7 @@ gtk_widget_class_add_action (GtkWidgetClass *widget_class,
* actions to be added for all instances of this class.
*
* Actions installed by this function are stateless. The only state
* they have is whether they are enabled or not (which can be changed with
* [method@Gtk.Widget.action_set_enabled]).
* they have is whether they are enabled or not.
*/
void
gtk_widget_class_install_action (GtkWidgetClass *widget_class,
+5
View File
@@ -27,10 +27,15 @@
#include "gtkwindowprivate.h"
#include "gtkaccessibleprivate.h"
#include "gtkaccelgroupprivate.h"
#include "gtkactionable.h"
#include "gtkapplicationprivate.h"
#include "gtkbox.h"
#include "gtkbuildable.h"
#include "gtkbuilderprivate.h"
#include "gtkcheckbutton.h"
#include "gtkcsscornervalueprivate.h"
#include "gtkcsscolorvalueprivate.h"
#include "gtkcssshadowvalueprivate.h"
#include "gtkdroptargetasync.h"
#include "gtkeventcontrollerlegacy.h"
+1
View File
@@ -20,6 +20,7 @@
#include "gtkwindowhandle.h"
#include "gtkactionmuxerprivate.h"
#include "gtkbinlayout.h"
#include "gtkbox.h"
#include "gtkbuildable.h"
-6
View File
@@ -1140,12 +1140,6 @@ populate_render_node_properties (GListStore *store,
break;
case GSK_MASK_NODE:
{
GskMaskMode mode = gsk_mask_node_get_mask_mode (node);
tmp = g_enum_to_string (GSK_TYPE_MASK_MODE, mode);
add_text_row (store, "Mask mode", tmp);
g_free (tmp);
}
break;
case GSK_BLUR_NODE:
+4 -4
View File
@@ -14,7 +14,7 @@
<property name="shrink-start-child">0</property>
<property name="resize-start-child">0</property>
<property name="vexpand">1</property>
<property name="start-child">
<child>
<object class="GtkPlacesSidebar" id="places_sidebar">
<property name="show-other-locations">1</property>
<property name="show-trash">0</property>
@@ -25,8 +25,8 @@
<signal name="show-error-message" handler="places_sidebar_show_error_message_cb" swapped="no"/>
<signal name="show-other-locations-with-flags" handler="places_sidebar_show_other_locations_with_flags_cb" swapped="no"/>
</object>
</property>
<property name="end-child">
</child>
<child>
<object class="GtkBox">
<property name="orientation">1</property>
<child>
@@ -526,7 +526,7 @@
</object>
</child>
</object>
</property>
</child>
</object>
</child>
</object>

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