Compare commits
115 Commits
editor-exp
...
ebassi/boo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2855ea43a3 | ||
|
|
2a9296f54e | ||
|
|
4c77a466af | ||
|
|
91c7fc9cc5 | ||
|
|
595e2e6001 | ||
|
|
31e16ed7ba | ||
|
|
2925ba2228 | ||
|
|
40f6f11cae | ||
|
|
f92dd63401 | ||
|
|
2d39cdbff8 | ||
|
|
8d675810e8 | ||
|
|
8b25481c26 | ||
|
|
5fdf96f496 | ||
|
|
b61991a023 | ||
|
|
91d302a201 | ||
|
|
35a1a62d50 | ||
|
|
ac7a4cb94c | ||
|
|
bacd7ef92f | ||
|
|
980dc44f4a | ||
|
|
2d648f84a9 | ||
|
|
aef0943f61 | ||
|
|
3e146171cb | ||
|
|
24bbaceaa4 | ||
|
|
318cf132e9 | ||
|
|
8bbc143ed1 | ||
|
|
220d130c0f | ||
|
|
e28a32a7c7 | ||
|
|
88f8b77d77 | ||
|
|
1066374909 | ||
|
|
34a2595dfb | ||
|
|
76fcd5cf25 | ||
|
|
32e6ed4eca | ||
|
|
2983c0be70 | ||
|
|
e0bf6585de | ||
|
|
c045b0be4c | ||
|
|
d8c094944a | ||
|
|
510bf86268 | ||
|
|
f3bea027a0 | ||
|
|
bce3b6f34a | ||
|
|
01274dfbb9 | ||
|
|
533a2cf9ec | ||
|
|
5dbc5bbf22 | ||
|
|
79c999cf76 | ||
|
|
e375bc8838 | ||
|
|
79505f940b | ||
|
|
0f087deb2a | ||
|
|
e245883f91 | ||
|
|
4e9bd13892 | ||
|
|
65e9b8fe66 | ||
|
|
e9f870fee6 | ||
|
|
e5e5966934 | ||
|
|
5c407365e3 | ||
|
|
7e251d81c2 | ||
|
|
92d1d52c59 | ||
|
|
ef436e4dce | ||
|
|
1a07e336bf | ||
|
|
169355f771 | ||
|
|
299c6a3d6f | ||
|
|
17698bfd2e | ||
|
|
377592cb62 | ||
|
|
015cebc046 | ||
|
|
0a5e5023a8 | ||
|
|
a9b8ad6181 | ||
|
|
7331683c01 | ||
|
|
cca6a66518 | ||
|
|
891462e5af | ||
|
|
95cd6fe206 | ||
|
|
63534fd9eb | ||
|
|
e836e3380e | ||
|
|
f693beab57 | ||
|
|
2d2df42a94 | ||
|
|
fb0a4fa457 | ||
|
|
be0003c108 | ||
|
|
eb1e24a5bf | ||
|
|
a3e98558d3 | ||
|
|
f2b682dd9c | ||
|
|
b826ef4f4d | ||
|
|
a2fdeb99e0 | ||
|
|
df8d28f5fe | ||
|
|
838c51cc92 | ||
|
|
315ded687c | ||
|
|
6855346269 | ||
|
|
c2d6f900d9 | ||
|
|
85c2d5f14e | ||
|
|
b3eb912cf3 | ||
|
|
81d9205369 | ||
|
|
152a335cee | ||
|
|
b84650c2a3 | ||
|
|
722bea2943 | ||
|
|
6c337b949d | ||
|
|
db97a35dc7 | ||
|
|
c2fda63b0d | ||
|
|
5da64e9e34 | ||
|
|
3f360aa883 | ||
|
|
a444045386 | ||
|
|
584a807ed6 | ||
|
|
72e5697804 | ||
|
|
93aff8a129 | ||
|
|
c3cfaab479 | ||
|
|
663e3d0811 | ||
|
|
2dc35ec0c1 | ||
|
|
a791f235e6 | ||
|
|
7df9cc1b47 | ||
|
|
4449344fad | ||
|
|
e1c9f50d26 | ||
|
|
1f029229dc | ||
|
|
a80dd28e35 | ||
|
|
16077fbdac | ||
|
|
1906bb5263 | ||
|
|
a8b907a33c | ||
|
|
f2a2e97004 | ||
|
|
a86923de94 | ||
|
|
4412f25c9f | ||
|
|
16bdaa11ce | ||
|
|
46afb4a9a4 |
@@ -23,8 +23,8 @@ flatpak build ${builddir} meson \
|
||||
-Dbuild-testsuite=false \
|
||||
-Dbuild-examples=false \
|
||||
-Dintrospection=disabled \
|
||||
-Ddemos=true \
|
||||
-Dprofile=devel \
|
||||
-Dbuild-demos=true \
|
||||
-Ddemo-profile=devel \
|
||||
_flatpak_build
|
||||
|
||||
flatpak build ${builddir} ninja -C _flatpak_build install
|
||||
|
||||
56
NEWS
56
NEWS
@@ -1,6 +1,62 @@
|
||||
Overview of Changes in 4.11.4, xx-xx-xxxx
|
||||
=========================================
|
||||
|
||||
* GtkFileChooser:
|
||||
- Default to sorting folders first
|
||||
- Fix a crash when visiting recent files
|
||||
|
||||
* GtkTextView:
|
||||
- Fix corner cases in word navigation
|
||||
|
||||
* GtkMenuButton:
|
||||
- Normalize label layout
|
||||
|
||||
* GtkDropDown:
|
||||
- Add support for sections
|
||||
|
||||
* GtkVideo:
|
||||
- Make the overlay icon clickable
|
||||
|
||||
* GtkWindow:
|
||||
- Clear the resize cursors to avoid artifacts
|
||||
|
||||
* Accessibility:
|
||||
- Improvements all over the place: GtkButton, GtkPasswordEntry,
|
||||
GtkFontChooserDialog, GtkColorChooserDialog, GtkShortcutsWindow,
|
||||
GtkMenuButton, GtkAboutDialog, GtkFileChooserDialog, GtkStackSidebar,
|
||||
GtkMediaControls, GtkColorDialogButton, GtkDropDown, GtkInfoBar,
|
||||
GtkNotebook, GtkPrintUnixDialog, GtkModelButton
|
||||
- Make name computation follow the ARIA spec more closely
|
||||
- Change many containers to use `generic` instead of `group`
|
||||
- Use `generic` as the default role
|
||||
- Use `application` instead of `window` for windows
|
||||
|
||||
* X11:
|
||||
- Fix regressions in GLX setup
|
||||
|
||||
* Windows:
|
||||
- Center newly created transient windows
|
||||
|
||||
* Vulkan:
|
||||
- Add antialising for gradients
|
||||
- Do less work on clipped away nodes
|
||||
- Redo image uploading
|
||||
- Support different image depths and formats
|
||||
|
||||
* Demos:
|
||||
- gtk4-demo: Improve window sizing
|
||||
- gtk4-demo: Improve focus behavior
|
||||
- gtk4-demo: Add many missing a11y properties
|
||||
`
|
||||
* Inspector:
|
||||
- Show more information in the a11y tab
|
||||
- Add an accessibility overlay with warnings and recommendations
|
||||
- Limit the width of the a11y tab
|
||||
|
||||
* Translation updates:
|
||||
Czech
|
||||
|
||||
|
||||
Overview of Changes in 4.11.3, 05-06-2023
|
||||
=========================================
|
||||
|
||||
|
||||
@@ -52,6 +52,10 @@ setup_listitem_cb (GtkListItemFactory *factory,
|
||||
|
||||
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
|
||||
image = gtk_image_new ();
|
||||
gtk_accessible_update_property (GTK_ACCESSIBLE (image),
|
||||
GTK_ACCESSIBLE_PROPERTY_LABEL,
|
||||
"App icon",
|
||||
-1);
|
||||
gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE);
|
||||
gtk_box_append (GTK_BOX (box), image);
|
||||
label = gtk_label_new ("");
|
||||
@@ -79,6 +83,7 @@ bind_listitem_cb (GtkListItemFactory *factory,
|
||||
|
||||
gtk_image_set_from_gicon (GTK_IMAGE (image), g_app_info_get_icon (app_info));
|
||||
gtk_label_set_label (GTK_LABEL (label), g_app_info_get_display_name (app_info));
|
||||
gtk_list_item_set_accessible_label (list_item, g_app_info_get_display_name (app_info));
|
||||
}
|
||||
|
||||
/* In more complex code, we would also need functions to unbind and teardown
|
||||
|
||||
@@ -431,6 +431,9 @@ setup_listitem_cb (GtkListItemFactory *factory,
|
||||
picture = gtk_picture_new ();
|
||||
gtk_expression_bind (expression, picture, "paintable", picture);
|
||||
gtk_box_append (GTK_BOX (box), picture);
|
||||
gtk_accessible_update_relation (GTK_ACCESSIBLE (picture),
|
||||
GTK_ACCESSIBLE_RELATION_LABELLED_BY, location_label, NULL,
|
||||
-1);
|
||||
|
||||
|
||||
/* And finally, everything comes together.
|
||||
@@ -487,6 +490,9 @@ do_listview_clocks (GtkWidget *do_widget)
|
||||
|
||||
model = GTK_SELECTION_MODEL (gtk_no_selection_new (create_clocks_model ()));
|
||||
gridview = gtk_grid_view_new (model, factory);
|
||||
gtk_accessible_update_property (GTK_ACCESSIBLE (gridview),
|
||||
GTK_ACCESSIBLE_PROPERTY_LABEL, "Clocks",
|
||||
-1);
|
||||
gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL);
|
||||
gtk_scrollable_set_vscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL);
|
||||
|
||||
|
||||
@@ -1572,6 +1572,9 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
<property name="valign">3</property>
|
||||
<child>
|
||||
<object class="GtkVolumeButton">
|
||||
<accessibility>
|
||||
<property name="label" translatable="1">Volume</property>
|
||||
</accessibility>
|
||||
<property name="orientation">1</property>
|
||||
<property name="valign">3</property>
|
||||
<property name="value">.5</property>
|
||||
@@ -1584,6 +1587,9 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScaleButton" id="mic-button">
|
||||
<accessibility>
|
||||
<property name="label" translatable="1">Microphone gain</property>
|
||||
</accessibility>
|
||||
<property name="has-tooltip">1</property>
|
||||
<property name="icons">microphone-sensitivity-muted-symbolic
|
||||
microphone-sensitivity-high-symbolic
|
||||
|
||||
@@ -211,6 +211,9 @@ A number of options affect behavior instead of logging:
|
||||
`portals`
|
||||
: Force the use of [portals](https://docs.flatpak.org/en/latest/portals.html)
|
||||
|
||||
`no-portals`
|
||||
: Disable use of [portals](https://docs.flatpak.org/en/latest/portals.html)
|
||||
|
||||
`gl-disable`
|
||||
: Disable OpenGL support
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ described by a set of *attributes*.
|
||||
Roles define the taxonomy and semantics of a UI control to any assistive
|
||||
technology application; for instance, a button will have a role of
|
||||
`GTK_ACCESSIBLE_ROLE_BUTTON`; an entry will have a role of
|
||||
`GTK_ACCESSIBLE_ROLE_TEXTBOX`; a toggle button will have a role of
|
||||
`GTK_ACCESSIBLE_ROLE_TEXTBOX`; a check button will have a role of
|
||||
`GTK_ACCESSIBLE_ROLE_CHECKBOX`; etc.
|
||||
|
||||
Each role is part of the widget's instance, and **cannot** be changed over
|
||||
@@ -46,6 +46,7 @@ Each role name is part of the #GtkAccessibleRole enumeration.
|
||||
|
||||
| Role name | Description | Related GTK widget |
|
||||
|-----------|-------------|--------------------|
|
||||
| `APPLICATION` | An application window | [class@Gtk.Window] |
|
||||
| `BUTTON` | A control that performs an action when pressed | [class@Gtk.Button], [class@Gtk.LinkButton], [class@Gtk.Expander] |
|
||||
| `CHECKBOX` | A control that has three possible value: `true`, `false`, or `undefined` | [class@Gtk.CheckButton] |
|
||||
| `COMBOBOX` | A control that can be expanded to show a list of possible values to select | [class@Gtk.ComboBox] |
|
||||
@@ -78,7 +79,6 @@ Each role name is part of the #GtkAccessibleRole enumeration.
|
||||
| `TAB_PANEL` | A page in a notebook or stack | [class@Gtk.Stack] |
|
||||
| `TEXT_BOX` | A type of input that allows free-form text as its value. | [class@Gtk.Entry], [class@Gtk.PasswordEntry], [class@Gtk.TextView] |
|
||||
| `TREE_GRID` | A treeview-like columned list | [class@Gtk.ColumnView] |
|
||||
| `WINDOW` | An application window | [class@Gtk.Window] |
|
||||
| `...` | … |
|
||||
|
||||
See the [WAI-ARIA](https://www.w3.org/WAI/PF/aria/appendices#quickref) list
|
||||
@@ -216,6 +216,16 @@ are accessible as part of the development process. The GTK Inspector shows
|
||||
the accessible attributes of each widget, and also provides an overlay that
|
||||
can highlight accessibility issues.
|
||||
|
||||
It is possible to set accessible attributes in UI files as well:
|
||||
```xml
|
||||
<object class="GtkButton" id="button1">
|
||||
<accessibility>
|
||||
<property name="label">Download</property>
|
||||
<relation name="labelled-by">label1</relation>
|
||||
/accessibility>
|
||||
</object>
|
||||
```
|
||||
|
||||
## Implementations
|
||||
|
||||
Each UI control implements the `GtkAccessible` interface to allow widget and
|
||||
@@ -257,6 +267,13 @@ turn automatically any widget into a `GtkButton`; but if your widget behaves
|
||||
like a button, using the %GTK_ACCESSIBLE_ROLE_BUTTON will allow any
|
||||
assistive technology to handle it like they would a `GtkButton`.
|
||||
|
||||
For widgets that act as containers of other widgets, you should use
|
||||
%GTK_ACCESSIBLE_ROLE_GROUP if the grouping of the children is semantic
|
||||
in nature; for instance, the children of a [class@Gtk.HeaderBar] are
|
||||
grouped together on the header of a window. For generic containers that
|
||||
only impose a layout on their children, you should use
|
||||
%GTK_ACCESSIBLE_ROLE_GENERIC instead.
|
||||
|
||||
### Attributes can both hide and enhance
|
||||
|
||||
Accessible attributes can be used to override the content of a UI element,
|
||||
@@ -365,3 +382,6 @@ To allow changing the value via accessible technologies, you can export
|
||||
actions. Since the accessibility interfaces only support actions
|
||||
without parameters, you should provide actions such as `increase-value`
|
||||
and `decrease-value`.
|
||||
|
||||
Since GTK 4.10, the best way to suppose changing the value is by implementing
|
||||
the [iface@Gtk.AccessibleRange] interface.
|
||||
|
||||
@@ -52,6 +52,7 @@ struct _GdkVulkanContextPrivate {
|
||||
GdkMemoryFormat gdk_format;
|
||||
} formats[4];
|
||||
GdkMemoryDepth current_format;
|
||||
GdkMemoryFormat offscreen_formats[4];
|
||||
|
||||
VkSwapchainKHR swapchain;
|
||||
VkSemaphore draw_semaphore;
|
||||
@@ -693,6 +694,11 @@ gdk_vulkan_context_real_init (GInitable *initable,
|
||||
if (!priv->vulkan_ref)
|
||||
return FALSE;
|
||||
|
||||
priv->offscreen_formats[GDK_MEMORY_U8] = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED;
|
||||
priv->offscreen_formats[GDK_MEMORY_U16] = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED;
|
||||
priv->offscreen_formats[GDK_MEMORY_FLOAT16] = GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED;
|
||||
priv->offscreen_formats[GDK_MEMORY_FLOAT32] = GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED;
|
||||
|
||||
if (surface == NULL)
|
||||
{
|
||||
for (i = 0; i < G_N_ELEMENTS (priv->formats); i++)
|
||||
@@ -748,6 +754,7 @@ gdk_vulkan_context_real_init (GInitable *initable,
|
||||
{
|
||||
priv->formats[GDK_MEMORY_U8].vk_format = formats[i];
|
||||
priv->formats[GDK_MEMORY_U8].gdk_format = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED;
|
||||
priv->offscreen_formats[GDK_MEMORY_U8] = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED;
|
||||
};
|
||||
break;
|
||||
|
||||
@@ -827,6 +834,15 @@ out_surface:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GdkMemoryFormat
|
||||
gdk_vulkan_context_get_offscreen_format (GdkVulkanContext *context,
|
||||
GdkMemoryDepth depth)
|
||||
{
|
||||
GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context);
|
||||
|
||||
return priv->offscreen_formats[depth];
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_vulkan_context_initable_init (GInitableIface *iface)
|
||||
{
|
||||
@@ -1168,6 +1184,7 @@ gdk_display_create_vulkan_device (GdkDisplay *display,
|
||||
.descriptorBindingPartiallyBound = VK_TRUE,
|
||||
.descriptorBindingVariableDescriptorCount = VK_TRUE,
|
||||
.descriptorBindingSampledImageUpdateAfterBind = VK_TRUE,
|
||||
.descriptorBindingStorageBufferUpdateAfterBind = VK_TRUE,
|
||||
}
|
||||
},
|
||||
NULL,
|
||||
|
||||
@@ -69,9 +69,12 @@ gdk_vulkan_handle_result (VkResult res,
|
||||
|
||||
#define GDK_VK_CHECK(func, ...) gdk_vulkan_handle_result (func (__VA_ARGS__), G_STRINGIFY (func))
|
||||
|
||||
gboolean gdk_display_ref_vulkan (GdkDisplay *display,
|
||||
GError **error);
|
||||
void gdk_display_unref_vulkan (GdkDisplay *display);
|
||||
gboolean gdk_display_ref_vulkan (GdkDisplay *display,
|
||||
GError **error);
|
||||
void gdk_display_unref_vulkan (GdkDisplay *display);
|
||||
|
||||
GdkMemoryFormat gdk_vulkan_context_get_offscreen_format (GdkVulkanContext *context,
|
||||
GdkMemoryDepth depth);
|
||||
|
||||
#else /* !GDK_RENDERING_VULKAN */
|
||||
|
||||
|
||||
@@ -78,8 +78,8 @@ gsk_vulkan_buffer_new_map (GdkVulkanContext *context,
|
||||
{
|
||||
return gsk_vulkan_buffer_new_internal (context,
|
||||
size,
|
||||
(mode & GSK_VULKAN_READ ? VK_BUFFER_USAGE_TRANSFER_SRC_BIT : 0) |
|
||||
(mode & GSK_VULKAN_WRITE ? VK_BUFFER_USAGE_TRANSFER_DST_BIT : 0));
|
||||
(mode & GSK_VULKAN_READ ? VK_BUFFER_USAGE_TRANSFER_DST_BIT : 0) |
|
||||
(mode & GSK_VULKAN_WRITE ? VK_BUFFER_USAGE_TRANSFER_SRC_BIT : 0));
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -488,24 +488,6 @@ gsk_memory_format_get_fallback (GdkMemoryFormat format)
|
||||
}
|
||||
}
|
||||
|
||||
GdkMemoryFormat
|
||||
gsk_render_node_get_preferred_vulkan_format (GskRenderNode *node)
|
||||
{
|
||||
switch (gsk_render_node_get_preferred_depth (node))
|
||||
{
|
||||
case GDK_MEMORY_U8:
|
||||
return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
|
||||
case GDK_MEMORY_U16:
|
||||
return GDK_MEMORY_R16G16B16A16_PREMULTIPLIED;
|
||||
case GDK_MEMORY_FLOAT16:
|
||||
return GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED;
|
||||
case GDK_MEMORY_FLOAT32:
|
||||
return GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED;
|
||||
default:
|
||||
g_return_val_if_reached (GDK_MEMORY_R8G8B8A8_PREMULTIPLIED);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gsk_vulkan_context_supports_format (GdkVulkanContext *context,
|
||||
VkFormat format)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gsk/gskrendernode.h>
|
||||
|
||||
#include "gskvulkanbufferprivate.h"
|
||||
#include "gskvulkancommandpoolprivate.h"
|
||||
@@ -22,8 +21,6 @@ void gsk_vulkan_uploader_free (GskVulk
|
||||
void gsk_vulkan_uploader_reset (GskVulkanUploader *self);
|
||||
void gsk_vulkan_uploader_upload (GskVulkanUploader *self);
|
||||
|
||||
GdkMemoryFormat gsk_render_node_get_preferred_vulkan_format (GskRenderNode *node);
|
||||
|
||||
GskVulkanImage * gsk_vulkan_image_new_for_swapchain (GdkVulkanContext *context,
|
||||
VkImage image,
|
||||
VkFormat format,
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
#define GDK_ARRAY_NO_MEMSET 1
|
||||
#include "gdk/gdkarrayimpl.c"
|
||||
|
||||
#define N_DESCRIPTOR_SETS 3
|
||||
|
||||
struct _GskVulkanRender
|
||||
{
|
||||
GskRenderer *renderer;
|
||||
@@ -52,7 +54,7 @@ struct _GskVulkanRender
|
||||
|
||||
GskVulkanCommandPool *command_pool;
|
||||
VkFence fence;
|
||||
VkDescriptorSetLayout descriptor_set_layout;
|
||||
VkDescriptorSetLayout descriptor_set_layouts[N_DESCRIPTOR_SETS];
|
||||
VkPipelineLayout pipeline_layout;
|
||||
GskVulkanUploader *uploader;
|
||||
|
||||
@@ -60,7 +62,7 @@ struct _GskVulkanRender
|
||||
GskDescriptorImageInfos descriptor_samplers;
|
||||
GskDescriptorBufferInfos descriptor_buffers;
|
||||
VkDescriptorPool descriptor_pool;
|
||||
VkDescriptorSet descriptor_set;
|
||||
VkDescriptorSet descriptor_sets[N_DESCRIPTOR_SETS];
|
||||
GskVulkanPipeline *pipelines[GSK_VULKAN_N_PIPELINES];
|
||||
|
||||
GskVulkanImage *target;
|
||||
@@ -148,9 +150,9 @@ gsk_vulkan_render_new (GskRenderer *renderer,
|
||||
&(VkDescriptorPoolCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
|
||||
.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT,
|
||||
.maxSets = 1,
|
||||
.poolSizeCount = 3,
|
||||
.pPoolSizes = (VkDescriptorPoolSize[3]) {
|
||||
.maxSets = N_DESCRIPTOR_SETS,
|
||||
.poolSizeCount = N_DESCRIPTOR_SETS,
|
||||
.pPoolSizes = (VkDescriptorPoolSize[N_DESCRIPTOR_SETS]) {
|
||||
{
|
||||
.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
|
||||
.descriptorCount = DESCRIPTOR_POOL_MAXITEMS
|
||||
@@ -171,7 +173,7 @@ gsk_vulkan_render_new (GskRenderer *renderer,
|
||||
GSK_VK_CHECK (vkCreateDescriptorSetLayout, device,
|
||||
&(VkDescriptorSetLayoutCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
|
||||
.bindingCount = 3,
|
||||
.bindingCount = 1,
|
||||
.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
|
||||
.pBindings = (VkDescriptorSetLayoutBinding[3]) {
|
||||
{
|
||||
@@ -179,30 +181,12 @@ gsk_vulkan_render_new (GskRenderer *renderer,
|
||||
.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
|
||||
.descriptorCount = DESCRIPTOR_POOL_MAXITEMS,
|
||||
.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT
|
||||
},
|
||||
{
|
||||
.binding = 1,
|
||||
.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER,
|
||||
.descriptorCount = DESCRIPTOR_POOL_MAXITEMS,
|
||||
.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT
|
||||
},
|
||||
{
|
||||
.binding = 2,
|
||||
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
|
||||
.descriptorCount = DESCRIPTOR_POOL_MAXITEMS,
|
||||
.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT
|
||||
},
|
||||
}
|
||||
},
|
||||
.pNext = &(VkDescriptorSetLayoutBindingFlagsCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO,
|
||||
.bindingCount = 3,
|
||||
.pBindingFlags = (VkDescriptorBindingFlags[3]) {
|
||||
VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT
|
||||
| VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT
|
||||
| VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
|
||||
VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT
|
||||
| VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT
|
||||
| VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
|
||||
.bindingCount = 1,
|
||||
.pBindingFlags = (VkDescriptorBindingFlags[1]) {
|
||||
VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT
|
||||
| VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT
|
||||
| VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
|
||||
@@ -210,15 +194,65 @@ gsk_vulkan_render_new (GskRenderer *renderer,
|
||||
}
|
||||
},
|
||||
NULL,
|
||||
&self->descriptor_set_layout);
|
||||
&self->descriptor_set_layouts[0]);
|
||||
|
||||
GSK_VK_CHECK (vkCreateDescriptorSetLayout, device,
|
||||
&(VkDescriptorSetLayoutCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
|
||||
.bindingCount = 1,
|
||||
.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
|
||||
.pBindings = (VkDescriptorSetLayoutBinding[1]) {
|
||||
{
|
||||
.binding = 0,
|
||||
.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER,
|
||||
.descriptorCount = DESCRIPTOR_POOL_MAXITEMS,
|
||||
.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT
|
||||
}
|
||||
},
|
||||
.pNext = &(VkDescriptorSetLayoutBindingFlagsCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO,
|
||||
.bindingCount = 1,
|
||||
.pBindingFlags = (VkDescriptorBindingFlags[1]) {
|
||||
VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT
|
||||
| VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT
|
||||
| VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
|
||||
},
|
||||
}
|
||||
},
|
||||
NULL,
|
||||
&self->descriptor_set_layouts[1]);
|
||||
|
||||
GSK_VK_CHECK (vkCreateDescriptorSetLayout, device,
|
||||
&(VkDescriptorSetLayoutCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
|
||||
.bindingCount = 1,
|
||||
.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
|
||||
.pBindings = (VkDescriptorSetLayoutBinding[1]) {
|
||||
{
|
||||
.binding = 0,
|
||||
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
|
||||
.descriptorCount = DESCRIPTOR_POOL_MAXITEMS,
|
||||
.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT
|
||||
},
|
||||
},
|
||||
.pNext = &(VkDescriptorSetLayoutBindingFlagsCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO,
|
||||
.bindingCount = 1,
|
||||
.pBindingFlags = (VkDescriptorBindingFlags[1]) {
|
||||
VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT
|
||||
| VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT
|
||||
| VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
|
||||
},
|
||||
}
|
||||
},
|
||||
NULL,
|
||||
&self->descriptor_set_layouts[2]);
|
||||
|
||||
GSK_VK_CHECK (vkCreatePipelineLayout, device,
|
||||
&(VkPipelineLayoutCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
|
||||
.setLayoutCount = 1,
|
||||
.pSetLayouts = (VkDescriptorSetLayout[1]) {
|
||||
self->descriptor_set_layout
|
||||
},
|
||||
.setLayoutCount = G_N_ELEMENTS (self->descriptor_set_layouts),
|
||||
.pSetLayouts = self->descriptor_set_layouts,
|
||||
.pushConstantRangeCount = gsk_vulkan_push_constants_get_range_count (),
|
||||
.pPushConstantRanges = gsk_vulkan_push_constants_get_ranges ()
|
||||
},
|
||||
@@ -403,10 +437,18 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self,
|
||||
return self->pipelines[type];
|
||||
}
|
||||
|
||||
VkDescriptorSet
|
||||
gsk_vulkan_render_get_descriptor_set (GskVulkanRender *self)
|
||||
void
|
||||
gsk_vulkan_render_bind_descriptor_sets (GskVulkanRender *self,
|
||||
VkCommandBuffer command_buffer)
|
||||
{
|
||||
return self->descriptor_set;
|
||||
vkCmdBindDescriptorSets (command_buffer,
|
||||
VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
self->pipeline_layout,
|
||||
0,
|
||||
3,
|
||||
self->descriptor_sets,
|
||||
0,
|
||||
NULL);
|
||||
}
|
||||
|
||||
gsize
|
||||
@@ -537,11 +579,6 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self)
|
||||
gsk_vulkan_render_pass_reserve_descriptor_sets (pass, self);
|
||||
}
|
||||
|
||||
if (gsk_descriptor_image_infos_get_size (&self->descriptor_samplers) == 0 &&
|
||||
gsk_descriptor_image_infos_get_size (&self->descriptor_images) == 0 &&
|
||||
gsk_descriptor_buffer_infos_get_size (&self->descriptor_buffers) == 0)
|
||||
return;
|
||||
|
||||
if (self->storage_buffer_memory)
|
||||
{
|
||||
gsk_vulkan_buffer_unmap (self->storage_buffer);
|
||||
@@ -553,26 +590,26 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self)
|
||||
&(VkDescriptorSetAllocateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
|
||||
.descriptorPool = self->descriptor_pool,
|
||||
.descriptorSetCount = 1,
|
||||
.pSetLayouts = &self->descriptor_set_layout,
|
||||
.descriptorSetCount = N_DESCRIPTOR_SETS,
|
||||
.pSetLayouts = self->descriptor_set_layouts,
|
||||
.pNext = &(VkDescriptorSetVariableDescriptorCountAllocateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO,
|
||||
.descriptorSetCount = 1,
|
||||
.pDescriptorCounts = (uint32_t[1]) {
|
||||
gsk_descriptor_image_infos_get_size (&self->descriptor_images)
|
||||
+ gsk_descriptor_image_infos_get_size (&self->descriptor_samplers)
|
||||
+ gsk_descriptor_buffer_infos_get_size (&self->descriptor_buffers)
|
||||
.descriptorSetCount = N_DESCRIPTOR_SETS,
|
||||
.pDescriptorCounts = (uint32_t[N_DESCRIPTOR_SETS]) {
|
||||
MAX (1, gsk_descriptor_image_infos_get_size (&self->descriptor_images)),
|
||||
MAX (1, gsk_descriptor_image_infos_get_size (&self->descriptor_samplers)),
|
||||
MAX (1, gsk_descriptor_buffer_infos_get_size (&self->descriptor_buffers))
|
||||
}
|
||||
}
|
||||
},
|
||||
&self->descriptor_set);
|
||||
self->descriptor_sets);
|
||||
|
||||
n_descriptor_sets = 0;
|
||||
if (gsk_descriptor_image_infos_get_size (&self->descriptor_images) > 0)
|
||||
{
|
||||
descriptor_sets[n_descriptor_sets++] = (VkWriteDescriptorSet) {
|
||||
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
.dstSet = self->descriptor_set,
|
||||
.dstSet = self->descriptor_sets[0],
|
||||
.dstBinding = 0,
|
||||
.dstArrayElement = 0,
|
||||
.descriptorCount = gsk_descriptor_image_infos_get_size (&self->descriptor_images),
|
||||
@@ -584,8 +621,8 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self)
|
||||
{
|
||||
descriptor_sets[n_descriptor_sets++] = (VkWriteDescriptorSet) {
|
||||
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
.dstSet = self->descriptor_set,
|
||||
.dstBinding = 1,
|
||||
.dstSet = self->descriptor_sets[1],
|
||||
.dstBinding = 0,
|
||||
.dstArrayElement = 0,
|
||||
.descriptorCount = gsk_descriptor_image_infos_get_size (&self->descriptor_samplers),
|
||||
.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER,
|
||||
@@ -596,8 +633,8 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self)
|
||||
{
|
||||
descriptor_sets[n_descriptor_sets++] = (VkWriteDescriptorSet) {
|
||||
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
.dstSet = self->descriptor_set,
|
||||
.dstBinding = 2,
|
||||
.dstSet = self->descriptor_sets[2],
|
||||
.dstBinding = 0,
|
||||
.dstArrayElement = 0,
|
||||
.descriptorCount = gsk_descriptor_buffer_infos_get_size (&self->descriptor_buffers),
|
||||
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
|
||||
@@ -741,9 +778,10 @@ gsk_vulkan_render_free (GskVulkanRender *self)
|
||||
gsk_descriptor_image_infos_clear (&self->descriptor_samplers);
|
||||
gsk_descriptor_buffer_infos_clear (&self->descriptor_buffers);
|
||||
|
||||
vkDestroyDescriptorSetLayout (device,
|
||||
self->descriptor_set_layout,
|
||||
NULL);
|
||||
for (i = 0; i < N_DESCRIPTOR_SETS; i++)
|
||||
vkDestroyDescriptorSetLayout (device,
|
||||
self->descriptor_set_layouts[i],
|
||||
NULL);
|
||||
|
||||
vkDestroyFence (device,
|
||||
self->fence,
|
||||
|
||||
@@ -14,8 +14,9 @@
|
||||
|
||||
#include "gdk/gdkdisplayprivate.h"
|
||||
#include "gdk/gdkdrawcontextprivate.h"
|
||||
#include "gdk/gdktextureprivate.h"
|
||||
#include "gdk/gdkprofilerprivate.h"
|
||||
#include "gdk/gdktextureprivate.h"
|
||||
#include "gdk/gdkvulkancontextprivate.h"
|
||||
|
||||
#include <graphene.h>
|
||||
|
||||
@@ -286,7 +287,8 @@ gsk_vulkan_renderer_render_texture (GskRenderer *renderer,
|
||||
ceil (viewport->size.width),
|
||||
ceil (viewport->size.height));
|
||||
image = gsk_vulkan_image_new_for_offscreen (self->vulkan,
|
||||
gsk_render_node_get_preferred_vulkan_format (root),
|
||||
gdk_vulkan_context_get_offscreen_format (self->vulkan,
|
||||
gsk_render_node_get_preferred_depth (root)),
|
||||
rounded_viewport.size.width,
|
||||
rounded_viewport.size.height);
|
||||
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
#include "gskvulkanrendererprivate.h"
|
||||
#include "gskprivate.h"
|
||||
|
||||
#include "gdk/gdkvulkancontextprivate.h"
|
||||
|
||||
#define ORTHO_NEAR_PLANE -10000
|
||||
#define ORTHO_FAR_PLANE 10000
|
||||
|
||||
@@ -1275,7 +1277,8 @@ gsk_vulkan_render_pass_render_offscreen (GdkVulkanContext *vulkan,
|
||||
ceil (scale_y * viewport->size.height));
|
||||
|
||||
result = gsk_vulkan_image_new_for_offscreen (vulkan,
|
||||
gsk_render_node_get_preferred_vulkan_format (node),
|
||||
gdk_vulkan_context_get_offscreen_format (vulkan,
|
||||
gsk_render_node_get_preferred_depth (node)),
|
||||
view.size.width, view.size.height);
|
||||
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
@@ -2436,7 +2439,6 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
|
||||
VkPipelineLayout pipeline_layout,
|
||||
VkCommandBuffer command_buffer)
|
||||
{
|
||||
VkDescriptorSet descriptor_set;
|
||||
cairo_rectangle_int_t rect;
|
||||
|
||||
vkCmdSetViewport (command_buffer,
|
||||
@@ -2469,16 +2471,7 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
|
||||
},
|
||||
VK_SUBPASS_CONTENTS_INLINE);
|
||||
|
||||
descriptor_set = gsk_vulkan_render_get_descriptor_set (render);
|
||||
if (descriptor_set)
|
||||
vkCmdBindDescriptorSets (command_buffer,
|
||||
VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
pipeline_layout,
|
||||
0,
|
||||
1,
|
||||
&descriptor_set,
|
||||
0,
|
||||
NULL);
|
||||
gsk_vulkan_render_bind_descriptor_sets (render, command_buffer);
|
||||
|
||||
gsk_vulkan_render_pass_draw_rect (self, render, pipeline_layout, command_buffer);
|
||||
|
||||
|
||||
@@ -93,7 +93,8 @@ guchar * gsk_vulkan_render_get_buffer_memory (GskVulk
|
||||
gsize size,
|
||||
gsize alignment,
|
||||
gsize *out_offset);
|
||||
VkDescriptorSet gsk_vulkan_render_get_descriptor_set (GskVulkanRender *self);
|
||||
void gsk_vulkan_render_bind_descriptor_sets (GskVulkanRender *self,
|
||||
VkCommandBuffer command_buffer);
|
||||
|
||||
void gsk_vulkan_render_draw (GskVulkanRender *self);
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
layout(set = 0, binding = 0) uniform texture2D textures[50000];
|
||||
layout(set = 0, binding = 1) uniform sampler samplers[50000];
|
||||
layout(set = 0, binding = 2) readonly buffer FloatBuffers {
|
||||
layout(set = 1, binding = 0) uniform sampler samplers[50000];
|
||||
layout(set = 2, binding = 0) readonly buffer FloatBuffers {
|
||||
float floats[];
|
||||
} buffers[50000];
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -3,11 +3,6 @@
|
||||
#include "common.vert.glsl"
|
||||
#include "rect.vert.glsl"
|
||||
|
||||
struct ColorStop {
|
||||
float offset;
|
||||
vec4 color;
|
||||
};
|
||||
|
||||
layout(location = 0) in vec4 inRect;
|
||||
layout(location = 1) in vec2 inStart;
|
||||
layout(location = 2) in vec2 inEnd;
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -50,7 +50,8 @@ translate_coordinates_to_widget (GtkWidget *widget,
|
||||
switch (coordtype)
|
||||
{
|
||||
case ATSPI_COORD_TYPE_SCREEN:
|
||||
g_warning ("Screen coordinates not supported, reported positions will be wrong");
|
||||
*xo = 0;
|
||||
*yo = 0;
|
||||
return;
|
||||
|
||||
case ATSPI_COORD_TYPE_WINDOW:
|
||||
@@ -86,7 +87,6 @@ translate_coordinates_from_widget (GtkWidget *widget,
|
||||
switch (coordtype)
|
||||
{
|
||||
case ATSPI_COORD_TYPE_SCREEN:
|
||||
g_warning ("Screen coordinates not supported, reported positions will be wrong");
|
||||
*xo = 0;
|
||||
*yo = 0;
|
||||
return;
|
||||
|
||||
@@ -144,7 +144,7 @@ collect_states (GtkAtSpiContext *self,
|
||||
set_atspi_state (&states, ATSPI_STATE_VISIBLE);
|
||||
set_atspi_state (&states, ATSPI_STATE_SHOWING);
|
||||
|
||||
if (ctx->accessible_role == GTK_ACCESSIBLE_ROLE_WINDOW)
|
||||
if (ctx->accessible_role == GTK_ACCESSIBLE_ROLE_APPLICATION)
|
||||
{
|
||||
if (gtk_accessible_get_platform_state (accessible, GTK_ACCESSIBLE_PLATFORM_STATE_ACTIVE))
|
||||
set_atspi_state (&states, ATSPI_STATE_ACTIVE);
|
||||
@@ -1170,7 +1170,7 @@ gtk_at_spi_context_platform_change (GtkATContext *ctx,
|
||||
/* Orca tracks the window:activate and window:deactivate events on top
|
||||
* levels to decide whether to track other AT-SPI events
|
||||
*/
|
||||
if (gtk_accessible_get_accessible_role (accessible) == GTK_ACCESSIBLE_ROLE_WINDOW)
|
||||
if (gtk_accessible_get_accessible_role (accessible) == GTK_ACCESSIBLE_ROLE_APPLICATION)
|
||||
{
|
||||
if (state)
|
||||
emit_window_event (self, "activate");
|
||||
|
||||
@@ -1003,13 +1003,13 @@ gtk_atspi_get_selection_vtable (GtkAccessible *accessible,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* {{{ GtkListView notification */
|
||||
|
||||
typedef struct {
|
||||
GtkAtspiSelectionCallback *changed;
|
||||
gpointer data;
|
||||
} SelectionChanged;
|
||||
|
||||
/* {{{ GtkListView notification */
|
||||
|
||||
typedef struct {
|
||||
GtkSelectionModel *model;
|
||||
GtkAtspiSelectionCallback *changed;
|
||||
@@ -1048,6 +1048,47 @@ model_changed (GtkListBase *list,
|
||||
update_model (data, gtk_list_base_get_model (list));
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
/* {{{ Stackswitcher notification */
|
||||
|
||||
typedef struct {
|
||||
GtkStack *stack;
|
||||
GtkAtspiSelectionCallback *changed;
|
||||
gpointer data;
|
||||
} StackSwitcherData;
|
||||
|
||||
static void
|
||||
update_stack (StackSwitcherData *data,
|
||||
GtkStack *stack)
|
||||
{
|
||||
if (data->stack)
|
||||
g_signal_handlers_disconnect_by_func (data->stack, data->changed, data->data);
|
||||
|
||||
g_set_object (&data->stack, stack);
|
||||
|
||||
if (data->stack)
|
||||
g_signal_connect_swapped (data->stack, "notify::visible-child", G_CALLBACK (data->changed), data->data);
|
||||
}
|
||||
|
||||
static void
|
||||
stack_switcher_data_free (gpointer user_data)
|
||||
{
|
||||
StackSwitcherData *data = user_data;
|
||||
update_stack (data, NULL);
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
static void
|
||||
stack_changed (GtkStackSwitcher *self,
|
||||
GParamSpec *pspec,
|
||||
gpointer unused)
|
||||
{
|
||||
StackSwitcherData *data;
|
||||
|
||||
data = (StackSwitcherData *) g_object_get_data (G_OBJECT (self), "accessible-selection-data");
|
||||
update_stack (data, gtk_stack_switcher_get_stack (self));
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
||||
void
|
||||
@@ -1059,7 +1100,7 @@ gtk_atspi_connect_selection_signals (GtkAccessible *accessible,
|
||||
{
|
||||
SelectionChanged *changed;
|
||||
|
||||
changed = g_new (SelectionChanged, 1);
|
||||
changed = g_new0 (SelectionChanged, 1);
|
||||
changed->changed = selection_changed;
|
||||
changed->data = data;
|
||||
|
||||
@@ -1071,7 +1112,7 @@ gtk_atspi_connect_selection_signals (GtkAccessible *accessible,
|
||||
{
|
||||
SelectionChanged *changed;
|
||||
|
||||
changed = g_new (SelectionChanged, 1);
|
||||
changed = g_new0 (SelectionChanged, 1);
|
||||
changed->changed = selection_changed;
|
||||
changed->data = data;
|
||||
|
||||
@@ -1083,7 +1124,7 @@ gtk_atspi_connect_selection_signals (GtkAccessible *accessible,
|
||||
{
|
||||
SelectionChanged *changed;
|
||||
|
||||
changed = g_new (SelectionChanged, 1);
|
||||
changed = g_new0 (SelectionChanged, 1);
|
||||
changed->changed = selection_changed;
|
||||
changed->data = data;
|
||||
|
||||
@@ -1093,22 +1134,23 @@ gtk_atspi_connect_selection_signals (GtkAccessible *accessible,
|
||||
}
|
||||
else if (GTK_IS_STACK_SWITCHER (accessible))
|
||||
{
|
||||
SelectionChanged *changed;
|
||||
StackSwitcherData *changed;
|
||||
|
||||
changed = g_new (SelectionChanged, 1);
|
||||
changed = g_new0 (StackSwitcherData, 1);
|
||||
changed->changed = selection_changed;
|
||||
changed->data = data;
|
||||
|
||||
g_object_set_data_full (G_OBJECT (accessible), "accessible-selection-data", changed, g_free);
|
||||
g_object_set_data_full (G_OBJECT (accessible), "accessible-selection-data", changed, stack_switcher_data_free);
|
||||
|
||||
g_signal_connect_swapped (accessible, "notify::visible-child", G_CALLBACK (selection_changed), data);
|
||||
g_signal_connect (accessible, "notify::stack", G_CALLBACK (stack_changed), NULL);
|
||||
stack_changed (GTK_STACK_SWITCHER (accessible), NULL, NULL);
|
||||
}
|
||||
else if (IS_NOTEBOOK_TAB_LIST (accessible, GTK_AT_CONTEXT (data)->accessible_role))
|
||||
{
|
||||
GtkWidget *notebook = gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (accessible)));
|
||||
SelectionChanged *changed;
|
||||
|
||||
changed = g_new (SelectionChanged, 1);
|
||||
changed = g_new0 (SelectionChanged, 1);
|
||||
changed->changed = selection_changed;
|
||||
changed->data = data;
|
||||
|
||||
@@ -1137,8 +1179,7 @@ gtk_atspi_disconnect_selection_signals (GtkAccessible *accessible)
|
||||
{
|
||||
if (GTK_IS_LIST_BOX (accessible) ||
|
||||
GTK_IS_FLOW_BOX (accessible) ||
|
||||
GTK_IS_COMBO_BOX (accessible) ||
|
||||
GTK_IS_STACK_SWITCHER (accessible))
|
||||
GTK_IS_COMBO_BOX (accessible))
|
||||
{
|
||||
SelectionChanged *changed;
|
||||
|
||||
@@ -1148,6 +1189,12 @@ gtk_atspi_disconnect_selection_signals (GtkAccessible *accessible)
|
||||
|
||||
g_signal_handlers_disconnect_by_func (accessible, changed->changed, changed->data);
|
||||
|
||||
g_object_set_data (G_OBJECT (accessible), "accessible-selection-data", NULL);
|
||||
}
|
||||
else if (GTK_IS_STACK_SWITCHER (accessible))
|
||||
{
|
||||
g_signal_handlers_disconnect_by_func (accessible, stack_changed, NULL);
|
||||
|
||||
g_object_set_data (G_OBJECT (accessible), "accessible-selection-data", NULL);
|
||||
}
|
||||
else if (IS_NOTEBOOK_TAB_LIST (accessible, gtk_accessible_get_accessible_role (accessible)))
|
||||
|
||||
@@ -45,6 +45,9 @@ gtk_accessible_role_to_atspi_role (GtkAccessibleRole role)
|
||||
case GTK_ACCESSIBLE_ROLE_ALERT_DIALOG:
|
||||
return ATSPI_ROLE_ALERT;
|
||||
|
||||
case GTK_ACCESSIBLE_ROLE_APPLICATION:
|
||||
return ATSPI_ROLE_FRAME;
|
||||
|
||||
case GTK_ACCESSIBLE_ROLE_BANNER:
|
||||
break;
|
||||
|
||||
@@ -85,7 +88,7 @@ gtk_accessible_role_to_atspi_role (GtkAccessibleRole role)
|
||||
return ATSPI_ROLE_FORM;
|
||||
|
||||
case GTK_ACCESSIBLE_ROLE_GENERIC:
|
||||
break;
|
||||
return ATSPI_ROLE_FILLER;
|
||||
|
||||
case GTK_ACCESSIBLE_ROLE_GRID:
|
||||
return ATSPI_ROLE_TABLE;
|
||||
@@ -169,7 +172,7 @@ gtk_accessible_role_to_atspi_role (GtkAccessibleRole role)
|
||||
return ATSPI_ROLE_OPTION_PANE;
|
||||
|
||||
case GTK_ACCESSIBLE_ROLE_PRESENTATION:
|
||||
return ATSPI_ROLE_FILLER;
|
||||
return ATSPI_ROLE_INVALID;
|
||||
|
||||
case GTK_ACCESSIBLE_ROLE_PROGRESS_BAR:
|
||||
return ATSPI_ROLE_PROGRESS_BAR;
|
||||
@@ -275,6 +278,7 @@ gtk_accessible_role_to_atspi_role (GtkAccessibleRole role)
|
||||
|
||||
case GTK_ACCESSIBLE_ROLE_TOGGLE_BUTTON:
|
||||
return ATSPI_ROLE_TOGGLE_BUTTON;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -197,9 +197,8 @@ struct _GtkAboutDialog
|
||||
|
||||
GtkLicense license_type;
|
||||
|
||||
guint hovering_over_link : 1;
|
||||
guint wrap_license : 1;
|
||||
guint in_child_changed : 1;
|
||||
bool hovering_over_link;
|
||||
bool wrap_license;
|
||||
};
|
||||
|
||||
struct _GtkAboutDialogClass
|
||||
@@ -724,8 +723,8 @@ gtk_about_dialog_init (GtkAboutDialog *about)
|
||||
about->documenters = NULL;
|
||||
about->artists = NULL;
|
||||
|
||||
about->hovering_over_link = FALSE;
|
||||
about->wrap_license = FALSE;
|
||||
about->hovering_over_link = false;
|
||||
about->wrap_license = false;
|
||||
|
||||
about->license_type = GTK_LICENSE_UNKNOWN;
|
||||
|
||||
@@ -1305,11 +1304,11 @@ gtk_about_dialog_set_wrap_license (GtkAboutDialog *about,
|
||||
{
|
||||
g_return_if_fail (GTK_IS_ABOUT_DIALOG (about));
|
||||
|
||||
wrap_license = wrap_license != FALSE;
|
||||
bool wrap = !!wrap_license;
|
||||
|
||||
if (about->wrap_license != wrap_license)
|
||||
if (about->wrap_license != wrap)
|
||||
{
|
||||
about->wrap_license = wrap_license;
|
||||
about->wrap_license = wrap;
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (about), props[PROP_WRAP_LICENSE]);
|
||||
}
|
||||
@@ -1780,7 +1779,7 @@ set_cursor_if_appropriate (GtkAboutDialog *about,
|
||||
{
|
||||
GSList *tags = NULL, *tagp = NULL;
|
||||
GtkTextIter iter;
|
||||
gboolean hovering_over_link = FALSE;
|
||||
bool hovering_over_link = false;
|
||||
|
||||
gtk_text_view_get_iter_at_location (text_view, &iter, x, y);
|
||||
|
||||
@@ -1792,7 +1791,7 @@ set_cursor_if_appropriate (GtkAboutDialog *about,
|
||||
|
||||
if (uri != NULL)
|
||||
{
|
||||
hovering_over_link = TRUE;
|
||||
hovering_over_link = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2273,7 +2272,7 @@ gtk_about_dialog_set_license_type (GtkAboutDialog *about,
|
||||
|
||||
g_free (about->license);
|
||||
about->license = g_string_free (str, FALSE);
|
||||
about->wrap_license = TRUE;
|
||||
about->wrap_license = true;
|
||||
|
||||
license_string = g_strdup_printf ("<span size=\"small\">%s</span>",
|
||||
about->license);
|
||||
|
||||
@@ -831,6 +831,7 @@ static const char *role_names[] = {
|
||||
[GTK_ACCESSIBLE_ROLE_WIDGET] = NC_("accessibility", "widget"),
|
||||
[GTK_ACCESSIBLE_ROLE_WINDOW] = NC_("accessibility", "window"),
|
||||
[GTK_ACCESSIBLE_ROLE_TOGGLE_BUTTON] = NC_("accessibility", "toggle button"),
|
||||
[GTK_ACCESSIBLE_ROLE_APPLICATION] = NC_("accessibility", "application"),
|
||||
};
|
||||
|
||||
/*< private >
|
||||
@@ -854,6 +855,113 @@ gtk_accessible_role_to_name (GtkAccessibleRole role,
|
||||
return role_names[role];
|
||||
}
|
||||
|
||||
static struct {
|
||||
GtkAccessibleRole superclass;
|
||||
GtkAccessibleRole role;
|
||||
} superclasses[] = {
|
||||
{ GTK_ACCESSIBLE_ROLE_COMMAND, GTK_ACCESSIBLE_ROLE_BUTTON },
|
||||
{ GTK_ACCESSIBLE_ROLE_COMMAND, GTK_ACCESSIBLE_ROLE_LINK },
|
||||
{ GTK_ACCESSIBLE_ROLE_COMMAND, GTK_ACCESSIBLE_ROLE_MENU_ITEM },
|
||||
{ GTK_ACCESSIBLE_ROLE_COMPOSITE, GTK_ACCESSIBLE_ROLE_GRID },
|
||||
{ GTK_ACCESSIBLE_ROLE_COMPOSITE, GTK_ACCESSIBLE_ROLE_SELECT },
|
||||
{ GTK_ACCESSIBLE_ROLE_COMPOSITE, GTK_ACCESSIBLE_ROLE_SPIN_BUTTON },
|
||||
{ GTK_ACCESSIBLE_ROLE_COMPOSITE, GTK_ACCESSIBLE_ROLE_TAB_LIST },
|
||||
{ GTK_ACCESSIBLE_ROLE_INPUT, GTK_ACCESSIBLE_ROLE_CHECKBOX },
|
||||
{ GTK_ACCESSIBLE_ROLE_INPUT, GTK_ACCESSIBLE_ROLE_COMBO_BOX },
|
||||
{ GTK_ACCESSIBLE_ROLE_INPUT, GTK_ACCESSIBLE_ROLE_OPTION },
|
||||
{ GTK_ACCESSIBLE_ROLE_INPUT, GTK_ACCESSIBLE_ROLE_RADIO },
|
||||
{ GTK_ACCESSIBLE_ROLE_INPUT, GTK_ACCESSIBLE_ROLE_SLIDER },
|
||||
{ GTK_ACCESSIBLE_ROLE_INPUT, GTK_ACCESSIBLE_ROLE_SPIN_BUTTON },
|
||||
{ GTK_ACCESSIBLE_ROLE_INPUT, GTK_ACCESSIBLE_ROLE_TEXT_BOX },
|
||||
{ GTK_ACCESSIBLE_ROLE_LANDMARK, GTK_ACCESSIBLE_ROLE_BANNER },
|
||||
{ GTK_ACCESSIBLE_ROLE_LANDMARK, GTK_ACCESSIBLE_ROLE_FORM },
|
||||
{ GTK_ACCESSIBLE_ROLE_LANDMARK, GTK_ACCESSIBLE_ROLE_MAIN },
|
||||
{ GTK_ACCESSIBLE_ROLE_LANDMARK, GTK_ACCESSIBLE_ROLE_NAVIGATION },
|
||||
{ GTK_ACCESSIBLE_ROLE_LANDMARK, GTK_ACCESSIBLE_ROLE_REGION },
|
||||
{ GTK_ACCESSIBLE_ROLE_LANDMARK, GTK_ACCESSIBLE_ROLE_SEARCH },
|
||||
{ GTK_ACCESSIBLE_ROLE_RANGE, GTK_ACCESSIBLE_ROLE_METER },
|
||||
{ GTK_ACCESSIBLE_ROLE_RANGE, GTK_ACCESSIBLE_ROLE_PROGRESS_BAR },
|
||||
{ GTK_ACCESSIBLE_ROLE_RANGE, GTK_ACCESSIBLE_ROLE_SCROLLBAR },
|
||||
{ GTK_ACCESSIBLE_ROLE_RANGE, GTK_ACCESSIBLE_ROLE_SLIDER },
|
||||
{ GTK_ACCESSIBLE_ROLE_RANGE, GTK_ACCESSIBLE_ROLE_SPIN_BUTTON },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_ALERT },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_CAPTION },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_CELL },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_GROUP },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_IMG },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_LANDMARK },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_LIST },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_LIST_ITEM },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_LOG },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_MARQUEE },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_MATH },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_NOTE },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_STATUS },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_TABLE },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_TAB_PANEL },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_TIME },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION, GTK_ACCESSIBLE_ROLE_TOOLTIP },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION_HEAD, GTK_ACCESSIBLE_ROLE_COLUMN_HEADER },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION_HEAD, GTK_ACCESSIBLE_ROLE_HEADING },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION_HEAD, GTK_ACCESSIBLE_ROLE_ROW_HEADER },
|
||||
{ GTK_ACCESSIBLE_ROLE_SECTION_HEAD, GTK_ACCESSIBLE_ROLE_TAB },
|
||||
{ GTK_ACCESSIBLE_ROLE_SELECT, GTK_ACCESSIBLE_ROLE_LIST_BOX },
|
||||
{ GTK_ACCESSIBLE_ROLE_SELECT, GTK_ACCESSIBLE_ROLE_MENU },
|
||||
{ GTK_ACCESSIBLE_ROLE_SELECT, GTK_ACCESSIBLE_ROLE_RADIO_GROUP },
|
||||
{ GTK_ACCESSIBLE_ROLE_SELECT, GTK_ACCESSIBLE_ROLE_TREE },
|
||||
{ GTK_ACCESSIBLE_ROLE_STRUCTURE, GTK_ACCESSIBLE_ROLE_APPLICATION },
|
||||
{ GTK_ACCESSIBLE_ROLE_STRUCTURE, GTK_ACCESSIBLE_ROLE_DOCUMENT },
|
||||
{ GTK_ACCESSIBLE_ROLE_STRUCTURE, GTK_ACCESSIBLE_ROLE_GENERIC },
|
||||
{ GTK_ACCESSIBLE_ROLE_STRUCTURE, GTK_ACCESSIBLE_ROLE_PRESENTATION },
|
||||
{ GTK_ACCESSIBLE_ROLE_STRUCTURE, GTK_ACCESSIBLE_ROLE_RANGE },
|
||||
{ GTK_ACCESSIBLE_ROLE_STRUCTURE, GTK_ACCESSIBLE_ROLE_ROW_GROUP },
|
||||
{ GTK_ACCESSIBLE_ROLE_STRUCTURE, GTK_ACCESSIBLE_ROLE_SECTION },
|
||||
{ GTK_ACCESSIBLE_ROLE_STRUCTURE, GTK_ACCESSIBLE_ROLE_SECTION_HEAD },
|
||||
{ GTK_ACCESSIBLE_ROLE_STRUCTURE, GTK_ACCESSIBLE_ROLE_SEPARATOR },
|
||||
{ GTK_ACCESSIBLE_ROLE_WIDGET, GTK_ACCESSIBLE_ROLE_COMMAND },
|
||||
{ GTK_ACCESSIBLE_ROLE_WIDGET, GTK_ACCESSIBLE_ROLE_COMPOSITE },
|
||||
{ GTK_ACCESSIBLE_ROLE_WIDGET, GTK_ACCESSIBLE_ROLE_GRID_CELL },
|
||||
{ GTK_ACCESSIBLE_ROLE_WIDGET, GTK_ACCESSIBLE_ROLE_INPUT },
|
||||
{ GTK_ACCESSIBLE_ROLE_WIDGET, GTK_ACCESSIBLE_ROLE_PROGRESS_BAR },
|
||||
{ GTK_ACCESSIBLE_ROLE_WIDGET, GTK_ACCESSIBLE_ROLE_ROW },
|
||||
{ GTK_ACCESSIBLE_ROLE_WIDGET, GTK_ACCESSIBLE_ROLE_SCROLLBAR },
|
||||
{ GTK_ACCESSIBLE_ROLE_WIDGET, GTK_ACCESSIBLE_ROLE_SEPARATOR },
|
||||
{ GTK_ACCESSIBLE_ROLE_WIDGET, GTK_ACCESSIBLE_ROLE_TAB },
|
||||
{ GTK_ACCESSIBLE_ROLE_WINDOW, GTK_ACCESSIBLE_ROLE_DIALOG },
|
||||
{ GTK_ACCESSIBLE_ROLE_CHECKBOX, GTK_ACCESSIBLE_ROLE_SWITCH },
|
||||
{ GTK_ACCESSIBLE_ROLE_GRID_CELL, GTK_ACCESSIBLE_ROLE_COLUMN_HEADER },
|
||||
{ GTK_ACCESSIBLE_ROLE_GRID_CELL, GTK_ACCESSIBLE_ROLE_ROW_HEADER },
|
||||
{ GTK_ACCESSIBLE_ROLE_MENU_ITEM, GTK_ACCESSIBLE_ROLE_MENU_ITEM_CHECKBOX },
|
||||
{ GTK_ACCESSIBLE_ROLE_MENU_ITEM_CHECKBOX, GTK_ACCESSIBLE_ROLE_MENU_ITEM_RADIO },
|
||||
{ GTK_ACCESSIBLE_ROLE_TREE, GTK_ACCESSIBLE_ROLE_TREE_GRID },
|
||||
{ GTK_ACCESSIBLE_ROLE_CELL, GTK_ACCESSIBLE_ROLE_COLUMN_HEADER },
|
||||
{ GTK_ACCESSIBLE_ROLE_CELL, GTK_ACCESSIBLE_ROLE_GRID_CELL },
|
||||
{ GTK_ACCESSIBLE_ROLE_CELL, GTK_ACCESSIBLE_ROLE_ROW_HEADER },
|
||||
{ GTK_ACCESSIBLE_ROLE_GROUP, GTK_ACCESSIBLE_ROLE_ROW },
|
||||
{ GTK_ACCESSIBLE_ROLE_GROUP, GTK_ACCESSIBLE_ROLE_SELECT },
|
||||
{ GTK_ACCESSIBLE_ROLE_GROUP, GTK_ACCESSIBLE_ROLE_TOOLBAR },
|
||||
{ GTK_ACCESSIBLE_ROLE_LIST, GTK_ACCESSIBLE_ROLE_FEED },
|
||||
{ GTK_ACCESSIBLE_ROLE_LIST_ITEM, GTK_ACCESSIBLE_ROLE_TREE_ITEM },
|
||||
{ GTK_ACCESSIBLE_ROLE_TABLE, GTK_ACCESSIBLE_ROLE_GRID },
|
||||
{ GTK_ACCESSIBLE_ROLE_ALERT, GTK_ACCESSIBLE_ROLE_ALERT_DIALOG },
|
||||
{ GTK_ACCESSIBLE_ROLE_STATUS, GTK_ACCESSIBLE_ROLE_TIMER },
|
||||
{ GTK_ACCESSIBLE_ROLE_DIALOG, GTK_ACCESSIBLE_ROLE_ALERT_DIALOG },
|
||||
};
|
||||
|
||||
gboolean
|
||||
gtk_accessible_role_is_subclass (GtkAccessibleRole role,
|
||||
GtkAccessibleRole superclass)
|
||||
{
|
||||
for (unsigned int i = 0; i < G_N_ELEMENTS (superclasses); i++)
|
||||
{
|
||||
if (superclasses[i].role == role &&
|
||||
superclasses[i].superclass == superclass)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*< private >
|
||||
* gtk_accessible_role_is_range_subclass:
|
||||
* @role: a `GtkAccessibleRole`
|
||||
@@ -866,19 +974,38 @@ gtk_accessible_role_to_name (GtkAccessibleRole role,
|
||||
gboolean
|
||||
gtk_accessible_role_is_range_subclass (GtkAccessibleRole role)
|
||||
{
|
||||
/* Same trick as in gtkatcontext.c */
|
||||
return gtk_accessible_role_is_subclass (role, GTK_ACCESSIBLE_ROLE_RANGE);
|
||||
}
|
||||
|
||||
/* < private >
|
||||
* gtk_accessible_role_is_abstract:
|
||||
* @role: a `GtkAccessibleRole`
|
||||
*
|
||||
* Checks if @role is considered abstract and should not be used
|
||||
* for concrete widgets.
|
||||
*
|
||||
* Returns: whether the role is abstract
|
||||
*/
|
||||
gboolean
|
||||
gtk_accessible_role_is_abstract (GtkAccessibleRole role)
|
||||
{
|
||||
switch ((int) role)
|
||||
{
|
||||
case GTK_ACCESSIBLE_ROLE_METER:
|
||||
case GTK_ACCESSIBLE_ROLE_PROGRESS_BAR:
|
||||
case GTK_ACCESSIBLE_ROLE_SCROLLBAR:
|
||||
case GTK_ACCESSIBLE_ROLE_SLIDER:
|
||||
case GTK_ACCESSIBLE_ROLE_SPIN_BUTTON:
|
||||
case GTK_ACCESSIBLE_ROLE_COMMAND:
|
||||
case GTK_ACCESSIBLE_ROLE_COMPOSITE:
|
||||
case GTK_ACCESSIBLE_ROLE_INPUT:
|
||||
case GTK_ACCESSIBLE_ROLE_LANDMARK:
|
||||
case GTK_ACCESSIBLE_ROLE_RANGE:
|
||||
case GTK_ACCESSIBLE_ROLE_SECTION:
|
||||
case GTK_ACCESSIBLE_ROLE_SECTION_HEAD:
|
||||
case GTK_ACCESSIBLE_ROLE_SELECT:
|
||||
case GTK_ACCESSIBLE_ROLE_STRUCTURE:
|
||||
case GTK_ACCESSIBLE_ROLE_WIDGET:
|
||||
case GTK_ACCESSIBLE_ROLE_WINDOW:
|
||||
return TRUE;
|
||||
default:
|
||||
break;
|
||||
return FALSE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*< private >
|
||||
|
||||
@@ -55,7 +55,41 @@ typedef enum {
|
||||
const char * gtk_accessible_role_to_name (GtkAccessibleRole role,
|
||||
const char *domain);
|
||||
|
||||
gboolean gtk_accessible_role_is_range_subclass (GtkAccessibleRole role);
|
||||
gboolean gtk_accessible_role_is_range_subclass (GtkAccessibleRole role);
|
||||
|
||||
gboolean gtk_accessible_role_is_subclass (GtkAccessibleRole role,
|
||||
GtkAccessibleRole superclass);
|
||||
|
||||
gboolean gtk_accessible_role_is_abstract (GtkAccessibleRole role);
|
||||
|
||||
/* < private >
|
||||
* GtkAccessibleNaming:
|
||||
* @GTK_ACCESSIBLE_NAME_ALLOWED:
|
||||
* The role allows an accessible name and description
|
||||
* @GTK_ACCESSIBLE_NAME_PROHIBITED:
|
||||
* The role does not allow an accessible name and descirption
|
||||
* @GTK_ACCESSIBLE_NAME_REQUIRED:
|
||||
* The role requires an accessible name and description
|
||||
* @GTK_ACCESSIBLE_NAME_RECOMMENDED:
|
||||
* It is recommended to set the label property or labelled-by relation
|
||||
* for this role
|
||||
* @GTK_ACCESSIBLE_NAME_NOT_RECOMMENDED:
|
||||
* It is recommended not to set the label property or labelled-by relation
|
||||
* for this role
|
||||
*
|
||||
* Information about naming requirements for accessible roles.
|
||||
*/
|
||||
typedef enum {
|
||||
GTK_ACCESSIBLE_NAME_ALLOWED,
|
||||
GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
GTK_ACCESSIBLE_NAME_RECOMMENDED,
|
||||
GTK_ACCESSIBLE_NAME_NOT_RECOMMENDED,
|
||||
} GtkAccessibleNaming;
|
||||
|
||||
gboolean gtk_accessible_role_supports_name_from_author (GtkAccessibleRole role);
|
||||
gboolean gtk_accessible_role_supports_name_from_content (GtkAccessibleRole role);
|
||||
GtkAccessibleNaming gtk_accessible_role_get_naming (GtkAccessibleRole role);
|
||||
|
||||
gboolean gtk_accessible_should_present (GtkAccessible *self);
|
||||
|
||||
|
||||
@@ -38,6 +38,13 @@
|
||||
* # CSS nodes
|
||||
*
|
||||
* `GtkAspectFrame` uses a CSS node with name `frame`.
|
||||
*
|
||||
* # Accessibility
|
||||
*
|
||||
* Until GTK 4.10, `GtkAspectFrame` used the `GTK_ACCESSIBLE_ROLE_GROUP` role.
|
||||
*
|
||||
* Starting from GTK 4.12, `GtkAspectFrame` uses the `GTK_ACCESSIBLE_ROLE_GENERIC` role.
|
||||
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
@@ -187,7 +194,7 @@ gtk_aspect_frame_class_init (GtkAspectFrameClass *class)
|
||||
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
|
||||
|
||||
gtk_widget_class_set_css_name (GTK_WIDGET_CLASS (class), I_("aspectframe"));
|
||||
gtk_widget_class_set_accessible_role (GTK_WIDGET_CLASS (class), GTK_ACCESSIBLE_ROLE_GROUP);
|
||||
gtk_widget_class_set_accessible_role (GTK_WIDGET_CLASS (class), GTK_ACCESSIBLE_ROLE_GENERIC);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
#include "gtkdropdown.h"
|
||||
#include "gtkcolordialogbutton.h"
|
||||
#include "gtkfontdialogbutton.h"
|
||||
#include "gtkscalebutton.h"
|
||||
#include "print/gtkprinteroptionwidgetprivate.h"
|
||||
|
||||
#if defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_WAYLAND)
|
||||
#include "a11y/gtkatspicontextprivate.h"
|
||||
@@ -120,10 +122,7 @@ gtk_at_context_set_property (GObject *gobject,
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_ACCESSIBLE_ROLE:
|
||||
if (!self->realized)
|
||||
self->accessible_role = g_value_get_enum (value);
|
||||
else
|
||||
g_critical ("The accessible role cannot be set on a realized AT context");
|
||||
gtk_at_context_set_accessible_role (self, g_value_get_enum (value));
|
||||
break;
|
||||
|
||||
case PROP_ACCESSIBLE:
|
||||
@@ -1009,180 +1008,148 @@ gtk_at_context_get_accessible_relation (GtkATContext *self,
|
||||
return gtk_accessible_attribute_set_get_value (self->relations, relation);
|
||||
}
|
||||
|
||||
/* See the WAI-ARIA § 4.3, "Accessible Name and Description Computation" */
|
||||
static void
|
||||
gtk_at_context_get_name_accumulate (GtkATContext *self,
|
||||
GPtrArray *names,
|
||||
gboolean recurse)
|
||||
{
|
||||
GtkAccessibleValue *value = NULL;
|
||||
/* See ARIA 5.2.8.4, 5.2.8.5 and 5.2.8.6 for the prohibited, from author
|
||||
* and from content parts, and the table in
|
||||
* https://www.w3.org/WAI/ARIA/apg/practices/names-and-descriptions/
|
||||
* for the recommended / not recommended parts. We've made a few changes
|
||||
* to the recommendations:
|
||||
* - We don't recommend against labelling listitems, sincd GtkListView
|
||||
* will put the focus on listitems sometimes.
|
||||
* - We don't recommend tab lists being labelled, since GtkNotebook does
|
||||
* not have a practical way of doing that.
|
||||
*/
|
||||
|
||||
if (gtk_accessible_attribute_set_contains (self->properties, GTK_ACCESSIBLE_PROPERTY_LABEL))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->properties, GTK_ACCESSIBLE_PROPERTY_LABEL);
|
||||
#define NAME_FROM_AUTHOR (1 << 6)
|
||||
#define NAME_FROM_CONTENT (1 << 7)
|
||||
|
||||
g_ptr_array_add (names, (char *) gtk_string_accessible_value_get (value));
|
||||
}
|
||||
|
||||
if (recurse && gtk_accessible_attribute_set_contains (self->relations, GTK_ACCESSIBLE_RELATION_LABELLED_BY))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->relations, GTK_ACCESSIBLE_RELATION_LABELLED_BY);
|
||||
|
||||
GList *list = gtk_reference_list_accessible_value_get (value);
|
||||
|
||||
for (GList *l = list; l != NULL; l = l->next)
|
||||
{
|
||||
GtkAccessible *rel = GTK_ACCESSIBLE (l->data);
|
||||
GtkATContext *rel_context = gtk_accessible_get_at_context (rel);
|
||||
|
||||
gtk_at_context_get_name_accumulate (rel_context, names, FALSE);
|
||||
|
||||
g_object_unref (rel_context);
|
||||
}
|
||||
}
|
||||
|
||||
GtkAccessibleRole role = gtk_at_context_get_accessible_role (self);
|
||||
|
||||
switch ((int) role)
|
||||
{
|
||||
case GTK_ACCESSIBLE_ROLE_RANGE:
|
||||
{
|
||||
int range_attrs[] = {
|
||||
GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT,
|
||||
GTK_ACCESSIBLE_PROPERTY_VALUE_NOW,
|
||||
};
|
||||
|
||||
value = NULL;
|
||||
for (int i = 0; i < G_N_ELEMENTS (range_attrs); i++)
|
||||
{
|
||||
if (gtk_accessible_attribute_set_contains (self->properties, range_attrs[i]))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->properties, range_attrs[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (value != NULL)
|
||||
g_ptr_array_add (names, (char *) gtk_string_accessible_value_get (value));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* If there is no label or labelled-by attribute, hidden elements
|
||||
* have no name
|
||||
*/
|
||||
if (gtk_accessible_attribute_set_contains (self->states, GTK_ACCESSIBLE_STATE_HIDDEN))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->states, GTK_ACCESSIBLE_STATE_HIDDEN);
|
||||
|
||||
if (gtk_boolean_accessible_value_get (value))
|
||||
return;
|
||||
}
|
||||
|
||||
if (names->len == 0)
|
||||
{
|
||||
if (GTK_IS_WIDGET (self->accessible))
|
||||
{
|
||||
const char *tooltip = gtk_widget_get_tooltip_text (GTK_WIDGET (self->accessible));
|
||||
if (tooltip)
|
||||
g_ptr_array_add (names, (char *) tooltip);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_at_context_get_description_accumulate (GtkATContext *self,
|
||||
GPtrArray *labels,
|
||||
gboolean recurse)
|
||||
{
|
||||
GtkAccessibleValue *value = NULL;
|
||||
|
||||
if (gtk_accessible_attribute_set_contains (self->properties, GTK_ACCESSIBLE_PROPERTY_DESCRIPTION))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->properties, GTK_ACCESSIBLE_PROPERTY_DESCRIPTION);
|
||||
|
||||
g_ptr_array_add (labels, (char *) gtk_string_accessible_value_get (value));
|
||||
}
|
||||
|
||||
if (recurse && gtk_accessible_attribute_set_contains (self->relations, GTK_ACCESSIBLE_RELATION_DESCRIBED_BY))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->relations, GTK_ACCESSIBLE_RELATION_DESCRIBED_BY);
|
||||
|
||||
GList *list = gtk_reference_list_accessible_value_get (value);
|
||||
|
||||
for (GList *l = list; l != NULL; l = l->next)
|
||||
{
|
||||
GtkAccessible *rel = GTK_ACCESSIBLE (l->data);
|
||||
GtkATContext *rel_context = gtk_accessible_get_at_context (rel);
|
||||
|
||||
gtk_at_context_get_description_accumulate (rel_context, labels, FALSE);
|
||||
|
||||
g_object_unref (rel_context);
|
||||
}
|
||||
}
|
||||
|
||||
GtkAccessibleRole role = gtk_at_context_get_accessible_role (self);
|
||||
|
||||
switch ((int) role)
|
||||
{
|
||||
case GTK_ACCESSIBLE_ROLE_RANGE:
|
||||
{
|
||||
int range_attrs[] = {
|
||||
GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT,
|
||||
GTK_ACCESSIBLE_PROPERTY_VALUE_NOW,
|
||||
};
|
||||
|
||||
value = NULL;
|
||||
for (int i = 0; i < G_N_ELEMENTS (range_attrs); i++)
|
||||
{
|
||||
if (gtk_accessible_attribute_set_contains (self->properties, range_attrs[i]))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->properties, range_attrs[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (value != NULL)
|
||||
g_ptr_array_add (labels, (char *) gtk_string_accessible_value_get (value));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* If there is no description or described-by attribute, hidden elements
|
||||
* have no description
|
||||
*/
|
||||
if (gtk_accessible_attribute_set_contains (self->states, GTK_ACCESSIBLE_STATE_HIDDEN))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->states, GTK_ACCESSIBLE_STATE_HIDDEN);
|
||||
|
||||
if (gtk_boolean_accessible_value_get (value))
|
||||
return;
|
||||
}
|
||||
|
||||
if (labels->len == 0)
|
||||
{
|
||||
if (GTK_IS_WIDGET (self->accessible))
|
||||
{
|
||||
const char *tooltip = gtk_widget_get_tooltip_text (GTK_WIDGET (self->accessible));
|
||||
if (tooltip)
|
||||
g_ptr_array_add (labels, (char *) tooltip);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static GtkAccessibleRole name_forbidden[] = {
|
||||
GTK_ACCESSIBLE_ROLE_CAPTION,
|
||||
GTK_ACCESSIBLE_ROLE_GENERIC,
|
||||
GTK_ACCESSIBLE_ROLE_PRESENTATION,
|
||||
GTK_ACCESSIBLE_ROLE_NONE,
|
||||
static guint8 naming[] = {
|
||||
[GTK_ACCESSIBLE_ROLE_ALERT] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_ALERT_DIALOG] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_BANNER] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_BUTTON] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_CAPTION] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_CELL] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT,
|
||||
[GTK_ACCESSIBLE_ROLE_CHECKBOX] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_COLUMN_HEADER] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_COMBO_BOX] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_COMMAND] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_COMPOSITE] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_DIALOG] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_DOCUMENT] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_FEED] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_RECOMMENDED,
|
||||
[GTK_ACCESSIBLE_ROLE_FORM] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_GENERIC] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_GRID] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_GRID_CELL] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT,
|
||||
[GTK_ACCESSIBLE_ROLE_GROUP] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_HEADING] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_IMG] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_INPUT] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_LABEL] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT,
|
||||
[GTK_ACCESSIBLE_ROLE_LANDMARK] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_LEGEND] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_LINK] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_LIST] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_LIST_BOX] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_LIST_ITEM] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_LOG] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_MAIN] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_MARQUEE] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_MATH] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_RECOMMENDED,
|
||||
[GTK_ACCESSIBLE_ROLE_METER] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_MENU] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_RECOMMENDED,
|
||||
[GTK_ACCESSIBLE_ROLE_MENU_BAR] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_RECOMMENDED,
|
||||
[GTK_ACCESSIBLE_ROLE_MENU_ITEM] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_MENU_ITEM_CHECKBOX] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_MENU_ITEM_RADIO] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_NAVIGATION] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_RECOMMENDED,
|
||||
[GTK_ACCESSIBLE_ROLE_NONE] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_NOTE] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_OPTION] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_PRESENTATION] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_PROGRESS_BAR] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_RADIO] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_RADIO_GROUP] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_RANGE] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_REGION] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_ROW] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT,
|
||||
[GTK_ACCESSIBLE_ROLE_ROW_GROUP] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_NOT_RECOMMENDED,
|
||||
[GTK_ACCESSIBLE_ROLE_ROW_HEADER] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_SCROLLBAR] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_SEARCH] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_RECOMMENDED,
|
||||
[GTK_ACCESSIBLE_ROLE_SEARCH_BOX] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_SECTION] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_SECTION_HEAD] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_SELECT] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_SEPARATOR] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_SLIDER] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_SPIN_BUTTON] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_STATUS] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_STRUCTURE] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_SWITCH] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_TAB] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_TABLE] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_TAB_LIST] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_TAB_PANEL] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_TEXT_BOX] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_TIME] = GTK_ACCESSIBLE_NAME_PROHIBITED,
|
||||
[GTK_ACCESSIBLE_ROLE_TIMER] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_TOOLBAR] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_RECOMMENDED,
|
||||
[GTK_ACCESSIBLE_ROLE_TOOLTIP] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT,
|
||||
[GTK_ACCESSIBLE_ROLE_TREE] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_TREE_GRID] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_TREE_ITEM] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_WIDGET] = NAME_FROM_AUTHOR|NAME_FROM_CONTENT,
|
||||
[GTK_ACCESSIBLE_ROLE_WINDOW] = NAME_FROM_AUTHOR,
|
||||
[GTK_ACCESSIBLE_ROLE_TOGGLE_BUTTON] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
[GTK_ACCESSIBLE_ROLE_APPLICATION] = NAME_FROM_AUTHOR|GTK_ACCESSIBLE_NAME_REQUIRED,
|
||||
};
|
||||
|
||||
/* < private >
|
||||
* gtk_accessible_role_supports_name_from_author:
|
||||
* @role: a `GtkAccessibleRole`
|
||||
*
|
||||
* Returns whether this role supports setting the label and description
|
||||
* properties or the labelled-by and described-by relations.
|
||||
*
|
||||
* Returns: %TRUE if the role allows labelling
|
||||
*/
|
||||
gboolean
|
||||
gtk_accessible_role_supports_name_from_author (GtkAccessibleRole role)
|
||||
{
|
||||
return (naming[role] & NAME_FROM_AUTHOR) != 0;
|
||||
}
|
||||
|
||||
/* < private >
|
||||
* gtk_accessible_role_supports_name_from_content:
|
||||
* @role: a `GtkAccessibleRole`
|
||||
*
|
||||
* Returns whether this role will use content of child widgets such
|
||||
* as labels for its accessible name and description if no explicit
|
||||
* labels are provided.
|
||||
*
|
||||
* Returns: %TRUE if the role content naming
|
||||
*/
|
||||
gboolean
|
||||
gtk_accessible_role_supports_name_from_content (GtkAccessibleRole role)
|
||||
{
|
||||
return (naming[role] & NAME_FROM_CONTENT) != 0;
|
||||
}
|
||||
|
||||
/* < private >
|
||||
* gtk_accessible_role_get_nameing:
|
||||
* @role: a `GtkAccessibleRole`
|
||||
*
|
||||
* Returns naming information for this role.
|
||||
*
|
||||
* Returns: information about naming requirements for the role
|
||||
*/
|
||||
GtkAccessibleNaming
|
||||
gtk_accessible_role_get_naming (GtkAccessibleRole role)
|
||||
{
|
||||
return (GtkAccessibleNaming) (naming[role] & ~(NAME_FROM_AUTHOR|NAME_FROM_CONTENT));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_nested_button (GtkATContext *self)
|
||||
{
|
||||
@@ -1200,7 +1167,18 @@ is_nested_button (GtkATContext *self)
|
||||
if ((GTK_IS_TOGGLE_BUTTON (widget) && GTK_IS_DROP_DOWN (parent)) ||
|
||||
(GTK_IS_TOGGLE_BUTTON (widget) && GTK_IS_MENU_BUTTON (parent)) ||
|
||||
(GTK_IS_BUTTON (widget) && GTK_IS_COLOR_DIALOG_BUTTON (parent)) ||
|
||||
(GTK_IS_BUTTON (widget) && GTK_IS_FONT_DIALOG_BUTTON (parent)))
|
||||
(GTK_IS_BUTTON (widget) && GTK_IS_FONT_DIALOG_BUTTON (parent)) ||
|
||||
(GTK_IS_BUTTON (widget) && GTK_IS_SCALE_BUTTON (parent))
|
||||
#ifdef G_OS_UNIX
|
||||
|| (GTK_IS_PRINTER_OPTION_WIDGET (parent) &&
|
||||
(GTK_IS_CHECK_BUTTON (widget) ||
|
||||
GTK_IS_DROP_DOWN (widget) ||
|
||||
GTK_IS_ENTRY (widget) ||
|
||||
GTK_IS_IMAGE (widget) ||
|
||||
GTK_IS_LABEL (widget) ||
|
||||
GTK_IS_BUTTON (widget)))
|
||||
#endif
|
||||
)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
@@ -1223,6 +1201,219 @@ get_parent_context (GtkATContext *self)
|
||||
return g_object_ref (self);
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
not_just_space (const char *text)
|
||||
{
|
||||
for (const char *p = text; *p; p = g_utf8_next_char (p))
|
||||
{
|
||||
if (!g_unichar_isspace (g_utf8_get_char (p)))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static inline void
|
||||
append_with_space (GString *str,
|
||||
const char *text)
|
||||
{
|
||||
if (str->len > 0)
|
||||
g_string_append (str, " ");
|
||||
g_string_append (str, text);
|
||||
}
|
||||
|
||||
/* See the WAI-ARIA § 4.3, "Accessible Name and Description Computation",
|
||||
* and https://www.w3.org/TR/accname-1.2/
|
||||
*/
|
||||
|
||||
static void
|
||||
gtk_at_context_get_text_accumulate (GtkATContext *self,
|
||||
GPtrArray *nodes,
|
||||
GString *res,
|
||||
GtkAccessibleProperty property,
|
||||
GtkAccessibleRelation relation,
|
||||
gboolean is_ref,
|
||||
gboolean is_child)
|
||||
{
|
||||
GtkAccessibleValue *value = NULL;
|
||||
|
||||
/* Step 2.A */
|
||||
if (!is_ref)
|
||||
{
|
||||
if (gtk_accessible_attribute_set_contains (self->states, GTK_ACCESSIBLE_STATE_HIDDEN))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->states, GTK_ACCESSIBLE_STATE_HIDDEN);
|
||||
|
||||
if (gtk_boolean_accessible_value_get (value))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (gtk_accessible_role_supports_name_from_author (self->accessible_role))
|
||||
{
|
||||
/* Step 2.B */
|
||||
if (!is_ref && gtk_accessible_attribute_set_contains (self->relations, relation))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->relations, relation);
|
||||
|
||||
GList *list = gtk_reference_list_accessible_value_get (value);
|
||||
|
||||
for (GList *l = list; l != NULL; l = l->next)
|
||||
{
|
||||
GtkAccessible *rel = GTK_ACCESSIBLE (l->data);
|
||||
if (!g_ptr_array_find (nodes, rel, NULL))
|
||||
{
|
||||
GtkATContext *rel_context = gtk_accessible_get_at_context (rel);
|
||||
|
||||
g_ptr_array_add (nodes, rel);
|
||||
gtk_at_context_get_text_accumulate (rel_context, nodes, res, property, relation, TRUE, FALSE);
|
||||
|
||||
g_object_unref (rel_context);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Step 2.C */
|
||||
if (gtk_accessible_attribute_set_contains (self->properties, property))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->properties, property);
|
||||
|
||||
char *str = (char *) gtk_string_accessible_value_get (value);
|
||||
if (str[0] != '\0')
|
||||
{
|
||||
append_with_space (res, gtk_string_accessible_value_get (value));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Step 2.E */
|
||||
if (self->accessible_role == GTK_ACCESSIBLE_ROLE_TEXT_BOX)
|
||||
{
|
||||
if (GTK_IS_EDITABLE (self->accessible))
|
||||
{
|
||||
const char *text = gtk_editable_get_text (GTK_EDITABLE (self->accessible));
|
||||
if (text && not_just_space (text))
|
||||
append_with_space (res, text);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (gtk_accessible_role_is_range_subclass (self->accessible_role))
|
||||
{
|
||||
if (gtk_accessible_attribute_set_contains (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT);
|
||||
append_with_space (res, gtk_string_accessible_value_get (value));
|
||||
}
|
||||
else if (gtk_accessible_attribute_set_contains (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_NOW))
|
||||
{
|
||||
value = gtk_accessible_attribute_set_get_value (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_NOW);
|
||||
if (res->len > 0)
|
||||
g_string_append (res, " ");
|
||||
g_string_append_printf (res, "%g", gtk_number_accessible_value_get (value));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Step 2.F */
|
||||
if (gtk_accessible_role_supports_name_from_content (self->accessible_role) || is_ref || is_child)
|
||||
{
|
||||
if (GTK_IS_WIDGET (self->accessible))
|
||||
{
|
||||
GString *s = g_string_new ("");
|
||||
|
||||
for (GtkWidget *child = gtk_widget_get_first_child (GTK_WIDGET (self->accessible));
|
||||
child != NULL;
|
||||
child = gtk_widget_get_next_sibling (child))
|
||||
{
|
||||
GtkAccessible *rel = GTK_ACCESSIBLE (child);
|
||||
GtkATContext *rel_context = gtk_accessible_get_at_context (rel);
|
||||
|
||||
gtk_at_context_get_text_accumulate (rel_context, nodes, s, property, relation, FALSE, TRUE);
|
||||
}
|
||||
|
||||
if (s->len > 0)
|
||||
{
|
||||
append_with_space (res, s->str);
|
||||
g_string_free (s, TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
g_string_free (s, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
/* Step 2.G */
|
||||
if (GTK_IS_LABEL (self->accessible))
|
||||
{
|
||||
const char *text = gtk_label_get_text (GTK_LABEL (self->accessible));
|
||||
if (text && not_just_space (text))
|
||||
append_with_space (res, text);
|
||||
return;
|
||||
}
|
||||
else if (GTK_IS_INSCRIPTION (self->accessible))
|
||||
{
|
||||
const char *text = gtk_inscription_get_text (GTK_INSCRIPTION (self->accessible));
|
||||
if (text && not_just_space (text))
|
||||
append_with_space (res, text);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Step 2.I */
|
||||
if (GTK_IS_WIDGET (self->accessible))
|
||||
{
|
||||
const char *text = gtk_widget_get_tooltip_text (GTK_WIDGET (self->accessible));
|
||||
if (text && not_just_space (text))
|
||||
append_with_space (res, text);
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
gtk_at_context_get_text (GtkATContext *self,
|
||||
GtkAccessibleProperty property,
|
||||
GtkAccessibleRelation relation)
|
||||
{
|
||||
GtkATContext *parent = NULL;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_AT_CONTEXT (self), NULL);
|
||||
|
||||
/* Step 1 */
|
||||
if (gtk_accessible_role_get_naming (self->accessible_role) == GTK_ACCESSIBLE_NAME_PROHIBITED)
|
||||
return g_strdup ("");
|
||||
|
||||
/* We special case this here since it is a common pattern:
|
||||
* We have a 'wrapper' object, like a GtkDropdown which
|
||||
* contains a toggle button. The dropdown appears in the
|
||||
* ui file and carries all the a11y attributes, but the
|
||||
* focus ends up on the toggle button.
|
||||
*/
|
||||
if (is_nested_button (self))
|
||||
{
|
||||
parent = get_parent_context (self);
|
||||
self = parent;
|
||||
if (is_nested_button (self))
|
||||
{
|
||||
parent = get_parent_context (parent);
|
||||
g_object_unref (self);
|
||||
self = parent;
|
||||
}
|
||||
}
|
||||
|
||||
GPtrArray *nodes = g_ptr_array_new ();
|
||||
GString *res = g_string_new ("");
|
||||
|
||||
/* Step 2 */
|
||||
gtk_at_context_get_text_accumulate (self, nodes, res, property, relation, FALSE, FALSE);
|
||||
|
||||
g_ptr_array_unref (nodes);
|
||||
|
||||
g_clear_object (&parent);
|
||||
|
||||
return g_string_free (res, FALSE);
|
||||
}
|
||||
|
||||
/*< private >
|
||||
* gtk_at_context_get_name:
|
||||
@@ -1237,53 +1428,7 @@ get_parent_context (GtkATContext *self)
|
||||
char *
|
||||
gtk_at_context_get_name (GtkATContext *self)
|
||||
{
|
||||
GtkATContext *parent = NULL;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_AT_CONTEXT (self), NULL);
|
||||
|
||||
for (unsigned int i = 0; i < G_N_ELEMENTS (name_forbidden); i++)
|
||||
{
|
||||
if (self->accessible_role == name_forbidden[i])
|
||||
return g_strdup ("");
|
||||
}
|
||||
|
||||
/* We special case this here since it is a common pattern:
|
||||
* We have a 'wrapper' object, like a GtkDropdown which
|
||||
* contains a toggle button. The dropdown appears in the
|
||||
* ui file and carries all the a11y attributes, but the
|
||||
* focus ends up on the toggle button.
|
||||
*/
|
||||
if (is_nested_button (self))
|
||||
{
|
||||
parent = get_parent_context (self);
|
||||
self = parent;
|
||||
}
|
||||
|
||||
GPtrArray *names = g_ptr_array_new ();
|
||||
|
||||
gtk_at_context_get_name_accumulate (self, names, TRUE);
|
||||
|
||||
if (names->len == 0)
|
||||
{
|
||||
g_ptr_array_unref (names);
|
||||
g_clear_object (&parent);
|
||||
return g_strdup ("");
|
||||
}
|
||||
|
||||
GString *res = g_string_new ("");
|
||||
g_string_append (res, g_ptr_array_index (names, 0));
|
||||
|
||||
for (guint i = 1; i < names->len; i++)
|
||||
{
|
||||
g_string_append (res, " ");
|
||||
g_string_append (res, g_ptr_array_index (names, i));
|
||||
}
|
||||
|
||||
g_ptr_array_unref (names);
|
||||
|
||||
g_clear_object (&parent);
|
||||
|
||||
return g_string_free (res, FALSE);
|
||||
return gtk_at_context_get_text (self, GTK_ACCESSIBLE_PROPERTY_LABEL, GTK_ACCESSIBLE_RELATION_LABELLED_BY);
|
||||
}
|
||||
|
||||
/*< private >
|
||||
@@ -1299,52 +1444,7 @@ gtk_at_context_get_name (GtkATContext *self)
|
||||
char *
|
||||
gtk_at_context_get_description (GtkATContext *self)
|
||||
{
|
||||
GtkATContext *parent = NULL;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_AT_CONTEXT (self), NULL);
|
||||
|
||||
for (unsigned int i = 0; i < G_N_ELEMENTS (name_forbidden); i++)
|
||||
{
|
||||
if (self->accessible_role == name_forbidden[i])
|
||||
return g_strdup ("");
|
||||
}
|
||||
|
||||
/* We special case this here since it is a common pattern:
|
||||
* We have a 'wrapper' object, like a GtkDropdown which
|
||||
* contains a toggle button. The dropdown appears in the
|
||||
* ui file and carries all the a11y attributes, but the
|
||||
* focus ends up on the toggle button.
|
||||
*/
|
||||
if (is_nested_button (self))
|
||||
{
|
||||
parent = get_parent_context (self);
|
||||
self = parent;
|
||||
}
|
||||
|
||||
GPtrArray *names = g_ptr_array_new ();
|
||||
|
||||
gtk_at_context_get_description_accumulate (self, names, TRUE);
|
||||
|
||||
if (names->len == 0)
|
||||
{
|
||||
g_ptr_array_unref (names);
|
||||
g_clear_object (&parent);
|
||||
return g_strdup ("");
|
||||
}
|
||||
|
||||
GString *res = g_string_new ("");
|
||||
g_string_append (res, g_ptr_array_index (names, 0));
|
||||
|
||||
for (guint i = 1; i < names->len; i++)
|
||||
{
|
||||
g_string_append (res, " ");
|
||||
g_string_append (res, g_ptr_array_index (names, i));
|
||||
}
|
||||
|
||||
g_ptr_array_unref (names);
|
||||
|
||||
g_clear_object (&parent);
|
||||
return g_string_free (res, FALSE);
|
||||
return gtk_at_context_get_text (self, GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, GTK_ACCESSIBLE_RELATION_DESCRIBED_BY);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
20
gtk/gtkbox.c
20
gtk/gtkbox.c
@@ -56,7 +56,9 @@
|
||||
*
|
||||
* # Accessibility
|
||||
*
|
||||
* `GtkBox` uses the %GTK_ACCESSIBLE_ROLE_GROUP role.
|
||||
* Until GTK 4.10, `GtkBox` used the `GTK_ACCESSIBLE_ROLE_GROUP` role.
|
||||
*
|
||||
* Starting from GTK 4.12, `GtkBox` uses the `GTK_ACCESSIBLE_ROLE_GENERIC` role.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
@@ -84,10 +86,12 @@ enum {
|
||||
|
||||
typedef struct
|
||||
{
|
||||
gint16 spacing;
|
||||
gint16 spacing;
|
||||
|
||||
guint homogeneous : 1;
|
||||
guint baseline_pos : 2;
|
||||
bool homogeneous;
|
||||
|
||||
/* GtkBaselinePosition */
|
||||
guint baseline_pos : 2;
|
||||
} GtkBoxPrivate;
|
||||
|
||||
static GParamSpec *props[LAST_PROP] = { NULL, };
|
||||
@@ -304,8 +308,9 @@ gtk_box_class_init (GtkBoxClass *class)
|
||||
|
||||
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("box"));
|
||||
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GROUP);
|
||||
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GENERIC);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_box_init (GtkBox *box)
|
||||
{
|
||||
@@ -366,14 +371,13 @@ void
|
||||
gtk_box_set_homogeneous (GtkBox *box,
|
||||
gboolean homogeneous)
|
||||
{
|
||||
bool is_homogeneous = !!homogeneous;
|
||||
GtkBoxLayout *box_layout;
|
||||
|
||||
g_return_if_fail (GTK_IS_BOX (box));
|
||||
|
||||
homogeneous = !!homogeneous;
|
||||
|
||||
box_layout = GTK_BOX_LAYOUT (gtk_widget_get_layout_manager (GTK_WIDGET (box)));
|
||||
if (homogeneous == gtk_box_layout_get_homogeneous (box_layout))
|
||||
if (is_homogeneous == gtk_box_layout_get_homogeneous (box_layout))
|
||||
return;
|
||||
|
||||
gtk_box_layout_set_homogeneous (box_layout, homogeneous);
|
||||
|
||||
220
gtk/gtkbuilder.c
220
gtk/gtkbuilder.c
@@ -54,16 +54,47 @@
|
||||
* to make use of them. Non-widget objects need to be reffed with
|
||||
* g_object_ref() to keep them beyond the lifespan of the builder.
|
||||
*
|
||||
* # GtkBuilder UI Definitions
|
||||
* ## GtkBuilder UI Definitions
|
||||
*
|
||||
* `GtkBuilder` parses textual descriptions of user interfaces which are
|
||||
* specified in XML format. We refer to these descriptions as “GtkBuilder
|
||||
* UI definitions” or just “UI definitions” if the context is clear.
|
||||
*
|
||||
* ### Structure of UI definitions
|
||||
*
|
||||
* UI definition files are always encoded in UTF-8.
|
||||
*
|
||||
* The toplevel element is `<interface>`. It optionally takes a “domain”
|
||||
* attribute, which will make the builder look for translated strings
|
||||
* using `dgettext()` in the domain specified. This can also be done by
|
||||
* calling [method@Gtk.Builder.set_translation_domain] on the builder.
|
||||
* For example:
|
||||
*
|
||||
* ```xml
|
||||
* <?xml version="1.0" encoding="UTF-8">
|
||||
* <interface domain="your-app">
|
||||
* ...
|
||||
* </interface>
|
||||
* ```
|
||||
*
|
||||
* ### Requirements
|
||||
*
|
||||
* The target toolkit version(s) are described by `<requires>` elements,
|
||||
* the “lib” attribute specifies the widget library in question (currently
|
||||
* the only supported value is “gtk”) and the “version” attribute specifies
|
||||
* the target version in the form “`<major>`.`<minor>`”. `GtkBuilder` will
|
||||
* error out if the version requirements are not met. For example:
|
||||
*
|
||||
* ```xml
|
||||
* <?xml version="1.0" encoding="UTF-8">
|
||||
* <interface domain="your-app">
|
||||
* <requires lib="gtk" version="4.0" />
|
||||
* </interface>
|
||||
* ```
|
||||
*
|
||||
* ### Objects
|
||||
*
|
||||
* Objects are defined as children of the `<interface>` element.
|
||||
*
|
||||
* Objects are described by `<object>` elements, which can contain
|
||||
* `<property>` elements to set properties, `<signal>` elements which
|
||||
@@ -72,18 +103,14 @@
|
||||
* actions in an action group, or columns in a tree model). A `<child>`
|
||||
* element contains an `<object>` element which describes the child object.
|
||||
*
|
||||
* The target toolkit version(s) are described by `<requires>` elements,
|
||||
* the “lib” attribute specifies the widget library in question (currently
|
||||
* the only supported value is “gtk”) and the “version” attribute specifies
|
||||
* the target version in the form “`<major>`.`<minor>`”. `GtkBuilder` will
|
||||
* error out if the version requirements are not met.
|
||||
*
|
||||
* Typically, the specific kind of object represented by an `<object>`
|
||||
* element is specified by the “class” attribute. If the type has not
|
||||
* been loaded yet, GTK tries to find the `get_type()` function from the
|
||||
* class name by applying heuristics. This works in most cases, but if
|
||||
* necessary, it is possible to specify the name of the `get_type()`
|
||||
* function explicitly with the "type-func" attribute.
|
||||
* function explicitly with the "type-func" attribute. If your UI definition
|
||||
* is referencing internal types, you should make sure to call
|
||||
* `g_type_ensure()` for each object type before parsing the UI definition.
|
||||
*
|
||||
* Objects may be given a name with the “id” attribute, which allows the
|
||||
* application to retrieve them from the builder with
|
||||
@@ -92,45 +119,96 @@
|
||||
* reserves ids starting and ending with `___` (three consecutive
|
||||
* underscores) for its own purposes.
|
||||
*
|
||||
* ### Properties
|
||||
*
|
||||
* Setting properties of objects is pretty straightforward with the
|
||||
* `<property>` element: the “name” attribute specifies the name of the
|
||||
* property, and the content of the element specifies the value.
|
||||
* property, and the content of the element specifies the value:
|
||||
*
|
||||
* ```xml
|
||||
* <object class="GtkButton">
|
||||
* <property name="label">Hello, world</property>
|
||||
* </object>
|
||||
* ```
|
||||
*
|
||||
* If the “translatable” attribute is set to a true value, GTK uses
|
||||
* `gettext()` (or `dgettext()` if the builder has a translation domain set)
|
||||
* to find a translation for the value. This happens before the value
|
||||
* is parsed, so it can be used for properties of any type, but it is
|
||||
* probably most useful for string properties. It is also possible to
|
||||
* specify a context to disambiguate short strings, and comments which
|
||||
* may help the translators.
|
||||
* may help the translators:
|
||||
*
|
||||
* ```xml
|
||||
* <object class="GtkButton">
|
||||
* <property name="label" translatable="yes" context="button">Hello, world</property>
|
||||
* </object>
|
||||
* ```
|
||||
*
|
||||
* `GtkBuilder` can parse textual representations for the most common
|
||||
* property types: characters, strings, integers, floating-point numbers,
|
||||
* booleans (strings like “TRUE”, “t”, “yes”, “y”, “1” are interpreted
|
||||
* as %TRUE, strings like “FALSE”, “f”, “no”, “n”, “0” are interpreted
|
||||
* as %FALSE), enumerations (can be specified by their name, nick or
|
||||
* integer value), flags (can be specified by their name, nick, integer
|
||||
* value, optionally combined with “|”, e.g.
|
||||
* “GTK_INPUT_HINT_EMOJI|GTK_INPUT_HINT_LOWERCASE”)
|
||||
* and colors (in a format understood by [method@Gdk.RGBA.parse]).
|
||||
* property types:
|
||||
*
|
||||
* `GVariant`s can be specified in the format understood by
|
||||
* g_variant_parse(), and pixbufs can be specified as a filename of an
|
||||
* image file to load.
|
||||
* - characters
|
||||
* - strings
|
||||
* - integers
|
||||
* - floating-point numbers
|
||||
* - booleans (strings like “TRUE”, “t”, “yes”, “y”, “1” are interpreted
|
||||
* as true values, strings like “FALSE”, “f”, “no”, “n”, “0” are interpreted
|
||||
* as false values)
|
||||
* - enumeration types (can be specified by their full C identifier their short
|
||||
* name used when registering the enumeration type, or their integer value)
|
||||
* - flag types (can be specified by their C identifier, short name, integer
|
||||
* value, and optionally combined with “|” for bitwise OR, e.g.
|
||||
* “GTK_INPUT_HINT_EMOJI|GTK_INPUT_HINT_LOWERCASE”, or “emoji|lowercase”)
|
||||
* - colors (in a format understood by [method@Gdk.RGBA.parse])
|
||||
* - `GVariant` (can be specified in the format understood by
|
||||
* [func@GLib.Variant.parse])
|
||||
* - pixbufs (can be specified as a filename of an image file to load)
|
||||
*
|
||||
* Objects can be referred to by their name and by default refer to
|
||||
* objects declared in the local XML fragment and objects exposed via
|
||||
* [method@Gtk.Builder.expose_object]. In general, `GtkBuilder` allows
|
||||
* forward references to objects — declared in the local XML; an object
|
||||
* forward references to objects declared in the local XML; an object
|
||||
* doesn’t have to be constructed before it can be referred to. The
|
||||
* exception to this rule is that an object has to be constructed before
|
||||
* it can be used as the value of a construct-only property.
|
||||
*
|
||||
* ### Property bindings
|
||||
*
|
||||
* It is also possible to bind a property value to another object's
|
||||
* property value using the attributes "bind-source" to specify the
|
||||
* source object of the binding, and optionally, "bind-property" and
|
||||
* "bind-flags" to specify the source property and source binding flags
|
||||
* respectively. Internally, `GtkBuilder` implements this using `GBinding`
|
||||
* objects. For more information see g_object_bind_property().
|
||||
* respectively. Internally, `GtkBuilder` implements this using
|
||||
* [class@GObject.Binding] objects.
|
||||
*
|
||||
* For instance, in the example below the “label” property of the
|
||||
* `bottom_label` widget is bound to the “label” property of the
|
||||
* `top_button` widget:
|
||||
*
|
||||
* ```xml
|
||||
* <object class="GtkBox">
|
||||
* <property name="orientation">vertical</property>
|
||||
* <child>
|
||||
* <object class="GtkButton" id="top_button">
|
||||
* <property name="label">Hello, world</property>
|
||||
* </object>
|
||||
* </child>
|
||||
* <child>
|
||||
* <object class="GtkLabel" id="bottom_label">
|
||||
* <property name="label"
|
||||
* bind-source="top_button"
|
||||
* bind-property="label"
|
||||
* bind-flags="sync-create" />
|
||||
* </object>
|
||||
* </child>
|
||||
* </object>
|
||||
* ```
|
||||
*
|
||||
* For more information, see the documentation of the
|
||||
* [method@GObject.Object.bind_property] method.
|
||||
*
|
||||
* ### Internal children
|
||||
*
|
||||
* Sometimes it is necessary to refer to widgets which have implicitly
|
||||
* been constructed by GTK as part of a composite widget, to set
|
||||
@@ -140,42 +218,68 @@
|
||||
* still requires an `<object>` element for the internal child, even if it
|
||||
* has already been constructed.
|
||||
*
|
||||
* ### Specialized children
|
||||
*
|
||||
* A number of widgets have different places where a child can be added
|
||||
* (e.g. tabs vs. page content in notebooks). This can be reflected in
|
||||
* a UI definition by specifying the “type” attribute on a `<child>`
|
||||
* The possible values for the “type” attribute are described in the
|
||||
* sections describing the widget-specific portions of UI definitions.
|
||||
*
|
||||
* # Signal handlers and function pointers
|
||||
* ### Signal handlers and function pointers
|
||||
*
|
||||
* Signal handlers are set up with the `<signal>` element. The “name”
|
||||
* attribute specifies the name of the signal, and the “handler” attribute
|
||||
* specifies the function to connect to the signal.
|
||||
*
|
||||
* ```xml
|
||||
* <object class="GtkButton" id="hello_button">
|
||||
* <signal name="clicked" handler="hello_button__clicked" />
|
||||
* </object>
|
||||
* ```
|
||||
*
|
||||
* The remaining attributes, “after”, “swapped” and “object”, have the
|
||||
* same meaning as the corresponding parameters of the
|
||||
* g_signal_connect_object() or g_signal_connect_data() functions. By
|
||||
* default "swapped" will be set to "yes" if not specified otherwise, in the
|
||||
* case where "object" is set, for convenience. A “last_modification_time”
|
||||
* [func@GObject.signal_connect_object] or [func@GObject.signal_connect_data]
|
||||
* functions:
|
||||
*
|
||||
* - “after” matches the `G_CONNECT_AFTER` flag, and will ensure that the
|
||||
* handler is called after the default class closure for the signal
|
||||
* - “swapped” matches the `G_CONNECT_SWAPPED` flag, and will swap the
|
||||
* instance and closure arguments when invoking the signal handler
|
||||
* - “object” will bind the signal handler to the lifetime of the object
|
||||
* referenced by the attribute
|
||||
*
|
||||
* By default "swapped" will be set to "yes" if not specified otherwise, in
|
||||
* the case where "object" is set, for convenience. A “last_modification_time”
|
||||
* attribute is also allowed, but it does not have a meaning to the builder.
|
||||
*
|
||||
* If you rely on `GModule` support to lookup callbacks in the symbol table,
|
||||
* the following details should be noted:
|
||||
*
|
||||
* When compiling applications for Windows, you must declare signal callbacks
|
||||
* with %G_MODULE_EXPORT, or they will not be put in the symbol table.
|
||||
* On Linux and Unix, this is not necessary; applications should instead
|
||||
* be compiled with the -Wl,--export-dynamic `CFLAGS`, and linked against
|
||||
* `gmodule-export-2.0`.
|
||||
* with the `G_MODULE_EXPORT` decorator, or they will not be put in the symbol
|
||||
* table:
|
||||
*
|
||||
* # A GtkBuilder UI Definition
|
||||
* ```c
|
||||
* G_MODULE_EXPORT void
|
||||
* hello_button__clicked (GtkButton *button,
|
||||
* gpointer data)
|
||||
* {
|
||||
* // ...
|
||||
* }
|
||||
* ```
|
||||
*
|
||||
* On Linux and Unix, this is not necessary; applications should instead
|
||||
* be compiled with the `-Wl,--export-dynamic` argument inside their compiler
|
||||
* flags, and linked against `gmodule-export-2.0`.
|
||||
*
|
||||
* ## Example UI Definition
|
||||
*
|
||||
* ```xml
|
||||
* <interface>
|
||||
* <object class="GtkDialog" id="dialog1">
|
||||
* <child internal-child="content_area">
|
||||
* <object class="GtkBox" id="vbox1">
|
||||
* <object class="GtkBox">
|
||||
* <child internal-child="action_area">
|
||||
* <object class="GtkBox" id="hbuttonbox1">
|
||||
* <object class="GtkBox">
|
||||
* <child>
|
||||
* <object class="GtkButton" id="ok_button">
|
||||
* <property name="label" translatable="yes">_Ok</property>
|
||||
@@ -191,17 +295,21 @@
|
||||
* </interface>
|
||||
* ```
|
||||
*
|
||||
* Beyond this general structure, several object classes define their
|
||||
* own XML DTD fragments for filling in the ANY placeholders in the DTD
|
||||
* above. Note that a custom element in a `<child>` element gets parsed by
|
||||
* the custom tag handler of the parent object, while a custom element in
|
||||
* an `<object>` element gets parsed by the custom tag handler of the object.
|
||||
* ## Using GtkBuildable for extending UI definitions
|
||||
*
|
||||
* These XML fragments are explained in the documentation of the
|
||||
* respective objects.
|
||||
* Objects can implement the [iface@Gtk.Buildable] interface to add custom
|
||||
* elements and attributes to the XML. Typically, any extension will be
|
||||
* documented in each type that implements the interface.
|
||||
*
|
||||
* A `<template>` tag can be used to define a widget class’s components.
|
||||
* See the [GtkWidget documentation](class.Widget.html#building-composite-widgets-from-template-xml) for details.
|
||||
* ## Templates
|
||||
*
|
||||
* When describing a [class@Gtk.Widget], you can use the `<template>` tag to
|
||||
* describe a UI bound to a specific widget type. GTK will automatically load
|
||||
* the UI definition when instantiating the type, and bind children and
|
||||
* signal handlers to instance fields and function symbols.
|
||||
*
|
||||
* For more information, see the [`GtkWidget` documentation](class.Widget.html#building-composite-widgets-from-template-xml)
|
||||
* for details.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
@@ -2362,6 +2470,24 @@ gtk_builder_value_from_string_type (GtkBuilder *builder,
|
||||
ret = FALSE;
|
||||
}
|
||||
}
|
||||
else if (G_VALUE_HOLDS (value, G_TYPE_DATE_TIME))
|
||||
{
|
||||
GDateTime *date_time;
|
||||
|
||||
date_time = g_date_time_new_from_iso8601 (string, NULL);
|
||||
|
||||
if (date_time)
|
||||
g_value_take_boxed (value, date_time);
|
||||
else
|
||||
{
|
||||
g_set_error (error,
|
||||
GTK_BUILDER_ERROR,
|
||||
GTK_BUILDER_ERROR_INVALID_VALUE,
|
||||
"Could not parse GDateTime '%s'",
|
||||
string);
|
||||
ret = FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_set_error (error,
|
||||
|
||||
@@ -83,18 +83,19 @@
|
||||
|
||||
struct _GtkButtonPrivate
|
||||
{
|
||||
GtkWidget *child;
|
||||
GtkWidget *child;
|
||||
|
||||
GtkActionHelper *action_helper;
|
||||
GtkActionHelper *action_helper;
|
||||
|
||||
GtkGesture *gesture;
|
||||
GtkGesture *gesture;
|
||||
|
||||
guint activate_timeout;
|
||||
guint activate_timeout;
|
||||
|
||||
guint button_down : 1;
|
||||
guint use_underline : 1;
|
||||
guint child_type : 2;
|
||||
guint can_shrink : 1;
|
||||
bool button_down;
|
||||
bool use_underline;
|
||||
bool can_shrink;
|
||||
|
||||
guint child_type : 2;
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -353,7 +354,7 @@ click_pressed_cb (GtkGestureClick *gesture,
|
||||
gtk_widget_grab_focus (widget);
|
||||
|
||||
if (!priv->activate_timeout)
|
||||
priv->button_down = TRUE;
|
||||
priv->button_down = true;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -444,8 +445,8 @@ gtk_button_init (GtkButton *button)
|
||||
gtk_widget_set_focusable (GTK_WIDGET (button), TRUE);
|
||||
gtk_widget_set_receives_default (GTK_WIDGET (button), TRUE);
|
||||
|
||||
priv->button_down = FALSE;
|
||||
priv->use_underline = FALSE;
|
||||
priv->button_down = false;
|
||||
priv->use_underline = false;
|
||||
priv->child_type = WIDGET_CHILD;
|
||||
|
||||
priv->gesture = gtk_gesture_click_new ();
|
||||
@@ -772,7 +773,7 @@ gtk_button_do_release (GtkButton *button,
|
||||
|
||||
if (priv->button_down)
|
||||
{
|
||||
priv->button_down = FALSE;
|
||||
priv->button_down = false;
|
||||
|
||||
if (priv->activate_timeout)
|
||||
return;
|
||||
@@ -811,7 +812,7 @@ gtk_real_button_activate (GtkButton *button)
|
||||
gdk_source_set_static_name_by_id (priv->activate_timeout, "[gtk] button_activate_timeout");
|
||||
|
||||
gtk_widget_add_css_class (GTK_WIDGET (button), "keyboard-activating");
|
||||
priv->button_down = TRUE;
|
||||
priv->button_down = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -826,7 +827,7 @@ gtk_button_finish_activate (GtkButton *button,
|
||||
g_source_remove (priv->activate_timeout);
|
||||
priv->activate_timeout = 0;
|
||||
|
||||
priv->button_down = FALSE;
|
||||
priv->button_down = false;
|
||||
|
||||
if (do_it)
|
||||
g_signal_emit (button, button_signals[CLICKED], 0);
|
||||
@@ -918,20 +919,19 @@ gtk_button_set_use_underline (GtkButton *button,
|
||||
gboolean use_underline)
|
||||
{
|
||||
GtkButtonPrivate *priv = gtk_button_get_instance_private (button);
|
||||
bool underline = !!use_underline;
|
||||
|
||||
g_return_if_fail (GTK_IS_BUTTON (button));
|
||||
|
||||
use_underline = use_underline != FALSE;
|
||||
|
||||
if (use_underline != priv->use_underline)
|
||||
if (underline != priv->use_underline)
|
||||
{
|
||||
if (priv->child_type == LABEL_CHILD)
|
||||
{
|
||||
gtk_label_set_use_underline (GTK_LABEL (priv->child), use_underline);
|
||||
gtk_label_set_use_underline (GTK_LABEL (priv->child), underline);
|
||||
gtk_label_set_mnemonic_widget (GTK_LABEL (priv->child), GTK_WIDGET (button));
|
||||
}
|
||||
|
||||
priv->use_underline = use_underline;
|
||||
priv->use_underline = underline;
|
||||
g_object_notify_by_pspec (G_OBJECT (button), props[PROP_USE_UNDERLINE]);
|
||||
}
|
||||
}
|
||||
@@ -1118,14 +1118,13 @@ gtk_button_set_can_shrink (GtkButton *button,
|
||||
gboolean can_shrink)
|
||||
{
|
||||
GtkButtonPrivate *priv = gtk_button_get_instance_private (button);
|
||||
bool shrink = !!can_shrink;
|
||||
|
||||
g_return_if_fail (GTK_IS_BUTTON (button));
|
||||
|
||||
can_shrink = !!can_shrink;
|
||||
|
||||
if (priv->can_shrink != can_shrink)
|
||||
if (priv->can_shrink != shrink)
|
||||
{
|
||||
priv->can_shrink = can_shrink;
|
||||
priv->can_shrink = shrink;
|
||||
|
||||
switch (priv->child_type)
|
||||
{
|
||||
|
||||
@@ -202,10 +202,9 @@ struct _GtkCalendar
|
||||
{
|
||||
GtkWidget widget;
|
||||
|
||||
guint show_week_numbers : 1;
|
||||
guint show_heading : 1;
|
||||
guint show_day_names : 1;
|
||||
guint year_before : 1;
|
||||
bool show_week_numbers;
|
||||
bool show_heading;
|
||||
bool show_day_names;
|
||||
|
||||
GtkWidget *header_box;
|
||||
GtkWidget *year_label;
|
||||
@@ -219,14 +218,14 @@ struct _GtkCalendar
|
||||
|
||||
GDateTime *date;
|
||||
|
||||
int day_month[6][7];
|
||||
int day[6][7];
|
||||
int day_month[6][7];
|
||||
int day[6][7];
|
||||
|
||||
int num_marked_dates;
|
||||
int marked_date[31];
|
||||
int num_marked_dates;
|
||||
int marked_date[31];
|
||||
|
||||
int focus_row;
|
||||
int focus_col;
|
||||
int focus_row;
|
||||
int focus_col;
|
||||
|
||||
int week_start;
|
||||
};
|
||||
@@ -547,7 +546,6 @@ gtk_calendar_init (GtkCalendar *calendar)
|
||||
char buffer[255];
|
||||
time_t tmp_time;
|
||||
#endif
|
||||
char *year_before;
|
||||
#ifdef HAVE__NL_TIME_FIRST_WEEKDAY
|
||||
union { unsigned int word; char *string; } langinfo;
|
||||
int week_1stday = 0;
|
||||
@@ -775,12 +773,12 @@ gtk_calendar_init (GtkCalendar *calendar)
|
||||
gtk_widget_set_vexpand (calendar->grid, TRUE);
|
||||
gtk_widget_set_parent (calendar->grid, GTK_WIDGET (calendar));
|
||||
|
||||
for (i=0;i<31;i++)
|
||||
for (i = 0; i < 31; i++)
|
||||
calendar->marked_date[i] = FALSE;
|
||||
calendar->num_marked_dates = 0;
|
||||
|
||||
calendar->show_heading = TRUE;
|
||||
calendar->show_day_names = TRUE;
|
||||
calendar->show_heading = true;
|
||||
calendar->show_day_names = true;
|
||||
|
||||
calendar->focus_row = -1;
|
||||
calendar->focus_col = -1;
|
||||
@@ -791,24 +789,6 @@ gtk_calendar_init (GtkCalendar *calendar)
|
||||
g_signal_connect (target, "drop", G_CALLBACK (gtk_calendar_drag_drop), calendar);
|
||||
gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (target));
|
||||
|
||||
calendar->year_before = 0;
|
||||
|
||||
/* Translate to calendar:YM if you want years to be displayed
|
||||
* before months; otherwise translate to calendar:MY.
|
||||
* Do *not* translate it to anything else, if it
|
||||
* it isn't calendar:YM or calendar:MY it will not work.
|
||||
*
|
||||
* Note that the ordering described here is logical order, which is
|
||||
* further influenced by BIDI ordering. Thus, if you have a default
|
||||
* text direction of RTL and specify "calendar:YM", then the year
|
||||
* will appear to the right of the month.
|
||||
*/
|
||||
year_before = _("calendar:MY");
|
||||
if (strcmp (year_before, "calendar:YM") == 0)
|
||||
calendar->year_before = 1;
|
||||
else if (strcmp (year_before, "calendar:MY") != 0)
|
||||
g_warning ("Whoever translated calendar:MY did so wrongly.");
|
||||
|
||||
gtk_orientable_set_orientation (GTK_ORIENTABLE (gtk_widget_get_layout_manager (GTK_WIDGET (calendar))),
|
||||
GTK_ORIENTATION_VERTICAL);
|
||||
|
||||
@@ -1657,17 +1637,18 @@ void
|
||||
gtk_calendar_set_show_week_numbers (GtkCalendar *self,
|
||||
gboolean value)
|
||||
{
|
||||
bool show_week_numbers = !!value;
|
||||
int i;
|
||||
|
||||
g_return_if_fail (GTK_IS_CALENDAR (self));
|
||||
|
||||
if (self->show_week_numbers == value)
|
||||
if (self->show_week_numbers == show_week_numbers)
|
||||
return;
|
||||
|
||||
self->show_week_numbers = value;
|
||||
self->show_week_numbers = show_week_numbers;
|
||||
|
||||
for (i = 0; i < 6; i ++)
|
||||
gtk_widget_set_visible (self->week_number_labels[i], value);
|
||||
gtk_widget_set_visible (self->week_number_labels[i], show_week_numbers);
|
||||
|
||||
g_object_notify (G_OBJECT (self), "show-week-numbers");
|
||||
}
|
||||
@@ -1706,14 +1687,16 @@ void
|
||||
gtk_calendar_set_show_heading (GtkCalendar *self,
|
||||
gboolean value)
|
||||
{
|
||||
bool show_heading = !!value;
|
||||
|
||||
g_return_if_fail (GTK_IS_CALENDAR (self));
|
||||
|
||||
if (self->show_heading == value)
|
||||
if (self->show_heading == show_heading)
|
||||
return;
|
||||
|
||||
self->show_heading = value;
|
||||
self->show_heading = show_heading;
|
||||
|
||||
gtk_widget_set_visible (self->header_box, value);
|
||||
gtk_widget_set_visible (self->header_box, show_heading);
|
||||
|
||||
g_object_notify (G_OBJECT (self), "show-heading");
|
||||
}
|
||||
@@ -1748,17 +1731,18 @@ void
|
||||
gtk_calendar_set_show_day_names (GtkCalendar *self,
|
||||
gboolean value)
|
||||
{
|
||||
bool show_day_names = !!value;
|
||||
int i;
|
||||
|
||||
g_return_if_fail (GTK_IS_CALENDAR (self));
|
||||
|
||||
if (self->show_day_names == value)
|
||||
if (self->show_day_names == show_day_names)
|
||||
return;
|
||||
|
||||
self->show_day_names = value;
|
||||
self->show_day_names = show_day_names;
|
||||
|
||||
for (i = 0; i < 7; i ++)
|
||||
gtk_widget_set_visible (self->day_name_labels[i], value);
|
||||
gtk_widget_set_visible (self->day_name_labels[i], show_day_names);
|
||||
|
||||
g_object_notify (G_OBJECT (self), "show-day-names");
|
||||
}
|
||||
|
||||
@@ -52,7 +52,9 @@
|
||||
*
|
||||
* # Accessibility
|
||||
*
|
||||
* `GtkCenterBox` uses the %GTK_ACCESSIBLE_ROLE_GROUP role.
|
||||
* Until GTK 4.10, `GtkCenterBox` used the `GTK_ACCESSIBLE_ROLE_GROUP` role.
|
||||
*
|
||||
* Starting from GTK 4.12, `GtkCenterBox` uses the `GTK_ACCESSIBLE_ROLE_GENERIC` role.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
@@ -321,7 +323,7 @@ gtk_center_box_class_init (GtkCenterBoxClass *klass)
|
||||
|
||||
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_CENTER_LAYOUT);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("box"));
|
||||
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GROUP);
|
||||
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GENERIC);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -103,10 +103,11 @@ typedef struct {
|
||||
GtkWidget *indicator_widget;
|
||||
GtkWidget *child;
|
||||
|
||||
guint inconsistent: 1;
|
||||
guint active: 1;
|
||||
guint use_underline: 1;
|
||||
guint child_type: 1;
|
||||
bool inconsistent;
|
||||
bool active;
|
||||
bool use_underline;
|
||||
|
||||
guint child_type : 1;
|
||||
|
||||
GtkCheckButton *group_next;
|
||||
GtkCheckButton *group_prev;
|
||||
@@ -790,13 +791,13 @@ gtk_check_button_set_inconsistent (GtkCheckButton *check_button,
|
||||
gboolean inconsistent)
|
||||
{
|
||||
GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (check_button);
|
||||
bool is_inconsistent = !!inconsistent;
|
||||
|
||||
g_return_if_fail (GTK_IS_CHECK_BUTTON (check_button));
|
||||
|
||||
inconsistent = !!inconsistent;
|
||||
if (priv->inconsistent != inconsistent)
|
||||
if (priv->inconsistent != is_inconsistent)
|
||||
{
|
||||
priv->inconsistent = inconsistent;
|
||||
priv->inconsistent = is_inconsistent;
|
||||
|
||||
if (inconsistent)
|
||||
{
|
||||
@@ -863,15 +864,14 @@ gtk_check_button_set_active (GtkCheckButton *self,
|
||||
gboolean setting)
|
||||
{
|
||||
GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (self);
|
||||
bool is_active = !!setting;
|
||||
|
||||
g_return_if_fail (GTK_IS_CHECK_BUTTON (self));
|
||||
|
||||
setting = !!setting;
|
||||
|
||||
if (setting == priv->active)
|
||||
if (is_active == priv->active)
|
||||
return;
|
||||
|
||||
if (setting)
|
||||
if (is_active)
|
||||
{
|
||||
gtk_widget_set_state_flags (GTK_WIDGET (self), GTK_STATE_FLAG_CHECKED, FALSE);
|
||||
gtk_widget_set_state_flags (priv->indicator_widget, GTK_STATE_FLAG_CHECKED, FALSE);
|
||||
@@ -882,7 +882,7 @@ gtk_check_button_set_active (GtkCheckButton *self,
|
||||
gtk_widget_unset_state_flags (priv->indicator_widget, GTK_STATE_FLAG_CHECKED);
|
||||
}
|
||||
|
||||
if (setting && (priv->group_prev || priv->group_next))
|
||||
if (is_active && (priv->group_prev || priv->group_next))
|
||||
{
|
||||
GtkCheckButton *group_first = NULL;
|
||||
GtkCheckButton *iter;
|
||||
@@ -897,7 +897,7 @@ gtk_check_button_set_active (GtkCheckButton *self,
|
||||
/* ... and the next code block will set this one to active */
|
||||
}
|
||||
|
||||
priv->active = setting;
|
||||
priv->active = is_active;
|
||||
update_accessible_state (self);
|
||||
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_ACTIVE]);
|
||||
g_signal_emit (self, signals[TOGGLED], 0);
|
||||
@@ -1095,15 +1095,14 @@ gtk_check_button_set_use_underline (GtkCheckButton *self,
|
||||
gboolean setting)
|
||||
{
|
||||
GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (self);
|
||||
bool use_underline = !!setting;
|
||||
|
||||
g_return_if_fail (GTK_IS_CHECK_BUTTON (self));
|
||||
|
||||
setting = !!setting;
|
||||
|
||||
if (setting == priv->use_underline)
|
||||
if (use_underline == priv->use_underline)
|
||||
return;
|
||||
|
||||
priv->use_underline = setting;
|
||||
priv->use_underline = use_underline;
|
||||
if (priv->child_type == LABEL_CHILD && priv->child != NULL)
|
||||
gtk_label_set_use_underline (GTK_LABEL (priv->child), priv->use_underline);
|
||||
|
||||
|
||||
@@ -280,6 +280,7 @@ gtk_color_dialog_button_class_init (GtkColorDialogButtonClass *class)
|
||||
|
||||
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
|
||||
gtk_widget_class_set_css_name (widget_class, "colorbutton");
|
||||
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_GROUP);
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user