Compare commits

...

605 Commits

Author SHA1 Message Date
Matthias Clasen 1ffd8eccee gdk: Enable unity builds
Instruct meson to compile all gsk sources in one pass. This lets
the compiler inline freely between our sources, and is much nicer
than moving functions into the headers as static inlines.
2024-09-09 10:00:05 -04:00
Matthias Clasen 157e60247f vulkan context: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 621bec6af3 toplevel: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 6c1e5b1fa4 texture: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 916108d2c6 surface: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen b499003385 seat: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 46b62aea09 paintable: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 58b711ed97 monitor: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen dbef8b02c3 memory texture builder: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 5553aa421a memory format: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 10587936b9 keys: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 410802b9af gl texture builder: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen b554b516aa gl texture: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen df7f5d083a gl context: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 7de829b4d7 frame clock idle: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 4819cd5155 frame clock: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 2fa94cb2c3 drop: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 12dc857cdf dmabuf texture builder: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen a039a85e44 draw context: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen 09e368cffc drag: Prefix statics
This is a step towards enabling unity builds for gdk.
2024-09-09 10:00:05 -04:00
Matthias Clasen b009d07cdc display manager: Prefix statics
This is a step towards unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen bdaae0b4e2 display: Prefix statics
This is a step towards unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen 54acae8036 device: Prefix statics
This is a step towards enabling unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen e0d7da80bf cursor: Prefix statics
This is a step towards unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen fcd9b7245e content serializer: Prefix statics
This is a step towards unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen e29b7d0b0d content provider: Prefix statics
This is a step towards unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen fc9df1308c content deserializer: Prefix statics
This is a step towards enabling unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen 1683ab3ca0 colorstate: Cosmetics 2024-09-09 10:00:05 -04:00
Matthias Clasen 56004fd998 clipboard: Prefix statics
This is a step towards enabling unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen e4105228a1 file transfer portal: Prefix statics
This is a step towards enabling unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen dc97b03e69 cicp params: Prefix statics
This is a step towards enabling unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen 836dcfb173 app launch context: prefix statics
This is a step towards enabling unity builds.
2024-09-09 10:00:05 -04:00
Matthias Clasen 2424a51918 gsk: Enable unity builds
Instruct meson to compile all gsk sources in one pass. This lets
the compiler inline freely between our sources, and is much nicer
than moving functions into the headers as static inlines.
2024-09-09 10:00:05 -04:00
Matthias Clasen 0dd45e8625 gsk: Some more renamings
Apply the necessary renamings in gskrenderer.c as well.
2024-09-09 10:00:05 -04:00
Matthias Clasen 111166cc59 gpu: Some renamings
Some renamings in gsk/gpu/ to avoid conflict between statics in
different source files.
2024-09-09 10:00:05 -04:00
Matthias Clasen 491e980ec6 gl: More renamings
This commit renames some common things such as PROP_FOO enum values
or properties[] arrays to be uniquly named for each source file.
There are also a number of naming conflicts between gsk/gl and
gsk/gpu, which are addressed at the same time.
2024-09-09 10:00:05 -04:00
Matthias Clasen f341455364 cairoblur: Rename a static
Rename a static helper to avoid name clashes.
2024-09-09 10:00:05 -04:00
Matthias Clasen 61e7b7be21 gskpath: Rename some statics
Rename statics to be unique among other source files in gsk.
This is a step towards enabling unity builds, where all sources
are compiled together.
2024-09-09 10:00:05 -04:00
Matthias Clasen 8e60674835 gsk: Consolidate common helpers
Move common helper functions and macros such as DEG_TO_RAD
or sincos to gskprivate. This is a step towards using
a unity build (where all sources are compiled together).
2024-09-09 10:00:05 -04:00
Daniel Mustieles b27e67999b Update Spanish translation 2024-09-09 09:26:15 +00:00
Balázs Úr 3177fd14f9 Update Hungarian translation 2024-09-09 06:26:41 +00:00
Benjamin Otte 9ba41ed6e8 Merge branch 'wip/otte/blur-and-blit' into 'main'
Fix blur for opaque textures

Closes #6980

See merge request GNOME/gtk!7697
2024-09-09 04:46:43 +00:00
Matthias Clasen 70f2e2e09c Merge branch 'matthiasc/for-main' into 'main'
docs: Sync docs for GDK_VULKAN_DISABLE

See merge request GNOME/gtk!7700
2024-09-09 03:53:50 +00:00
Benjamin Otte 56fc8f0077 gpu: Blur opaque textures correctly
Opaque textures don't clamp to transparent but instead to black.
We didn't consider this, so we were blurring their edges into blackness
not into transparency.

Fix this by adding the GSK_GPU_AS_IMAGE_SAMPLED_OUT_OF_BOUNDS flag
and respecting it in the implementation that uses it.

Test included.

Fixes #6980
2024-09-09 05:10:51 +02:00
Benjamin Otte 85abff343e ngl: Images are not blittable if they have a swizzle
Swizzling is not respected for blitting.
See commit 058252e895 for the same change in Vulkan.
Apparently that never made it to ngl.

The next commit will have a test for this.
2024-09-09 04:18:13 +02:00
Benjamin Otte 6cefdfeddd testsuite: Fix udmabuf creation
We were using the wrong format and color state when downloading the
data.

Tests not included in this commit, but a few commits later.
2024-09-09 04:18:13 +02:00
Matthias Clasen 75fa51ef6d Cosmetics
Fix a typo
2024-09-08 19:35:53 -04:00
Matthias Clasen 4181b4b142 docs: Sync docs for GDK_VULKAN_DISABLE
Add swapchain-maintenance, and remove some no longer used values.
2024-09-08 19:35:00 -04:00
Benjamin Otte 7b55d2cf1a Merge branch 'wip/otte/for-main' into 'main'
vulkan: Enable VK_EXT_swapchain_maintenance1 if available

See merge request GNOME/gtk!7696
2024-09-08 23:25:36 +00:00
Benjamin Otte 03230181ce gpu: Add GskGpuAsImageFlags
I've had a need for flags for the get_as_image() call but so far have
been able to work around it. But now it seems I might finally need it.

This just introduces the flags but doesn't add any.

Related: #6980
2024-09-09 01:25:03 +02:00
Benjamin Otte 5e4f692e63 tiff: Store RGBx images as 4 channels
Set the alpha channel to "undefined" in this case.

Gimp doesn't seem to like this when opening the image and insists to
doing something with it, that's a bit of a bummer.

But it allows GTK to load RGBx textures.
2024-09-09 01:25:03 +02:00
Matthias Clasen e9a046c439 Merge branch 'dead-hamza' into 'main'
imcontextsimple: Handle dead_hamza

See merge request GNOME/gtk!7699
2024-09-08 22:58:11 +00:00
Mohamed Akram 182de7c957 imcontextsimple: Handle dead_hamza 2024-09-09 00:02:29 +04:00
Aurimas Černius 6c939819a3 Update Lithuanian translation 2024-09-08 19:12:24 +00:00
Matthias Clasen 6288be286f Merge branch 'matthiasc/for-main' into 'main'
gsk: Small optimization

See merge request GNOME/gtk!7698
2024-09-08 17:29:27 +00:00
Matthias Clasen 76a13596aa gpu: Reduce per-glyph overhead
Pull the shader clip computation out of the loop in the common
case that the entire node is contained in the clip.
2024-09-08 12:57:31 -04:00
Matthias Clasen c18cd6050b gpu: Use gsk_gpu_colorize_op2
This reduces the cost of these calls significantly, and this is
the inner loop of the node processor.
2024-09-08 12:43:02 -04:00
Matthias Clasen 60f5d4c93e gpu: Add a variant of gsk_gpu_colorize_op
This variant takes the color_states, instead of computing it
anew from the ccs and the color state of the color. This will
be used to pull this work out of the loop in add_glyph_node.
2024-09-08 12:41:48 -04:00
Matthias Clasen 03840151ac gsk: Drop an unused variable
We're not using last_image for anything.
2024-09-08 11:48:43 -04:00
Matthias Clasen 2e44f3e2ff gsk: Get the text node color once
We don't need to do this in the loop.
2024-09-08 11:48:43 -04:00
Matthias Clasen 4f9fd5cf1d Add gsk_text_node_get_font_hint_style
Getting the hint style is one of the more expensive calls we do
when adding glyph nodes, so cache this information in the node.
2024-09-08 11:48:43 -04:00
Matthias Clasen 59f334622b rendernode: Inline gsk_render_node_get_node_type
This is the most-called function on render nodes.
2024-09-08 11:48:43 -04:00
Matthias Clasen c505a08e46 gsk: Small optimization
Avoid calling gsk_container_node_get_child in a loop.
2024-09-08 11:48:43 -04:00
Benjamin Otte ffae0010c4 vulkan: Set VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT
It seems Mesa doesn't support that yet, but having it doesn't hurt.

And it allows drivers to allocate less memory for the swapchains,
because we don't need all the 4 images we request in minImageCount.
But drivers tend to take that minimum image count as gospel, so we need
to use a higher number to not cause lag in corner cases.
2024-09-08 16:22:49 +02:00
Benjamin Otte 6c72a223f5 vulkan: Enable VK_EXT_swapchain_maintenance1 if available
This just adds the plumbing, usage will happen later.

For testing, GDK_VULKAN_DISABLE=swapchain-maintenance will turn it off.
2024-09-08 16:22:49 +02:00
Benjamin Otte 5a027594c3 vulkan: Add gdk_vulkan_context_has_feature()
A siimplification that will come in handy in the future.
2024-09-08 16:22:49 +02:00
Ask Hjorth Larsen ebc3600f78 Update Danish translation 2024-09-08 14:15:54 +00:00
Arjan Molenaar ae0cf9ff54 Merge branch 'amolenaar/focus-im-popups' into 'main'
macos: Fix popup window and keyboard input

Closes #6950 and #5049

See merge request GNOME/gtk!7653
2024-09-08 12:54:24 +00:00
Andi Chandler 08bf8b7464 Update British English translation 2024-09-08 12:26:07 +00:00
Hugo Carvalho 0201abca5e Update Portuguese translation 2024-09-08 10:38:11 +00:00
Asier Sarasua Garmendia d87b566c59 Update Basque translation 2024-09-08 08:03:53 +00:00
Ekaterine Papava 572b4140f9 Update Georgian translation 2024-09-08 03:58:29 +00:00
Matthias Clasen 6241471f3e Merge branch 'matthiasc/for-main' into 'main'
gpu: Print blur colors

See merge request GNOME/gtk!7695
2024-09-07 18:46:10 +00:00
Matthias Clasen 1ae9cdb4c9 gpu: Print blur colors
Relevant information when debugging shadows.
2024-09-07 12:34:04 -04:00
Daniel Rusek c1e1b54034 Update Czech translation 2024-09-07 15:52:31 +00:00
Matthias Clasen f654cb7d3b Merge branch 'docs-remove-gtk-attribute' into 'main'
docs: Remove custom org.gtk.Method and org.gtk.Property annotations

See merge request GNOME/gtk!7335
2024-09-07 14:39:19 +00:00
Alexander Shopov 85beb4fa20 Update Bulgarian translation 2024-09-07 12:50:50 +00:00
twlvnn kraftwerk a0e81996eb Update Bulgarian translation
(cherry picked from commit 090fcfe503)
2024-09-07 12:13:48 +00:00
Maximiliano Sandoval ec477ef71d docs: Document property annotations in README.md 2024-09-07 09:51:33 +02:00
Maximiliano Sandoval 3afc760644 docs: Manually remove property annotations
We remove the annotations that did not match the regex of the previous commits.
2024-09-07 09:51:33 +02:00
Maximiliano Sandoval ba32140671 docs: Remove all org.gtk.Method annotations
Removed via regex and grep.
2024-09-07 09:51:32 +02:00
Maximiliano Sandoval 91d36dd410 docs: Remove all org.gtk.Property annotations
Removed via regex and grep.

The following were intentionally not removed:

- GtkImage:file: (attributes org.gtk.Property.set=gtk_image_set_from_file)
- GtkImage:resource: (attributes org.gtk.Property.set=gtk_image_set_from_resource)

As they have no getter and (setter PROP) without a (getter PROP) crash
gobject-introspection. This is fixed by
https://gitlab.gnome.org/GNOME/gobject-introspection/-/commit/ad3118eb519d40131ae90f4cf9b55c991c30821b.
2024-09-07 09:51:32 +02:00
Maximiliano Sandoval 4fd1e32752 docs: Use correct property gir annotations
The annotations should only be set when the name of the setter or getter
for a property "GtkClassName:prop-name" is not gtk_class_name_g(s)et_property_name.
2024-09-07 09:51:26 +02:00
Matthias Clasen b538adf2c0 Post-release version bump 2024-09-06 23:07:08 -04:00
Matthias Clasen d16c9fbaca 4.16.0 2024-09-06 22:51:07 -04:00
Matthias Clasen 0274294a6f Merge branch 'wip/otte/cpu-mipmap' into 'main'
gpu: Allow uploading of mipmap levels when tiling

See merge request GNOME/gtk!7657
2024-09-06 22:14:37 +00:00
Matthias Clasen 03b19d8861 docs: Recommend glycin for image loading
Best to send people elsewhere to avoid misunderstandings of our api.
2024-09-06 16:52:47 -04:00
Matthias Clasen 171612671f demo: Beef up the image scaling demo
Add buttons for loading the Portland Rose, and a nameless large
png. Make them load the texture in a thread, to demonstrate better
handling of large images.
2024-09-06 16:14:24 -04:00
Matthias Clasen d3db28b3f4 memory format: Add profiler marks
Add profiler marks to our long-running threaded operations.
To avoid spamming profiles too much, only report runs that take
at least 0.5 ms.
2024-09-06 16:14:24 -04:00
Benjamin Otte 896ea5b753 memoryformat: Add linear/nearest choice for mipmaping
linear will average all the pixels for the lod, nearest will just pick
one (using the same method as OpenGL/Vulkan, picking bottom right
center).

This doesn't really make linear/nearest filtering work as it should
(because it's still a form of mipmaps), but it has 2 advantages:

1. it gets closer to the desired effect

2. it is a lot faster

Because only 1 pixel is chosen from the original image, instead of
averaging all pixels, a lot less memory needs to be accessed, and
because memory access is the bottleneck for large images, the speedup is
almost linear with the number of pixels not accessed.
And that means that even for lot level 3, aka 1/8th scale, only 1/64 of
the pixels need to be accessed, and everything is 50x faster.

Switching gtk4-demo --run=image_scaling to linear/nearest makes all the
lag go away for me, even with a 64k x 64k image.
2024-09-06 15:47:35 -04:00
Benjamin Otte 5498b077fd memoryformat: Parallelize gdk_memory_mipmap() 2024-09-06 15:47:34 -04:00
Benjamin Otte 534a9b6ba0 memoryformat: Add fast path for mipmap
We have fast conversion functions, use those directly instead of calling
into gdk_memory_convert().

This is useful because as mentioned before, the main optimization here
is RGB8 => RGBA8 and we have a fastpath for that.
2024-09-06 15:47:34 -04:00
Benjamin Otte cea961f4f4 memoryformat: Take src_format and dest_format
Why do we need this? Because RGB images are provided in RGB format but
GPUs can't handle RGB, only RGBA, so we need to convert.

And we need to do that without allocating too much memory, because
allocating memory is slow. Which means in aprticular we need to do the
conversion after mipmapping, not before (like we were doing).
2024-09-06 15:47:34 -04:00
Benjamin Otte 848c6815d3 gpu: Allow uploading of mipmap levels when tiling
This allows uploading less memory but requires computing lod levels on
the CPU which is slow because it reads through all of the memory and so
far entirely not optimized.

However, it uses significantly less VRAM.

This is done by adding a gdk_memory_mipmap() function that does this
task.
The texture upload op now accepts a lod level and if that is >0 it uses
gdk_memory_mipmap() on the source texture.
2024-09-06 15:47:34 -04:00
Benjamin Otte 46559039f3 memoryformat: Parallelize gdk_memory_convert_color_state() 2024-09-06 15:47:34 -04:00
Benjamin Otte eb7a42bc13 memoryformat: Parallelize generic path of gdk_memory_convert() 2024-09-06 15:47:34 -04:00
Benjamin Otte ffe56fe6b3 memoryformat: Parallelize
Refactor code so that it uses g_parallel_task_run().
2024-09-06 15:47:34 -04:00
Benjamin Otte d4ba57fcc3 gdk: Add gdk_parallel_task_run()
This is just the API. Users will come later.

I considered putting it into gdkmemoryformat.c because it's likely gonna
be the only user and this one function is so little code, but it didn't
fit at all.
So now it's a new file.
2024-09-06 15:47:34 -04:00
Benjamin Otte a95c9ebc51 memoryformat: Split out a function
Allow querying the fast conversion functions outside of
gdk_memory_convert().
2024-09-06 15:47:34 -04:00
Benjamin Otte 9195c39756 build: Alphabetic order is hard 2024-09-06 15:47:34 -04:00
Mat e0ffeb8ded macos: simplify access to native widget. 2024-09-06 16:12:56 +00:00
Matthias Clasen d9bb434c1f Merge branch 'bad-relative-color' into 'main'
css: Avoid a crash with relative colors

Closes #6985

See merge request GNOME/gtk!7693
2024-09-06 15:05:27 +00:00
Juliano de Souza Camargo 866c83909c Update Brazilian Portuguese translation 2024-09-06 13:00:13 +00:00
Luca Bacci 4965b7b6fa Merge branch 'wgl-updates' into 'main'
WGL Updates

Closes #6975

See merge request GNOME/gtk!7692
2024-09-06 12:47:41 +00:00
Matthias Clasen 45f3e86457 css: Allocate less when searching themes
We trawl through a whole bunch of directories, but we can do it
without allocation quite so much.
2024-09-06 07:54:59 -04:00
Matthias Clasen c033de9b83 css: Simplify theme loading
There is no need to do a detour through a GFile here.
Just load the resource.
2024-09-06 07:54:37 -04:00
Matthias Clasen 3f7f9b705e css: Avoid a crash with relative colors
rgba(from @foo ...) would crash if @foo was not a named color.
Handle it as we do elsewhere, by returning NULL from resolve().

Test included.

Fixes: #6985
2024-09-06 07:54:37 -04:00
Matthias Clasen b6d19f4c8b Fix css tests
Disable css deprecation warnings for the style tests. We want to
be able to do tests with named colors here.
2024-09-06 07:54:37 -04:00
Andika Triwidada 3a2b8f94ec Update Indonesian translation 2024-09-06 04:13:55 +00:00
Matthias Clasen 3a5933a519 Merge branch 'mcatanzaro/#6983' into 'main'
popover: fix critical on pop down

Closes #6983

See merge request GNOME/gtk!7691
2024-09-06 00:14:09 +00:00
Matthias Clasen 4c295dc49c popover: Avoid unnecessary work
If the popover isn't visible, no need to do any extra
'cascade' work. This also helps to avoid running into
trouble during finalization when the parents are already
gone.
2024-09-05 15:27:55 -04:00
Emin Tufan Çetin 03ebb41262 Update Turkish translation 2024-09-05 18:02:12 +00:00
Yaron Shahrabani b0c3265561 Update Hebrew translation 2024-09-05 12:43:43 +00:00
Danial Behzadi 98943b28aa Update Persian translation 2024-09-05 12:16:59 +00:00
Vasil Pupkin c354c5a63d Update Belarusian translation 2024-09-05 10:03:35 +00:00
Tim Sabsch 2f8cb9b2d0 Update German translation 2024-09-04 18:21:04 +00:00
Luca Bacci 7559a87e8a WGL: Detect MESA D3D12 driver and request GDI compatibility
This way we get a non-opaque framebuffer / render target

Fixes #6975

References:
  [1] https://gitlab.gnome.org/GNOME/gtk/-/issues/6975
  [2] https://gitlab.freedesktop.org/mesa/mesa/-/issues/11828
2024-09-04 20:02:44 +02:00
Luca Bacci b2394691cc Inspector: Fix append_wgl_extension_row()
wglGetExtensionsStringARB takes an HDC argument even though it
checks extensions for the current context. This was done for future
extensibility. From [1]:

>    Should this function take an hdc? It seems like a good idea. At
>    some point MS may want to incorporate this into OpenGL32. If they
>    do this and and they want to support more than one ICD, then an HDC
>    would be needed.

Currently the HDC argument is unused, but still wglGetExtensionsStringARB()
is required to check if HDC is valid:

>    If <hdc> does not indicate a valid device context then the function
>    fails and the error ERROR_DC_NOT_FOUND is generated. If the function
>    fails, the return value is NULL. To get extended error information,
>    call GetLastError.

So wglGetExtensionsStringARB fails if we pass NULL. Here we can pass any
valid HDC, like for example the screen DC returned by GetDC(NULL), but
probably using wglGetCurrentDC() makes most sense.

Reference:
  [1] - https://registry.khronos.org/OpenGL/extensions/ARB/WGL_ARB_extensions_string.txt
2024-09-04 20:02:29 +02:00
Yuri Chornoivan 5a94004b59 Update Ukrainian translation 2024-09-04 16:46:15 +00:00
Michael Catanzaro 3bd609d77c popover: fix critical on pop down
It's expected that there may be no parent widget to grab focus.

This fixes 2299c02639.

Fixes #6983
2024-09-04 11:25:50 -05:00
Luca Bacci 84d2961a91 Inspector: Sync WGL extensions with GdkWin32GLContextWGL
Replace WGL_EXT_pixel_format with WGL_ARB_pixel_format and drop
WGL_ARB_MULTISAMPLE (unused).
2024-09-04 17:10:39 +02:00
Luca Bacci 3a9f26113f WGL: Fix attribs_remove_last() 2024-09-04 17:07:01 +02:00
Luca Bacci 6a240c36ac WGL: Swap core / compat in debug output 2024-09-04 17:04:58 +02:00
Luca Bacci aaf4261969 WGL: Include renderer string in debug output 2024-09-04 17:03:54 +02:00
Arjan Molenaar 0211299846 macos: Fix input source popup placement in popovers 2024-09-04 17:03:14 +02:00
Arjan Molenaar aca11d6879 macos: Only allow keyboard focus on toplevel windows
This avoids the focus to move to a popup or popover window.
The red/yellow/green buttons remain colored.
2024-09-04 17:03:14 +02:00
Luca Bacci 5dceb7f7d2 WGL: Make context current to get debug info
Otherwise we get NULL from glGetString()
2024-09-04 17:02:20 +02:00
Martin 3372b1a84b Update Slovenian translation 2024-09-04 14:26:58 +00:00
Luming Zh 75a4eca13a Update Chinese (China) translation 2024-09-04 13:21:40 +00:00
Jordi Mas i Hernandez 13f0ab881e Update Catalan translation 2024-09-04 12:40:06 +00:00
Fran Dieguez d4b45526b2 Update Galician translation 2024-09-04 06:34:09 +00:00
Fran Dieguez c06e1f4848 Update Galician translation 2024-09-04 06:11:36 +00:00
Matthias Clasen 6a4a52d110 Merge branch 'Enokilis-main-patch-44493' into 'main'
Typo in gtk/gtkcssprovider.c

See merge request GNOME/gtk!7688
2024-09-03 21:07:50 +00:00
Matthias Clasen ed6f5b8755 Merge branch 'stroke-autoptr' into 'main'
gsk: Add autoptr cleanup function for GskStroke

See merge request GNOME/gtk!7690
2024-09-03 17:15:10 +00:00
Philip Withnall e87b4dca71 gsk: Add autoptr cleanup function for GskStroke
It appeared to be missing, while other GSK types already have cleanup
functions defined.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-09-03 16:50:10 +01:00
Benjamin Otte 567c8b5ab3 Merge branch 'wip/smcv/debug-gsk-scaling-test' into 'main'
gsk/scaling test: Improve debuggability on failure

See merge request GNOME/gtk!7680
2024-09-03 15:30:32 +00:00
Benjamin Otte 7aeca0512c Merge branch 'wip/smcv/bug6977' into 'main'
scaling test: Fix intermittent failure with alpha = 0

Closes #6977

See merge request GNOME/gtk!7684
2024-09-03 15:27:20 +00:00
Matthias Clasen 5567934fc9 Merge branch 'wip/smcv/misc-realize' into 'main'
testsuite: If gsk_renderer_realize() fails, say why

See merge request GNOME/gtk!7686
2024-09-03 11:11:11 +00:00
Daniel Mustieles 63bece1fe7 Update Spanish translation 2024-09-03 09:25:56 +00:00
Simon McVittie ad3c285fc6 scaling test: Show the input and expected average after each failed test
Signed-off-by: Simon McVittie <smcv@debian.org>
2024-09-03 10:19:16 +01:00
Simon McVittie 47c461b25b testsuite: Show pixel format of texture pixels that differ
Signed-off-by: Simon McVittie <smcv@debian.org>
2024-09-03 10:05:32 +01:00
Simon McVittie 97f0aa7875 testsuite: Share memorytexture version of compare_textures()
Unlike the version in scaling.c, this one incorporates debugging code
to print the pixels that differ.

Signed-off-by: Simon McVittie <smcv@debian.org>
2024-09-03 10:05:32 +01:00
Simon McVittie 8e54460a48 testsuite: Extract common code from gdk/memorytexture and gsk/scaling
Signed-off-by: Simon McVittie <smcv@debian.org>
2024-09-03 10:05:32 +01:00
Simon McVittie 4c4d260199 scaling test: Avoid dividing zero by zero
If all four of the random colours have alpha channel exactly 0.0,
then the computed premultiplied average will also be zero.
Normalize the expected colour to (0,0,0,0) rather than (NaN,NaN,NaN,0).

Resolves: https://gitlab.gnome.org/GNOME/gtk/-/issues/6977
Signed-off-by: Simon McVittie <smcv@debian.org>
2024-09-03 10:03:58 +01:00
Jürgen Benvenuti b18c6b5781 Update German translation 2024-09-03 05:06:47 +00:00
Enokilis d76e241558 Fixed typo that prevented theme update in the GTK4 demo. 2024-09-03 02:34:49 +00:00
Simon McVittie 13cbd9fcc7 testsuite: If gsk_renderer_realize() fails, say why
Showing the error message is usually more useful for debugging than
just saying that something failed.

Signed-off-by: Simon McVittie <smcv@debian.org>
2024-09-03 02:44:24 +01:00
Matthias Clasen 6e54589d9e Merge branch 'matthiasc/for-main' into 'main'
gtk-demo: Cosmetics

See merge request GNOME/gtk!7678
2024-09-02 22:16:01 +00:00
Fran Dieguez c781c0ff24 Update Galician translation 2024-09-02 17:23:04 +00:00
Benjamin Otte 0277e26152 Merge branch 'wip/otte/for-main' into 'main'
gpu: Use right GL context when exporting texture

See merge request GNOME/gtk!7679
2024-09-01 23:08:49 +00:00
Benjamin Otte 563cce5530 gsk: Use gsk_rect_init_offset() everywhere
... and make it use a graphene_point_t as argument, because that's what
the callers want.
2024-09-02 00:22:37 +02:00
Benjamin Otte b0e4be7fda rendernode: Colors should not influence depth decisions
Depth of a rendernode should be determined by the textures used and the
compositing colorstate requirements.
Colors influence the colorstate choice, so they indirectly influence the
depth, but they should not influence the depth directly.

Otherwise a single color in a border being rec2100-pq would make us
switch to 16bit float.

Also remove gdk_color_get_depth(), because it was only used here and
because again: Colors should not influence depth decisions.
2024-09-02 00:22:37 +02:00
Benjamin Otte e29701a203 gl: Handle GDK_MEMORY_NONE depth
In rare circumstances a rendernode can be MEMORY_NONE and we don't want
to render it as a float texture then.
2024-09-02 00:22:37 +02:00
Benjamin Otte 6a1cd87480 gpu: Use builder for memory texture 2024-09-01 22:49:34 +02:00
Benjamin Otte 3db858b45f window: Remove unused code 2024-09-01 22:49:34 +02:00
Benjamin Otte 49ee69f316 gpu: Use right GL context when exporting texture
We want to use the display's context on the resulting texture,
but we do not want to use it for the stufff we need to do while
exporting - most importantly the GLsync.

Fixes #6976
2024-09-01 22:49:34 +02:00
Aurimas Černius b43e0a3423 Update Lithuanian translation 2024-09-01 20:16:16 +00:00
Arjan Molenaar 8054099d0e Merge branch 'amolenaar/macos-maximize-and-transparency' into 'main'
macos: Fix maximizing windows

See merge request GNOME/gtk!7650
2024-09-01 19:22:38 +00:00
Matthias Clasen a8e49cc21f gtk-demo: Cosmetics
Don't print out when the user just canceled the print dialog,
in the fill and stroke demo.
2024-09-01 10:33:27 -04:00
Matthias Clasen 5f1ec18550 Merge branch 'popover-menu-resize' into 'main'
MenuSectionBox: Increase priority of separator sync function

Closes #5166

See merge request GNOME/gtk!6699
2024-09-01 14:04:07 +00:00
Matthias Clasen 6b5c5714e5 Merge branch 'gdksurface-broadway-fix' into 'main'
gdk: Add missed compute_size and request_layout vfunc to GdkBroadwaySurface

Closes #4527

See merge request GNOME/gtk!4277
2024-09-01 13:48:22 +00:00
Maxim Zakharov 9a8e5b07ae gdk: Add missed compute_size and request_layout vfunc to GdkBroadwaySurface 2024-09-01 13:48:22 +00:00
Matthias Clasen 3f4cf65686 Merge branch 'fix_model_button_states' into 'main'
a11y: Set expanded states properly when switching to a submenu

See merge request GNOME/gtk!7305
2024-09-01 11:59:47 +00:00
Lukáš Tyrychtr 345eca1efe a11y: Set expanded states properly when switching to a submenu 2024-09-01 11:59:47 +00:00
Matthias Clasen 166afbf8e8 Merge branch 'ebassi/a11y-event-listeners' into 'main'
a11y: Add missing value free function

See merge request GNOME/gtk!7677
2024-09-01 11:20:56 +00:00
Matthias Clasen 9120d1c834 Merge branch 'proper_focus_during_popover_cascaded_popdown' into 'main'
a11y: Ensure the focus lands on the correct element during cascaded popover popdown

See merge request GNOME/gtk!7318
2024-08-31 23:09:04 +00:00
Matthias Clasen 083f9e7723 Merge branch 'numeric-spinbutton-no-emoji' into 'main'
spinbutton: No emoji for numeric input

See merge request GNOME/gtk!7676
2024-08-31 23:04:56 +00:00
Emmanuele Bassi a0cfc6c404 a11y: Turn criticals into debugging messages
It seems we can get spurious de-registrations, so let's avoid spamming
the logs, and also avoid crashes from applications whose maintainer
decided to turn all critical warnings into assertions.
2024-08-31 23:41:21 +01:00
Matthias Clasen edc50c85ef spinbutton: No emoji for numeric input
Continuing from cfc871f031, when a spin button is in numeric mode,
set the no-emoji input hint, since Emoji aren't useful in numeric
input.
2024-08-31 18:23:49 -04:00
Matthias Clasen 4794bc3db6 Remove duplicate semicolon 2024-08-31 22:16:25 +00:00
Lukáš Tyrychtr 2299c02639 a11y: Ensure the focus lands on the correct element during cascaded popover popdown
Previously it ended on the immediate parent of the lowest level popover,
which was not good, as it very likely was some even already hidden widget, or
at least, the a11y machinery thought so.
2024-08-31 22:16:25 +00:00
Emmanuele Bassi ae13a82a9a a11y: Add missing value free function
We allocate the reference counter, so we need to free it.
2024-08-31 22:40:16 +01:00
Matthias Clasen 6c88713f82 Merge branch 'emoji-multi-click' into 'main'
emojichooser: Avoid extra work

Closes #6336

See merge request GNOME/gtk!7675
2024-08-31 21:34:29 +00:00
Matthias Clasen 5c6fedae17 emojichooser: Avoid extra work
When selecting an emoji in the recent section, there is no need
to add it to the recent section again. This avoids a sequence of
unfortunate events, where we reconstruct the entire recent section,
thereby removing the focus child, causing the focus to revert to
the entry, causing the entry to select the entire text. In the
case of Ctrl-clicking to select multiple Emoji, the effect is that
the section Emoji will replace the entire entry text, which is
suprising and unintended.

Fixes: #6336
2024-08-31 16:28:20 -04:00
Hugo Carvalho 5faa1c3d6e Update Portuguese translation 2024-08-31 20:14:46 +00:00
Matthias Clasen 074bcd33be Merge branch 'x11-input-setup-mess' into 'main'
x11: Cosmetics

Closes #6840

See merge request GNOME/gtk!7674
2024-08-31 16:57:55 +00:00
Matthias Clasen 5b6b42b5a9 x11: Fix initialization mess
When prepare_gl fails in the right way (or the wrong way?), we
end up creating the leader window twice, and as a side effect,
creating two instances of the "Virtual core pointer" device, which
is bad news for grabs.

Fixes: #6840
2024-08-31 11:28:52 -04:00
Matthias Clasen ae8a06cdca x11: Cosmetics
Don't return FALSE from a function returning a pointer.
2024-08-31 11:28:52 -04:00
Piotr Drąg c9bbf5820b Update Polish translation 2024-08-31 15:00:38 +02:00
Simon McVittie bb0b764172 Merge branch 'wip/smcv/bug6971' into 'main'
testsuite: Add a suite for tests that require /dev/udmabuf

See merge request GNOME/gtk!7671
2024-08-31 11:53:32 +00:00
Matthias Clasen ae8e9ef650 Merge branch 'vulkan-dnd-offset' into 'main'
vulkan: Use wl_surface_offset

Closes #6972

See merge request GNOME/gtk!7673
2024-08-31 11:47:53 +00:00
Matthias Clasen 8df7ff75bb Merge branch 'radio_role_for_check_button_groups' into 'main'
a11y: Set the correct role for check button groups

See merge request GNOME/gtk!6551
2024-08-31 11:20:16 +00:00
Matthias Clasen bbfd8e0e89 vulkan: Use wl_surface_offset
Call wl_surface_offset in end_frame to apply the offset for drag
surfaces. This matches what the GL draw context already does, and
it fixes drag surfaces jumping at the beginning of the drag.

Fixes: #6972
2024-08-31 07:15:08 -04:00
Matthias Clasen 467212877f Merge branch 'wip/smcv/css-endian' into 'main'
CSS: Fix test failures on 64-bit big-endian machines

See merge request GNOME/gtk!7672
2024-08-31 11:04:45 +00:00
Simon McVittie 204b8857a1 testsuite: Add a suite for tests that require /dev/udmabuf
On GTK's official upstream CI, all Linux runners are meant to have
/dev/udmabuf available, so this should pass. On developer machines or
downstream build environments, this can't be guaranteed (not all kernel
configurations offer that device, and on those that do, an autobuilder
might not have access to it) so make it possible to skip this with
`--no-suite=needs-udmabuf`.

Any future tests that rely on /dev/udmabuf (as opposed to using it for
optional better coverage if available, like replay-node does) can be
aded to the same suite.

Signed-off-by: Simon McVittie <smcv@debian.org>
2024-08-31 10:22:49 +01:00
Simon McVittie a524524ffd gtkcssprovider: Fix sorting of custom property IDs on 64-bit big-endian
This function is used to sort a GPtrArray of "pointers" which are
actually GINT_TO_POINTER (id), so a and b are pointers to pointer-sized
quantities.

Previously it was assuming that both were int-sized quantities,
dereferencing them to get the first sizeof(int) bytes, and then
redundantly casting those bytes to int. However, on a 64-bit big-endian
platform, the first few bytes of a larger-than-int quantity are the
most significant part, in practice 0, causing an out-of-bounds array
access and a crash. This was visible in the
`gtk:css / parser variables.css` automated test.

Bug-Debian: https://bugs.debian.org/1079546
Signed-off-by: Simon McVittie <smcv@debian.org>
2024-08-31 02:26:57 +01:00
Simon McVittie 3ef1f448a3 gtkcssvariableset: Fix listing IDs on big-endian machines
Previously this code assumed that if we have an int stored in a hash
table via GINT_TO_POINTER, we can retrieve the pointer value and treat
its first sizeof(int) bytes as an item to append to a GArray of int.

However, on a 64-bit big-endian system, the first sizeof(int)
bytes of the pointer will be zero, which is not a valid ID for a
GtkCssCustomPropertyPool, causing an out-of-bounds array access and
a crash. This was visible in the `gtk:css / style` automated test.

Bug-Debian: https://bugs.debian.org/1079546
Signed-off-by: Simon McVittie <smcv@debian.org>
2024-08-31 02:04:00 +01:00
Matthias Clasen a5df8f2f35 Merge branch 'dead-hamza-yay' into 'main'
Update a script slightly

Closes #6968

See merge request GNOME/gtk!7670
2024-08-31 00:14:25 +00:00
Emmanuele Bassi b56a8c7f88 Merge branch 'wip/fina/accessible-atspi-fix-error-message' into 'main'
a11y: Consistently use list type for errormessage relation

See merge request GNOME/gtk!7528
2024-08-31 00:08:52 +00:00
Fina Wilke 649782b547 a11y: Consistently use list type for errormessage relation
This more closely matches the spec. This is an API break, however the
atspi backend already assumed that this was a list, and would throw
criticals whenever this relation was set. Therefore it can be assumed
that this relation was not previously in active use.
2024-08-30 20:22:59 +00:00
Matthias Clasen 97245e9baa Merge branch 'ebassi/lazier-a11y' into 'main'
a11y: Watch EventListenerRegistered/Deregistered signals

See merge request GNOME/gtk!7298
2024-08-30 20:17:17 +00:00
Matthias Clasen 0f3c27c8a5 composetable: Handle dead_hamza
A new dead key has been invented.

Fixes: #6968
2024-08-30 16:10:20 -04:00
Matthias Clasen 3273637179 Update keyname tables 2024-08-30 16:03:40 -04:00
Matthias Clasen 1eaa0e9b74 gdkkeysyms.h: Regenerate for libX11 1.8.10 2024-08-30 15:52:58 -04:00
Matthias Clasen 28d1bce2d4 Update a script slightly
Make gdkkeysyms-update.pl use #pragma once, as our headers
do nowadays.
2024-08-30 15:52:14 -04:00
Emmanuele Bassi b8072d8562 a11y: Add a check for sandboxed accessibility bus
When sandboxed, the accessibility bus needs a recent version of Flatpak
and its D-Bus proxy in order to relay event registrations.
2024-08-30 14:24:55 +01:00
Luca Bacci da9886d822 Merge branch 'fix-gdk-win32-display-name' into 'main'
GDK/Win32: Fix gdk_display_get_name()

See merge request GNOME/gtk!7664
2024-08-30 12:32:16 +00:00
Matthias Clasen 747f2e5af6 Merge branch 'demos-window-icons' into 'main'
demos: Set icon for the windows

See merge request GNOME/gtk!7661
2024-08-30 11:14:18 +00:00
Matthias Clasen aeb3ee0969 Merge branch 'update-on-print-comboentry-change' into 'main'
printeroptionwidget: Update on combo-entry change

Closes #6782

See merge request GNOME/gtk!7532
2024-08-30 11:11:55 +00:00
Benjamin Otte e248f1a4b5 Merge branch 'wip/otte/compare-render' into 'main'
Bring compare-render into 21st century

See merge request GNOME/gtk!7648
2024-08-30 11:00:36 +00:00
Arjan Molenaar d23833285e macos: Set transparent background for toplevel window
Toplevel window background is almost transparent.
For fully transparent windows the (macOS) shadow calculatation
becomes really slow.
2024-08-30 12:06:18 +02:00
Daniel Rusek ff9fe6857f Update Czech translation 2024-08-30 09:49:04 +00:00
Emmanuele Bassi 58f2d3fbe7 a11y: Add reference counting to event listeners
Event listeners can register themselves multiple times, and deregister
themselves as well. We need to remove an event listener only if it
dropped all its events.
2024-08-30 09:27:39 +01:00
Emmanuele Bassi d9f75581be a11y: Get event listeners on root registration
We ask the AT-SPI registry for event listeners already registered when
connecting the root object, in case an AT is running.
2024-08-30 09:27:39 +01:00
Emmanuele Bassi 307efe2172 a11y: Do not emit event signals if there are no listeners
Now that we track event listeners, we can skip the accessibility event
emission altogether if we know nothing is on the other side.
2024-08-30 09:27:39 +01:00
Emmanuele Bassi 4ea4dc9176 a11y: Watch EventListenerRegistered/Deregistered signals
Assistive technologies using AT-SPI typically register themselves on the
accessibility bus through the org.a11y.atspi.Registry.RegisterEvent
method, which will emit the EventListenerRegistered signal. We can use
that signal (and its corresponding EventListenerDeregistered sibling) to
know whether there is at least an AT on the other side of the
accessibility bus.
2024-08-30 09:27:39 +01:00
Benjamin Otte fa25015e8c compare-render: Appease clang and MSVC
clang wants consts not initialized from consts.

MSVC can't deal with arrays in initializers.
2024-08-30 06:28:58 +02:00
Benjamin Otte 296b6b1ed5 compare-render: Make the test runner generic
Instead of manually running each of the tests, use a loop and just
invoke the test runner.
2024-08-30 06:28:58 +02:00
Benjamin Otte b88fe301be compare-render: Run clip tests using new runner
This requires adding infrastructure to generate per-test data, so that
the random clip rect can be computed and reused for both test and
reference generation.

So add this infrastructure.
2024-08-30 06:28:58 +02:00
Benjamin Otte ffd836e6f4 compare-render: Run replay tests using new runner 2024-08-30 06:28:58 +02:00
Benjamin Otte 457cf66d0d compare-render: Run mask tests using new runner 2024-08-30 06:28:58 +02:00
Benjamin Otte 36765745a1 compare-render: Run rotate tests using new runner 2024-08-30 06:28:58 +02:00
Benjamin Otte 46c19a3d28 compare-render: Run repeat tests using new runner 2024-08-30 06:28:58 +02:00
Benjamin Otte 6cf928eb6c compare-render: Run flip tests using new runner 2024-08-30 06:28:58 +02:00
Benjamin Otte a0d076f01a compare-render: Run plain tests using new runner
Extend the runner so NULL is accepted as a method to create
reference/test, in which case the unmodified original will be used.
2024-08-30 06:28:58 +02:00
Benjamin Otte 37c744759c compare-render: Add a generic test runner
... and port the colorflip test.

This is so we can factor out generic parts of the code. This allows
making changes easier to those parts, like if we want to introduce
rules for what colorstates and memory depths to do diffs in.
2024-08-30 06:28:58 +02:00
Benjamin Otte 277a05eb8c compare-render: Use consistent naming for files
Instead of the adverb, use the verb term. That matches the argument
passed on the cmdline, so only one string is necessary.
2024-08-30 06:28:58 +02:00
Chun-wei Fan 0376e4668c GDK/Win32: Fix gdk_display_get_name()
We switched to using the Unicode (UTF-16) versions of the Windows API by
default, so we also obtain the display name in UTF-16 form as well.

This updates the implementation in the Windows backend so that we
properly acquire the names that we need in UTF-16, and then convert the
results to UTF-8, which is what we use in GTK/GLib.
2024-08-30 08:47:01 +08:00
Changwoo Ryu 9d5652de64 Update Korean translation 2024-08-29 23:29:49 +00:00
Matthias Clasen bb109b5d9e Merge branch 'matthiasc/for-main' into 'main'
docs: Mention that Broadway is an experiment

See merge request GNOME/gtk!7665
2024-08-29 22:52:39 +00:00
Benjamin Otte d630ddd182 compare-render: Pick colorstate from reference when comparing
When comparing textures, always pick the colorstate from the reference
texture. This allows us to define what color state we expect.

For now, there's no check that the color states are equal, because they
don't really have to be as long as the pixels are.
2024-08-29 20:34:23 +02:00
Benjamin Otte e268041a42 reftest-compare: Respect color states when diffing
Always pick the color state from texture1 and download the data and
generate the diff in that color state.

That now means the order of the 2 arguments matters.
2024-08-29 20:34:23 +02:00
Benjamin Otte f9cbeeeedc reftest-compare: Compare high depth images in high depth
I first tried porting everything to float, but it turns out that that
makes a compare-render run (with all 1520 tests succeeding) 9s slower
so I decided to keep the existing U8 code.

A side benefit is that saving the diff to PNG will continue creating
U8 PNGs.
2024-08-29 20:34:23 +02:00
Benjamin Otte 62542f836f compare-render: Create rotated reference without gdk-pixbuf
We use the renderer to create the reference for the rotate test by
applying the same rotate transform to the reference image instead of the
tested node.

This is somewhat suboptimal because they run very similar codepaths, but
this method works with high bit depth content and different colorstates

This concludes the port away from gdk-pixbuf and means that all rendered
content and reference images can now use high bit depth and colorstates.
2024-08-29 20:34:23 +02:00
Benjamin Otte 6d4c74fdce compare-render: Create masked reference without gdk-pixbuf
We use the renderer to create the reference for the mask test by
rendering the reference clipped.
2024-08-29 20:34:23 +02:00
Benjamin Otte 3dac4a01c6 compare-render: Create colorflipped reference without gdk-pixbuf
We use the renderer to create the reference for the colorflip test by
applying the same colorflip matrix to the reference image instead of the
tested node.

This is somewhat suboptimal because they run very similar codepaths, but
this method works with high bit depth content and different colorstates
2024-08-29 20:34:23 +02:00
Benjamin Otte f598ec00f5 compare-render: Create clipped reference without gdk-pixbuf
We use the renderer to create the reference for the clip test by
applying the same clip node to the reference image instead of the
tested node.

This is somewhat suboptimal because they run very similar codepaths, but
this method works with high bit depth content and different colorstates
2024-08-29 20:34:23 +02:00
Benjamin Otte 6fc18f4b37 compare-render: Create flipped reference without gdk-pixbuf
We use the renderer to create the reference for the flip test by
applying the same transform node to the reference image instead of the
tested node.

This is somewhat suboptimal because they run very similar codepaths, but
this method works with high bit depth content and different colorstates
and the gdk-pixbuf method does not.
2024-08-29 20:34:23 +02:00
Benjamin Otte 8c9f16fa7a compare-render: Create repeated reference without gdk-pixbuf
We use the renderer to create the reference for the repeat test by
applying the same repeat node to the reference image instead of the
tested node.

This is somewhat suboptimal because they run very similar codepaths, but
this method works with high bit depth content and different colorstates
and the gdk-pixbuf method does not.
2024-08-29 20:34:23 +02:00
Benjamin Otte 001ca0a982 compare-render: Split test variant name from extension name
This is preparation for further patches where we want to use a common
codepath for all variants.
2024-08-29 20:34:23 +02:00
Benjamin Otte b23c0248ba compare-render: Don't load reference file twice
Instead, convert from texture to pixbuf.

Ultimately, we want to avoid pixbufs entirely, but we're not there yet.
2024-08-29 20:34:23 +02:00
Benjamin Otte c4c352facc compare-render: Use TAP for the test 2024-08-29 20:34:23 +02:00
Benjamin Otte 30af6d1159 compare-render: Turn into a real test
Use g_test_run() like any other test.
2024-08-29 20:34:23 +02:00
Benjamin Otte 1fac3fe44e compare-render: Compare to reference texture
There's no need to render the original node and compare to its result,
we know that that is equal to the reference image.

Avoids duplicate renderings.
2024-08-29 20:34:23 +02:00
Benjamin Otte 8ac6c08f00 compare-render: Create the reference texture at startup
This allows exiting early when it doesn't exist.
2024-08-29 20:34:23 +02:00
Benjamin Otte 5b62f29b5e compare-render: Rename variables
They conflict with the next commit otherwise.
2024-08-29 20:34:23 +02:00
Benjamin Otte 817cfb09f8 compare-render: Failing to load an image is a failure 2024-08-29 20:34:23 +02:00
Benjamin Otte 8da478ab34 testsuite: Disable a bunch of tests on the GL renderer
We want to generate reference images with the renderers and the GL
renderer can't deal with textures well enough to generate these
reference images.
2024-08-29 20:34:20 +02:00
Matthias Clasen 8d866c5980 docs: Mention that Broadway is an experiment 2024-08-29 07:35:17 -04:00
Jordi Mas 467e622778 Update Catalan translation 2024-08-29 07:13:12 +02:00
Benjamin Otte aa81df921b testsuite: Correct values for red
The value used was for rec2020 (9/14/0/1), not rec2100-pq (9/16/0/1).
2024-08-29 03:01:30 +02:00
Benjamin Otte 328020b241 Merge branch 'wip/otte/for-main' into 'main'
gl: Fix initial EGL context creation on X11

Closes #6964

See merge request GNOME/gtk!7663
2024-08-29 00:36:19 +00:00
Benjamin Otte 41cd0c6f13 gl: Fix initial EGL context creation on X11
After commit 447bc18c48 EGL on X11 broke.

But the handling of the GL context also was quite awkward because it was
unclear who was responsible for ensuring it got reset.

Change that by making gdk_gl_context_clear_current_if_surface() return
the context (with a reference because it might be the last reference) it
had unset, so that after changing EGL properties the code that caused
the clearing can re-make it current.

This moves the responsibility to the actual code that is dealing with
updating properties and frees the outer layers of code from that task.

And that means the X11 EGL code doesn't need to care and the code in the
Wayland backend that did care can be removed.

Related: !7662
Fixes: #6964 on X11
2024-08-29 01:31:47 +02:00
Benjamin Otte db02abe54e Merge branch 'wip/otte/to-make-current-or-not-make-current' into 'main'
wayland: Rework how we handle EGLWindows

Closes #6964

See merge request GNOME/gtk!7662
2024-08-28 18:14:03 +00:00
Benjamin Otte 447bc18c48 wayland: Rework how we handle EGLWindows
This essentially reverts the changes from
c230546a2c but implies new semantics.

Namely, surface-attached contexts can now be bound to EGL_NO_SURFACE if
the windowing system isn't ready yet.

It is the task of the windowing system to make sure the context is
properly rebound when the contents become available.
We ensure this by checking in begin_frame() if we created the EGL window
and if we did, we make_current(). This works because creating the EGL
window creates the EGL surface and that does a clear_current(), so this
is always going to have the desired effect of re-making the current
context.

It is very convoluted though.

Fixes: #6964
Related: https://gitlab.freedesktop.org/mesa/mesa/-/issues/11784
2024-08-28 19:09:45 +02:00
Balló György 283c66251b demos: Set icon for the windows 2024-08-28 17:02:44 +02:00
Luca Bacci 63b68d2f5e Merge branch 'gdk-win32-incremental-rendering-fixes' into 'main'
GdkWin32: Incremental rendering fixes

See merge request GNOME/gtk!7655
2024-08-28 09:30:29 +00:00
Marek Kašík 7e09a5648a Merge branch gtk:main into update-on-print-comboentry-change 2024-08-28 09:12:42 +00:00
Lukáš Tyrychtr 4a0b833548 Apply some review feedback
Namely be sure to set the new role of the widget in all cases
and do it always, even when we need to recreate the AT context.
2024-08-28 10:42:17 +02:00
Lukáš Tyrychtr 86bec01640 a11y: Set the correct role for check button groups
Up-until now, when a group of check boxes was created, they were
still presented as checkboxes, even they semantically were radio buttons.

Note that this approach will not always work, because we're not recreating the
AT context, but it works for the usual pattern where the group is set during
object construction
2024-08-28 10:27:46 +02:00
Matthias Clasen b07a2a968d Merge branch 'wayland-destroy-ordering' into 'main'
wayland: Fix an ordering problem

Closes #6965

See merge request GNOME/gtk!7658
2024-08-28 01:14:45 +00:00
Benjamin Otte 997d553520 Merge branch 'wip/corey/file-chooser-select' into 'main'
Implement set_selection in GtkSingleSelection

See merge request GNOME/gtk!6376
2024-08-28 00:24:51 +00:00
Corey Berla 8eb05850cb single-selection: Don't allow unselecting with autoselect
According to the documentation, when autoselect is TRUE it will
"will disallow unselecting the current item".
2024-08-27 21:18:56 +00:00
Corey Berla 98eaec99ee gtksingleselection: Implement unselect_all
The default implementation of unselect_all calls
set_selection, which SingleSelection does not have
an implementation for (it's unclear what it would
do with multiple selections).  Add a straightforward
implementation for unselect_all.
2024-08-27 21:18:56 +00:00
Matthias Clasen 8fb946f6e8 Merge branch 'scale-hotfix' into 'main'
theme: Fix positioning of scale values (hotfix!)

See merge request GNOME/gtk!7656
2024-08-27 21:07:40 +00:00
Matthias Clasen a10670c991 wayland: Fix an ordering problem
When setting an event queue on a proxy, we should not destroy
the queue before the proxy.

May fix: #6965
2024-08-27 16:35:46 -04:00
Danial Behzadi 48f347e62b Update Persian translation 2024-08-27 10:34:00 +00:00
Matthijs Velsink ed1c047cf2 theme: Fix positioning of scale values
Commit d58b545f fixed a double counting of value size, but didn't check
whether that actually looked great. It doesn't.

Because the slider has negative margins, we need to add margin to the
value if it's on a side with no marks. If it is on a side with marks,
the scale will make it touch the marks. We therefore apply a mark's size
of margin to have the value be in the same place, with or without marks.
2024-08-27 04:47:49 +02:00
Matthias Clasen ea9c2a72d9 Post-release version bump 2024-08-26 19:55:03 -04:00
Matthias Clasen 15edfe4ffa 4.15.6 2024-08-26 19:26:14 -04:00
Benjamin Otte c2698e2be9 Merge branch 'wip/otte/for-main' into 'main'
gpu: Fix memleak in GL dmabuf export

See merge request GNOME/gtk!7652
2024-08-26 21:08:48 +00:00
Benjamin Otte 0defdc4af5 gpu: Plug fd leak in fallback path
If we can't construct a dmabuf texture, we need to clear the dmabuf fd.
2024-08-26 20:31:08 +02:00
Benjamin Otte ea9b47f1b6 gpu: Use common cleanup function
Just simple cleanup, both functions do the same thing.
2024-08-26 20:31:08 +02:00
Benjamin Otte 65c8320a32 gpu: Fix fd leak in GL dmabuf export
The texture ID is not deleted on dmabuf export; a copy is made, the
GskGpuImage retains ownership.

However when doing GL export, the texture *does* take ownership, so we
need the stealing semantics for that case.
2024-08-26 20:31:08 +02:00
Matthias Clasen a7afde2e7d Merge branch 'scale-fixes-2' into 'main'
scale: Fix two more drawing/sizing issues

Closes #5171 and #6639

See merge request GNOME/gtk!7654
2024-08-26 18:04:27 +00:00
Matthias Clasen a876a829e4 Merge branch 'scale-fixes' into 'main'
scale: (Re)fix value alignment again (reverting !6935)

Closes #5171 and #6639

See merge request GNOME/gtk!7651
2024-08-26 18:00:20 +00:00
Luca Bacci f4bd883003 GdkWin32: Try to call _gdk_surface_update_size() only when the size actually changed
Otherwise we adapt Vulkan and OpenGL swap chains a lot and we effectively
disable incremental rendering.

Note that the fix is not complete.
2024-08-26 17:05:19 +02:00
Luca Bacci 0fcdadc531 GdkWin32GLContextWGL: Use the previous frames paint regions kept by GdkGLContext
We do this because:

 a) The parent class (GdkGLContext) already stores the paint regions of
    previous frames, no need to do the same.
 b) The painted region passed to end_frame () includes the backbuffer's
    damage region, so it's not really what we want.

This also fixes a leak of cairo_region_t that I introduced by mistake
in !7418
2024-08-26 17:05:13 +02:00
Matthijs Velsink d58b545ffb scale: Don't apply borders twice for value
The measured size of the range already includes borders that the scale
calculates. This includes the drawn value. So in the measurement of
scale, the size of the value shouldn't just be added to the size of the
scale, as then the size is effectively added twice.

To fix this, we first measure the minimum size of the range. Then, we
determine the minimum size of our scale. Only then do we set the minimum
size to maximum of those two values.
2024-08-26 13:20:21 +02:00
Matthijs Velsink 8ca299e82b scale: Fix GTK_POS_TOP marks and value order
If both marks are set on top, and the value is drawn on top, the value
should be drawn outside the marks for a horizontal scale.

Currently, that order is incorrect, with the marks shifted up and the
value drawn between the slider and the marks.

This fixes that order.
2024-08-26 13:04:23 +02:00
Scrambled 777 a231a2114a Update Hindi translation 2024-08-26 06:03:28 +00:00
Matthias Clasen ab41a549f8 Merge branch 'app_menubar_a11y_label' into 'main'
applicationwindow: set menubar a11y label

See merge request GNOME/gtk!7640
2024-08-25 23:45:23 +00:00
Matthijs Velsink a9997a3af6 scale: Always align value with the trough
We can get the position of the trough from the parent GtkRange class,
and can therefore align directly to that. There is no need to add
symmetry, which can always be added in CSS if needed.

Fixes #5171, #6639
2024-08-25 19:41:25 +02:00
Matthijs Velsink 6d86b16dbe scale: Refactor value allocation logic slightly
This only makes the value allocation logic easier to understand, but
doesn't change anything, apart from not mixing integer and floating
operations anymore which can give a warning under some compiler
settings.
2024-08-25 19:37:38 +02:00
Matthijs Velsink 779d32747d Revert "Merge branch 'scalefix' into 'main'"
This reverts commit 2799632c02, reversing
changes made to 154035e76f.

That MR tried to fix #5171, but by doing a forced symmetry it introduced
another issue for users on Libadwaita, see #6639.

The logic can be much simplified, as the next commits show.
2024-08-25 19:23:54 +02:00
Arjan Molenaar ffeca06bd6 macos: Revert "macos: fix window transparency"
This reverts commit 84847e46fa.

It breaks maximizing windows.
2024-08-25 12:00:51 +02:00
Asier Sarasua Garmendia 83b387e782 Update Basque translation 2024-08-25 06:01:05 +00:00
Benjamin Otte b41fe2e093 Merge branch 'wip/otte/slow-down' into 'main'
CI: Reduce max number of tests to 8/4

See merge request GNOME/gtk!7649
2024-08-25 03:50:54 +00:00
Benjamin Otte 93573218d4 CI: Reduce max number of tests to 8/4
CI is hitting various limits after we started out with 32. In
particular, the default runners hit 90s test timeouts.

And the asan runner runs into max threads limits, so reduce that one to
4 tests max.
2024-08-25 04:57:11 +02:00
Matthias Clasen 076968dc1e Merge branch 'ci-do-less-work' into 'main'
compare-render: Do less work for replay

See merge request GNOME/gtk!7647
2024-08-25 01:39:52 +00:00
Matthias Clasen 5e6cf622e3 compare-render: Do less work for replay
We don't need to render the node, we have a reference image.
2024-08-24 20:11:32 -04:00
Matthias Clasen 90c65e3611 Merge branch 'wip/otte/ci-fixes' into 'main'
CI improvements

See merge request GNOME/gtk!7639
2024-08-24 20:25:30 +00:00
Matthias Clasen afe75aedc2 Merge branch 'dmabufize-experiment' into 'main'
tests: Use dmabufs in compare tests

See merge request GNOME/gtk!7642
2024-08-24 20:25:17 +00:00
Matthias Clasen 8b215a453c Merge branch 'settings_parse_enums' into 'main'
settings: allow parsing enums nicknames from settings.ini

See merge request GNOME/gtk!7641
2024-08-24 17:59:08 +00:00
Matthias Clasen c3329123a3 Merge branch 'matthiasc/for-main' into 'main'
Add a since tag to GDK_TOPLEVEL_STATE_SUSPENDED

See merge request GNOME/gtk!7645
2024-08-24 17:33:23 +00:00
Matthias Clasen 107ef2017c tests: Use dmabufs in compare tests
Make the --replay mode of compare-render randomly turn textures it
finds into dmabuf textures, using /dev/udmabuf.
2024-08-24 13:10:25 -04:00
Matthias Clasen acad180cee Add dmabuf tests that can run in ci
This is a test balloon tests that use /dev/udmabuf to produce
dmabufs that we can use in ci, even if we don't have a GPU.
Currently, the tests we can do are somewhat limited, since mesas
software renderers don't support dmabufs yet.
2024-08-24 13:10:25 -04:00
Benjamin Otte 504ca9c0c8 CI: run tests in a single dbus session
Instead of every test spawning their own dbus, make the tests share the
same server, just like they share their own compositor.

This should speed up things a bit and avoid weird interactions when
multiple dbus processes exist.
2024-08-24 18:36:23 +02:00
Benjamin Otte 2d9f28c0ff CI: Make asan a child of the default fedora build
Effects of that:

1. Keep artifacts
2. Produce a test report
3. Caching for ccache
2024-08-24 18:36:23 +02:00
Benjamin Otte 07b3e8785c CI: Limit maximum number of test processes to 32
There are spurious failures happening in CI runs and I blame those on
too many processes running at the same time overloading either the
compositor we're running against, or causing OOM situations or just
genereally slowing things down and hitting timeout limits.

The choice of 32 is rather arbitrary. I just picked a number that felt
good.
2024-08-24 18:36:23 +02:00
Benjamin Otte 68ef86ac4f wayland: Don't ask dbus about settings we don't care about
When running with default settings, we don't care what dbus thinks about
non-default settings.
2024-08-24 18:36:23 +02:00
Piotr Drąg beb20fb1db Update POTFILES.in and POTFILES.skip 2024-08-24 14:58:15 +02:00
Juliano de Souza Camargo 3a965088a2 Update Brazilian Portuguese translation 2024-08-24 12:55:30 +00:00
Matthias Clasen 89118ee7ba Add a since tag to GDK_TOPLEVEL_STATE_SUSPENDED
We've changed the way we document additions in enums.
2024-08-24 08:38:19 -04:00
Arjan Molenaar 4b5d503cf0 Merge branch 'macos-control-click' into 'main'
macos: Add Ctrl+left-click mapping for context menus

Closes #6724

See merge request GNOME/gtk!7523
2024-08-24 11:42:35 +00:00
Sabri Ünal aeac103fbc Update Turkish translation 2024-08-24 06:44:18 +00:00
Luming Zh cd153e8a53 Update Chinese (China) translation 2024-08-24 04:05:37 +00:00
Benjamin Otte 5369b07eb0 Merge branch 'wip/otte/for-main' into 'main'
vulkan: Don't print errors on vkCreateInstance() failure

Closes #6947

See merge request GNOME/gtk!7643
2024-08-23 21:37:12 +00:00
Benjamin Otte 58f7b966d0 reftests: Make glarea-gl-only test XFAIL
With CI now using udmabufs, we run into bugs in Mesa. So we disable
some tests for now.

https://gitlab.freedesktop.org/mesa/mesa/-/issues/11773 is the bug
report for this one.
2024-08-23 22:53:13 +02:00
Benjamin Otte 4be1d754b7 vulkan: Don't spam stderr on failed Vulkan import
We write a debug message and then handle things using fallback.

Fixes error messages when trying to import incompatible dmabufs.
(in my case: llvmpipe dmabufs into radv)
2024-08-23 22:53:13 +02:00
g.willems c1351fb659 settings: allow parsing enums nicknames from settings.ini
The value of `gtk-font-rendering` currently can't be specified
in "settings.ini", as the parser doesn't handle enums.
Allow reading values by enum nicknames.

Also cleanup obsolete references to rc files.
2024-08-23 21:09:37 +02:00
Benjamin Otte d8926de40e vulkan: Don't print errors on vkCreateInstance() failure
We handle the error case right below with a proper GError, there's no
need to use the fallback error reporting.

Fixes #6947
2024-08-23 20:04:46 +02:00
Benjamin Otte 73c94cf1d6 gpu: Use the shared GL context when creating GL textures
The non-shared context's surface must survive the lifetime of the
GL texture, and when the renderer gets unrealized the surface goes away,
but we cannot guarantee that all GL textures have been destroyed by
then.

So better use a context we know will survive becuase it isn't bound to a
surface.

This is the same fix for NGL as f3ac0535f8
was for GL.
2024-08-23 20:04:46 +02:00
Benjamin Otte c2a637f68a inspector: Add KHR version of swap_buffers_with_damage
Related: #6941
2024-08-23 19:01:05 +02:00
Benjamin Otte 6a986f03b6 gpu: Simplify the blur op a bit
I was looking through it and thought this looks better.

It's also 21 lineas of code less.
2024-08-23 19:01:05 +02:00
Ekaterine Papava a52ae238ab Update Georgian translation 2024-08-23 09:55:42 +00:00
Yuri Chornoivan 8a0d688a61 Update Ukrainian translation 2024-08-23 04:43:09 +00:00
g.willems 3260b8f142 applicationwindow: set menubar a11y label
This fixes a warning from the inspector's accessibility checker.

Users only control the menu model, not the menubar widget,
so this can only be done in gtk.
2024-08-22 22:46:30 +02:00
Jordi Mas i Hernandez dc8e01d469 Update Catalan translation 2024-08-22 18:46:28 +00:00
Matthias Clasen 0105da3238 Merge branch 'main' into 'main'
textbuffer: Clear paste point override from empty middle clicks

Closes #5530

See merge request GNOME/gtk!6811
2024-08-22 18:11:05 +00:00
Yosef Or Boczko 8979515aa4 Update Hebrew translation 2024-08-22 15:41:53 +00:00
Vasil Pupkin a8c827455d Update Belarusian translation 2024-08-22 00:25:24 +00:00
Benjamin Otte 798edf5300 Merge branch 'wip/otte/for-leio' into 'main'
Only run a single renderpass

See merge request GNOME/gtk!7594
2024-08-21 20:11:52 +00:00
Benjamin Otte 54758bee1f gpu: Only run a single renderpass
Instead of running one renderpass per clip region, run one renderpass for
the whole clip extents, and just set the scissor to the individual clip
rects.

This means that we need to use LOAD_OP_LOAD in cases where we don't
redraw the full extents, but nonetheless, the eprformance wins of
avoiding renderpasses are worth it, in particualr on tilers like the
Raspberry Pi or other mobile chips and the Apple M1/2.
2024-08-21 21:13:34 +02:00
Benjamin Otte cfe0da1eed gpu: Add GskGpuLoadOp
We want to differentiate between CLEAR, DONT_CARE and LOAD in the
future, and the current boolean doesn't allow that.

Also implement support for the the different ops in the Vulkan
renderpass code.
2024-08-21 21:13:34 +02:00
Benjamin Otte 1198dc76a4 gpu: Add gsk_gpu_first_node_begin_rendering()
This starts the renderpass at the given scissor rect.

It just splits out the gsk_gpu_render_pass_begin_op() call into a
simpler function, so it's harder to mess up.
2024-08-21 21:13:34 +02:00
Benjamin Otte bed3e9918b gpu: Add GskGpuFirstNodeInfo
Just encapsulate all the data for the add_first_node() call into a
single struct.
2024-08-21 21:13:34 +02:00
Benjamin Otte d76bb2991a gpu: Refactoring: Pull out nodeprocessor
Add gsk_gpu_node_processor_set_scissor() that allows resetting the
nodeprocessor's scissor and clip rectangle.
That in turn allows using the same nodeprocessor instance for all the
rects we draw for the clip region.
2024-08-21 21:13:34 +02:00
Benjamin Otte e962e86fcd gpu: Split out a function
converting an image to any colorstate (not just ccs-capable default
colorstates) can go in its own function.
2024-08-21 21:13:34 +02:00
Benjamin Otte dd59c90842 rendernode: repeeat nodes with empty child bounds are transparent
So they must not copy the fully_opaque flag from the child.

Adapted the testcase that accidentally caught it do now always catch it
by setting a proper background.
2024-08-21 21:13:26 +02:00
Emmanuele Bassi c03720879e Merge branch 'fix-text-a11y-more' into 'main'
a11y: More text interface fixes

Closes #6951

See merge request GNOME/gtk!7638
2024-08-21 16:12:55 +00:00
Matthias Clasen a62787ebb2 a11y: More text interface fixes
The old bytes-vs-chars problem exists in more places.

Fixes: #6951
2024-08-21 11:33:11 -04:00
Matthias Clasen 2a7541342c Merge branch 'migration-docs-fix' into 'main'
docs: Fix various minor typos and improve formatting in the 4-to-5 migration guide

See merge request GNOME/gtk!7637
2024-08-21 15:17:59 +00:00
Philip Withnall f96d6cdb2b docs: Improve code tagging and API cross-reference links in 4-to-5 guide
Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-08-21 15:03:44 +01:00
Philip Withnall 3ea6ddd321 docs: Improve Unicode usage in 4-to-5 migration guide
Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-08-21 13:10:29 +01:00
Philip Withnall 17f7d80fcf docs: Fix various minor typos in the 4-to-5 migration guide
Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-08-21 13:08:14 +01:00
Scrambled 777 e3437c748a Update Hindi translation 2024-08-21 08:57:29 +00:00
Benjamin Otte f1d80727d0 Merge branch 'wip/otte/i-see-dead-textures' into 'main'
gpu: Be more aggressive about GC'ing dead textures

See merge request GNOME/gtk!7636
2024-08-21 08:18:53 +00:00
Benjamin Otte c7fabe2897 gpu: Be more aggressive about GC'ing dead textures
When we encounter many dead textures, we want to GC. Textures can take
up fds (potentially even more than 1) and when we are not collecting
them quickly enough, we may run out of fds.

So GC when more then 50 dead textures exist.

An example for this happening is recent Mesa with llvmpipe udmabuf
support, which takes 2 fds per texture and the test in
testsuite/gdk/memorytexture that creates 800 textures of ~1 pixel each,
which it diligently releases but doesn't GC.

Related: #6917
2024-08-21 09:45:05 +02:00
Chun-wei Fan cc1c3799b6 Merge branch 'wgl-report-damage' into 'main'
GdkWin32GLContextWGL: Add support for incremental rendering

See merge request GNOME/gtk!7418
2024-08-21 02:37:41 +00:00
Martin a196bf1132 Update Slovenian translation 2024-08-20 04:54:07 +00:00
Matthias Clasen 4bcfeebdea Merge branch 'emoji-chooser-size' into 'main'
emojichooser: Resize according to screen height

See merge request GNOME/gtk!7631
2024-08-20 02:02:16 +00:00
Matthias Clasen 740965016f Merge branch 'matthiasc/for-main' into 'main'
Add a GDK_DISABLE env var

See merge request GNOME/gtk!7632
2024-08-20 01:58:54 +00:00
Matthias Clasen 39e6301f42 win32: Adapt to default flag changes
I hope this change does the right thing.
2024-08-19 21:37:49 -04:00
Matthias Clasen fd02c885e9 docs: Remove outdated information
We no longer disable debug flags in non-debug builds.
2024-08-19 20:40:32 -04:00
Matthias Clasen 26a2966a7b gdk: Beef up gdk_parse_debug_var
Add a docstring for the variable itself, and print it as part
of the help message. Update all callers to provide a docstring.
2024-08-19 20:40:32 -04:00
Matthias Clasen 29cfcbdc97 wayland: Respect GDK_DISABLE=color-mgmt
If the color-mgmt feature is disabled, don't use the
xx-color-management-v4 protocol.
2024-08-19 20:40:32 -04:00
Matthias Clasen de62ea96ab Add GDK_DISABLE=color-mgmt
This flag is meant to turn off color management features of GDK.
If this is set, all surfaces will report sRGB as their preferred
color state.
2024-08-19 20:40:32 -04:00
Matthias Clasen 2d230f79a6 Change the offload-disable flag
Move this from GSK_DEBUG=offload-disable to GDK_DISABLE=offload.
2024-08-19 20:40:32 -04:00
Matthias Clasen cde094a0df Add a GDK_DISABLE env var
This is taking over the feature-disabling keys from GDK_DEBUG.
2024-08-19 20:40:32 -04:00
Benjamin Otte 2fb3dc8c90 Merge branch 'wip/otte/for-main' into 'main'
wayland: Create EGL window in make_current() if necessary

Closes #6930

See merge request GNOME/gtk!7633
2024-08-19 23:34:35 +00:00
Benjamin Otte f6a8ba0ccb gpu: The colorstate op doesn't need a colorstates arg
It's using the same colorstate all the time: any premultiplied.

So just hardcode it.
2024-08-20 01:05:20 +02:00
Benjamin Otte f650f96b69 egl: Don't bind to NULL surface unless surfaceless
We need to ensure that an EGL surface exists before we call
eglMakeCurrent() with it. Otherwise we might end up binding to
EGL_NO_SURFACE and then never revising that decision.
Which leads to not rendering to the backbuffer, but into the void.

Fixes X11 rendering being black

Fixes #6930
2024-08-20 01:05:20 +02:00
Benjamin Otte c230546a2c wayland: Create EGL window in make_current() if necessary
We make_current() before begin_frame() so doing it only in begin_frame()
is too late.
2024-08-20 01:05:20 +02:00
Benjamin Otte f3ac0535f8 gl: Use the shared GL context when creating GL textures
the non-shared context's surface must survive the lifetime of the
GL texture, and when the renderer gets unrealized the surface goes away,
but we cannot guarantee that all GL textures have been destroyed by
then.

So better use a context we know will survive becuase it isn't bound to a
surface.
2024-08-20 01:05:20 +02:00
Artur S0 7ce942d3fb Update Russian translation 2024-08-19 14:07:35 +00:00
Mat 56a8e947df emojichooser: Resize according to screen height
Since a4cc95b293, the emoji chooser
can fail to appear on smaller screens, depending on where its parent
widget is located. Stop requesting a fixed height to prevent this
issue.
2024-08-19 08:19:04 +03:00
Chun-wei Fan f592a303e4 Merge branch 'vulkan-win32-fix-resize' into 'main'
gdksurface-win32.c: Call _gdk_surface_update_size() more (fix resizing on Vulkan on certain drivers)

Closes #6565

See merge request GNOME/gtk!7562
2024-08-19 03:53:29 +00:00
Chun-wei Fan e14670d457 gdksurface-win32.c: Call _gdk_surface_update_size() more
The current resizing implementation in the GDK-Win32 backend is not
telling GDK early enough for Vulkan that a resize in the surface (i.e.
HWND) is done, so that GDK can re-create swapchain in time, which is
apparent on nVidia drivers (and AMD drivers that utilize the mailbox
presentation mode on Windows) when the HWND is being enlarged
interactively.

To work around this, bar a refactor in the Windows resizing/presentation
code, is to call _gdk_surface_update_size() when we really did resize
the HWND when we handle queued resizes via SetWindowsPos().

The existing call in gdksurface-win32.c in
_gdk_win32_surface_compute_size() remains required, otherwise the
surface won't display initially.

Thanks to Benjamin Otte for pointing this possibility out.
2024-08-19 11:25:50 +08:00
Matthias Clasen 0acf9caa8e Merge branch 'matthiasc/for-main' into 'main'
node-editor: Make Ctrl-Shift-V undoable

See merge request GNOME/gtk!7629
2024-08-19 02:20:52 +00:00
Matthias Clasen 22860389de node-editor: Make Ctrl-Shift-V undoable 2024-08-18 21:45:25 -04:00
Matthias Clasen 16e764b402 wayland: Use interface names defined by protocol
We don't need to hardcode all the interface names as string literals,
since they come as part of the wl_interface structs in the protocol
bindings we use.
2024-08-18 18:23:18 -04:00
Matthias Clasen 85862c4e22 Merge branch 'matthiasc/for-main' into 'main'
Document new inspector functionality

See merge request GNOME/gtk!7628
2024-08-18 21:37:55 +00:00
Matthias Clasen eb764d43f8 Document new inspector functionality
Mention the new shortcuts for recording.
2024-08-18 17:14:28 -04:00
Matthias Clasen 6b57f596f7 Merge branch 'matthiasc/for-main' into 'main'
inspector: Add event traces

See merge request GNOME/gtk!7627
2024-08-18 21:00:01 +00:00
Matthias Clasen cefaec5d6f node-editor: Add Ctrl-Shift-V
Make Ctrl-Shift-V trigger a 'paste-as-node' action which replaces
the current content with the render node in the clipboard.
2024-08-18 15:44:40 -04:00
Matthias Clasen 29b6eab0ea inspector: Add some shortcuts
While the inspector is open, look for some shortcuts:

Super-r to toggle recording
Super-c to take a screenshot

A screenshot here means just a single-frame recording.
For convenience, we put the recorded frame onto the
clipboard too.
2024-08-18 15:44:40 -04:00
Matthias Clasen 360674f523 inspector: Add a snapshot function
Add a function that records just a single frame, and puts it
on the clipboard.
2024-08-18 15:44:40 -04:00
Matthias Clasen 7900f91e46 widget: Record event traces
Use the newly introduced inspector api to add event traces.
2024-08-18 15:44:40 -04:00
Matthias Clasen e4248503cf inspector: Add event traces
When recording events, make it possible to add 'traces' of the
events journey, and show those in the recorder.
2024-08-18 15:44:40 -04:00
Matthias Clasen 168bab34f7 inspector: Simplify
We can just put the render node on the clipboard directly, no
manual serialization required.
2024-08-18 15:44:40 -04:00
Matthias Clasen 46e7ea8c1e Fix a misleading comment 2024-08-18 15:44:40 -04:00
Matthias Clasen 1ce7de0fb8 Cosmetics 2024-08-18 10:44:38 -04:00
Matthias Clasen d9a0f3cfe2 Merge branch 'matthiasc/for-main' into 'main'
node parser: Move parse_color even earlier

See merge request GNOME/gtk!7625
2024-08-17 23:35:44 +00:00
Matthias Clasen 200cec3321 inspector: Minor GdkRGBA -> GdkColor porting 2024-08-17 18:56:05 -04:00
Matthias Clasen d4e730db0c node parser: Move parse_color even earlier
It will be used by parse_stops in the future, so move it above.

No functional change.
2024-08-17 16:24:20 -04:00
Benjamin Otte ca78d845df Merge branch 'wip/otte/for-main' into 'main'
gsk: Don't print any sRGB color as rgb() or rgba()

See merge request GNOME/gtk!7624
2024-08-17 20:19:01 +00:00
Benjamin Otte 9ff31dd29b testsuite: Improve testcase
This should have gone into !7619 but gitlab managed to finish the CI run
just as I was pushing a new version to the MR with
merge_request.merge_when_pipeline_succeeds and apparently gitlab applied
that to the previous version or something.

So now that MR merged an incomplete version to main. And here's the fix
for that.
2024-08-17 21:31:14 +02:00
Benjamin Otte 0815359a20 Merge branch 'wip/otte/for-main' into 'main'
gsk: Don't print any sRGB color as rgb() or rgba()

See merge request GNOME/gtk!7619
2024-08-17 19:28:07 +00:00
Benjamin Otte 96139a902d gsk: Don't print any sRGB color as rgb() or rgba()
If the color value is not inside the proper range for rgb() or rgba()
values being integers, use color() instead.

Tests added/adapted.
2024-08-17 21:09:25 +02:00
Benjamin Otte a6233ac852 rendernodeparser: Check color values aren't out of range
Use the clamp() API from the previous commit to:

1. Clamp values into range
2. Emit an error if values were out of range

Unlike CSS, which just clamps and doesn't emit an error, we do want to
emit one because we care about colors being correct in our node files.
2024-08-17 18:12:23 +02:00
Matthias Clasen 4e9ebb5299 gdk: Add gdk_color_state_clamp()
Allows clamping values into the correct range to construct valid colors.
2024-08-17 18:12:23 +02:00
Benjamin Otte 585f31fa2e rendernodeparser: Rename function
There's no need to name a function parse_color2() when parse_color()
doesn't exist.
2024-08-17 16:03:46 +02:00
Benjamin Otte 69e7838461 rendernodeparser: Don't have unnecessary forward declarations
Reorders functions to not have them.

No functional changes.
2024-08-17 16:03:46 +02:00
Matthias Clasen 3fe3800b7c Merge branch 'small-scale' into 'main'
monitor: Don't forbid scales < 1

Closes #6928

See merge request GNOME/gtk!7623
2024-08-17 13:22:15 +00:00
Matthias Clasen 491275b444 Merge branch 'radiobutton-focus' into 'main'
checkbutton: Add a 'grouped' style class

Closes #6936

See merge request GNOME/gtk!7622
2024-08-17 12:44:35 +00:00
Matthias Clasen 1cd107d5ab monitor: Don't forbid scales < 1
With fractional scaling, people try out things like 0.75 scaling,
and there's no reason for us to prohibit that from working.

Fixes: #6928
2024-08-17 08:26:55 -04:00
Matthias Clasen 5af2d95bff checkbutton: Add a 'grouped' style class
This will make it easier for themes to style radio buttons
differently from check buttons, since out CSS does not have
:has().

The concrete desire here is to use a different outline for
the focus rectangle.

Update affected tests.

Fixes: #6936
2024-08-17 08:22:54 -04:00
Benjamin Otte 62f5db06a1 Merge branch 'fix-opaque-surface-crash' into 'main'
Avoid a crash in gdk_surface_is_opaque

Closes #6938

See merge request GNOME/gtk!7621
2024-08-17 11:26:27 +00:00
Matthias Clasen e32a12f877 Avoid a crash in gdk_surface_is_opaque
Nothing in gtk calls gdk_surface_set_opaque_region anymore, so
the opaque region will normally be NULL.

Fixes: #6938
2024-08-17 07:03:57 -04:00
Ekaterine Papava 584733f034 Update Georgian translation 2024-08-17 03:49:13 +00:00
Matthias Clasen c3c1819e12 Merge branch 'css-variables-fixes2' into 'main'
css: Set the parent of the variable set earlier

Closes #6881

See merge request GNOME/gtk!7618
2024-08-16 16:52:34 +00:00
Matthias Clasen 3f36ebc6e7 Merge branch 'matthiasc/for-main' into 'main'
textview: Fix a regression in selection drawing

Closes #6931

See merge request GNOME/gtk!7620
2024-08-16 16:06:14 +00:00
Matthias Clasen 4aea2d2e09 css: Don't pass style variables redundantly
The context->variables field is expected by the resolve code to be
the keyframe variables. That code takes the style variables from
context->style anyway, so no need to pass them as context->variables
too. And crucially, the lookup code treats the keyframes variables
differently to the style variables, since it doesn't expect the
hierarchical structure that comes from parent styles. This change
fixes infinite recursion in variable lookup with css like

:root {
  --a: var(--b);
}

.foo {
  --b: var(--a);
  color: var(--a);
}

Test included.

Fixes: #6881
2024-08-16 11:38:56 -04:00
Matthias Clasen 4e9107d4b1 widget: Fail properly in compute_transform
We don't currently support computing transforms across native
boundaries. This could be added by using gdk_popup_get_position_x/y.
For now, just fail in this case.

Related: #6355
2024-08-16 10:07:53 -04:00
Matthias Clasen 7d895720be textview: Fix a regression in selection drawing
We were no longer respecting the text color or the selection being
clear.

Fixes: #6931
2024-08-16 08:44:35 -04:00
Benjamin Otte 323dde2b10 Merge branch 'wip/otte/for-main' into 'main'
wayland: Implement GdkToplevel::decorated

See merge request GNOME/gtk!7617
2024-08-16 00:01:54 +00:00
Benjamin Otte ac16e375c7 wayland: Implement GdkToplevel::decorated
... and use that instead of custom announce_csd/announce_ssd APIs.
2024-08-16 01:38:55 +02:00
Matthias Clasen 31143f9611 Merge branch 'kjellahl/docs-window' into 'main'
docs: Improve gtk_window_set_interactive_debugging() docs

See merge request GNOME/gtk!7614
2024-08-15 16:57:00 +00:00
Matthias Clasen 7da4844dcc Merge branch 'css-variables-crash' into 'main'
css: Fix a crash in variables

Closes #6935

See merge request GNOME/gtk!7615
2024-08-15 15:15:48 +00:00
Matthias Clasen c9e4abcd3a css: Fix a crash in variables
We were not careful enough when checking for reference cycles.

Fixes: #6935

Test included.
2024-08-15 10:16:47 -04:00
Matthias Clasen 6e80fde45f Merge branch 'accessibility-docs-fix' into 'main'
docs: Fix a typo in a code example on the accessibility page

See merge request GNOME/gtk!7616
2024-08-15 13:49:29 +00:00
Philip Withnall d182b133a9 docs: Fix a typo in a code example on the accessibility page
Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-08-15 14:18:31 +01:00
Matthias Clasen 5e3240a32f Merge branch 'matthiasc/for-main' into 'main'
colorstate: Don't leak names

See merge request GNOME/gtk!7611
2024-08-14 18:06:36 +00:00
Matthias Clasen 436989d745 gsk: Apply the same transfer fixes
These are copied from gdkcolordefs.h.
2024-08-14 13:21:28 -04:00
Matthias Clasen f62606105e Fix up transfer function symmetry
The easiest things trigger the silliest mistakes. Add tests
for various properties we want our transfer functions to have,
such as:
- be inverse of each other
- stay within the defined ranges
- by symmetric around 0
2024-08-14 11:45:25 -04:00
Matthias Clasen 0f85a40a25 colorstate: Plug a leak and allocate less
We don't need to allocate the matrices, but we do neet to free
the name of cicp color states.
2024-08-14 11:00:10 -04:00
Matthias Clasen 16ad1e428f colorstate: Don't leak names
The cicp colorstates allocate their names, so they should free
them too.
2024-08-14 11:00:10 -04:00
Matthias Clasen a6e0028899 Merge branch 'wip/otte/for-kwin' into 'main'
Fix various issues with Kwin git

See merge request GNOME/gtk!7612
2024-08-14 14:58:08 +00:00
Kjell Ahlstedt dc3def1afd docs: Improve gtk_window_set_interactive_debugging() docs
This function is recommended only if you override the default
key shortcuts for the Inspector.
2024-08-14 16:57:55 +02:00
Kjell Ahlstedt a14e426fb5 docs: Improve gtk_window_set_interactive_debugging() docs
This function is recommended only if you override the default
key shortcuts for the inspector.
2024-08-14 15:51:56 +02:00
Bruce Cowan a1a4026867 Update British English translation 2024-08-14 10:27:24 +00:00
Benjamin Otte aff1b88c92 wayland: Work where the primaries have no name
Set primaries without name if supported, when named primaries are not.
But prefer named primaries if available.

This is just an attempt at defensive coding.
2024-08-14 08:30:55 +02:00
Benjamin Otte dc072f881c wayland: Accept primaries/primaries_named interchangably
If we get sent primaries with the values as named primaries, treat them
like named primaries.

Fixes colorstate support on Kwin, which never sends named primaries.
2024-08-14 08:30:55 +02:00
Benjamin Otte 824ccfc562 gpu: Add an assertion
If the wrong color states get passed, we need to figure that out, before
we run shaders with junk values doing god knows what.
2024-08-14 08:30:55 +02:00
Benjamin Otte 8c6e5ca131 subsurface: Fully covered backgrounds don't need to be drawn
If the texture covers all of the black background (like when watching a
1080p stream fullscreen on a 1080p monitor) we don't need a compositor
with single pixel support.

Fixes offloading in Kwin.
2024-08-14 08:30:55 +02:00
Benjamin Otte a7b69ad9b5 subsurface: Don't create a bg_subsurface until we need it
There's a ton of error checking happening that we want to do.

Because it turns out it is not really useful to create a subsurface for
the single pixel buffer when we don't even support single pixel buffers.
2024-08-14 08:30:55 +02:00
Benjamin Otte 3cd25516ab gdk: Improve GDK_DEBUG=linear
Keep a linear and a non-linear rendering colorstate around. That way, we
don't "return self;" from cicp colorstates and then end up with a cicp
ccs.
2024-08-14 08:30:40 +02:00
Benjamin Otte f3c8c5a9c0 Merge branch 'wip/otte/for-main' into 'main'
color: Handle negative values in all transfer functions

See merge request GNOME/gtk!7609
2024-08-13 23:52:32 +00:00
Matthias Clasen 6878200ccf Merge branch 'matthiasc/for-main' into 'main'
drawcontext: Fix up color state ownership

See merge request GNOME/gtk!7608
2024-08-13 21:42:46 +00:00
Matthias Clasen e1fbd52c29 gdk: Handle negative values in all transfer function
Make sure that for all eotfs/oetfs, eotf(x) == -eotf(-x)

In particular, don't pass negative values to pow() and cause
undefined behavior.
2024-08-13 15:47:17 -04:00
Benjamin Otte 79c2df8392 color: Handle negative values in all transfer functions
Make sure that for all eotfs/oetfs, eotf(x) == -eotf(-x)

In particular, don't pass negative values to pow() and cause undefined
behavior.
2024-08-13 20:47:40 +02:00
Scrambled 777 0888402cea Update Hindi translation 2024-08-13 18:38:21 +00:00
Matthias Clasen 3dae3205e7 drawcontext: Fix up color state ownership
begin_frame_full does not return a reference, we assume that the
color state is staying alive for the duration of the frame anyway,
so end_frame simply sets priv->color_state to NULL.
2024-08-13 13:23:20 -04:00
Matthias Clasen 4858122d17 Merge branch 'matthiasc/for-main' into 'main'
icon helper: Fix an argument order mishap

See merge request GNOME/gtk!7606
2024-08-13 16:50:31 +00:00
Matthias Clasen a19023277f icon helper: Fix an argument order mishap
It seems that for a long time, no compiler saw it fit to warn
about this, even though they argument types are not the same.
2024-08-13 10:36:12 -04:00
Emmanuele Bassi 72dc9e3bf1 Merge branch 'fix_popover_docs_typo' into 'main'
docs: Fix popover docs typo

See merge request GNOME/gtk!7605
2024-08-13 12:29:37 +00:00
Mikael Forsberg 5f814cc30a docs: Fix popover docs typo 2024-08-13 13:50:47 +02:00
Martin 23aafbf09f Update Slovenian translation 2024-08-13 05:55:59 +00:00
Matthias Clasen 761dc7cad0 Merge branch 'matthiasc/for-main' into 'main'
testsuite: build fix

See merge request GNOME/gtk!7603
2024-08-13 03:31:47 +00:00
Matthias Clasen f62a873eef inspector: Show color state of surfaces
Put this information in the misc tab for surfaces.
2024-08-12 22:25:08 -04:00
Benjamin Otte 03c99ebc99 Merge branch 'wip/otte/for-matthiasc' into 'main'
vulkan: Round damage rectangles properly

See merge request GNOME/gtk!7602
2024-08-13 00:24:47 +00:00
Matthias Clasen cb339f85b8 testsuite: build fix
The statically linked tests need to have -DGTK_COMPILATION=1
in their cflags.
2024-08-12 19:19:15 -04:00
Benjamin Otte 5d056eabf6 egl: Round damage rectangles properly
We need to round outwards and a 1x1 rectangle with offset 0.5,0.5 should
end up as a 3x3 rectangle with offset 0,0 when rounded, not as a 2x2
rectangle.
2024-08-13 00:36:11 +02:00
Benjamin Otte 4e77667ab8 vulkan: Round damage rectangles properly
We need to round outwards and a 1x1 rectangle with offset 0.5,0.5 should
end up as a 3x3 rectangle with offset 0,0 when rounded, not as a 2x2
rectangle.
2024-08-13 00:36:11 +02:00
Luca Bacci d3e3ddf897 WGL: Report paint region when presenting (SwapBuffers)
Report the paint region to the OpenGL driver, which in turn may
report it to the system compositor (DWM).
2024-08-12 18:56:45 +02:00
Luca Bacci fca983e81e WGL: Report backbuffer's damage to GDK
The backbuffer's damage region is the region of the backbuffer
that doesn't contain up-to-date contents. This is determined
by the backbuffer's age and previous frame's paint regions.

This enables incremental rendering
2024-08-12 18:56:34 +02:00
Luca Bacci b1995d0d77 Merge branch 'gtkshowwin32' into 'main'
Hook up file/URI launching to ShellExecute

See merge request GNOME/gtk!7556
2024-08-12 14:17:27 +00:00
Matthias Clasen 8ccfda4972 Merge branch 'docs-fix' into 'main'
docs: fix since annotation

See merge request GNOME/gtk!7600
2024-08-12 10:14:35 +00:00
Yosef Or Boczko 9a47c0f923 Update Hebrew translation 2024-08-12 09:58:40 +00:00
Sergey Bugaev b33b679b13 Hook up gtk_show_uri_full () to gtk_show_uri_win32 ()
On Windows, always use gtk_show_uri_win32 () instead of going through
GAppInfo.  Hook up gtk_file_launcher_launch () to gtk_show_uri_win32 ()
as well, always extracting the file path (and not a URI) and propagating
the always-ask flag.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
2024-08-12 11:18:23 +03:00
Sergey Bugaev 8d41ecff3e Add gtk_show_uri_win32 ()
This is a new internal utility to open/show/launch/execute URIs and
files on Windows, using Windows's native ShellExecuteEx () and
SHOpenWithDialog () APIs.

The advantages this has over using the win32 implementation of
g_app_info_launch_default_for_uri ():

* the implementation here is fairly simple;
* it doesn't involve trying to grok the registry for app / file	type
  registrations (at least not inside GLib/GTK side, the implementations
  of ShellExecuteEx/SHOpenWithDialog presumably do that internally);
* it doesn't require convoluted formatting / escaping of invocation
  command lines that GWin32AppInfo / gspawn-win32 has to do otherwise
  (again, presumably the Windows libraries implement this internally);
* it's certain to end up opening the file/URI the same way other apps
  in the system would;
* it can/will open the native system UI for picking an app in case there
  are multiple options (or when so requested programmatically with the
  always-ask flag), or if there is no app installed that can handle the
  URI scheme / file type;
* it lets us pass the parent window handle, much like the portal APIs;
  presumably Windows would use this for positioning the picking UI, or
  placing the launched app's window;
* presumably, this will properly elevate privileges with a User Access
  Control (UAC) prompt if the app being launched requires administrator
  access; this presumably is impossible with the wspawn* APIs that
  gspawn-win32 uses;
* this has a much better chance to work properly with the win32 app
  isolation (AppContainer) technology.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
2024-08-12 11:18:17 +03:00
Jan Willem 85bcf9a366 docs: fix since annotation 2024-08-12 07:05:47 +00:00
Matthias Clasen b27e3631f0 Merge branch 'matthiasc/for-main' into 'main'
colorstate: Avoid a memcpy

See merge request GNOME/gtk!7599
2024-08-11 22:00:03 +00:00
Matthias Clasen 4d5ba0631d colorstate: Avoid a memcpy
We don't need it here, and this call can happen with
values being in memory that is not amenable to fast memcpy.
2024-08-11 16:31:42 -04:00
Matthias Clasen 0f618ae29e Cosmetics 2024-08-11 16:31:35 -04:00
Matthias Clasen 13d415f2f6 Add a comment 2024-08-11 16:31:18 -04:00
Matthias Clasen e7b14ae26e Post-release version bump 2024-08-11 15:52:33 -04:00
Matthias Clasen 07658347a9 4.15.5 2024-08-11 15:43:54 -04:00
Matthias Clasen 0436801a9c Merge branch 'matthiasc/for-main' into 'main'
docs: Mark the docs check as failing

See merge request GNOME/gtk!7598
2024-08-11 19:43:16 +00:00
Matthias Clasen 4da593a3de Merge branch 'printdialog_fix_sporadic_win32_build_failures' into 'main'
printdialog: fix sporadic win32 build failures

See merge request GNOME/gtk!7464
2024-08-11 19:35:32 +00:00
Matthias Clasen f5194bbf83 gdk: Mark the docs check as failing
It complains about get_type functions, which really don't need
or want docs.
2024-08-11 15:03:13 -04:00
Matthias Clasen 15552e5478 docs: Mark the docs check as failing
Despite promises, and after fixing the configuration, the test still
complains about deprecated api not having docs. Not useful.
2024-08-11 15:01:59 -04:00
Matthias Clasen d9616c1993 docs: Try to fix the docs check 2024-08-11 15:00:54 -04:00
Matthias Clasen 5dbce5ce9b docs: Add a missing bit 2024-08-11 14:47:59 -04:00
Matthias Clasen 1f47c36e49 docs: Fix a typo 2024-08-11 14:47:48 -04:00
Benjamin Otte ed05890740 Merge branch 'wip/otte/for-main' into 'main'
gl: Interpolate gradient colors as premultiplied

See merge request GNOME/gtk!7597
2024-08-11 17:41:41 +00:00
Benjamin Otte 68d73dcce5 nodeparser: Handle disallowed values for radial gradients
Make sure the radii are strictly positive.

Also handle the case where start >= end.
We can't really underline that error, because we don't track the
locations of the start/end properties until we know that there's an
error.
So just underline the whole radial gradient declaration.

Test included
2024-08-11 19:07:40 +02:00
Benjamin Otte 9643a21827 gl: Interpolate gradient colors as premultiplied
Tests included
2024-08-11 19:07:40 +02:00
Matthias Clasen 07b64c2f0f Merge branch 'matthiasc/for-main' into 'main'
docs: Updates

See merge request GNOME/gtk!7596
2024-08-11 15:53:11 +00:00
Matthias Clasen 3df3ec2a29 css: Fix a copy-paste error
We want to use the decoration color if has_decoration_color is
TRUE, not if it is FALSE.
2024-08-11 10:02:03 -04:00
Matthias Clasen 0015fda94c docs: Updates
Keep the docs for our debug variables in sync with reality.
2024-08-11 09:02:35 -04:00
Matthias Clasen 589f483e7b NEWS: Updates 2024-08-11 08:50:42 -04:00
Daniel Șerbănescu a77f8c9f62 Update Romanian translation
(cherry picked from commit cfbfaeae01)
2024-08-11 11:14:37 +00:00
Matthias Clasen 1d7aa9e40b Merge branch 'matthiasc/for-main' into 'main'
Small cleanups

See merge request GNOME/gtk!7592
2024-08-11 11:01:58 +00:00
Benjamin Otte 8de4b04819 Merge branch 'wip/otte/for-main' into 'main'
color: NEVER EVER use memcpy() in critical path

See merge request GNOME/gtk!7593
2024-08-11 05:39:26 +00:00
Benjamin Otte 175dba86fd color: NEVER EVER use memcpy() in critical path
Unless there is a very good reason to use memcpy(), don't use it.

Not using it makes the compiler not screw up and waste tons of CPU that
it could have not wasted.

Gets my framerate back from 1250 => 1750 and makes sysprof no longer
report ~40% of render time spent in gsk_gpu_colorize_op().
2024-08-11 06:51:58 +02:00
Matthias Clasen 767b9b9405 Docs: Add the image tool to the list 2024-08-10 22:47:02 -04:00
Matthias Clasen 202a51d9e3 Cosmetics 2024-08-10 22:41:31 -04:00
Matthias Clasen 3014d36a61 Merge branch 'matthiasc/for-main' into 'main'
inspector: Show fine transform categories

See merge request GNOME/gtk!7591
2024-08-11 02:40:25 +00:00
Matthias Clasen d718fda057 memory texture: Fix a memory leak
The callers assumed that gdk_memory_sanitize is transfer full in
both directions, but it wasn't. Make it so.
2024-08-10 22:24:29 -04:00
Matthias Clasen bbb7b365d5 inspector: Show roles for nodes
For some node types, the child nodes play different roles. E.g.
for a mask node, one of the two children is the source, the other
the mask. Show this information in the inspector.
2024-08-10 21:51:06 -04:00
Matthias Clasen 740e485160 NEWS: Updates 2024-08-10 21:09:29 -04:00
Matthias Clasen 5a69127862 inspector: Show fine transform categories
This is information we care about in particular for offloading,
so show it.
2024-08-10 21:08:53 -04:00
Matthias Clasen 798883f21a Merge branch 'css-color-hookup-5' into 'main'
Make non-srgb css colors work for text nodes

See merge request GNOME/gtk!7558
2024-08-10 16:28:31 +00:00
Matthias Clasen bec71a15b4 Merge branch 'matthiasc/for-main' into 'main'
Fix a copy-paste error

See merge request GNOME/gtk!7589
2024-08-10 12:55:32 +00:00
Matthias Clasen c4baf60044 inspector: Rename add_color2_row to add_color_row
The original add_color_row is gone now, so we can rename its
successor back.
2024-08-10 08:16:40 -04:00
Matthias Clasen d32081401f inspector: Show more details for text nodes
Show the color state, and create textures with the full color
information.

The GdkRGBA-based helper functions are no longer used with this
commit and have been dropped.
2024-08-10 08:16:40 -04:00
Matthias Clasen ed119ae246 gtk: Port selection drawing to new apis
Preserve color state information when drawing selections or block
cursors in GtkTextView.
2024-08-10 08:16:40 -04:00
Matthias Clasen 51768d0e16 gtk: Port caret drawing to new apis
Preserve color state information here.
2024-08-10 08:16:40 -04:00
Matthias Clasen 6f1a4e5bb9 gtk: Use the new apis
It is not perfect, since PangoRenderer, GtkTextAppearance and
GtkTextTag all carry colors as PangoColor or GdkRGBA. But at least,
we get glowing foreground colors.
2024-08-10 08:14:23 -04:00
Matthias Clasen e323d2a93e gtk: Add gtk_snapshot_append_text2/layout2
These are private snapshot functions that use the new constructor
to create a text node with a given color state.
2024-08-10 07:48:18 -04:00
Matthias Clasen 23922eebf1 gl: Handle text colors with color states
Since we don't have proper color management here, just convert
any color we meet to sRGB and hope for the best.
2024-08-10 07:48:18 -04:00
Matthias Clasen 92bd85ba30 nodeparser: Support color states in text nodes
Test included.
2024-08-10 07:37:01 -04:00
Matthias Clasen ca7aa30bc5 gsk: Use private text node api 2024-08-10 07:37:01 -04:00
Matthias Clasen d17972427a gsk: Add private text node api
Add a constructor that takes a GdkColor and a corresponding getter.
2024-08-10 07:37:01 -04:00
Matthias Clasen 25f0c81530 Fix a copy-paste error
This was introduced in ea28dc8cff.
2024-08-10 07:11:56 -04:00
Matthias Clasen 4f95d126ba Merge branch 'matthiasc/for-main' into 'main'
gl: Handle box shadow colors with color states

See merge request GNOME/gtk!7588
2024-08-10 03:05:26 +00:00
Matthias Clasen 310196cc59 gl: Handle box shadow colors with color states
Since we don't have proper color management here, just convert
any color we meet to sRGB and hope for the best.
2024-08-09 22:27:57 -04:00
Matthias Clasen 8052bcc69c Updates 2024-08-09 22:11:35 -04:00
Benjamin Otte 04ee41d7b0 Merge branch 'wip/otte/for-main' into 'main'
lots of small things

See merge request GNOME/gtk!7585
2024-08-10 01:10:12 +00:00
Benjamin Otte 23af1cd8ad gpu: When transforming to simpler transform, we might be all clipped
When transforming back from a complex transform to a simpler transform,
the resulting clip might turn out to clip everything, because clips can
grow while transforming, but the scissor rect won't. So when this
process happens, we can end up with an empty clip by transforming:

1. Set a clip that also sets the scissor
2. transform in a way that grows the clip, say rotate(45)
3. modify the clip to shrink it
4. transform in a way that simplifies the transform, say another
   rotate(45)
5. Figure out that this clip and the scissor rect do no longer overlap

Catch this case and avoid drawing anything.
2024-08-10 02:38:13 +02:00
Benjamin Otte 4426194ee6 Merge branch 'css-color-hookup-4' into 'main'
Make non-srgb css colors work for shadows

See merge request GNOME/gtk!7557
2024-08-10 00:36:28 +00:00
Matthias Clasen 92c119e12c testsuite: Replay shadow nodes properly
Use the new apis for this.
2024-08-09 20:17:04 -04:00
Matthias Clasen ff02665407 inspector: Show more shadow node details
Show the color state, and create textures with the full color
information.

With this commit, add_color_row and get_color_texture are no longer
used and have been dropped.
2024-08-09 20:17:04 -04:00
Matthias Clasen d471ed5912 gtk: Use new shadow snapshot apis
Preserve color states from css as much as possible.
2024-08-09 20:17:04 -04:00
Matthias Clasen b92ca5da02 gtk: Add gtk_snapshot_push_shadow2
This is a private snapshot function that uses the new constructor
to create a shadow node with the given color states.
2024-08-09 20:17:04 -04:00
Matthias Clasen 0f7c0f616c nodeparser: Handle shadows with color state
Test included.
2024-08-09 20:09:31 -04:00
Matthias Clasen 5551f30400 gsk: Use private shadow node api 2024-08-09 20:09:31 -04:00
Matthias Clasen 2c10d72fe5 gsk: Add private shadow node api
Add a new GskShadow2 struct that has a GdkColor instead of
a GdkRGBA, and a new constructor and getter to go along with
it.

With this commit, my_color_get_depth is no longer used and
has been dropped.
2024-08-09 20:09:31 -04:00
Matthias Clasen 44fe51247c gsk: Change the blur op api
Pass the ccs, opacity and GdkColor to the op to let it make
decisions about color conversion.

Update the callers.
2024-08-09 20:09:31 -04:00
Matthias Clasen 3a99f1e9f1 gsk: Change the colorize op api
Pass the ccs, opacity and GdkColors to the op to let it make
decisions about color conversion.

Update the callers.
2024-08-09 20:09:30 -04:00
Matthias Clasen d233f0ca3e node parser: Move parse_color2 up
We will use this function more so move it where it belongs.
2024-08-09 20:09:30 -04:00
Matthias Clasen c548bdc3fe css: Add gtk_css_parser_consume_number_or_percentage
This comes in handy in the render node parser.
2024-08-09 20:09:30 -04:00
Benjamin Otte 839d797292 build: Don't set G_SLICE=always-malloc
That environment variable has been gone since GSlice went away in glib
2.76. Which is our minimum requirement.
2024-08-10 01:53:46 +02:00
Benjamin Otte f8a30ddfc1 gdk: Deprecate gdk_surface_set_opaque_region() 2024-08-10 01:40:46 +02:00
Benjamin Otte bb0eb3af45 gtk: Stop calling gdk_window_set_opaque_region()
Now that GDK can figure it out from the rendernode, doing all this work
trying to figure it out is no longer necessary.

Plus, it was sometimes wrong and lead to obscure artifacts.
2024-08-10 01:40:46 +02:00
Benjamin Otte 999d9bc73b gdk: Introduce gdk_surface_is_opaque()
... and use it in the mac backend instead of a hand-rolled version.
2024-08-10 01:40:46 +02:00
Benjamin Otte 16c7003acb gdk: Pass the opaque rect to begin_frame() actually
We know it at begin_frame() time, so if we pass it there instead of
end_frame(), we can use it then to make decisions about opacity.

For example, we could notice that the whole surface is opaque and choose
an RGBx format.
We don't do that yet, but now we could.
2024-08-10 01:40:46 +02:00
Benjamin Otte f64045c229 gdk: Pass the opaque rect on to the opaque region
The opaque rect from the rendernodes are now used to set the opaque
region in the backend.

This means applications can now set a transparent window background and
make indivual parts of their window opaque.
But because this is a best effort method, it is not guaranteed to
succeed in finding all opaque regions, in particular if the rendernodes
used to build it are not straightforward to analyze.
2024-08-10 01:40:46 +02:00
Benjamin Otte 58aebc4447 surface: Put opaque_region in the priv structure
This is in preparation for future patches.
2024-08-10 01:40:46 +02:00
Benjamin Otte 3b3b6036f8 mac: Remove clear optimization
1. We want to get rid of exposing the opaque region

2. Cairo optimizes clearing the whole surface
2024-08-10 01:40:46 +02:00
Benjamin Otte 75748f4ae9 gl: Remove update_area() trick
This is poking into the surface directly, so not a good idea.
And I want to hide that struct in the priv member.

Technically, this code should look at the opaque region, but I am lazy
and the GL renderer is on its way out, so I think it's not worth doing.
2024-08-10 01:40:46 +02:00
Benjamin Otte f90fb68aec gdk: Deprecate public begin/end_frame() APIs
We are using so many internal extra features that it is no longer a good
idea to use these functions.
And they aren't really used anyway.

These extra features are also constantly in flux and rely on internal
APIs, so exposing them would just cause extra pain.
2024-08-10 01:40:45 +02:00
Benjamin Otte 4fa3943e51 gdk: "inline" gdk_draw_context_get_frame_region()
By using the inlining macro trick, we can work around deprecation
warnings from removing this function as a public API, which will happen
in the next commits.
2024-08-10 01:40:45 +02:00
Benjamin Otte 0a92f741b3 vulkan: Remove 2 unneeded return_if_fail() checks
I want to deprecate that function, so getting rid of calls to it sounds
like a good idea.
2024-08-10 01:40:45 +02:00
Benjamin Otte a35f8d52d6 gsk: Clear current context after unrealize()
Make sure both GL renderers don't leave their contexts alive via the
current context, but ensure they dispose of them properly.

Fixes issues when the corresponding GL resources in the surfaces they
were attached to go away.
2024-08-10 01:40:45 +02:00
Benjamin Otte b08ccc0bec ngl: Stop crashing with zink and llvmpipe
We were not calling make_current() early enough anymore after the
Vulkan validation-layer fixes in !7468

Change that by calling it earlier.
2024-08-10 01:40:45 +02:00
Benjamin Otte 523cd0dff7 glcontext: Add a surface_attached flag
GLContexts marked as surface_attached are always attached to the surface
in make_current().
Other contexts continue to only get attached to their surface between
begin_frame() and end_frame().

All our renderer use surface-attached contexts now.
Public API only gives out non-surface-attached contexts.

The benefit here is that we can now choose whenever we want to
call make_current() because it will not cause a re-make_current() if we
call it outside vs inside the begin/end_frame() region.

Or in other words: I want to call make_current() before begin_frame()
without a performance penalty, and now I can.
2024-08-10 01:40:45 +02:00
Benjamin Otte 8ac1806015 gdk: Use begin_frame_full() everywhere
begin_frame() is going to go away, so we should use the "real" function.
2024-08-10 01:40:45 +02:00
Benjamin Otte 0b2275774f gdk: Add gdk_draw_context_end_frame_full()
... and pass the opaque region of the node.

We don't do anything with it yet, this is just the plumbing.

The original function still exists, it passes NULL which is the value
for no opaque region at all.
2024-08-10 01:40:45 +02:00
Benjamin Otte 4fbfe9b041 gsk: Warn about unused result in gsk_render_node_get_opaque_rect()
It's a function to easily forget to check the return value.

In fact I just did that.
2024-08-10 01:40:45 +02:00
Benjamin Otte b6c848d711 x11: Remove special casing from get_damage() call
This function is only ever called while inside a frame, so the check is
not necessary.
2024-08-10 01:40:45 +02:00
Benjamin Otte a467cfd060 inspector: Use a higher priority than USER
We want to override user settings, so make sure we do that.
2024-08-10 01:40:45 +02:00
Benjamin Otte f24be8476e wayland: Clean up after ourselves in the xx-color code
If an image description query is running while the surface gets
destroyed, we were not properly cleaning up, causing the callbacks to be
emitted on freed variables.
2024-08-10 01:40:45 +02:00
Benjamin Otte 904b1815b5 nodeprocessor: Consult scissor after rounded clip
If we apply a rounded clip, we might change the clip in a way that makes
it intersectable with the scissor again, if both had diverged before.

So try and intersect with the clip.
2024-08-10 01:40:45 +02:00
Benjamin Otte d6322c6389 gsk: Switch box shadow nodes to use offsets
Instead of
  float dx;
  float dy;
have a
  graphene_point_t offset;
in the object and in all APIs relating to them.
2024-08-10 01:40:45 +02:00
Benjamin Otte 2ee16e5dd9 gl: Set correct context when disposing GLDriver 2024-08-10 01:40:45 +02:00
Matthias Clasen f846315a6a Merge branch 'matthiasc/for-main' into 'main'
docs: More details for the node format

See merge request GNOME/gtk!7586
2024-08-09 16:46:30 +00:00
Matthias Clasen 5329b7d211 docs: More details for the node format
Add some more details.
2024-08-09 12:16:06 -04:00
Matthias Clasen ac18a665d5 node-format.md: formatting tweaks 2024-08-09 11:54:12 -04:00
Matthias Clasen c492e71aed Merge branch 'css-color-hookup-3' into 'main'
Make non-srgb css colors work for box shadows

See merge request GNOME/gtk!7552
2024-08-08 22:52:12 +00:00
Matthias Clasen 4ea1319c6b Replay inset and outset shadow nodes properly 2024-08-08 16:01:06 -04:00
Matthias Clasen 2aac3c2cc9 inspector: Show more details for box shadow nodes
Show the color state, and create textures with the full color
information.
2024-08-08 16:01:06 -04:00
Matthias Clasen 55d18bdc06 gtk: Use new box shadow snapshot apis
Preserve color states from css as much as possible.
2024-08-08 16:01:06 -04:00
Matthias Clasen abefa0ab00 gtk: Add gtk_snapshot_append_{in,out}set_shadow2
These are private snapshot functions that use the new constructors
to create a box shadow nodes with a given color state.
2024-08-08 16:01:06 -04:00
Matthias Clasen ea28dc8cff nodeparser: Support color states for box shadows
Just switch from parse_color to parse_color2, and apply the
corresponding changes to serialization too.

Test included.
2024-08-08 15:49:55 -04:00
Matthias Clasen d3b9eb7fc8 gsk: Use private box shadow api 2024-08-08 15:43:49 -04:00
Matthias Clasen cdb61923af gsk: Add private box shadow node api
Add a constructor that takes a GdkColor, and a getter for it.
2024-08-08 15:43:49 -04:00
Matthias Clasen 070ddcd14b Change box shadow op api
Pass the ccs, opacity and GdkColor and let the op decide about
color conversions. Update all callers.
2024-08-08 15:43:49 -04:00
Matthias Clasen 355890b421 gsk: Port the cairo blur to GdkColor
Update all callers.
2024-08-08 15:43:49 -04:00
Matthias Clasen d86407f263 Merge branch 'wip/otte/optional-dependencies' into 'main'
gstreamer: Always build dmabuf support

See merge request GNOME/gtk!7201
2024-08-08 19:29:13 +00:00
Benjamin Otte a24a7db72b build: bump GStreamer dep to 1.24.0
Depend on a release version, not a prerelease.
2024-08-08 19:03:31 +00:00
Benjamin Otte 2096a29b06 build: Remove an old workaround
The workaround only triggered in GStreamer < 1.19.1 but we require 1.23
now.
2024-08-08 19:03:31 +00:00
Benjamin Otte ce352b5538 build: Move GStreamer dependency checks
Put them where all the other checks go so that it's easy for people
reading build files to see what GTK depends on.

Also reindent properly.
2024-08-08 19:03:31 +00:00
Benjamin Otte 4bcd2c75cc gstreamer: Require the same version for all GStreamer deps
We don't want people to have different GStramer library versions.

GStreamer now is developed in a monorepo, so the versions are in sync.
2024-08-08 19:03:31 +00:00
Benjamin Otte 3c3bf0192d gstreamer: Always build dmabuf support
I just spent an hour trying to figure out why things don't work. And it
was an optional dependency hidden 3 layers deep in some meson file.

This really has to stop.

And because just like in GTK, GStreamer's dmabuf APIs are always
available (they will just fail on Windows etc), there's no need to have
any conditions.

The only difference is that the GStreamer media backend now requires
GStreamer 1.24.
2024-08-08 19:03:31 +00:00
Benjamin Otte cf84d999d8 dmabuf: Add DRM_FORMAT_MOD_INVALID to our formats
That's gonna be necessary for the next commits.
2024-08-08 19:03:31 +00:00
Matthias Clasen 668628941e Merge branch 'ci-update-f40' into 'main'
ci: Update to Fedora 40

See merge request GNOME/gtk!7583
2024-08-08 19:02:22 +00:00
Matthias Clasen 33f8fa331d fp16: Mark ifuncs as unused to pacify clang
clang in F40 seems to have forgotten what fp16 is, and doesn't
use the resolver functions for anything, and then complains that
they are unused...
2024-08-08 14:40:19 -04:00
Matthias Clasen 7814d1fd75 ci: Fix a Vulkan problem in the F40 image
Drop the powervr Vulkan driver, which otherwise interferes with
proper functioning of our ci.
2024-08-08 14:19:25 -04:00
Matthias Clasen b57c3008a3 ci: Update to Fedora 40
Crucially, this gives us gstreamer 1.24.
2024-08-08 12:57:33 -04:00
Benjamin Otte 99d291eb69 Merge branch 'wip/otte/occlusion' into 'main'
Implement advanced occlusion culling

See merge request GNOME/gtk!7570
2024-08-08 14:22:22 +00:00
Benjamin Otte 8e35398371 Merge branch 'wip/otte/for-main' into 'main'
vulkan: Turn debug messages into warnings

See merge request GNOME/gtk!7579
2024-08-08 04:25:35 +00:00
Benjamin Otte 3313fd4e2b vulkan: Turn debug messages into warnings
Vulkan errors are quire critical, so we want to see them.

Our code is good enough to handle all non-critical errors.
2024-08-08 04:41:16 +02:00
Matthias Clasen 56c02dd7d1 Merge branch 'css-color-hookup-2' into 'main'
Make non-srgb css colors work for borders

See merge request GNOME/gtk!7550
2024-08-07 23:14:35 +00:00
Benjamin Otte 4e4ed1e2d5 gpu: Implement occlusion for subsurface nodes
In the case of no offloading, we want to pass through to the child
(which is likely a big texture doing occlusion).

In the case of punching a hole, we want to punch the hole and not draw
anything behind it, so we start an occlusion pass with transparency.

And in the final case with offloading active, we don't draw anything,
so we don't draw anything.

This should fix concerns about drawing the background behind the video
as mentioned for example in
https://github.com/Rafostar/clapper/issues/343#issuecomment-1445425004
2024-08-07 23:26:03 +02:00
Benjamin Otte 82aa2cb5c2 gpu: Implement add_first_node for debug nodes
As always, we want to have no influence on any results
from these nodes.
2024-08-07 23:26:03 +02:00
Benjamin Otte e9944148d5 gpu: Add GSK_DEBUG=occlusion
Draws a semi-transparent white overlay over all regions that have
been chosen for occlusion.
2024-08-07 23:26:03 +02:00
Benjamin Otte afa4eb7d35 gpu: Make containers check opaque size for early exit
Container nodes save their opaque region, so it's quick to access. Use
that to check if the largest opaque region even qualifies for culling -
and if not, just exit.

Speeds up walking node trees by a lot.
2024-08-07 23:26:03 +02:00
Benjamin Otte 55597d88a4 gpu: Run full check for every clip rect
Now that we can specify the min size for an occlusion pass, we can
specify that we want the full clip rect to be occluded for occlusion to
trigger.

The benefit of this is that for partial redraws we almost
always get the background color to cover the redrawn rectangle, so
occlusion will kick in.
2024-08-07 23:26:03 +02:00
Benjamin Otte ac37b589b6 gpu: Require an occlusion path to be 10% of image
That way we are guaranteed to run <=10 occlusion passes.
2024-08-07 23:26:03 +02:00
Benjamin Otte b9d868b8eb gpu: Pass min occlusion size as argument
That allows as to vary the number. We don't do that yet, but we could
now.
2024-08-07 23:26:03 +02:00
Benjamin Otte 30e5bfcbf0 gpu: Refactor culling function
Split the loop into 2: One for the culling and one for later, once we've
decided to not try culling anymore.
2024-08-07 23:26:03 +02:00
Benjamin Otte 57e21683a6 gpu: Try largest clip rect first
When trying to cull, try culling from the largest rectangle of the
remaining draw region first. That region has the biggest chance of
containing a large area to skip.

As a side effect, we can stop trying to cull once the largest rectangle
isn't big enough anymore to contain anything worth culling.
2024-08-07 23:26:03 +02:00
Benjamin Otte 852ecf7c20 gpu: Consult scissor for clip bounds
When querying clip bounds, also check the scissor rect, because
sometimes that one is tighter than the clip bounds, because the clip
bounds need to track some larger rounded corners.

Makes a few tests harder to break.
2024-08-07 23:26:03 +02:00
Benjamin Otte 5976debfcd gpu: Change how occlusion passes work
Instead of requiring an occlusion pass to cover the whole given scissor
rect, allow using a smaller rect to start the pass.

When starting such a pass, we adjust the scissor rect to the size of
that pass and do not grow it again until the pass is done.
The rectangle subtraction at the end will then take care of subtraction
that rectangle from the remaining pixels.

To not end up with lots of tiny occlusion passes, add a limit for how
small such a pass may be.
For now that limit is arbitrarily chosen at 100k pixels.
2024-08-07 23:26:03 +02:00
Benjamin Otte 08fcba63d0 gpu: Split out a function
gsk_gpu_node_processor_rect_to_device() is a useful function to have,
even if it has to return FALSE sometimes when there is no simple 1:1
mapping - ie when the modelview contains a rotation.
2024-08-07 23:26:03 +02:00
Benjamin Otte 1abe9760ab gpu: Change the way clip rectangles are processed
Instead of just iterating over all the rectangles of the region,
always draw the first rectangle of the region and subtract it when done.

This sounds more complicated, but it will allow us to modify the
rectangle in future commits.
2024-08-07 23:26:03 +02:00
Benjamin Otte 9a4d8453ed gpu: Remove unused argument
the clip is already available via node->scissor so no need to track
that.
2024-08-07 23:26:03 +02:00
Benjamin Otte b637c3e201 gpu: Pass the clip region even further down
We are now handling the region inside the nodeprocessor.
2024-08-07 23:26:03 +02:00
Benjamin Otte 292f54dd60 gpu: Split out render function
Makes the code easier to understand
2024-08-07 23:26:03 +02:00
Benjamin Otte 1328c1409a gpu: Make the region argument transfer full
I want to modify the region while using it, and everybody destroys it
right after, so now there's no need to do a copy.
2024-08-07 23:26:03 +02:00
Benjamin Otte dbeddd4417 gpu: Always pass a clip region to render()
This way, we can remove the code that checks for its existence in that
function, making the code simpler.
2024-08-07 23:26:03 +02:00
Benjamin Otte add5dec4a9 rect: Add another utility function
Add gsk_rect_to_cairo_shrink() to match gsk_rect_to_cairo_grow()
2024-08-07 23:26:03 +02:00
Benjamin Otte 97b51dc070 inspector: Print opaque rect of nodes
Also change the way rectangles are printed by including the bottom right
coordinate, too.

I'm still not sure what the best way is, but at least I no longer get
confused and it has the infos I want.
2024-08-07 23:26:03 +02:00
Benjamin Otte 88c9a30f77 testsuite: Half the runtime of offscreens test
It times out too much in CI.
2024-08-07 23:26:03 +02:00
Marek Kasik 83035c1d4b printeroptionwidget: Maintain cursor position in combo-entry
Maintain cursor position even if the text in the entry has been filtered.
This is achieved by maintaining the same position with respect to
the end of the text buffer as we suppose that the text after the cursor
hasn't changed. This is measured in characters not bytes.

Fixes #6782
2024-08-07 20:26:57 +02:00
Matthias Clasen 50c19a6534 Merge branch 'hdr-content' into 'main'
gsk: Track whether nodes require wide gamut

See merge request GNOME/gtk!7575
2024-08-07 17:34:02 +00:00
Benjamin Otte 5c071cb02e dmabuf: Fix a check
We were comparing with destination stride, not with source stride, and
in rare cases when those were different, this would trigger aborts in
the testsuite.
2024-08-07 19:06:02 +02:00
Matthias Clasen 6edb526561 Merge branch 'plug-gtask-leaks' into 'main'
Plug GTask leaks

See merge request GNOME/gtk!7551
2024-08-07 16:26:52 +00:00
Matthias Clasen ee18156675 gsk: Add gsk_render_node_is_hdr
Add a function that tracks whether a render node's content is
in a wide gamut color state (in practice, that means non-sRGB).

This will be used in render_texture to determine the color
state to use when creating a texture.
2024-08-07 11:14:21 -04:00
Matthias Clasen e70a961ac1 Merge branch 'matthiasc/for-main' into 'main'
memoryformat: Add a debug helper

See merge request GNOME/gtk!7571
2024-08-07 14:51:05 +00:00
Matthias Clasen ffdc8c8f60 gsk: Drop some unused code
Nobody is using gsk_gpu_download_png_op, and we are going to
refactor the download op code.
2024-08-07 08:39:53 -04:00
Matthias Clasen fd78bd3eaf memoryformat: Add a debug helper
I need this often enough that I'll just put it here.
2024-08-07 08:22:05 -04:00
Matthias Clasen f2ccba0988 Merge branch 'wip/test-parser-data-additions' into 'main'
testsuite: add more files to test_data

See merge request GNOME/gtk!7569
2024-08-07 03:30:20 +00:00
Jeremy Bícha 8ee465c630 testsuite: add more files to test_data 2024-08-06 20:28:58 -04:00
Matthias Clasen 31b655c9eb Merge branch 'wip/dont-leak-egl-surface' into 'main'
gdk/surface: Don't leak the EGLSurface

See merge request GNOME/gtk!7568
2024-08-06 22:54:31 +00:00
Jonas Ådahl 7fd65cc3c1 gdk/surface: Don't leak the EGLSurface
Each time we create a new window, we create a new EGLSurface. Each time
we destroy a window, we failed to destroy the EGLSurface, due to passing
a GdkDisplay instead of a EGLDisplay to eglDestroySurface().

This effectively leaked not only the EGL surface metadata, but also the
associated DMA buffers. For applications where one opens and closes many
windows over the lifetime of the application, and where the application
runs for a long time; for example a terminal emulator server, this
causes a significant memory leak, as the memory will only ever be freed
once once the application process itself exits, if ever.

Fix this passing an actual EGLDisplay instead of an GdkDisplay, to
eglDestroySurface().
2024-08-06 23:42:11 +02:00
Jonas Ådahl 8089222fc3 gsk/gpu/downloadop: Include glib-unix.h
It's needed by g_close().
2024-08-06 23:41:46 +02:00
Benjamin Otte 0667bd39fb Merge branch 'wip/otte/for-main' into 'main'
gpu: Consult target colorstate for depth

See merge request GNOME/gtk!7567
2024-08-06 21:07:44 +00:00
Benjamin Otte a4854dfa9e memoryformat: Use "(p)" as premultiplied indicator in names
This matches what the gpu renderer does when printing
colorstates.

It also avoids it printing "S*RGBA8" for the format and instead prints
"SRGBA8(p)" now.
2024-08-06 22:15:17 +02:00
Benjamin Otte 6c54d0a7e2 gpu: Consult target colorstate for depth
When creating images for use with different colorstates, ensure that
they have the depth of that colorstate. Otherwise we might lose accuracy
due to quantization.

Fixes mipmaps in rec2100 being rendered as RGBA8.
2024-08-06 22:15:17 +02:00
Matthias Clasen 341860eb4d Merge branch 'small-fixes' into 'main'
colorstate: Drop xyz for now

See merge request GNOME/gtk!7565
2024-08-06 20:06:38 +00:00
Matthias Clasen 876445f080 inspector: Show color states of textures 2024-08-06 15:38:31 -04:00
Matthias Clasen 03ef6a7719 colorstate: Drop xyz for now
Converting to and from xyz turns out to be more difficult than
expected, depending on what whitepoint you choose, And different
specs choose different whitepoints, so we can't directly map
css xyz to cicp xyz anyway.
2024-08-06 15:38:31 -04:00
Matthias Clasen 2960bb7cb2 Add a compare test for colorstates in borders 2024-08-06 07:35:00 -04:00
Matthias Clasen 161c0f0963 inspector: Show more detail for border nodes
Show the color state, and create textures with the full color
information.
2024-08-06 07:35:00 -04:00
Matthias Clasen 3002591d08 gtk: Use new border snapshot api
Preserve color states from css as much as possible.
2024-08-06 07:35:00 -04:00
Matthias Clasen 1b2b9726f8 gtk: Add gtk_snapshot_append_border2
This is a private snapshot function that uses the new constructor
to create a border node with the given GdkColors.
2024-08-06 07:35:00 -04:00
Matthias Clasen a3691d311b nodeparser: Support color states in border nodes
Test included.
2024-08-06 07:35:00 -04:00
Matthias Clasen 89d449352f testsuite: Replay border nodes properly
Use the new apis for this.
2024-08-06 07:35:00 -04:00
Matthias Clasen e220e6dae7 gsk: Use private border node api
Use the GdkColors returned by this function instead of assuming
the colors of a border node are always sRGB.
2024-08-06 07:35:00 -04:00
Matthias Clasen bd3d1f7715 gsk: Add private border node api
Add a constructor that takes GdkColors, and a getter for those.

To support the existing api, we convert the colors to GdkRGBA
as needed.
2024-08-06 07:35:00 -04:00
Matthias Clasen f3ffa99f6a gsk: Change the border op api
Pass the ccs, opacity and GdkColors to the op to let it make
decisions about color conversion. Also, reorder the offset to
follow the same order as the color ops.

Update the callers.
2024-08-06 07:35:00 -04:00
Sergey Bugaev 85830c059e Plug GTask leaks
The error-prone pattern seems to be:

  GTask *task = g_task_new (...);

  if (condition)
    {
      g_task_return_... (task, ...);
      /* need g_object_unref (task) here! */
      return;
    }

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
2024-08-05 14:38:23 +03:00
Marek Kasik 6435d5083a printeroptionwidget: Update on combo-entry change
Connect to "changed" signal of the entry displayed with combobox
for some options (e.g. watermark text or passcode). This ensures
that the strings are propagated to the printer backend.

Fixes #6782
2024-07-31 16:59:11 +02:00
Arjan Molenaar f0925e4ef2 docs: Update function docs for gdk_event_triggers_context_menu
Include macOS, make code snipper easier identifyable.
2024-07-29 20:07:13 +02:00
Arjan Molenaar df87b1820b macos: Add Ctrl+left-click mapping for context menus
Update GdkEvent.triggers_context_menu to trigger a context menu
on macOS.
2024-07-29 19:59:29 +02:00
Stuart Hayhurst 170f099ce1 textbuffer: Clear paste point override from empty middle clicks
Middle clicking without a selection left a paste point override behind.
This meant actual pastes were going to the location of the middle click,
instead of the cursor

Closes #5530
2024-07-27 12:33:35 +01:00
Luca Bacci ccc6f7c24e GdkWin32: Drop unused variable
We still check whether depth buffer bits must be > 0,
we just don't use that variable anymore.
2024-07-24 15:36:25 +02:00
Luca Bacci 41b21b6634 WGL: Search pixel format with defined swap method (opengl32)
We want to get PFD_SWAP flags as that's required to enable incremental
rendering. However, as documented on MSDN, ChoosePixelFormat ignores
PFD_SWAP flags.

We may get PFD_SWAP flags or not depending on the way the OpenGL driver
orders its pixel formats. While PFD_SWAP flags are very important for
GUI toolkits, they are best avoided by games, as most games render the
scene in its entirety on each frame. Drivers optimized for games tend
to order pixel formats with no PFD_SWAP flags first.

Se we implement our own method to select the best pixel format. We check
for usable pixel formats and assign penalties for each one, until we find
a format with 0 penalty or the sequence ends. Then the best pixel format
is selected.
2024-07-24 15:36:25 +02:00
Luca Bacci b46a900d71 WGL: Search pixel format with defined swap method (arb)
Getting a defined swap method is necessary to enable incremental
rendering. We cannot just add a swap method attribute since
exchange is generally preferred, but is not always available.
Here we try to infer what the driver prefers, then ask for
exchange or copy, in sequence.
2024-07-24 15:35:40 +02:00
g.willems 4fa661b450 printdialog: fix sporadic win32 build failures
Private function `gtk_print_setup_get_printer` unconditionally calls
`gtk_printer_find()`, which does not exist on Win32.

But `gtk_print_setup_get_printer()` is never called either, so usually
that whole code gets optimized out.

Some compilation environment however do not cleanup unused functions,
leading to linker error as `gtk_printer_find()` is not found.

This patch should solve the link issue.
2024-07-15 23:05:13 +02:00
robxnano 4da8d39ec5 MenuSectionBox: Increase priority of separator sync function
This ensures that the separators are made visible before a popover
menu is shown. Previously the menu would jump in size after it
appeared.

Closes https://gitlab.gnome.org/GNOME/gtk/-/issues/5166
2023-12-14 18:57:04 +00:00
524 changed files with 39340 additions and 26754 deletions
+4 -2
View File
@@ -26,7 +26,8 @@ variables:
BACKEND_FLAGS: "-Dx11-backend=true -Dwayland-backend=true -Dbroadway-backend=true"
FEATURE_FLAGS: "-Dvulkan=enabled -Dcloudproviders=enabled -Dbuild-testsuite=true -Dintrospection=enabled"
MESON_TEST_TIMEOUT_MULTIPLIER: 3
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v49"
MESON_TEST_MAX_PROCESSES: 8
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v52"
workflow:
rules:
@@ -414,11 +415,12 @@ static-scan:
# Run tests with the address sanitizer. We need to turn off introspection
# and f16c, since they are incompatible with asan
asan-build:
image: $FEDORA_IMAGE
extends: .build-fedora-default
tags: [ asan ]
stage: analysis
needs: []
variables:
MESON_TEST_MAX_PROCESSES: 4
script:
- export PATH="$HOME/.local/bin:$PATH"
- CC=clang meson setup
+4 -1
View File
@@ -1,4 +1,4 @@
FROM fedora:39
FROM fedora:40
RUN dnf -y install \
adwaita-icon-theme \
@@ -99,8 +99,11 @@ RUN dnf -y install \
which \
wireplumber \
xorg-x11-server-Xvfb \
&& dnf -y update \
&& dnf clean all
RUN rm /usr/share/vulkan/icd.d/powervr_mesa_icd.x86_64.json
# Enable sudo for wheel users
RUN sed -i -e 's/# %wheel/%wheel/' -e '0,/%wheel/{s/%wheel/# %wheel/}' /etc/sudoers
+10 -4
View File
@@ -8,17 +8,19 @@ builddir=$1
setup=$2
suite=$3
multiplier=${MESON_TEST_TIMEOUT_MULTIPLIER:-1}
n_processes=${MESON_TEST_MAX_PROCESSES:-1}
# Ignore memory leaks lower in dependencies
export LSAN_OPTIONS=suppressions=$srcdir/lsan.supp:print_suppressions=0:detect_leaks=0:allocator_may_return_null=1
export G_SLICE=always-malloc
case "${setup}" in
x11*)
xvfb-run -a -s "-screen 0 1024x768x24 -noreset" \
dbus-run-session -- \
xvfb-run -a -s "-screen 0 1024x768x24 -noreset" \
meson test -C ${builddir} \
--quiet \
--timeout-multiplier "${multiplier}" \
--num-processes "${n_processes}" \
--print-errorlogs \
--setup=${setup} \
--suite=${suite//,/ --suite=} \
@@ -40,9 +42,11 @@ case "${setup}" in
compositor=$!
export WAYLAND_DISPLAY=wayland-5
meson test -C ${builddir} \
dbus-run-session -- \
meson test -C ${builddir} \
--quiet \
--timeout-multiplier "${multiplier}" \
--num-processes "${n_processes}" \
--print-errorlogs \
--setup=${setup} \
--suite=${suite//,/ --suite=} \
@@ -63,9 +67,11 @@ case "${setup}" in
server=$!
export BROADWAY_DISPLAY=:5
meson test -C ${builddir} \
dbus-run-session -- \
meson test -C ${builddir} \
--quiet \
--timeout-multiplier "${multiplier}" \
--num-processes "${n_processes}" \
--print-errorlogs \
--setup=${setup} \
--suite=${suite//,/ --suite=} \
+198 -1
View File
@@ -1,6 +1,203 @@
Overview of Changes in 4.15.5, xx-xx-xxxx
Overview of Changes in 4.16.1, xx-xx-xxxx
=========================================
Overview of Changes in 4.16.0, 09-06-2024
=========================================
Note: This release changes the default GSK renderer to be Vulkan,
on Wayland. Other platforms still use ngl. The intent of this change
is to use the best available platform APIs. You can still override
the renderer choice using the GSK_RENDERER environment variable.
We believe that most of the problems reported with the new renderers
during the 4.13 and 4.15 development cycles have been addressed by now.
But the new renderers and dmabuf support are using graphics drivers
in different ways than the old gl renderer, and trigger new driver bugs.
Therefore, it is recommended to use the latest mesa release (24.2)
with the new renderers.
* GtkScale:
- Fix positioning of scale values
* GtkEmojiChooser:
- Make Control-clicks work for the recent section
* GtkPopover:
- Make sure focus lands on the right widget when cascading
* GtkSpinButton:
- Disable Emoji input for numeric spin buttons
* GtkSingleSelection:
- Implement unselect_all
* Accssibility:
- Fix roles for radio buttons
- Check if ATs are listening before exporting trees
- Add a check for sandboxed accessibility bus
- Fix handling of the error message relation
- Turn criticals into debug messages
- Set expanded states properly in menus
* CSS:
- Fix a few issues on bigendian systems
- Avoid a crash with relative colors
* GSK:
- Use the right GL context when exporting textures
- Don't let colors influence depth decisions
- Allow uploading of mipmap levels when tiling textures
* GDK:
- Update keysyms from libX11 1.8.10
- Implement cpu-side mipmapping
- Use a thread pool for color conversions and mipmapping
* Vulkan:
- Fix drag surface offsets
* Wayland:
- Fix a crash
- Associate EGL windows with context later
* X11:
- Fix initial EGL context creation
- Fix a problem with GL context creation
* Broadway:
- Implement compute_size and request_layout
* MacOS:
- Set transparent backgroiund for toplevel windows
* Windows:
- Improve debug output
- Detect Mesas d3d12 driver and request GDI compat
* Demos:
- Set window icons in demos
- Add a 64k x 64k image to the image scaling demo
* Translation updates
Belarusian
Brazilian Portuguese
Catalan
Czech
Galician
German
Hebrew
Indonesian
Korean
Lithuanian
Persian
Polish
Portuguese
Slovenian
Spanish
Turkish
Ukrainian
Overview of Changes in 4.15.6, 08-26-2024
=========================================
* GtkCheckButton:
- Add a grouped style class for radio buttons
* GtkScale:
- Fix alignment and positioning problems
* Css:
- Fix crashes in the variable support
* Gsk:
- Make graphics offloading work better with kwin
- Make colorstate transfer functions more robust
- GC dead textures more agressively
- Only use a single render pass per frame
* GL:
- Round damage rectangles properly
- Use the shared context when creating textures
- Fix a file descriptor leak in dmabuf export
* Vulkan:
- Round damage rectangles properly
* Wayland:
- Work with the kwin implementation of xx-color-management-v4
* Windows:
- Make gtk_show_uri use SHOpenWithDialog()
- Enable incremental rendering with WGL
* Macos:
- Open context menus on Ctrl-left click
* Debugging:
- Show color state information in the inspector
- Collect input event traces in the recorder
- Add shortcuts for toggling recording: Super-r
and for screenshots: Super-c
- Split the GDK_DEBUG env var into GDK_DEBUG and GDK_DISABLE
- Add GDK_DISABLE=color-mgmt and GDK_DISABLE=offload
* Tools:
- Add a 'Paste as node' action in gtk4-node-editor
* Translations updates
Basque
Belarusian
Brazilian Portuguese
Chinese (China)
Georgian
Hebrew
Hindi
Russian
Slovenian
Turkish
Ukrainian
Overview of Changes in 4.15.5, 11-08-2024
=========================================
* GtkTextView:
- ADd GtkTextBufferCommitNotify
* CSS:
- Propagate color state information to GSK for many features:
colors, borders, shadows, text
* Gdk:
- Fix an fd leak in the Vulkan code
- Fix a leak of EGLSurfaces and DMA buffers
- Set the opaque region of surfaces automatically based on their content
* Gsk:
- Fix Emoji rendering in Vulkan
- Rework color handling to take color states into account
- Implement more powerful occlusion culling
- Minimize our use of renderpasses
* Macos:
- Fix window transparency
* Debugging:
- The inspector shows details about color states
* Deprecations:
- gdk_draw_context_begin/end_frame
- gdk_surface_set_opaque_region
* Build:
- Require gstreamer 1.24
* Translation updates
Romanian
Overview of Changes in 4.15.4, 30-07-2024
=========================================
+3
View File
@@ -454,6 +454,9 @@
<file>icons/16x16/categories/applications-other.png</file>
<file>icons/48x48/status/starred.png</file>
<file alias="icons/scalable/apps/org.gtk.Demo4.svg">data/scalable/apps/org.gtk.Demo4.svg</file>
<file>portland-rose-thumbnail.png</file>
<file>large-image-thumbnail.png</file>
<file compressed="true">large-image.png</file>
</gresource>
<gresource prefix="/org/gtk/Demo4/gtk">
<file preprocess="xml-stripblanks">help-overlay.ui</file>
+1 -1
View File
@@ -55,7 +55,7 @@ mode_switch_state_set (GtkSwitch *sw,
{
gtk_widget_set_visible (label, TRUE);
gtk_accessible_update_relation (GTK_ACCESSIBLE (sw),
GTK_ACCESSIBLE_RELATION_ERROR_MESSAGE, label,
GTK_ACCESSIBLE_RELATION_ERROR_MESSAGE, label, NULL,
-1);
gtk_accessible_update_state (GTK_ACCESSIBLE (sw),
GTK_ACCESSIBLE_STATE_INVALID, GTK_ACCESSIBLE_INVALID_TRUE,
+150 -14
View File
@@ -14,6 +14,103 @@
#include <gtk/gtk.h>
#include "demo3widget.h"
static GtkWidget *window = NULL;
static GCancellable *cancellable = NULL;
static void
load_texture (GTask *task,
gpointer source_object,
gpointer task_data,
GCancellable *cable)
{
GFile *file = task_data;
GdkTexture *texture;
GError *error = NULL;
texture = gdk_texture_new_from_file (file, &error);
if (texture)
g_task_return_pointer (task, texture, g_object_unref);
else
g_task_return_error (task, error);
}
static void
set_wait_cursor (GtkWidget *widget)
{
gtk_widget_set_cursor_from_name (GTK_WIDGET (gtk_widget_get_root (widget)), "wait");
}
static void
unset_wait_cursor (GtkWidget *widget)
{
gtk_widget_set_cursor (GTK_WIDGET (gtk_widget_get_root (widget)), NULL);
}
static void
texture_loaded (GObject *source,
GAsyncResult *result,
gpointer data)
{
GdkTexture *texture;
GError *error = NULL;
texture = g_task_propagate_pointer (G_TASK (result), &error);
if (!texture)
{
g_print ("%s\n", error->message);
g_error_free (error);
return;
}
if (!window)
{
g_object_unref (texture);
return;
}
unset_wait_cursor (GTK_WIDGET (data));
g_object_set (G_OBJECT (data), "texture", texture, NULL);
}
static void
open_file_async (GFile *file,
GtkWidget *demo)
{
GTask *task;
set_wait_cursor (demo);
task = g_task_new (demo, cancellable, texture_loaded, demo);
g_task_set_task_data (task, g_object_ref (file), g_object_unref);
g_task_run_in_thread (task, load_texture);
g_object_unref (task);
}
static void
open_portland_rose (GtkWidget *button,
GtkWidget *demo)
{
GFile *file;
file = g_file_new_for_uri ("resource:///transparent/portland-rose.jpg");
open_file_async (file, demo);
g_object_unref (file);
}
static void
open_large_image (GtkWidget *button,
GtkWidget *demo)
{
GFile *file;
file = g_file_new_for_uri ("resource:///org/gtk/Demo4/large-image.png");
open_file_async (file, demo);
g_object_unref (file);
}
static void
file_opened (GObject *source,
GAsyncResult *result,
@@ -21,7 +118,6 @@ file_opened (GObject *source,
{
GFile *file;
GError *error = NULL;
GdkTexture *texture;
file = gtk_file_dialog_open_finish (GTK_FILE_DIALOG (source), result, &error);
@@ -32,17 +128,9 @@ file_opened (GObject *source,
return;
}
texture = gdk_texture_new_from_file (file, &error);
g_object_unref (file);
if (!texture)
{
g_print ("%s\n", error->message);
g_error_free (error);
return;
}
open_file_async (file, data);
g_object_set (G_OBJECT (data), "texture", texture, NULL);
g_object_unref (texture);
g_object_unref (file);
}
static void
@@ -116,11 +204,26 @@ transform_from (GBinding *binding,
return TRUE;
}
static void
free_cancellable (gpointer data)
{
g_cancellable_cancel (cancellable);
g_clear_object (&cancellable);
}
static gboolean
cancel_load (GtkWidget *widget,
GVariant *args,
gpointer data)
{
unset_wait_cursor (widget);
g_cancellable_cancel (G_CANCELLABLE (data));
return TRUE;
}
GtkWidget *
do_image_scaling (GtkWidget *do_widget)
{
static GtkWidget *window = NULL;
if (!window)
{
GtkWidget *box;
@@ -130,6 +233,7 @@ do_image_scaling (GtkWidget *do_widget)
GtkWidget *scale;
GtkWidget *dropdown;
GtkWidget *button;
GtkEventController *controller;
window = gtk_window_new ();
gtk_window_set_title (GTK_WINDOW (window), "Image Scaling");
@@ -138,6 +242,20 @@ do_image_scaling (GtkWidget *do_widget)
gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
cancellable = g_cancellable_new ();
g_object_set_data_full (G_OBJECT (window), "cancellable",
cancellable, free_cancellable);
controller = gtk_shortcut_controller_new ();
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (
gtk_keyval_trigger_new (GDK_KEY_Escape, 0),
gtk_callback_action_new (cancel_load, cancellable, NULL)
));
gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller),
GTK_SHORTCUT_SCOPE_GLOBAL);
gtk_widget_add_controller (window, controller);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_window_set_child (GTK_WINDOW (window), box);
@@ -156,6 +274,22 @@ do_image_scaling (GtkWidget *do_widget)
g_signal_connect (button, "clicked", G_CALLBACK (open_file), widget);
gtk_box_append (GTK_BOX (box2), button);
button = gtk_button_new ();
gtk_button_set_child (GTK_BUTTON (button),
gtk_image_new_from_resource ("/org/gtk/Demo4/portland-rose-thumbnail.png"));
gtk_widget_add_css_class (button, "image-button");
gtk_widget_set_tooltip_text (button, "Portland Rose");
g_signal_connect (button, "clicked", G_CALLBACK (open_portland_rose), widget);
gtk_box_append (GTK_BOX (box2), button);
button = gtk_button_new ();
gtk_button_set_child (GTK_BUTTON (button),
gtk_image_new_from_resource ("/org/gtk/Demo4/large-image-thumbnail.png"));
gtk_widget_add_css_class (button, "image-button");
gtk_widget_set_tooltip_text (button, "Large image");
g_signal_connect (button, "clicked", G_CALLBACK (open_large_image), widget);
gtk_box_append (GTK_BOX (box2), button);
button = gtk_button_new_from_icon_name ("object-rotate-right-symbolic");
gtk_widget_set_tooltip_text (button, "Rotate");
g_signal_connect (button, "clicked", G_CALLBACK (rotate), widget);
@@ -191,7 +325,9 @@ do_image_scaling (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE);
else
gtk_window_destroy (GTK_WINDOW (window));
{
gtk_window_destroy (GTK_WINDOW (window));
}
return window;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 KiB

+2
View File
@@ -1068,6 +1068,8 @@ command_line (GApplication *app,
window = gtk_application_get_windows (GTK_APPLICATION (app))->data;
gtk_window_set_icon_name (GTK_WINDOW (window), "org.gtk.Demo4");
if (name == NULL)
goto out;
+2 -1
View File
@@ -225,7 +225,8 @@ print_ready (GObject *source,
if (!g_output_stream_close (stream, NULL, &error))
{
g_print ("Error from close: %s\n", error->message);
if (!g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_DISMISSED))
g_print ("Error from close: %s\n", error->message);
g_error_free (error);
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

+2
View File
@@ -139,6 +139,8 @@ icon_browser_app_activate (GApplication *app)
if (g_strcmp0 (PROFILE, "devel") == 0)
gtk_widget_add_css_class (GTK_WIDGET (win), "devel");
gtk_window_set_icon_name (GTK_WINDOW (win), "org.gtk.IconBrowser4");
gtk_window_present (GTK_WINDOW (win));
}
@@ -219,6 +219,8 @@ node_editor_application_activate (GApplication *app)
if (g_strcmp0 (PROFILE, "devel") == 0)
gtk_widget_add_css_class (GTK_WIDGET (win), "devel");
gtk_window_set_icon_name (GTK_WINDOW (win), "org.gtk.gtk4.NodeEditor");
gtk_window_present (GTK_WINDOW (win));
}
+58
View File
@@ -1205,6 +1205,19 @@ node_editor_window_add_renderer (NodeEditorWindow *self,
g_object_unref (paintable);
}
static void
update_paste_action (GdkClipboard *clipboard,
GParamSpec *pspec,
gpointer data)
{
GtkWidget *widget = GTK_WIDGET (data);
gboolean has_node;
has_node = gdk_content_formats_contain_mime_type (gdk_clipboard_get_formats (clipboard), "application/x-gtk-render-node");
gtk_widget_action_set_enabled (widget, "paste-node", has_node);
}
static void
node_editor_window_realize (GtkWidget *widget)
{
@@ -1242,6 +1255,7 @@ node_editor_window_realize (GtkWidget *widget)
self->after_paint_handler = g_signal_connect (frameclock, "after-paint",
G_CALLBACK (after_paint), self);
g_signal_connect (gtk_widget_get_clipboard (widget), "notify::formats", G_CALLBACK (update_paste_action), widget);
}
static void
@@ -1251,6 +1265,8 @@ node_editor_window_unrealize (GtkWidget *widget)
GdkFrameClock *frameclock;
guint i;
g_signal_handlers_disconnect_by_func (gtk_widget_get_clipboard (widget), update_paste_action, widget);
frameclock = gtk_widget_get_frame_clock (widget);
g_signal_handler_disconnect (frameclock, self->after_paint_handler);
self->after_paint_handler = 0;
@@ -1615,6 +1631,41 @@ edit_action_cb (GtkWidget *widget,
node_editor_window_edit (self, &start);
}
static void
text_received (GObject *source,
GAsyncResult *result,
gpointer data)
{
GdkClipboard *clipboard = GDK_CLIPBOARD (source);
NodeEditorWindow *self = NODE_EDITOR_WINDOW (data);
char *text;
text = gdk_clipboard_read_text_finish (clipboard, result, NULL);
if (text)
{
GtkTextBuffer *buffer;
GtkTextIter start, end;
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->text_view));
gtk_text_buffer_begin_user_action (buffer);
gtk_text_buffer_get_bounds (buffer, &start, &end);
gtk_text_buffer_delete (buffer, &start, &end);
gtk_text_buffer_insert (buffer, &start, text, -1);
gtk_text_buffer_end_user_action (buffer);
g_free (text);
}
}
static void
paste_node_cb (GtkWidget *widget,
const char *action_name,
GVariant *parameter)
{
GdkClipboard *clipboard = gtk_widget_get_clipboard (widget);
gdk_clipboard_read_text_async (clipboard, NULL, text_received, widget);
}
static void
node_editor_window_set_property (GObject *object,
guint prop_id,
@@ -1727,6 +1778,13 @@ node_editor_window_class_init (NodeEditorWindowClass *class)
action = gtk_named_action_new ("smart-edit");
shortcut = gtk_shortcut_new (trigger, action);
gtk_widget_class_add_shortcut (widget_class, shortcut);
gtk_widget_class_install_action (widget_class, "paste-node", NULL, paste_node_cb);
trigger = gtk_keyval_trigger_new (GDK_KEY_v, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
action = gtk_named_action_new ("paste-node");
shortcut = gtk_shortcut_new (trigger, action);
gtk_widget_class_add_shortcut (widget_class, shortcut);
}
static GtkWidget *
+4
View File
@@ -22,6 +22,10 @@
</menu>
<menu id="extra_menu">
<section>
<item>
<attribute name="label" translatable="yes">Paste _Node</attribute>
<attribute name="action">paste-node</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Assisted _Edit</attribute>
<attribute name="action">smart-edit</attribute>
+1 -1
View File
@@ -798,7 +798,7 @@ activate (GApplication *app)
if (g_strcmp0 (PROFILE, "devel") == 0)
gtk_widget_add_css_class (GTK_WIDGET (main_window), "devel");
gtk_window_set_icon_name (GTK_WINDOW (main_window), "text-editor");
gtk_window_set_icon_name (GTK_WINDOW (main_window), "org.gtk.PrintEditor4");
gtk_window_set_default_size (GTK_WINDOW (main_window), 400, 600);
gtk_application_window_set_show_menubar (GTK_APPLICATION_WINDOW (main_window), TRUE);
update_title (GTK_WINDOW (main_window));
+1
View File
@@ -2241,6 +2241,7 @@ activate (GApplication *app)
if (g_strcmp0 (PROFILE, "devel") == 0)
gtk_widget_add_css_class (GTK_WIDGET (window), "devel");
gtk_window_set_icon_name (window, "org.gtk.WidgetFactory4");
gtk_application_add_window (GTK_APPLICATION (app), window);
g_action_map_add_action_entries (G_ACTION_MAP (window),
win_entries, G_N_ELEMENTS (win_entries),
+9 -7
View File
@@ -151,10 +151,11 @@ Checks whether the widget is set to be visible or not.
- Methods are special functions whose first argument is always the instance
of a certain class. The instance argument for newly written code should be
called `self`.
- If a method is a setter or a getter for an object property, you should
add an `(attributes org.gtk.Method.set_property=property-name)` or a
an `(attributes org.gtk.Method.get_property=property-name)` annotation
to the method's identifier
- If a method is a setter or a getter for an object property
`GtkClassName:prop-name`, and if its name does not match the naming scheme
`gtk_class_name_{g,s}et_prop_name`, you should add a `(set-property
prop-name)` or a `(get-property prop-name)` annotation to the method's
identifier
- If a method changes one or more properties as side effect, link those
properties in the method's description
- If a method is a signal emitter, you should use the
@@ -192,9 +193,10 @@ Checks whether the widget is set to be visible or not.
purposes.
- Always note if setting a property has side effects, like causing another
property to change state.
- If the property has public accessors you should annotate it with
the `(attributes org.gtk.Property.set=setter_function)` and
`(attributes org.gtk.Property.get=getter_function)` attributes
- If a property `GtkClassName:prop-name` has a public getter or setter, and
they do not match the naming scheme `gtk_class_name_{g,s}et_prop_name` you
should annotate it with the `(setter setter_function)` and `(getter
getter_function)`.
- The syntax for property documentation is:
```c
+1 -1
View File
@@ -38,7 +38,7 @@ if get_option('documentation')
gdk_gir[0],
],
depends: gdk_gir[0],
suite: ['docs'],
suite: ['docs', 'failing'],
)
if x11_enabled
+7 -3
View File
@@ -1,12 +1,16 @@
Title: The Broadway windowing system
Slug: broadway
## Using GTK with Broadway
The GDK Broadway backend provides support for displaying GTK applications in
a web browser, using HTML5 and web sockets.
To run your application in this way, first run the broadway server,
Broadway was written as an experiment and is not the most actively developed
backend. It supports the features that were required of GDK backends in GTK 4.0,
but may not be up-to-date with the latest developments.
## Using GTK with Broadway
To run your application under Broadway, first run the broadway server,
`gtk-broadwayd`, that ships with GTK:
```
+1 -1
View File
@@ -260,4 +260,4 @@ name = "StyleProvider"
hidden = true
[check]
skip_deprecated = true
ignore_deprecated = true
+1 -1
View File
@@ -74,7 +74,7 @@ if get_option('documentation')
gtk_gir[0],
],
depends: gtk_gir[0],
suite: ['docs'],
suite: ['docs', 'failing'],
)
endif
+38 -38
View File
@@ -24,36 +24,36 @@ the motivation and goals of larger API changes.
## Cell renderers are going away
Cell renderers were introduced in GTK 2 to support rendering of
"big data" UIs, in particular treeviews. Over the years, more
"data-like" widgets have started to use them, and cell renderers
big data UIs, in particular treeviews. Over the years, more
data-like widgets have started to use them, and cell renderers
have grown into a shadowy, alternative rendering infrastructure
that duplicates much of what widgets do, while duplicating the
code and adding their own dose of bugs.
In GTK 4, replacement widgets for GtkTreeView, GtkIconView and
GtkComboBox have appeared: GtkListView, GtkColumnView, GtkGridView
and GtkDropDown. For GTK 5, we will take the next step and remove
In GTK 4, replacement widgets for `GtkTreeView`, `GtkIconView` and
`GtkComboBox` have appeared: [class@Gtk.ListView], [class@Gtk.ColumnView], [class@Gtk.GridView]
and [class@Gtk.DropDown]. For GTK 5, we will take the next step and remove
all cell renderer-based widgets.
## Themed rendering APIs are going away
The old GTK 2 era rendering APIs for theme components like
gtk_render_frame() or gtk_render_check() have not been used by
`gtk_render_frame()` or `gtk_render_check()` have not been used by
GTK itself even in later GTK 3, but they have been kept around
for the benefit of "external drawing" users - applications that
for the benefit of external drawing users applications that
want their controls to look like GTK without using widgets.
Supporting this is increasingly getting in the way of making
the GTK CSS machinery fast and correct. One notable problem is
that temporary style changes (using gtk_style_context_save())
that temporary style changes (using `gtk_style_context_save()`)
is breaking animations. Therefore, these APIs will be going away
in GTK 5, together with their more modern GtkSnapshot variants
like gtk_snapshot_render_background() or gtk_snapshot_render_focus().
in GTK 5, together with their more modern [class@Gtk.Snapshot] variants
like `gtk_snapshot_render_background()` or `gtk_snapshot_render_focus()`.
The best way to render parts of your widget using CSS styling
is to use subwidgets. For example, to show a piece of text with
fonts, effects and shadows according to the current CSS style,
use a GtkLabel.
use a [class@Gtk.Label].
If you have a need for custom drawing that fits into the current
(dark or light) theme, e.g. for rendering a graph, you can still
@@ -62,28 +62,28 @@ get the current style foreground color, using
## Local stylesheets are going away
The cascading part of GTK's CSS implementation is complicated by
The cascading part of GTKs CSS implementation is complicated by
the existence of local stylesheets (i.e. those added with
gtk_style_context_add_provider()). And local stylesheets are
`gtk_style_context_add_provider()`). And local stylesheets are
unintuitive in that they do not apply to the whole subtree of
widgets, but just to the one widget where the stylesheet was
added.
GTK 5 will no longer provide this functionality. The recommendations
is to use a global stylesheet (i.e. gtk_style_context_add_provider_for_display())
GTK 5 will no longer provide this functionality. The recommendation
is to use a global stylesheet (i.e. [func@Gtk.StyleContext.add_provider_for_display])
and rely on style classes to make your CSS apply only where desired.
## Non-standard CSS extensions are going away
GTK's CSS machinery has a some non-standard extensions around colors:
named colors with \@define-color and color functions: lighter(), darker(),
shade(), alpha(), mix().
GTKs CSS machinery has a some non-standard extensions around colors:
named colors with `@define-color` and color functions: `lighter()`, `darker()`,
`shade()`, `alpha()`, `mix()`.
GTK now implements equivalent functionality from the CSS specs.
### \@define-color is going away
### `@define-color` is going away
\@define-color should be replaced by custom properties in the :root scope.
`@define-color` should be replaced by custom properties in the `:root` scope.
Instead of
@@ -117,9 +117,9 @@ spec.
### Color expressions are going away
The color functions can all be replaced by combinations of calc() and color-mix().
The color functions can all be replaced by combinations of `calc()` and `color-mix()`.
ligher(c) and darker(c) are just shade(c, 1.3) or shade(c, 0.7), respectively, and
`lighter(c)` and `darker(c)` are just `shade(c, 1.3)` or `shade(c, 0.7)`, respectively, and
thus can be handled the same way as shade in the examples below.
Replace
@@ -164,7 +164,7 @@ d {
Variations of these replacements are possible.
Note that GTK has historically computed mix() and shade() values in the SRGB and HSL
Note that GTK has historically computed `mix()` and `shade()` values in the SRGB and HSL
colorspaces, but using OKLAB instead might yield slightly better results.
For more information about color-mix(), see the
@@ -172,32 +172,32 @@ For more information about color-mix(), see the
## Chooser interfaces are going away
The GtkColorChooser, GtkFontChooser, GtkFileChooser and GtkAppChooser
The `GtkColorChooser`, `GtkFontChooser`, `GtkFileChooser` and `GtkAppChooser`
interfaces and their implementations as dialogs, buttons and widgets
are phased out. The are being replaced by a new family of async APIs
that will be more convenient to use from language bindings, in particular
for languages that have concepts like promises. The new APIs are
[class@Gtk.ColorDialog], [class@Gtk.FontDialog] and [class@Gtk.FileDialog],
There are also equivalents for some of the 'button' widgets:
There are also equivalents for some of the button widgets:
[class@Gtk.ColorDialogButton], [class@Gtk.FontDialogButton].
## GtkMessageDialog is going away
Like the Chooser interfaces, GtkMessageDialog has been replaced by
Like the Chooser interfaces, `GtkMessageDialog` has been replaced by
a new async API that will be more convenient, in particular for
language binding. The new API is [class@Gtk.AlertDialog].
## GtkDialog is going away
After gtk_dialog_run() was removed, the usefulness of GtkDialog
is much reduced, and it has awkward, archaice APIs. Therefore,
After `gtk_dialog_run()` was removed, the usefulness of `GtkDialog`
is much reduced, and it has awkward, archaic APIs. Therefore,
it is dropped. The recommended replacement is to just create
your own window and add buttons as required, either in the header
or elsewhere.
## GtkInfoBar is going away
GtkInfoBar had a dialog API, and with dialogs going away, it was time to
`GtkInfoBar` had a dialog API, and with dialogs going away, it was time to
retire it. If you need such a widget, it is relatively trivial to create one
using a [class@Gtk.Revealer] with labels and buttons.
@@ -205,11 +205,11 @@ Other libraries, such as libadwaita, may provide replacements as well.
## gtk_show_uri is being replaced
Instead of gtk_show_uri(), you should use GtkUriLauncher or GtkFileLauncher.
Instead of `gtk_show_uri()`, you should use [class@Gtk.UriLauncher]or [class@Gtk.FileLauncher].
## GtkStatusbar is going away
This is an oldfashioned widget that does not do all that much anymore, since
This is an old fashioned widget that does not do all that much any more, since
it no longer has a resize handle for the window.
## GtkLockButton and GtkVolumeButton are going away
@@ -217,22 +217,22 @@ it no longer has a resize handle for the window.
These are very specialized widgets that should better live with the application
where they are used.
## Widget size api changes
## Widget size API changes
The functions gtk_widget_get_allocated_width() and gtk_widget_get_allocated_height()
The functions `gtk_widget_get_allocated_width()` and `gtk_widget_get_allocated_height()`
are going away. In most cases, [method@Gtk.Widget.get_width] and [method@Gtk.Widget.get_height]
are suitable replacements. Note that the semantics are slightly different though:
the old functions return the size of the CSS border area, while the new functions return
the size of the widgets content area. In places where this difference matters, you can
use `gtk_widget_compute_bounds (widget, widget, &bounds)` instead.
The function gtk_widget_get_allocation() is also going away. It does not have a direct
The function `gtk_widget_get_allocation()` is also going away. It does not have a direct
replacement, but the previously mentioned alternatives can be used for it too.
The function gtk_widget_get_allocated_baseline() has been renamed to [method@Gtk.Widget.get_baseline].
The function `gtk_widget_get_allocated_baseline()` has been renamed to [method@Gtk.Widget.get_baseline].
## Stop using GdkPixbuf
GTK is moving away from GdkPixbuf as the primary API for transporting image data, in favor
of GdkTexture. APIs that are accepting or returning GdkPixbufs are being replaced by equivalent
APIs using GdkTexture or GdkPaintable objects.
GTK is moving away from `GdkPixbuf` as the primary API for transporting image data, in favor
of [class@Gdk.Texture]. APIs that are accepting or returning `GdkPixbuf`s are being replaced by equivalent
APIs using `GdkTexture` or [iface@Gdk.Paintable] objects.
+61 -15
View File
@@ -6,7 +6,7 @@ The format is a text format that follows the [CSS syntax rules](https://drafts.c
The grammar of a node text representation using [the CSS value definition syntax](https://drafts.csswg.org/css-values-3/#value-defs) looks like this:
document: <@-rule>*<node>*
document: <@-rule>*<node>
@-rule: @cicp "name" { <property>* }
node: container [ "name" ] { <document> } | <node-type> [ "name" ] { <property>* } | "name"
property: <property-name>: <node> | <value> ;
@@ -49,12 +49,16 @@ The following properties can be set for custom color states:
| primaries | `<integer>` | 2 | always |
| transfer | `<integer>` | 2 | always |
| matrix | `<integer>` | 2 | always |
| range | `narrow | full` | full | non-default |
| range | `<range>` | full | non-default |
Note that the primaries, transfer and matrix properties always need
to be specified, since GTK does not allow creating color state objects
with these being set to 2 (== unspecified).
Range can have the following values:
range: narrow | full
# Colors
Colors can be specified with a variation of the modern CSS color syntax:
@@ -66,6 +70,16 @@ The traditional syntax for sRGB colors still works as well:
rgba(<number>, <number>, <number>, <number)
rgb(<number, <number>, <number>)
# Rectangles
Rectangles can be specified just as four integers for x, y, width and height:
rect: <number> <number> <number> <number>
Rounded rectangles use a CSS-like syntax:
rounded-rect: <rect> [ "/" <number>{1,4} [ "/" <number>{1,4} ] ]
# Nodes
### container
@@ -82,6 +96,13 @@ The **container** node is a special node that allows specifying a list of child
Creates a node like `gsk_blend_node_new()` with the given properties.
Possible values for the mode property are:
blend-mode: normal | multiply | screen | overlay | darken |
lighten | color-dodge | color-burn | hard-light |
soft-light | difference | exclusion | color |
hue | saturation | luminosity
### blur
| property | syntax | default | printed |
@@ -201,6 +222,10 @@ Creates a node like `gsk_fill_node_new()` with the given properties.
The default child node is the default color node, but created with the
bounds of the path.
Possible values for the fill-rule property are:
fill-rule: winding | even-odd
### glshader
| property | syntax | default | printed |
@@ -252,6 +277,10 @@ Creates a node like `gsk_linear_gradient_node_new()` with the given properties.
Creates a node like `gsk_mask_node_new()` with the given properties.
Possible values for the mode property are:
mask-mode: alpha | inverted-alpha | luminance | inverted-luminance
### opacity
| property | syntax | default | printed |
@@ -290,11 +319,11 @@ Creates a node like `gsk_radial_gradient_node_new()` with the given properties.
### repeat
| property | syntax | default | printed |
| ----------- | ---------------- | ---------------------- | ----------- |
| bounds | `<rect>` | *bounds of child node* | non-default |
| child | `<node>` | color { } | always |
| child-bounds| `<rect>` | *bounds of child node* | non-default |
| property | syntax | default | printed |
| ------------ | ---------- | ---------------------- | ----------- |
| bounds | `<rect>` | *bounds of child node* | non-default |
| child | `<node>` | color { } | always |
| child-bounds | `<rect>` | *bounds of child node* | non-default |
Creates a node like `gsk_repeat_node_new()` with the given properties.
@@ -361,6 +390,14 @@ Creates a node like `gsk_stroke_node_new()` with the given properties.
The default child node is the default color node, but created with the
stroke bounds of the path.
Possible values for the line-cap property are:
line-cap: butt | round | square
Possible values for the line-join property are:
line-join: miter | round | bevel
### text
| property | syntax | default | printed |
@@ -369,9 +406,9 @@ stroke bounds of the path.
| font | `<string>` `<url>`? | "Cantarell 15px" | always |
| glyphs | `<glyphs>` | "Hello" | always |
| offset | `<point>` | 0 0 | non-default |
| hint-style | `<hint style>` | slight | non-default |
| hint-style | `<hint-style>` | slight | non-default |
| antialias | `<antialias>` | gray | non-default |
| hint-metrics | `<hint metrics>` | off | non-default |
| hint-metrics | `<hint-metrics>` | off | non-default |
Creates a node like `gsk_text_node_new()` with the given properties.
@@ -386,9 +423,17 @@ be specified as well, like this: 40 10 0 0 color.
If the given font does not exist or the given glyphs are invalid for the given
font, an error node will be returned.
Possible values for hint-style are none, slight or full.
Possible value for antialias are none or gray.
Possible value for hint-metrics are on or off.
Possible values for the hint-style property are:
hint-style: none | slight | full
Possible value for the antialias property are:
antialias: none | gray
Possible value for hint-metrics are:
hint-metrics: on | off
### texture
@@ -414,14 +459,15 @@ representation for this texture is `url("data:image/png;base64,iVBORw0KGgoAAAANS
| -------- | ---------------- | ---------------------- | ----------- |
| bounds | `<rect>` | 50 | always |
| texture | `<url>` | *see below* | always |
| filter | `filter` | *see below* | non-default |
| filter | `filter` | linear | non-default |
Creates a node like `gsk_texture_scale_node_new()` with the given properties.
The default texture is a 10x10 checkerboard, just like for texture.
The possible filter values are `linear`, `nearest` and `trilinear`, with
`linear` being the default.
Possible values for the filter property are:
filter: linear | nearest | trilinear
### transform
+68 -49
View File
@@ -19,8 +19,7 @@ be used for end-user configuration and customization.
### `GTK_DEBUG`
This variable can be set to a list of debug options, which cause GTK to
print out different types of debugging information. Some of these options
are only available when GTK has been configured with `-Ddebug=true`.
print out different types of debugging information.
`actions`
: Actions and menu models
@@ -65,7 +64,7 @@ are only available when GTK has been configured with `-Ddebug=true`.
: Layout managers
`accessibility`
: Accessibility state changs
: Accessibility state changes
A number of keys are influencing behavior instead of just logging:
@@ -169,8 +168,7 @@ The `loaders.cache` file is generated by the
### `GDK_DEBUG`
This variable can be set to a list of debug options, which cause GDK to
print out different types of debugging information. Some of these options
are only available when GTK has been configured with `-Ddebug=true`.
print out different types of debugging information.
`misc`
: Miscellaneous information
@@ -223,36 +221,15 @@ A number of options affect behavior instead of logging:
: Force graphics offload for all textures, even when slower. This allows
to debug offloading in the absence of dmabufs.
`gl-disable`
: Disable OpenGL support
`gl-no-fractional`
: Disable fractional scaling for OpenGL.
`gl-debug`
: Insert debugging information in OpenGL
`gl-disable-gl`
: Don't allow the use of OpenGL GL API. This forces GLES to be used
`gl-disable-gles`
: Don't allow the use of OpenGL GLES API. This forces GL to be used
`gl-prefer-gl`
: Prefer OpenGL over OpenGL ES. This was the default behavior before GTK 4.14.
`gl-egl`
: Use an EGL context on X11 or Windows
`gl-glx`
: Use GLX on X11
`gl-wgl`
: Use WGL on Windows
`vulkan-disable`
: Disable Vulkan support
`vulkan-validate`
: Load the Vulkan validation layer, if available
@@ -262,27 +239,26 @@ A number of options affect behavior instead of logging:
`high-depth`
: Use high bit depth rendering if possible
`linear`
: Enable linear rendering
`hdr`
: Force HDR rendering
`no-vsync`
: Repaint instantly (uses 100% CPU with animations)
`dmabuf-disable`
: Disable dmabuf support
The special value `all` can be used to turn on all debug options. The special
value `help` can be used to obtain a list of all supported debug options.
### `GSK_DEBUG`
This variable can be set to a list of debug options, which cause GSK to
print out different types of debugging information. Some of these options
are only available when GTK has been configured with `-Ddebug=true`.
print out different types of debugging information.
`renderer`
: General renderer information
`opengl`
: OpenGL renderer information
`vulkan`
: Check Vulkan errors
@@ -309,12 +285,12 @@ A number of options affect behavior instead of logging:
`staging`
: Use a staging image for texture upload (Vulkan only)
`offload-disable`
: Disable graphics offload to subsurfaces
`cairo`
: Overlay error pattern over cairo drawing (finds fallbacks)
`occlusion`
: Overlay highlight over areas optimized via occlusion culling
The special value `all` can be used to turn on all debug options. The special
value `help` can be used to obtain a list of all supported debug options.
@@ -347,6 +323,41 @@ a `*`, which means: try all remaining backends. The special value
backends. For more information about selecting backends,
see the [func@Gdk.DisplayManager.get] function.
### `GDK_DISABLE`
This variable can be set to a list of values, which cause GDK to
disable certain features.
`gl`
: Disable OpenGL support
`gl-api`
: Don't allow the use of OpenGL GL API. This forces GLES to be used
`gles-api`
: Don't allow the use of OpenGL GLES API. This forces GL to be used
`egl`
: Don't allow the use of an EGL context
`glx`
: Don't allow the use of GLX
`wgl`
: Don't allow the use of WGL
`vulkan`
: Disable Vulkan support
`dmabuf`
: Disable dmabuf support
`offload`
: Disable graphics offload to subsurfaces
`color-mgmt`
: Disable color management
### `GDK_GL_DISABLE`
This variable can be set to a list of values, which cause GDK to
@@ -389,15 +400,6 @@ does not support them.
`ycbr`
: Do not support Ycbcr textures
`descriptor-indexing`
: Force slow descriptor set layout codepath
`dynamic-indexing`
: Hardcode small number of buffer and texture arrays
`nonuniform-indexing`
: Split draw calls to ensure uniform texture accesses
`semaphore-export`
: Disable sync of exported dmabufs
@@ -407,6 +409,9 @@ does not support them.
`incremental-present`
: Do not send damage regions
`swapchain-maintenance`
: Do not use advanced swapchain features
The special value `all` can be used to turn on all values. The special
value `help` can be used to obtain a list of all supported values.
@@ -461,12 +466,12 @@ using and the GDK backend supports them:
This variable can be set to a list of values, which cause GSK to
disable certain optimizations of the "ngl" and "vulkan" renderer.
`uber`
: Don't use the uber shader
`clear`
: Use shaders instead of vkCmdClearAttachment()/glClear()
`merge`
: USe one vkCmdDraw()/glDrawArrays() per operation
`blit`
: Use shaders instead of vkCmdBlit()/glBlitFramebuffer()
@@ -476,6 +481,13 @@ disable certain optimizations of the "ngl" and "vulkan" renderer.
`mipmap`
: Avoid creating mipmaps
`to-image`
: Don't fast-path creation of images for nodes
`occlusion`
: Disable occlusion culling via opacity tracking
The special value `all` can be used to turn on all values. The special
value `help` can be used to obtain a list of all supported values.
@@ -563,6 +575,12 @@ To enable the GTK inspector, you can use the <kbd>Control</kbd>+<kbd>Shift</kbd>
<kbd>Control</kbd>+<kbd>Shift</kbd>+<kbd>D</kbd> keyboard shortcuts, or
set the `GTK_DEBUG=interactive` environment variable.
After opening the inspector, it listens for a few keyboard shortcuts that
let you use its frame and event recording functionality without moving the
focus away from the application window: <kbd>Super</kbd>+<kbd>R</kbd> turns
the recording on and off, and <kbd>Super</kbd>+<kbd>C</kbd> records a single
frame.
There are a few more environment variables that can be set to influence
how the inspector renders its UI. `GTK_INSPECTOR_DISPLAY` and
`GTK_INSPECTOR_RENDERER` determine the GDK display and the GSK
@@ -573,6 +591,7 @@ the GTK inspector. The keyboard shortcuts can be disabled with the
`enable-inspector-keybinding` key in the `org.gtk.Settings.Debug`
GSettings schema.
## Profiling
GTK supports profiling with sysprof. It exports timing information
+2 -2
View File
@@ -171,7 +171,7 @@ Each relation name is part of the `GtkAccessibleRelation` enumeration.
| %GTK_ACCESSIBLE_RELATION_CONTROLS | “aria-controls” | a list of `GtkAccessible` |
| %GTK_ACCESSIBLE_RELATION_DESCRIBED_BY | “aria-describedby” | a list of `GtkAccessible` |
| %GTK_ACCESSIBLE_RELATION_DETAILS | “aria-details” | a list of `GtkAccessible` |
| %GTK_ACCESSIBLE_RELATION_ERROR_MESSAGE | “aria-errormessage” | `GtkAccessible` |
| %GTK_ACCESSIBLE_RELATION_ERROR_MESSAGE | “aria-errormessage” | a list of `GtkAccessible` |
| %GTK_ACCESSIBLE_RELATION_FLOW_TO | “aria-flowto” | a list of `GtkAccessible` |
| %GTK_ACCESSIBLE_RELATION_LABELLED_BY | “aria-labelledby” | a list of `GtkAccessible` |
| %GTK_ACCESSIBLE_RELATION_OWNS | “aria-owns” | a list of `GtkAccessible` |
@@ -300,7 +300,7 @@ The attributes can also enhance the UI:
```c
gtk_button_set_label (GTK_BUTTON (button), "Download");
gtk_box_append (GTK_BOX (button), button);
gtk_box_append (GTK_BOX (box), button);
gtk_label_set_text (GTK_LABEL (label), "Final report.pdf");
gtk_box_append (GTK_BOX (box), label);
+1
View File
@@ -9,6 +9,7 @@ documentation in the form of man pages.
- [gtk4-demo-application](gtk4-demo-application.html)
- [gtk4-encode-symbolic-svg](gtk4-encode-symbolic-svg.html)
- [gtk4-icon-browser](gtk4-icon-browser.html)
- [gtk4-image-tool](gtk4-image-tool.html)
- [gtk4-launch](gtk4-launch.html)
- [gtk4-node-editor](gtk4-node-editor.html)
- [gtk4-path-tool](gtk4-path-tool.html)
+178 -52
View File
@@ -49,6 +49,135 @@
G_DEFINE_TYPE (GdkBroadwaySurface, gdk_broadway_surface, GDK_TYPE_SURFACE)
static void
gdk_broadway_surface_toplevel_resize (GdkSurface *surface,
int width,
int height);
static void
gdk_broadway_surface_set_geometry_hints (GdkSurface *surface,
const GdkGeometry *geometry,
GdkSurfaceHints geom_mask);
static void
gdk_broadway_surface_move_resize_internal (GdkSurface *surface,
gboolean with_move,
int x,
int y,
int width,
int height);
static void
compute_toplevel_size (GdkSurface *surface,
gboolean resizible,
int *width,
int *height)
{
GdkBroadwaySurface *impl = GDK_BROADWAY_SURFACE (surface);
GdkDisplay *display = gdk_surface_get_display (surface);
GdkMonitor *monitor;
GdkToplevelSize size;
int bounds_width, bounds_height;
GdkGeometry geometry;
GdkSurfaceHints mask;
monitor = gdk_display_get_monitor_at_surface (display, surface);
if (monitor)
{
GdkRectangle monitor_geometry;
gdk_monitor_get_geometry (monitor, &monitor_geometry);
bounds_width = monitor_geometry.width;
bounds_height = monitor_geometry.height;
}
else
{
bounds_width = G_MAXINT;
bounds_height = G_MAXINT;
}
gdk_toplevel_size_init (&size, bounds_width, bounds_height);
gdk_toplevel_notify_compute_size (GDK_TOPLEVEL (surface), &size);
g_warn_if_fail (size.width > 0);
g_warn_if_fail (size.height > 0);
*width = size.width;
*height = size.height;
impl->resizible = (impl->resizible && resizible);
if (impl->resizible)
{
geometry.min_width = size.min_width;
geometry.min_height = size.min_height;
mask = GDK_HINT_MIN_SIZE;
}
else
{
geometry.max_width = geometry.min_width = size.width;
geometry.max_height = geometry.min_height = size.height;
mask = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE;
}
gdk_broadway_surface_set_geometry_hints (surface, &geometry, mask);
if (!(surface->state & (GDK_TOPLEVEL_STATE_FULLSCREEN |
GDK_TOPLEVEL_STATE_MAXIMIZED |
GDK_TOPLEVEL_STATE_TILED |
GDK_TOPLEVEL_STATE_TOP_TILED |
GDK_TOPLEVEL_STATE_RIGHT_TILED |
GDK_TOPLEVEL_STATE_BOTTOM_TILED |
GDK_TOPLEVEL_STATE_LEFT_TILED |
GDK_TOPLEVEL_STATE_MINIMIZED)))
{
gdk_surface_constrain_size (&geometry, mask,
size.width, size.height,
&size.width, &size.height);
if (impl->last_computed_width != size.width ||
impl->last_computed_height != size.height)
{
*width = size.width;
*height = size.height;
impl->last_computed_width = size.width;
impl->last_computed_height = size.height;
gdk_broadway_surface_toplevel_resize (surface, *width, *height);
}
}
if (size.shadow.is_valid)
{
impl->shadow_left = size.shadow.left;
impl->shadow_right = size.shadow.right;
impl->shadow_top = size.shadow.top;
impl->shadow_bottom = size.shadow.bottom;
}
}
static gboolean
compute_size_idle (gpointer user_data)
{
GdkSurface *surface = user_data;
GdkBroadwaySurface *impl = GDK_BROADWAY_SURFACE (surface);
int width, height;
impl->compute_size_source_id = 0;
compute_toplevel_size (surface, TRUE, &width, &height);
return G_SOURCE_REMOVE;
}
static void
on_frame_clock_after_update (GdkFrameClock *clock,
GdkSurface *surface)
{
GdkBroadwaySurface *impl = GDK_BROADWAY_SURFACE (surface);
if (impl->compute_size_source_id)
{
g_clear_handle_id (&impl->compute_size_source_id, g_source_remove);
compute_size_idle (surface);
}
}
/* We need to flush in an idle rather than AFTER_PAINT, as the clock
is frozen during e.g. surface resizes so the paint will not happen
and the surface resize request is never flushed. */
@@ -112,6 +241,8 @@ connect_frame_clock (GdkSurface *surface)
g_signal_connect (frame_clock, "before-paint",
G_CALLBACK (on_frame_clock_before_paint), surface);
g_signal_connect_after (frame_clock, "update",
G_CALLBACK (on_frame_clock_after_update), surface);
g_signal_connect (frame_clock, "after-paint",
G_CALLBACK (on_frame_clock_after_paint), surface);
}
@@ -123,6 +254,8 @@ disconnect_frame_clock (GdkSurface *surface)
g_signal_handlers_disconnect_by_func (frame_clock,
on_frame_clock_before_paint, surface);
g_signal_handlers_disconnect_by_func (frame_clock,
on_frame_clock_after_update, surface);
g_signal_handlers_disconnect_by_func (frame_clock,
on_frame_clock_after_paint, surface);
}
@@ -137,6 +270,7 @@ gdk_broadway_surface_constructed (GObject *object)
if (!surface->parent)
broadway_display->toplevels = g_list_prepend (broadway_display->toplevels, self);
self->resizible = TRUE;
self->id = _gdk_broadway_server_new_surface (broadway_display->server,
self->root_x,
self->root_y,
@@ -316,6 +450,7 @@ gdk_broadway_surface_hide (GdkSurface *surface)
_gdk_broadway_surface_grab_check_unmap (surface,
_gdk_broadway_server_get_next_serial (broadway_display->server));
g_clear_handle_id (&impl->compute_size_source_id, g_source_remove);
if (_gdk_broadway_server_surface_hide (broadway_display->server, impl->id))
queue_flush (surface);
@@ -1009,6 +1144,8 @@ _gdk_broadway_moveresize_configure_done (GdkDisplay *display,
BroadwayInputMsg *tmp_event;
MoveResizeData *mv_resize = get_move_resize_data (display, FALSE);
gdk_surface_request_layout (surface);
if (!mv_resize || surface != mv_resize->moveresize_surface)
return FALSE;
@@ -1168,6 +1305,43 @@ gdk_broadway_surface_beep (GdkSurface *surface)
return FALSE;
}
static void
gdk_broadway_surface_request_layout (GdkSurface *surface)
{
GdkBroadwaySurface *impl = GDK_BROADWAY_SURFACE (surface);
if (!impl->compute_size_source_id &&
GDK_IS_TOPLEVEL (surface))
{
impl->compute_size_source_id = g_idle_add_full (G_PRIORITY_HIGH - 10,
compute_size_idle,
surface,
NULL);
}
}
static gboolean
gdk_broadway_surface_compute_size (GdkSurface *surface)
{
int width, height;
if (GDK_IS_TOPLEVEL (surface))
{
compute_toplevel_size (surface, TRUE, &width, &height);
}
else
{
width = gdk_surface_get_width(surface);
height = gdk_surface_get_height(surface);
gdk_broadway_surface_move_resize_internal (surface, FALSE,
0, 0,
width,
height);
}
return FALSE;
}
static void
gdk_broadway_surface_class_init (GdkBroadwaySurfaceClass *klass)
{
@@ -1187,6 +1361,8 @@ gdk_broadway_surface_class_init (GdkBroadwaySurfaceClass *klass)
impl_class->destroy_notify = gdk_broadway_surface_destroy_notify;
impl_class->drag_begin = _gdk_broadway_surface_drag_begin;
impl_class->get_scale = gdk_broadway_surface_get_scale;
impl_class->request_layout = gdk_broadway_surface_request_layout;
impl_class->compute_size = gdk_broadway_surface_compute_size;
}
#define LAST_PROP 1
@@ -1504,55 +1680,12 @@ gdk_broadway_toplevel_present (GdkToplevel *toplevel,
GdkToplevelLayout *layout)
{
GdkSurface *surface = GDK_SURFACE (toplevel);
GdkBroadwaySurface *impl = GDK_BROADWAY_SURFACE (surface);
GdkDisplay *display = gdk_surface_get_display (surface);
GdkMonitor *monitor;
GdkToplevelSize size;
int bounds_width, bounds_height;
int width, height;
GdkGeometry geometry;
GdkSurfaceHints mask;
gboolean maximize;
gdk_broadway_surface_unminimize (surface);
monitor = gdk_display_get_monitor_at_surface (display, surface);
if (monitor)
{
GdkRectangle monitor_geometry;
gdk_monitor_get_geometry (monitor, &monitor_geometry);
bounds_width = monitor_geometry.width;
bounds_height = monitor_geometry.height;
}
else
{
bounds_width = G_MAXINT;
bounds_height = G_MAXINT;
}
gdk_toplevel_size_init (&size, bounds_width, bounds_height);
gdk_toplevel_notify_compute_size (toplevel, &size);
g_warn_if_fail (size.width > 0);
g_warn_if_fail (size.height > 0);
width = size.width;
height = size.height;
if (gdk_toplevel_layout_get_resizable (layout))
{
geometry.min_width = size.min_width;
geometry.min_height = size.min_height;
mask = GDK_HINT_MIN_SIZE;
}
else
{
geometry.max_width = geometry.min_width = width;
geometry.max_height = geometry.min_height = height;
mask = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE;
}
gdk_broadway_surface_set_geometry_hints (surface, &geometry, mask);
gdk_surface_constrain_size (&geometry, mask, width, height, &width, &height);
gdk_broadway_surface_toplevel_resize (surface, width, height);
compute_toplevel_size (surface, gdk_toplevel_layout_get_resizable (layout), &width, &height);
if (gdk_toplevel_layout_get_maximized (layout, &maximize))
{
@@ -1562,14 +1695,7 @@ gdk_broadway_toplevel_present (GdkToplevel *toplevel,
gdk_broadway_surface_unmaximize (surface);
}
if (size.shadow.is_valid)
{
impl->shadow_left = size.shadow.left;
impl->shadow_right = size.shadow.right;
impl->shadow_top = size.shadow.top;
impl->shadow_bottom = size.shadow.bottom;
}
gdk_surface_request_layout (surface);
show_surface (surface);
}
+7
View File
@@ -76,6 +76,13 @@ struct _GdkBroadwaySurface
int shadow_right;
int shadow_top;
int shadow_bottom;
int last_computed_width;
int last_computed_height;
guint compute_size_source_id;
gboolean resizible;
};
struct _GdkBroadwaySurfaceClass
+59 -59
View File
@@ -53,18 +53,18 @@ typedef struct {
const char **files;
int len;
int start;
} AddFileData;
} FileTransferAddFileData;
static void add_files (GDBusProxy *proxy,
AddFileData *afd);
static void file_transfer_add_files (GDBusProxy *proxy,
FileTransferAddFileData *afd);
static void
add_files_done (GObject *object,
GAsyncResult *result,
gpointer data)
file_transfer_add_files_done (GObject *object,
GAsyncResult *result,
gpointer data)
{
GDBusProxy *proxy = G_DBUS_PROXY (object);
AddFileData *afd = data;
FileTransferAddFileData *afd = data;
GError *error = NULL;
GVariant *ret;
@@ -87,15 +87,15 @@ add_files_done (GObject *object,
return;
}
add_files (proxy, afd);
file_transfer_add_files (proxy, afd);
}
/* We call AddFiles in chunks of 16 to avoid running into
* the per-message fd limit of the bus.
*/
static void
add_files (GDBusProxy *proxy,
AddFileData *afd)
file_transfer_add_files (GDBusProxy *proxy,
FileTransferAddFileData *afd)
{
GUnixFDList *fd_list;
GVariantBuilder fds, options;
@@ -154,18 +154,18 @@ add_files (GDBusProxy *proxy,
0, -1,
fd_list,
NULL,
add_files_done, afd);
file_transfer_add_files_done, afd);
g_object_unref (fd_list);
}
static void
start_session_done (GObject *object,
GAsyncResult *result,
gpointer data)
file_transfer_start_session_done (GObject *object,
GAsyncResult *result,
gpointer data)
{
GDBusProxy *proxy = G_DBUS_PROXY (object);
AddFileData *afd = data;
FileTransferAddFileData *afd = data;
GError *error = NULL;
GVariant *ret;
const char *key;
@@ -185,7 +185,7 @@ start_session_done (GObject *object,
g_variant_unref (ret);
add_files (proxy, afd);
file_transfer_add_files (proxy, afd);
}
void
@@ -195,7 +195,7 @@ file_transfer_portal_register_files (const char **files,
gpointer data)
{
GTask *task;
AddFileData *afd;
FileTransferAddFileData *afd;
GVariantBuilder options;
task = g_task_new (NULL, NULL, callback, data);
@@ -208,7 +208,7 @@ file_transfer_portal_register_files (const char **files,
return;
}
afd = g_new (AddFileData, 1);
afd = g_new (FileTransferAddFileData, 1);
afd->task = task;
afd->files = files;
afd->len = g_strv_length ((char **)files);
@@ -222,7 +222,7 @@ file_transfer_portal_register_files (const char **files,
g_dbus_proxy_call (file_transfer_proxy, "StartTransfer",
g_variant_new ("(a{sv})", &options),
0, -1, NULL, start_session_done, afd);
0, -1, NULL, file_transfer_start_session_done, afd);
}
gboolean
@@ -240,9 +240,9 @@ file_transfer_portal_register_files_finish (GAsyncResult *result,
}
static void
retrieve_files_done (GObject *object,
GAsyncResult *result,
gpointer data)
file_transfer_retrieve_files_done (GObject *object,
GAsyncResult *result,
gpointer data)
{
GDBusProxy *proxy = G_DBUS_PROXY (object);
GTask *task = data;
@@ -260,7 +260,7 @@ retrieve_files_done (GObject *object,
g_variant_get (ret, "(^a&s)", &files);
g_object_set_data_full (G_OBJECT (task), "files", g_strdupv (files), (GDestroyNotify)g_strfreev);
g_object_set_data_full (G_OBJECT (task), "files", g_strdupv (files), (GDestroyNotify) g_strfreev);
g_variant_unref (ret);
@@ -290,7 +290,7 @@ file_transfer_portal_retrieve_files (const char *key,
"RetrieveFiles",
g_variant_new ("(sa{sv})", key, &options),
0, -1, NULL,
retrieve_files_done, task);
file_transfer_retrieve_files_done, task);
}
gboolean
@@ -311,9 +311,9 @@ file_transfer_portal_retrieve_files_finish (GAsyncResult *result,
/* serializer */
static void
file_serializer_finish (GObject *source,
GAsyncResult *result,
gpointer serializer)
gdk_content_serializer_file_portal_finish (GObject *source,
GAsyncResult *result,
gpointer serializer)
{
GOutputStream *stream = G_OUTPUT_STREAM (source);
GError *error = NULL;
@@ -325,9 +325,9 @@ file_serializer_finish (GObject *source,
}
static void
portal_ready (GObject *object,
GAsyncResult *result,
gpointer serializer)
file_transfer_portal_ready (GObject *object,
GAsyncResult *result,
gpointer serializer)
{
GError *error = NULL;
char *key;
@@ -343,13 +343,13 @@ portal_ready (GObject *object,
strlen (key) + 1,
gdk_content_serializer_get_priority (serializer),
gdk_content_serializer_get_cancellable (serializer),
file_serializer_finish,
gdk_content_serializer_file_portal_finish,
serializer);
gdk_content_serializer_set_task_data (serializer, key, g_free);
}
static void
portal_file_serializer (GdkContentSerializer *serializer)
file_transfer_portal_serializer (GdkContentSerializer *serializer)
{
GPtrArray *files;
const GValue *value;
@@ -403,16 +403,16 @@ portal_file_serializer (GdkContentSerializer *serializer)
}
/* this call doesn't copy the strings, so keep the array around until the registration is done */
file_transfer_portal_register_files ((const char **)files->pdata, TRUE, portal_ready, serializer);
gdk_content_serializer_set_task_data (serializer, files, (GDestroyNotify)g_ptr_array_unref);
file_transfer_portal_register_files ((const char **)files->pdata, TRUE, file_transfer_portal_ready, serializer);
gdk_content_serializer_set_task_data (serializer, files, (GDestroyNotify) g_ptr_array_unref);
}
/* deserializer */
static void
portal_finish (GObject *object,
GAsyncResult *result,
gpointer deserializer)
file_transfer_portal_finish (GObject *object,
GAsyncResult *result,
gpointer deserializer)
{
char **files = NULL;
GError *error = NULL;
@@ -452,9 +452,9 @@ portal_finish (GObject *object,
}
static void
portal_file_deserializer_finish (GObject *source,
GAsyncResult *result,
gpointer deserializer)
file_transfer_portal_deserializer_finish (GObject *source,
GAsyncResult *result,
gpointer deserializer)
{
GOutputStream *stream = G_OUTPUT_STREAM (source);
GError *error = NULL;
@@ -487,12 +487,12 @@ portal_file_deserializer_finish (GObject *source,
return;
}
file_transfer_portal_retrieve_files (key, portal_finish, deserializer);
file_transfer_portal_retrieve_files (key, file_transfer_portal_finish, deserializer);
gdk_content_deserializer_set_task_data (deserializer, key, g_free);
}
static void
portal_file_deserializer (GdkContentDeserializer *deserializer)
file_transfer_portal_deserializer (GdkContentDeserializer *deserializer)
{
GOutputStream *output;
@@ -503,43 +503,43 @@ portal_file_deserializer (GdkContentDeserializer *deserializer)
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
gdk_content_deserializer_get_priority (deserializer),
gdk_content_deserializer_get_cancellable (deserializer),
portal_file_deserializer_finish,
file_transfer_portal_deserializer_finish,
deserializer);
g_object_unref (output);
}
static void
connection_closed (GDBusConnection *connection,
gboolean remote_peer_vanished,
GError *error)
file_transfer_portal_connection_closed (GDBusConnection *connection,
gboolean remote_peer_vanished,
GError *error)
{
g_clear_object (&file_transfer_proxy);
}
static void
finish_registration (void)
file_transfer_portal_finish_registration (void)
{
gdk_content_register_serializer (G_TYPE_FILE,
"application/vnd.portal.filetransfer",
portal_file_serializer,
file_transfer_portal_serializer,
NULL,
NULL);
gdk_content_register_serializer (GDK_TYPE_FILE_LIST,
"application/vnd.portal.filetransfer",
portal_file_serializer,
file_transfer_portal_serializer,
NULL,
NULL);
gdk_content_register_deserializer ("application/vnd.portal.filetransfer",
GDK_TYPE_FILE_LIST,
portal_file_deserializer,
file_transfer_portal_deserializer,
NULL,
NULL);
gdk_content_register_deserializer ("application/vnd.portal.filetransfer",
G_TYPE_FILE,
portal_file_deserializer,
file_transfer_portal_deserializer,
NULL,
NULL);
@@ -549,35 +549,35 @@ finish_registration (void)
*/
gdk_content_register_serializer (G_TYPE_FILE,
"application/vnd.portal.files",
portal_file_serializer,
file_transfer_portal_serializer,
NULL,
NULL);
gdk_content_register_serializer (GDK_TYPE_FILE_LIST,
"application/vnd.portal.files",
portal_file_serializer,
file_transfer_portal_serializer,
NULL,
NULL);
gdk_content_register_deserializer ("application/vnd.portal.files",
GDK_TYPE_FILE_LIST,
portal_file_deserializer,
file_transfer_portal_deserializer,
NULL,
NULL);
gdk_content_register_deserializer ("application/vnd.portal.files",
G_TYPE_FILE,
portal_file_deserializer,
file_transfer_portal_deserializer,
NULL,
NULL);
/* Free the singleton when the connection closes, important for test */
g_signal_connect (g_dbus_proxy_get_connection (G_DBUS_PROXY (file_transfer_proxy)),
"closed", G_CALLBACK (connection_closed), NULL);
"closed", G_CALLBACK (file_transfer_portal_connection_closed), NULL);
}
static gboolean
proxy_has_owner (GDBusProxy *proxy)
file_transfer_portal_proxy_has_owner (GDBusProxy *proxy)
{
char *owner;
@@ -611,11 +611,11 @@ file_transfer_portal_register (void)
NULL,
NULL);
if (file_transfer_proxy && !proxy_has_owner (file_transfer_proxy))
if (file_transfer_proxy && !file_transfer_portal_proxy_has_owner (file_transfer_proxy))
g_clear_object (&file_transfer_proxy);
if (file_transfer_proxy)
finish_registration ();
file_transfer_portal_finish_registration ();
}
}
+37 -17
View File
@@ -133,22 +133,35 @@ static const GdkDebugKey gdk_debug_keys[] = {
{ "portals", GDK_DEBUG_PORTALS, "Force use of portals" },
{ "no-portals", GDK_DEBUG_NO_PORTALS, "Disable use of portals" },
{ "force-offload", GDK_DEBUG_FORCE_OFFLOAD, "Force graphics offload for all textures" },
{ "gl-disable", GDK_DEBUG_GL_DISABLE, "Disable OpenGL support" },
{ "gl-no-fractional", GDK_DEBUG_GL_NO_FRACTIONAL, "Disable fractional scaling for OpenGL" },
{ "gl-debug", GDK_DEBUG_GL_DEBUG, "Insert debugging information in OpenGL" },
{ "gl-disable-gl", GDK_DEBUG_GL_DISABLE_GL, "Only allow OpenGL GLES API" },
{ "gl-disable-gles", GDK_DEBUG_GL_DISABLE_GLES, "Don't allow OpenGL GLES API" },
{ "gl-prefer-gl", GDK_DEBUG_GL_PREFER_GL, "Prefer GL over GLES API" },
{ "gl-egl", GDK_DEBUG_GL_EGL, "Use EGL on X11 or Windows" },
{ "gl-glx", GDK_DEBUG_GL_GLX, "Use GLX on X11" },
{ "gl-wgl", GDK_DEBUG_GL_WGL, "Use WGL on Windows" },
{ "vulkan-disable", GDK_DEBUG_VULKAN_DISABLE, "Disable Vulkan support" },
{ "default-settings",GDK_DEBUG_DEFAULT_SETTINGS, "Force default values for xsettings" },
{ "high-depth", GDK_DEBUG_HIGH_DEPTH, "Use high bit depth rendering if possible" },
{ "no-vsync", GDK_DEBUG_NO_VSYNC, "Repaint instantly (uses 100% CPU with animations)" },
{ "dmabuf-disable", GDK_DEBUG_DMABUF_DISABLE, "Disable dmabuf support" },
};
static const GdkDebugKey gdk_feature_keys[] = {
{ "gl", GDK_FEATURE_OPENGL, "Disable OpenGL support" },
{ "gl-api", GDK_FEATURE_GL_API, "Disable non-GLES GL API" },
{ "gles-api", GDK_FEATURE_GLES_API, "Disable GLES GL API" },
{ "egl", GDK_FEATURE_EGL, "Disable EGL" },
{ "glx", GDK_FEATURE_GLX, "Disable GLX" },
{ "wgl", GDK_FEATURE_WGL, "Disable WGL" },
{ "vulkan", GDK_FEATURE_VULKAN, "Disable Vulkan support" },
{ "dmabuf", GDK_FEATURE_DMABUF, "Disable dmabuf support" },
{ "offload", GDK_FEATURE_OFFLOAD, "Disable graphics offload" },
{ "color-mgmt", GDK_FEATURE_COLOR_MANAGEMENT, "Disable color management" },
};
static GdkFeatures gdk_features;
gboolean
gdk_has_feature (GdkFeatures features)
{
return (features & gdk_features) == features;
}
#ifdef G_HAS_CONSTRUCTORS
#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA
@@ -216,6 +229,7 @@ gdk_ensure_resources (void)
guint
gdk_parse_debug_var (const char *variable,
const char *docs,
const GdkDebugKey *keys,
guint nkeys)
{
@@ -276,6 +290,7 @@ gdk_parse_debug_var (const char *variable,
max_width = MAX (max_width, strlen (keys[i].key));
max_width += 4;
fprintf (stderr, "%s\n", docs);
fprintf (stderr, "Supported %s values:\n", variable);
for (i = 0; i < nkeys; i++) {
fprintf (stderr, " %s%*s%s\n", keys[i].key, (int)(max_width - strlen (keys[i].key)), " ", keys[i].help);
@@ -303,21 +318,26 @@ gdk_parse_debug_var (const char *variable,
void
gdk_pre_parse (void)
{
GdkFeatures disabled_features;
gdk_initialized = TRUE;
gdk_ensure_resources ();
_gdk_debug_flags = gdk_parse_debug_var ("GDK_DEBUG",
gdk_debug_keys,
G_N_ELEMENTS (gdk_debug_keys));
"GDK_DEBUG can be set to values that make GDK print out different\n"
"types of debugging information or change the behavior of GDK for\n"
"debugging purposes.\n",
gdk_debug_keys,
G_N_ELEMENTS (gdk_debug_keys));
/* These are global */
if (_gdk_debug_flags & GDK_DEBUG_GL_EGL)
gdk_gl_backend_use (GDK_GL_EGL);
else if (_gdk_debug_flags & GDK_DEBUG_GL_GLX)
gdk_gl_backend_use (GDK_GL_GLX);
else if (_gdk_debug_flags & GDK_DEBUG_GL_WGL)
gdk_gl_backend_use (GDK_GL_WGL);
disabled_features = gdk_parse_debug_var ("GDK_DISABLE",
"GDK_DISABLE can be set to values which cause GDK to disable\n"
"certain features.\n",
gdk_feature_keys,
G_N_ELEMENTS (gdk_feature_keys));
gdk_features = GDK_ALL_FEATURES & ~disabled_features;
#ifndef G_HAS_CONSTRUCTORS
stash_and_unset_environment ();
+10 -10
View File
@@ -49,21 +49,21 @@
* ```
*/
static void gdk_app_launch_context_finalize (GObject *object);
static void gdk_app_launch_context_finalize (GObject *object);
static char * gdk_app_launch_context_get_display_name (GAppLaunchContext *context,
GAppInfo *info,
GList *files);
static char * gdk_app_launch_context_get_startup_notify_id (GAppLaunchContext *context,
GAppInfo *info,
GList *files);
static void gdk_app_launch_context_launch_failed (GAppLaunchContext *context,
const char *startup_notify_id);
static void gdk_app_launch_context_launch_failed (GAppLaunchContext *context,
const char *startup_notify_id);
enum
{
PROP_0,
PROP_DISPLAY
GDK_APP_LAUNCH_CONTEXT_PROP_0,
GDK_APP_LAUNCH_CONTEXT_PROP_DISPLAY
};
G_DEFINE_TYPE (GdkAppLaunchContext, gdk_app_launch_context, G_TYPE_APP_LAUNCH_CONTEXT)
@@ -78,7 +78,7 @@ gdk_app_launch_context_get_property (GObject *object,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_APP_LAUNCH_CONTEXT_PROP_DISPLAY:
g_value_set_object (value, context->display);
break;
default:
@@ -96,7 +96,7 @@ gdk_app_launch_context_set_property (GObject *object,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_APP_LAUNCH_CONTEXT_PROP_DISPLAY:
context->display = g_value_dup_object (value);
break;
default:
@@ -120,11 +120,11 @@ gdk_app_launch_context_class_init (GdkAppLaunchContextClass *klass)
context_class->launch_failed = gdk_app_launch_context_launch_failed;
/**
* GdkAppLaunchContext:display: (attributes org.gtk.Property.get=gdk_app_launch_context_get_display)
* GdkAppLaunchContext:display:
*
* The display that the `GdkAppLaunchContext` is on.
*/
g_object_class_install_property (gobject_class, PROP_DISPLAY,
g_object_class_install_property (gobject_class, GDK_APP_LAUNCH_CONTEXT_PROP_DISPLAY,
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
@@ -169,7 +169,7 @@ gdk_app_launch_context_get_display_name (GAppLaunchContext *context,
}
/**
* gdk_app_launch_context_get_display: (attributes org.gtk.Method.get_property=display)
* gdk_app_launch_context_get_display:
* @context: a `GdkAppLaunchContext`
*
* Gets the `GdkDisplay` that @context is for.
+2
View File
@@ -82,8 +82,10 @@ gdk_cairo_context_cairo_create (GdkCairoContext *self)
draw_context = GDK_DRAW_CONTEXT (self);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
if (!gdk_draw_context_is_in_frame (draw_context))
return NULL;
G_GNUC_END_IGNORE_DEPRECATIONS
cr = GDK_CAIRO_CONTEXT_GET_CLASS (self)->cairo_create (self);
+23 -24
View File
@@ -65,15 +65,15 @@ G_DEFINE_TYPE (GdkCicpParams, gdk_cicp_params, G_TYPE_OBJECT)
enum
{
PROP_COLOR_PRIMARIES = 1,
PROP_TRANSFER_FUNCTION,
PROP_MATRIX_COEFFICIENTS,
PROP_RANGE,
GDK_CICP_PARAMS_PROP_COLOR_PRIMARIES = 1,
GDK_CICP_PARAMS_PROP_TRANSFER_FUNCTION,
GDK_CICP_PARAMS_PROP_MATRIX_COEFFICIENTS,
GDK_CICP_PARAMS_PROP_RANGE,
N_PROPERTIES,
GDK_CICP_PARAMS_N_PROPERTIES,
};
static GParamSpec *properties[N_PROPERTIES] = { NULL, };
static GParamSpec *gdk_cicp_params_properties[GDK_CICP_PARAMS_N_PROPERTIES] = { NULL, };
static void
gdk_cicp_params_init (GdkCicpParams *self)
@@ -94,19 +94,19 @@ gdk_cicp_params_get_property (GObject *object,
switch (property_id)
{
case PROP_COLOR_PRIMARIES:
case GDK_CICP_PARAMS_PROP_COLOR_PRIMARIES:
g_value_set_uint (value, self->cicp.color_primaries);
break;
case PROP_TRANSFER_FUNCTION:
case GDK_CICP_PARAMS_PROP_TRANSFER_FUNCTION:
g_value_set_uint (value, self->cicp.transfer_function);
break;
case PROP_MATRIX_COEFFICIENTS:
case GDK_CICP_PARAMS_PROP_MATRIX_COEFFICIENTS:
g_value_set_uint (value, self->cicp.matrix_coefficients);
break;
case PROP_RANGE:
case GDK_CICP_PARAMS_PROP_RANGE:
g_value_set_enum (value, self->cicp.range);
break;
@@ -126,19 +126,19 @@ gdk_cicp_params_set_property (GObject *object,
switch (property_id)
{
case PROP_COLOR_PRIMARIES:
case GDK_CICP_PARAMS_PROP_COLOR_PRIMARIES:
gdk_cicp_params_set_color_primaries (self, g_value_get_uint (value));
break;
case PROP_TRANSFER_FUNCTION:
case GDK_CICP_PARAMS_PROP_TRANSFER_FUNCTION:
gdk_cicp_params_set_transfer_function (self, g_value_get_uint (value));
break;
case PROP_MATRIX_COEFFICIENTS:
case GDK_CICP_PARAMS_PROP_MATRIX_COEFFICIENTS:
gdk_cicp_params_set_matrix_coefficients (self, g_value_get_uint (value));
break;
case PROP_RANGE:
case GDK_CICP_PARAMS_PROP_RANGE:
gdk_cicp_params_set_range (self, g_value_get_enum (value));
break;
@@ -168,12 +168,11 @@ gdk_cicp_params_class_init (GdkCicpParamsClass *klass)
* - 5: PAL
* - 6,7: BT.601 / NTSC
* - 9: BT.2020
* - 10: CIE XYZ
* - 12: Display P3
*
* Since: 4.16
*/
properties[PROP_COLOR_PRIMARIES] =
gdk_cicp_params_properties[GDK_CICP_PARAMS_PROP_COLOR_PRIMARIES] =
g_param_spec_uint ("color-primaries", NULL, NULL,
0, 255, 2,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -196,7 +195,7 @@ gdk_cicp_params_class_init (GdkCicpParamsClass *klass)
*
* Since: 4.16
*/
properties[PROP_TRANSFER_FUNCTION] =
gdk_cicp_params_properties[GDK_CICP_PARAMS_PROP_TRANSFER_FUNCTION] =
g_param_spec_uint ("transfer-function", NULL, NULL,
0, 255, 2,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -213,7 +212,7 @@ gdk_cicp_params_class_init (GdkCicpParamsClass *klass)
*
* Since: 4.16
*/
properties[PROP_MATRIX_COEFFICIENTS] =
gdk_cicp_params_properties[GDK_CICP_PARAMS_PROP_MATRIX_COEFFICIENTS] =
g_param_spec_uint ("matrix-coefficients", NULL, NULL,
0, 255, 2,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -227,13 +226,13 @@ gdk_cicp_params_class_init (GdkCicpParamsClass *klass)
*
* Since: 4.16
*/
properties[PROP_RANGE] =
gdk_cicp_params_properties[GDK_CICP_PARAMS_PROP_RANGE] =
g_param_spec_enum ("range", NULL, NULL,
GDK_TYPE_CICP_RANGE,
GDK_CICP_RANGE_NARROW,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
g_object_class_install_properties (object_class, GDK_CICP_PARAMS_N_PROPERTIES, gdk_cicp_params_properties);
}
/* }}} */
@@ -295,7 +294,7 @@ gdk_cicp_params_set_color_primaries (GdkCicpParams *self,
return;
self->cicp.color_primaries = color_primaries;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLOR_PRIMARIES]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_cicp_params_properties[GDK_CICP_PARAMS_PROP_COLOR_PRIMARIES]);
}
/**
@@ -335,7 +334,7 @@ gdk_cicp_params_set_transfer_function (GdkCicpParams *self,
return;
self->cicp.transfer_function = transfer_function;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TRANSFER_FUNCTION]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_cicp_params_properties[GDK_CICP_PARAMS_PROP_TRANSFER_FUNCTION]);
}
/**
@@ -375,7 +374,7 @@ gdk_cicp_params_set_matrix_coefficients (GdkCicpParams *self,
return;
self->cicp.matrix_coefficients = matrix_coefficients;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MATRIX_COEFFICIENTS]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_cicp_params_properties[GDK_CICP_PARAMS_PROP_MATRIX_COEFFICIENTS]);
}
/**
@@ -415,7 +414,7 @@ gdk_cicp_params_set_range (GdkCicpParams *self,
return;
self->cicp.range = range;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_RANGE]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_cicp_params_properties[GDK_CICP_PARAMS_PROP_RANGE]);
}
/**
+1 -1
View File
@@ -58,7 +58,7 @@ void gdk_cicp_params_set_matrix_coefficients (GdkCicpParams *self,
/**
* GdkCicpRange:
* @GDK_CICP_RANGE_NARROW: The values use the range of 16-235 (for Y) and 16-240 for u and v.
* @GDK_CICO_RANGE_FULL: The values use the full range.
* @GDK_CICP_RANGE_FULL: The values use the full range.
*
* The values of this enumeration describe whether image data uses
* the full range of 8-bit values.
+35 -35
View File
@@ -67,21 +67,21 @@ struct _GdkClipboardPrivate
};
enum {
PROP_0,
PROP_DISPLAY,
PROP_FORMATS,
PROP_LOCAL,
PROP_CONTENT,
N_PROPERTIES
GDK_CLIPBOARD_PROP_0,
GDK_CLIPBOARD_PROP_DISPLAY,
GDK_CLIPBOARD_PROP_FORMATS,
GDK_CLIPBOARD_PROP_LOCAL,
GDK_CLIPBOARD_PROP_CONTENT,
GDK_CLIPBOARD_N_PROPERTIES
};
enum {
CHANGED,
N_SIGNALS
GDK_CLIPBOARD_CHANGED,
GDK_CLIPBOARD_N_SIGNALS
};
static GParamSpec *properties[N_PROPERTIES] = { NULL, };
static guint signals[N_SIGNALS] = { 0 };
static GParamSpec *gdk_clipboard_properties[GDK_CLIPBOARD_N_PROPERTIES] = { NULL, };
static guint gdk_clipboard_signals[GDK_CLIPBOARD_N_SIGNALS] = { 0 };
G_DEFINE_TYPE_WITH_PRIVATE (GdkClipboard, gdk_clipboard, G_TYPE_OBJECT)
@@ -96,7 +96,7 @@ gdk_clipboard_set_property (GObject *gobject,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_CLIPBOARD_PROP_DISPLAY:
priv->display = g_value_get_object (value);
g_assert (priv->display != NULL);
break;
@@ -118,19 +118,19 @@ gdk_clipboard_get_property (GObject *gobject,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_CLIPBOARD_PROP_DISPLAY:
g_value_set_object (value, priv->display);
break;
case PROP_FORMATS:
case GDK_CLIPBOARD_PROP_FORMATS:
g_value_set_boxed (value, priv->formats);
break;
case PROP_CONTENT:
case GDK_CLIPBOARD_PROP_CONTENT:
g_value_set_object (value, priv->content);
break;
case PROP_LOCAL:
case GDK_CLIPBOARD_PROP_LOCAL:
g_value_set_boolean (value, priv->local);
break;
@@ -169,11 +169,11 @@ gdk_clipboard_real_claim (GdkClipboard *clipboard,
gdk_content_formats_ref (formats);
formats = gdk_content_formats_union_deserialize_gtypes (formats);
priv->formats = formats;
g_object_notify_by_pspec (G_OBJECT (clipboard), properties[PROP_FORMATS]);
g_object_notify_by_pspec (G_OBJECT (clipboard), gdk_clipboard_properties[GDK_CLIPBOARD_PROP_FORMATS]);
if (priv->local != local)
{
priv->local = local;
g_object_notify_by_pspec (G_OBJECT (clipboard), properties[PROP_LOCAL]);
g_object_notify_by_pspec (G_OBJECT (clipboard), gdk_clipboard_properties[GDK_CLIPBOARD_PROP_LOCAL]);
}
if (priv->content != content)
@@ -202,12 +202,12 @@ gdk_clipboard_real_claim (GdkClipboard *clipboard,
clipboard);
}
g_object_notify_by_pspec (G_OBJECT (clipboard), properties[PROP_CONTENT]);
g_object_notify_by_pspec (G_OBJECT (clipboard), gdk_clipboard_properties[GDK_CLIPBOARD_PROP_CONTENT]);
}
g_object_thaw_notify (G_OBJECT (clipboard));
g_signal_emit (clipboard, signals[CHANGED], 0);
g_signal_emit (clipboard, gdk_clipboard_signals[GDK_CLIPBOARD_CHANGED], 0);
return TRUE;
}
@@ -353,11 +353,11 @@ gdk_clipboard_class_init (GdkClipboardClass *class)
class->read_finish = gdk_clipboard_read_local_finish;
/**
* GdkClipboard:display: (attributes org.gtk.Property.get=gdk_clipboard_get_display)
* GdkClipboard:display:
*
* The `GdkDisplay` that the clipboard belongs to.
*/
properties[PROP_DISPLAY] =
gdk_clipboard_properties[GDK_CLIPBOARD_PROP_DISPLAY] =
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE |
@@ -366,11 +366,11 @@ gdk_clipboard_class_init (GdkClipboardClass *class)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkClipboard:formats: (attributes org.gtk.Property.get=gdk_clipboard_get_formats)
* GdkClipboard:formats:
*
* The possible formats that the clipboard can provide its data in.
*/
properties[PROP_FORMATS] =
gdk_clipboard_properties[GDK_CLIPBOARD_PROP_FORMATS] =
g_param_spec_boxed ("formats", NULL, NULL,
GDK_TYPE_CONTENT_FORMATS,
G_PARAM_READABLE |
@@ -378,11 +378,11 @@ gdk_clipboard_class_init (GdkClipboardClass *class)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkClipboard:local: (attributes org.gtk.Property.get=gdk_clipboard_is_local)
* GdkClipboard:local: (getter is_local)
*
* %TRUE if the contents of the clipboard are owned by this process.
*/
properties[PROP_LOCAL] =
gdk_clipboard_properties[GDK_CLIPBOARD_PROP_LOCAL] =
g_param_spec_boolean ("local", NULL, NULL,
TRUE,
G_PARAM_READABLE |
@@ -390,12 +390,12 @@ gdk_clipboard_class_init (GdkClipboardClass *class)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkClipboard:content: (attributes org.gtk.Property.get=gdk_clipboard_get_content)
* GdkClipboard:content:
*
* The `GdkContentProvider` or %NULL if the clipboard is empty or contents are
* provided otherwise.
*/
properties[PROP_CONTENT] =
gdk_clipboard_properties[GDK_CLIPBOARD_PROP_CONTENT] =
g_param_spec_object ("content", NULL, NULL,
GDK_TYPE_CONTENT_PROVIDER,
G_PARAM_READABLE |
@@ -408,7 +408,7 @@ gdk_clipboard_class_init (GdkClipboardClass *class)
*
* Emitted when the clipboard changes ownership.
*/
signals[CHANGED] =
gdk_clipboard_signals[GDK_CLIPBOARD_CHANGED] =
g_signal_new (I_("changed"),
G_TYPE_FROM_CLASS (class),
G_SIGNAL_RUN_LAST,
@@ -416,7 +416,7 @@ gdk_clipboard_class_init (GdkClipboardClass *class)
NULL, NULL, NULL,
G_TYPE_NONE, 0);
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
g_object_class_install_properties (object_class, GDK_CLIPBOARD_N_PROPERTIES, gdk_clipboard_properties);
}
static void
@@ -429,7 +429,7 @@ gdk_clipboard_init (GdkClipboard *clipboard)
}
/**
* gdk_clipboard_get_display: (attributes org.gtk.Method.get_property=display)
* gdk_clipboard_get_display:
* @clipboard: a `GdkClipboard`
*
* Gets the `GdkDisplay` that the clipboard was created for.
@@ -447,7 +447,7 @@ gdk_clipboard_get_display (GdkClipboard *clipboard)
}
/**
* gdk_clipboard_get_formats: (attributes org.gtk.Method.get_property=formats)
* gdk_clipboard_get_formats:
* @clipboard: a `GdkClipboard`
*
* Gets the formats that the clipboard can provide its current contents in.
@@ -465,7 +465,7 @@ gdk_clipboard_get_formats (GdkClipboard *clipboard)
}
/**
* gdk_clipboard_is_local: (attributes org.gtk.Method.get_property=local)
* gdk_clipboard_is_local: (get-property local)
* @clipboard: a `GdkClipboard`
*
* Returns if the clipboard is local.
@@ -489,7 +489,7 @@ gdk_clipboard_is_local (GdkClipboard *clipboard)
}
/**
* gdk_clipboard_get_content: (attributes org.gtk.Method.get_property=content)
* gdk_clipboard_get_content:
* @clipboard: a `GdkClipboard`
*
* Returns the `GdkContentProvider` currently set on @clipboard.
@@ -743,7 +743,7 @@ gdk_clipboard_read_value_got_stream (GObject *source,
}
static void
free_value (gpointer value)
gdk_clipboard_free_value (gpointer value)
{
g_value_unset (value);
g_free (value);
@@ -769,7 +769,7 @@ gdk_clipboard_read_value_internal (GdkClipboard *clipboard,
g_task_set_source_tag (task, source_tag);
value = g_new0 (GValue, 1);
g_value_init (value, type);
g_task_set_task_data (task, value, free_value);
g_task_set_task_data (task, value, gdk_clipboard_free_value);
if (priv->local)
{
-14
View File
@@ -229,20 +229,6 @@ gdk_color_from_rgba (GdkColor *self,
gdk_color_finish (&tmp);
}
/*< private >
* gdk_color_get_depth:
* @self: a `GdkColor`
*
* Returns the preferred depth for the color state of @self.
*
* Returns: the preferred depth
*/
GdkMemoryDepth
(gdk_color_get_depth) (const GdkColor *self)
{
return gdk_color_state_get_depth (self->color_state);
}
/*< private >
* gdk_color_print:
* @self: the `GdkColor` to print
+29 -21
View File
@@ -20,11 +20,17 @@
* and tests, and must not include other headers.
*/
static inline int
sign (float v)
{
return v < 0 ? -1 : 1;
}
static inline float
srgb_oetf (float v)
{
if (v > 0.0031308f)
return 1.055f * powf (v, 1.f / 2.4f) - 0.055f;
if (fabsf (v) > 0.0031308f)
return sign (v) * (1.055f * powf (fabsf (v), 1.f / 2.4f) - 0.055f);
else
return 12.92f * v;
}
@@ -32,8 +38,8 @@ srgb_oetf (float v)
static inline float
srgb_eotf (float v)
{
if (v >= 0.04045f)
return powf (((v + 0.055f) / (1.f + 0.055f)), 2.4f);
if (fabsf (v) >= 0.04045f)
return sign (v) * powf (((fabsf (v) + 0.055f) / (1.f + 0.055f)), 2.4f);
else
return v / 12.92f;
}
@@ -41,25 +47,25 @@ srgb_eotf (float v)
static inline float
gamma22_oetf (float v)
{
return powf (v, 1.f / 2.2f);
return sign (v) * powf (fabsf (v), 1.f / 2.2f);
}
static inline float
gamma22_eotf (float v)
{
return powf (v, 2.2f);
return sign (v) * powf (fabsf (v), 2.2f);
}
static inline float
gamma28_oetf (float v)
{
return powf (v, 1.f / 2.8f);
return sign (v) * powf (fabsf (v), 1.f / 2.8f);
}
static inline float
gamma28_eotf (float v)
{
return powf (v, 2.8f);
return sign (v) * powf (fabsf (v), 2.8f);
}
static inline float
@@ -71,9 +77,10 @@ pq_eotf (float v)
float c2 = 2413.0 / (1 << 7);
float c3 = 2392.0 / (1 << 7);
float x = powf (MAX ((powf (v, minv) - c1), 0) / (c2 - (c3 * (powf (v, minv)))), ninv);
float x = powf (fabsf (v), minv);
x = powf (MAX ((x - c1), 0) / (c2 - (c3 * x)), ninv);
return x * 10000 / 203.0;
return sign (v) * x * 10000 / 203.0;
}
static inline float
@@ -86,7 +93,8 @@ pq_oetf (float v)
float c2 = 2413.0 / (1 << 7);
float c3 = 2392.0 / (1 << 7);
return powf (((c1 + (c2 * powf (x, n))) / (1 + (c3 * powf (x, n)))), m);
x = powf (fabsf (x), n);
return sign (v) * powf (((c1 + (c2 * x)) / (1 + (c3 * x))), m);
}
static inline float
@@ -95,10 +103,10 @@ bt709_eotf (float v)
const float a = 1.099;
const float d = 0.0812;
if (v < d)
if (fabsf (v) < d)
return v / 4.5f;
else
return powf ((v + (a - 1)) / a, 1 / 0.45f);
return sign (v) * powf ((fabsf (v) + (a - 1)) / a, 1 / 0.45f);
}
static inline float
@@ -107,10 +115,10 @@ bt709_oetf (float v)
const float a = 1.099;
const float b = 0.018;
if (v < b)
if (fabsf (v) < b)
return v * 4.5f;
else
return a * powf (v, 0.45f) - (a - 1);
return sign (v) * (a * powf (fabsf (v), 0.45f) - (a - 1));
}
static inline float
@@ -120,10 +128,10 @@ hlg_eotf (float v)
const float b = 0.28466892;
const float c = 0.55991073;
if (v <= 0.5)
return (v * v) / 3;
if (fabsf (v) <= 0.5)
return sign (v) * (v * v) / 3;
else
return (expf ((v - c) / a) + b) / 12.0;
return sign (v) * (expf ((fabsf (v) - c) / a) + b) / 12.0;
}
static inline float
@@ -133,10 +141,10 @@ hlg_oetf (float v)
const float b = 0.28466892;
const float c = 0.55991073;
if (v <= 1/12.0)
return sqrtf (3 * v);
if (fabsf (v) <= 1/12.0)
return sign (v) * sqrtf (3 * fabsf (v));
else
return a * logf (12 * v - b) + c;
return sign (v) * (a * logf (12 * fabsf (v) - b) + c);
}
/* See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
+4 -8
View File
@@ -116,7 +116,10 @@ _gdk_color_to_float (const GdkColor *self,
{
if (gdk_color_state_equal (self->color_state, color_state))
{
memcpy (values, self->values, sizeof (float) * 4);
values[0] = self->values[0];
values[1] = self->values[1];
values[2] = self->values[2];
values[3] = self->values[3];
return;
}
@@ -126,10 +129,3 @@ _gdk_color_to_float (const GdkColor *self,
values);
}
#define gdk_color_get_depth(self) _gdk_color_get_depth ((self))
static inline GdkMemoryDepth
_gdk_color_get_depth (const GdkColor *self)
{
return gdk_color_state_get_depth (self->color_state);
}
-1
View File
@@ -83,7 +83,6 @@ gboolean gdk_color_equal (const GdkColor *color1,
const GdkColor *color2);
gboolean gdk_color_is_clear (const GdkColor *self);
gboolean gdk_color_is_opaque (const GdkColor *self);
GdkMemoryDepth gdk_color_get_depth (const GdkColor *self);
void gdk_color_convert (GdkColor *self,
GdkColorState *color_state,
+115 -32
View File
@@ -38,9 +38,9 @@
* Crucially, GTK knows how to convert colors from one color
* state to another.
*
* `GdkColorState objects are immutable and therefore threadsafe.
* `GdkColorState` objects are immutable and therefore threadsafe.
*
* Since 4.16
* Since: 4.16
*/
G_DEFINE_BOXED_TYPE (GdkColorState, gdk_color_state,
@@ -331,6 +331,68 @@ gdk_default_color_state_get_cicp (GdkColorState *color_state)
return &self->cicp;
}
static gboolean
gdk_color_state_check_inf_nan (const float src[4],
float dest[4])
{
if (isnan (src[0]) ||
isnan (src[1]) ||
isnan (src[2]) ||
isnan (src[3]))
{
dest = (float[4]) { 1.0, 0.0, 0.8, 1.0 };
return TRUE;
}
if (isinf (src[0]) ||
isinf (src[1]) ||
isinf (src[2]) ||
isinf (src[3]))
{
dest = (float[4]) { 0.0, 0.8, 1.0, 1.0 };
return TRUE;
}
return FALSE;
}
static void
gdk_color_state_clamp_0_1 (GdkColorState *self,
const float src[4],
float dest[4])
{
if (gdk_color_state_check_inf_nan (src, dest))
return;
dest[0] = CLAMP (src[0], 0.0f, 1.0f);
dest[1] = CLAMP (src[1], 0.0f, 1.0f);
dest[2] = CLAMP (src[2], 0.0f, 1.0f);
dest[3] = CLAMP (src[3], 0.0f, 1.0f);
}
static void
gdk_color_state_clamp_unbounded (GdkColorState *self,
const float src[4],
float dest[4])
{
if (gdk_color_state_check_inf_nan (src, dest))
return;
dest[0] = src[0];
dest[1] = src[1];
dest[2] = src[2];
dest[3] = CLAMP (src[3], 0.0f, 1.0f);
}
static void
gdk_default_color_state_clamp (GdkColorState *color_state,
const float in[4],
float out[4])
{
GdkDefaultColorState *self = (GdkDefaultColorState *) color_state;
self->clamp (color_state, in, out);
}
/* }}} */
static const
@@ -342,6 +404,7 @@ GdkColorStateClass GDK_DEFAULT_COLOR_STATE_CLASS = {
.get_convert_to = gdk_default_color_state_get_convert_to,
.get_convert_from = gdk_default_color_state_get_convert_from,
.get_cicp = gdk_default_color_state_get_cicp,
.clamp = gdk_default_color_state_clamp,
};
GdkDefaultColorState gdk_default_color_states[] = {
@@ -350,7 +413,8 @@ GdkDefaultColorState gdk_default_color_states[] = {
.klass = &GDK_DEFAULT_COLOR_STATE_CLASS,
.ref_count = 0,
.depth = GDK_MEMORY_U8_SRGB,
.rendering_color_state = GDK_COLOR_STATE_SRGB_LINEAR,
.rendering_color_state = GDK_COLOR_STATE_SRGB,
.rendering_color_state_linear = GDK_COLOR_STATE_SRGB_LINEAR,
},
.name = "srgb",
.no_srgb = GDK_COLOR_STATE_SRGB_LINEAR,
@@ -359,6 +423,7 @@ GdkDefaultColorState gdk_default_color_states[] = {
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_srgb_to_rec2100_pq,
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_srgb_to_rec2100_linear,
},
.clamp = gdk_color_state_clamp_0_1,
.cicp = { 1, 13, 0, 1 },
},
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = {
@@ -367,6 +432,7 @@ GdkDefaultColorState gdk_default_color_states[] = {
.ref_count = 0,
.depth = GDK_MEMORY_U8,
.rendering_color_state = GDK_COLOR_STATE_SRGB_LINEAR,
.rendering_color_state_linear = GDK_COLOR_STATE_SRGB_LINEAR,
},
.name = "srgb-linear",
.no_srgb = NULL,
@@ -375,6 +441,7 @@ GdkDefaultColorState gdk_default_color_states[] = {
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_srgb_linear_to_rec2100_pq,
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_srgb_linear_to_rec2100_linear,
},
.clamp = gdk_color_state_clamp_0_1,
.cicp = { 1, 8, 0, 1 },
},
[GDK_COLOR_STATE_ID_REC2100_PQ] = {
@@ -382,7 +449,8 @@ GdkDefaultColorState gdk_default_color_states[] = {
.klass = &GDK_DEFAULT_COLOR_STATE_CLASS,
.ref_count = 0,
.depth = GDK_MEMORY_FLOAT16,
.rendering_color_state = GDK_COLOR_STATE_REC2100_LINEAR,
.rendering_color_state = GDK_COLOR_STATE_REC2100_PQ,
.rendering_color_state_linear = GDK_COLOR_STATE_REC2100_LINEAR,
},
.name = "rec2100-pq",
.no_srgb = NULL,
@@ -391,6 +459,7 @@ GdkDefaultColorState gdk_default_color_states[] = {
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = gdk_default_rec2100_pq_to_srgb_linear,
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_rec2100_pq_to_rec2100_linear,
},
.clamp = gdk_color_state_clamp_0_1,
.cicp = { 9, 16, 0, 1 },
},
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = {
@@ -399,6 +468,7 @@ GdkDefaultColorState gdk_default_color_states[] = {
.ref_count = 0,
.depth = GDK_MEMORY_FLOAT16,
.rendering_color_state = GDK_COLOR_STATE_REC2100_LINEAR,
.rendering_color_state_linear = GDK_COLOR_STATE_REC2100_LINEAR,
},
.name = "rec2100-linear",
.no_srgb = NULL,
@@ -407,11 +477,12 @@ GdkDefaultColorState gdk_default_color_states[] = {
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = gdk_default_rec2100_linear_to_srgb_linear,
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_rec2100_linear_to_rec2100_pq,
},
.clamp = gdk_color_state_clamp_unbounded,
.cicp = { 9, 8, 0, 1 },
},
};
/* }}} */
/* }}} */
/* {{{ Cicp implementation */
typedef struct _GdkCicpColorState GdkCicpColorState;
@@ -421,15 +492,15 @@ struct _GdkCicpColorState
GdkColorState *no_srgb;
const char *name;
char *name;
GdkTransferFunc eotf;
GdkTransferFunc oetf;
float *to_srgb;
float *to_rec2020;
float *from_srgb;
float *from_rec2020;
float to_srgb[9];
float to_rec2020[9];
float from_srgb[9];
float from_rec2020[9];
GdkCicp cicp;
};
@@ -449,7 +520,6 @@ TRANSFORM(gdk_cicp_from_rec2100_linear, NONE, cicp->from_rec2020, cicp->o
#undef cicp
/* }}} */
/* }}} */
/* {{{ Vfuncs */
@@ -458,14 +528,11 @@ gdk_cicp_color_state_free (GdkColorState *cs)
{
GdkCicpColorState *self = (GdkCicpColorState *) cs;
g_free (self->name);
if (self->no_srgb)
gdk_color_state_unref (self->no_srgb);
g_free (self->to_srgb);
g_free (self->to_rec2020);
g_free (self->from_srgb);
g_free (self->from_rec2020);
g_free (self);
}
@@ -555,7 +622,7 @@ gdk_cicp_color_state_get_cicp (GdkColorState *color_state)
return &self->cicp;
}
/* }}} */
/* }}} */
static const
GdkColorStateClass GDK_CICP_COLOR_STATE_CLASS = {
@@ -566,6 +633,7 @@ GdkColorStateClass GDK_CICP_COLOR_STATE_CLASS = {
.get_convert_to = gdk_cicp_color_state_get_convert_to,
.get_convert_from = gdk_cicp_color_state_get_convert_from,
.get_cicp = gdk_cicp_color_state_get_cicp,
.clamp = gdk_color_state_clamp_0_1,
};
static inline float *
@@ -676,10 +744,6 @@ gdk_color_state_new_for_cicp (const GdkCicp *cicp,
to_xyz = rec2020_to_xyz;
from_xyz = xyz_to_rec2020;
break;
case 10:
to_xyz = identity;
from_xyz = identity;
break;
case 12:
to_xyz = p3_to_xyz;
from_xyz = xyz_to_p3;
@@ -698,7 +762,8 @@ gdk_color_state_new_for_cicp (const GdkCicp *cicp,
self->parent.ref_count = 1;
/* sRGB is special-cased by being a default colorstate */
self->parent.rendering_color_state = GDK_COLOR_STATE_REC2100_LINEAR;
self->parent.rendering_color_state = GDK_COLOR_STATE_REC2100_PQ;
self->parent.rendering_color_state_linear = GDK_COLOR_STATE_REC2100_LINEAR;
self->parent.depth = GDK_MEMORY_FLOAT16;
@@ -707,10 +772,10 @@ gdk_color_state_new_for_cicp (const GdkCicp *cicp,
self->eotf = eotf;
self->oetf = oetf;
self->to_srgb = multiply (g_new (float, 9), xyz_to_srgb, to_xyz);
self->to_rec2020 = multiply (g_new (float, 9), xyz_to_rec2020, to_xyz);
self->from_srgb = multiply (g_new (float, 9), from_xyz, srgb_to_xyz);
self->from_rec2020 = multiply (g_new (float, 9), from_xyz, rec2020_to_xyz);
multiply (self->to_srgb, xyz_to_srgb, to_xyz);
multiply (self->to_rec2020, xyz_to_rec2020, to_xyz);
multiply (self->from_srgb, from_xyz, srgb_to_xyz);
multiply (self->from_rec2020, from_xyz, rec2020_to_xyz);
self->name = g_strdup_printf ("cicp-%u/%u/%u/%u",
cicp->color_primaries,
@@ -720,12 +785,12 @@ gdk_color_state_new_for_cicp (const GdkCicp *cicp,
if (cicp->transfer_function == 13)
{
GdkCicp no_srgb;
memcpy (&no_srgb, cicp, sizeof (GdkCicp));
no_srgb.transfer_function = 8;
self->no_srgb = gdk_color_state_new_for_cicp (&no_srgb, NULL);
self->no_srgb = gdk_color_state_new_for_cicp (&(GdkCicp) {
cicp->color_primaries,
8,
cicp->matrix_coefficients,
cicp->range },
NULL);
}
return (GdkColorState *) self;
@@ -773,6 +838,24 @@ gdk_color_state_get_no_srgb_tf (GdkColorState *self)
return self->klass->get_no_srgb_tf (self);
}
/*< private >
* gdk_color_state_clamp:
* @self: a `GdkColorState`
* @src: the values to clamp
* @dest: (out): location to store the result, may be identical to
* the src argument
*
* Clamps the values to be within the allowed ranges for the given
* color state.
*/
void
gdk_color_state_clamp (GdkColorState *self,
const float src[4],
float dest[4])
{
self->klass->clamp (self, src, dest);
}
/* }}} */
/* vim:set foldmethod=marker expandtab: */
+17 -4
View File
@@ -26,6 +26,7 @@ struct _GdkColorState
GdkMemoryDepth depth;
GdkColorState *rendering_color_state;
GdkColorState *rendering_color_state_linear;
};
/* Note: self may be the source or the target colorstate */
@@ -45,6 +46,9 @@ struct _GdkColorStateClass
GdkFloatColorConvert (* get_convert_from) (GdkColorState *self,
GdkColorState *source);
const GdkCicp * (* get_cicp) (GdkColorState *self);
void (* clamp) (GdkColorState *self,
const float src[4],
float dest[4]);
};
typedef struct _GdkDefaultColorState GdkDefaultColorState;
@@ -56,6 +60,9 @@ struct _GdkDefaultColorState
const char *name;
GdkColorState *no_srgb;
GdkFloatColorConvert convert_to[GDK_COLOR_STATE_N_IDS];
void (* clamp) (GdkColorState *self,
const float src[4],
float dest[4]);
GdkCicp cicp;
};
@@ -77,6 +84,10 @@ GdkColorState * gdk_color_state_get_no_srgb_tf (GdkColorState
GdkColorState * gdk_color_state_new_for_cicp (const GdkCicp *cicp,
GError **error);
void gdk_color_state_clamp (GdkColorState *self,
const float src[4],
float dest[4]);
static inline GdkColorState *
gdk_color_state_get_rendering_color_state (GdkColorState *self)
{
@@ -84,9 +95,9 @@ gdk_color_state_get_rendering_color_state (GdkColorState *self)
self = GDK_COLOR_STATE_REC2100_PQ;
if (!GDK_DEBUG_CHECK (LINEAR))
return self;
return self->rendering_color_state;
return self->rendering_color_state;
return self->rendering_color_state_linear;
}
static inline GdkMemoryDepth
@@ -176,7 +187,10 @@ gdk_color_state_convert_color (GdkColorState *src_cs,
GdkFloatColorConvert convert = NULL;
GdkFloatColorConvert convert2 = NULL;
memcpy (dest, src, sizeof (float) * 4);
dest[0] = src[0];
dest[1] = src[1];
dest[2] = src[2];
dest[3] = src[3];
if (gdk_color_state_equal (src_cs, dest_cs))
return;
@@ -210,4 +224,3 @@ gdk_color_state_from_rgba (GdkColorState *self,
self,
out_color);
}
+50 -51
View File
@@ -59,9 +59,9 @@ struct _Deserializer
GDestroyNotify notify;
};
GQueue deserializers = G_QUEUE_INIT;
GQueue gdk_content_deserializers = G_QUEUE_INIT;
static void init (void);
static void gdk_content_deserializers_init (void);
#define GDK_CONTENT_DESERIALIZER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_CONTENT_DESERIALIZER, GdkContentDeserializerClass))
#define GDK_IS_CONTENT_DESERIALIZER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_CONTENT_DESERIALIZER))
@@ -418,22 +418,22 @@ gdk_content_register_deserializer (const char *mime_type,
deserializer->data = data;
deserializer->notify = notify;
g_queue_push_tail (&deserializers, deserializer);
g_queue_push_tail (&gdk_content_deserializers, deserializer);
}
static Deserializer *
lookup_deserializer (const char *mime_type,
GType type)
gdk_content_deserializer_lookup (const char *mime_type,
GType type)
{
GList *l;
g_return_val_if_fail (mime_type != NULL, NULL);
init ();
gdk_content_deserializers_init ();
mime_type = g_intern_string (mime_type);
for (l = g_queue_peek_head_link (&deserializers); l; l = l->next)
for (l = g_queue_peek_head_link (&gdk_content_deserializers); l; l = l->next)
{
Deserializer *deserializer = l->data;
@@ -462,12 +462,12 @@ gdk_content_formats_union_deserialize_gtypes (GdkContentFormats *formats)
g_return_val_if_fail (formats != NULL, NULL);
init ();
gdk_content_deserializers_init ();
builder = gdk_content_formats_builder_new ();
gdk_content_formats_builder_add_formats (builder, formats);
for (l = g_queue_peek_head_link (&deserializers); l; l = l->next)
for (l = g_queue_peek_head_link (&gdk_content_deserializers); l; l = l->next)
{
Deserializer *deserializer = l->data;
@@ -497,12 +497,12 @@ gdk_content_formats_union_deserialize_mime_types (GdkContentFormats *formats)
g_return_val_if_fail (formats != NULL, NULL);
init ();
gdk_content_deserializers_init ();
builder = gdk_content_formats_builder_new ();
gdk_content_formats_builder_add_formats (builder, formats);
for (l = g_queue_peek_head_link (&deserializers); l; l = l->next)
for (l = g_queue_peek_head_link (&gdk_content_deserializers); l; l = l->next)
{
Deserializer *deserializer = l->data;
@@ -558,7 +558,7 @@ gdk_content_deserialize_async (GInputStream *stream,
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
g_return_if_fail (callback != NULL);
deserializer = lookup_deserializer (mime_type, type);
deserializer = gdk_content_deserializer_lookup (mime_type, type);
gdk_content_deserializer_run (mime_type,
type,
@@ -612,9 +612,9 @@ gdk_content_deserialize_finish (GAsyncResult *result,
/*** DESERIALIZERS ***/
static void
pixbuf_deserializer_finish (GObject *source,
GAsyncResult *res,
gpointer deserializer)
gdk_content_deserializer_pixbuf_finish (GObject *source,
GAsyncResult *res,
gpointer deserializer)
{
GdkPixbuf *pixbuf;
GValue *value;
@@ -647,18 +647,18 @@ pixbuf_deserializer_finish (GObject *source,
}
static void
pixbuf_deserializer (GdkContentDeserializer *deserializer)
gdk_content_deserializer_pixbuf (GdkContentDeserializer *deserializer)
{
gdk_pixbuf_new_from_stream_async (gdk_content_deserializer_get_input_stream (deserializer),
gdk_content_deserializer_get_cancellable (deserializer),
pixbuf_deserializer_finish,
gdk_content_deserializer_get_cancellable (deserializer),
gdk_content_deserializer_pixbuf_finish,
deserializer);
}
static void
texture_deserializer_finish (GObject *source,
GAsyncResult *result,
gpointer deserializer)
gdk_content_deserializer_texture_finish (GObject *source,
GAsyncResult *result,
gpointer deserializer)
{
GOutputStream *stream = G_OUTPUT_STREAM (source);
GBytes *bytes;
@@ -688,7 +688,7 @@ texture_deserializer_finish (GObject *source,
}
static void
texture_deserializer (GdkContentDeserializer *deserializer)
gdk_content_deserializer_texture (GdkContentDeserializer *deserializer)
{
GOutputStream *output;
@@ -700,15 +700,15 @@ texture_deserializer (GdkContentDeserializer *deserializer)
| G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
gdk_content_deserializer_get_priority (deserializer),
gdk_content_deserializer_get_cancellable (deserializer),
texture_deserializer_finish,
gdk_content_deserializer_texture_finish,
deserializer);
g_object_unref (output);
}
static void
string_deserializer_finish (GObject *source,
GAsyncResult *result,
gpointer deserializer)
gdk_content_deserializer_string_finish (GObject *source,
GAsyncResult *result,
gpointer deserializer)
{
GOutputStream *stream = G_OUTPUT_STREAM (source);
GError *error = NULL;
@@ -744,7 +744,7 @@ string_deserializer_finish (GObject *source,
}
static void
string_deserializer (GdkContentDeserializer *deserializer)
gdk_content_deserializer_string (GdkContentDeserializer *deserializer)
{
GOutputStream *output, *filter;
GCharsetConverter *converter;
@@ -770,15 +770,15 @@ string_deserializer (GdkContentDeserializer *deserializer)
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE,
gdk_content_deserializer_get_priority (deserializer),
gdk_content_deserializer_get_cancellable (deserializer),
string_deserializer_finish,
gdk_content_deserializer_string_finish,
deserializer);
g_object_unref (filter);
}
static void
file_uri_deserializer_finish (GObject *source,
GAsyncResult *result,
gpointer deserializer)
gdk_content_deserializer_file_uri_finish (GObject *source,
GAsyncResult *result,
gpointer deserializer)
{
GOutputStream *stream = G_OUTPUT_STREAM (source);
GError *error = NULL;
@@ -828,7 +828,7 @@ file_uri_deserializer_finish (GObject *source,
}
static void
file_uri_deserializer (GdkContentDeserializer *deserializer)
gdk_content_deserializer_file_uri (GdkContentDeserializer *deserializer)
{
GOutputStream *output;
@@ -839,15 +839,15 @@ file_uri_deserializer (GdkContentDeserializer *deserializer)
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE,
gdk_content_deserializer_get_priority (deserializer),
gdk_content_deserializer_get_cancellable (deserializer),
file_uri_deserializer_finish,
gdk_content_deserializer_file_uri_finish,
deserializer);
g_object_unref (output);
}
static void
color_deserializer_finish (GObject *source,
GAsyncResult *result,
gpointer deserializer)
gdk_content_deserializer_color_finish (GObject *source,
GAsyncResult *result,
gpointer deserializer)
{
GOutputStream *stream = G_OUTPUT_STREAM (source);
GError *error = NULL;
@@ -883,7 +883,7 @@ color_deserializer_finish (GObject *source,
}
static void
color_deserializer (GdkContentDeserializer *deserializer)
gdk_content_deserializer_color (GdkContentDeserializer *deserializer)
{
GOutputStream *output;
guint16 *data;
@@ -896,13 +896,13 @@ color_deserializer (GdkContentDeserializer *deserializer)
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
gdk_content_deserializer_get_priority (deserializer),
gdk_content_deserializer_get_cancellable (deserializer),
color_deserializer_finish,
gdk_content_deserializer_color_finish,
deserializer);
g_object_unref (output);
}
static void
init (void)
gdk_content_deserializers_init (void)
{
static gboolean initialized = FALSE;
GSList *formats, *f;
@@ -915,17 +915,17 @@ init (void)
gdk_content_register_deserializer ("image/png",
GDK_TYPE_TEXTURE,
texture_deserializer,
gdk_content_deserializer_texture,
NULL,
NULL);
gdk_content_register_deserializer ("image/tiff",
GDK_TYPE_TEXTURE,
texture_deserializer,
gdk_content_deserializer_texture,
NULL,
NULL);
gdk_content_register_deserializer ("image/jpeg",
GDK_TYPE_TEXTURE,
texture_deserializer,
gdk_content_deserializer_texture,
NULL,
NULL);
@@ -948,12 +948,12 @@ init (void)
!g_str_equal (name, "tiff"))
gdk_content_register_deserializer (*m,
GDK_TYPE_TEXTURE,
pixbuf_deserializer,
gdk_content_deserializer_pixbuf,
NULL,
NULL);
gdk_content_register_deserializer (*m,
GDK_TYPE_PIXBUF,
pixbuf_deserializer,
gdk_content_deserializer_pixbuf,
NULL,
NULL);
}
@@ -969,19 +969,19 @@ init (void)
gdk_content_register_deserializer ("text/uri-list",
GDK_TYPE_FILE_LIST,
file_uri_deserializer,
gdk_content_deserializer_file_uri,
NULL,
NULL);
gdk_content_register_deserializer ("text/uri-list",
G_TYPE_FILE,
file_uri_deserializer,
gdk_content_deserializer_file_uri,
NULL,
NULL);
gdk_content_register_deserializer ("text/plain;charset=utf-8",
G_TYPE_STRING,
string_deserializer,
gdk_content_deserializer_string,
(gpointer) "utf-8",
NULL);
if (!g_get_charset (&charset))
@@ -990,21 +990,20 @@ init (void)
gdk_content_register_deserializer (mime,
G_TYPE_STRING,
string_deserializer,
gdk_content_deserializer_string,
(gpointer) charset,
g_free);
g_free (mime);
}
gdk_content_register_deserializer ("text/plain",
G_TYPE_STRING,
string_deserializer,
gdk_content_deserializer_string,
(gpointer) "ASCII",
NULL);
gdk_content_register_deserializer ("application/x-color",
GDK_TYPE_RGBA,
color_deserializer,
gdk_content_deserializer_color,
NULL,
NULL);
}
+20 -20
View File
@@ -47,19 +47,19 @@ struct _GdkContentProviderPrivate
};
enum {
PROP_0,
PROP_FORMATS,
PROP_STORABLE_FORMATS,
N_PROPERTIES
GDK_CONTENT_PROVIDER_PROP_0,
GDK_CONTENT_PROVIDER_PROP_FORMATS,
GDK_CONTENT_PROVIDER_PROP_STORABLE_FORMATS,
GDK_CONTENT_PROVIDER_N_PROPERTIES
};
enum {
CONTENT_CHANGED,
N_SIGNALS
GDK_CONTENT_PROVIDER_CONTENT_CHANGED,
GDK_CONTENT_PROVIDER_N_SIGNALS
};
static GParamSpec *properties[N_PROPERTIES] = { NULL, };
static guint signals[N_SIGNALS] = { 0 };
static GParamSpec *gdk_content_provider_properties[GDK_CONTENT_PROVIDER_N_PROPERTIES] = { NULL, };
static guint gdk_content_provider_signals[GDK_CONTENT_PROVIDER_N_SIGNALS] = { 0 };
G_DEFINE_TYPE_WITH_PRIVATE (GdkContentProvider, gdk_content_provider, G_TYPE_OBJECT)
@@ -139,11 +139,11 @@ gdk_content_provider_get_property (GObject *gobject,
switch (prop_id)
{
case PROP_FORMATS:
case GDK_CONTENT_PROVIDER_PROP_FORMATS:
g_value_take_boxed (value, gdk_content_provider_ref_formats (provider));
break;
case PROP_STORABLE_FORMATS:
case GDK_CONTENT_PROVIDER_PROP_STORABLE_FORMATS:
g_value_take_boxed (value, gdk_content_provider_ref_storable_formats (provider));
break;
@@ -169,11 +169,11 @@ gdk_content_provider_class_init (GdkContentProviderClass *class)
class->get_value = gdk_content_provider_real_get_value;
/**
* GdkContentProvider:formats: (attributes org.gtk.Property.get=gdk_content_provider_ref_formats)
* GdkContentProvider:formats: (getter ref_formats)
*
* The possible formats that the provider can provide its data in.
*/
properties[PROP_FORMATS] =
gdk_content_provider_properties[GDK_CONTENT_PROVIDER_PROP_FORMATS] =
g_param_spec_boxed ("formats", NULL, NULL,
GDK_TYPE_CONTENT_FORMATS,
G_PARAM_READABLE |
@@ -181,11 +181,11 @@ gdk_content_provider_class_init (GdkContentProviderClass *class)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkContentProvider:storable-formats: (attributes org.gtk.Property.get=gdk_content_provider_ref_storable_formats)
* GdkContentProvider:storable-formats: (getter ref_storable_formats)
*
* The subset of formats that clipboard managers should store this provider's data in.
*/
properties[PROP_STORABLE_FORMATS] =
gdk_content_provider_properties[GDK_CONTENT_PROVIDER_PROP_STORABLE_FORMATS] =
g_param_spec_boxed ("storable-formats", NULL, NULL,
GDK_TYPE_CONTENT_FORMATS,
G_PARAM_READABLE |
@@ -197,7 +197,7 @@ gdk_content_provider_class_init (GdkContentProviderClass *class)
*
* Emitted whenever the content provided by this provider has changed.
*/
signals[CONTENT_CHANGED] =
gdk_content_provider_signals[GDK_CONTENT_PROVIDER_CONTENT_CHANGED] =
g_signal_new (I_("content-changed"),
G_TYPE_FROM_CLASS (class),
G_SIGNAL_RUN_LAST,
@@ -205,7 +205,7 @@ gdk_content_provider_class_init (GdkContentProviderClass *class)
NULL, NULL, NULL,
G_TYPE_NONE, 0);
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
g_object_class_install_properties (object_class, GDK_CONTENT_PROVIDER_N_PROPERTIES, gdk_content_provider_properties);
}
static void
@@ -214,7 +214,7 @@ gdk_content_provider_init (GdkContentProvider *provider)
}
/**
* gdk_content_provider_ref_formats: (attributes org.gtk.Method.get_property=formats)
* gdk_content_provider_ref_formats: (get-property formats)
* @provider: a `GdkContentProvider`
*
* Gets the formats that the provider can provide its current contents in.
@@ -230,7 +230,7 @@ gdk_content_provider_ref_formats (GdkContentProvider *provider)
}
/**
* gdk_content_provider_ref_storable_formats: (attributes org.gtk.Method.get_property=storable-formats)
* gdk_content_provider_ref_storable_formats: (get-property storable-formats)
* @provider: a `GdkContentProvider`
*
* Gets the formats that the provider suggests other applications to store
@@ -261,9 +261,9 @@ gdk_content_provider_content_changed (GdkContentProvider *provider)
{
g_return_if_fail (GDK_IS_CONTENT_PROVIDER (provider));
g_signal_emit (provider, signals[CONTENT_CHANGED], 0);
g_signal_emit (provider, gdk_content_provider_signals[GDK_CONTENT_PROVIDER_CONTENT_CHANGED], 0);
g_object_notify_by_pspec (G_OBJECT (provider), properties[PROP_FORMATS]);
g_object_notify_by_pspec (G_OBJECT (provider), gdk_content_provider_properties[GDK_CONTENT_PROVIDER_PROP_FORMATS]);
}
/**
+58 -59
View File
@@ -64,9 +64,9 @@ struct _Serializer
GDestroyNotify notify;
};
GQueue serializers = G_QUEUE_INIT;
GQueue gdk_content_serializers = G_QUEUE_INIT;
static void init (void);
static void gdk_content_serializers_init (void);
#define GDK_CONTENT_SERIALIZER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_CONTENT_SERIALIZER, GdkContentSerializerClass))
#define GDK_IS_CONTENT_SERIALIZER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_CONTENT_SERIALIZER))
@@ -424,7 +424,7 @@ gdk_content_register_serializer (GType type,
serializer->data = data;
serializer->notify = notify;
g_queue_push_tail (&serializers, serializer);
g_queue_push_tail (&gdk_content_serializers, serializer);
}
static Serializer *
@@ -435,11 +435,11 @@ lookup_serializer (const char *mime_type,
g_return_val_if_fail (mime_type != NULL, NULL);
init ();
gdk_content_serializers_init ();
mime_type = g_intern_string (mime_type);
for (l = g_queue_peek_head_link (&serializers); l; l = l->next)
for (l = g_queue_peek_head_link (&gdk_content_serializers); l; l = l->next)
{
Serializer *serializer = l->data;
@@ -468,12 +468,12 @@ gdk_content_formats_union_serialize_gtypes (GdkContentFormats *formats)
g_return_val_if_fail (formats != NULL, NULL);
init ();
gdk_content_serializers_init ();
builder = gdk_content_formats_builder_new ();
gdk_content_formats_builder_add_formats (builder, formats);
for (l = g_queue_peek_head_link (&serializers); l; l = l->next)
for (l = g_queue_peek_head_link (&gdk_content_serializers); l; l = l->next)
{
Serializer *serializer = l->data;
@@ -503,12 +503,12 @@ gdk_content_formats_union_serialize_mime_types (GdkContentFormats *formats)
g_return_val_if_fail (formats != NULL, NULL);
init ();
gdk_content_serializers_init ();
builder = gdk_content_formats_builder_new ();
gdk_content_formats_builder_add_formats (builder, formats);
for (l = g_queue_peek_head_link (&serializers); l; l = l->next)
for (l = g_queue_peek_head_link (&gdk_content_serializers); l; l = l->next)
{
Serializer *serializer = l->data;
@@ -610,9 +610,9 @@ gdk_content_serialize_finish (GAsyncResult *result,
static void
pixbuf_serializer_finish (GObject *source,
GAsyncResult *res,
gpointer serializer)
gdk_content_serializer_pixbuf_finish (GObject *source,
GAsyncResult *res,
gpointer serializer)
{
GError *error = NULL;
@@ -623,7 +623,7 @@ pixbuf_serializer_finish (GObject *source,
}
static void
pixbuf_serializer (GdkContentSerializer *serializer)
gdk_content_serializer_pixbuf (GdkContentSerializer *serializer)
{
const GValue *value;
GdkPixbuf *pixbuf;
@@ -652,7 +652,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
gdk_content_serializer_get_output_stream (serializer),
name,
gdk_content_serializer_get_cancellable (serializer),
pixbuf_serializer_finish,
gdk_content_serializer_pixbuf_finish,
serializer,
g_str_equal (name, "png") ? "compression" : NULL, "2",
NULL);
@@ -660,9 +660,9 @@ G_GNUC_END_IGNORE_DEPRECATIONS
}
static void
texture_serializer_finish (GObject *source,
GAsyncResult *res,
gpointer user_data)
gdk_content_serializer_texture_finish (GObject *source,
GAsyncResult *res,
gpointer user_data)
{
GdkContentSerializer *serializer = GDK_CONTENT_SERIALIZER (source);
GError *error = NULL;
@@ -674,10 +674,10 @@ texture_serializer_finish (GObject *source,
}
static void
serialize_texture_in_thread (GTask *task,
gpointer source_object,
gpointer task_data,
GCancellable *cancellable)
gdk_content_serializer_texture_in_thread (GTask *task,
gpointer source_object,
gpointer task_data,
GCancellable *cancellable)
{
GdkContentSerializer *serializer = source_object;
const GValue *value;
@@ -718,22 +718,22 @@ serialize_texture_in_thread (GTask *task,
}
static void
texture_serializer (GdkContentSerializer *serializer)
gdk_content_serializer_texture (GdkContentSerializer *serializer)
{
GTask *task;
task = g_task_new (serializer,
gdk_content_serializer_get_cancellable (serializer),
texture_serializer_finish,
gdk_content_serializer_texture_finish,
NULL);
g_task_run_in_thread (task, serialize_texture_in_thread);
g_task_run_in_thread (task, gdk_content_serializer_texture_in_thread);
g_object_unref (task);
}
static void
string_serializer_finish (GObject *source,
GAsyncResult *result,
gpointer serializer)
gdk_content_serializer_string_finish (GObject *source,
GAsyncResult *result,
gpointer serializer)
{
GOutputStream *stream = G_OUTPUT_STREAM (source);
GError *error = NULL;
@@ -745,7 +745,7 @@ string_serializer_finish (GObject *source,
}
static void
string_serializer (GdkContentSerializer *serializer)
gdk_content_serializer_string (GdkContentSerializer *serializer)
{
GOutputStream *filter;
GCharsetConverter *converter;
@@ -775,15 +775,15 @@ string_serializer (GdkContentSerializer *serializer)
strlen (text),
gdk_content_serializer_get_priority (serializer),
gdk_content_serializer_get_cancellable (serializer),
string_serializer_finish,
gdk_content_serializer_string_finish,
serializer);
g_object_unref (filter);
}
static void
file_serializer_finish (GObject *source,
GAsyncResult *result,
gpointer serializer)
gdk_content_serializer_file_finish (GObject *source,
GAsyncResult *result,
gpointer serializer)
{
GOutputStream *stream = G_OUTPUT_STREAM (source);
GError *error = NULL;
@@ -795,7 +795,7 @@ file_serializer_finish (GObject *source,
}
static char *
file_get_native_uri (GFile *file)
gdk_file_get_native_uri (GFile *file)
{
char *path;
@@ -811,7 +811,7 @@ file_get_native_uri (GFile *file)
}
static void
file_uri_serializer (GdkContentSerializer *serializer)
gdk_content_serializer_file_uri (GdkContentSerializer *serializer)
{
GFile *file;
GString *str;
@@ -826,7 +826,7 @@ file_uri_serializer (GdkContentSerializer *serializer)
file = g_value_get_object (gdk_content_serializer_get_value (serializer));
if (file)
{
uri = file_get_native_uri (file);
uri = gdk_file_get_native_uri (file);
g_string_append (str, uri);
g_free (uri);
}
@@ -842,7 +842,7 @@ file_uri_serializer (GdkContentSerializer *serializer)
for (l = g_value_get_boxed (value); l; l = l->next)
{
uri = file_get_native_uri (l->data);
uri = gdk_file_get_native_uri (l->data);
g_string_append (str, uri);
g_free (uri);
g_string_append (str, "\r\n");
@@ -854,13 +854,13 @@ file_uri_serializer (GdkContentSerializer *serializer)
str->len,
gdk_content_serializer_get_priority (serializer),
gdk_content_serializer_get_cancellable (serializer),
file_serializer_finish,
gdk_content_serializer_file_finish,
serializer);
gdk_content_serializer_set_task_data (serializer, g_string_free (str, FALSE), g_free);
}
static void
file_text_serializer (GdkContentSerializer *serializer)
gdk_content_serializer_file_text (GdkContentSerializer *serializer)
{
const GValue *value;
char *path = NULL;
@@ -906,15 +906,15 @@ file_text_serializer (GdkContentSerializer *serializer)
strlen (path),
gdk_content_serializer_get_priority (serializer),
gdk_content_serializer_get_cancellable (serializer),
file_serializer_finish,
gdk_content_serializer_file_finish,
serializer);
gdk_content_serializer_set_task_data (serializer, path, g_free);
}
static void
color_serializer_finish (GObject *source,
GAsyncResult *result,
gpointer serializer)
gdk_content_serializer_color_finish (GObject *source,
GAsyncResult *result,
gpointer serializer)
{
GOutputStream *stream = G_OUTPUT_STREAM (source);
GError *error = NULL;
@@ -926,7 +926,7 @@ color_serializer_finish (GObject *source,
}
static void
color_serializer (GdkContentSerializer *serializer)
gdk_content_serializer_color (GdkContentSerializer *serializer)
{
const GValue *value;
GdkRGBA *rgba;
@@ -948,13 +948,13 @@ color_serializer (GdkContentSerializer *serializer)
4 * sizeof (guint16),
gdk_content_serializer_get_priority (serializer),
gdk_content_serializer_get_cancellable (serializer),
color_serializer_finish,
gdk_content_serializer_color_finish,
serializer);
gdk_content_serializer_set_task_data (serializer, data, g_free);
}
static void
init (void)
gdk_content_serializers_init (void)
{
static gboolean initialized = FALSE;
GSList *formats, *f;
@@ -967,17 +967,17 @@ init (void)
gdk_content_register_serializer (GDK_TYPE_TEXTURE,
"image/png",
texture_serializer,
gdk_content_serializer_texture,
NULL, NULL);
gdk_content_register_serializer (GDK_TYPE_TEXTURE,
"image/tiff",
texture_serializer,
gdk_content_serializer_texture,
NULL, NULL);
gdk_content_register_serializer (GDK_TYPE_TEXTURE,
"image/jpeg",
texture_serializer,
gdk_content_serializer_texture,
NULL, NULL);
formats = gdk_pixbuf_get_formats ();
@@ -1001,12 +1001,12 @@ init (void)
!g_str_equal (name, "jpeg"))
gdk_content_register_serializer (GDK_TYPE_TEXTURE,
*m,
pixbuf_serializer,
gdk_content_serializer_pixbuf,
gdk_pixbuf_format_get_name (fmt),
g_free);
gdk_content_register_serializer (GDK_TYPE_PIXBUF,
*m,
pixbuf_serializer,
gdk_content_serializer_pixbuf,
gdk_pixbuf_format_get_name (fmt),
g_free);
}
@@ -1022,29 +1022,29 @@ init (void)
gdk_content_register_serializer (G_TYPE_FILE,
"text/uri-list",
file_uri_serializer,
gdk_content_serializer_file_uri,
NULL,
NULL);
gdk_content_register_serializer (G_TYPE_FILE,
"text/plain;charset=utf-8",
file_text_serializer,
gdk_content_serializer_file_text,
NULL,
NULL);
gdk_content_register_serializer (GDK_TYPE_FILE_LIST,
"text/uri-list",
file_uri_serializer,
gdk_content_serializer_file_uri,
NULL,
NULL);
gdk_content_register_serializer (GDK_TYPE_FILE_LIST,
"text/plain;charset=utf-8",
file_text_serializer,
gdk_content_serializer_file_text,
NULL,
NULL);
gdk_content_register_serializer (G_TYPE_STRING,
"text/plain;charset=utf-8",
string_serializer,
gdk_content_serializer_string,
(gpointer) "utf-8",
NULL);
if (!g_get_charset (&charset))
@@ -1052,21 +1052,20 @@ init (void)
char *mime = g_strdup_printf ("text/plain;charset=%s", charset);
gdk_content_register_serializer (G_TYPE_STRING,
mime,
string_serializer,
gdk_content_serializer_string,
(gpointer) charset,
NULL);
g_free (mime);
}
gdk_content_register_serializer (G_TYPE_STRING,
"text/plain",
string_serializer,
gdk_content_serializer_string,
(gpointer) "ASCII",
NULL);
gdk_content_register_serializer (GDK_TYPE_RGBA,
"application/x-color",
color_serializer,
gdk_content_serializer_color,
NULL,
NULL);
}
+29 -29
View File
@@ -75,12 +75,12 @@
*/
enum {
PROP_0,
PROP_FALLBACK,
PROP_HOTSPOT_X,
PROP_HOTSPOT_Y,
PROP_NAME,
PROP_TEXTURE,
GDK_CURSOR_PROP_0,
GDK_CURSOR_PROP_FALLBACK,
GDK_CURSOR_PROP_HOTSPOT_X,
GDK_CURSOR_PROP_HOTSPOT_Y,
GDK_CURSOR_PROP_NAME,
GDK_CURSOR_PROP_TEXTURE,
};
G_DEFINE_TYPE (GdkCursor, gdk_cursor, G_TYPE_OBJECT)
@@ -95,19 +95,19 @@ gdk_cursor_get_property (GObject *object,
switch (prop_id)
{
case PROP_FALLBACK:
case GDK_CURSOR_PROP_FALLBACK:
g_value_set_object (value, cursor->fallback);
break;
case PROP_HOTSPOT_X:
case GDK_CURSOR_PROP_HOTSPOT_X:
g_value_set_int (value, cursor->hotspot_x);
break;
case PROP_HOTSPOT_Y:
case GDK_CURSOR_PROP_HOTSPOT_Y:
g_value_set_int (value, cursor->hotspot_y);
break;
case PROP_NAME:
case GDK_CURSOR_PROP_NAME:
g_value_set_string (value, cursor->name);
break;
case PROP_TEXTURE:
case GDK_CURSOR_PROP_TEXTURE:
g_value_set_object (value, cursor->texture);
break;
default:
@@ -126,19 +126,19 @@ gdk_cursor_set_property (GObject *object,
switch (prop_id)
{
case PROP_FALLBACK:
case GDK_CURSOR_PROP_FALLBACK:
cursor->fallback = g_value_dup_object (value);
break;
case PROP_HOTSPOT_X:
case GDK_CURSOR_PROP_HOTSPOT_X:
cursor->hotspot_x = g_value_get_int (value);
break;
case PROP_HOTSPOT_Y:
case GDK_CURSOR_PROP_HOTSPOT_Y:
cursor->hotspot_y = g_value_get_int (value);
break;
case PROP_NAME:
case GDK_CURSOR_PROP_NAME:
cursor->name = g_value_dup_string (value);
break;
case PROP_TEXTURE:
case GDK_CURSOR_PROP_TEXTURE:
cursor->texture = g_value_dup_object (value);
break;
default:
@@ -172,50 +172,50 @@ gdk_cursor_class_init (GdkCursorClass *cursor_class)
object_class->finalize = gdk_cursor_finalize;
/**
* GdkCursor:fallback: (attributes org.gtk.Property.get=gdk_cursor_get_fallback)
* GdkCursor:fallback:
*
* Cursor to fall back to if this cursor cannot be displayed.
*/
g_object_class_install_property (object_class,
PROP_FALLBACK,
GDK_CURSOR_PROP_FALLBACK,
g_param_spec_object ("fallback", NULL, NULL,
GDK_TYPE_CURSOR,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
/**
* GdkCursor:hotspot-x: (attributes org.gtk.Property.get=gdk_cursor_get_hotspot_x)
* GdkCursor:hotspot-x:
*
* X position of the cursor hotspot in the cursor image.
*/
g_object_class_install_property (object_class,
PROP_HOTSPOT_X,
GDK_CURSOR_PROP_HOTSPOT_X,
g_param_spec_int ("hotspot-x", NULL, NULL,
0, G_MAXINT, 0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
/**
* GdkCursor:hotspot-y: (attributes org.gtk.Property.get=gdk_cursor_get_hotspot_y)
* GdkCursor:hotspot-y:
*
* Y position of the cursor hotspot in the cursor image.
*/
g_object_class_install_property (object_class,
PROP_HOTSPOT_Y,
GDK_CURSOR_PROP_HOTSPOT_Y,
g_param_spec_int ("hotspot-y", NULL, NULL,
0, G_MAXINT, 0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
/**
* GdkCursor:name: (attributes org.gtk.Property.get=gdk_cursor_get_name)
* GdkCursor:name:
*
* Name of this this cursor.
*
* The name will be %NULL if the cursor was created from a texture.
*/
g_object_class_install_property (object_class,
PROP_NAME,
GDK_CURSOR_PROP_NAME,
g_param_spec_string ("name", NULL, NULL,
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
@@ -229,7 +229,7 @@ gdk_cursor_class_init (GdkCursorClass *cursor_class)
* The texture will be %NULL if the cursor was created from a name.
*/
g_object_class_install_property (object_class,
PROP_TEXTURE,
GDK_CURSOR_PROP_TEXTURE,
g_param_spec_object ("texture", NULL, NULL,
GDK_TYPE_TEXTURE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
@@ -407,7 +407,7 @@ gdk_cursor_new_from_callback (GdkCursorGetTextureCallback callback,
}
/**
* gdk_cursor_get_fallback: (attributes org.gtk.Method.get_property=fallback)
* gdk_cursor_get_fallback:
* @cursor: a `GdkCursor`
*
* Returns the fallback for this @cursor.
@@ -430,7 +430,7 @@ gdk_cursor_get_fallback (GdkCursor *cursor)
}
/**
* gdk_cursor_get_name: (attributes org.gtk.Method.get_property=name)
* gdk_cursor_get_name:
* @cursor: a `GdkCursor`
*
* Returns the name of the cursor.
@@ -468,7 +468,7 @@ gdk_cursor_get_texture (GdkCursor *cursor)
}
/**
* gdk_cursor_get_hotspot_x: (attributes org.gtk.Method.get_property=hotspot-x)
* gdk_cursor_get_hotspot_x:
* @cursor: a `GdkCursor`
*
* Returns the horizontal offset of the hotspot.
@@ -490,7 +490,7 @@ gdk_cursor_get_hotspot_x (GdkCursor *cursor)
}
/**
* gdk_cursor_get_hotspot_y: (attributes org.gtk.Method.get_property=hotspot-y)
* gdk_cursor_get_hotspot_y:
* @cursor: a `GdkCursor`
*
* Returns the vertical offset of the hotspot.
+25 -15
View File
@@ -44,29 +44,38 @@ typedef enum {
GDK_DEBUG_HDR = 1 << 14,
GDK_DEBUG_PORTALS = 1 << 15,
GDK_DEBUG_NO_PORTALS = 1 << 16,
GDK_DEBUG_GL_DISABLE = 1 << 17,
GDK_DEBUG_GL_NO_FRACTIONAL= 1 << 18,
GDK_DEBUG_FORCE_OFFLOAD = 1 << 19,
GDK_DEBUG_GL_DISABLE_GL = 1 << 20,
GDK_DEBUG_GL_DISABLE_GLES = 1 << 21,
GDK_DEBUG_GL_PREFER_GL = 1 << 22,
GDK_DEBUG_GL_DEBUG = 1 << 23,
GDK_DEBUG_GL_EGL = 1 << 24,
GDK_DEBUG_GL_GLX = 1 << 25,
GDK_DEBUG_GL_WGL = 1 << 26,
GDK_DEBUG_VULKAN_DISABLE = 1 << 27,
GDK_DEBUG_DEFAULT_SETTINGS= 1 << 28,
GDK_DEBUG_HIGH_DEPTH = 1 << 29,
GDK_DEBUG_NO_VSYNC = 1 << 30,
GDK_DEBUG_DMABUF_DISABLE = 1 << 31,
GDK_DEBUG_GL_NO_FRACTIONAL= 1 << 17,
GDK_DEBUG_FORCE_OFFLOAD = 1 << 18,
GDK_DEBUG_GL_PREFER_GL = 1 << 19,
GDK_DEBUG_GL_DEBUG = 1 << 20,
GDK_DEBUG_DEFAULT_SETTINGS= 1 << 21,
GDK_DEBUG_HIGH_DEPTH = 1 << 22,
GDK_DEBUG_NO_VSYNC = 1 << 23,
} GdkDebugFlags;
typedef enum {
GDK_FEATURE_OPENGL = 1 << 0,
GDK_FEATURE_GL_API = 1 << 1,
GDK_FEATURE_GLES_API = 1 << 2,
GDK_FEATURE_EGL = 1 << 3,
GDK_FEATURE_GLX = 1 << 4,
GDK_FEATURE_WGL = 1 << 5,
GDK_FEATURE_VULKAN = 1 << 6,
GDK_FEATURE_DMABUF = 1 << 7,
GDK_FEATURE_OFFLOAD = 1 << 8,
GDK_FEATURE_COLOR_MANAGEMENT = 1 << 9,
} GdkFeatures;
#define GDK_ALL_FEATURES ((1 << 10) - 1)
extern guint _gdk_debug_flags;
GdkDebugFlags gdk_display_get_debug_flags (GdkDisplay *display);
void gdk_display_set_debug_flags (GdkDisplay *display,
GdkDebugFlags flags);
gboolean gdk_has_feature (GdkFeatures feature);
static inline void
gdk_debug_message (const char *format, ...) G_GNUC_PRINTF(1, 2);
static inline void
@@ -106,6 +115,7 @@ typedef struct
} GdkDebugKey;
guint gdk_parse_debug_var (const char *variable,
const char *docs,
const GdkDebugKey *keys,
guint nkeys);
+97 -97
View File
@@ -48,12 +48,12 @@ struct _GdkAxisInfo
};
enum {
CHANGED,
TOOL_CHANGED,
LAST_SIGNAL
GDK_DEVICE_CHANGED,
GDK_DEVICE_TOOL_CHANGED,
GDK_DEVICE_LAST_SIGNAL
};
static guint signals [LAST_SIGNAL] = { 0 };
static guint gdk_device_signals[GDK_DEVICE_LAST_SIGNAL] = { 0 };
static void gdk_device_finalize (GObject *object);
@@ -71,27 +71,27 @@ static void gdk_device_get_property (GObject *object,
G_DEFINE_ABSTRACT_TYPE (GdkDevice, gdk_device, G_TYPE_OBJECT)
enum {
PROP_0,
PROP_DISPLAY,
PROP_NAME,
PROP_SOURCE,
PROP_HAS_CURSOR,
PROP_N_AXES,
PROP_VENDOR_ID,
PROP_PRODUCT_ID,
PROP_SEAT,
PROP_NUM_TOUCHES,
PROP_TOOL,
PROP_DIRECTION,
PROP_HAS_BIDI_LAYOUTS,
PROP_CAPS_LOCK_STATE,
PROP_NUM_LOCK_STATE,
PROP_SCROLL_LOCK_STATE,
PROP_MODIFIER_STATE,
LAST_PROP
GDK_DEVICE_PROP_0,
GDK_DEVICE_PROP_DISPLAY,
GDK_DEVICE_PROP_NAME,
GDK_DEVICE_PROP_SOURCE,
GDK_DEVICE_PROP_HAS_CURSOR,
GDK_DEVICE_PROP_N_AXES,
GDK_DEVICE_PROP_VENDOR_ID,
GDK_DEVICE_PROP_PRODUCT_ID,
GDK_DEVICE_PROP_SEAT,
GDK_DEVICE_PROP_NUM_TOUCHES,
GDK_DEVICE_PROP_TOOL,
GDK_DEVICE_PROP_DIRECTION,
GDK_DEVICE_PROP_HAS_BIDI_LAYOUTS,
GDK_DEVICE_PROP_CAPS_LOCK_STATE,
GDK_DEVICE_PROP_NUM_LOCK_STATE,
GDK_DEVICE_PROP_SCROLL_LOCK_STATE,
GDK_DEVICE_PROP_MODIFIER_STATE,
GDK_DEVICE_LAST_PROP
};
static GParamSpec *device_props[LAST_PROP] = { NULL, };
static GParamSpec *gdk_device_properties[GDK_DEVICE_LAST_PROP] = { NULL, };
static void
gdk_device_class_init (GdkDeviceClass *klass)
@@ -104,32 +104,32 @@ gdk_device_class_init (GdkDeviceClass *klass)
object_class->get_property = gdk_device_get_property;
/**
* GdkDevice:display: (attributes org.gtk.Property.get=gdk_device_get_display)
* GdkDevice:display:
*
* The `GdkDisplay` the `GdkDevice` pertains to.
*/
device_props[PROP_DISPLAY] =
gdk_device_properties[GDK_DEVICE_PROP_DISPLAY] =
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:name: (attributes org.gtk.Property.get=gdk_device_get_name)
* GdkDevice:name:
*
* The device name.
*/
device_props[PROP_NAME] =
gdk_device_properties[GDK_DEVICE_PROP_NAME] =
g_param_spec_string ("name", NULL, NULL,
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:source: (attributes org.gtk.Property.get=gdk_device_get_source)
* GdkDevice:source:
*
* Source type for the device.
*/
device_props[PROP_SOURCE] =
gdk_device_properties[GDK_DEVICE_PROP_SOURCE] =
g_param_spec_enum ("source", NULL, NULL,
GDK_TYPE_INPUT_SOURCE,
GDK_SOURCE_MOUSE,
@@ -137,11 +137,11 @@ gdk_device_class_init (GdkDeviceClass *klass)
G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDevice:has-cursor: (attributes org.gtk.Property.get=gdk_device_get_has_cursor)
* GdkDevice:has-cursor:
*
* Whether the device is represented by a cursor on the screen.
*/
device_props[PROP_HAS_CURSOR] =
gdk_device_properties[GDK_DEVICE_PROP_HAS_CURSOR] =
g_param_spec_boolean ("has-cursor", NULL, NULL,
FALSE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
@@ -152,58 +152,58 @@ gdk_device_class_init (GdkDeviceClass *klass)
*
* Number of axes in the device.
*/
device_props[PROP_N_AXES] =
gdk_device_properties[GDK_DEVICE_PROP_N_AXES] =
g_param_spec_uint ("n-axes", NULL, NULL,
0, G_MAXUINT,
0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:vendor-id: (attributes org.gtk.Property.get=gdk_device_get_vendor_id)
* GdkDevice:vendor-id:
*
* Vendor ID of this device.
*
* See [method@Gdk.Device.get_vendor_id].
*/
device_props[PROP_VENDOR_ID] =
gdk_device_properties[GDK_DEVICE_PROP_VENDOR_ID] =
g_param_spec_string ("vendor-id", NULL, NULL,
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:product-id: (attributes org.gtk.Property.get=gdk_device_get_product_id)
* GdkDevice:product-id:
*
* Product ID of this device.
*
* See [method@Gdk.Device.get_product_id].
*/
device_props[PROP_PRODUCT_ID] =
gdk_device_properties[GDK_DEVICE_PROP_PRODUCT_ID] =
g_param_spec_string ("product-id", NULL, NULL,
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:seat: (attributes org.gtk.Property.get=gdk_device_get_seat)
* GdkDevice:seat:
*
* `GdkSeat` of this device.
*/
device_props[PROP_SEAT] =
gdk_device_properties[GDK_DEVICE_PROP_SEAT] =
g_param_spec_object ("seat", NULL, NULL,
GDK_TYPE_SEAT,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:num-touches: (attributes org.gtk.Property.get=gdk_device_get_num_touches)
* GdkDevice:num-touches:
*
* The maximal number of concurrent touches on a touch device.
*
* Will be 0 if the device is not a touch device or if the number
* of touches is unknown.
*/
device_props[PROP_NUM_TOUCHES] =
gdk_device_properties[GDK_DEVICE_PROP_NUM_TOUCHES] =
g_param_spec_uint ("num-touches", NULL, NULL,
0, G_MAXUINT,
0,
@@ -211,89 +211,89 @@ gdk_device_class_init (GdkDeviceClass *klass)
G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:tool: (attributes org.gtk.Property.get=gdk_device_get_device_tool)
* GdkDevice:tool: (getter get_device_tool)
*
* The `GdkDeviceTool` that is currently used with this device.
*/
device_props[PROP_TOOL] =
gdk_device_properties[GDK_DEVICE_PROP_TOOL] =
g_param_spec_object ("tool", NULL, NULL,
GDK_TYPE_DEVICE_TOOL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:direction: (attributes org.gtk.Property.get=gdk_device_get_direction)
* GdkDevice:direction:
*
* The direction of the current layout.
*
* This is only relevant for keyboard devices.
*/
device_props[PROP_DIRECTION] =
gdk_device_properties[GDK_DEVICE_PROP_DIRECTION] =
g_param_spec_enum ("direction", NULL, NULL,
PANGO_TYPE_DIRECTION, PANGO_DIRECTION_NEUTRAL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:has-bidi-layouts: (attributes org.gtk.Property.get=gdk_device_has_bidi_layouts)
* GdkDevice:has-bidi-layouts:
*
* Whether the device has both right-to-left and left-to-right layouts.
*
* This is only relevant for keyboard devices.
*/
device_props[PROP_HAS_BIDI_LAYOUTS] =
gdk_device_properties[GDK_DEVICE_PROP_HAS_BIDI_LAYOUTS] =
g_param_spec_boolean ("has-bidi-layouts", NULL, NULL,
FALSE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:caps-lock-state: (attributes org.gtk.Property.get=gdk_device_get_caps_lock_state)
* GdkDevice:caps-lock-state:
*
* Whether Caps Lock is on.
*
* This is only relevant for keyboard devices.
*/
device_props[PROP_CAPS_LOCK_STATE] =
gdk_device_properties[GDK_DEVICE_PROP_CAPS_LOCK_STATE] =
g_param_spec_boolean ("caps-lock-state", NULL, NULL,
FALSE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:num-lock-state: (attributes org.gtk.Property.get=gdk_device_get_num_lock_state)
* GdkDevice:num-lock-state:
*
* Whether Num Lock is on.
*
* This is only relevant for keyboard devices.
*/
device_props[PROP_NUM_LOCK_STATE] =
gdk_device_properties[GDK_DEVICE_PROP_NUM_LOCK_STATE] =
g_param_spec_boolean ("num-lock-state", NULL, NULL,
FALSE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:scroll-lock-state: (attributes org.gtk.Property.get=gdk_device_get_scroll_lock_state)
* GdkDevice:scroll-lock-state:
*
* Whether Scroll Lock is on.
*
* This is only relevant for keyboard devices.
*/
device_props[PROP_SCROLL_LOCK_STATE] =
gdk_device_properties[GDK_DEVICE_PROP_SCROLL_LOCK_STATE] =
g_param_spec_boolean ("scroll-lock-state", NULL, NULL,
FALSE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDevice:modifier-state: (attributes org.gtk.Property.get=gdk_device_get_modifier_state)
* GdkDevice:modifier-state:
*
* The current modifier state of the device.
*
* This is only relevant for keyboard devices.
*/
device_props[PROP_MODIFIER_STATE] =
gdk_device_properties[GDK_DEVICE_PROP_MODIFIER_STATE] =
g_param_spec_flags ("modifier-state", NULL, NULL,
GDK_TYPE_MODIFIER_TYPE,
GDK_NO_MODIFIER_MASK,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, LAST_PROP, device_props);
g_object_class_install_properties (object_class, GDK_DEVICE_LAST_PROP, gdk_device_properties);
/**
* GdkDevice::changed:
@@ -307,7 +307,7 @@ gdk_device_class_init (GdkDeviceClass *klass)
* that case the logical device will change to reflect the axes
* and keys on the new physical device.
*/
signals[CHANGED] =
gdk_device_signals[GDK_DEVICE_CHANGED] =
g_signal_new (g_intern_static_string ("changed"),
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
@@ -322,7 +322,7 @@ gdk_device_class_init (GdkDeviceClass *klass)
*
* Emitted on pen/eraser devices whenever tools enter or leave proximity.
*/
signals[TOOL_CHANGED] =
gdk_device_signals[GDK_DEVICE_TOOL_CHANGED] =
g_signal_new (g_intern_static_string ("tool-changed"),
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
@@ -389,30 +389,30 @@ gdk_device_set_property (GObject *object,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_DEVICE_PROP_DISPLAY:
device->display = g_value_get_object (value);
break;
case PROP_NAME:
case GDK_DEVICE_PROP_NAME:
g_free (device->name);
device->name = g_value_dup_string (value);
break;
case PROP_SOURCE:
case GDK_DEVICE_PROP_SOURCE:
device->source = g_value_get_enum (value);
break;
case PROP_HAS_CURSOR:
case GDK_DEVICE_PROP_HAS_CURSOR:
device->has_cursor = g_value_get_boolean (value);
break;
case PROP_VENDOR_ID:
case GDK_DEVICE_PROP_VENDOR_ID:
device->vendor_id = g_value_dup_string (value);
break;
case PROP_PRODUCT_ID:
case GDK_DEVICE_PROP_PRODUCT_ID:
device->product_id = g_value_dup_string (value);
break;
case PROP_SEAT:
case GDK_DEVICE_PROP_SEAT:
device->seat = g_value_get_object (value);
break;
case PROP_NUM_TOUCHES:
case GDK_DEVICE_PROP_NUM_TOUCHES:
device->num_touches = g_value_get_uint (value);
break;
default:
@@ -431,52 +431,52 @@ gdk_device_get_property (GObject *object,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_DEVICE_PROP_DISPLAY:
g_value_set_object (value, device->display);
break;
case PROP_NAME:
case GDK_DEVICE_PROP_NAME:
g_value_set_string (value, device->name);
break;
case PROP_SOURCE:
case GDK_DEVICE_PROP_SOURCE:
g_value_set_enum (value, device->source);
break;
case PROP_HAS_CURSOR:
case GDK_DEVICE_PROP_HAS_CURSOR:
g_value_set_boolean (value, device->has_cursor);
break;
case PROP_N_AXES:
case GDK_DEVICE_PROP_N_AXES:
g_value_set_uint (value, device->axes->len);
break;
case PROP_VENDOR_ID:
case GDK_DEVICE_PROP_VENDOR_ID:
g_value_set_string (value, device->vendor_id);
break;
case PROP_PRODUCT_ID:
case GDK_DEVICE_PROP_PRODUCT_ID:
g_value_set_string (value, device->product_id);
break;
case PROP_SEAT:
case GDK_DEVICE_PROP_SEAT:
g_value_set_object (value, device->seat);
break;
case PROP_NUM_TOUCHES:
case GDK_DEVICE_PROP_NUM_TOUCHES:
g_value_set_uint (value, device->num_touches);
break;
case PROP_TOOL:
case GDK_DEVICE_PROP_TOOL:
g_value_set_object (value, device->last_tool);
break;
case PROP_DIRECTION:
case GDK_DEVICE_PROP_DIRECTION:
g_value_set_enum (value, gdk_device_get_direction (device));
break;
case PROP_HAS_BIDI_LAYOUTS:
case GDK_DEVICE_PROP_HAS_BIDI_LAYOUTS:
g_value_set_boolean (value, gdk_device_has_bidi_layouts (device));
break;
case PROP_CAPS_LOCK_STATE:
case GDK_DEVICE_PROP_CAPS_LOCK_STATE:
g_value_set_boolean (value, gdk_device_get_caps_lock_state (device));
break;
case PROP_NUM_LOCK_STATE:
case GDK_DEVICE_PROP_NUM_LOCK_STATE:
g_value_set_boolean (value, gdk_device_get_num_lock_state (device));
break;
case PROP_SCROLL_LOCK_STATE:
case GDK_DEVICE_PROP_SCROLL_LOCK_STATE:
g_value_set_boolean (value, gdk_device_get_scroll_lock_state (device));
break;
case PROP_MODIFIER_STATE:
case GDK_DEVICE_PROP_MODIFIER_STATE:
g_value_set_flags (value, gdk_device_get_modifier_state (device));
break;
default:
@@ -540,7 +540,7 @@ gdk_device_get_name (GdkDevice *device)
}
/**
* gdk_device_get_has_cursor: (attributes org.gtk.Method.get_property=has-cursor)
* gdk_device_get_has_cursor:
* @device: a `GdkDevice`
*
* Determines whether the pointer follows device motion.
@@ -559,7 +559,7 @@ gdk_device_get_has_cursor (GdkDevice *device)
}
/**
* gdk_device_get_source: (attributes org.gtk.Method.get_property=source)
* gdk_device_get_source:
* @device: a `GdkDevice`
*
* Determines the type of the device.
@@ -599,7 +599,7 @@ gdk_device_get_axis_use (GdkDevice *device,
}
/**
* gdk_device_get_display: (attributes org.gtk.Method.get_property=display)
* gdk_device_get_display:
* @device: a `GdkDevice`
*
* Returns the `GdkDisplay` to which @device pertains.
@@ -806,7 +806,7 @@ _gdk_device_reset_axes (GdkDevice *device)
for (i = device->axes->len - 1; i >= 0; i--)
g_array_remove_index (device->axes, i);
g_object_notify_by_pspec (G_OBJECT (device), device_props[PROP_N_AXES]);
g_object_notify_by_pspec (G_OBJECT (device), gdk_device_properties[GDK_DEVICE_PROP_N_AXES]);
}
guint
@@ -845,7 +845,7 @@ _gdk_device_add_axis (GdkDevice *device,
device->axes = g_array_append_val (device->axes, axis_info);
pos = device->axes->len - 1;
g_object_notify_by_pspec (G_OBJECT (device), device_props[PROP_N_AXES]);
g_object_notify_by_pspec (G_OBJECT (device), gdk_device_properties[GDK_DEVICE_PROP_N_AXES]);
return pos;
}
@@ -1082,7 +1082,7 @@ _gdk_device_surface_at_position (GdkDevice *device,
}
/**
* gdk_device_get_vendor_id: (attributes org.gtk.Method.get_property=vendor-id)
* gdk_device_get_vendor_id:
* @device: a physical `GdkDevice`
*
* Returns the vendor ID of this device.
@@ -1124,7 +1124,7 @@ gdk_device_get_vendor_id (GdkDevice *device)
}
/**
* gdk_device_get_product_id: (attributes org.gtk.Method.get_property=product-id)
* gdk_device_get_product_id:
* @device: a physical `GdkDevice`
*
* Returns the product ID of this device.
@@ -1157,7 +1157,7 @@ gdk_device_set_seat (GdkDevice *device,
}
/**
* gdk_device_get_seat: (attributes org.gtk.Method.get_property=seat)
* gdk_device_get_seat:
* @device: A `GdkDevice`
*
* Returns the `GdkSeat` the device belongs to.
@@ -1181,7 +1181,7 @@ gdk_device_update_tool (GdkDevice *device,
if (g_set_object (&device->last_tool, tool))
{
g_object_notify (G_OBJECT (device), "tool");
g_signal_emit (device, signals[TOOL_CHANGED], 0, tool);
g_signal_emit (device, gdk_device_signals[GDK_DEVICE_TOOL_CHANGED], 0, tool);
}
}
@@ -1202,7 +1202,7 @@ gdk_device_get_num_touches (GdkDevice *device)
}
/**
* gdk_device_get_device_tool: (attributes org.gtk.Method.get_property=tool)
* gdk_device_get_device_tool: (get-property tool)
* @device: a `GdkDevice`
*
* Retrieves the current tool for @device.
@@ -1218,7 +1218,7 @@ gdk_device_get_device_tool (GdkDevice *device)
}
/**
* gdk_device_get_caps_lock_state: (attributes org.gtk.Method.get_property=caps-lock-state)
* gdk_device_get_caps_lock_state:
* @device: a `GdkDevice`
*
* Retrieves whether the Caps Lock modifier of the keyboard is locked.
@@ -1239,7 +1239,7 @@ gdk_device_get_caps_lock_state (GdkDevice *device)
}
/**
* gdk_device_get_num_lock_state: (attributes org.gtk.Method.get_property=num-lock-state)
* gdk_device_get_num_lock_state:
* @device: a ``GdkDevice`
*
* Retrieves whether the Num Lock modifier of the keyboard is locked.
@@ -1260,7 +1260,7 @@ gdk_device_get_num_lock_state (GdkDevice *device)
}
/**
* gdk_device_get_scroll_lock_state: (attributes org.gtk.Method.get_property=scroll-lock-state)
* gdk_device_get_scroll_lock_state:
* @device: a `GdkDevice`
*
* Retrieves whether the Scroll Lock modifier of the keyboard is locked.
@@ -1281,7 +1281,7 @@ gdk_device_get_scroll_lock_state (GdkDevice *device)
}
/**
* gdk_device_get_modifier_state: (attributes org.gtk.Method.get_property=modifier-state)
* gdk_device_get_modifier_state:
* @device: a `GdkDevice`
*
* Retrieves the current modifier state of the keyboard.
@@ -1302,7 +1302,7 @@ gdk_device_get_modifier_state (GdkDevice *device)
}
/**
* gdk_device_get_direction: (attributes org.gtk.Method.get_property=direction)
* gdk_device_get_direction:
* @device: a `GdkDevice`
*
* Returns the direction of effective layout of the keyboard.
@@ -1328,7 +1328,7 @@ gdk_device_get_direction (GdkDevice *device)
}
/**
* gdk_device_has_bidi_layouts: (attributes org.gtk.Method.get_property=has-bidi-layouts)
* gdk_device_has_bidi_layouts:
* @device: a `GdkDevice`
*
* Determines if layouts for both right-to-left and
+8 -8
View File
@@ -107,7 +107,7 @@ gdk_device_tool_class_init (GdkDeviceToolClass *klass)
object_class->get_property = gdk_device_tool_get_property;
/**
* GdkDeviceTool:serial: (attributes org.gtk.Property.get=gdk_device_tool_get_serial)
* GdkDeviceTool:serial:
*
* The serial number of the tool.
*/
@@ -118,7 +118,7 @@ gdk_device_tool_class_init (GdkDeviceToolClass *klass)
G_PARAM_STATIC_STRINGS);
/**
* GdkDeviceTool:tool-type: (attributes org.gtk.Property.get=gdk_device_tool_get_tool_type)
* GdkDeviceTool:tool-type:
*
* The type of the tool.
*/
@@ -130,7 +130,7 @@ gdk_device_tool_class_init (GdkDeviceToolClass *klass)
G_PARAM_STATIC_STRINGS);
/**
* GdkDeviceTool:axes: (attributes org.gtk.Property.get=gdk_device_tool_get_axes)
* GdkDeviceTool:axes:
*
* The axes of the tool.
*/
@@ -140,7 +140,7 @@ gdk_device_tool_class_init (GdkDeviceToolClass *klass)
G_PARAM_CONSTRUCT_ONLY);
/**
* GdkDeviceTool:hardware-id: (attributes org.gtk.Property.get=gdk_device_tool_get_hardware_id)
* GdkDeviceTool:hardware-id:
*
* The hardware ID of the tool.
*/
@@ -173,7 +173,7 @@ gdk_device_tool_new (guint64 serial,
}
/**
* gdk_device_tool_get_serial: (attributes org.gtk.Method.get_property=serial)
* gdk_device_tool_get_serial:
* @tool: a `GdkDeviceTool`
*
* Gets the serial number of this tool.
@@ -192,7 +192,7 @@ gdk_device_tool_get_serial (GdkDeviceTool *tool)
}
/**
* gdk_device_tool_get_hardware_id: (attributes org.gtk.Method.get_property=hardware-id)
* gdk_device_tool_get_hardware_id:
* @tool: a `GdkDeviceTool`
*
* Gets the hardware ID of this tool, or 0 if it's not known.
@@ -218,7 +218,7 @@ gdk_device_tool_get_hardware_id (GdkDeviceTool *tool)
}
/**
* gdk_device_tool_get_tool_type: (attributes org.gtk.Method.get_property=tool-type)
* gdk_device_tool_get_tool_type:
* @tool: a `GdkDeviceTool`
*
* Gets the `GdkDeviceToolType` of the tool.
@@ -236,7 +236,7 @@ gdk_device_tool_get_tool_type (GdkDeviceTool *tool)
}
/**
* gdk_device_tool_get_axes: (attributes org.gtk.Method.get_property=axes)
* gdk_device_tool_get_axes:
* @tool: a `GdkDeviceTool`
*
* Gets the axes of the tool.
+55 -55
View File
@@ -74,24 +74,24 @@
enum
{
PROP_0,
PROP_COMPOSITED,
PROP_RGBA,
PROP_SHADOW_WIDTH,
PROP_INPUT_SHAPES,
PROP_DMABUF_FORMATS,
LAST_PROP
GDK_DISPLAY_PROP_0,
GDK_DISPLAY_PROP_COMPOSITED,
GDK_DISPLAY_PROP_RGBA,
GDK_DISPLAY_PROP_SHADOW_WIDTH,
GDK_DISPLAY_PROP_INPUT_SHAPES,
GDK_DISPLAY_PROP_DMABUF_FORMATS,
GDK_DISPLAY_LAST_PROP
};
static GParamSpec *props[LAST_PROP] = { NULL, };
static GParamSpec *gdk_display_properties[GDK_DISPLAY_LAST_PROP] = { NULL, };
enum {
OPENED,
CLOSED,
SEAT_ADDED,
SEAT_REMOVED,
SETTING_CHANGED,
LAST_SIGNAL
GDK_DISPLAY_OPENED,
GDK_DISPLAY_CLOSED,
GDK_DISPLAY_SEAT_ADDED,
GDK_DISPLAY_SEAT_REMOVED,
GDK_DISPLAY_SETTING_CHANGED,
GDK_DISPLAY_LAST_SIGNAL
};
typedef struct _GdkDisplayPrivate GdkDisplayPrivate;
@@ -124,7 +124,7 @@ static void gdk_display_finalize (GObject *object);
static GdkAppLaunchContext *gdk_display_real_get_app_launch_context (GdkDisplay *display);
static guint signals[LAST_SIGNAL] = { 0 };
static guint gdk_display_signals[GDK_DISPLAY_LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE_WITH_PRIVATE (GdkDisplay, gdk_display, G_TYPE_OBJECT)
@@ -138,23 +138,23 @@ gdk_display_get_property (GObject *object,
switch (prop_id)
{
case PROP_COMPOSITED:
case GDK_DISPLAY_PROP_COMPOSITED:
g_value_set_boolean (value, gdk_display_is_composited (display));
break;
case PROP_RGBA:
case GDK_DISPLAY_PROP_RGBA:
g_value_set_boolean (value, gdk_display_is_rgba (display));
break;
case PROP_SHADOW_WIDTH:
case GDK_DISPLAY_PROP_SHADOW_WIDTH:
g_value_set_boolean (value, gdk_display_supports_shadow_width (display));
break;
case PROP_INPUT_SHAPES:
case GDK_DISPLAY_PROP_INPUT_SHAPES:
g_value_set_boolean (value, gdk_display_supports_input_shapes (display));
break;
case PROP_DMABUF_FORMATS:
case GDK_DISPLAY_PROP_DMABUF_FORMATS:
g_value_set_boxed (value, gdk_display_get_dmabuf_formats (display));
break;
@@ -230,60 +230,60 @@ gdk_display_class_init (GdkDisplayClass *class)
class->opened = gdk_display_real_opened;
/**
* GdkDisplay:composited: (attributes org.gtk.Property.get=gdk_display_is_composited)
* GdkDisplay:composited: (getter is_composited)
*
* %TRUE if the display properly composites the alpha channel.
*/
props[PROP_COMPOSITED] =
gdk_display_properties[GDK_DISPLAY_PROP_COMPOSITED] =
g_param_spec_boolean ("composited", NULL, NULL,
TRUE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDisplay:rgba: (attributes org.gtk.Property.get=gdk_display_is_rgba)
* GdkDisplay:rgba: (getter is_rgba)
*
* %TRUE if the display supports an alpha channel.
*/
props[PROP_RGBA] =
gdk_display_properties[GDK_DISPLAY_PROP_RGBA] =
g_param_spec_boolean ("rgba", NULL, NULL,
TRUE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDisplay:shadow-width: (attributes org.gtk.Property.get=gdk_display_supports_shadow_width)
* GdkDisplay:shadow-width: (getter supports_shadow_width)
*
* %TRUE if the display supports extensible frames.
*
* Since: 4.14
*/
props[PROP_SHADOW_WIDTH] =
gdk_display_properties[GDK_DISPLAY_PROP_SHADOW_WIDTH] =
g_param_spec_boolean ("shadow-width", NULL, NULL,
TRUE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDisplay:input-shapes: (attributes org.gtk.Property.get=gdk_display_supports_input_shapes)
* GdkDisplay:input-shapes: (getter supports_input_shapes)
*
* %TRUE if the display supports input shapes.
*/
props[PROP_INPUT_SHAPES] =
gdk_display_properties[GDK_DISPLAY_PROP_INPUT_SHAPES] =
g_param_spec_boolean ("input-shapes", NULL, NULL,
TRUE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkDisplay:dmabuf-formats: (attributes org.gtk.Property.get=gdk_display_get_dmabuf_formats)
* GdkDisplay:dmabuf-formats:
*
* The dma-buf formats that are supported on this display
*
* Since: 4.14
*/
props[PROP_DMABUF_FORMATS] =
gdk_display_properties[GDK_DISPLAY_PROP_DMABUF_FORMATS] =
g_param_spec_boxed ("dmabuf-formats", NULL, NULL,
GDK_TYPE_DMABUF_FORMATS,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, LAST_PROP, props);
g_object_class_install_properties (object_class, GDK_DISPLAY_LAST_PROP, gdk_display_properties);
/**
* GdkDisplay::opened:
@@ -291,7 +291,7 @@ gdk_display_class_init (GdkDisplayClass *class)
*
* Emitted when the connection to the windowing system for @display is opened.
*/
signals[OPENED] =
gdk_display_signals[GDK_DISPLAY_OPENED] =
g_signal_new (g_intern_static_string ("opened"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
@@ -307,7 +307,7 @@ gdk_display_class_init (GdkDisplayClass *class)
*
* Emitted when the connection to the windowing system for @display is closed.
*/
signals[CLOSED] =
gdk_display_signals[GDK_DISPLAY_CLOSED] =
g_signal_new (g_intern_static_string ("closed"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
@@ -325,7 +325,7 @@ gdk_display_class_init (GdkDisplayClass *class)
*
* Emitted whenever a new seat is made known to the windowing system.
*/
signals[SEAT_ADDED] =
gdk_display_signals[GDK_DISPLAY_SEAT_ADDED] =
g_signal_new (g_intern_static_string ("seat-added"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
@@ -340,7 +340,7 @@ gdk_display_class_init (GdkDisplayClass *class)
*
* Emitted whenever a seat is removed by the windowing system.
*/
signals[SEAT_REMOVED] =
gdk_display_signals[GDK_DISPLAY_SEAT_REMOVED] =
g_signal_new (g_intern_static_string ("seat-removed"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
@@ -355,7 +355,7 @@ gdk_display_class_init (GdkDisplayClass *class)
*
* Emitted whenever a setting changes its value.
*/
signals[SETTING_CHANGED] =
gdk_display_signals[GDK_DISPLAY_SETTING_CHANGED] =
g_signal_new (g_intern_static_string ("setting-changed"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
@@ -491,7 +491,7 @@ gdk_display_close (GdkDisplay *display)
{
display->closed = TRUE;
g_signal_emit (display, signals[CLOSED], 0, FALSE);
g_signal_emit (display, gdk_display_signals[GDK_DISPLAY_CLOSED], 0, FALSE);
g_object_run_dispose (G_OBJECT (display));
g_object_unref (display);
@@ -1116,7 +1116,7 @@ gdk_display_get_primary_clipboard (GdkDisplay *display)
}
/**
* gdk_display_supports_input_shapes: (attributes org.gtk.Method.get_property=input-shapes)
* gdk_display_supports_input_shapes: (get-property input-shapes)
* @display: a `GdkDisplay`
*
* Returns %TRUE if the display supports input shapes.
@@ -1151,7 +1151,7 @@ gdk_display_set_input_shapes (GdkDisplay *display,
priv->input_shapes = input_shapes;
g_object_notify_by_pspec (G_OBJECT (display), props[PROP_INPUT_SHAPES]);
g_object_notify_by_pspec (G_OBJECT (display), gdk_display_properties[GDK_DISPLAY_PROP_INPUT_SHAPES]);
}
static GdkAppLaunchContext *
@@ -1309,10 +1309,10 @@ gdk_display_create_vulkan_context (GdkDisplay *self,
g_return_val_if_fail (surface == NULL || GDK_IS_SURFACE (surface), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
if (gdk_display_get_debug_flags (self) & GDK_DEBUG_VULKAN_DISABLE)
if (!gdk_has_feature (GDK_FEATURE_VULKAN))
{
g_set_error_literal (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_NOT_AVAILABLE,
_("Vulkan support disabled via GDK_DEBUG"));
_("Vulkan support disabled via GDK_DISABLE"));
return NULL;
}
@@ -1362,11 +1362,11 @@ gdk_display_init_gl (GdkDisplay *self)
before = GDK_PROFILER_CURRENT_TIME;
if (gdk_display_get_debug_flags (self) & GDK_DEBUG_GL_DISABLE)
if (!gdk_has_feature (GDK_FEATURE_OPENGL))
{
g_set_error_literal (&priv->gl_error, GDK_GL_ERROR,
GDK_GL_ERROR_NOT_AVAILABLE,
_("GL support disabled via GDK_DEBUG"));
_("OpenGL support disabled via GDK_DISABLE"));
return;
}
@@ -1477,7 +1477,7 @@ gdk_display_create_gl_context (GdkDisplay *self,
if (!gdk_display_prepare_gl (self, error))
return NULL;
return gdk_gl_context_new (self, NULL);
return gdk_gl_context_new (self, NULL, FALSE);
}
/*< private >
@@ -2006,7 +2006,7 @@ gdk_display_init_dmabuf (GdkDisplay *self)
builder = gdk_dmabuf_formats_builder_new ();
#ifdef HAVE_DMABUF
if (!GDK_DISPLAY_DEBUG_CHECK (self, DMABUF_DISABLE))
if (gdk_has_feature (GDK_FEATURE_DMABUF))
{
#ifdef GDK_RENDERING_VULKAN
gdk_display_add_dmabuf_downloader (self, gdk_vulkan_get_dmabuf_downloader (self, builder));
@@ -2075,7 +2075,7 @@ gdk_display_set_debug_flags (GdkDisplay *display,
}
/**
* gdk_display_is_composited: (attributes org.gtk.Method.get_property=composited)
* gdk_display_is_composited: (get-property composited)
* @display: a `GdkDisplay`
*
* Returns whether surfaces can reasonably be expected to have
@@ -2116,11 +2116,11 @@ gdk_display_set_composited (GdkDisplay *display,
priv->composited = composited;
g_object_notify_by_pspec (G_OBJECT (display), props[PROP_COMPOSITED]);
g_object_notify_by_pspec (G_OBJECT (display), gdk_display_properties[GDK_DISPLAY_PROP_COMPOSITED]);
}
/**
* gdk_display_is_rgba: (attributes org.gtk.Method.get_property=rgba)
* gdk_display_is_rgba: (get-property rgba)
* @display: a `GdkDisplay`
*
* Returns whether surfaces on this @display are created with an
@@ -2161,11 +2161,11 @@ gdk_display_set_rgba (GdkDisplay *display,
priv->rgba = rgba;
g_object_notify_by_pspec (G_OBJECT (display), props[PROP_RGBA]);
g_object_notify_by_pspec (G_OBJECT (display), gdk_display_properties[GDK_DISPLAY_PROP_RGBA]);
}
/**
* gdk_display_supports_shadow_width: (attributes org.gtk.Method.get_property=shadow-width)
* gdk_display_supports_shadow_width: (get-property shadow-width)
* @display: a `GdkDisplay`
*
* Returns whether it's possible for a surface to draw outside of the window area.
@@ -2201,7 +2201,7 @@ gdk_display_set_shadow_width (GdkDisplay *display,
priv->shadow_width = shadow_width;
g_object_notify_by_pspec (G_OBJECT (display), props[PROP_SHADOW_WIDTH]);
g_object_notify_by_pspec (G_OBJECT (display), gdk_display_properties[GDK_DISPLAY_PROP_SHADOW_WIDTH]);
}
static void
@@ -2223,7 +2223,7 @@ gdk_display_add_seat (GdkDisplay *display,
g_return_if_fail (GDK_IS_SEAT (seat));
display->seats = g_list_append (display->seats, g_object_ref (seat));
g_signal_emit (display, signals[SEAT_ADDED], 0, seat);
g_signal_emit (display, gdk_display_signals[GDK_DISPLAY_SEAT_ADDED], 0, seat);
g_signal_connect (seat, "device-removed", G_CALLBACK (device_removed_cb), display);
}
@@ -2244,7 +2244,7 @@ gdk_display_remove_seat (GdkDisplay *display,
if (link)
{
display->seats = g_list_remove_link (display->seats, link);
g_signal_emit (display, signals[SEAT_REMOVED], 0, seat);
g_signal_emit (display, gdk_display_signals[GDK_DISPLAY_SEAT_REMOVED], 0, seat);
g_object_unref (link->data);
g_list_free (link);
}
@@ -2374,7 +2374,7 @@ gdk_display_get_monitor_at_surface (GdkDisplay *display,
void
gdk_display_emit_opened (GdkDisplay *display)
{
g_signal_emit (display, signals[OPENED], 0);
g_signal_emit (display, gdk_display_signals[GDK_DISPLAY_OPENED], 0);
}
/**
@@ -2405,7 +2405,7 @@ void
gdk_display_setting_changed (GdkDisplay *display,
const char *name)
{
g_signal_emit (display, signals[SETTING_CHANGED], 0, name);
g_signal_emit (display, gdk_display_signals[GDK_DISPLAY_SETTING_CHANGED], 0, name);
}
void
+12 -12
View File
@@ -100,13 +100,13 @@
*/
enum {
PROP_0,
PROP_DEFAULT_DISPLAY
GDK_DISPLAY_MANAGER_PROP_0,
GDK_DISPLAY_MANAGER_PROP_DEFAULT_DISPLAY
};
enum {
DISPLAY_OPENED,
LAST_SIGNAL
GDK_DISPLAY_MANAGER_DISPLAY_OPENED,
GDK_DISPLAY_MANAGER_LAST_SIGNAL
};
static void gdk_display_manager_set_property (GObject *object,
@@ -118,7 +118,7 @@ static void gdk_display_manager_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
static guint signals[LAST_SIGNAL] = { 0 };
static guint gdk_display_manager_signals[GDK_DISPLAY_MANAGER_LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE (GdkDisplayManager, gdk_display_manager, G_TYPE_OBJECT)
@@ -137,7 +137,7 @@ gdk_display_manager_class_init (GdkDisplayManagerClass *klass)
*
* Emitted when a display is opened.
*/
signals[DISPLAY_OPENED] =
gdk_display_manager_signals[GDK_DISPLAY_MANAGER_DISPLAY_OPENED] =
g_signal_new (g_intern_static_string ("display-opened"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
@@ -149,12 +149,12 @@ gdk_display_manager_class_init (GdkDisplayManagerClass *klass)
GDK_TYPE_DISPLAY);
/**
* GdkDisplayManager:default-display: (attributes org.gtk.Property.get=gdk_display_manager_get_default_display)
* GdkDisplayManager:default-display:
*
* The default display.
*/
g_object_class_install_property (object_class,
PROP_DEFAULT_DISPLAY,
GDK_DISPLAY_MANAGER_PROP_DEFAULT_DISPLAY,
g_param_spec_object ("default-display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
@@ -173,7 +173,7 @@ gdk_display_manager_set_property (GObject *object,
{
switch (prop_id)
{
case PROP_DEFAULT_DISPLAY:
case GDK_DISPLAY_MANAGER_PROP_DEFAULT_DISPLAY:
gdk_display_manager_set_default_display (GDK_DISPLAY_MANAGER (object),
g_value_get_object (value));
break;
@@ -191,7 +191,7 @@ gdk_display_manager_get_property (GObject *object,
{
switch (prop_id)
{
case PROP_DEFAULT_DISPLAY:
case GDK_DISPLAY_MANAGER_PROP_DEFAULT_DISPLAY:
g_value_set_object (value,
gdk_display_manager_get_default_display (GDK_DISPLAY_MANAGER (object)));
break;
@@ -301,7 +301,7 @@ gdk_display_manager_get (void)
}
/**
* gdk_display_manager_get_default_display: (attributes org.gtk.Method.get_property=default-display)
* gdk_display_manager_get_default_display:
* @manager: a `GdkDisplayManager`
*
* Gets the default `GdkDisplay`.
@@ -455,7 +455,7 @@ _gdk_display_manager_add_display (GdkDisplayManager *manager,
manager->displays = g_slist_prepend (manager->displays, display);
g_signal_emit (manager, signals[DISPLAY_OPENED], 0, display);
g_signal_emit (manager, gdk_display_manager_signals[GDK_DISPLAY_MANAGER_DISPLAY_OPENED], 0, display);
}
/* NB: This function can be called multiple times per display. */
+1
View File
@@ -48,6 +48,7 @@ typedef enum {
GDK_VULKAN_FEATURE_SEMAPHORE_EXPORT = 1 << 2,
GDK_VULKAN_FEATURE_SEMAPHORE_IMPORT = 1 << 3,
GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT = 1 << 4,
GDK_VULKAN_FEATURE_SWAPCHAIN_MAINTENANCE = 1 << 5,
} GdkVulkanFeatures;
/* Tracks information about the device grab on this display */
+1 -1
View File
@@ -71,7 +71,7 @@ download_memcpy (guchar *dst_data,
bpp = gdk_memory_format_bytes_per_pixel (dst_format);
src_stride = dmabuf->planes[0].stride;
src_data = src_datas[0] + dmabuf->planes[0].offset;
g_return_if_fail (sizes[0] >= dmabuf->planes[0].offset + gdk_memory_format_min_buffer_size (dst_format, dst_stride, width, height));
g_return_if_fail (sizes[0] >= dmabuf->planes[0].offset + gdk_memory_format_min_buffer_size (dst_format, src_stride, width, height));
if (dst_stride == src_stride)
memcpy (dst_data, src_data, (height - 1) * dst_stride + width * bpp);
+4
View File
@@ -5,6 +5,10 @@
#include <drm_fourcc.h>
#endif
#ifndef DRM_FORMAT_MOD_INVALID
#define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1)
#endif
#ifndef fourcc_code
#define fourcc_code(a, b, c, d) ((__u32)(a) | ((__u32)(b) << 8) | \
((__u32)(c) << 16) | ((__u32)(d) << 24))
+78 -78
View File
@@ -119,24 +119,24 @@ struct _GdkDmabufTextureBuilderClass
enum
{
PROP_0,
PROP_DISPLAY,
PROP_WIDTH,
PROP_HEIGHT,
PROP_FOURCC,
PROP_MODIFIER,
PROP_PREMULTIPLIED,
PROP_N_PLANES,
PROP_COLOR_STATE,
PROP_UPDATE_REGION,
PROP_UPDATE_TEXTURE,
GDK_DMABUF_TEXTURE_BUILDER_PROP_0,
GDK_DMABUF_TEXTURE_BUILDER_PROP_DISPLAY,
GDK_DMABUF_TEXTURE_BUILDER_PROP_WIDTH,
GDK_DMABUF_TEXTURE_BUILDER_PROP_HEIGHT,
GDK_DMABUF_TEXTURE_BUILDER_PROP_FOURCC,
GDK_DMABUF_TEXTURE_BUILDER_PROP_MODIFIER,
GDK_DMABUF_TEXTURE_BUILDER_PROP_PREMULTIPLIED,
GDK_DMABUF_TEXTURE_BUILDER_PROP_N_PLANES,
GDK_DMABUF_TEXTURE_BUILDER_PROP_COLOR_STATE,
GDK_DMABUF_TEXTURE_BUILDER_PROP_UPDATE_REGION,
GDK_DMABUF_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE,
N_PROPS
GDK_DMABUF_TEXTURE_BUILDER_N_PROPS
};
G_DEFINE_TYPE (GdkDmabufTextureBuilder, gdk_dmabuf_texture_builder, G_TYPE_OBJECT)
static GParamSpec *properties[N_PROPS] = { NULL, };
static GParamSpec *gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_N_PROPS] = { NULL, };
static void
gdk_dmabuf_texture_builder_dispose (GObject *object)
@@ -160,43 +160,43 @@ gdk_dmabuf_texture_builder_get_property (GObject *object,
switch (property_id)
{
case PROP_DISPLAY:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_DISPLAY:
g_value_set_object (value, self->display);
break;
case PROP_WIDTH:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_WIDTH:
g_value_set_uint (value, self->width);
break;
case PROP_HEIGHT:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_HEIGHT:
g_value_set_uint (value, self->height);
break;
case PROP_FOURCC:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_FOURCC:
g_value_set_uint (value, self->dmabuf.fourcc);
break;
case PROP_MODIFIER:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_MODIFIER:
g_value_set_uint64 (value, self->dmabuf.modifier);
break;
case PROP_PREMULTIPLIED:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_PREMULTIPLIED:
g_value_set_boolean (value, self->premultiplied);
break;
case PROP_N_PLANES:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_N_PLANES:
g_value_set_uint (value, self->dmabuf.n_planes);
break;
case PROP_COLOR_STATE:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_COLOR_STATE:
g_value_set_boxed (value, self->color_state);
break;
case PROP_UPDATE_REGION:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_UPDATE_REGION:
g_value_set_boxed (value, self->update_region);
break;
case PROP_UPDATE_TEXTURE:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE:
g_value_set_object (value, self->update_texture);
break;
@@ -216,43 +216,43 @@ gdk_dmabuf_texture_builder_set_property (GObject *object,
switch (property_id)
{
case PROP_DISPLAY:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_DISPLAY:
gdk_dmabuf_texture_builder_set_display (self, g_value_get_object (value));
break;
case PROP_WIDTH:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_WIDTH:
gdk_dmabuf_texture_builder_set_width (self, g_value_get_uint (value));
break;
case PROP_HEIGHT:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_HEIGHT:
gdk_dmabuf_texture_builder_set_height (self, g_value_get_uint (value));
break;
case PROP_FOURCC:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_FOURCC:
gdk_dmabuf_texture_builder_set_fourcc (self, g_value_get_uint (value));
break;
case PROP_MODIFIER:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_MODIFIER:
gdk_dmabuf_texture_builder_set_modifier (self, g_value_get_uint64 (value));
break;
case PROP_PREMULTIPLIED:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_PREMULTIPLIED:
gdk_dmabuf_texture_builder_set_premultiplied (self, g_value_get_boolean (value));
break;
case PROP_N_PLANES:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_N_PLANES:
gdk_dmabuf_texture_builder_set_n_planes (self, g_value_get_uint (value));
break;
case PROP_COLOR_STATE:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_COLOR_STATE:
gdk_dmabuf_texture_builder_set_color_state (self, g_value_get_boxed (value));
break;
case PROP_UPDATE_REGION:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_UPDATE_REGION:
gdk_dmabuf_texture_builder_set_update_region (self, g_value_get_boxed (value));
break;
case PROP_UPDATE_TEXTURE:
case GDK_DMABUF_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE:
gdk_dmabuf_texture_builder_set_update_texture (self, g_value_get_object (value));
break;
@@ -272,49 +272,49 @@ gdk_dmabuf_texture_builder_class_init (GdkDmabufTextureBuilderClass *klass)
gobject_class->set_property = gdk_dmabuf_texture_builder_set_property;
/**
* GdkDmabufTextureBuilder:display: (attributes org.gtk.Property.get=gdk_dmabuf_texture_builder_get_display org.gtk.Property.set=gdk_dmabuf_texture_builder_set_display)
* GdkDmabufTextureBuilder:display:
*
* The display that this texture will be used on.
*
* Since: 4.14
*/
properties[PROP_DISPLAY] =
gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_DISPLAY] =
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkDmabufTextureBuilder:width: (attributes org.gtk.Property.get=gdk_dmabuf_texture_builder_get_width org.gtk.Property.set=gdk_dmabuf_texture_builder_set_width)
* GdkDmabufTextureBuilder:width:
*
* The width of the texture.
*
* Since: 4.14
*/
properties[PROP_WIDTH] =
gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_WIDTH] =
g_param_spec_uint ("width", NULL, NULL,
0, G_MAXUINT, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkDmabufTextureBuilder:height: (attributes org.gtk.Property.get=gdk_dmabuf_texture_builder_get_height org.gtk.Property.set=gdk_dmabuf_texture_builder_set_height)
* GdkDmabufTextureBuilder:height:
*
* The height of the texture.
*
* Since: 4.14
*/
properties[PROP_HEIGHT] =
gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_HEIGHT] =
g_param_spec_uint ("height", NULL, NULL,
0, G_MAXUINT, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkDmabufTextureBuilder:fourcc: (attributes org.gtk.Property.get=gdk_dmabuf_texture_builder_get_fourcc org.gtk.Property.set=gdk_dmabuf_texture_builder_set_fourcc)
* GdkDmabufTextureBuilder:fourcc:
*
* The format of the texture, as a fourcc value.
*
* Since: 4.14
*/
properties[PROP_FOURCC] =
gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_FOURCC] =
g_param_spec_uint ("fourcc", NULL, NULL,
0, 0xffffffff, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -326,7 +326,7 @@ gdk_dmabuf_texture_builder_class_init (GdkDmabufTextureBuilderClass *klass)
*
* Since: 4.14
*/
properties[PROP_MODIFIER] =
gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_MODIFIER] =
g_param_spec_uint64 ("modifier", NULL, NULL,
0, G_MAXUINT, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -340,22 +340,22 @@ gdk_dmabuf_texture_builder_class_init (GdkDmabufTextureBuilderClass *klass)
*
* Since: 4.14
*/
properties[PROP_PREMULTIPLIED] =
gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_PREMULTIPLIED] =
g_param_spec_boolean ("premultiplied", NULL, NULL,
TRUE,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkDmabufTextureBuilder:n-planes: (attributes org.gtk.Property.get=gdk_dmabuf_texture_builder_get_n_planes org.gtk.Property.set=gdk_dmabuf_texture_builder_set_n_planes)
* GdkDmabufTextureBuilder:n-planes:
*
* The number of planes of the texture.
*
* Note that you can set properties for other planes,
* Note that you can set gdk_dmabuf_texture_builder_properties for other planes,
* but they will be ignored when constructing the texture.
*
* Since: 4.14
*/
properties[PROP_N_PLANES] =
gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_N_PLANES] =
g_param_spec_uint ("n-planes", NULL, NULL,
1, GDK_DMABUF_MAX_PLANES, 1,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -367,36 +367,36 @@ gdk_dmabuf_texture_builder_class_init (GdkDmabufTextureBuilderClass *klass)
*
* Since: 4.16
*/
properties[PROP_COLOR_STATE] =
gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_COLOR_STATE] =
g_param_spec_boxed ("color-state", NULL, NULL,
GDK_TYPE_COLOR_STATE,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkDmabufTextureBuilder:update-region: (attributes org.gtk.Property.get=gdk_dmabuf_texture_builder_get_update_region org.gtk.Property.set=gdk_dmabuf_texture_builder_set_update_region)
* GdkDmabufTextureBuilder:update-region:
*
* The update region for [property@Gdk.GLTextureBuilder:update-texture].
*
* Since: 4.14
*/
properties[PROP_UPDATE_REGION] =
gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_UPDATE_REGION] =
g_param_spec_boxed ("update-region", NULL, NULL,
CAIRO_GOBJECT_TYPE_REGION,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkDmabufTextureBuilder:update-texture: (attributes org.gtk.Property.get=gdk_dmabuf_texture_builder_get_update_texture org.gtk.Property.set=gdk_dmabuf_texture_builder_set_update_texture)
* GdkDmabufTextureBuilder:update-texture:
*
* The texture [property@Gdk.DmabufTextureBuilder:update-region] is an update for.
*
* Since: 4.14
*/
properties[PROP_UPDATE_TEXTURE] =
gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE] =
g_param_spec_object ("update-texture", NULL, NULL,
GDK_TYPE_TEXTURE,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, N_PROPS, properties);
g_object_class_install_properties (gobject_class, GDK_DMABUF_TEXTURE_BUILDER_N_PROPS, gdk_dmabuf_texture_builder_properties);
}
static void
@@ -467,11 +467,11 @@ gdk_dmabuf_texture_builder_set_display (GdkDmabufTextureBuilder *self,
g_return_if_fail (GDK_IS_DISPLAY (display));
if (g_set_object (&self->display, display))
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_DISPLAY]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_DISPLAY]);
}
/**
* gdk_dmabuf_texture_builder_get_width: (attributes org.gtk.Method.get_property=width)
* gdk_dmabuf_texture_builder_get_width:
* @self: a `GdkDmabufTextureBuilder`
*
* Gets the width previously set via gdk_dmabuf_texture_builder_set_width() or
@@ -490,7 +490,7 @@ gdk_dmabuf_texture_builder_get_width (GdkDmabufTextureBuilder *self)
}
/**
* gdk_dmabuf_texture_builder_set_width: (attributes org.gtk.Method.set_property=width)
* gdk_dmabuf_texture_builder_set_width:
* @self: a `GdkDmabufTextureBuilder`
* @width: The texture's width or 0 to unset
*
@@ -511,11 +511,11 @@ gdk_dmabuf_texture_builder_set_width (GdkDmabufTextureBuilder *self,
self->width = width;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_WIDTH]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_WIDTH]);
}
/**
* gdk_dmabuf_texture_builder_get_height: (attributes org.gtk.Method.get_property=height)
* gdk_dmabuf_texture_builder_get_height:
* @self: a `GdkDmabufTextureBuilder`
*
* Gets the height previously set via gdk_dmabuf_texture_builder_set_height() or
@@ -534,7 +534,7 @@ gdk_dmabuf_texture_builder_get_height (GdkDmabufTextureBuilder *self)
}
/**
* gdk_dmabuf_texture_builder_set_height: (attributes org.gtk.Method.set_property=height)
* gdk_dmabuf_texture_builder_set_height:
* @self: a `GdkDmabufTextureBuilder`
* @height: the texture's height or 0 to unset
*
@@ -555,11 +555,11 @@ gdk_dmabuf_texture_builder_set_height (GdkDmabufTextureBuilder *self,
self->height = height;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_HEIGHT]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_HEIGHT]);
}
/**
* gdk_dmabuf_texture_builder_get_fourcc: (attributes org.gtk.Method.get_property=fourcc)
* gdk_dmabuf_texture_builder_get_fourcc:
* @self: a `GdkDmabufTextureBuilder`
*
* Gets the format previously set via gdk_dmabuf_texture_builder_set_fourcc()
@@ -580,7 +580,7 @@ gdk_dmabuf_texture_builder_get_fourcc (GdkDmabufTextureBuilder *self)
}
/**
* gdk_dmabuf_texture_builder_set_fourcc: (attributes org.gtk.Method.set_property=fourcc)
* gdk_dmabuf_texture_builder_set_fourcc:
* @self: a `GdkDmabufTextureBuilder`
* @fourcc: the texture's format or 0 to unset
*
@@ -603,7 +603,7 @@ gdk_dmabuf_texture_builder_set_fourcc (GdkDmabufTextureBuilder *self,
self->dmabuf.fourcc = fourcc;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FOURCC]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_FOURCC]);
}
/**
@@ -644,11 +644,11 @@ gdk_dmabuf_texture_builder_set_modifier (GdkDmabufTextureBuilder *self,
self->dmabuf.modifier = modifier;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODIFIER]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_MODIFIER]);
}
/**
* gdk_dmabuf_texture_builder_get_n_planes: (attributes org.gtk.Method.get_property=n-planes)
* gdk_dmabuf_texture_builder_get_n_planes:
* @self: a `GdkDmabufTextureBuilder`
*
* Gets the number of planes.
@@ -706,11 +706,11 @@ gdk_dmabuf_texture_builder_set_premultiplied (GdkDmabufTextureBuilder *self,
self->premultiplied = premultiplied;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PREMULTIPLIED]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_PREMULTIPLIED]);
}
/**
* gdk_dmabuf_texture_builder_set_n_planes: (attributes org.gtk.Method.set_property=n-planes)
* gdk_dmabuf_texture_builder_set_n_planes:
* @self: a `GdkDmabufTextureBuilder`
* @n_planes: the number of planes
*
@@ -730,7 +730,7 @@ gdk_dmabuf_texture_builder_set_n_planes (GdkDmabufTextureBuilder *self,
self->dmabuf.n_planes = n_planes;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_N_PLANES]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_N_PLANES]);
}
/**
@@ -871,7 +871,7 @@ gdk_dmabuf_texture_builder_set_offset (GdkDmabufTextureBuilder *self,
}
/**
* gdk_dmabuf_texture_builder_get_color_state: (attributes org.gtk.Method.get_property=color-state)
* gdk_dmabuf_texture_builder_get_color_state:
* @self: a `GdkDmabufTextureBuilder`
*
* Gets the color state previously set via gdk_dmabuf_texture_builder_set_color_state().
@@ -889,7 +889,7 @@ gdk_dmabuf_texture_builder_get_color_state (GdkDmabufTextureBuilder *self)
}
/**
* gdk_dmabuf_texture_builder_set_color_state: (attributes org.gtk.Method.set_property=color-state)
* gdk_dmabuf_texture_builder_set_color_state:
* @self: a `GdkDmabufTextureBuilder`
* @color_state: (nullable): a `GdkColorState` or `NULL` to unset the colorstate.
*
@@ -916,11 +916,11 @@ gdk_dmabuf_texture_builder_set_color_state (GdkDmabufTextureBuilder *self,
if (color_state)
gdk_color_state_ref (color_state);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLOR_STATE]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_COLOR_STATE]);
}
/**
* gdk_dmabuf_texture_builder_get_update_texture: (attributes org.gtk.Method.get_property=update-texture)
* gdk_dmabuf_texture_builder_get_update_texture:
* @self: a `GdkDmabufTextureBuilder`
*
* Gets the texture previously set via gdk_dmabuf_texture_builder_set_update_texture() or
@@ -939,7 +939,7 @@ gdk_dmabuf_texture_builder_get_update_texture (GdkDmabufTextureBuilder *self)
}
/**
* gdk_dmabuf_texture_builder_set_update_texture: (attributes org.gtk.Method.set_property=update-texture)
* gdk_dmabuf_texture_builder_set_update_texture:
* @self: a `GdkDmabufTextureBuilder`
* @texture: (nullable): the texture to update
*
@@ -958,11 +958,11 @@ gdk_dmabuf_texture_builder_set_update_texture (GdkDmabufTextureBuilder *self,
if (!g_set_object (&self->update_texture, texture))
return;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UPDATE_TEXTURE]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE]);
}
/**
* gdk_dmabuf_texture_builder_get_update_region: (attributes org.gtk.Method.get_property=update-region)
* gdk_dmabuf_texture_builder_get_update_region:
* @self: a `GdkDmabufTextureBuilder`
*
* Gets the region previously set via gdk_dmabuf_texture_builder_set_update_region() or
@@ -981,7 +981,7 @@ gdk_dmabuf_texture_builder_get_update_region (GdkDmabufTextureBuilder *self)
}
/**
* gdk_dmabuf_texture_builder_set_update_region: (attributes org.gtk.Method.set_property=update-region)
* gdk_dmabuf_texture_builder_set_update_region:
* @self: a `GdkDmabufTextureBuilder`
* @region: (nullable): the region to update
*
@@ -1012,7 +1012,7 @@ gdk_dmabuf_texture_builder_set_update_region (GdkDmabufTextureBuilder *self,
if (region)
self->update_region = cairo_region_reference (region);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UPDATE_REGION]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_dmabuf_texture_builder_properties[GDK_DMABUF_TEXTURE_BUILDER_PROP_UPDATE_REGION]);
}
/**
@@ -1063,11 +1063,11 @@ gdk_dmabuf_texture_builder_build (GdkDmabufTextureBuilder *self,
for (i = 0; i < self->dmabuf.n_planes; i++)
g_return_val_if_fail (self->dmabuf.planes[i].fd != -1, NULL);
if (GDK_DISPLAY_DEBUG_CHECK (self->display, DMABUF_DISABLE))
if (!gdk_has_feature (GDK_FEATURE_DMABUF))
{
g_set_error_literal (error,
GDK_DMABUF_ERROR, GDK_DMABUF_ERROR_NOT_AVAILABLE,
"dmabuf support disabled via GDK_DEBUG environment variable");
"dmabuf support disabled via GDK_DISABLE environment variable");
return NULL;
}
+58 -58
View File
@@ -51,22 +51,22 @@
#include "gdkeventsprivate.h"
enum {
PROP_0,
PROP_CONTENT,
PROP_DEVICE,
PROP_DISPLAY,
PROP_FORMATS,
PROP_SELECTED_ACTION,
PROP_ACTIONS,
PROP_SURFACE,
N_PROPERTIES
GDK_DRAG_PROP_0,
GDK_DRAG_PROP_CONTENT,
GDK_DRAG_PROP_DEVICE,
GDK_DRAG_PROP_DISPLAY,
GDK_DRAG_PROP_FORMATS,
GDK_DRAG_PROP_SELECTED_ACTION,
GDK_DRAG_PROP_ACTIONS,
GDK_DRAG_PROP_SURFACE,
GDK_DRAG_N_PROPERTIES
};
enum {
CANCEL,
DROP_PERFORMED,
DND_FINISHED,
N_SIGNALS
GDK_DRAG_CANCEL,
GDK_DRAG_DROP_PERFORMED,
GDK_DRAG_DND_FINISHED,
GDK_DRAG_N_SIGNALS
};
typedef struct _GdkDragPrivate GdkDragPrivate;
@@ -85,14 +85,14 @@ struct _GdkDragPrivate {
guint drop_done : 1; /* Whether gdk_drag_drop_done() was performed */
};
static GParamSpec *properties[N_PROPERTIES] = { NULL, };
static guint signals[N_SIGNALS] = { 0 };
static GParamSpec *gdk_drag_properties[GDK_DRAG_N_PROPERTIES] = { NULL, };
static guint gdk_drag_signals[GDK_DRAG_N_SIGNALS] = { 0 };
static GList *drags = NULL;
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GdkDrag, gdk_drag, G_TYPE_OBJECT)
/**
* gdk_drag_get_display: (attributes org.gtk.Method.get_property=display)
* gdk_drag_get_display:
* @drag: a `GdkDrag`
*
* Gets the `GdkDisplay` that the drag object was created for.
@@ -110,7 +110,7 @@ gdk_drag_get_display (GdkDrag *drag)
}
/**
* gdk_drag_get_formats: (attributes org.gtk.Method.get_property=formats)
* gdk_drag_get_formats:
* @drag: a `GdkDrag`
*
* Retrieves the formats supported by this `GdkDrag` object.
@@ -128,7 +128,7 @@ gdk_drag_get_formats (GdkDrag *drag)
}
/**
* gdk_drag_get_actions: (attributes org.gtk.Method.get_property=actions)
* gdk_drag_get_actions:
* @drag: a `GdkDrag`
*
* Determines the bitmask of possible actions proposed by the source.
@@ -146,7 +146,7 @@ gdk_drag_get_actions (GdkDrag *drag)
}
/**
* gdk_drag_get_selected_action: (attributes org.gtk.Method.get_property=selected-action)
* gdk_drag_get_selected_action:
* @drag: a `GdkDrag`
*
* Determines the action chosen by the drag destination.
@@ -164,7 +164,7 @@ gdk_drag_get_selected_action (GdkDrag *drag)
}
/**
* gdk_drag_get_device: (attributes org.gtk.Method.get_property=device)
* gdk_drag_get_device:
* @drag: a `GdkDrag`
*
* Returns the `GdkDevice` associated to the `GdkDrag` object.
@@ -182,7 +182,7 @@ gdk_drag_get_device (GdkDrag *drag)
}
/**
* gdk_drag_get_content: (attributes org.gtk.Method.get_property=content)
* gdk_drag_get_content:
* @drag: a `GdkDrag`
*
* Returns the `GdkContentProvider` associated to the `GdkDrag` object.
@@ -200,7 +200,7 @@ gdk_drag_get_content (GdkDrag *drag)
}
/**
* gdk_drag_get_surface: (attributes org.gtk.Method.get_property=surface)
* gdk_drag_get_surface:
* @drag: a `GdkDrag`
*
* Returns the `GdkSurface` where the drag originates.
@@ -234,7 +234,7 @@ gdk_drag_set_property (GObject *gobject,
switch (prop_id)
{
case PROP_CONTENT:
case GDK_DRAG_PROP_CONTENT:
priv->content = g_value_dup_object (value);
if (priv->content)
{
@@ -243,13 +243,13 @@ gdk_drag_set_property (GObject *gobject,
}
break;
case PROP_DEVICE:
case GDK_DRAG_PROP_DEVICE:
priv->device = g_value_dup_object (value);
g_assert (priv->device != NULL);
priv->display = gdk_device_get_display (priv->device);
break;
case PROP_FORMATS:
case GDK_DRAG_PROP_FORMATS:
if (priv->formats)
{
GdkContentFormats *override = g_value_dup_boxed (value);
@@ -266,21 +266,21 @@ gdk_drag_set_property (GObject *gobject,
}
break;
case PROP_SELECTED_ACTION:
case GDK_DRAG_PROP_SELECTED_ACTION:
{
GdkDragAction action = g_value_get_flags (value);
gdk_drag_set_selected_action (drag, action);
}
break;
break;
case PROP_ACTIONS:
case GDK_DRAG_PROP_ACTIONS:
{
GdkDragAction actions = g_value_get_flags (value);
gdk_drag_set_actions (drag, actions);
}
break;
break;
case PROP_SURFACE:
case GDK_DRAG_PROP_SURFACE:
priv->surface = g_value_dup_object (value);
g_assert (priv->surface != NULL);
break;
@@ -302,31 +302,31 @@ gdk_drag_get_property (GObject *gobject,
switch (prop_id)
{
case PROP_CONTENT:
case GDK_DRAG_PROP_CONTENT:
g_value_set_object (value, priv->content);
break;
case PROP_DEVICE:
case GDK_DRAG_PROP_DEVICE:
g_value_set_object (value, priv->device);
break;
case PROP_DISPLAY:
case GDK_DRAG_PROP_DISPLAY:
g_value_set_object (value, priv->display);
break;
case PROP_FORMATS:
case GDK_DRAG_PROP_FORMATS:
g_value_set_boxed (value, priv->formats);
break;
case PROP_SELECTED_ACTION:
case GDK_DRAG_PROP_SELECTED_ACTION:
g_value_set_flags (value, priv->selected_action);
break;
case PROP_ACTIONS:
case GDK_DRAG_PROP_ACTIONS:
g_value_set_flags (value, priv->actions);
break;
case PROP_SURFACE:
case GDK_DRAG_PROP_SURFACE:
g_value_set_object (value, priv->surface);
break;
@@ -362,11 +362,11 @@ gdk_drag_class_init (GdkDragClass *klass)
object_class->finalize = gdk_drag_finalize;
/**
* GdkDrag:content: (attributes org.gtk.Property.get=gdk_drag_get_content)
* GdkDrag:content:
*
* The `GdkContentProvider`.
*/
properties[PROP_CONTENT] =
gdk_drag_properties[GDK_DRAG_PROP_CONTENT] =
g_param_spec_object ("content", NULL, NULL,
GDK_TYPE_CONTENT_PROVIDER,
G_PARAM_READWRITE |
@@ -375,11 +375,11 @@ gdk_drag_class_init (GdkDragClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrag:device: (attributes org.gtk.Property.get=gdk_drag_get_device)
* GdkDrag:device:
*
* The `GdkDevice` that is performing the drag.
*/
properties[PROP_DEVICE] =
gdk_drag_properties[GDK_DRAG_PROP_DEVICE] =
g_param_spec_object ("device", NULL, NULL,
GDK_TYPE_DEVICE,
G_PARAM_READWRITE |
@@ -388,11 +388,11 @@ gdk_drag_class_init (GdkDragClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrag:display: (attributes org.gtk.Property.get=gdk_drag_get_display)
* GdkDrag:display:
*
* The `GdkDisplay` that the drag belongs to.
*/
properties[PROP_DISPLAY] =
gdk_drag_properties[GDK_DRAG_PROP_DISPLAY] =
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READABLE |
@@ -400,11 +400,11 @@ gdk_drag_class_init (GdkDragClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrag:formats: (attributes org.gtk.Property.get=gdk_drag_get_formats)
* GdkDrag:formats:
*
* The possible formats that the drag can provide its data in.
*/
properties[PROP_FORMATS] =
gdk_drag_properties[GDK_DRAG_PROP_FORMATS] =
g_param_spec_boxed ("formats", NULL, NULL,
GDK_TYPE_CONTENT_FORMATS,
G_PARAM_READWRITE |
@@ -413,11 +413,11 @@ gdk_drag_class_init (GdkDragClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrag:selected-action: (attributes org.gtk.Property.get=gdk_drag_get_selected_action)
* GdkDrag:selected-action:
*
* The currently selected action of the drag.
*/
properties[PROP_SELECTED_ACTION] =
gdk_drag_properties[GDK_DRAG_PROP_SELECTED_ACTION] =
g_param_spec_flags ("selected-action", NULL, NULL,
GDK_TYPE_DRAG_ACTION,
0,
@@ -426,11 +426,11 @@ gdk_drag_class_init (GdkDragClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrag:actions: (attributes org.gtk.Property.get=gdk_drag_get_actions)
* GdkDrag:actions:
*
* The possible actions of this drag.
*/
properties[PROP_ACTIONS] =
gdk_drag_properties[GDK_DRAG_PROP_ACTIONS] =
g_param_spec_flags ("actions", NULL, NULL,
GDK_TYPE_DRAG_ACTION,
0,
@@ -439,11 +439,11 @@ gdk_drag_class_init (GdkDragClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrag:surface: (attributes org.gtk.Property.get=gdk_drag_get_surface)
* GdkDrag:surface:
*
* The surface where the drag originates.
*/
properties[PROP_SURFACE] =
gdk_drag_properties[GDK_DRAG_PROP_SURFACE] =
g_param_spec_object ("surface", NULL, NULL,
GDK_TYPE_SURFACE,
G_PARAM_READWRITE |
@@ -458,7 +458,7 @@ gdk_drag_class_init (GdkDragClass *klass)
*
* Emitted when the drag operation is cancelled.
*/
signals[CANCEL] =
gdk_drag_signals[GDK_DRAG_CANCEL] =
g_signal_new (g_intern_static_string ("cancel"),
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
@@ -473,7 +473,7 @@ gdk_drag_class_init (GdkDragClass *klass)
*
* Emitted when the drop operation is performed on an accepting client.
*/
signals[DROP_PERFORMED] =
gdk_drag_signals[GDK_DRAG_DROP_PERFORMED] =
g_signal_new (g_intern_static_string ("drop-performed"),
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
@@ -490,7 +490,7 @@ gdk_drag_class_init (GdkDragClass *klass)
*
* The drag object can now free all miscellaneous data.
*/
signals[DND_FINISHED] =
gdk_drag_signals[GDK_DRAG_DND_FINISHED] =
g_signal_new (g_intern_static_string ("dnd-finished"),
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
@@ -499,7 +499,7 @@ gdk_drag_class_init (GdkDragClass *klass)
NULL,
G_TYPE_NONE, 0);
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
g_object_class_install_properties (object_class, GDK_DRAG_N_PROPERTIES, gdk_drag_properties);
}
static void
@@ -633,7 +633,7 @@ gdk_drag_set_actions (GdkDrag *drag,
priv->actions = actions;
g_object_notify_by_pspec (G_OBJECT (drag), properties[PROP_ACTIONS]);
g_object_notify_by_pspec (G_OBJECT (drag), gdk_drag_properties[GDK_DRAG_PROP_ACTIONS]);
}
void
@@ -651,7 +651,7 @@ gdk_drag_set_selected_action (GdkDrag *drag,
cursor = gdk_drag_get_cursor (drag, action);
gdk_drag_set_cursor (drag, cursor);
g_object_notify_by_pspec (G_OBJECT (drag), properties[PROP_SELECTED_ACTION]);
g_object_notify_by_pspec (G_OBJECT (drag), gdk_drag_properties[GDK_DRAG_PROP_SELECTED_ACTION]);
}
/**
@@ -751,7 +751,7 @@ gdk_drag_cancel (GdkDrag *drag,
{
g_return_if_fail (GDK_IS_DRAG (drag));
g_signal_emit (drag, signals[CANCEL], 0, reason);
g_signal_emit (drag, gdk_drag_signals[GDK_DRAG_CANCEL], 0, reason);
}
gboolean
+63 -31
View File
@@ -53,15 +53,15 @@ struct _GdkDrawContextPrivate {
};
enum {
PROP_0,
GDK_DRAW_CONTEXT_PROP_0,
PROP_DISPLAY,
PROP_SURFACE,
GDK_DRAW_CONTEXT_PROP_DISPLAY,
GDK_DRAW_CONTEXT_PROP_SURFACE,
LAST_PROP
GDK_DRAW_CONTEXT_LAST_PROP
};
static GParamSpec *pspecs[LAST_PROP] = { NULL, };
static GParamSpec *gdk_draw_context_properties[GDK_DRAW_CONTEXT_LAST_PROP] = { NULL, };
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GdkDrawContext, gdk_draw_context, G_TYPE_OBJECT)
@@ -103,7 +103,7 @@ gdk_draw_context_set_property (GObject *gobject,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_DRAW_CONTEXT_PROP_DISPLAY:
if (priv->display != NULL)
{
g_assert (g_value_get_object (value) == NULL);
@@ -114,7 +114,7 @@ gdk_draw_context_set_property (GObject *gobject,
}
break;
case PROP_SURFACE:
case GDK_DRAW_CONTEXT_PROP_SURFACE:
priv->surface = g_value_dup_object (value);
if (priv->surface)
{
@@ -146,11 +146,11 @@ gdk_draw_context_get_property (GObject *gobject,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_DRAW_CONTEXT_PROP_DISPLAY:
g_value_set_object (value, gdk_draw_context_get_display (context));
break;
case PROP_SURFACE:
case GDK_DRAW_CONTEXT_PROP_SURFACE:
g_value_set_object (value, priv->surface);
break;
@@ -172,11 +172,11 @@ gdk_draw_context_class_init (GdkDrawContextClass *klass)
klass->empty_frame = gdk_draw_context_default_empty_frame;
/**
* GdkDrawContext:display: (attributes org.gtk.Property.get=gdk_draw_context_get_display)
* GdkDrawContext:display:
*
* The `GdkDisplay` used to create the `GdkDrawContext`.
*/
pspecs[PROP_DISPLAY] =
gdk_draw_context_properties[GDK_DRAW_CONTEXT_PROP_DISPLAY] =
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE |
@@ -184,18 +184,18 @@ gdk_draw_context_class_init (GdkDrawContextClass *klass)
G_PARAM_STATIC_STRINGS);
/**
* GdkDrawContext:surface: (attributes org.gtk.Property.get=gdk_draw_context_get_surface)
* GdkDrawContext:surface:
*
* The `GdkSurface` the context is bound to.
*/
pspecs[PROP_SURFACE] =
gdk_draw_context_properties[GDK_DRAW_CONTEXT_PROP_SURFACE] =
g_param_spec_object ("surface", NULL, NULL,
GDK_TYPE_SURFACE,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, LAST_PROP, pspecs);
g_object_class_install_properties (gobject_class, GDK_DRAW_CONTEXT_LAST_PROP, gdk_draw_context_properties);
}
static guint pixels_counter;
@@ -223,6 +223,9 @@ gdk_draw_context_init (GdkDrawContext *self)
*
* Returns: %TRUE if the context is between [method@Gdk.DrawContext.begin_frame]
* and [method@Gdk.DrawContext.end_frame] calls.
*
* Deprecated: 4.16: Drawing directly to the surface is no longer recommended.
* Use `GskRenderNode` and `GskRenderer`.
*/
gboolean
gdk_draw_context_is_in_frame (GdkDrawContext *context)
@@ -248,7 +251,7 @@ gdk_draw_context_surface_resized (GdkDrawContext *context)
}
/**
* gdk_draw_context_get_display: (attributes org.gtk.Method.get_property=display)
* gdk_draw_context_get_display:
* @context: a `GdkDrawContext`
*
* Retrieves the `GdkDisplay` the @context is created for
@@ -266,7 +269,7 @@ gdk_draw_context_get_display (GdkDrawContext *context)
}
/**
* gdk_draw_context_get_surface: (attributes org.gtk.Method.get_property=surface)
* gdk_draw_context_get_surface:
* @context: a `GdkDrawContext`
*
* Retrieves the surface that @context is bound to.
@@ -313,6 +316,9 @@ gdk_draw_context_get_surface (GdkDrawContext *context)
* gdk_draw_context_begin_frame() and gdk_draw_context_end_frame() via the
* use of [GskRenderer](../gsk4/class.Renderer.html)s, so application code
* does not need to call these functions explicitly.
*
* Deprecated: 4.16: Drawing directly to the surface is no longer recommended.
* Use `GskRenderNode` and `GskRenderer`.
*/
void
gdk_draw_context_begin_frame (GdkDrawContext *context,
@@ -324,11 +330,12 @@ gdk_draw_context_begin_frame (GdkDrawContext *context,
g_return_if_fail (priv->surface != NULL);
g_return_if_fail (region != NULL);
gdk_draw_context_begin_frame_full (context, GDK_MEMORY_U8, region);
gdk_draw_context_begin_frame_full (context, GDK_MEMORY_U8, region, NULL);
}
/*
* @depth: best depth to render in
* @opaque: (nullable): opaque region of the rendering
*
* If the given depth is not `GDK_MEMORY_U8`, GDK will see about providing a
* rendering target that supports a higher bit depth than 8 bits per channel.
@@ -351,9 +358,10 @@ gdk_draw_context_begin_frame (GdkDrawContext *context,
* to choose.
*/
void
gdk_draw_context_begin_frame_full (GdkDrawContext *context,
GdkMemoryDepth depth,
const cairo_region_t *region)
gdk_draw_context_begin_frame_full (GdkDrawContext *context,
GdkMemoryDepth depth,
const cairo_region_t *region,
const graphene_rect_t *opaque)
{
GdkDrawContextPrivate *priv = gdk_draw_context_get_instance_private (context);
@@ -378,19 +386,23 @@ gdk_draw_context_begin_frame_full (GdkDrawContext *context,
return;
}
gdk_surface_set_opaque_rect (priv->surface, opaque);
if (gdk_display_get_debug_flags (priv->display) & GDK_DEBUG_HIGH_DEPTH)
depth = GDK_MEMORY_FLOAT32;
priv->frame_region = cairo_region_copy (region);
priv->surface->paint_context = g_object_ref (context);
g_assert (priv->color_state == NULL);
GDK_DRAW_CONTEXT_GET_CLASS (context)->begin_frame (context,
depth,
priv->frame_region,
&priv->color_state,
&priv->depth);
/* the callback is meant to set them */
/* The callback is meant to set them. Note that it does not return a ref */
g_assert (priv->color_state != NULL);
g_assert (priv->depth < GDK_N_DEPTHS);
@@ -420,6 +432,21 @@ region_get_pixels (cairo_region_t *region)
}
#endif
void
gdk_draw_context_end_frame_full (GdkDrawContext *context)
{
GdkDrawContextPrivate *priv = gdk_draw_context_get_instance_private (context);
GDK_DRAW_CONTEXT_GET_CLASS (context)->end_frame (context, priv->frame_region);
gdk_profiler_set_int_counter (pixels_counter, region_get_pixels (priv->frame_region));
priv->color_state = NULL;
g_clear_pointer (&priv->frame_region, cairo_region_destroy);
g_clear_object (&priv->surface->paint_context);
priv->depth = GDK_N_DEPTHS;
}
/**
* gdk_draw_context_end_frame:
* @context: a `GdkDrawContext`
@@ -432,6 +459,9 @@ region_get_pixels (cairo_region_t *region)
* When using a [class@Gdk.GLContext], this function may call `glFlush()`
* implicitly before returning; it is not recommended to call `glFlush()`
* explicitly before calling this function.
*
* Deprecated: 4.16: Drawing directly to the surface is no longer recommended.
* Use `GskRenderNode` and `GskRenderer`.
*/
void
gdk_draw_context_end_frame (GdkDrawContext *context)
@@ -459,14 +489,7 @@ gdk_draw_context_end_frame (GdkDrawContext *context)
return;
}
GDK_DRAW_CONTEXT_GET_CLASS (context)->end_frame (context, priv->frame_region);
gdk_profiler_set_int_counter (pixels_counter, region_get_pixels (priv->frame_region));
g_clear_pointer (&priv->color_state, gdk_color_state_unref);
g_clear_pointer (&priv->frame_region, cairo_region_destroy);
g_clear_object (&priv->surface->paint_context);
priv->depth = GDK_N_DEPTHS;
gdk_draw_context_end_frame_full (context);
}
/**
@@ -483,15 +506,24 @@ gdk_draw_context_end_frame (GdkDrawContext *context)
* and [method@Gdk.DrawContext.end_frame], %NULL will be returned.
*
* Returns: (transfer none) (nullable): a Cairo region
*
* Deprecated: 4.16: Drawing directly to the surface is no longer recommended.
* Use `GskRenderNode` and `GskRenderer`.
*/
const cairo_region_t *
gdk_draw_context_get_frame_region (GdkDrawContext *context)
_gdk_draw_context_get_frame_region (GdkDrawContext *context)
{
GdkDrawContextPrivate *priv = gdk_draw_context_get_instance_private (context);
return priv->frame_region;
}
const cairo_region_t *
(gdk_draw_context_get_frame_region) (GdkDrawContext *context)
{
g_return_val_if_fail (GDK_IS_DRAW_CONTEXT (context), NULL);
return priv->frame_region;
return _gdk_draw_context_get_frame_region (context);
}
/*<private>
+4 -4
View File
@@ -40,15 +40,15 @@ GdkDisplay * gdk_draw_context_get_display (GdkDrawContext
GDK_AVAILABLE_IN_ALL
GdkSurface * gdk_draw_context_get_surface (GdkDrawContext *context);
GDK_AVAILABLE_IN_ALL
GDK_DEPRECATED_IN_4_16
void gdk_draw_context_begin_frame (GdkDrawContext *context,
const cairo_region_t *region);
GDK_AVAILABLE_IN_ALL
GDK_DEPRECATED_IN_4_16
void gdk_draw_context_end_frame (GdkDrawContext *context);
GDK_AVAILABLE_IN_ALL
GDK_DEPRECATED_IN_4_16
gboolean gdk_draw_context_is_in_frame (GdkDrawContext *context);
GDK_AVAILABLE_IN_ALL
GDK_DEPRECATED_IN_4_16
const cairo_region_t * gdk_draw_context_get_frame_region (GdkDrawContext *context);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkDrawContext, g_object_unref)
+7 -1
View File
@@ -25,6 +25,8 @@
#include "gdkcolorstateprivate.h"
#include "gdkmemoryformatprivate.h"
#include <graphene.h>
G_BEGIN_DECLS
#define GDK_DRAW_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_DRAW_CONTEXT, GdkDrawContextClass))
@@ -57,10 +59,14 @@ void gdk_draw_context_surface_resized (GdkDrawContext
void gdk_draw_context_begin_frame_full (GdkDrawContext *context,
GdkMemoryDepth depth,
const cairo_region_t *region);
const cairo_region_t *region,
const graphene_rect_t *opaque);
void gdk_draw_context_end_frame_full (GdkDrawContext *context);
void gdk_draw_context_empty_frame (GdkDrawContext *context);
#define gdk_draw_context_get_frame_region(...) _gdk_draw_context_get_frame_region(__VA_ARGS__)
const cairo_region_t * _gdk_draw_context_get_frame_region (GdkDrawContext *self);
GdkColorState * gdk_draw_context_get_color_state (GdkDrawContext *self);
GdkMemoryDepth gdk_draw_context_get_depth (GdkDrawContext *self);
+42 -42
View File
@@ -71,17 +71,17 @@ struct _GdkDropPrivate {
};
enum {
PROP_0,
PROP_ACTIONS,
PROP_DEVICE,
PROP_DISPLAY,
PROP_DRAG,
PROP_FORMATS,
PROP_SURFACE,
N_PROPERTIES
GDK_DROP_PROP_0,
GDK_DROP_PROP_ACTIONS,
GDK_DROP_PROP_DEVICE,
GDK_DROP_PROP_DISPLAY,
GDK_DROP_PROP_DRAG,
GDK_DROP_PROP_FORMATS,
GDK_DROP_PROP_SURFACE,
GDK_DROP_N_PROPERTIES
};
static GParamSpec *properties[N_PROPERTIES] = { NULL, };
static GParamSpec *gdk_drop_properties[GDK_DROP_N_PROPERTIES] = { NULL, };
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GdkDrop, gdk_drop, G_TYPE_OBJECT)
@@ -210,29 +210,29 @@ gdk_drop_set_property (GObject *gobject,
switch (prop_id)
{
case PROP_ACTIONS:
case GDK_DROP_PROP_ACTIONS:
gdk_drop_set_actions (self, g_value_get_flags (value));
break;
case PROP_DEVICE:
case GDK_DROP_PROP_DEVICE:
priv->device = g_value_dup_object (value);
g_assert (priv->device != NULL);
if (priv->surface)
g_assert (gdk_surface_get_display (priv->surface) == gdk_device_get_display (priv->device));
break;
case PROP_DRAG:
case GDK_DROP_PROP_DRAG:
priv->drag = g_value_dup_object (value);
if (priv->drag)
gdk_drop_add_formats (self, gdk_drag_get_formats (priv->drag));
break;
case PROP_FORMATS:
case GDK_DROP_PROP_FORMATS:
gdk_drop_add_formats (self, g_value_get_boxed (value));
g_assert (priv->formats != NULL);
break;
case PROP_SURFACE:
case GDK_DROP_PROP_SURFACE:
priv->surface = g_value_dup_object (value);
g_assert (priv->surface != NULL);
if (priv->device)
@@ -256,27 +256,27 @@ gdk_drop_get_property (GObject *gobject,
switch (prop_id)
{
case PROP_ACTIONS:
case GDK_DROP_PROP_ACTIONS:
g_value_set_flags (value, priv->actions);
break;
case PROP_DEVICE:
case GDK_DROP_PROP_DEVICE:
g_value_set_object (value, priv->device);
break;
case PROP_DISPLAY:
case GDK_DROP_PROP_DISPLAY:
g_value_set_object (value, gdk_device_get_display (priv->device));
break;
case PROP_DRAG:
case GDK_DROP_PROP_DRAG:
g_value_set_object (value, priv->drag);
break;
case PROP_FORMATS:
case GDK_DROP_PROP_FORMATS:
g_value_set_boxed (value, priv->formats);
break;
case PROP_SURFACE:
case GDK_DROP_PROP_SURFACE:
g_value_set_object (value, priv->surface);
break;
@@ -320,11 +320,11 @@ gdk_drop_class_init (GdkDropClass *klass)
object_class->finalize = gdk_drop_finalize;
/**
* GdkDrop:actions: (attributes org.gtk.Property.get=gdk_drop_get_actions)
* GdkDrop:actions:
*
* The possible actions for this drop
*/
properties[PROP_ACTIONS] =
gdk_drop_properties[GDK_DROP_PROP_ACTIONS] =
g_param_spec_flags ("actions", NULL, NULL,
GDK_TYPE_DRAG_ACTION,
GDK_ACTION_ALL,
@@ -334,11 +334,11 @@ gdk_drop_class_init (GdkDropClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrop:device: (attributes org.gtk.Property.get=gdk_drop_get_device)
* GdkDrop:device:
*
* The `GdkDevice` performing the drop
*/
properties[PROP_DEVICE] =
gdk_drop_properties[GDK_DROP_PROP_DEVICE] =
g_param_spec_object ("device", NULL, NULL,
GDK_TYPE_DEVICE,
G_PARAM_READWRITE |
@@ -347,11 +347,11 @@ gdk_drop_class_init (GdkDropClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrop:display: (attributes org.gtk.Property.get=gdk_drop_get_display)
* GdkDrop:display:
*
* The `GdkDisplay` that the drop belongs to.
*/
properties[PROP_DISPLAY] =
gdk_drop_properties[GDK_DROP_PROP_DISPLAY] =
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READABLE |
@@ -359,11 +359,11 @@ gdk_drop_class_init (GdkDropClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrop:drag: (attributes org.gtk.Property.get=gdk_drop_get_drag)
* GdkDrop:drag:
*
* The `GdkDrag` that initiated this drop
*/
properties[PROP_DRAG] =
gdk_drop_properties[GDK_DROP_PROP_DRAG] =
g_param_spec_object ("drag", NULL, NULL,
GDK_TYPE_DRAG,
G_PARAM_READWRITE |
@@ -372,11 +372,11 @@ gdk_drop_class_init (GdkDropClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrop:formats: (attributes org.gtk.Property.get=gdk_drop_get_formats)
* GdkDrop:formats:
*
* The possible formats that the drop can provide its data in.
*/
properties[PROP_FORMATS] =
gdk_drop_properties[GDK_DROP_PROP_FORMATS] =
g_param_spec_boxed ("formats", NULL, NULL,
GDK_TYPE_CONTENT_FORMATS,
G_PARAM_READWRITE |
@@ -385,11 +385,11 @@ gdk_drop_class_init (GdkDropClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkDrop:surface: (attributes org.gtk.Property.get=gdk_drop_get_surface)
* GdkDrop:surface:
*
* The `GdkSurface` the drop happens on
*/
properties[PROP_SURFACE] =
gdk_drop_properties[GDK_DROP_PROP_SURFACE] =
g_param_spec_object ("surface", NULL, NULL,
GDK_TYPE_SURFACE,
G_PARAM_READWRITE |
@@ -397,7 +397,7 @@ gdk_drop_class_init (GdkDropClass *klass)
G_PARAM_STATIC_STRINGS |
G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
g_object_class_install_properties (object_class, GDK_DROP_N_PROPERTIES, gdk_drop_properties);
}
static void
@@ -406,7 +406,7 @@ gdk_drop_init (GdkDrop *self)
}
/**
* gdk_drop_get_display: (attributes org.gtk.Method.get_property=display)
* gdk_drop_get_display:
* @self: a `GdkDrop`
*
* Gets the `GdkDisplay` that @self was created for.
@@ -424,7 +424,7 @@ gdk_drop_get_display (GdkDrop *self)
}
/**
* gdk_drop_get_device: (attributes org.gtk.Method.get_property=device)
* gdk_drop_get_device:
* @self: a `GdkDrop`
*
* Returns the `GdkDevice` performing the drop.
@@ -442,7 +442,7 @@ gdk_drop_get_device (GdkDrop *self)
}
/**
* gdk_drop_get_formats: (attributes org.gtk.Method.get_property=formats)
* gdk_drop_get_formats:
* @self: a `GdkDrop`
*
* Returns the `GdkContentFormats` that the drop offers the data
@@ -461,7 +461,7 @@ gdk_drop_get_formats (GdkDrop *self)
}
/**
* gdk_drop_get_surface: (attributes org.gtk.Method.get_property=surface)
* gdk_drop_get_surface:
* @self: a `GdkDrop`
*
* Returns the `GdkSurface` performing the drop.
@@ -479,7 +479,7 @@ gdk_drop_get_surface (GdkDrop *self)
}
/**
* gdk_drop_get_actions: (attributes org.gtk.Method.get_property=actions)
* gdk_drop_get_actions:
* @self: a `GdkDrop`
*
* Returns the possible actions for this `GdkDrop`.
@@ -524,11 +524,11 @@ gdk_drop_set_actions (GdkDrop *self,
priv->actions = actions;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ACTIONS]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_drop_properties[GDK_DROP_PROP_ACTIONS]);
}
/**
* gdk_drop_get_drag: (attributes org.gtk.Method.get_property=drag)
* gdk_drop_get_drag:
* @self: a `GdkDrop`
*
* If this is an in-app drag-and-drop operation, returns the `GdkDrag`
@@ -764,7 +764,7 @@ gdk_drop_read_value_got_stream (GObject *source,
}
static void
free_value (gpointer value)
gdk_drop_free_value (gpointer value)
{
g_value_unset (value);
g_free (value);
@@ -792,7 +792,7 @@ gdk_drop_read_value_internal (GdkDrop *self,
g_task_set_source_tag (task, source_tag);
value = g_new0 (GValue, 1);
g_value_init (value, type);
g_task_set_task_data (task, value, free_value);
g_task_set_task_data (task, value, gdk_drop_free_value);
if (priv->drag)
{
+12 -1
View File
@@ -978,9 +978,13 @@ gdk_event_get_axis (GdkEvent *event,
* according to platform conventions.
*
* The right mouse button typically triggers context menus.
* On macOS, Control+left mouse button also triggers.
*
* This function should always be used instead of simply checking for
* event->button == %GDK_BUTTON_SECONDARY.
*
* ```c
* event->button == GDK_BUTTON_SECONDARY
* ```
*
* Returns: %TRUE if the event should trigger a context menu.
*/
@@ -998,6 +1002,13 @@ gdk_event_triggers_context_menu (GdkEvent *event)
if (bevent->button == GDK_BUTTON_SECONDARY &&
! (bevent->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK)))
return TRUE;
#ifdef __APPLE__
if (bevent->button == GDK_BUTTON_PRIMARY &&
(bevent->state & GDK_CONTROL_MASK) &&
! (bevent->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK)))
return TRUE;
#endif
}
return FALSE;
+23 -23
View File
@@ -65,17 +65,17 @@
*/
enum {
FLUSH_EVENTS,
BEFORE_PAINT,
UPDATE,
LAYOUT,
PAINT,
AFTER_PAINT,
RESUME_EVENTS,
LAST_SIGNAL
GDK_FRAME_CLOCK_FLUSH_EVENTS,
GDK_FRAME_CLOCK_BEFORE_PAINT,
GDK_FRAME_CLOCK_UPDATE,
GDK_FRAME_CLOCK_LAYOUT,
GDK_FRAME_CLOCK_PAINT,
GDK_FRAME_CLOCK_AFTER_PAINT,
GDK_FRAME_CLOCK_RESUME_EVENTS,
GDK_FRAME_CLOCK_LAST_SIGNAL
};
static guint signals[LAST_SIGNAL];
static guint gdk_frame_clock_signals[GDK_FRAME_CLOCK_LAST_SIGNAL];
static guint fps_counter;
@@ -139,7 +139,7 @@ gdk_frame_clock_class_init (GdkFrameClockClass *klass)
*
* Applications should not handle this signal.
*/
signals[FLUSH_EVENTS] =
gdk_frame_clock_signals[GDK_FRAME_CLOCK_FLUSH_EVENTS] =
g_signal_new (g_intern_static_string ("flush-events"),
GDK_TYPE_FRAME_CLOCK,
G_SIGNAL_RUN_LAST,
@@ -155,7 +155,7 @@ gdk_frame_clock_class_init (GdkFrameClockClass *klass)
*
* Applications should generally not handle this signal.
*/
signals[BEFORE_PAINT] =
gdk_frame_clock_signals[GDK_FRAME_CLOCK_BEFORE_PAINT] =
g_signal_new (g_intern_static_string ("before-paint"),
GDK_TYPE_FRAME_CLOCK,
G_SIGNAL_RUN_LAST,
@@ -175,7 +175,7 @@ gdk_frame_clock_class_init (GdkFrameClockClass *klass)
* [gtk_widget_add_tick_callback()](../gtk4/method.Widget.add_tick_callback.html)
* as a more convenient interface.
*/
signals[UPDATE] =
gdk_frame_clock_signals[GDK_FRAME_CLOCK_UPDATE] =
g_signal_new (g_intern_static_string ("update"),
GDK_TYPE_FRAME_CLOCK,
G_SIGNAL_RUN_LAST,
@@ -193,7 +193,7 @@ gdk_frame_clock_class_init (GdkFrameClockClass *klass)
* Any work to update sizes and positions of application elements
* should be performed. GTK normally handles this internally.
*/
signals[LAYOUT] =
gdk_frame_clock_signals[GDK_FRAME_CLOCK_LAYOUT] =
g_signal_new (g_intern_static_string ("layout"),
GDK_TYPE_FRAME_CLOCK,
G_SIGNAL_RUN_LAST,
@@ -213,7 +213,7 @@ gdk_frame_clock_class_init (GdkFrameClockClass *klass)
* [GtkWidget::snapshot](../gtk4/signal.Widget.snapshot.html) signals
* by GTK.
*/
signals[PAINT] =
gdk_frame_clock_signals[GDK_FRAME_CLOCK_PAINT] =
g_signal_new (g_intern_static_string ("paint"),
GDK_TYPE_FRAME_CLOCK,
G_SIGNAL_RUN_LAST,
@@ -229,7 +229,7 @@ gdk_frame_clock_class_init (GdkFrameClockClass *klass)
*
* Applications should generally not handle this signal.
*/
signals[AFTER_PAINT] =
gdk_frame_clock_signals[GDK_FRAME_CLOCK_AFTER_PAINT] =
g_signal_new (g_intern_static_string ("after-paint"),
GDK_TYPE_FRAME_CLOCK,
G_SIGNAL_RUN_LAST,
@@ -246,7 +246,7 @@ gdk_frame_clock_class_init (GdkFrameClockClass *klass)
* This signal is handled internally by GTK to resume normal
* event processing. Applications should not handle this signal.
*/
signals[RESUME_EVENTS] =
gdk_frame_clock_signals[GDK_FRAME_CLOCK_RESUME_EVENTS] =
g_signal_new (g_intern_static_string ("resume-events"),
GDK_TYPE_FRAME_CLOCK,
G_SIGNAL_RUN_LAST,
@@ -693,13 +693,13 @@ gdk_frame_clock_get_refresh_info (GdkFrameClock *frame_clock,
void
_gdk_frame_clock_emit_flush_events (GdkFrameClock *frame_clock)
{
g_signal_emit (frame_clock, signals[FLUSH_EVENTS], 0);
g_signal_emit (frame_clock, gdk_frame_clock_signals[GDK_FRAME_CLOCK_FLUSH_EVENTS], 0);
}
void
_gdk_frame_clock_emit_before_paint (GdkFrameClock *frame_clock)
{
g_signal_emit (frame_clock, signals[BEFORE_PAINT], 0);
g_signal_emit (frame_clock, gdk_frame_clock_signals[GDK_FRAME_CLOCK_BEFORE_PAINT], 0);
}
void
@@ -709,7 +709,7 @@ _gdk_frame_clock_emit_update (GdkFrameClock *frame_clock)
before = GDK_PROFILER_CURRENT_TIME;
g_signal_emit (frame_clock, signals[UPDATE], 0);
g_signal_emit (frame_clock, gdk_frame_clock_signals[GDK_FRAME_CLOCK_UPDATE], 0);
gdk_profiler_end_mark (before, "Frameclock update", NULL);
}
@@ -721,7 +721,7 @@ _gdk_frame_clock_emit_layout (GdkFrameClock *frame_clock)
before = GDK_PROFILER_CURRENT_TIME;
g_signal_emit (frame_clock, signals[LAYOUT], 0);
g_signal_emit (frame_clock, gdk_frame_clock_signals[GDK_FRAME_CLOCK_LAYOUT], 0);
gdk_profiler_end_mark (before, "Frameclock layout", NULL);
}
@@ -733,7 +733,7 @@ _gdk_frame_clock_emit_paint (GdkFrameClock *frame_clock)
before = GDK_PROFILER_CURRENT_TIME;
g_signal_emit (frame_clock, signals[PAINT], 0);
g_signal_emit (frame_clock, gdk_frame_clock_signals[GDK_FRAME_CLOCK_PAINT], 0);
gdk_profiler_end_mark (before, "Frameclock paint", NULL);
}
@@ -741,13 +741,13 @@ _gdk_frame_clock_emit_paint (GdkFrameClock *frame_clock)
void
_gdk_frame_clock_emit_after_paint (GdkFrameClock *frame_clock)
{
g_signal_emit (frame_clock, signals[AFTER_PAINT], 0);
g_signal_emit (frame_clock, gdk_frame_clock_signals[GDK_FRAME_CLOCK_AFTER_PAINT], 0);
}
void
_gdk_frame_clock_emit_resume_events (GdkFrameClock *frame_clock)
{
g_signal_emit (frame_clock, signals[RESUME_EVENTS], 0);
g_signal_emit (frame_clock, gdk_frame_clock_signals[GDK_FRAME_CLOCK_RESUME_EVENTS], 0);
}
static gint64
+73 -73
View File
@@ -35,13 +35,13 @@
#include <windows.h>
#endif
#define FRAME_INTERVAL 16667 /* microseconds */
#define GDK_FRAME_CLOCK_IDLE_FRAME_INTERVAL 16667 /* microseconds */
typedef enum {
SMOOTH_PHASE_STATE_VALID = 0, /* explicit, since we count on zero-init */
SMOOTH_PHASE_STATE_AWAIT_FIRST,
SMOOTH_PHASE_STATE_AWAIT_DRAWN,
} SmoothDeltaState;
GDK_FRAME_CLOCK_IDLE_SMOOTH_PHASE_STATE_VALID = 0, /* explicit, since we count on zero-init */
GDK_FRAME_CLOCK_IDLE_SMOOTH_PHASE_STATE_AWAIT_FIRST,
GDK_FRAME_CLOCK_IDLE_SMOOTH_PHASE_STATE_AWAIT_DRAWN,
} GdkFrameClockIdleSmoothDeltaState;
struct _GdkFrameClockIdlePrivate
{
@@ -51,9 +51,9 @@ struct _GdkFrameClockIdlePrivate
gint64 smoothed_frame_time_reported; /* Ensures we are always monotonic */
gint64 smoothed_frame_time_phase; /* The offset of the first reported frame time, in the current animation sequence, from the preceding vsync */
gint64 min_next_frame_time; /* We're not synced to vblank, so wait at least until this before next cycle to avoid busy looping */
SmoothDeltaState smooth_phase_state; /* The state of smoothed_frame_time_phase - is it valid, awaiting vsync etc. Thanks to zero-init, the initial value
GdkFrameClockIdleSmoothDeltaState smooth_phase_state; /* The state of smoothed_frame_time_phase - is it valid, awaiting vsync etc. Thanks to zero-init, the initial value
of smoothed_frame_time_phase is `0`. This is valid, since we didn't get a "frame drawn" event yet. Accordingly,
the initial value of smooth_phase_state is SMOOTH_PHASE_STATE_VALID. See the comment in gdk_frame_clock_paint_idle()
the initial value of smooth_phase_state is GDK_FRAME_CLOCK_IDLE_SMOOTH_PHASE_STATE_VALID. See the comment in gdk_frame_clock_paint_idle()
for details. */
gint64 sleep_serial;
@@ -79,57 +79,57 @@ static gboolean gdk_frame_clock_paint_idle (void *data);
G_DEFINE_TYPE_WITH_PRIVATE (GdkFrameClockIdle, gdk_frame_clock_idle, GDK_TYPE_FRAME_CLOCK)
static gint64 sleep_serial;
static gint64 sleep_source_prepare_time;
static GSource *sleep_source;
static gint64 gdk_frame_clock_idle_sleep_serial;
static gint64 gdk_frame_clock_idle_sleep_source_prepare_time;
static GSource *gdk_frame_clock_idle_sleep_source;
static gboolean
sleep_source_prepare (GSource *source,
gdk_frame_clock_idle_sleep_source_prepare (GSource *source,
int *timeout)
{
sleep_source_prepare_time = g_source_get_time (source);
gdk_frame_clock_idle_sleep_source_prepare_time = g_source_get_time (source);
*timeout = -1;
return FALSE;
}
static gboolean
sleep_source_check (GSource *source)
gdk_frame_clock_idle_sleep_source_check (GSource *source)
{
if (g_source_get_time (source) != sleep_source_prepare_time)
sleep_serial++;
if (g_source_get_time (source) != gdk_frame_clock_idle_sleep_source_prepare_time)
gdk_frame_clock_idle_sleep_serial++;
return FALSE;
}
static gboolean
sleep_source_dispatch (GSource *source,
GSourceFunc callback,
gpointer user_data)
gdk_frame_clock_idle_sleep_source_dispatch (GSource *source,
GSourceFunc callback,
gpointer user_data)
{
return TRUE;
}
static GSourceFuncs sleep_source_funcs = {
sleep_source_prepare,
sleep_source_check,
sleep_source_dispatch,
NULL /* finalize */
};
static gint64
get_sleep_serial (void)
gdk_frame_clock_idle_get_sleep_serial (void)
{
if (sleep_source == NULL)
{
sleep_source = g_source_new (&sleep_source_funcs, sizeof (GSource));
static GSourceFuncs sleep_source_funcs = {
gdk_frame_clock_idle_sleep_source_prepare,
gdk_frame_clock_idle_sleep_source_check,
gdk_frame_clock_idle_sleep_source_dispatch,
NULL /* finalize */
};
g_source_set_static_name (sleep_source, "[gtk] sleep serial");
g_source_set_priority (sleep_source, G_PRIORITY_HIGH);
g_source_attach (sleep_source, NULL);
g_source_unref (sleep_source);
if (gdk_frame_clock_idle_sleep_source == NULL)
{
gdk_frame_clock_idle_sleep_source = g_source_new (&sleep_source_funcs, sizeof (GSource));
g_source_set_static_name (gdk_frame_clock_idle_sleep_source, "[gtk] sleep serial");
g_source_set_priority (gdk_frame_clock_idle_sleep_source, G_PRIORITY_HIGH);
g_source_attach (gdk_frame_clock_idle_sleep_source, NULL);
g_source_unref (gdk_frame_clock_idle_sleep_source);
}
return sleep_serial;
return gdk_frame_clock_idle_sleep_serial;
}
static void
@@ -141,7 +141,7 @@ gdk_frame_clock_idle_init (GdkFrameClockIdle *frame_clock_idle)
gdk_frame_clock_idle_get_instance_private (frame_clock_idle);
priv->freeze_count = 0;
priv->smoothed_frame_time_period = FRAME_INTERVAL;
priv->smoothed_frame_time_period = GDK_FRAME_CLOCK_IDLE_FRAME_INTERVAL;
}
static void
@@ -175,11 +175,11 @@ gdk_frame_clock_idle_dispose (GObject *object)
/* Note: This is never called on first frame, so
* smoothed_frame_time_base != 0 and we have a valid frame_interval. */
static gint64
compute_smooth_frame_time (GdkFrameClock *clock,
gint64 new_frame_time,
gboolean new_frame_time_is_vsync_related,
gint64 smoothed_frame_time_base,
gint64 frame_interval)
gdk_frame_clock_idle_compute_smooth_frame_time (GdkFrameClock *clock,
gint64 new_frame_time,
gboolean new_frame_time_is_vsync_related,
gint64 smoothed_frame_time_base,
gint64 frame_interval)
{
GdkFrameClockIdlePrivate *priv = GDK_FRAME_CLOCK_IDLE (clock)->priv;
int frames_passed;
@@ -267,9 +267,9 @@ gdk_frame_clock_idle_get_frame_time (GdkFrameClock *clock)
/* Since time is monotonic this is <= what we will pick for the next cycle, but
more likely than not it will be equal if we're doing a constant animation. */
new_smoothed_time = compute_smooth_frame_time (clock, now, FALSE,
priv->smoothed_frame_time_base,
priv->smoothed_frame_time_period);
new_smoothed_time = gdk_frame_clock_idle_compute_smooth_frame_time (clock, now, FALSE,
priv->smoothed_frame_time_base,
priv->smoothed_frame_time_period);
priv->smoothed_frame_time_reported = new_smoothed_time;
return new_smoothed_time;
@@ -287,7 +287,7 @@ gdk_frame_clock_idle_is_frozen (GdkFrameClockIdle *self)
}
static inline gboolean
should_run_flush_idle (GdkFrameClockIdle *self)
gdk_frame_clock_idle_should_run_flush_idle (GdkFrameClockIdle *self)
{
GdkFrameClockIdlePrivate *priv = self->priv;
@@ -301,7 +301,7 @@ should_run_flush_idle (GdkFrameClockIdle *self)
* is cancelled.
*/
static inline gboolean
should_run_paint_idle (GdkFrameClockIdle *self)
gdk_frame_clock_idle_should_run_paint_idle (GdkFrameClockIdle *self)
{
GdkFrameClockIdlePrivate *priv = self->priv;
@@ -311,12 +311,12 @@ should_run_paint_idle (GdkFrameClockIdle *self)
}
static void
maybe_start_idle (GdkFrameClockIdle *self,
gboolean caused_by_thaw)
gdk_frame_clock_idle_maybe_start_idle (GdkFrameClockIdle *self,
gboolean caused_by_thaw)
{
GdkFrameClockIdlePrivate *priv = self->priv;
if (should_run_flush_idle (self) || should_run_paint_idle (self))
if (gdk_frame_clock_idle_should_run_flush_idle (self) || gdk_frame_clock_idle_should_run_paint_idle (self))
{
guint min_interval = 0;
@@ -328,7 +328,7 @@ maybe_start_idle (GdkFrameClockIdle *self,
min_interval = (min_interval_us + 500) / 1000;
}
if (priv->flush_idle_id == 0 && should_run_flush_idle (self))
if (priv->flush_idle_id == 0 && gdk_frame_clock_idle_should_run_flush_idle (self))
{
GSource *source;
@@ -342,7 +342,7 @@ maybe_start_idle (GdkFrameClockIdle *self,
}
if (!priv->in_paint_idle &&
priv->paint_idle_id == 0 && should_run_paint_idle (self))
priv->paint_idle_id == 0 && gdk_frame_clock_idle_should_run_paint_idle (self))
{
priv->paint_is_thaw = caused_by_thaw;
priv->paint_idle_id = g_timeout_add_full (GDK_PRIORITY_REDRAW,
@@ -356,17 +356,17 @@ maybe_start_idle (GdkFrameClockIdle *self,
}
static void
maybe_stop_idle (GdkFrameClockIdle *self)
gdk_frame_clock_idle_maybe_stop_idle (GdkFrameClockIdle *self)
{
GdkFrameClockIdlePrivate *priv = self->priv;
if (priv->flush_idle_id != 0 && !should_run_flush_idle (self))
if (priv->flush_idle_id != 0 && !gdk_frame_clock_idle_should_run_flush_idle (self))
{
g_source_remove (priv->flush_idle_id);
priv->flush_idle_id = 0;
}
if (priv->paint_idle_id != 0 && !should_run_paint_idle (self))
if (priv->paint_idle_id != 0 && !gdk_frame_clock_idle_should_run_paint_idle (self))
{
g_source_remove (priv->paint_idle_id);
priv->paint_idle_id = 0;
@@ -456,7 +456,7 @@ gdk_frame_clock_paint_idle (void *data)
case GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT:
if (!gdk_frame_clock_idle_is_frozen (clock_idle))
{
gint64 frame_interval = FRAME_INTERVAL;
gint64 frame_interval = GDK_FRAME_CLOCK_IDLE_FRAME_INTERVAL;
GdkFrameTimings *prev_timings = gdk_frame_clock_get_current_timings (clock);
if (prev_timings && prev_timings->refresh_interval)
@@ -512,14 +512,14 @@ gdk_frame_clock_paint_idle (void *data)
* adjusted times | * | * | + | + | + |...
* phase ^------^
*/
if (priv->smooth_phase_state == SMOOTH_PHASE_STATE_AWAIT_FIRST)
if (priv->smooth_phase_state == GDK_FRAME_CLOCK_IDLE_SMOOTH_PHASE_STATE_AWAIT_FIRST)
{
/* First animation cycle - usually unrelated to vsync */
priv->smoothed_frame_time_base = 0;
priv->smoothed_frame_time_phase = 0;
priv->smooth_phase_state = SMOOTH_PHASE_STATE_AWAIT_DRAWN;
priv->smooth_phase_state = GDK_FRAME_CLOCK_IDLE_SMOOTH_PHASE_STATE_AWAIT_DRAWN;
}
else if (priv->smooth_phase_state == SMOOTH_PHASE_STATE_AWAIT_DRAWN &&
else if (priv->smooth_phase_state == GDK_FRAME_CLOCK_IDLE_SMOOTH_PHASE_STATE_AWAIT_DRAWN &&
priv->paint_is_thaw)
{
/* First vsync-related animation cycle, we can now compute the phase. We want the phase to satisfy
@@ -527,7 +527,7 @@ gdk_frame_clock_paint_idle (void *data)
priv->smoothed_frame_time_phase =
positive_modulo (priv->smoothed_frame_time_base - priv->frame_time,
frame_interval);
priv->smooth_phase_state = SMOOTH_PHASE_STATE_VALID;
priv->smooth_phase_state = GDK_FRAME_CLOCK_IDLE_SMOOTH_PHASE_STATE_VALID;
}
if (priv->smoothed_frame_time_base == 0)
@@ -539,10 +539,10 @@ gdk_frame_clock_paint_idle (void *data)
{
/* compute_smooth_frame_time() ensures monotonicity */
priv->smoothed_frame_time_base =
compute_smooth_frame_time (clock, priv->frame_time + priv->smoothed_frame_time_phase,
priv->paint_is_thaw,
priv->smoothed_frame_time_base,
priv->smoothed_frame_time_period);
gdk_frame_clock_idle_compute_smooth_frame_time (clock, priv->frame_time + priv->smoothed_frame_time_phase,
priv->paint_is_thaw,
priv->smoothed_frame_time_base,
priv->smoothed_frame_time_period);
}
priv->smoothed_frame_time_period = frame_interval;
@@ -554,7 +554,7 @@ gdk_frame_clock_paint_idle (void *data)
timings->frame_time = priv->frame_time;
timings->smoothed_frame_time = priv->smoothed_frame_time_base;
timings->slept_before = priv->sleep_serial != get_sleep_serial ();
timings->slept_before = priv->sleep_serial != gdk_frame_clock_idle_get_sleep_serial ();
priv->phase = GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT;
@@ -688,11 +688,11 @@ gdk_frame_clock_paint_idle (void *data)
gint64 smooth_cycle_start = priv->smoothed_frame_time_base - priv->smoothed_frame_time_phase;
priv->min_next_frame_time = smooth_cycle_start + priv->smoothed_frame_time_period;
maybe_start_idle (clock_idle, FALSE);
gdk_frame_clock_idle_maybe_start_idle (clock_idle, FALSE);
}
if (!gdk_frame_clock_idle_is_frozen (clock_idle))
priv->sleep_serial = get_sleep_serial ();
priv->sleep_serial = gdk_frame_clock_idle_get_sleep_serial ();
gdk_profiler_end_mark (before, "Frameclock cycle", NULL);
@@ -707,7 +707,7 @@ gdk_frame_clock_idle_request_phase (GdkFrameClock *clock,
GdkFrameClockIdlePrivate *priv = clock_idle->priv;
priv->requested |= phase;
maybe_start_idle (clock_idle, FALSE);
gdk_frame_clock_idle_maybe_start_idle (clock_idle, FALSE);
}
static void
@@ -727,11 +727,11 @@ gdk_frame_clock_idle_begin_updating (GdkFrameClock *clock)
if (priv->updating_count == 0)
{
priv->smooth_phase_state = SMOOTH_PHASE_STATE_AWAIT_FIRST;
priv->smooth_phase_state = GDK_FRAME_CLOCK_IDLE_SMOOTH_PHASE_STATE_AWAIT_FIRST;
}
priv->updating_count++;
maybe_start_idle (clock_idle, FALSE);
gdk_frame_clock_idle_maybe_start_idle (clock_idle, FALSE);
}
static void
@@ -743,11 +743,11 @@ gdk_frame_clock_idle_end_updating (GdkFrameClock *clock)
g_return_if_fail (priv->updating_count > 0);
priv->updating_count--;
maybe_stop_idle (clock_idle);
gdk_frame_clock_idle_maybe_stop_idle (clock_idle);
if (priv->updating_count == 0)
{
priv->smooth_phase_state = SMOOTH_PHASE_STATE_VALID;
priv->smooth_phase_state = GDK_FRAME_CLOCK_IDLE_SMOOTH_PHASE_STATE_VALID;
}
#ifdef G_OS_WIN32
@@ -772,7 +772,7 @@ gdk_frame_clock_idle_freeze (GdkFrameClock *clock)
}
priv->freeze_count++;
maybe_stop_idle (clock_idle);
gdk_frame_clock_idle_maybe_stop_idle (clock_idle);
}
static void
@@ -786,7 +786,7 @@ gdk_frame_clock_idle_thaw (GdkFrameClock *clock)
priv->freeze_count--;
if (!gdk_frame_clock_idle_is_frozen (clock_idle))
{
maybe_start_idle (clock_idle, TRUE);
gdk_frame_clock_idle_maybe_start_idle (clock_idle, TRUE);
/* If nothing is requested so we didn't start an idle, we need
* to skip to the end of the state chain, since the idle won't
* run and do it for us.
@@ -794,7 +794,7 @@ gdk_frame_clock_idle_thaw (GdkFrameClock *clock)
if (priv->paint_idle_id == 0)
priv->phase = GDK_FRAME_CLOCK_PHASE_NONE;
priv->sleep_serial = get_sleep_serial ();
priv->sleep_serial = gdk_frame_clock_idle_get_sleep_serial ();
if (GDK_PROFILER_IS_RUNNING)
{
+98 -55
View File
@@ -122,6 +122,7 @@ struct _GdkGLContextPrivate
GdkGLMemoryFlags memory_flags[GDK_MEMORY_N_FORMATS];
GdkGLFeatures features;
guint surface_attached : 1;
guint use_khr_debug : 1;
guint has_debug_output : 1;
guint extensions_checked : 1;
@@ -141,16 +142,16 @@ struct _GdkGLContextPrivate
};
enum {
PROP_0,
GDK_GL_CONTEXT_PROP_0,
PROP_ALLOWED_APIS,
PROP_API,
PROP_SHARED_CONTEXT,
GDK_GL_CONTEXT_PROP_ALLOWED_APIS,
GDK_GL_CONTEXT_PROP_API,
GDK_GL_CONTEXT_PROP_SHARED_CONTEXT,
LAST_PROP
GDK_GL_CONTEXT_LAST_PROP
};
static GParamSpec *properties[LAST_PROP] = { NULL, };
static GParamSpec *gdk_gl_context_properties[GDK_GL_CONTEXT_LAST_PROP] = { NULL, };
/**
* gdk_gl_error_quark:
@@ -236,11 +237,11 @@ gdk_gl_context_set_property (GObject *object,
switch (prop_id)
{
case PROP_ALLOWED_APIS:
case GDK_GL_CONTEXT_PROP_ALLOWED_APIS:
gdk_gl_context_set_allowed_apis (self, g_value_get_flags (value));
break;
case PROP_SHARED_CONTEXT:
case GDK_GL_CONTEXT_PROP_SHARED_CONTEXT:
g_assert (g_value_get_object (value) == NULL);
break;
@@ -260,15 +261,15 @@ gdk_gl_context_get_property (GObject *object,
switch (prop_id)
{
case PROP_ALLOWED_APIS:
case GDK_GL_CONTEXT_PROP_ALLOWED_APIS:
g_value_set_flags (value, priv->allowed_apis);
break;
case PROP_API:
case GDK_GL_CONTEXT_PROP_API:
g_value_set_flags (value, priv->api);
break;
case PROP_SHARED_CONTEXT:
case GDK_GL_CONTEXT_PROP_SHARED_CONTEXT:
g_value_set_object (value, NULL);
break;
@@ -717,8 +718,8 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context,
cairo_region_get_rectangle (painted, i, &rect);
rects[j++] = (int) floor (rect.x * scale);
rects[j++] = (int) floor ((surface_height - rect.height - rect.y) * scale);
rects[j++] = (int) ceil (rect.width * scale);
rects[j++] = (int) ceil (rect.height * scale);
rects[j++] = (int) ceil ((rect.x + rect.width) * scale) - floor (rect.x * scale);
rects[j++] = (int) ceil ((surface_height - rect.y) * scale) - floor ((surface_height - rect.height - rect.y) * scale);
}
priv->eglSwapBuffersWithDamage (gdk_display_get_egl_display (display), egl_surface, rects, n_rects);
g_free (heap_rects);
@@ -763,7 +764,7 @@ gdk_gl_context_class_init (GdkGLContextClass *klass)
draw_context_class->surface_resized = gdk_gl_context_surface_resized;
/**
* GdkGLContext:shared-context: (attributes org.gtk.Property.get=gdk_gl_context_get_shared_context)
* GdkGLContext:shared-context:
*
* Always %NULL
*
@@ -773,7 +774,7 @@ gdk_gl_context_class_init (GdkGLContextClass *klass)
* Deprecated: 4.4: Use [method@Gdk.GLContext.is_shared] to check if contexts
* can be shared.
*/
properties[PROP_SHARED_CONTEXT] =
gdk_gl_context_properties[GDK_GL_CONTEXT_PROP_SHARED_CONTEXT] =
g_param_spec_object ("shared-context", NULL, NULL,
GDK_TYPE_GL_CONTEXT,
G_PARAM_READWRITE |
@@ -782,13 +783,13 @@ gdk_gl_context_class_init (GdkGLContextClass *klass)
G_PARAM_DEPRECATED);
/**
* GdkGLContext:allowed-apis: (attributes org.gtk.Property.get=gdk_gl_context_get_allowed_apis org.gtk.Property.gdk_gl_context_set_allowed_apis)
* GdkGLContext:allowed-apis:
*
* The allowed APIs.
*
* Since: 4.6
*/
properties[PROP_ALLOWED_APIS] =
gdk_gl_context_properties[GDK_GL_CONTEXT_PROP_ALLOWED_APIS] =
g_param_spec_flags ("allowed-apis", NULL, NULL,
GDK_TYPE_GL_API,
DEFAULT_ALLOWED_APIS,
@@ -797,13 +798,13 @@ gdk_gl_context_class_init (GdkGLContextClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkGLContext:api: (attributes org.gtk.Property.get=gdk_gl_context_get_api)
* GdkGLContext:api:
*
* The API currently in use.
*
* Since: 4.6
*/
properties[PROP_API] =
gdk_gl_context_properties[GDK_GL_CONTEXT_PROP_API] =
g_param_spec_flags ("api", NULL, NULL,
GDK_TYPE_GL_API,
0,
@@ -815,7 +816,7 @@ gdk_gl_context_class_init (GdkGLContextClass *klass)
gobject_class->get_property = gdk_gl_context_get_property;
gobject_class->dispose = gdk_gl_context_dispose;
g_object_class_install_properties (gobject_class, LAST_PROP, properties);
g_object_class_install_properties (gobject_class, GDK_GL_CONTEXT_LAST_PROP, gdk_gl_context_properties);
}
static void
@@ -829,20 +830,28 @@ gdk_gl_context_init (GdkGLContext *self)
/* Must have called gdk_display_prepare_gl() before */
GdkGLContext *
gdk_gl_context_new (GdkDisplay *display,
GdkSurface *surface)
GdkSurface *surface,
gboolean surface_attached)
{
GdkGLContext *shared;
GdkGLContextPrivate *priv;
GdkGLContext *shared, *result;
g_assert (surface == NULL || display == gdk_surface_get_display (surface));
g_assert (!surface_attached || surface != NULL);
/* assert gdk_display_prepare_gl() had been called */
shared = gdk_display_get_gl_context (display);
g_assert (shared);
return g_object_new (G_OBJECT_TYPE (shared),
"display", display,
"surface", surface,
NULL);
result = g_object_new (G_OBJECT_TYPE (shared),
"display", display,
"surface", surface,
NULL);
priv = gdk_gl_context_get_instance_private (result);
priv->surface_attached = surface_attached;
return result;
}
void
@@ -1241,7 +1250,7 @@ gdk_gl_context_is_shared (GdkGLContext *self,
}
/**
* gdk_gl_context_set_allowed_apis: (attributes org.gtk.Method.set_property=allowed-apis)
* gdk_gl_context_set_allowed_apis:
* @self: a GL context
* @apis: the allowed APIs
*
@@ -1268,11 +1277,11 @@ gdk_gl_context_set_allowed_apis (GdkGLContext *self,
priv->allowed_apis = apis;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ALLOWED_APIS]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_context_properties[GDK_GL_CONTEXT_PROP_ALLOWED_APIS]);
}
/**
* gdk_gl_context_get_allowed_apis: (attributes org.gtk.Method.get_property=allowed-apis)
* gdk_gl_context_get_allowed_apis:
* @self: a GL context
*
* Gets the allowed APIs set via gdk_gl_context_set_allowed_apis().
@@ -1292,7 +1301,7 @@ gdk_gl_context_get_allowed_apis (GdkGLContext *self)
}
/**
* gdk_gl_context_get_api: (attributes org.gtk.Method.get_property=api)
* gdk_gl_context_get_api:
* @self: a GL context
*
* Gets the API currently in use.
@@ -1319,31 +1328,28 @@ gdk_gl_context_is_api_allowed (GdkGLContext *self,
GError **error)
{
GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (self);
GdkDebugFlags flags;
GdkGLAPI allowed_apis;
allowed_apis = priv->allowed_apis;
flags = gdk_display_get_debug_flags (gdk_gl_context_get_display (self));
if (flags & GDK_DEBUG_GL_DISABLE_GLES)
if (!gdk_has_feature (GDK_FEATURE_GLES_API))
{
if (api == GDK_GL_API_GLES)
{
g_set_error_literal (error, GDK_GL_ERROR, GDK_GL_ERROR_NOT_AVAILABLE,
_("OpenGL ES disabled via GDK_DEBUG"));
_("OpenGL ES API disabled via GDK_DISABLE"));
return FALSE;
}
allowed_apis &= ~GDK_GL_API_GLES;
}
if (flags & GDK_DEBUG_GL_DISABLE_GL)
if (!gdk_has_feature (GDK_FEATURE_GL_API))
{
if (api == GDK_GL_API_GL)
{
g_set_error_literal (error, GDK_GL_ERROR, GDK_GL_ERROR_NOT_AVAILABLE,
_("OpenGL disabled via GDK_DEBUG"));
_("OpenGL API disabled via GDK_DISABLE"));
return FALSE;
}
@@ -1553,7 +1559,7 @@ gdk_gl_context_realize (GdkGLContext *context,
{
g_assert (gdk_gl_version_greater_equal (&priv->gl_version, &GDK_GL_VERSION_INIT (0, 0)));
g_object_notify_by_pspec (G_OBJECT (context), properties[PROP_API]);
g_object_notify_by_pspec (G_OBJECT (context), gdk_gl_context_properties[GDK_GL_CONTEXT_PROP_API]);
}
return priv->api;
@@ -1770,8 +1776,10 @@ gdk_gl_context_check_extensions (GdkGLContext *context)
supported_features = gdk_gl_context_check_features (context);
disabled_features = gdk_parse_debug_var ("GDK_GL_DISABLE",
gdk_gl_feature_keys,
G_N_ELEMENTS (gdk_gl_feature_keys));
"GDK_GL_DISABLE can be set to values which cause GDK to disable\n"
"certain OpenGL extensions.\n",
gdk_gl_feature_keys,
G_N_ELEMENTS (gdk_gl_feature_keys));
priv->features = supported_features & ~disabled_features;
@@ -1825,12 +1833,22 @@ gdk_gl_context_check_is_current (GdkGLContext *context)
void
gdk_gl_context_make_current (GdkGLContext *context)
{
GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
MaskedContext *current, *masked_context;
gboolean surfaceless;
g_return_if_fail (GDK_IS_GL_CONTEXT (context));
surfaceless = !gdk_draw_context_is_in_frame (GDK_DRAW_CONTEXT (context));
if (priv->surface_attached)
{
surfaceless = FALSE;
}
else
{
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
surfaceless = !gdk_draw_context_is_in_frame (GDK_DRAW_CONTEXT (context));
G_GNUC_END_IGNORE_DEPRECATIONS
}
masked_context = mask_context (context, surfaceless);
current = g_private_get (&thread_current_context);
@@ -1895,7 +1913,7 @@ gdk_gl_context_get_surface (GdkGLContext *context)
}
/**
* gdk_gl_context_get_shared_context: (attributes org.gtk.Method.get_property=shared-context)
* gdk_gl_context_get_shared_context:
* @context: a `GdkGLContext`
*
* Used to retrieves the `GdkGLContext` that this @context share data with.
@@ -2019,8 +2037,11 @@ gdk_gl_context_clear_current (void)
*
* Does a gdk_gl_context_clear_current() if the current context is attached
* to @surface, leaves the current context alone otherwise.
*
* Returns: (nullable) (transfer full): The context that was cleared, so that it can be
* re-made current later
**/
void
GdkGLContext *
gdk_gl_context_clear_current_if_surface (GdkSurface *surface)
{
MaskedContext *current;
@@ -2031,11 +2052,20 @@ gdk_gl_context_clear_current_if_surface (GdkSurface *surface)
GdkGLContext *context = unmask_context (current);
if (gdk_gl_context_get_surface (context) != surface)
return;
return NULL;
g_object_ref (context);
if (GDK_GL_CONTEXT_GET_CLASS (context)->clear_current (context))
g_private_replace (&thread_current_context, NULL);
{
g_private_replace (&thread_current_context, NULL);
return context;
}
g_object_unref (context);
}
return NULL;
}
/**
@@ -2135,17 +2165,30 @@ gboolean
gdk_gl_backend_can_be_used (GdkGLBackend backend_type,
GError **error)
{
if (the_gl_backend_type == GDK_GL_NONE ||
the_gl_backend_type == backend_type)
return TRUE;
if (the_gl_backend_type != GDK_GL_NONE &&
the_gl_backend_type != backend_type)
{
g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_NOT_AVAILABLE,
/* translators: This is about OpenGL backend names, like
* "Trying to use X11 GLX, but EGL is already in use"
*/
_("Trying to use %s, but %s is already in use"),
gl_backend_names[backend_type],
gl_backend_names[the_gl_backend_type]);
return FALSE;
}
g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_NOT_AVAILABLE,
/* translators: This is about OpenGL backend names, like
* "Trying to use X11 GLX, but EGL is already in use" */
_("Trying to use %s, but %s is already in use"),
gl_backend_names[backend_type],
gl_backend_names[the_gl_backend_type]);
return FALSE;
if ((backend_type == GDK_GL_EGL && !gdk_has_feature (GDK_FEATURE_EGL)) ||
(backend_type == GDK_GL_GLX && !gdk_has_feature (GDK_FEATURE_GLX)) ||
(backend_type == GDK_GL_WGL && !gdk_has_feature (GDK_FEATURE_WGL)))
{
g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_NOT_AVAILABLE,
_("Trying to use %s, but it is disabled via GDK_DISABLE"),
gl_backend_names[backend_type]);
return FALSE;
}
return TRUE;
}
/*<private>
+4 -3
View File
@@ -120,10 +120,11 @@ gboolean gdk_gl_backend_can_be_used (GdkGLBackend
GError **error);
void gdk_gl_backend_use (GdkGLBackend backend_type);
void gdk_gl_context_clear_current_if_surface (GdkSurface *surface);
GdkGLContext * gdk_gl_context_clear_current_if_surface (GdkSurface *surface) G_GNUC_WARN_UNUSED_RESULT;
GdkGLContext * gdk_gl_context_new (GdkDisplay *display,
GdkSurface *surface);
GdkGLContext * gdk_gl_context_new (GdkDisplay *display,
GdkSurface *surface,
gboolean surface_attached);
gboolean gdk_gl_context_is_api_allowed (GdkGLContext *self,
GdkGLAPI api,
+4 -4
View File
@@ -132,9 +132,9 @@ gdk_gl_texture_run (GdkGLTexture *self,
while (g_atomic_int_get (&invoke.spinlock) == 0);
}
typedef struct _Download Download;
typedef struct _GdkGLTextureDownload GdkGLTextureDownload;
struct _Download
struct _GdkGLTextureDownload
{
GdkMemoryFormat format;
GdkColorState *color_state;
@@ -189,7 +189,7 @@ gdk_gl_texture_do_download (GdkGLTexture *self,
GdkTexture *texture = GDK_TEXTURE (self);
GdkMemoryFormat format;
gsize expected_stride;
Download *download = download_;
GdkGLTextureDownload *download = download_;
GLint gl_internal_format, gl_internal_srgb_format;
GLenum gl_format, gl_type;
GLint gl_swizzle[4];
@@ -420,7 +420,7 @@ gdk_gl_texture_download (GdkTexture *texture,
gsize stride)
{
GdkGLTexture *self = GDK_GL_TEXTURE (texture);
Download download;
GdkGLTextureDownload download;
if (self->saved)
{
+83 -83
View File
@@ -70,24 +70,24 @@ struct _GdkGLTextureBuilderClass
enum
{
PROP_0,
PROP_CONTEXT,
PROP_FORMAT,
PROP_HAS_MIPMAP,
PROP_HEIGHT,
PROP_ID,
PROP_SYNC,
PROP_COLOR_STATE,
PROP_UPDATE_REGION,
PROP_UPDATE_TEXTURE,
PROP_WIDTH,
GDK_GL_TEXTURE_BUILDER_PROP_0,
GDK_GL_TEXTURE_BUILDER_PROP_CONTEXT,
GDK_GL_TEXTURE_BUILDER_PROP_FORMAT,
GDK_GL_TEXTURE_BUILDER_PROP_HAS_MIPMAP,
GDK_GL_TEXTURE_BUILDER_PROP_HEIGHT,
GDK_GL_TEXTURE_BUILDER_PROP_ID,
GDK_GL_TEXTURE_BUILDER_PROP_SYNC,
GDK_GL_TEXTURE_BUILDER_PROP_COLOR_STATE,
GDK_GL_TEXTURE_BUILDER_PROP_UPDATE_REGION,
GDK_GL_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE,
GDK_GL_TEXTURE_BUILDER_PROP_WIDTH,
N_PROPS
GDK_GL_TEXTURE_BUILDER_N_PROPS
};
G_DEFINE_TYPE (GdkGLTextureBuilder, gdk_gl_texture_builder, G_TYPE_OBJECT)
static GParamSpec *properties[N_PROPS] = { NULL, };
static GParamSpec *gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_N_PROPS] = { NULL, };
static void
gdk_gl_texture_builder_dispose (GObject *object)
@@ -113,43 +113,43 @@ gdk_gl_texture_builder_get_property (GObject *object,
switch (property_id)
{
case PROP_CONTEXT:
case GDK_GL_TEXTURE_BUILDER_PROP_CONTEXT:
g_value_set_object (value, self->context);
break;
case PROP_FORMAT:
case GDK_GL_TEXTURE_BUILDER_PROP_FORMAT:
g_value_set_enum (value, self->format);
break;
case PROP_HAS_MIPMAP:
case GDK_GL_TEXTURE_BUILDER_PROP_HAS_MIPMAP:
g_value_set_boolean (value, self->has_mipmap);
break;
case PROP_HEIGHT:
case GDK_GL_TEXTURE_BUILDER_PROP_HEIGHT:
g_value_set_int (value, self->height);
break;
case PROP_ID:
case GDK_GL_TEXTURE_BUILDER_PROP_ID:
g_value_set_uint (value, self->id);
break;
case PROP_SYNC:
case GDK_GL_TEXTURE_BUILDER_PROP_SYNC:
g_value_set_pointer (value, self->sync);
break;
case PROP_COLOR_STATE:
case GDK_GL_TEXTURE_BUILDER_PROP_COLOR_STATE:
g_value_set_boxed (value, self->color_state);
break;
case PROP_UPDATE_REGION:
case GDK_GL_TEXTURE_BUILDER_PROP_UPDATE_REGION:
g_value_set_boxed (value, self->update_region);
break;
case PROP_UPDATE_TEXTURE:
case GDK_GL_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE:
g_value_set_object (value, self->update_texture);
break;
case PROP_WIDTH:
case GDK_GL_TEXTURE_BUILDER_PROP_WIDTH:
g_value_set_int (value, self->width);
break;
@@ -169,43 +169,43 @@ gdk_gl_texture_builder_set_property (GObject *object,
switch (property_id)
{
case PROP_CONTEXT:
case GDK_GL_TEXTURE_BUILDER_PROP_CONTEXT:
gdk_gl_texture_builder_set_context (self, g_value_get_object (value));
break;
case PROP_FORMAT:
case GDK_GL_TEXTURE_BUILDER_PROP_FORMAT:
gdk_gl_texture_builder_set_format (self, g_value_get_enum (value));
break;
case PROP_HAS_MIPMAP:
case GDK_GL_TEXTURE_BUILDER_PROP_HAS_MIPMAP:
gdk_gl_texture_builder_set_has_mipmap (self, g_value_get_boolean (value));
break;
case PROP_HEIGHT:
case GDK_GL_TEXTURE_BUILDER_PROP_HEIGHT:
gdk_gl_texture_builder_set_height (self, g_value_get_int (value));
break;
case PROP_ID:
case GDK_GL_TEXTURE_BUILDER_PROP_ID:
gdk_gl_texture_builder_set_id (self, g_value_get_uint (value));
break;
case PROP_SYNC:
case GDK_GL_TEXTURE_BUILDER_PROP_SYNC:
gdk_gl_texture_builder_set_sync (self, g_value_get_pointer (value));
break;
case PROP_COLOR_STATE:
case GDK_GL_TEXTURE_BUILDER_PROP_COLOR_STATE:
gdk_gl_texture_builder_set_color_state (self, g_value_get_boxed (value));
break;
case PROP_UPDATE_REGION:
case GDK_GL_TEXTURE_BUILDER_PROP_UPDATE_REGION:
gdk_gl_texture_builder_set_update_region (self, g_value_get_boxed (value));
break;
case PROP_UPDATE_TEXTURE:
case GDK_GL_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE:
gdk_gl_texture_builder_set_update_texture (self, g_value_get_object (value));
break;
case PROP_WIDTH:
case GDK_GL_TEXTURE_BUILDER_PROP_WIDTH:
gdk_gl_texture_builder_set_width (self, g_value_get_int (value));
break;
@@ -225,68 +225,68 @@ gdk_gl_texture_builder_class_init (GdkGLTextureBuilderClass *klass)
gobject_class->set_property = gdk_gl_texture_builder_set_property;
/**
* GdkGLTextureBuilder:context: (attributes org.gtk.Property.get=gdk_gl_texture_builder_get_context org.gtk.Property.set=gdk_gl_texture_builder_set_context)
* GdkGLTextureBuilder:context:
*
* The context owning the texture.
*
* Since: 4.12
*/
properties[PROP_CONTEXT] =
gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_CONTEXT] =
g_param_spec_object ("context", NULL, NULL,
GDK_TYPE_GL_CONTEXT,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkGLTextureBuilder:format: (attributes org.gtk.Property.get=gdk_gl_texture_builder_get_format org.gtk.Property.set=gdk_gl_texture_builder_set_format)
* GdkGLTextureBuilder:format:
*
* The format when downloading the texture.
*
* Since: 4.12
*/
properties[PROP_FORMAT] =
gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_FORMAT] =
g_param_spec_enum ("format", NULL, NULL,
GDK_TYPE_MEMORY_FORMAT,
GDK_MEMORY_R8G8B8A8_PREMULTIPLIED,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkGLTextureBuilder:has-mipmap: (attributes org.gtk.Property.get=gdk_gl_texture_builder_get_has_mipmap org.gtk.Property.set=gdk_gl_texture_builder_set_has_mipmap)
* GdkGLTextureBuilder:has-mipmap:
*
* If the texture has a mipmap.
*
* Since: 4.12
*/
properties[PROP_HAS_MIPMAP] =
gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_HAS_MIPMAP] =
g_param_spec_boolean ("has-mipmap", NULL, NULL,
FALSE,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkGLTextureBuilder:height: (attributes org.gtk.Property.get=gdk_gl_texture_builder_get_height org.gtk.Property.set=gdk_gl_texture_builder_set_height)
* GdkGLTextureBuilder:height:
*
* The height of the texture.
*
* Since: 4.12
*/
properties[PROP_HEIGHT] =
gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_HEIGHT] =
g_param_spec_int ("height", NULL, NULL,
G_MININT, G_MAXINT, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkGLTextureBuilder:id: (attributes org.gtk.Property.get=gdk_gl_texture_builder_get_id org.gtk.Property.set=gdk_gl_texture_builder_set_id)
* GdkGLTextureBuilder:id:
*
* The texture ID to use.
*
* Since: 4.12
*/
properties[PROP_ID] =
gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_ID] =
g_param_spec_uint ("id", NULL, NULL,
0, G_MAXUINT, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkGLTextureBuilder:sync: (attributes org.gtk.Property.get=gdk_gl_texture_builder_get_sync org.gtk.Property.set=gdk_gl_texture_builder_set_sync)
* GdkGLTextureBuilder:sync:
*
* An optional `GLSync` object.
*
@@ -294,7 +294,7 @@ gdk_gl_texture_builder_class_init (GdkGLTextureBuilderClass *klass)
*
* Since: 4.12
*/
properties[PROP_SYNC] =
gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_SYNC] =
g_param_spec_pointer ("sync", NULL, NULL,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -305,48 +305,48 @@ gdk_gl_texture_builder_class_init (GdkGLTextureBuilderClass *klass)
*
* Since: 4.16
*/
properties[PROP_COLOR_STATE] =
gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_COLOR_STATE] =
g_param_spec_boxed ("color-state", NULL, NULL,
GDK_TYPE_COLOR_STATE,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkGLTextureBuilder:update-region: (attributes org.gtk.Property.get=gdk_gl_texture_builder_get_update_region org.gtk.Property.set=gdk_gl_texture_builder_set_update_region)
* GdkGLTextureBuilder:update-region:
*
* The update region for [property@Gdk.GLTextureBuilder:update-texture].
*
* Since: 4.12
*/
properties[PROP_UPDATE_REGION] =
gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_UPDATE_REGION] =
g_param_spec_boxed ("update-region", NULL, NULL,
CAIRO_GOBJECT_TYPE_REGION,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkGLTextureBuilder:update-texture: (attributes org.gtk.Property.get=gdk_gl_texture_builder_get_update_texture org.gtk.Property.set=gdk_gl_texture_builder_set_update_texture)
* GdkGLTextureBuilder:update-texture:
*
* The texture [property@Gdk.GLTextureBuilder:update-region] is an update for.
*
* Since: 4.12
*/
properties[PROP_UPDATE_TEXTURE] =
gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE] =
g_param_spec_object ("update-texture", NULL, NULL,
GDK_TYPE_TEXTURE,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkGLTextureBuilder:width: (attributes org.gtk.Property.get=gdk_gl_texture_builder_get_width org.gtk.Property.set=gdk_gl_texture_builder_set_width)
* GdkGLTextureBuilder:width:
*
* The width of the texture.
*
* Since: 4.12
*/
properties[PROP_WIDTH] =
gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_WIDTH] =
g_param_spec_int ("width", NULL, NULL,
G_MININT, G_MAXINT, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, N_PROPS, properties);
g_object_class_install_properties (gobject_class, GDK_GL_TEXTURE_BUILDER_N_PROPS, gdk_gl_texture_builder_properties);
}
static void
@@ -372,7 +372,7 @@ gdk_gl_texture_builder_new (void)
}
/**
* gdk_gl_texture_builder_get_context: (attributes org.gtk.Method.get_property=context)
* gdk_gl_texture_builder_get_context:
* @self: a `GdkGLTextureBuilder`
*
* Gets the context previously set via gdk_gl_texture_builder_set_context() or
@@ -391,7 +391,7 @@ gdk_gl_texture_builder_get_context (GdkGLTextureBuilder *self)
}
/**
* gdk_gl_texture_builder_set_context: (attributes org.gtk.Method.set_property=context)
* gdk_gl_texture_builder_set_context:
* @self: a `GdkGLTextureBuilder`
* @context: (nullable): The context the texture belongs to or %NULL to unset
*
@@ -412,11 +412,11 @@ gdk_gl_texture_builder_set_context (GdkGLTextureBuilder *self,
if (!g_set_object (&self->context, context))
return;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_CONTEXT]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_CONTEXT]);
}
/**
* gdk_gl_texture_builder_get_height: (attributes org.gtk.Method.get_property=height)
* gdk_gl_texture_builder_get_height:
* @self: a `GdkGLTextureBuilder`
*
* Gets the height previously set via gdk_gl_texture_builder_set_height() or
@@ -435,7 +435,7 @@ gdk_gl_texture_builder_get_height (GdkGLTextureBuilder *self)
}
/**
* gdk_gl_texture_builder_set_height: (attributes org.gtk.Method.set_property=height)
* gdk_gl_texture_builder_set_height:
* @self: a `GdkGLTextureBuilder`
* @height: The texture's height or 0 to unset
*
@@ -456,11 +456,11 @@ gdk_gl_texture_builder_set_height (GdkGLTextureBuilder *self,
self->height = height;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_HEIGHT]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_HEIGHT]);
}
/**
* gdk_gl_texture_builder_get_id: (attributes org.gtk.Method.get_property=id)
* gdk_gl_texture_builder_get_id:
* @self: a `GdkGLTextureBuilder`
*
* Gets the texture id previously set via gdk_gl_texture_builder_set_id() or
@@ -479,7 +479,7 @@ gdk_gl_texture_builder_get_id (GdkGLTextureBuilder *self)
}
/**
* gdk_gl_texture_builder_set_id: (attributes org.gtk.Method.set_property=id)
* gdk_gl_texture_builder_set_id:
* @self: a `GdkGLTextureBuilder`
* @id: The texture id to be used for creating the texture
*
@@ -502,11 +502,11 @@ gdk_gl_texture_builder_set_id (GdkGLTextureBuilder *self,
self->id = id;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ID]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_ID]);
}
/**
* gdk_gl_texture_builder_get_width: (attributes org.gtk.Method.get_property=width)
* gdk_gl_texture_builder_get_width:
* @self: a `GdkGLTextureBuilder`
*
* Gets the width previously set via gdk_gl_texture_builder_set_width() or
@@ -525,7 +525,7 @@ gdk_gl_texture_builder_get_width (GdkGLTextureBuilder *self)
}
/**
* gdk_gl_texture_builder_set_width: (attributes org.gtk.Method.set_property=width)
* gdk_gl_texture_builder_set_width:
* @self: a `GdkGLTextureBuilder`
* @width: The texture's width or 0 to unset
*
@@ -546,11 +546,11 @@ gdk_gl_texture_builder_set_width (GdkGLTextureBuilder *self,
self->width = width;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_WIDTH]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_WIDTH]);
}
/**
* gdk_gl_texture_builder_get_has_mipmap: (attributes org.gtk.Method.get_property=has-mipmap)
* gdk_gl_texture_builder_get_has_mipmap:
* @self: a `GdkGLTextureBuilder`
*
* Gets whether the texture has a mipmap.
@@ -568,7 +568,7 @@ gdk_gl_texture_builder_get_has_mipmap (GdkGLTextureBuilder *self)
}
/**
* gdk_gl_texture_builder_set_has_mipmap: (attributes org.gtk.Method.set_property=has-mipmap)
* gdk_gl_texture_builder_set_has_mipmap:
* @self: a `GdkGLTextureBuilder`
* @has_mipmap: Whether the texture has a mipmap
*
@@ -590,11 +590,11 @@ gdk_gl_texture_builder_set_has_mipmap (GdkGLTextureBuilder *self,
self->has_mipmap = has_mipmap;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_HAS_MIPMAP]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_HAS_MIPMAP]);
}
/**
* gdk_gl_texture_builder_get_sync: (attributes org.gtk.Method.get_property=sync)
* gdk_gl_texture_builder_get_sync:
* @self: a `GdkGLTextureBuilder`
*
* Gets the `GLsync` previously set via gdk_gl_texture_builder_set_sync().
@@ -612,7 +612,7 @@ gdk_gl_texture_builder_get_sync (GdkGLTextureBuilder *self)
}
/**
* gdk_gl_texture_builder_set_sync: (attributes org.gtk.Method.set_property=sync)
* gdk_gl_texture_builder_set_sync:
* @self: a `GdkGLTextureBuilder`
* @sync: (nullable): the GLSync object
*
@@ -638,11 +638,11 @@ gdk_gl_texture_builder_set_sync (GdkGLTextureBuilder *self,
self->sync = sync;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SYNC]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_SYNC]);
}
/**
* gdk_gl_texture_builder_get_color_state: (attributes org.gtk.Method.get_property=color-state)
* gdk_gl_texture_builder_get_color_state:
* @self: a `GdkGLTextureBuilder`
*
* Gets the color state previously set via gdk_gl_texture_builder_set_color_state().
@@ -660,7 +660,7 @@ gdk_gl_texture_builder_get_color_state (GdkGLTextureBuilder *self)
}
/**
* gdk_gl_texture_builder_set_color_state: (attributes org.gtk.Method.set_property=color-state)
* gdk_gl_texture_builder_set_color_state:
* @self: a `GdkGLTextureBuilder`
* @color_state: a `GdkColorState`
*
@@ -683,11 +683,11 @@ gdk_gl_texture_builder_set_color_state (GdkGLTextureBuilder *self,
g_clear_pointer (&self->color_state, gdk_color_state_unref);
self->color_state = gdk_color_state_ref (color_state);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLOR_STATE]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_COLOR_STATE]);
}
/**
* gdk_gl_texture_builder_get_format: (attributes org.gtk.Method.get_property=format)
* gdk_gl_texture_builder_get_format:
* @self: a `GdkGLTextureBuilder`
*
* Gets the format previously set via gdk_gl_texture_builder_set_format().
@@ -705,7 +705,7 @@ gdk_gl_texture_builder_get_format (GdkGLTextureBuilder *self)
}
/**
* gdk_gl_texture_builder_set_format: (attributes org.gtk.Method.set_property=format)
* gdk_gl_texture_builder_set_format:
* @self: a `GdkGLTextureBuilder`
* @format: The texture's format
*
@@ -739,11 +739,11 @@ gdk_gl_texture_builder_set_format (GdkGLTextureBuilder *self,
self->format = format;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FORMAT]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_FORMAT]);
}
/**
* gdk_gl_texture_builder_get_update_texture: (attributes org.gtk.Method.get_property=update-texture)
* gdk_gl_texture_builder_get_update_texture:
* @self: a `GdkGLTextureBuilder`
*
* Gets the texture previously set via gdk_gl_texture_builder_set_update_texture() or
@@ -762,7 +762,7 @@ gdk_gl_texture_builder_get_update_texture (GdkGLTextureBuilder *self)
}
/**
* gdk_gl_texture_builder_set_update_texture: (attributes org.gtk.Method.set_property=update-texture)
* gdk_gl_texture_builder_set_update_texture:
* @self: a `GdkGLTextureBuilder`
* @texture: (nullable): the texture to update
*
@@ -781,11 +781,11 @@ gdk_gl_texture_builder_set_update_texture (GdkGLTextureBuilder *self,
if (!g_set_object (&self->update_texture, texture))
return;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UPDATE_TEXTURE]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE]);
}
/**
* gdk_gl_texture_builder_get_update_region: (attributes org.gtk.Method.get_property=update-region)
* gdk_gl_texture_builder_get_update_region:
* @self: a `GdkGLTextureBuilder`
*
* Gets the region previously set via gdk_gl_texture_builder_set_update_region() or
@@ -804,7 +804,7 @@ gdk_gl_texture_builder_get_update_region (GdkGLTextureBuilder *self)
}
/**
* gdk_gl_texture_builder_set_update_region: (attributes org.gtk.Method.set_property=update-region)
* gdk_gl_texture_builder_set_update_region:
* @self: a `GdkGLTextureBuilder`
* @region: (nullable): the region to update
*
@@ -835,7 +835,7 @@ gdk_gl_texture_builder_set_update_region (GdkGLTextureBuilder *self,
if (region)
self->update_region = cairo_region_reference (region);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UPDATE_REGION]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_gl_texture_builder_properties[GDK_GL_TEXTURE_BUILDER_PROP_UPDATE_REGION]);
}
/**
+16 -16
View File
@@ -35,20 +35,20 @@
#include <string.h>
enum {
PROP_0,
PROP_DISPLAY,
LAST_PROP
GDK_KEYS_PROP_0,
GDK_KEYS_PROP_DISPLAY,
GDK_KEYS_LAST_PROP
};
enum {
DIRECTION_CHANGED,
KEYS_CHANGED,
STATE_CHANGED,
LAST_SIGNAL
GDK_KEYS_DIRECTION_CHANGED,
GDK_KEYS_KEYS_CHANGED,
GDK_KEYS_STATE_CHANGED,
GDK_KEYS_LAST_SIGNAL
};
static GParamSpec *props[LAST_PROP] = { NULL, };
static guint signals[LAST_SIGNAL] = { 0 };
static GParamSpec *gdk_keys_properties[GDK_KEYS_LAST_PROP] = { NULL, };
static guint gdk_keys_signals[GDK_KEYS_LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE (GdkKeymap, gdk_keymap, G_TYPE_OBJECT)
@@ -62,7 +62,7 @@ gdk_keymap_get_property (GObject *object,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_KEYS_PROP_DISPLAY:
g_value_set_object (value, keymap->display);
break;
default:
@@ -80,7 +80,7 @@ gdk_keymap_set_property (GObject *object,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_KEYS_PROP_DISPLAY:
keymap->display = g_value_get_object (value);
break;
@@ -127,12 +127,12 @@ gdk_keymap_class_init (GdkKeymapClass *klass)
klass->keys_changed = gdk_keymap_keys_changed;
props[PROP_DISPLAY] =
gdk_keys_properties[GDK_KEYS_PROP_DISPLAY] =
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, LAST_PROP, props);
g_object_class_install_properties (object_class, GDK_KEYS_LAST_PROP, gdk_keys_properties);
/**
* GdkKeymap::direction-changed:
@@ -142,7 +142,7 @@ gdk_keymap_class_init (GdkKeymapClass *klass)
*
* See gdk_keymap_get_direction().
*/
signals[DIRECTION_CHANGED] =
gdk_keys_signals[GDK_KEYS_DIRECTION_CHANGED] =
g_signal_new (g_intern_static_string ("direction-changed"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
@@ -159,7 +159,7 @@ gdk_keymap_class_init (GdkKeymapClass *klass)
* The ::keys-changed signal is emitted when the mapping represented by
* @keymap changes.
*/
signals[KEYS_CHANGED] =
gdk_keys_signals[GDK_KEYS_KEYS_CHANGED] =
g_signal_new (g_intern_static_string ("keys-changed"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
@@ -177,7 +177,7 @@ gdk_keymap_class_init (GdkKeymapClass *klass)
* keyboard changes, e.g when Caps Lock is turned on or off.
* See gdk_keymap_get_caps_lock_state().
*/
signals[STATE_CHANGED] =
gdk_keys_signals[GDK_KEYS_STATE_CHANGED] =
g_signal_new (g_intern_static_string ("state-changed"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
+1 -4
View File
@@ -96,8 +96,7 @@ print OUT_GDKKEYSYMS<<EOF;
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#ifndef __GDK_KEYSYMS_H__
#define __GDK_KEYSYMS_H__
#pragma once
EOF
@@ -165,8 +164,6 @@ close IN_XF86KEYSYM;
print OUT_GDKKEYSYMS<<EOF;
#endif /* __GDK_KEYSYMS_H__ */
EOF
printf "We just finished converting keysymdef.h to gdkkeysyms.h\nThank you\n";
+11 -1
View File
@@ -297,8 +297,11 @@
#define GDK_KEY_dead_u 0xfe88
#define GDK_KEY_dead_U 0xfe89
#define GDK_KEY_dead_small_schwa 0xfe8a
#define GDK_KEY_dead_schwa 0xfe8a
#define GDK_KEY_dead_capital_schwa 0xfe8b
#define GDK_KEY_dead_SCHWA 0xfe8b
#define GDK_KEY_dead_greek 0xfe8c
#define GDK_KEY_dead_hamza 0xfe8d
#define GDK_KEY_First_Virtual_Screen 0xfed0
#define GDK_KEY_Prev_Virtual_Screen 0xfed1
#define GDK_KEY_Next_Virtual_Screen 0xfed2
@@ -490,6 +493,7 @@
#define GDK_KEY_copyright 0x0a9
#define GDK_KEY_ordfeminine 0x0aa
#define GDK_KEY_guillemotleft 0x0ab
#define GDK_KEY_guillemetleft 0x0ab
#define GDK_KEY_notsign 0x0ac
#define GDK_KEY_hyphen 0x0ad
#define GDK_KEY_registered 0x0ae
@@ -505,7 +509,9 @@
#define GDK_KEY_cedilla 0x0b8
#define GDK_KEY_onesuperior 0x0b9
#define GDK_KEY_masculine 0x0ba
#define GDK_KEY_ordmasculine 0x0ba
#define GDK_KEY_guillemotright 0x0bb
#define GDK_KEY_guillemetright 0x0bb
#define GDK_KEY_onequarter 0x0bc
#define GDK_KEY_onehalf 0x0bd
#define GDK_KEY_threequarters 0x0be
@@ -1743,6 +1749,11 @@
#define GDK_KEY_ohorn 0x10001a1
#define GDK_KEY_Uhorn 0x10001af
#define GDK_KEY_uhorn 0x10001b0
#define GDK_KEY_combining_tilde 0x1000303
#define GDK_KEY_combining_grave 0x1000300
#define GDK_KEY_combining_acute 0x1000301
#define GDK_KEY_combining_hook 0x1000309
#define GDK_KEY_combining_belowdot 0x1000323
#define GDK_KEY_EcuSign 0x10020a0
#define GDK_KEY_ColonSign 0x10020a1
#define GDK_KEY_CruzeiroSign 0x10020a2
@@ -2313,4 +2324,3 @@
#define GDK_KEY_Prev_VMode 0x1008fe23
#define GDK_KEY_LogWindowTree 0x1008fe24
#define GDK_KEY_LogGrabInfo 0x1008fe25
+754 -307
View File
File diff suppressed because it is too large Load Diff
+11
View File
@@ -66,6 +66,7 @@ GdkMemoryDepth gdk_memory_depth_merge (GdkMemoryDepth
GdkMemoryDepth depth2) G_GNUC_CONST;
GdkMemoryFormat gdk_memory_depth_get_format (GdkMemoryDepth depth) G_GNUC_CONST;
GdkMemoryFormat gdk_memory_depth_get_alpha_format (GdkMemoryDepth depth) G_GNUC_CONST;
const char * gdk_memory_depth_get_name (GdkMemoryDepth depth);
void gdk_memory_format_gl_format (GdkMemoryFormat format,
gboolean gles,
GLint *out_internal_format,
@@ -109,6 +110,16 @@ void gdk_memory_convert_color_state (guchar
GdkColorState *dest_color_state,
gsize width,
gsize height);
void gdk_memory_mipmap (guchar *dest,
gsize dest_stride,
GdkMemoryFormat dest_format,
const guchar *src,
gsize src_stride,
GdkMemoryFormat src_format,
gsize src_width,
gsize src_height,
guint lod_level,
gboolean linear);
G_END_DECLS
+4 -2
View File
@@ -111,7 +111,7 @@ gdk_memory_sanitize (GBytes *bytes,
stride % align == 0)
{
*out_stride = stride;
return g_bytes_ref (bytes);
return bytes;
}
bpp = gdk_memory_format_bytes_per_pixel (format);
@@ -122,6 +122,8 @@ gdk_memory_sanitize (GBytes *bytes,
for (y = 0; y < height; y++)
memcpy (copy + y * copy_stride, data + y * stride, bpp * width);
g_bytes_unref (bytes);
*out_stride = copy_stride;
return g_bytes_new_take (copy, copy_stride * height);
}
@@ -197,7 +199,7 @@ gdk_memory_texture_new (int width,
/* needs to be this complex to support subtexture of the bottom right part */
g_return_val_if_fail (g_bytes_get_size (bytes) >= gdk_memory_format_min_buffer_size (format, stride, width, height), NULL);
bytes = gdk_memory_sanitize (bytes, width, height, format, stride, &stride);
bytes = gdk_memory_sanitize (g_bytes_ref (bytes), width, height, format, stride, &stride);
self = g_object_new (GDK_TYPE_MEMORY_TEXTURE,
"width", width,
+57 -59
View File
@@ -67,22 +67,22 @@ struct _GdkMemoryTextureBuilderClass
enum
{
PROP_0,
PROP_BYTES,
PROP_COLOR_STATE,
PROP_FORMAT,
PROP_HEIGHT,
PROP_STRIDE,
PROP_UPDATE_REGION,
PROP_UPDATE_TEXTURE,
PROP_WIDTH,
GDK_MEMORY_TEXTURE_BUILDER_PROP_0,
GDK_MEMORY_TEXTURE_BUILDER_PROP_BYTES,
GDK_MEMORY_TEXTURE_BUILDER_PROP_COLOR_STATE,
GDK_MEMORY_TEXTURE_BUILDER_PROP_FORMAT,
GDK_MEMORY_TEXTURE_BUILDER_PROP_HEIGHT,
GDK_MEMORY_TEXTURE_BUILDER_PROP_STRIDE,
GDK_MEMORY_TEXTURE_BUILDER_PROP_UPDATE_REGION,
GDK_MEMORY_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE,
GDK_MEMORY_TEXTURE_BUILDER_PROP_WIDTH,
N_PROPS
GDK_MEMORY_TEXTURE_BUILDER_N_PROPS
};
G_DEFINE_TYPE (GdkMemoryTextureBuilder, gdk_memory_texture_builder, G_TYPE_OBJECT)
static GParamSpec *properties[N_PROPS] = { NULL, };
static GParamSpec *gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_N_PROPS] = { NULL, };
static void
gdk_memory_texture_builder_dispose (GObject *object)
@@ -108,35 +108,35 @@ gdk_memory_texture_builder_get_property (GObject *object,
switch (property_id)
{
case PROP_BYTES:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_BYTES:
g_value_set_boxed (value, self->bytes);
break;
case PROP_COLOR_STATE:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_COLOR_STATE:
g_value_set_boxed (value, self->color_state);
break;
case PROP_FORMAT:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_FORMAT:
g_value_set_enum (value, self->format);
break;
case PROP_HEIGHT:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_HEIGHT:
g_value_set_int (value, self->height);
break;
case PROP_STRIDE:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_STRIDE:
g_value_set_uint64 (value, self->stride);
break;
case PROP_UPDATE_REGION:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_UPDATE_REGION:
g_value_set_boxed (value, self->update_region);
break;
case PROP_UPDATE_TEXTURE:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE:
g_value_set_object (value, self->update_texture);
break;
case PROP_WIDTH:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_WIDTH:
g_value_set_int (value, self->width);
break;
@@ -156,35 +156,35 @@ gdk_memory_texture_builder_set_property (GObject *object,
switch (property_id)
{
case PROP_BYTES:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_BYTES:
gdk_memory_texture_builder_set_bytes (self, g_value_get_boxed (value));
break;
case PROP_COLOR_STATE:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_COLOR_STATE:
gdk_memory_texture_builder_set_color_state (self, g_value_get_boxed (value));
break;
case PROP_FORMAT:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_FORMAT:
gdk_memory_texture_builder_set_format (self, g_value_get_enum (value));
break;
case PROP_HEIGHT:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_HEIGHT:
gdk_memory_texture_builder_set_height (self, g_value_get_int (value));
break;
case PROP_STRIDE:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_STRIDE:
gdk_memory_texture_builder_set_stride (self, g_value_get_uint64 (value));
break;
case PROP_UPDATE_REGION:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_UPDATE_REGION:
gdk_memory_texture_builder_set_update_region (self, g_value_get_boxed (value));
break;
case PROP_UPDATE_TEXTURE:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE:
gdk_memory_texture_builder_set_update_texture (self, g_value_get_object (value));
break;
case PROP_WIDTH:
case GDK_MEMORY_TEXTURE_BUILDER_PROP_WIDTH:
gdk_memory_texture_builder_set_width (self, g_value_get_int (value));
break;
@@ -210,7 +210,7 @@ gdk_memory_texture_builder_class_init (GdkMemoryTextureBuilderClass *klass)
*
* Since: 4.16
*/
properties[PROP_BYTES] =
gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_BYTES] =
g_param_spec_boxed ("bytes", NULL, NULL,
G_TYPE_BYTES,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -222,7 +222,7 @@ gdk_memory_texture_builder_class_init (GdkMemoryTextureBuilderClass *klass)
*
* Since: 4.16
*/
properties[PROP_COLOR_STATE] =
gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_COLOR_STATE] =
g_param_spec_boxed ("color-state", NULL, NULL,
GDK_TYPE_COLOR_STATE,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -234,7 +234,7 @@ gdk_memory_texture_builder_class_init (GdkMemoryTextureBuilderClass *klass)
*
* Since: 4.16
*/
properties[PROP_FORMAT] =
gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_FORMAT] =
g_param_spec_enum ("format", NULL, NULL,
GDK_TYPE_MEMORY_FORMAT,
GDK_MEMORY_R8G8B8A8_PREMULTIPLIED,
@@ -247,7 +247,7 @@ gdk_memory_texture_builder_class_init (GdkMemoryTextureBuilderClass *klass)
*
* Since: 4.16
*/
properties[PROP_HEIGHT] =
gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_HEIGHT] =
g_param_spec_int ("height", NULL, NULL,
G_MININT, G_MAXINT, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -262,7 +262,7 @@ gdk_memory_texture_builder_class_init (GdkMemoryTextureBuilderClass *klass)
*
* Since: 4.16
*/
properties[PROP_STRIDE] =
gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_STRIDE] =
g_param_spec_uint64 ("stride", NULL, NULL,
0, G_MAXUINT64, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -274,7 +274,7 @@ gdk_memory_texture_builder_class_init (GdkMemoryTextureBuilderClass *klass)
*
* Since: 4.16
*/
properties[PROP_UPDATE_REGION] =
gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_UPDATE_REGION] =
g_param_spec_boxed ("update-region", NULL, NULL,
CAIRO_GOBJECT_TYPE_REGION,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -286,7 +286,7 @@ gdk_memory_texture_builder_class_init (GdkMemoryTextureBuilderClass *klass)
*
* Since: 4.16
*/
properties[PROP_UPDATE_TEXTURE] =
gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE] =
g_param_spec_object ("update-texture", NULL, NULL,
GDK_TYPE_TEXTURE,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
@@ -298,12 +298,12 @@ gdk_memory_texture_builder_class_init (GdkMemoryTextureBuilderClass *klass)
*
* Since: 4.16
*/
properties[PROP_WIDTH] =
gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_WIDTH] =
g_param_spec_int ("width", NULL, NULL,
G_MININT, G_MAXINT, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, N_PROPS, properties);
g_object_class_install_properties (gobject_class, GDK_MEMORY_TEXTURE_BUILDER_N_PROPS, gdk_memory_texture_builder_properties);
}
static void
@@ -348,7 +348,7 @@ gdk_memory_texture_builder_get_bytes (GdkMemoryTextureBuilder *self)
}
/**
* gdk_memory_texture_builder_set_bytes: (attributes org.gtk.Method.set_property=bytes)
* gdk_memory_texture_builder_set_bytes:
* @self: a `GdkMemoryTextureBuilder`
* @bytes: (nullable): The bytes the texture shows or %NULL to unset
*
@@ -373,11 +373,11 @@ gdk_memory_texture_builder_set_bytes (GdkMemoryTextureBuilder *self,
if (bytes)
g_bytes_ref (bytes);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_BYTES]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_BYTES]);
}
/**
* gdk_memory_texture_builder_get_color_state: (attributes org.gtk.Method.get_property=color-state)
* gdk_memory_texture_builder_get_color_state:
* @self: a `GdkMemoryTextureBuilder`
*
* Gets the colorstate previously set via gdk_memory_texture_builder_set_color_state().
@@ -395,7 +395,7 @@ gdk_memory_texture_builder_get_color_state (GdkMemoryTextureBuilder *self)
}
/**
* gdk_memory_texture_builder_set_color_state: (attributes org.gtk.Method.set_property=color-state)
* gdk_memory_texture_builder_set_color_state:
* @self: a `GdkMemoryTextureBuilder`
* @color_state: (nullable): The colorstate describing the data
*
@@ -421,11 +421,11 @@ gdk_memory_texture_builder_set_color_state (GdkMemoryTextureBuilder *self,
if (color_state)
gdk_color_state_ref (color_state);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLOR_STATE]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_COLOR_STATE]);
}
/**
* gdk_memory_texture_builder_get_height: (attributes org.gtk.Method.get_property=height)
* gdk_memory_texture_builder_get_height:
* @self: a `GdkMemoryTextureBuilder`
*
* Gets the height previously set via gdk_memory_texture_builder_set_height()
@@ -444,7 +444,7 @@ gdk_memory_texture_builder_get_height (GdkMemoryTextureBuilder *self)
}
/**
* gdk_memory_texture_builder_set_height: (attributes org.gtk.Method.set_property=height)
* gdk_memory_texture_builder_set_height:
* @self: a `GdkMemoryTextureBuilder`
* @height: The texture's height or 0 to unset
*
@@ -465,11 +465,11 @@ gdk_memory_texture_builder_set_height (GdkMemoryTextureBuilder *self,
self->height = height;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_HEIGHT]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_HEIGHT]);
}
/**
* gdk_memory_texture_builder_get_width: (attributes org.gtk.Method.get_property=width)
* gdk_memory_texture_builder_get_width:
* @self: a `GdkMemoryTextureBuilder`
*
* Gets the width previously set via gdk_memory_texture_builder_set_width()
@@ -488,7 +488,7 @@ gdk_memory_texture_builder_get_width (GdkMemoryTextureBuilder *self)
}
/**
* gdk_memory_texture_builder_set_width: (attributes org.gtk.Method.set_property=width)
* gdk_memory_texture_builder_set_width:
* @self: a `GdkMemoryTextureBuilder`
* @width: The texture's width or 0 to unset
*
@@ -509,10 +509,9 @@ gdk_memory_texture_builder_set_width (GdkMemoryTextureBuilder *self,
self->width = width;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_WIDTH]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_WIDTH]);
}
/* gdk_memory_texture_builder_get_stride: (attributes org.gtk.Method.get_property=stride) */
/**
* gdk_memory_texture_builder_get_stride:
* @self: a `GdkMemoryTextureBuilder`
@@ -531,7 +530,6 @@ gdk_memory_texture_builder_get_stride (GdkMemoryTextureBuilder *self)
return self->stride;
}
/* gdk_memory_texture_builder_set_stride: (attributes org.gtk.Method.set_property=stride) */
/**
* gdk_memory_texture_builder_set_stride:
* @self: a `GdkMemoryTextureBuilder`
@@ -554,11 +552,11 @@ gdk_memory_texture_builder_set_stride (GdkMemoryTextureBuilder *self,
self->stride = stride;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STRIDE]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_STRIDE]);
}
/**
* gdk_memory_texture_builder_get_format: (attributes org.gtk.Method.get_property=format)
* gdk_memory_texture_builder_get_format:
* @self: a `GdkMemoryTextureBuilder`
*
* Gets the format previously set via gdk_memory_texture_builder_set_format().
@@ -576,7 +574,7 @@ gdk_memory_texture_builder_get_format (GdkMemoryTextureBuilder *self)
}
/**
* gdk_memory_texture_builder_set_format: (attributes org.gtk.Method.set_property=format)
* gdk_memory_texture_builder_set_format:
* @self: a `GdkMemoryTextureBuilder`
* @format: The texture's format
*
@@ -597,11 +595,11 @@ gdk_memory_texture_builder_set_format (GdkMemoryTextureBuilder *self,
self->format = format;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FORMAT]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_FORMAT]);
}
/**
* gdk_memory_texture_builder_get_update_texture: (attributes org.gtk.Method.get_property=update-texture)
* gdk_memory_texture_builder_get_update_texture:
* @self: a `GdkMemoryTextureBuilder`
*
* Gets the texture previously set via gdk_memory_texture_builder_set_update_texture()
@@ -620,7 +618,7 @@ gdk_memory_texture_builder_get_update_texture (GdkMemoryTextureBuilder *self)
}
/**
* gdk_memory_texture_builder_set_update_texture: (attributes org.gtk.Method.set_property=update-texture)
* gdk_memory_texture_builder_set_update_texture:
* @self: a `GdkMemoryTextureBuilder`
* @texture: (nullable): the texture to update
*
@@ -640,11 +638,11 @@ gdk_memory_texture_builder_set_update_texture (GdkMemoryTextureBuilder *self,
if (!g_set_object (&self->update_texture, texture))
return;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UPDATE_TEXTURE]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_UPDATE_TEXTURE]);
}
/**
* gdk_memory_texture_builder_get_update_region: (attributes org.gtk.Method.get_property=update-region)
* gdk_memory_texture_builder_get_update_region:
* @self: a `GdkMemoryTextureBuilder`
*
* Gets the region previously set via gdk_memory_texture_builder_set_update_region()
@@ -663,7 +661,7 @@ gdk_memory_texture_builder_get_update_region (GdkMemoryTextureBuilder *self)
}
/**
* gdk_memory_texture_builder_set_update_region: (attributes org.gtk.Method.set_property=update-region)
* gdk_memory_texture_builder_set_update_region:
* @self: a `GdkMemoryTextureBuilder`
* @region: (nullable): the region to update
*
@@ -695,7 +693,7 @@ gdk_memory_texture_builder_set_update_region (GdkMemoryTextureBuilder *self,
if (region)
self->update_region = cairo_region_reference (region);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UPDATE_REGION]);
g_object_notify_by_pspec (G_OBJECT (self), gdk_memory_texture_builder_properties[GDK_MEMORY_TEXTURE_BUILDER_PROP_UPDATE_REGION]);
}
/**
+77 -77
View File
@@ -41,31 +41,31 @@
*/
enum {
PROP_0,
PROP_DESCRIPTION,
PROP_DISPLAY,
PROP_MANUFACTURER,
PROP_MODEL,
PROP_CONNECTOR,
PROP_SCALE_FACTOR,
PROP_SCALE,
PROP_GEOMETRY,
PROP_WIDTH_MM,
PROP_HEIGHT_MM,
PROP_REFRESH_RATE,
PROP_SUBPIXEL_LAYOUT,
PROP_VALID,
LAST_PROP
GDK_MONITOR_PROP_0,
GDK_MONITOR_PROP_DESCRIPTION,
GDK_MONITOR_PROP_DISPLAY,
GDK_MONITOR_PROP_MANUFACTURER,
GDK_MONITOR_PROP_MODEL,
GDK_MONITOR_PROP_CONNECTOR,
GDK_MONITOR_PROP_SCALE_FACTOR,
GDK_MONITOR_PROP_SCALE,
GDK_MONITOR_PROP_GEOMETRY,
GDK_MONITOR_PROP_WIDTH_MM,
GDK_MONITOR_PROP_HEIGHT_MM,
GDK_MONITOR_PROP_REFRESH_RATE,
GDK_MONITOR_PROP_SUBPIXEL_LAYOUT,
GDK_MONITOR_PROP_VALID,
GDK_MONITOR_LAST_PROP
};
static GParamSpec *props[LAST_PROP] = { NULL, };
static GParamSpec *gdk_monitor_properties[GDK_MONITOR_LAST_PROP] = { NULL, };
enum {
INVALIDATE,
LAST_SIGNAL
GDK_MONITOR_INVALIDATE,
GDK_MONITOR_LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
static guint gdk_monitor_signals[GDK_MONITOR_LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE (GdkMonitor, gdk_monitor, G_TYPE_OBJECT)
@@ -88,55 +88,55 @@ gdk_monitor_get_property (GObject *object,
switch (prop_id)
{
case PROP_DESCRIPTION:
case GDK_MONITOR_PROP_DESCRIPTION:
g_value_set_string (value, monitor->description);
break;
case PROP_DISPLAY:
case GDK_MONITOR_PROP_DISPLAY:
g_value_set_object (value, monitor->display);
break;
case PROP_MANUFACTURER:
case GDK_MONITOR_PROP_MANUFACTURER:
g_value_set_string (value, monitor->manufacturer);
break;
case PROP_MODEL:
case GDK_MONITOR_PROP_MODEL:
g_value_set_string (value, monitor->model);
break;
case PROP_CONNECTOR:
case GDK_MONITOR_PROP_CONNECTOR:
g_value_set_string (value, monitor->connector);
break;
case PROP_SCALE_FACTOR:
case GDK_MONITOR_PROP_SCALE_FACTOR:
g_value_set_int (value, monitor->scale_factor);
break;
case PROP_SCALE:
case GDK_MONITOR_PROP_SCALE:
g_value_set_double (value, monitor->scale);
break;
case PROP_GEOMETRY:
case GDK_MONITOR_PROP_GEOMETRY:
g_value_set_boxed (value, &monitor->geometry);
break;
case PROP_WIDTH_MM:
case GDK_MONITOR_PROP_WIDTH_MM:
g_value_set_int (value, monitor->width_mm);
break;
case PROP_HEIGHT_MM:
case GDK_MONITOR_PROP_HEIGHT_MM:
g_value_set_int (value, monitor->height_mm);
break;
case PROP_REFRESH_RATE:
case GDK_MONITOR_PROP_REFRESH_RATE:
g_value_set_int (value, monitor->refresh_rate);
break;
case PROP_SUBPIXEL_LAYOUT:
case GDK_MONITOR_PROP_SUBPIXEL_LAYOUT:
g_value_set_enum (value, monitor->subpixel_layout);
break;
case PROP_VALID:
case GDK_MONITOR_PROP_VALID:
g_value_set_boolean (value, monitor->valid);
break;
@@ -155,7 +155,7 @@ gdk_monitor_set_property (GObject *object,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_MONITOR_PROP_DISPLAY:
monitor->display = g_value_get_object (value);
break;
@@ -187,148 +187,148 @@ gdk_monitor_class_init (GdkMonitorClass *class)
object_class->set_property = gdk_monitor_set_property;
/**
* GdkMonitor:description: (attributes org.gtk.Property.get=gdk_monitor_get_description)
* GdkMonitor:description:
*
* A short description of the monitor, meant for display to the user.
*
* Since: 4.10
*/
props[PROP_DESCRIPTION] =
gdk_monitor_properties[GDK_MONITOR_PROP_DESCRIPTION] =
g_param_spec_string ("description", NULL, NULL,
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:display: (attributes org.gtk.Property.get=gdk_monitor_get_display)
* GdkMonitor:display:
*
* The `GdkDisplay` of the monitor.
*/
props[PROP_DISPLAY] =
gdk_monitor_properties[GDK_MONITOR_PROP_DISPLAY] =
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:manufacturer: (attributes org.gtk.Property.get=gdk_monitor_get_manufacturer)
* GdkMonitor:manufacturer:
*
* The manufacturer name.
*/
props[PROP_MANUFACTURER] =
gdk_monitor_properties[GDK_MONITOR_PROP_MANUFACTURER] =
g_param_spec_string ("manufacturer", NULL, NULL,
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:model: (attributes org.gtk.Property.get=gdk_monitor_get_model)
* GdkMonitor:model:
*
* The model name.
*/
props[PROP_MODEL] =
gdk_monitor_properties[GDK_MONITOR_PROP_MODEL] =
g_param_spec_string ("model", NULL, NULL,
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:connector: (attributes org.gtk.Property.get=gdk_monitor_get_connector)
* GdkMonitor:connector:
*
* The connector name.
*/
props[PROP_CONNECTOR] =
gdk_monitor_properties[GDK_MONITOR_PROP_CONNECTOR] =
g_param_spec_string ("connector", NULL, NULL,
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:scale-factor: (attributes org.gtk.Property.get=gdk_monitor_get_scale_factor)
* GdkMonitor:scale-factor:
*
* The scale factor.
*
* The scale factor is the next larger integer,
* compared to [property@Gdk.Surface:scale].
*/
props[PROP_SCALE_FACTOR] =
gdk_monitor_properties[GDK_MONITOR_PROP_SCALE_FACTOR] =
g_param_spec_int ("scale-factor", NULL, NULL,
1, G_MAXINT,
1,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:scale: (attributes org.gtk.Property.get=gdk_monitor_get_scale)
* GdkMonitor:scale:
*
* The scale of the monitor.
*
* Since: 4.14
*/
props[PROP_SCALE] =
gdk_monitor_properties[GDK_MONITOR_PROP_SCALE] =
g_param_spec_double ("scale", NULL, NULL,
1., G_MAXDOUBLE, 1.,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:geometry: (attributes org.gtk.Property.get=gdk_monitor_get_geometry)
* GdkMonitor:geometry:
*
* The geometry of the monitor.
*/
props[PROP_GEOMETRY] =
gdk_monitor_properties[GDK_MONITOR_PROP_GEOMETRY] =
g_param_spec_boxed ("geometry", NULL, NULL,
GDK_TYPE_RECTANGLE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:width-mm: (attributes org.gtk.Property.get=gdk_monitor_get_width_mm)
* GdkMonitor:width-mm:
*
* The width of the monitor, in millimeters.
*/
props[PROP_WIDTH_MM] =
gdk_monitor_properties[GDK_MONITOR_PROP_WIDTH_MM] =
g_param_spec_int ("width-mm", NULL, NULL,
0, G_MAXINT,
0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:height-mm: (attributes org.gtk.Property.get=gdk_monitor_get_height_mm)
* GdkMonitor:height-mm:
*
* The height of the monitor, in millimeters.
*/
props[PROP_HEIGHT_MM] =
gdk_monitor_properties[GDK_MONITOR_PROP_HEIGHT_MM] =
g_param_spec_int ("height-mm", NULL, NULL,
0, G_MAXINT,
0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:refresh-rate: (attributes org.gtk.Property.get=gdk_monitor_get_refresh_rate)
* GdkMonitor:refresh-rate:
*
* The refresh rate, in milli-Hertz.
*/
props[PROP_REFRESH_RATE] =
gdk_monitor_properties[GDK_MONITOR_PROP_REFRESH_RATE] =
g_param_spec_int ("refresh-rate", NULL, NULL,
0, G_MAXINT,
0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:subpixel-layout: (attributes org.gtk.Property.get=gdk_monitor_get_subpixel_layout)
* GdkMonitor:subpixel-layout:
*
* The subpixel layout.
*/
props[PROP_SUBPIXEL_LAYOUT] =
gdk_monitor_properties[GDK_MONITOR_PROP_SUBPIXEL_LAYOUT] =
g_param_spec_enum ("subpixel-layout", NULL, NULL,
GDK_TYPE_SUBPIXEL_LAYOUT,
GDK_SUBPIXEL_LAYOUT_UNKNOWN,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkMonitor:valid: (attributes org.gtk.Property.get=gdk_monitor_is_valid)
* GdkMonitor:valid: (getter is_valid)
*
* Whether the object is still valid.
*/
props[PROP_VALID] =
gdk_monitor_properties[GDK_MONITOR_PROP_VALID] =
g_param_spec_boolean ("valid", NULL, NULL,
TRUE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, LAST_PROP, props);
g_object_class_install_properties (object_class, GDK_MONITOR_LAST_PROP, gdk_monitor_properties);
/**
* GdkMonitor::invalidate:
@@ -336,7 +336,7 @@ gdk_monitor_class_init (GdkMonitorClass *class)
*
* Emitted when the output represented by @monitor gets disconnected.
*/
signals[INVALIDATE] = g_signal_new (g_intern_static_string ("invalidate"),
gdk_monitor_signals[GDK_MONITOR_INVALIDATE] = g_signal_new (g_intern_static_string ("invalidate"),
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_FIRST,
0,
@@ -346,7 +346,7 @@ gdk_monitor_class_init (GdkMonitorClass *class)
}
/**
* gdk_monitor_get_display: (attributes org.gtk.Method.get_property=display)
* gdk_monitor_get_display:
* @monitor: a `GdkMonitor`
*
* Gets the display that this monitor belongs to.
@@ -362,7 +362,7 @@ gdk_monitor_get_display (GdkMonitor *monitor)
}
/**
* gdk_monitor_get_geometry: (attributes org.gtk.Method.get_property=geometry)
* gdk_monitor_get_geometry:
* @monitor: a `GdkMonitor`
* @geometry: (out): a `GdkRectangle` to be filled with the monitor geometry
*
@@ -383,7 +383,7 @@ gdk_monitor_get_geometry (GdkMonitor *monitor,
}
/**
* gdk_monitor_get_width_mm: (attributes org.gtk.Method.get_property=width-mm)
* gdk_monitor_get_width_mm:
* @monitor: a `GdkMonitor`
*
* Gets the width in millimeters of the monitor.
@@ -399,7 +399,7 @@ gdk_monitor_get_width_mm (GdkMonitor *monitor)
}
/**
* gdk_monitor_get_height_mm: (attributes org.gtk.Method.get_property=height-mm)
* gdk_monitor_get_height_mm:
* @monitor: a `GdkMonitor`
*
* Gets the height in millimeters of the monitor.
@@ -415,7 +415,7 @@ gdk_monitor_get_height_mm (GdkMonitor *monitor)
}
/**
* gdk_monitor_get_connector: (attributes org.gtk.Method.get_property=connector)
* gdk_monitor_get_connector:
* @monitor: a `GdkMonitor`
*
* Gets the name of the monitor's connector, if available.
@@ -435,7 +435,7 @@ gdk_monitor_get_connector (GdkMonitor *monitor)
}
/**
* gdk_monitor_get_manufacturer: (attributes org.gtk.Method.get_property=manufacturer)
* gdk_monitor_get_manufacturer:
* @monitor: a `GdkMonitor`
*
* Gets the name or PNP ID of the monitor's manufacturer.
@@ -457,7 +457,7 @@ gdk_monitor_get_manufacturer (GdkMonitor *monitor)
}
/**
* gdk_monitor_get_model: (attributes org.gtk.Method.get_property=model)
* gdk_monitor_get_model:
* @monitor: a `GdkMonitor`
*
* Gets the string identifying the monitor model, if available.
@@ -473,7 +473,7 @@ gdk_monitor_get_model (GdkMonitor *monitor)
}
/**
* gdk_monitor_get_scale_factor: (attributes org.gtk.Method.get_property=scale-factor)
* gdk_monitor_get_scale_factor:
* @monitor: a `GdkMonitor`
*
* Gets the internal scale factor that maps from monitor coordinates
@@ -497,7 +497,7 @@ gdk_monitor_get_scale_factor (GdkMonitor *monitor)
}
/**
* gdk_monitor_get_scale: (attributes org.gtk.Method.get_property=scale)
* gdk_monitor_get_scale:
* @monitor: a `GdkMonitor`
*
* Gets the internal scale factor that maps from monitor coordinates
@@ -520,7 +520,7 @@ gdk_monitor_get_scale (GdkMonitor *monitor)
}
/**
* gdk_monitor_get_refresh_rate: (attributes org.gtk.Method.get_property=refresh-rate)
* gdk_monitor_get_refresh_rate:
* @monitor: a `GdkMonitor`
*
* Gets the refresh rate of the monitor, if available.
@@ -539,7 +539,7 @@ gdk_monitor_get_refresh_rate (GdkMonitor *monitor)
}
/**
* gdk_monitor_get_subpixel_layout: (attributes org.gtk.Method.get_property=subpixel-layout)
* gdk_monitor_get_subpixel_layout:
* @monitor: a `GdkMonitor`
*
* Gets information about the layout of red, green and blue
@@ -649,7 +649,7 @@ void
gdk_monitor_set_scale (GdkMonitor *monitor,
double scale)
{
g_return_if_fail (scale >= 1.);
g_return_if_fail (scale > 0.);
monitor->scale_set = TRUE;
@@ -692,11 +692,11 @@ gdk_monitor_invalidate (GdkMonitor *monitor)
{
monitor->valid = FALSE;
g_object_notify (G_OBJECT (monitor), "valid");
g_signal_emit (monitor, signals[INVALIDATE], 0);
g_signal_emit (monitor, gdk_monitor_signals[GDK_MONITOR_INVALIDATE], 0);
}
/**
* gdk_monitor_is_valid: (attributes org.gtk.Method.get_property=valid)
* gdk_monitor_is_valid: (get-property valid)
* @monitor: a `GdkMonitor`
*
* Returns %TRUE if the @monitor object corresponds to a
@@ -716,7 +716,7 @@ gdk_monitor_is_valid (GdkMonitor *monitor)
}
/**
* gdk_monitor_get_description: (attributes org.gtk.Method.get_property=description)
* gdk_monitor_get_description:
* @monitor: a `GdkMonitor`
*
* Gets a string describing the monitor, if available.
@@ -741,7 +741,7 @@ gdk_monitor_set_description (GdkMonitor *monitor,
{
g_free (monitor->description);
monitor->description = g_strdup (description);
g_object_notify_by_pspec (G_OBJECT (monitor), props[PROP_DESCRIPTION]);
g_object_notify_by_pspec (G_OBJECT (monitor), gdk_monitor_properties[GDK_MONITOR_PROP_DESCRIPTION]);
}
#define MM_PER_INCH 25.4
+8 -8
View File
@@ -88,12 +88,12 @@ GdkPaintable * gtk_snapshot_free_to_paintable (GdkSnapshot
G_DEFINE_INTERFACE (GdkPaintable, gdk_paintable, G_TYPE_OBJECT)
enum {
INVALIDATE_CONTENTS,
INVALIDATE_SIZE,
LAST_SIGNAL
GDK_PAINTABLE_INVALIDATE_CONTENTS,
GDK_PAINTABLE_INVALIDATE_SIZE,
GDK_PAINTABLE_LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
static guint gdk_paintable_signals[GDK_PAINTABLE_LAST_SIGNAL] = { 0 };
static void
gdk_paintable_default_snapshot (GdkPaintable *paintable,
@@ -187,7 +187,7 @@ gdk_paintable_default_init (GdkPaintableInterface *iface)
* Examples for such an event would be videos changing to the next frame or
* the icon theme for an icon changing.
*/
signals[INVALIDATE_CONTENTS] =
gdk_paintable_signals[GDK_PAINTABLE_INVALIDATE_CONTENTS] =
g_signal_new (I_("invalidate-contents"),
GDK_TYPE_PAINTABLE,
G_SIGNAL_RUN_LAST,
@@ -211,7 +211,7 @@ gdk_paintable_default_init (GdkPaintableInterface *iface)
* Examples for such an event would be a paintable displaying
* the contents of a toplevel surface being resized.
*/
signals[INVALIDATE_SIZE] =
gdk_paintable_signals[GDK_PAINTABLE_INVALIDATE_SIZE] =
g_signal_new (I_("invalidate-size"),
GDK_TYPE_PAINTABLE,
G_SIGNAL_RUN_LAST,
@@ -426,7 +426,7 @@ gdk_paintable_invalidate_contents (GdkPaintable *paintable)
g_return_if_fail (GDK_IS_PAINTABLE (paintable));
g_return_if_fail (!(gdk_paintable_get_flags (paintable) & GDK_PAINTABLE_STATIC_CONTENTS));
g_signal_emit (paintable, signals[INVALIDATE_CONTENTS], 0);
g_signal_emit (paintable, gdk_paintable_signals[GDK_PAINTABLE_INVALIDATE_CONTENTS], 0);
}
/**
@@ -450,7 +450,7 @@ gdk_paintable_invalidate_size (GdkPaintable *paintable)
g_return_if_fail (GDK_IS_PAINTABLE (paintable));
g_return_if_fail (!(gdk_paintable_get_flags (paintable) & GDK_PAINTABLE_STATIC_SIZE));
g_signal_emit (paintable, signals[INVALIDATE_SIZE], 0);
g_signal_emit (paintable, gdk_paintable_signals[GDK_PAINTABLE_INVALIDATE_SIZE], 0);
}
/**
+86
View File
@@ -0,0 +1,86 @@
/*
* Copyright © 2024 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/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#include "config.h"
#include "gdkparalleltaskprivate.h"
typedef struct _TaskData TaskData;
struct _TaskData
{
GdkTaskFunc task_func;
gpointer task_data;
int n_running_tasks;
};
static void
gdk_parallel_task_thread_func (gpointer data,
gpointer unused)
{
TaskData *task = data;
task->task_func (task->task_data);
g_atomic_int_add (&task->n_running_tasks, -1);
}
/**
* gdk_parallel_task_run:
* @task_func: the function to spawn
* @task_data: data to pass to the function
*
* Spawns the given function in many threads.
* Once all functions have exited, this function returns.
**/
void
gdk_parallel_task_run (GdkTaskFunc task_func,
gpointer task_data)
{
static GThreadPool *pool;
TaskData task = {
.task_func = task_func,
.task_data = task_data,
};
int i, n_tasks;
if (g_once_init_enter (&pool))
{
GThreadPool *the_pool = g_thread_pool_new (gdk_parallel_task_thread_func,
NULL,
MAX (2, g_get_num_processors ()) - 1,
FALSE,
NULL);
g_once_init_leave (&pool, the_pool);
}
n_tasks = g_get_num_processors ();
task.n_running_tasks = n_tasks;
/* Start with 1 because we run 1 task ourselves */
for (i = 1; i < n_tasks; i++)
{
g_thread_pool_push (pool, &task, NULL);
}
gdk_parallel_task_thread_func (&task, NULL);
while (g_atomic_int_get (&task.n_running_tasks) > 0)
g_thread_yield ();
}
+32
View File
@@ -0,0 +1,32 @@
/*
* Copyright © 2024 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/>.
*
* Authors: Benjamin Otte <otte@gnome.org>
*/
#pragma once
#include <glib.h>
G_BEGIN_DECLS
typedef void (* GdkTaskFunc) (gpointer user_data);
void gdk_parallel_task_run (GdkTaskFunc task_func,
gpointer task_data);
G_END_DECLS
+4 -4
View File
@@ -80,7 +80,7 @@ gdk_popup_default_init (GdkPopupInterface *iface)
iface->get_position_y = gdk_popup_default_get_position_y;
/**
* GdkPopup:parent: (attributes org.gtk.Property.get=gdk_popup_get_parent)
* GdkPopup:parent:
*
* The parent surface.
*/
@@ -90,7 +90,7 @@ gdk_popup_default_init (GdkPopupInterface *iface)
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
/**
* GdkPopup:autohide: (attributes org.gtk.Property.get=gdk_popup_get_autohide)
* GdkPopup:autohide:
*
* Whether to hide on outside clicks.
*/
@@ -178,7 +178,7 @@ gdk_popup_get_rect_anchor (GdkPopup *popup)
}
/**
* gdk_popup_get_parent: (attributes org.gtk.Method.get_property=parent)
* gdk_popup_get_parent:
* @popup: a `GdkPopup`
*
* Returns the parent surface of a popup.
@@ -233,7 +233,7 @@ gdk_popup_get_position_y (GdkPopup *popup)
}
/**
* gdk_popup_get_autohide: (attributes org.gtk.Method.get_property=autohide)
* gdk_popup_get_autohide:
* @popup: a `GdkPopup`
*
* Returns whether this popup is set to hide on outside clicks.
+10
View File
@@ -52,6 +52,16 @@ gdk_rectangle_transform_affine (const GdkRectangle *src,
dest->height = ceilf (MAX (y1, y2)) - dest->y;
}
static inline gboolean
gdk_rectangle_contains (const GdkRectangle *rect,
const GdkRectangle *contained)
{
return contained->x >= rect->x
&& contained->y >= rect->y
&& contained->x + contained->width <= rect->x + rect->width
&& contained->y + contained->height <= rect->y + rect->height;
}
G_END_DECLS
+24 -24
View File
@@ -42,21 +42,21 @@ struct _GdkSeatPrivate
};
enum {
DEVICE_ADDED,
DEVICE_REMOVED,
TOOL_ADDED,
TOOL_REMOVED,
N_SIGNALS
GDK_SEAT_DEVICE_ADDED,
GDK_SEAT_DEVICE_REMOVED,
GDK_SEAT_TOOL_ADDED,
GDK_SEAT_TOOL_REMOVED,
GDK_SEAT_N_SIGNALS
};
enum {
PROP_0,
PROP_DISPLAY,
N_PROPS
GDK_SEAT_PROP_0,
GDK_SEAT_PROP_DISPLAY,
GDK_SEAT_N_PROPS
};
static guint signals[N_SIGNALS] = { 0 };
static GParamSpec *props[N_PROPS] = { NULL };
static guint gdk_seat_signals[GDK_SEAT_N_SIGNALS] = { 0 };
static GParamSpec *gdk_seat_properties[GDK_SEAT_N_PROPS] = { NULL };
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GdkSeat, gdk_seat, G_TYPE_OBJECT)
@@ -70,7 +70,7 @@ gdk_seat_set_property (GObject *object,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_SEAT_PROP_DISPLAY:
priv->display = g_value_get_object (value);
break;
default:
@@ -89,7 +89,7 @@ gdk_seat_get_property (GObject *object,
switch (prop_id)
{
case PROP_DISPLAY:
case GDK_SEAT_PROP_DISPLAY:
g_value_set_object (value, priv->display);
break;
default:
@@ -113,7 +113,7 @@ gdk_seat_class_init (GdkSeatClass *klass)
*
* Emitted when a new input device is related to this seat.
*/
signals [DEVICE_ADDED] =
gdk_seat_signals [GDK_SEAT_DEVICE_ADDED] =
g_signal_new (g_intern_static_string ("device-added"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
@@ -130,7 +130,7 @@ gdk_seat_class_init (GdkSeatClass *klass)
*
* Emitted when an input device is removed (e.g. unplugged).
*/
signals [DEVICE_REMOVED] =
gdk_seat_signals [GDK_SEAT_DEVICE_REMOVED] =
g_signal_new (g_intern_static_string ("device-removed"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
@@ -153,7 +153,7 @@ gdk_seat_class_init (GdkSeatClass *klass)
*
* A same tool may be used by several devices.
*/
signals [TOOL_ADDED] =
gdk_seat_signals [GDK_SEAT_TOOL_ADDED] =
g_signal_new (g_intern_static_string ("tool-added"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
@@ -169,7 +169,7 @@ gdk_seat_class_init (GdkSeatClass *klass)
*
* Emitted whenever a tool is no longer known to this @seat.
*/
signals [TOOL_REMOVED] =
gdk_seat_signals [GDK_SEAT_TOOL_REMOVED] =
g_signal_new (g_intern_static_string ("tool-removed"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
@@ -179,18 +179,18 @@ gdk_seat_class_init (GdkSeatClass *klass)
GDK_TYPE_DEVICE_TOOL);
/**
* GdkSeat:display: (attributes org.gtk.Property.get=gdk_seat_get_display)
* GdkSeat:display:
*
* `GdkDisplay` of this seat.
*/
props[PROP_DISPLAY] =
gdk_seat_properties[GDK_SEAT_PROP_DISPLAY] =
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPS, props);
g_object_class_install_properties (object_class, GDK_SEAT_N_PROPS, gdk_seat_properties);
}
static void
@@ -378,7 +378,7 @@ gdk_seat_device_added (GdkSeat *seat,
GdkDevice *device)
{
gdk_device_set_seat (device, seat);
g_signal_emit (seat, signals[DEVICE_ADDED], 0, device);
g_signal_emit (seat, gdk_seat_signals[GDK_SEAT_DEVICE_ADDED], 0, device);
}
void
@@ -386,11 +386,11 @@ gdk_seat_device_removed (GdkSeat *seat,
GdkDevice *device)
{
gdk_device_set_seat (device, NULL);
g_signal_emit (seat, signals[DEVICE_REMOVED], 0, device);
g_signal_emit (seat, gdk_seat_signals[GDK_SEAT_DEVICE_REMOVED], 0, device);
}
/**
* gdk_seat_get_display: (attributes org.gtk.Method.get_property=display)
* gdk_seat_get_display:
* @seat: a `GdkSeat`
*
* Returns the `GdkDisplay` this seat belongs to.
@@ -412,14 +412,14 @@ void
gdk_seat_tool_added (GdkSeat *seat,
GdkDeviceTool *tool)
{
g_signal_emit (seat, signals[TOOL_ADDED], 0, tool);
g_signal_emit (seat, gdk_seat_signals[GDK_SEAT_TOOL_ADDED], 0, tool);
}
void
gdk_seat_tool_removed (GdkSeat *seat,
GdkDeviceTool *tool)
{
g_signal_emit (seat, signals[TOOL_REMOVED], 0, tool);
g_signal_emit (seat, gdk_seat_signals[GDK_SEAT_TOOL_REMOVED], 0, tool);
}
GdkDeviceTool *
+6
View File
@@ -167,6 +167,12 @@ gdk_subsurface_attach (GdkSubsurface *subsurface,
g_return_val_if_fail (sibling == NULL || GDK_IS_SUBSURFACE (sibling), FALSE);
g_return_val_if_fail (sibling == NULL || sibling->parent == subsurface->parent, FALSE);
/* if the texture fully covers the background, ignore it */
if (background &&
gsk_rect_contains_rect (dest, background) &&
gdk_memory_format_alpha (gdk_texture_get_format (texture)) == GDK_MEMORY_ALPHA_OPAQUE)
background = NULL;
result = GDK_SUBSURFACE_GET_CLASS (subsurface)->attach (subsurface,
texture,
source,
+208 -95
View File
@@ -40,11 +40,13 @@
#include <glib/gi18n-lib.h>
#include "gdkmarshalers.h"
#include "gdkpopupprivate.h"
#include "gdkrectangle.h"
#include "gdkrectangleprivate.h"
#include "gdktoplevelprivate.h"
#include "gdkvulkancontext.h"
#include "gdksubsurfaceprivate.h"
#include "gsk/gskrectprivate.h"
#include <math.h>
#ifdef HAVE_EGL
@@ -75,31 +77,34 @@ struct _GdkSurfacePrivate
GdkMemoryDepth egl_surface_depth;
#endif
cairo_region_t *opaque_region;
cairo_rectangle_int_t opaque_rect; /* This is different from the region */
gpointer widget;
GdkColorState *color_state;
};
enum {
LAYOUT,
RENDER,
EVENT,
ENTER_MONITOR,
LEAVE_MONITOR,
LAST_SIGNAL
GDK_SURFACE_LAYOUT,
GDK_SURFACE_RENDER,
GDK_SURFACE_EVENT,
GDK_SURFACE_ENTER_MONITOR,
GDK_SURFACE_LEAVE_MONITOR,
GDK_SURFACE_LAST_SIGNAL
};
enum {
PROP_0,
PROP_CURSOR,
PROP_DISPLAY,
PROP_FRAME_CLOCK,
PROP_MAPPED,
PROP_WIDTH,
PROP_HEIGHT,
PROP_SCALE_FACTOR,
PROP_SCALE,
LAST_PROP
GDK_SURFACE_PROP_0,
GDK_SURFACE_PROP_CURSOR,
GDK_SURFACE_PROP_DISPLAY,
GDK_SURFACE_PROP_FRAME_CLOCK,
GDK_SURFACE_PROP_MAPPED,
GDK_SURFACE_PROP_WIDTH,
GDK_SURFACE_PROP_HEIGHT,
GDK_SURFACE_PROP_SCALE_FACTOR,
GDK_SURFACE_PROP_SCALE,
GDK_SURFACE_LAST_PROP
};
/* Global info */
@@ -115,15 +120,15 @@ static void gdk_surface_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
static void update_cursor (GdkDisplay *display,
GdkDevice *device);
static void gdk_surface_update_cursor (GdkDisplay *display,
GdkDevice *device);
static void gdk_surface_queue_set_is_mapped (GdkSurface *surface,
gboolean is_mapped);
static guint signals[LAST_SIGNAL] = { 0 };
static GParamSpec *properties[LAST_PROP] = { NULL, };
static guint gdk_surface_signals[GDK_SURFACE_LAST_SIGNAL] = { 0 };
static GParamSpec *gdk_surface_properties[GDK_SURFACE_LAST_PROP] = { NULL, };
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GdkSurface, gdk_surface, G_TYPE_OBJECT)
@@ -510,6 +515,12 @@ gdk_surface_real_create_subsurface (GdkSurface *surface)
return NULL;
}
static void
gdk_surface_default_set_opaque_region (GdkSurface *surface,
cairo_region_t *region)
{
}
static void
gdk_surface_constructed (GObject *object)
{
@@ -533,93 +544,94 @@ gdk_surface_class_init (GdkSurfaceClass *klass)
klass->beep = gdk_surface_real_beep;
klass->get_scale = gdk_surface_real_get_scale;
klass->create_subsurface = gdk_surface_real_create_subsurface;
klass->set_opaque_region = gdk_surface_default_set_opaque_region;
/**
* GdkSurface:cursor: (attributes org.gtk.Property.get=gdk_surface_get_cursor org.gtk.Property.set=gdk_surface_set_cursor)
* GdkSurface:cursor:
*
* The mouse pointer for the `GdkSurface`.
*/
properties[PROP_CURSOR] =
gdk_surface_properties[GDK_SURFACE_PROP_CURSOR] =
g_param_spec_object ("cursor", NULL, NULL,
GDK_TYPE_CURSOR,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
/**
* GdkSurface:display: (attributes org.gtk.Property.get=gdk_surface_get_display)
* GdkSurface:display:
*
* The `GdkDisplay` connection of the surface.
*/
properties[PROP_DISPLAY] =
gdk_surface_properties[GDK_SURFACE_PROP_DISPLAY] =
g_param_spec_object ("display", NULL, NULL,
GDK_TYPE_DISPLAY,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
/**
* GdkSurface:frame-clock: (attributes org.gtk.Property.get=gdk_surface_get_frame_clock)
* GdkSurface:frame-clock:
*
* The `GdkFrameClock` of the surface.
*/
properties[PROP_FRAME_CLOCK] =
gdk_surface_properties[GDK_SURFACE_PROP_FRAME_CLOCK] =
g_param_spec_object ("frame-clock", NULL, NULL,
GDK_TYPE_FRAME_CLOCK,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
/**
* GdkSurface:mapped: (attributes org.gtk.Property.get=gdk_surface_get_mapped)
* GdkSurface:mapped:
*
* Whether the surface is mapped.
*/
properties[PROP_MAPPED] =
gdk_surface_properties[GDK_SURFACE_PROP_MAPPED] =
g_param_spec_boolean ("mapped", NULL, NULL,
FALSE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkSurface:width: (attributes org.gtk.Property.get=gdk_surface_get_width)
* GdkSurface:width:
*
* The width of the surface in pixels.
*/
properties[PROP_WIDTH] =
gdk_surface_properties[GDK_SURFACE_PROP_WIDTH] =
g_param_spec_int ("width", NULL, NULL,
0, G_MAXINT, 0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkSurface:height: (attributes org.gtk.Property.get=gdk_surface_get_height)
* GdkSurface:height:
*
* The height of the surface, in pixels.
*/
properties[PROP_HEIGHT] =
gdk_surface_properties[GDK_SURFACE_PROP_HEIGHT] =
g_param_spec_int ("height", NULL, NULL,
0, G_MAXINT, 0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkSurface:scale-factor: (attributes org.gtk.Property.get=gdk_surface_get_scale_factor)
* GdkSurface:scale-factor:
*
* The scale factor of the surface.
*
* The scale factor is the next larger integer,
* compared to [property@Gdk.Surface:scale].
*/
properties[PROP_SCALE_FACTOR] =
gdk_surface_properties[GDK_SURFACE_PROP_SCALE_FACTOR] =
g_param_spec_int ("scale-factor", NULL, NULL,
1, G_MAXINT, 1,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
/**
* GdkSurface:scale: (attributes org.gtk.Property.get=gdk_surface_get_scale)
* GdkSurface:scale:
*
* The scale of the surface.
*
* Since: 4.12
*/
properties[PROP_SCALE] =
gdk_surface_properties[GDK_SURFACE_PROP_SCALE] =
g_param_spec_double ("scale", NULL, NULL,
1., G_MAXDOUBLE, 1.,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, LAST_PROP, properties);
g_object_class_install_properties (object_class, GDK_SURFACE_LAST_PROP, gdk_surface_properties);
/**
* GdkSurface::layout:
@@ -633,7 +645,7 @@ gdk_surface_class_init (GdkSurfaceClass *klass)
* Surface size is reported in application pixels, not
* device pixels (see gdk_surface_get_scale_factor()).
*/
signals[LAYOUT] =
gdk_surface_signals[GDK_SURFACE_LAYOUT] =
g_signal_new (g_intern_static_string ("layout"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
@@ -645,7 +657,7 @@ gdk_surface_class_init (GdkSurfaceClass *klass)
2,
G_TYPE_INT,
G_TYPE_INT);
g_signal_set_va_marshaller (signals[LAYOUT],
g_signal_set_va_marshaller (gdk_surface_signals[GDK_SURFACE_LAYOUT],
G_OBJECT_CLASS_TYPE (object_class),
_gdk_marshal_VOID__INT_INTv);
@@ -658,7 +670,7 @@ gdk_surface_class_init (GdkSurfaceClass *klass)
*
* Returns: %TRUE to indicate that the signal has been handled
*/
signals[RENDER] =
gdk_surface_signals[GDK_SURFACE_RENDER] =
g_signal_new (g_intern_static_string ("render"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
@@ -669,7 +681,7 @@ gdk_surface_class_init (GdkSurfaceClass *klass)
G_TYPE_BOOLEAN,
1,
CAIRO_GOBJECT_TYPE_REGION);
g_signal_set_va_marshaller (signals[RENDER],
g_signal_set_va_marshaller (gdk_surface_signals[GDK_SURFACE_RENDER],
G_OBJECT_CLASS_TYPE (object_class),
_gdk_marshal_BOOLEAN__BOXEDv);
@@ -682,7 +694,7 @@ gdk_surface_class_init (GdkSurfaceClass *klass)
*
* Returns: %TRUE to indicate that the event has been handled
*/
signals[EVENT] =
gdk_surface_signals[GDK_SURFACE_EVENT] =
g_signal_new (g_intern_static_string ("event"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
@@ -693,7 +705,7 @@ gdk_surface_class_init (GdkSurfaceClass *klass)
G_TYPE_BOOLEAN,
1,
G_TYPE_POINTER);
g_signal_set_va_marshaller (signals[EVENT],
g_signal_set_va_marshaller (gdk_surface_signals[GDK_SURFACE_EVENT],
G_OBJECT_CLASS_TYPE (object_class),
gdk_surface_event_marshallerv);
@@ -704,7 +716,7 @@ gdk_surface_class_init (GdkSurfaceClass *klass)
*
* Emitted when @surface starts being present on the monitor.
*/
signals[ENTER_MONITOR] =
gdk_surface_signals[GDK_SURFACE_ENTER_MONITOR] =
g_signal_new (g_intern_static_string ("enter-monitor"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
@@ -723,7 +735,7 @@ gdk_surface_class_init (GdkSurfaceClass *klass)
*
* Emitted when @surface stops being present on the monitor.
*/
signals[LEAVE_MONITOR] =
gdk_surface_signals[GDK_SURFACE_LEAVE_MONITOR] =
g_signal_new (g_intern_static_string ("leave-monitor"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
@@ -771,7 +783,7 @@ gdk_surface_finalize (GObject *object)
g_clear_object (&surface->display);
g_clear_pointer (&surface->opaque_region, cairo_region_destroy);
g_clear_pointer (&priv->opaque_region, cairo_region_destroy);
if (surface->parent)
surface->parent->children = g_list_remove (surface->parent->children, surface);
@@ -795,18 +807,18 @@ gdk_surface_set_property (GObject *object,
switch (prop_id)
{
case PROP_CURSOR:
case GDK_SURFACE_PROP_CURSOR:
gdk_surface_set_cursor (surface, g_value_get_object (value));
break;
case PROP_DISPLAY:
case GDK_SURFACE_PROP_DISPLAY:
surface->display = g_value_dup_object (value);
g_assert (surface->display != NULL);
g_signal_connect (surface->display, "seat-removed",
G_CALLBACK (seat_removed_cb), surface);
break;
case PROP_FRAME_CLOCK:
case GDK_SURFACE_PROP_FRAME_CLOCK:
gdk_surface_set_frame_clock (surface, GDK_FRAME_CLOCK (g_value_get_object (value)));
break;
@@ -828,35 +840,35 @@ gdk_surface_get_property (GObject *object,
switch (prop_id)
{
case PROP_CURSOR:
case GDK_SURFACE_PROP_CURSOR:
g_value_set_object (value, gdk_surface_get_cursor (surface));
break;
case PROP_DISPLAY:
case GDK_SURFACE_PROP_DISPLAY:
g_value_set_object (value, surface->display);
break;
case PROP_FRAME_CLOCK:
case GDK_SURFACE_PROP_FRAME_CLOCK:
g_value_set_object (value, surface->frame_clock);
break;
case PROP_MAPPED:
case GDK_SURFACE_PROP_MAPPED:
g_value_set_boolean (value, GDK_SURFACE_IS_MAPPED (surface));
break;
case PROP_WIDTH:
case GDK_SURFACE_PROP_WIDTH:
g_value_set_int (value, surface->width);
break;
case PROP_HEIGHT:
case GDK_SURFACE_PROP_HEIGHT:
g_value_set_int (value, surface->height);
break;
case PROP_SCALE_FACTOR:
case GDK_SURFACE_PROP_SCALE_FACTOR:
g_value_set_int (value, gdk_surface_get_scale_factor (surface));
break;
case PROP_SCALE:
case GDK_SURFACE_PROP_SCALE:
g_value_set_double (value, gdk_surface_get_scale (surface));
break;
@@ -1011,7 +1023,7 @@ _gdk_surface_destroy_hierarchy (GdkSurface *surface,
if (GDK_IS_TOPLEVEL (surface))
g_object_notify (G_OBJECT (surface), "state");
g_object_notify_by_pspec (G_OBJECT (surface), properties[PROP_MAPPED]);
g_object_notify_by_pspec (G_OBJECT (surface), gdk_surface_properties[GDK_SURFACE_PROP_MAPPED]);
}
/**
@@ -1071,7 +1083,7 @@ gdk_surface_get_widget (GdkSurface *self)
}
/**
* gdk_surface_get_display: (attributes org.gtk.Method.get_property=display)
* gdk_surface_get_display:
* @surface: a `GdkSurface`
*
* Gets the `GdkDisplay` associated with a `GdkSurface`.
@@ -1100,7 +1112,7 @@ gdk_surface_is_destroyed (GdkSurface *surface)
}
/**
* gdk_surface_get_mapped: (attributes org.gtk.Method.get_property=mapped)
* gdk_surface_get_mapped:
* @surface: a `GdkSurface`
*
* Checks whether the surface has been mapped.
@@ -1124,6 +1136,7 @@ gdk_surface_set_egl_native_window (GdkSurface *self,
{
#ifdef HAVE_EGL
GdkSurfacePrivate *priv = gdk_surface_get_instance_private (self);
GdkGLContext *current = NULL;
/* This checks that all EGL platforms we support conform to the same struct sizes.
* When this ever fails, there will be some fun times happening for whoever tries
@@ -1132,12 +1145,21 @@ gdk_surface_set_egl_native_window (GdkSurface *self,
if (priv->egl_surface != NULL)
{
gdk_gl_context_clear_current_if_surface (self);
eglDestroySurface (gdk_surface_get_display (self), priv->egl_surface);
GdkDisplay *display = gdk_surface_get_display (self);
current = gdk_gl_context_clear_current_if_surface (self);
eglDestroySurface (gdk_display_get_egl_display (display), priv->egl_surface);
priv->egl_surface = NULL;
}
priv->egl_native_window = native_window;
if (current)
{
gdk_gl_context_make_current (current);
g_object_unref (current);
}
}
gpointer /* EGLSurface */
@@ -1157,20 +1179,26 @@ gdk_surface_ensure_egl_surface (GdkSurface *self,
g_return_val_if_fail (priv->egl_native_window != NULL, depth);
if (priv->egl_surface_depth != depth &&
priv->egl_surface != NULL &&
gdk_display_get_egl_config (display, priv->egl_surface_depth) != gdk_display_get_egl_config (display, depth))
if (depth == GDK_MEMORY_NONE)
{
gdk_gl_context_clear_current_if_surface (self);
eglDestroySurface (gdk_display_get_egl_display (display), priv->egl_surface);
priv->egl_surface = NULL;
if (priv->egl_surface_depth == GDK_MEMORY_NONE)
depth = GDK_MEMORY_U8;
else
depth = priv->egl_surface_depth;
}
if (priv->egl_surface == NULL)
if (priv->egl_surface == NULL ||
(priv->egl_surface != NULL &&
gdk_display_get_egl_config (display, priv->egl_surface_depth) != gdk_display_get_egl_config (display, depth)))
{
GdkGLContext *cleared;
EGLint attribs[4];
int i;
cleared = gdk_gl_context_clear_current_if_surface (self);
if (priv->egl_surface != NULL)
eglDestroySurface (gdk_display_get_egl_display (display), priv->egl_surface);
i = 0;
if (depth == GDK_MEMORY_U8_SRGB && display->have_egl_gl_colorspace)
{
@@ -1195,6 +1223,12 @@ gdk_surface_ensure_egl_surface (GdkSurface *self,
NULL);
}
priv->egl_surface_depth = depth;
if (cleared)
{
gdk_gl_context_make_current (cleared);
g_object_unref (cleared);
}
}
return priv->egl_surface_depth;
@@ -1254,7 +1288,7 @@ gdk_surface_create_gl_context (GdkSurface *surface,
if (!gdk_display_prepare_gl (surface->display, error))
return NULL;
return gdk_gl_context_new (surface->display, surface);
return gdk_gl_context_new (surface->display, surface, FALSE);
}
/**
@@ -1352,7 +1386,7 @@ gdk_surface_layout_on_clock (GdkFrameClock *clock,
return;
}
g_signal_emit (surface, signals[LAYOUT], 0, surface->width, surface->height);
g_signal_emit (surface, gdk_surface_signals[GDK_SURFACE_LAYOUT], 0, surface->width, surface->height);
}
/**
@@ -1405,7 +1439,7 @@ gdk_surface_paint_on_clock (GdkFrameClock *clock,
g_object_ref (surface);
g_signal_emit (surface, signals[RENDER], 0, expose_region, &handled);
g_signal_emit (surface, gdk_surface_signals[GDK_SURFACE_RENDER], 0, expose_region, &handled);
g_object_unref (surface);
}
@@ -1807,11 +1841,11 @@ gdk_surface_set_cursor_internal (GdkSurface *surface,
pointer_info = _gdk_display_get_pointer_info (surface->display, device);
if (surface == pointer_info->surface_under_pointer)
update_cursor (surface->display, device);
gdk_surface_update_cursor (surface->display, device);
}
/**
* gdk_surface_get_cursor: (attributes org.gtk.Method.get_property=cursor)
* gdk_surface_get_cursor:
* @surface: a `GdkSurface`
*
* Retrieves a `GdkCursor` pointer for the cursor currently set on the
@@ -1833,7 +1867,7 @@ gdk_surface_get_cursor (GdkSurface *surface)
}
/**
* gdk_surface_set_cursor: (attributes org.gtk.Method.set_property=cursor)
* gdk_surface_set_cursor:
* @surface: a `GdkSurface`
* @cursor: (nullable): a `GdkCursor`
*
@@ -1885,7 +1919,7 @@ gdk_surface_set_cursor (GdkSurface *surface,
}
g_list_free (seats);
g_object_notify_by_pspec (G_OBJECT (surface), properties[PROP_CURSOR]);
g_object_notify_by_pspec (G_OBJECT (surface), gdk_surface_properties[GDK_SURFACE_PROP_CURSOR]);
}
}
@@ -1993,7 +2027,7 @@ gdk_surface_get_geometry (GdkSurface *surface,
}
/**
* gdk_surface_get_width: (attributes org.gtk.Method.get_property=width)
* gdk_surface_get_width:
* @surface: a `GdkSurface`
*
* Returns the width of the given @surface.
@@ -2012,7 +2046,7 @@ gdk_surface_get_width (GdkSurface *surface)
}
/**
* gdk_surface_get_height: (attributes org.gtk.Method.get_property=height)
* gdk_surface_get_height:
* @surface: a `GdkSurface`
*
* Returns the height of the given @surface.
@@ -2128,8 +2162,8 @@ gdk_surface_set_input_region (GdkSurface *surface,
}
static void
update_cursor (GdkDisplay *display,
GdkDevice *device)
gdk_surface_update_cursor (GdkDisplay *display,
GdkDevice *device)
{
GdkSurface *cursor_surface;
GdkSurface *pointer_surface;
@@ -2204,7 +2238,7 @@ _gdk_display_set_surface_under_pointer (GdkDisplay *display,
if (surface)
{
g_object_ref (surface);
update_cursor (display, device);
gdk_surface_update_cursor (display, device);
}
}
@@ -2556,7 +2590,7 @@ gdk_surface_set_frame_clock (GdkSurface *surface,
}
/**
* gdk_surface_get_frame_clock: (attributes org.gtk.Method.get_property=frame-clock)
* gdk_surface_get_frame_clock:
* @surface: surface to get frame clock for
*
* Gets the frame clock for the surface.
@@ -2575,7 +2609,7 @@ gdk_surface_get_frame_clock (GdkSurface *surface)
}
/**
* gdk_surface_get_scale_factor: (attributes org.gtk.Method.get_property=scale-factor)
* gdk_surface_get_scale_factor:
* @surface: surface to get scale factor for
*
* Returns the internal scale factor that maps from surface coordinates
@@ -2601,7 +2635,7 @@ gdk_surface_get_scale_factor (GdkSurface *surface)
}
/**
* gdk_surface_get_scale: (attributes org.gtk.Method.get_property=scale)
* gdk_surface_get_scale:
* @surface: surface to get scale for
*
* Returns the internal scale that maps from surface coordinates
@@ -2631,6 +2665,35 @@ gdk_surface_get_scale (GdkSurface *surface)
return GDK_SURFACE_GET_CLASS (surface)->get_scale (surface);
}
static void
gdk_surface_update_opaque_region (GdkSurface *self)
{
GdkSurfacePrivate *priv = gdk_surface_get_instance_private (self);
cairo_region_t *region;
if (priv->opaque_region == NULL)
{
if (priv->opaque_rect.width <= 0)
region = NULL;
else
region = cairo_region_create_rectangle (&priv->opaque_rect);
}
else
{
if (priv->opaque_rect.width <= 0)
region = cairo_region_reference (priv->opaque_region);
else
{
region = cairo_region_copy (priv->opaque_region);
cairo_region_union_rectangle (region, &priv->opaque_rect);
}
}
GDK_SURFACE_GET_CLASS (self)->set_opaque_region (self, region);
g_clear_pointer (&region, cairo_region_destroy);
}
/**
* gdk_surface_set_opaque_region:
* @surface: a top-level `GdkSurface`
@@ -2652,27 +2715,77 @@ gdk_surface_get_scale (GdkSurface *surface)
* is opaque, as we know where the opaque regions are. If your surface
* background is not opaque, please update this property in your
* [GtkWidgetClass.css_changed](../gtk4/vfunc.Widget.css_changed.html) handler.
*
* Deprecated: 4.16: GDK can figure out the opaque parts of a window itself
* by inspecting the contents that are drawn.
*/
void
gdk_surface_set_opaque_region (GdkSurface *surface,
cairo_region_t *region)
{
GdkSurfaceClass *class;
GdkSurfacePrivate *priv = gdk_surface_get_instance_private (surface);
g_return_if_fail (GDK_IS_SURFACE (surface));
g_return_if_fail (!GDK_SURFACE_DESTROYED (surface));
if (cairo_region_equal (surface->opaque_region, region))
if (cairo_region_equal (priv->opaque_region, region))
return;
g_clear_pointer (&surface->opaque_region, cairo_region_destroy);
g_clear_pointer (&priv->opaque_region, cairo_region_destroy);
if (region != NULL)
surface->opaque_region = cairo_region_reference (region);
priv->opaque_region = cairo_region_reference (region);
class = GDK_SURFACE_GET_CLASS (surface);
if (class->set_opaque_region)
class->set_opaque_region (surface, region);
gdk_surface_update_opaque_region (surface);
}
/* Sets the opaque rect from the rendernode via end_frame() */
void
gdk_surface_set_opaque_rect (GdkSurface *self,
const graphene_rect_t *rect)
{
GdkSurfacePrivate *priv = gdk_surface_get_instance_private (self);
cairo_rectangle_int_t opaque;
if (rect)
gsk_rect_to_cairo_shrink (rect, &opaque);
else
opaque = (cairo_rectangle_int_t) { 0, 0, 0, 0 };
if (gdk_rectangle_equal (&priv->opaque_rect, &opaque))
return;
priv->opaque_rect = opaque;
gdk_surface_update_opaque_region (self);
}
/*
* gdk_surface_is_opaque:
* @self: a surface
*
* Checks if the whole surface is known to be opaque.
* This allows using an RGBx buffer instead of RGBA.
*
* This function works for the currently rendered frame inside
* begin_frame() implementations.
*
* Returns: %TRUE if the whole surface is provably opaque
**/
gboolean
gdk_surface_is_opaque (GdkSurface *self)
{
GdkSurfacePrivate *priv = gdk_surface_get_instance_private (self);
cairo_rectangle_int_t whole = { 0, 0, self->width, self->height };
if (gdk_rectangle_contains (&priv->opaque_rect, &whole))
return TRUE;
if (priv->opaque_region &&
cairo_region_contains_rectangle (priv->opaque_region, &whole) == CAIRO_REGION_OVERLAP_IN)
return TRUE;
return FALSE;
}
void
@@ -2967,7 +3080,7 @@ gdk_surface_handle_event (GdkEvent *event)
if (gdk_event_get_event_type (event) == GDK_MOTION_NOTIFY)
surface->request_motion = FALSE;
g_signal_emit (surface, signals[EVENT], 0, event, &handled);
g_signal_emit (surface, gdk_surface_signals[GDK_SURFACE_EVENT], 0, event, &handled);
if (GDK_PROFILER_IS_RUNNING)
add_event_mark (event, begin_time, GDK_PROFILER_CURRENT_TIME);
@@ -3076,14 +3189,14 @@ void
gdk_surface_enter_monitor (GdkSurface *surface,
GdkMonitor *monitor)
{
g_signal_emit (surface, signals[ENTER_MONITOR], 0, monitor);
g_signal_emit (surface, gdk_surface_signals[GDK_SURFACE_ENTER_MONITOR], 0, monitor);
}
void
gdk_surface_leave_monitor (GdkSurface *surface,
GdkMonitor *monitor)
{
g_signal_emit (surface, signals[LEAVE_MONITOR], 0, monitor);
g_signal_emit (surface, gdk_surface_signals[GDK_SURFACE_LEAVE_MONITOR], 0, monitor);
}
GdkSubsurface *
+1 -1
View File
@@ -125,7 +125,7 @@ void gdk_surface_request_layout (GdkSurface *surface);
GDK_AVAILABLE_IN_ALL
GdkFrameClock* gdk_surface_get_frame_clock (GdkSurface *surface);
GDK_AVAILABLE_IN_ALL
GDK_DEPRECATED_IN_4_16
void gdk_surface_set_opaque_region (GdkSurface *surface,
cairo_region_t *region);
+11 -10
View File
@@ -96,8 +96,6 @@ struct _GdkSurface
GSList *draw_contexts;
GdkDrawContext *paint_context;
cairo_region_t *opaque_region;
GdkSeat *current_shortcuts_inhibited_seat;
GPtrArray *subsurfaces;
@@ -253,14 +251,17 @@ gdk_gravity_flip_vertically (GdkGravity anchor)
g_assert_not_reached ();
}
void _gdk_surface_destroy (GdkSurface *surface,
gboolean foreign_destroy);
void gdk_surface_invalidate_rect (GdkSurface *surface,
const GdkRectangle *rect);
void gdk_surface_invalidate_region (GdkSurface *surface,
const cairo_region_t *region);
void _gdk_surface_clear_update_area (GdkSurface *surface);
void _gdk_surface_update_size (GdkSurface *surface);
void _gdk_surface_destroy (GdkSurface *surface,
gboolean foreign_destroy);
void gdk_surface_invalidate_rect (GdkSurface *surface,
const GdkRectangle *rect);
void gdk_surface_invalidate_region (GdkSurface *surface,
const cairo_region_t *region);
void _gdk_surface_clear_update_area (GdkSurface *surface);
void _gdk_surface_update_size (GdkSurface *surface);
void gdk_surface_set_opaque_rect (GdkSurface *self,
const graphene_rect_t *rect);
gboolean gdk_surface_is_opaque (GdkSurface *self);
GdkGLContext * gdk_surface_get_paint_gl_context (GdkSurface *surface,
GError **error);
+34 -23
View File
@@ -33,7 +33,18 @@
*
* `GdkTexture` is an immutable object: That means you cannot change
* anything about it other than increasing the reference count via
* [method@GObject.Object.ref], and consequently, it is a thread-safe object.
* [method@GObject.Object.ref], and consequently, it is a threadsafe object.
*
* GDK provides a number of threadsafe texture loading functions:
* [ctor@Gdk.Texture.new_from_resource],
* [ctor@Gdk.Texture.new_from_bytes],
* [ctor@Gdk.Texture.new_from_file],
* [ctor@Gdk.Texture.new_from_filename],
* [ctor@Gdk.Texture.new_for_pixbuf]. Note that these are meant for loading
* icons and resources that are shipped with the toolkit or application. It
* is recommended that you use a dedicated image loading framework such as
* [glycin](https://lib.rs/crates/glycin), if you need to load untrusted image
* data.
*/
#include "config.h"
@@ -69,15 +80,15 @@ gtk_snapshot_append_texture (GdkSnapshot *snapshot,
const graphene_rect_t *bounds);
enum {
PROP_0,
PROP_WIDTH,
PROP_HEIGHT,
PROP_COLOR_STATE,
GDK_TEXTURE_PROP_0,
GDK_TEXTURE_PROP_WIDTH,
GDK_TEXTURE_PROP_HEIGHT,
GDK_TEXTURE_PROP_COLOR_STATE,
N_PROPS
GDK_TEXTURE_N_PROPS
};
static GParamSpec *properties[N_PROPS];
static GParamSpec *gdk_texture_properties[GDK_TEXTURE_N_PROPS];
static GdkTextureChain *
gdk_texture_chain_new (void)
@@ -279,15 +290,15 @@ gdk_texture_set_property (GObject *gobject,
switch (prop_id)
{
case PROP_WIDTH:
case GDK_TEXTURE_PROP_WIDTH:
self->width = g_value_get_int (value);
break;
case PROP_HEIGHT:
case GDK_TEXTURE_PROP_HEIGHT:
self->height = g_value_get_int (value);
break;
case PROP_COLOR_STATE:
case GDK_TEXTURE_PROP_COLOR_STATE:
self->color_state = g_value_dup_boxed (value);
g_assert (self->color_state);
break;
@@ -308,15 +319,15 @@ gdk_texture_get_property (GObject *gobject,
switch (prop_id)
{
case PROP_WIDTH:
case GDK_TEXTURE_PROP_WIDTH:
g_value_set_int (value, self->width);
break;
case PROP_HEIGHT:
case GDK_TEXTURE_PROP_HEIGHT:
g_value_set_int (value, self->height);
break;
case PROP_COLOR_STATE:
case GDK_TEXTURE_PROP_COLOR_STATE:
g_value_set_boxed (value, self->color_state);
break;
@@ -384,11 +395,11 @@ gdk_texture_class_init (GdkTextureClass *klass)
gobject_class->finalize = gdk_texture_finalize;
/**
* GdkTexture:width: (attributes org.gtk.Property.get=gdk_texture_get_width)
* GdkTexture:width:
*
* The width of the texture, in pixels.
*/
properties[PROP_WIDTH] =
gdk_texture_properties[GDK_TEXTURE_PROP_WIDTH] =
g_param_spec_int ("width", NULL, NULL,
1,
G_MAXINT,
@@ -399,11 +410,11 @@ gdk_texture_class_init (GdkTextureClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkTexture:height: (attributes org.gtk.Property.get=gdk_texture_get_height)
* GdkTexture:height:
*
* The height of the texture, in pixels.
*/
properties[PROP_HEIGHT] =
gdk_texture_properties[GDK_TEXTURE_PROP_HEIGHT] =
g_param_spec_int ("height", NULL, NULL,
1,
G_MAXINT,
@@ -414,13 +425,13 @@ gdk_texture_class_init (GdkTextureClass *klass)
G_PARAM_EXPLICIT_NOTIFY);
/**
* GdkTexture:color-state: (attributes org.gtk.Property.get=gdk_texture_get_color_state)
* GdkTexture:color-state:
*
* The color state of the texture.
*
* Since: 4.16
*/
properties[PROP_COLOR_STATE] =
gdk_texture_properties[GDK_TEXTURE_PROP_COLOR_STATE] =
g_param_spec_boxed ("color-state", NULL, NULL,
GDK_TYPE_COLOR_STATE,
G_PARAM_READWRITE |
@@ -428,7 +439,7 @@ gdk_texture_class_init (GdkTextureClass *klass)
G_PARAM_STATIC_STRINGS |
G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (gobject_class, N_PROPS, properties);
g_object_class_install_properties (gobject_class, GDK_TEXTURE_N_PROPS, gdk_texture_properties);
}
static void
@@ -770,7 +781,7 @@ gdk_texture_new_from_filename (const char *path,
}
/**
* gdk_texture_get_width: (attributes org.gtk.Method.get_property=width)
* gdk_texture_get_width:
* @texture: a `GdkTexture`
*
* Returns the width of @texture, in pixels.
@@ -786,7 +797,7 @@ gdk_texture_get_width (GdkTexture *texture)
}
/**
* gdk_texture_get_height: (attributes org.gtk.Method.get_property=height)
* gdk_texture_get_height:
* @texture: a `GdkTexture`
*
* Returns the height of the @texture, in pixels.
@@ -802,7 +813,7 @@ gdk_texture_get_height (GdkTexture *texture)
}
/**
* gdk_texture_get_color_state: (attributes org.gtk.Method.get_property=color-state)
* gdk_texture_get_color_state:
* @self: a `GdkTexture`
*
* Returns the color state associated with the texture.
+21 -21
View File
@@ -43,12 +43,12 @@ G_DEFINE_INTERFACE (GdkToplevel, gdk_toplevel, GDK_TYPE_SURFACE)
enum
{
COMPUTE_SIZE,
GDK_TOPLEVEL_COMPUTE_SIZE,
N_SIGNALS
GDK_TOPLEVEL_N_SIGNALS
};
static guint signals[N_SIGNALS] = { 0 };
static guint gdk_toplevel_signals[GDK_TOPLEVEL_N_SIGNALS] = { 0 };
static void
gdk_toplevel_default_present (GdkToplevel *toplevel,
@@ -109,7 +109,7 @@ void
gdk_toplevel_notify_compute_size (GdkToplevel *toplevel,
GdkToplevelSize *size)
{
g_signal_emit (toplevel, signals[COMPUTE_SIZE], 0, size);
g_signal_emit (toplevel, gdk_toplevel_signals[GDK_TOPLEVEL_COMPUTE_SIZE], 0, size);
gdk_toplevel_size_validate (size);
}
@@ -157,7 +157,7 @@ gdk_toplevel_default_init (GdkToplevelInterface *iface)
iface->unexport_handle = gdk_toplevel_default_unexport_handle;
/**
* GdkToplevel:state: (attributes org.gtk.Property.get=gdk_toplevel_get_state)
* GdkToplevel:state:
*
* The state of the toplevel.
*/
@@ -167,7 +167,7 @@ gdk_toplevel_default_init (GdkToplevelInterface *iface)
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/**
* GdkToplevel:title: (attributes org.gtk.Property.set=gdk_toplevel_set_title)
* GdkToplevel:title:
*
* The title of the surface.
*/
@@ -177,7 +177,7 @@ gdk_toplevel_default_init (GdkToplevelInterface *iface)
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY));
/**
* GdkToplevel:startup-id: (attributes org.gtk.Property.set=gdk_toplevel_set_startup_id)
* GdkToplevel:startup-id:
*
* The startup ID of the surface.
*
@@ -190,7 +190,7 @@ gdk_toplevel_default_init (GdkToplevelInterface *iface)
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY));
/**
* GdkToplevel:transient-for: (attributes org.gtk.Property.set=gdk_toplevel_set_transient_for)
* GdkToplevel:transient-for:
*
* The transient parent of the surface.
*/
@@ -200,7 +200,7 @@ gdk_toplevel_default_init (GdkToplevelInterface *iface)
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY));
/**
* GdkToplevel:modal: (attributes org.gtk.Property.set=gdk_toplevel_set_modal)
* GdkToplevel:modal:
*
* Whether the surface is modal.
*/
@@ -210,7 +210,7 @@ gdk_toplevel_default_init (GdkToplevelInterface *iface)
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY));
/**
* GdkToplevel:icon-list: (attributes org.gtk.Property.set=gdk_toplevel_set_icon_list)
* GdkToplevel:icon-list:
*
* A list of textures to use as icon.
*/
@@ -219,7 +219,7 @@ gdk_toplevel_default_init (GdkToplevelInterface *iface)
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY));
/**
* GdkToplevel:decorated: (attributes org.gtk.Property.set=gdk_toplevel_set_decorated)
* GdkToplevel:decorated:
*
* Whether the window manager should add decorations.
*/
@@ -229,7 +229,7 @@ gdk_toplevel_default_init (GdkToplevelInterface *iface)
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY));
/**
* GdkToplevel:deletable: (attributes org.gtk.Property.set=gdk_toplevel_set_deletable)
* GdkToplevel:deletable:
*
* Whether the window manager should allow to close the surface.
*/
@@ -278,7 +278,7 @@ gdk_toplevel_default_init (GdkToplevelInterface *iface)
* passed via the [struct@Gdk.ToplevelSize] object. Failing to do so
* will result in an arbitrary size being used as a result.
*/
signals[COMPUTE_SIZE] =
gdk_toplevel_signals[GDK_TOPLEVEL_COMPUTE_SIZE] =
g_signal_new (I_("compute-size"),
GDK_TYPE_TOPLEVEL,
G_SIGNAL_RUN_LAST,
@@ -391,7 +391,7 @@ gdk_toplevel_focus (GdkToplevel *toplevel,
}
/**
* gdk_toplevel_get_state: (attributes org.gtk.Method.get_property=state)
* gdk_toplevel_get_state:
* @toplevel: a `GdkToplevel`
*
* Gets the bitwise or of the currently active surface state flags,
@@ -412,7 +412,7 @@ gdk_toplevel_get_state (GdkToplevel *toplevel)
}
/**
* gdk_toplevel_set_title: (attributes org.gtk.Method.set_property=title)
* gdk_toplevel_set_title:
* @toplevel: a `GdkToplevel`
* @title: title of @surface
*
@@ -431,7 +431,7 @@ gdk_toplevel_set_title (GdkToplevel *toplevel,
}
/**
* gdk_toplevel_set_startup_id: (attributes org.gtk.Method.set_property=startup-id)
* gdk_toplevel_set_startup_id:
* @toplevel: a `GdkToplevel`
* @startup_id: a string with startup-notification identifier
*
@@ -451,7 +451,7 @@ gdk_toplevel_set_startup_id (GdkToplevel *toplevel,
}
/**
* gdk_toplevel_set_transient_for: (attributes org.gtk.Method.set_property=transient-for)
* gdk_toplevel_set_transient_for:
* @toplevel: a `GdkToplevel`
* @parent: another toplevel `GdkSurface`
*
@@ -475,7 +475,7 @@ gdk_toplevel_set_transient_for (GdkToplevel *toplevel,
}
/**
* gdk_toplevel_set_modal: (attributes org.gtk.Method.set_property=modal)
* gdk_toplevel_set_modal:
* @toplevel: a `GdkToplevel`
* @modal: %TRUE if the surface is modal, %FALSE otherwise.
*
@@ -499,7 +499,7 @@ gdk_toplevel_set_modal (GdkToplevel *toplevel,
}
/**
* gdk_toplevel_set_icon_list: (attributes org.gtk.Method.set_property=icon-list)
* gdk_toplevel_set_icon_list:
* @toplevel: a `GdkToplevel`
* @surfaces: (transfer none) (element-type GdkTexture):
* A list of textures to use as icon, of different sizes
@@ -547,7 +547,7 @@ gdk_toplevel_show_window_menu (GdkToplevel *toplevel,
}
/**
* gdk_toplevel_set_decorated: (attributes org.gtk.Method.set_property=decorated)
* gdk_toplevel_set_decorated:
* @toplevel: a `GdkToplevel`
* @decorated: %TRUE to request decorations
*
@@ -567,7 +567,7 @@ gdk_toplevel_set_decorated (GdkToplevel *toplevel,
}
/**
* gdk_toplevel_set_deletable: (attributes org.gtk.Method.set_property=deletable)
* gdk_toplevel_set_deletable:
* @toplevel: a `GdkToplevel`
* @deletable: %TRUE to request a delete button
*
+8 -1
View File
@@ -85,7 +85,6 @@ typedef enum
* @GDK_TOPLEVEL_STATE_BOTTOM_RESIZABLE: whether the bottom edge is resizable
* @GDK_TOPLEVEL_STATE_LEFT_TILED: whether the left edge is tiled
* @GDK_TOPLEVEL_STATE_LEFT_RESIZABLE: whether the left edge is resizable
* @GDK_TOPLEVEL_STATE_SUSPENDED: the surface is not visible to the user
*
* Specifies the state of a toplevel surface.
*
@@ -95,6 +94,14 @@ typedef enum
* will give an indication of tiledness without any of the per-edge states
* being set.
*/
/**
* GDK_TOPLEVEL_STATE_SUSPENDED:
*
* The surface is not visible to the user.
*
* Since: 4.12
*/
typedef enum
{
GDK_TOPLEVEL_STATE_MINIMIZED = 1 << 0,
+71 -38
View File
@@ -41,6 +41,7 @@ static const GdkDebugKey gsk_vulkan_feature_keys[] = {
{ "semaphore-export", GDK_VULKAN_FEATURE_SEMAPHORE_EXPORT, "Disable sync of exported dmabufs" },
{ "semaphore-import", GDK_VULKAN_FEATURE_SEMAPHORE_IMPORT, "Disable sync of imported dmabufs" },
{ "incremental-present", GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT, "Do not send damage regions" },
{ "swapchain-maintenance", GDK_VULKAN_FEATURE_SWAPCHAIN_MAINTENANCE, "Do not use advanced swapchain features" },
};
#endif
@@ -87,9 +88,9 @@ struct _GdkVulkanContextPrivate {
};
enum {
IMAGES_UPDATED,
GDK_VULKAN_CONTEXT_IMAGES_UPDATED,
LAST_SIGNAL
GDK_VULKAN_CONTEXT_LAST_SIGNAL
};
/**
@@ -101,7 +102,7 @@ enum {
**/
G_DEFINE_QUARK (gdk-vulkan-error-quark, gdk_vulkan_error)
static guint signals[LAST_SIGNAL] = { 0 };
static guint gdk_vulkan_context_signals[GDK_VULKAN_CONTEXT_LAST_SIGNAL] = { 0 };
static void gdk_vulkan_context_initable_init (GInitableIface *iface);
@@ -303,6 +304,15 @@ surface_present_mode_to_string (VkPresentModeKHR present_mode)
return "(unknown)";
}
static gboolean
gdk_vulkan_context_has_feature (GdkVulkanContext *self,
GdkVulkanFeatures feature)
{
GdkDisplay *display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (self));
return (display->vulkan_features & feature) ? TRUE : FALSE;
}
static const VkPresentModeKHR preferred_present_modes[] = {
VK_PRESENT_MODE_MAILBOX_KHR,
VK_PRESENT_MODE_IMMEDIATE_KHR,
@@ -457,8 +467,9 @@ gdk_vulkan_context_check_swapchain (GdkVulkanContext *context,
res = GDK_VK_CHECK (vkCreateSwapchainKHR, device,
&(VkSwapchainCreateInfoKHR) {
.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
.pNext = NULL,
.flags = 0,
.flags =
(gdk_vulkan_context_has_feature (context, GDK_VULKAN_FEATURE_SWAPCHAIN_MAINTENANCE) ?
VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT : 0),
.surface = priv->surface,
.minImageCount = CLAMP (4,
capabilities.minImageCount,
@@ -527,7 +538,7 @@ gdk_vulkan_context_check_swapchain (GdkVulkanContext *context,
return FALSE;
}
g_signal_emit (context, signals[IMAGES_UPDATED], 0);
g_signal_emit (context, gdk_vulkan_context_signals[GDK_VULKAN_CONTEXT_IMAGES_UPDATED], 0);
return res == VK_SUCCESS;
}
@@ -556,8 +567,12 @@ physical_device_supports_extension (VkPhysicalDevice device,
static GdkVulkanFeatures
physical_device_check_features (VkPhysicalDevice device)
{
VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT swapchain_maintenance1_features = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT,
};
VkPhysicalDeviceVulkan12Features v12_features = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
.pNext = &swapchain_maintenance1_features
};
VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES,
@@ -603,6 +618,10 @@ physical_device_check_features (VkPhysicalDevice device)
if (physical_device_supports_extension (device, VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME))
features |= GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT;
if (swapchain_maintenance1_features.swapchainMaintenance1 ||
physical_device_supports_extension (device, VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME))
features |= GDK_VULKAN_FEATURE_SWAPCHAIN_MAINTENANCE;
return features;
}
@@ -692,11 +711,10 @@ gdk_vulkan_context_end_frame (GdkDrawContext *draw_context,
GdkVulkanContext *context = GDK_VULKAN_CONTEXT (draw_context);
GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context);
GdkSurface *surface = gdk_draw_context_get_surface (draw_context);
GdkDisplay *display = gdk_draw_context_get_display (draw_context);
VkRectLayerKHR *rectangles;
int n_regions;
if (display->vulkan_features & GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT)
if (gdk_vulkan_context_has_feature (context, GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT))
{
double scale;
@@ -714,8 +732,8 @@ gdk_vulkan_context_end_frame (GdkDrawContext *draw_context,
.layer = 0,
.offset.x = (int) floor (r.x * scale),
.offset.y = (int) floor (r.y * scale),
.extent.width = (int) ceil (r.width * scale),
.extent.height = (int) ceil (r.height * scale),
.extent.width = (int) ceil ((r.x + r.width) * scale) - floor (r.x * scale),
.extent.height = (int) ceil ((r.y + r.height) * scale) - floor (r.y * scale),
};
}
}
@@ -786,7 +804,7 @@ gdk_vulkan_context_class_init (GdkVulkanContextClass *klass)
* Usually this means that the swapchain had to be recreated,
* for example in response to a change of the surface size.
*/
signals[IMAGES_UPDATED] =
gdk_vulkan_context_signals[GDK_VULKAN_CONTEXT_IMAGES_UPDATED] =
g_signal_new (g_intern_static_string ("images-updated"),
G_OBJECT_CLASS_TYPE (gobject_class),
G_SIGNAL_RUN_LAST,
@@ -1348,7 +1366,6 @@ gdk_vulkan_context_get_draw_index (GdkVulkanContext *context)
GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context);
g_return_val_if_fail (GDK_IS_VULKAN_CONTEXT (context), 0);
g_return_val_if_fail (gdk_draw_context_is_in_frame (GDK_DRAW_CONTEXT (context)), 0);
return priv->draw_index;
}
@@ -1372,7 +1389,6 @@ gdk_vulkan_context_set_draw_semaphore (GdkVulkanContext *context,
GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context);
g_return_if_fail (GDK_IS_VULKAN_CONTEXT (context));
g_return_if_fail (!gdk_draw_context_is_in_frame (GDK_DRAW_CONTEXT (context)));
g_return_if_fail (priv->draw_semaphore == VK_NULL_HANDLE);
priv->draw_semaphore = semaphore;
@@ -1408,8 +1424,9 @@ gdk_display_create_vulkan_device (GdkDisplay *display,
last = n_devices;
skip_features = gdk_parse_debug_var ("GDK_VULKAN_DISABLE",
gsk_vulkan_feature_keys,
G_N_ELEMENTS (gsk_vulkan_feature_keys));
"GDK_VULKAN_DISABLE can be set to a list of Vulkan features to disable.\n",
gsk_vulkan_feature_keys,
G_N_ELEMENTS (gsk_vulkan_feature_keys));
if (skip_features & GDK_VULKAN_FEATURE_YCBCR)
skip_features |= GDK_VULKAN_FEATURE_DMABUF;
@@ -1508,6 +1525,11 @@ gdk_display_create_vulkan_device (GdkDisplay *display,
{
if (queue_props[j].queueFlags & VK_QUEUE_GRAPHICS_BIT)
{
VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT swapchain_maintenance1_features = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT,
.swapchainMaintenance1 = VK_TRUE,
};
gpointer create_device_pNext = NULL;
GPtrArray *device_extensions;
device_extensions = g_ptr_array_new ();
@@ -1536,6 +1558,12 @@ gdk_display_create_vulkan_device (GdkDisplay *display,
}
if (features & GDK_VULKAN_FEATURE_INCREMENTAL_PRESENT)
g_ptr_array_add (device_extensions, (gpointer) VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME);
if (features & GDK_VULKAN_FEATURE_SWAPCHAIN_MAINTENANCE)
{
g_ptr_array_add (device_extensions, (gpointer) VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME);
swapchain_maintenance1_features.pNext = create_device_pNext;
create_device_pNext = &swapchain_maintenance1_features;
}
#define ENABLE_IF(flag) ((features & (flag)) ? VK_TRUE : VK_FALSE)
GDK_DISPLAY_DEBUG (display, VULKAN, "Using Vulkan device %u, queue %u", i, j);
@@ -1554,6 +1582,7 @@ gdk_display_create_vulkan_device (GdkDisplay *display,
.pNext = &(VkPhysicalDeviceVulkan11Features) {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES,
.samplerYcbcrConversion = ENABLE_IF (GDK_VULKAN_FEATURE_YCBCR),
.pNext = create_device_pNext,
}
},
NULL,
@@ -1628,10 +1657,10 @@ gdk_display_create_vulkan_instance (GdkDisplay *display,
gboolean have_debug_report = FALSE;
VkResult res;
if (gdk_display_get_debug_flags (display) & GDK_DEBUG_VULKAN_DISABLE)
if (!gdk_has_feature (GDK_FEATURE_VULKAN))
{
g_set_error_literal (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_NOT_AVAILABLE,
_("Vulkan support disabled via GDK_DEBUG"));
_("Vulkan support disabled via GDK_DISABLE"));
return FALSE;
}
@@ -1672,28 +1701,32 @@ gdk_display_create_vulkan_instance (GdkDisplay *display,
g_ptr_array_add (used_extensions, (gpointer) VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME);
if (g_str_equal (extensions[i].extensionName, VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME))
g_ptr_array_add (used_extensions, (gpointer) VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME);
if (g_str_equal (extensions[i].extensionName, VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME))
g_ptr_array_add (used_extensions, (gpointer) VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME);
if (g_str_equal (extensions[i].extensionName, VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME))
g_ptr_array_add (used_extensions, (gpointer) VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME);
}
res = GDK_VK_CHECK (vkCreateInstance, &(VkInstanceCreateInfo) {
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
.pNext = NULL,
.flags = 0,
.pApplicationInfo = &(VkApplicationInfo) {
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
.pNext = NULL,
.pApplicationName = g_get_application_name (),
.applicationVersion = 0,
.pEngineName = "GTK",
.engineVersion = VK_MAKE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION, GDK_MICRO_VERSION),
.apiVersion = VK_API_VERSION_1_3
},
.enabledLayerCount = 0,
.ppEnabledLayerNames = NULL,
.enabledExtensionCount = used_extensions->len,
.ppEnabledExtensionNames = (const char * const *) used_extensions->pdata,
},
NULL,
&display->vk_instance);
res = vkCreateInstance (&(VkInstanceCreateInfo) {
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
.pNext = NULL,
.flags = 0,
.pApplicationInfo = &(VkApplicationInfo) {
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
.pNext = NULL,
.pApplicationName = g_get_application_name (),
.applicationVersion = 0,
.pEngineName = "GTK",
.engineVersion = VK_MAKE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION, GDK_MICRO_VERSION),
.apiVersion = VK_API_VERSION_1_3
},
.enabledLayerCount = 0,
.ppEnabledLayerNames = NULL,
.enabledExtensionCount = used_extensions->len,
.ppEnabledExtensionNames = (const char * const *) used_extensions->pdata,
},
NULL,
&display->vk_instance);
g_ptr_array_free (used_extensions, TRUE);
if (res != VK_SUCCESS)
@@ -1992,7 +2025,7 @@ gdk_display_get_vk_shader_module (GdkDisplay *self,
static void
gdk_vulkan_context_class_init (GdkVulkanContextClass *klass)
{
signals[IMAGES_UPDATED] =
gdk_vulkan_context_signals[GDK_VULKAN_CONTEXT_IMAGES_UPDATED] =
g_signal_new (g_intern_static_string ("images-updated"),
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST,
+1 -1
View File
@@ -65,7 +65,7 @@ gdk_vulkan_handle_result (VkResult res,
{
if (res != VK_SUCCESS)
{
GDK_DEBUG (VULKAN, "%s(): %s (%d)", called_function, gdk_vulkan_strerror (res), res);
g_warning ("%s(): %s (%d)", called_function, gdk_vulkan_strerror (res), res);
}
return res;
+6
View File
@@ -1133,6 +1133,7 @@
0x00fe8a dead_small_schwa
0x00fe8b dead_capital_schwa
0x00fe8c dead_greek
0x00fe8d dead_hamza
0x00fea0 ch
0x00fea1 Ch
0x00fea2 CH
@@ -1398,6 +1399,11 @@
0x1000259 schwa
0x1000275 obarred
0x1000292 ezh
0x1000300 combining_grave
0x1000301 combining_acute
0x1000303 combining_tilde
0x1000309 combining_hook
0x1000323 combining_belowdot
0x1000492 Cyrillic_GHE_bar
0x1000493 Cyrillic_ghe_bar
0x1000496 Cyrillic_ZHE_descender
+2293 -2275
View File
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -228,7 +228,7 @@ struct _FormatData {
guint16 bits_per_sample;
guint16 samples_per_pixel;
guint16 sample_format;
guint16 alpha_samples;
gint16 alpha_samples;
guint16 photometric;
};
@@ -241,27 +241,27 @@ static const FormatData format_data[] = {
[GDK_MEMORY_A8R8G8B8] = { GDK_MEMORY_R8G8B8A8, 8, 4, SAMPLEFORMAT_UINT, EXTRASAMPLE_UNASSALPHA, PHOTOMETRIC_RGB },
[GDK_MEMORY_R8G8B8A8] = { GDK_MEMORY_R8G8B8A8, 8, 4, SAMPLEFORMAT_UINT, EXTRASAMPLE_UNASSALPHA, PHOTOMETRIC_RGB },
[GDK_MEMORY_A8B8G8R8] = { GDK_MEMORY_R8G8B8A8, 8, 4, SAMPLEFORMAT_UINT, EXTRASAMPLE_UNASSALPHA, PHOTOMETRIC_RGB },
[GDK_MEMORY_R8G8B8] = { GDK_MEMORY_R8G8B8, 8, 3, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_B8G8R8] = { GDK_MEMORY_R8G8B8, 8, 3, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_R8G8B8X8] = { GDK_MEMORY_R8G8B8, 8, 3, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_X8R8G8B8] = { GDK_MEMORY_R8G8B8, 8, 3, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_B8G8R8X8] = { GDK_MEMORY_R8G8B8, 8, 3, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_X8B8G8R8] = { GDK_MEMORY_R8G8B8, 8, 3, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_R16G16B16] = { GDK_MEMORY_R16G16B16, 16, 3, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_R8G8B8] = { GDK_MEMORY_R8G8B8, 8, 3, SAMPLEFORMAT_UINT, -1, PHOTOMETRIC_RGB },
[GDK_MEMORY_B8G8R8] = { GDK_MEMORY_R8G8B8, 8, 3, SAMPLEFORMAT_UINT, -1, PHOTOMETRIC_RGB },
[GDK_MEMORY_R8G8B8X8] = { GDK_MEMORY_R8G8B8X8, 8, 4, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_X8R8G8B8] = { GDK_MEMORY_R8G8B8X8, 8, 4, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_B8G8R8X8] = { GDK_MEMORY_R8G8B8X8, 8, 4, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_X8B8G8R8] = { GDK_MEMORY_R8G8B8X8, 8, 4, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_R16G16B16] = { GDK_MEMORY_R16G16B16, 16, 3, SAMPLEFORMAT_UINT, -1, PHOTOMETRIC_RGB },
[GDK_MEMORY_R16G16B16A16_PREMULTIPLIED] = { GDK_MEMORY_R16G16B16A16_PREMULTIPLIED, 16, 4, SAMPLEFORMAT_UINT, EXTRASAMPLE_ASSOCALPHA, PHOTOMETRIC_RGB },
[GDK_MEMORY_R16G16B16A16] = { GDK_MEMORY_R16G16B16A16, 16, 4, SAMPLEFORMAT_UINT, EXTRASAMPLE_UNASSALPHA, PHOTOMETRIC_RGB },
[GDK_MEMORY_R16G16B16_FLOAT] = { GDK_MEMORY_R16G16B16_FLOAT, 16, 3, SAMPLEFORMAT_IEEEFP, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_R16G16B16_FLOAT] = { GDK_MEMORY_R16G16B16_FLOAT, 16, 3, SAMPLEFORMAT_IEEEFP, -1, PHOTOMETRIC_RGB },
[GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED] = { GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED, 16, 4, SAMPLEFORMAT_IEEEFP, EXTRASAMPLE_ASSOCALPHA, PHOTOMETRIC_RGB },
[GDK_MEMORY_R16G16B16A16_FLOAT] = { GDK_MEMORY_R16G16B16A16_FLOAT, 16, 4, SAMPLEFORMAT_IEEEFP, EXTRASAMPLE_UNASSALPHA, PHOTOMETRIC_RGB },
[GDK_MEMORY_R32G32B32_FLOAT] = { GDK_MEMORY_R32G32B32_FLOAT, 32, 3, SAMPLEFORMAT_IEEEFP, 0, PHOTOMETRIC_RGB },
[GDK_MEMORY_R32G32B32_FLOAT] = { GDK_MEMORY_R32G32B32_FLOAT, 32, 3, SAMPLEFORMAT_IEEEFP, -1, PHOTOMETRIC_RGB },
[GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED] = { GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED, 32, 4, SAMPLEFORMAT_IEEEFP, EXTRASAMPLE_ASSOCALPHA, PHOTOMETRIC_RGB },
[GDK_MEMORY_R32G32B32A32_FLOAT] = { GDK_MEMORY_R32G32B32A32_FLOAT, 32, 4, SAMPLEFORMAT_IEEEFP, EXTRASAMPLE_UNASSALPHA, PHOTOMETRIC_RGB },
[GDK_MEMORY_G8A8_PREMULTIPLIED] = { GDK_MEMORY_G8A8_PREMULTIPLIED, 8, 2, SAMPLEFORMAT_UINT, EXTRASAMPLE_ASSOCALPHA, PHOTOMETRIC_MINISBLACK },
[GDK_MEMORY_G8A8] = { GDK_MEMORY_G8A8, 8, 2, SAMPLEFORMAT_UINT, EXTRASAMPLE_UNASSALPHA, PHOTOMETRIC_MINISBLACK },
[GDK_MEMORY_G8] = { GDK_MEMORY_G8, 8, 1, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_MINISBLACK },
[GDK_MEMORY_G8] = { GDK_MEMORY_G8, 8, 1, SAMPLEFORMAT_UINT, -1, PHOTOMETRIC_MINISBLACK },
[GDK_MEMORY_G16A16_PREMULTIPLIED] = { GDK_MEMORY_G16A16_PREMULTIPLIED, 16, 2, SAMPLEFORMAT_UINT, EXTRASAMPLE_ASSOCALPHA, PHOTOMETRIC_MINISBLACK },
[GDK_MEMORY_G16A16] = { GDK_MEMORY_G16A16, 16, 2, SAMPLEFORMAT_UINT, EXTRASAMPLE_UNASSALPHA, PHOTOMETRIC_MINISBLACK },
[GDK_MEMORY_G16] = { GDK_MEMORY_G16, 16, 1, SAMPLEFORMAT_UINT, 0, PHOTOMETRIC_MINISBLACK },
[GDK_MEMORY_G16] = { GDK_MEMORY_G16, 16, 1, SAMPLEFORMAT_UINT, -1, PHOTOMETRIC_MINISBLACK },
[GDK_MEMORY_A8] = { GDK_MEMORY_G8A8, 8, 2, SAMPLEFORMAT_UINT, EXTRASAMPLE_UNASSALPHA, PHOTOMETRIC_MINISBLACK },
[GDK_MEMORY_A16] = { GDK_MEMORY_G16A16, 16, 2, SAMPLEFORMAT_UINT, EXTRASAMPLE_UNASSALPHA, PHOTOMETRIC_MINISBLACK },
[GDK_MEMORY_A16_FLOAT] = { GDK_MEMORY_R16G16B16A16_FLOAT, 16, 4, SAMPLEFORMAT_IEEEFP, EXTRASAMPLE_ASSOCALPHA, PHOTOMETRIC_RGB },
@@ -302,7 +302,7 @@ gdk_save_tiff (GdkTexture *texture)
TIFFSetField (tif, TIFFTAG_SAMPLEFORMAT, fdata->sample_format);
TIFFSetField (tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField (tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
if (fdata->alpha_samples)
if (fdata->alpha_samples >= 0)
TIFFSetField (tif, TIFFTAG_EXTRASAMPLES, 1, &fdata->alpha_samples);
TIFFSetField (tif, TIFFTAG_PHOTOMETRIC, fdata->photometric);
@@ -384,7 +384,7 @@ gdk_load_tiff (GBytes *input_bytes,
guint16 sample_format;
guint16 orientation;
guint32 width, height;
guint16 alpha_samples;
gint16 alpha_samples;
GdkMemoryFormat format;
guchar *data, *line;
gsize stride;
@@ -421,9 +421,9 @@ gdk_load_tiff (GBytes *input_bytes,
if (TIFFGetField (tif, TIFFTAG_EXTRASAMPLES, &extra, &extra_types))
alpha_samples = extra_types[0];
else
alpha_samples = 0;
alpha_samples = -1;
if (alpha_samples != 0 && alpha_samples != EXTRASAMPLE_ASSOCALPHA && alpha_samples != EXTRASAMPLE_UNASSALPHA)
if (alpha_samples >= 0 && alpha_samples != EXTRASAMPLE_ASSOCALPHA && alpha_samples != EXTRASAMPLE_UNASSALPHA && alpha_samples != 0)
{
texture = load_fallback (tif, error);
TIFFClose (tif);
@@ -431,7 +431,7 @@ gdk_load_tiff (GBytes *input_bytes,
}
}
else
alpha_samples = 0;
alpha_samples = -1;
for (format = 0; format < G_N_ELEMENTS (format_data); format++)
{
+10 -19
View File
@@ -250,8 +250,7 @@ typedef NSString *CALayerContentsGravity;
-(BOOL)canBecomeKeyWindow
{
return GDK_IS_TOPLEVEL (gdk_surface) ||
(GDK_IS_POPUP (gdk_surface) && GDK_SURFACE (gdk_surface)->input_region != NULL);
return GDK_IS_TOPLEVEL (gdk_surface);
}
-(void)showAndMakeKey:(BOOL)makeKey
@@ -692,24 +691,9 @@ typedef NSString *CALayerContentsGravity;
-(void)setStyleMask:(NSWindowStyleMask)styleMask
{
gboolean was_opaque;
gboolean is_opaque;
was_opaque = (([self styleMask] & NSWindowStyleMaskTitled) != 0);
[super setStyleMask:styleMask];
is_opaque = (([self styleMask] & NSWindowStyleMaskTitled) != 0);
_gdk_macos_surface_update_fullscreen_state (gdk_surface);
if (was_opaque != is_opaque)
{
[self setOpaque:is_opaque];
if (!is_opaque)
[self setBackgroundColor:[NSColor clearColor]];
}
}
-(NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen
@@ -785,13 +769,20 @@ typedef NSString *CALayerContentsGravity;
if (decorated)
{
style_mask |= NSWindowStyleMaskTitled;
style_mask &= ~NSWindowStyleMaskFullSizeContentView;
[self setTitleVisibility:NSWindowTitleVisible];
}
else
{
style_mask &= ~NSWindowStyleMaskTitled;
style_mask |= NSWindowStyleMaskFullSizeContentView;
[self setTitleVisibility:NSWindowTitleHidden];
}
[self setTitlebarAppearsTransparent:!decorated];
[[self standardWindowButton:NSWindowCloseButton] setHidden:!decorated];
[[self standardWindowButton:NSWindowMiniaturizeButton] setHidden:!decorated];
[[self standardWindowButton:NSWindowZoomButton] setHidden:!decorated];
[self setStyleMask:style_mask];
}
+2 -21
View File
@@ -107,32 +107,13 @@ _gdk_macos_cairo_context_cairo_create (GdkCairoContext *cairo_context)
cairo_clip (cr);
}
/* If we have some exposed transparent area in the damage region,
* we need to clear the existing content first to leave an transparent
* area for cairo. We use (surface_bounds or damage)-(opaque) to get
* the smallest set of rectangles we need to clear as it's expensive.
*/
if (!opaque)
{
cairo_region_t *transparent;
cairo_rectangle_int_t r = { 0, 0, width/scale, height/scale };
cairo_save (cr);
if (damage != NULL)
cairo_region_get_extents (damage, &r);
transparent = cairo_region_create_rectangle (&r);
if (surface->opaque_region)
cairo_region_subtract (transparent, surface->opaque_region);
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
cairo_paint (cr);
if (!cairo_region_is_empty (transparent))
{
gdk_cairo_region (cr, transparent);
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
cairo_fill (cr);
}
cairo_region_destroy (transparent);
cairo_restore (cr);
}
+1 -1
View File
@@ -242,7 +242,7 @@ gdk_macos_gl_context_allocate (GdkMacosGLContext *self)
return;
/* Alter to an opaque surface if necessary */
opaque = _gdk_macos_surface_is_opaque (GDK_MACOS_SURFACE (surface));
opaque = gdk_surface_is_opaque (surface);
if (opaque != self->last_opaque)
{
self->last_opaque = !!opaque;
-1
View File
@@ -86,7 +86,6 @@ CGDirectDisplayID _gdk_macos_surface_get_screen_id (GdkMacosSurface
const char *_gdk_macos_surface_get_title (GdkMacosSurface *self);
void _gdk_macos_surface_set_title (GdkMacosSurface *self,
const char *title);
gboolean _gdk_macos_surface_is_opaque (GdkMacosSurface *self);
NSView *_gdk_macos_surface_get_view (GdkMacosSurface *self);
gboolean _gdk_macos_surface_get_modal_hint (GdkMacosSurface *self);
void _gdk_macos_surface_set_modal_hint (GdkMacosSurface *self,
+2 -25
View File
@@ -533,7 +533,7 @@ gdk_macos_surface_class_init (GdkMacosSurfaceClass *klass)
surface_class->set_opaque_region = gdk_macos_surface_set_opaque_region;
/**
* GdkMacosSurface:native: (attributes org.gtk.Property.get=gdk_macos_surface_get_native_window)
* GdkMacosSurface:native:
*
* The "native" property contains the underlying NSWindow.
*/
@@ -553,29 +553,6 @@ gdk_macos_surface_init (GdkMacosSurface *self)
self->monitors = g_ptr_array_new_with_free_func (g_object_unref);
}
gboolean
_gdk_macos_surface_is_opaque (GdkMacosSurface *self)
{
GdkSurface *surface = (GdkSurface *)self;
g_return_val_if_fail (GDK_IS_MACOS_SURFACE (self), FALSE);
if (surface->opaque_region != NULL &&
cairo_region_num_rectangles (surface->opaque_region) == 1)
{
cairo_rectangle_int_t extents;
cairo_region_get_extents (surface->opaque_region, &extents);
return (extents.x == 0 &&
extents.y == 0 &&
extents.width == GDK_SURFACE (self)->width &&
extents.height == GDK_SURFACE (self)->height);
}
return FALSE;
}
const char *
_gdk_macos_surface_get_title (GdkMacosSurface *self)
{
@@ -636,7 +613,7 @@ _gdk_macos_surface_set_native (GdkMacosSurface *self,
}
/**
* gdk_macos_surface_get_native_window: (attributes org.gtk.Method.get_property=native)
* gdk_macos_surface_get_native_window:
* @self: a #GdkMacosSurface
*
* Gets the underlying NSWindow used by the surface.
+8
View File
@@ -617,6 +617,14 @@ _gdk_macos_toplevel_surface_constructed (GObject *object)
_gdk_macos_surface_set_native (GDK_MACOS_SURFACE (self), window);
[window setOpaque:NO];
/* Workaround: if we use full transparency, window rendering becomes slow,
* because macOS tries to dynamically calculate the shadow.
* Instead provide a tiny bit of alpha, so shadows are drawn around the window.
*/
[window setBackgroundColor:[[NSColor blackColor] colorWithAlphaComponent:0.00001]];
/* Allow NSWindow to go fullscreen */
[window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];

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