/**
 * Copyright 2023 The AccessKit Authors. All rights reserved.
 * Licensed under the Apache License, Version 2.0 (found in
 * the LICENSE-APACHE file) or the MIT license (found in
 * the LICENSE-MIT file), at your option.
 */

#ifndef ACCESSKIT_H
#define ACCESSKIT_H

#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#ifdef _WIN32
#include <windows.h>
#endif

/**
 * An action to be taken on an accessibility node.
 */
enum accesskit_action
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  /**
   * Do the equivalent of a single click or tap.
   */
  ACCESSKIT_ACTION_CLICK,
  ACCESSKIT_ACTION_FOCUS,
  ACCESSKIT_ACTION_BLUR,
  ACCESSKIT_ACTION_COLLAPSE,
  ACCESSKIT_ACTION_EXPAND,
  /**
   * Requires [`ActionRequest::data`] to be set to [`ActionData::CustomAction`].
   */
  ACCESSKIT_ACTION_CUSTOM_ACTION,
  /**
   * Decrement a numeric value by one step.
   */
  ACCESSKIT_ACTION_DECREMENT,
  /**
   * Increment a numeric value by one step.
   */
  ACCESSKIT_ACTION_INCREMENT,
  ACCESSKIT_ACTION_HIDE_TOOLTIP,
  ACCESSKIT_ACTION_SHOW_TOOLTIP,
  /**
   * Delete any selected text in the control's text value and
   * insert the specified value in its place, like when typing or pasting.
   * Requires [`ActionRequest::data`] to be set to [`ActionData::Value`].
   */
  ACCESSKIT_ACTION_REPLACE_SELECTED_TEXT,
  ACCESSKIT_ACTION_SCROLL_BACKWARD,
  ACCESSKIT_ACTION_SCROLL_DOWN,
  ACCESSKIT_ACTION_SCROLL_FORWARD,
  ACCESSKIT_ACTION_SCROLL_LEFT,
  ACCESSKIT_ACTION_SCROLL_RIGHT,
  ACCESSKIT_ACTION_SCROLL_UP,
  /**
   * Scroll any scrollable containers to make the target object visible
   * on the screen.  Optionally set [`ActionRequest::data`] to
   * [`ActionData::ScrollTargetRect`].
   */
  ACCESSKIT_ACTION_SCROLL_INTO_VIEW,
  /**
   * Scroll the given object to a specified point in the tree's container
   * (e.g. window). Requires [`ActionRequest::data`] to be set to
   * [`ActionData::ScrollToPoint`].
   */
  ACCESSKIT_ACTION_SCROLL_TO_POINT,
  /**
   * Requires [`ActionRequest::data`] to be set to
   * [`ActionData::SetScrollOffset`].
   */
  ACCESSKIT_ACTION_SET_SCROLL_OFFSET,
  /**
   * Requires [`ActionRequest::data`] to be set to
   * [`ActionData::SetTextSelection`].
   */
  ACCESSKIT_ACTION_SET_TEXT_SELECTION,
  /**
   * Don't focus this node, but set it as the sequential focus navigation
   * starting point, so that pressing Tab moves to the next element
   * following this one, for example.
   */
  ACCESSKIT_ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT,
  /**
   * Replace the value of the control with the specified value and
   * reset the selection, if applicable. Requires [`ActionRequest::data`]
   * to be set to [`ActionData::Value`] or [`ActionData::NumericValue`].
   */
  ACCESSKIT_ACTION_SET_VALUE,
  ACCESSKIT_ACTION_SHOW_CONTEXT_MENU,
};
#ifndef __cplusplus
typedef uint8_t accesskit_action;
#endif  // __cplusplus

enum accesskit_aria_current
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_ARIA_CURRENT_FALSE,
  ACCESSKIT_ARIA_CURRENT_TRUE,
  ACCESSKIT_ARIA_CURRENT_PAGE,
  ACCESSKIT_ARIA_CURRENT_STEP,
  ACCESSKIT_ARIA_CURRENT_LOCATION,
  ACCESSKIT_ARIA_CURRENT_DATE,
  ACCESSKIT_ARIA_CURRENT_TIME,
};
#ifndef __cplusplus
typedef uint8_t accesskit_aria_current;
#endif  // __cplusplus

enum accesskit_auto_complete
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_AUTO_COMPLETE_INLINE,
  ACCESSKIT_AUTO_COMPLETE_LIST,
  ACCESSKIT_AUTO_COMPLETE_BOTH,
};
#ifndef __cplusplus
typedef uint8_t accesskit_auto_complete;
#endif  // __cplusplus

enum accesskit_has_popup
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_HAS_POPUP_TRUE,
  ACCESSKIT_HAS_POPUP_MENU,
  ACCESSKIT_HAS_POPUP_LISTBOX,
  ACCESSKIT_HAS_POPUP_TREE,
  ACCESSKIT_HAS_POPUP_GRID,
  ACCESSKIT_HAS_POPUP_DIALOG,
};
#ifndef __cplusplus
typedef uint8_t accesskit_has_popup;
#endif  // __cplusplus

/**
 * Indicates if a form control has invalid input or if a web DOM element has an
 * [`aria-invalid`] attribute.
 *
 * [`aria-invalid`]: https://www.w3.org/TR/wai-aria-1.1/#aria-invalid
 */
enum accesskit_invalid
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_INVALID_TRUE,
  ACCESSKIT_INVALID_GRAMMAR,
  ACCESSKIT_INVALID_SPELLING,
};
#ifndef __cplusplus
typedef uint8_t accesskit_invalid;
#endif  // __cplusplus

enum accesskit_list_style
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_LIST_STYLE_CIRCLE,
  ACCESSKIT_LIST_STYLE_DISC,
  ACCESSKIT_LIST_STYLE_IMAGE,
  ACCESSKIT_LIST_STYLE_NUMERIC,
  ACCESSKIT_LIST_STYLE_SQUARE,
  /**
   * Language specific ordering (alpha, roman, cjk-ideographic, etc...)
   */
  ACCESSKIT_LIST_STYLE_OTHER,
};
#ifndef __cplusplus
typedef uint8_t accesskit_list_style;
#endif  // __cplusplus

enum accesskit_live
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_LIVE_OFF,
  ACCESSKIT_LIVE_POLITE,
  ACCESSKIT_LIVE_ASSERTIVE,
};
#ifndef __cplusplus
typedef uint8_t accesskit_live;
#endif  // __cplusplus

enum accesskit_orientation
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  /**
   * E.g. most toolbars and separators.
   */
  ACCESSKIT_ORIENTATION_HORIZONTAL,
  /**
   * E.g. menu or combo box.
   */
  ACCESSKIT_ORIENTATION_VERTICAL,
};
#ifndef __cplusplus
typedef uint8_t accesskit_orientation;
#endif  // __cplusplus

/**
 * The type of an accessibility node.
 *
 * The majority of these roles come from the ARIA specification. Reference
 * the latest draft for proper usage.
 *
 * Like the AccessKit schema as a whole, this list is largely taken
 * from Chromium. However, unlike Chromium's alphabetized list, this list
 * is ordered roughly by expected usage frequency (with the notable exception
 * of [`Role::Unknown`]). This is more efficient in serialization formats
 * where integers use a variable-length encoding.
 */
enum accesskit_role
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_ROLE_UNKNOWN,
  ACCESSKIT_ROLE_TEXT_RUN,
  ACCESSKIT_ROLE_CELL,
  ACCESSKIT_ROLE_LABEL,
  ACCESSKIT_ROLE_IMAGE,
  ACCESSKIT_ROLE_LINK,
  ACCESSKIT_ROLE_ROW,
  ACCESSKIT_ROLE_LIST_ITEM,
  /**
   * Contains the bullet, number, or other marker for a list item.
   */
  ACCESSKIT_ROLE_LIST_MARKER,
  ACCESSKIT_ROLE_TREE_ITEM,
  ACCESSKIT_ROLE_LIST_BOX_OPTION,
  ACCESSKIT_ROLE_MENU_ITEM,
  ACCESSKIT_ROLE_MENU_LIST_OPTION,
  ACCESSKIT_ROLE_PARAGRAPH,
  /**
   * A generic container that should be ignored by assistive technologies
   * and filtered out of platform accessibility trees. Equivalent to the ARIA
   * `none` or `presentation` role, or to an HTML `div` with no role.
   */
  ACCESSKIT_ROLE_GENERIC_CONTAINER,
  ACCESSKIT_ROLE_CHECK_BOX,
  ACCESSKIT_ROLE_RADIO_BUTTON,
  ACCESSKIT_ROLE_TEXT_INPUT,
  ACCESSKIT_ROLE_BUTTON,
  ACCESSKIT_ROLE_DEFAULT_BUTTON,
  ACCESSKIT_ROLE_PANE,
  ACCESSKIT_ROLE_ROW_HEADER,
  ACCESSKIT_ROLE_COLUMN_HEADER,
  ACCESSKIT_ROLE_ROW_GROUP,
  ACCESSKIT_ROLE_LIST,
  ACCESSKIT_ROLE_TABLE,
  ACCESSKIT_ROLE_LAYOUT_TABLE_CELL,
  ACCESSKIT_ROLE_LAYOUT_TABLE_ROW,
  ACCESSKIT_ROLE_LAYOUT_TABLE,
  ACCESSKIT_ROLE_SWITCH,
  ACCESSKIT_ROLE_MENU,
  ACCESSKIT_ROLE_MULTILINE_TEXT_INPUT,
  ACCESSKIT_ROLE_SEARCH_INPUT,
  ACCESSKIT_ROLE_DATE_INPUT,
  ACCESSKIT_ROLE_DATE_TIME_INPUT,
  ACCESSKIT_ROLE_WEEK_INPUT,
  ACCESSKIT_ROLE_MONTH_INPUT,
  ACCESSKIT_ROLE_TIME_INPUT,
  ACCESSKIT_ROLE_EMAIL_INPUT,
  ACCESSKIT_ROLE_NUMBER_INPUT,
  ACCESSKIT_ROLE_PASSWORD_INPUT,
  ACCESSKIT_ROLE_PHONE_NUMBER_INPUT,
  ACCESSKIT_ROLE_URL_INPUT,
  ACCESSKIT_ROLE_ABBR,
  ACCESSKIT_ROLE_ALERT,
  ACCESSKIT_ROLE_ALERT_DIALOG,
  ACCESSKIT_ROLE_APPLICATION,
  ACCESSKIT_ROLE_ARTICLE,
  ACCESSKIT_ROLE_AUDIO,
  ACCESSKIT_ROLE_BANNER,
  ACCESSKIT_ROLE_BLOCKQUOTE,
  ACCESSKIT_ROLE_CANVAS,
  ACCESSKIT_ROLE_CAPTION,
  ACCESSKIT_ROLE_CARET,
  ACCESSKIT_ROLE_CODE,
  ACCESSKIT_ROLE_COLOR_WELL,
  ACCESSKIT_ROLE_COMBO_BOX,
  ACCESSKIT_ROLE_EDITABLE_COMBO_BOX,
  ACCESSKIT_ROLE_COMPLEMENTARY,
  ACCESSKIT_ROLE_COMMENT,
  ACCESSKIT_ROLE_CONTENT_DELETION,
  ACCESSKIT_ROLE_CONTENT_INSERTION,
  ACCESSKIT_ROLE_CONTENT_INFO,
  ACCESSKIT_ROLE_DEFINITION,
  ACCESSKIT_ROLE_DESCRIPTION_LIST,
  ACCESSKIT_ROLE_DESCRIPTION_LIST_DETAIL,
  ACCESSKIT_ROLE_DESCRIPTION_LIST_TERM,
  ACCESSKIT_ROLE_DETAILS,
  ACCESSKIT_ROLE_DIALOG,
  ACCESSKIT_ROLE_DIRECTORY,
  ACCESSKIT_ROLE_DISCLOSURE_TRIANGLE,
  ACCESSKIT_ROLE_DOCUMENT,
  ACCESSKIT_ROLE_EMBEDDED_OBJECT,
  ACCESSKIT_ROLE_EMPHASIS,
  ACCESSKIT_ROLE_FEED,
  ACCESSKIT_ROLE_FIGURE_CAPTION,
  ACCESSKIT_ROLE_FIGURE,
  ACCESSKIT_ROLE_FOOTER,
  ACCESSKIT_ROLE_FOOTER_AS_NON_LANDMARK,
  ACCESSKIT_ROLE_FORM,
  ACCESSKIT_ROLE_GRID,
  ACCESSKIT_ROLE_GROUP,
  ACCESSKIT_ROLE_HEADER,
  ACCESSKIT_ROLE_HEADER_AS_NON_LANDMARK,
  ACCESSKIT_ROLE_HEADING,
  ACCESSKIT_ROLE_IFRAME,
  ACCESSKIT_ROLE_IFRAME_PRESENTATIONAL,
  ACCESSKIT_ROLE_IME_CANDIDATE,
  ACCESSKIT_ROLE_KEYBOARD,
  ACCESSKIT_ROLE_LEGEND,
  ACCESSKIT_ROLE_LINE_BREAK,
  ACCESSKIT_ROLE_LIST_BOX,
  ACCESSKIT_ROLE_LOG,
  ACCESSKIT_ROLE_MAIN,
  ACCESSKIT_ROLE_MARK,
  ACCESSKIT_ROLE_MARQUEE,
  ACCESSKIT_ROLE_MATH,
  ACCESSKIT_ROLE_MENU_BAR,
  ACCESSKIT_ROLE_MENU_ITEM_CHECK_BOX,
  ACCESSKIT_ROLE_MENU_ITEM_RADIO,
  ACCESSKIT_ROLE_MENU_LIST_POPUP,
  ACCESSKIT_ROLE_METER,
  ACCESSKIT_ROLE_NAVIGATION,
  ACCESSKIT_ROLE_NOTE,
  ACCESSKIT_ROLE_PLUGIN_OBJECT,
  ACCESSKIT_ROLE_PORTAL,
  ACCESSKIT_ROLE_PRE,
  ACCESSKIT_ROLE_PROGRESS_INDICATOR,
  ACCESSKIT_ROLE_RADIO_GROUP,
  ACCESSKIT_ROLE_REGION,
  ACCESSKIT_ROLE_ROOT_WEB_AREA,
  ACCESSKIT_ROLE_RUBY,
  ACCESSKIT_ROLE_RUBY_ANNOTATION,
  ACCESSKIT_ROLE_SCROLL_BAR,
  ACCESSKIT_ROLE_SCROLL_VIEW,
  ACCESSKIT_ROLE_SEARCH,
  ACCESSKIT_ROLE_SECTION,
  ACCESSKIT_ROLE_SLIDER,
  ACCESSKIT_ROLE_SPIN_BUTTON,
  ACCESSKIT_ROLE_SPLITTER,
  ACCESSKIT_ROLE_STATUS,
  ACCESSKIT_ROLE_STRONG,
  ACCESSKIT_ROLE_SUGGESTION,
  ACCESSKIT_ROLE_SVG_ROOT,
  ACCESSKIT_ROLE_TAB,
  ACCESSKIT_ROLE_TAB_LIST,
  ACCESSKIT_ROLE_TAB_PANEL,
  ACCESSKIT_ROLE_TERM,
  ACCESSKIT_ROLE_TIME,
  ACCESSKIT_ROLE_TIMER,
  ACCESSKIT_ROLE_TITLE_BAR,
  ACCESSKIT_ROLE_TOOLBAR,
  ACCESSKIT_ROLE_TOOLTIP,
  ACCESSKIT_ROLE_TREE,
  ACCESSKIT_ROLE_TREE_GRID,
  ACCESSKIT_ROLE_VIDEO,
  ACCESSKIT_ROLE_WEB_VIEW,
  ACCESSKIT_ROLE_WINDOW,
  ACCESSKIT_ROLE_PDF_ACTIONABLE_HIGHLIGHT,
  ACCESSKIT_ROLE_PDF_ROOT,
  ACCESSKIT_ROLE_GRAPHICS_DOCUMENT,
  ACCESSKIT_ROLE_GRAPHICS_OBJECT,
  ACCESSKIT_ROLE_GRAPHICS_SYMBOL,
  ACCESSKIT_ROLE_DOC_ABSTRACT,
  ACCESSKIT_ROLE_DOC_ACKNOWLEDGEMENTS,
  ACCESSKIT_ROLE_DOC_AFTERWORD,
  ACCESSKIT_ROLE_DOC_APPENDIX,
  ACCESSKIT_ROLE_DOC_BACK_LINK,
  ACCESSKIT_ROLE_DOC_BIBLIO_ENTRY,
  ACCESSKIT_ROLE_DOC_BIBLIOGRAPHY,
  ACCESSKIT_ROLE_DOC_BIBLIO_REF,
  ACCESSKIT_ROLE_DOC_CHAPTER,
  ACCESSKIT_ROLE_DOC_COLOPHON,
  ACCESSKIT_ROLE_DOC_CONCLUSION,
  ACCESSKIT_ROLE_DOC_COVER,
  ACCESSKIT_ROLE_DOC_CREDIT,
  ACCESSKIT_ROLE_DOC_CREDITS,
  ACCESSKIT_ROLE_DOC_DEDICATION,
  ACCESSKIT_ROLE_DOC_ENDNOTE,
  ACCESSKIT_ROLE_DOC_ENDNOTES,
  ACCESSKIT_ROLE_DOC_EPIGRAPH,
  ACCESSKIT_ROLE_DOC_EPILOGUE,
  ACCESSKIT_ROLE_DOC_ERRATA,
  ACCESSKIT_ROLE_DOC_EXAMPLE,
  ACCESSKIT_ROLE_DOC_FOOTNOTE,
  ACCESSKIT_ROLE_DOC_FOREWORD,
  ACCESSKIT_ROLE_DOC_GLOSSARY,
  ACCESSKIT_ROLE_DOC_GLOSS_REF,
  ACCESSKIT_ROLE_DOC_INDEX,
  ACCESSKIT_ROLE_DOC_INTRODUCTION,
  ACCESSKIT_ROLE_DOC_NOTE_REF,
  ACCESSKIT_ROLE_DOC_NOTICE,
  ACCESSKIT_ROLE_DOC_PAGE_BREAK,
  ACCESSKIT_ROLE_DOC_PAGE_FOOTER,
  ACCESSKIT_ROLE_DOC_PAGE_HEADER,
  ACCESSKIT_ROLE_DOC_PAGE_LIST,
  ACCESSKIT_ROLE_DOC_PART,
  ACCESSKIT_ROLE_DOC_PREFACE,
  ACCESSKIT_ROLE_DOC_PROLOGUE,
  ACCESSKIT_ROLE_DOC_PULLQUOTE,
  ACCESSKIT_ROLE_DOC_QNA,
  ACCESSKIT_ROLE_DOC_SUBTITLE,
  ACCESSKIT_ROLE_DOC_TIP,
  ACCESSKIT_ROLE_DOC_TOC,
  /**
   * Behaves similar to an ARIA grid but is primarily used by Chromium's
   * `TableView` and its subclasses, so they can be exposed correctly
   * on certain platforms.
   */
  ACCESSKIT_ROLE_LIST_GRID,
  /**
   * This is just like a multi-line document, but signals that assistive
   * technologies should implement behavior specific to a VT-100-style
   * terminal.
   */
  ACCESSKIT_ROLE_TERMINAL,
};
#ifndef __cplusplus
typedef uint8_t accesskit_role;
#endif  // __cplusplus

enum accesskit_sort_direction
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_SORT_DIRECTION_ASCENDING,
  ACCESSKIT_SORT_DIRECTION_DESCENDING,
  ACCESSKIT_SORT_DIRECTION_OTHER,
};
#ifndef __cplusplus
typedef uint8_t accesskit_sort_direction;
#endif  // __cplusplus

enum accesskit_text_align
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_TEXT_ALIGN_LEFT,
  ACCESSKIT_TEXT_ALIGN_RIGHT,
  ACCESSKIT_TEXT_ALIGN_CENTER,
  ACCESSKIT_TEXT_ALIGN_JUSTIFY,
};
#ifndef __cplusplus
typedef uint8_t accesskit_text_align;
#endif  // __cplusplus

enum accesskit_text_decoration
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_TEXT_DECORATION_SOLID,
  ACCESSKIT_TEXT_DECORATION_DOTTED,
  ACCESSKIT_TEXT_DECORATION_DASHED,
  ACCESSKIT_TEXT_DECORATION_DOUBLE,
  ACCESSKIT_TEXT_DECORATION_WAVY,
};
#ifndef __cplusplus
typedef uint8_t accesskit_text_decoration;
#endif  // __cplusplus

enum accesskit_text_direction
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_TEXT_DIRECTION_LEFT_TO_RIGHT,
  ACCESSKIT_TEXT_DIRECTION_RIGHT_TO_LEFT,
  ACCESSKIT_TEXT_DIRECTION_TOP_TO_BOTTOM,
  ACCESSKIT_TEXT_DIRECTION_BOTTOM_TO_TOP,
};
#ifndef __cplusplus
typedef uint8_t accesskit_text_direction;
#endif  // __cplusplus

enum accesskit_toggled
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_TOGGLED_FALSE,
  ACCESSKIT_TOGGLED_TRUE,
  ACCESSKIT_TOGGLED_MIXED,
};
#ifndef __cplusplus
typedef uint8_t accesskit_toggled;
#endif  // __cplusplus

enum accesskit_vertical_offset
#ifdef __cplusplus
    : uint8_t
#endif  // __cplusplus
{
  ACCESSKIT_VERTICAL_OFFSET_SUBSCRIPT,
  ACCESSKIT_VERTICAL_OFFSET_SUPERSCRIPT,
};
#ifndef __cplusplus
typedef uint8_t accesskit_vertical_offset;
#endif  // __cplusplus

#if defined(__APPLE__)
typedef struct accesskit_macos_adapter accesskit_macos_adapter;
#endif

#if defined(__APPLE__)
typedef struct accesskit_macos_queued_events accesskit_macos_queued_events;
#endif

#if defined(__APPLE__)
typedef struct accesskit_macos_subclassing_adapter
    accesskit_macos_subclassing_adapter;
#endif

typedef struct accesskit_node accesskit_node;

typedef struct accesskit_tree accesskit_tree;

typedef struct accesskit_tree_update accesskit_tree_update;

#if (defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
     defined(__NetBSD__) || defined(__OpenBSD__))
typedef struct accesskit_unix_adapter accesskit_unix_adapter;
#endif

#if defined(_WIN32)
typedef struct accesskit_windows_adapter accesskit_windows_adapter;
#endif

#if defined(_WIN32)
typedef struct accesskit_windows_queued_events accesskit_windows_queued_events;
#endif

#if defined(_WIN32)
typedef struct accesskit_windows_subclassing_adapter
    accesskit_windows_subclassing_adapter;
#endif

typedef uint64_t accesskit_node_id;

typedef struct accesskit_node_ids {
  size_t length;
  const accesskit_node_id *values;
} accesskit_node_ids;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_node_id {
  bool has_value;
  accesskit_node_id value;
} accesskit_opt_node_id;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_double {
  bool has_value;
  double value;
} accesskit_opt_double;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_index {
  bool has_value;
  size_t value;
} accesskit_opt_index;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_color {
  bool has_value;
  uint32_t value;
} accesskit_opt_color;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_text_decoration {
  bool has_value;
  accesskit_text_decoration value;
} accesskit_opt_text_decoration;

typedef struct accesskit_lengths {
  size_t length;
  const uint8_t *values;
} accesskit_lengths;

typedef struct accesskit_opt_coords {
  bool has_value;
  size_t length;
  const float *values;
} accesskit_opt_coords;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_bool {
  bool has_value;
  bool value;
} accesskit_opt_bool;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_invalid {
  bool has_value;
  accesskit_invalid value;
} accesskit_opt_invalid;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_toggled {
  bool has_value;
  accesskit_toggled value;
} accesskit_opt_toggled;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_live {
  bool has_value;
  accesskit_live value;
} accesskit_opt_live;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_text_direction {
  bool has_value;
  accesskit_text_direction value;
} accesskit_opt_text_direction;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_orientation {
  bool has_value;
  accesskit_orientation value;
} accesskit_opt_orientation;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_sort_direction {
  bool has_value;
  accesskit_sort_direction value;
} accesskit_opt_sort_direction;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_aria_current {
  bool has_value;
  accesskit_aria_current value;
} accesskit_opt_aria_current;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_auto_complete {
  bool has_value;
  accesskit_auto_complete value;
} accesskit_opt_auto_complete;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_has_popup {
  bool has_value;
  accesskit_has_popup value;
} accesskit_opt_has_popup;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_list_style {
  bool has_value;
  accesskit_list_style value;
} accesskit_opt_list_style;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_text_align {
  bool has_value;
  accesskit_text_align value;
} accesskit_opt_text_align;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_vertical_offset {
  bool has_value;
  accesskit_vertical_offset value;
} accesskit_opt_vertical_offset;

/**
 * A 2D affine transform. Derived from
 * [kurbo](https://github.com/linebender/kurbo).
 */
typedef struct accesskit_affine {
  double _0[6];
} accesskit_affine;

/**
 * A rectangle. Derived from [kurbo](https://github.com/linebender/kurbo).
 */
typedef struct accesskit_rect {
  /**
   * The minimum x coordinate (left edge).
   */
  double x0;
  /**
   * The minimum y coordinate (top edge in y-down spaces).
   */
  double y0;
  /**
   * The maximum x coordinate (right edge).
   */
  double x1;
  /**
   * The maximum y coordinate (bottom edge in y-down spaces).
   */
  double y1;
} accesskit_rect;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_rect {
  bool has_value;
  struct accesskit_rect value;
} accesskit_opt_rect;

typedef struct accesskit_text_position {
  accesskit_node_id node;
  size_t character_index;
} accesskit_text_position;

typedef struct accesskit_text_selection {
  struct accesskit_text_position anchor;
  struct accesskit_text_position focus;
} accesskit_text_selection;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_text_selection {
  bool has_value;
  struct accesskit_text_selection value;
} accesskit_opt_text_selection;

/**
 * Use `accesskit_custom_action_new` to create this struct. Do not reallocate
 * `description`.
 *
 * When you get this struct, you are responsible for freeing `description`.
 */
typedef struct accesskit_custom_action {
  int32_t id;
  char *description;
} accesskit_custom_action;

typedef struct accesskit_custom_actions {
  size_t length;
  struct accesskit_custom_action *values;
} accesskit_custom_actions;

/**
 * A 2D point. Derived from [kurbo](https://github.com/linebender/kurbo).
 */
typedef struct accesskit_point {
  /**
   * The x coordinate.
   */
  double x;
  /**
   * The y coordinate.
   */
  double y;
} accesskit_point;

typedef enum accesskit_action_data_Tag {
  ACCESSKIT_ACTION_DATA_CUSTOM_ACTION,
  ACCESSKIT_ACTION_DATA_VALUE,
  ACCESSKIT_ACTION_DATA_NUMERIC_VALUE,
  ACCESSKIT_ACTION_DATA_SCROLL_TARGET_RECT,
  ACCESSKIT_ACTION_DATA_SCROLL_TO_POINT,
  ACCESSKIT_ACTION_DATA_SET_SCROLL_OFFSET,
  ACCESSKIT_ACTION_DATA_SET_TEXT_SELECTION,
} accesskit_action_data_Tag;

typedef struct accesskit_action_data {
  accesskit_action_data_Tag tag;
  union {
    struct {
      int32_t custom_action;
    };
    struct {
      char *value;
    };
    struct {
      double numeric_value;
    };
    struct {
      struct accesskit_rect scroll_target_rect;
    };
    struct {
      struct accesskit_point scroll_to_point;
    };
    struct {
      struct accesskit_point set_scroll_offset;
    };
    struct {
      struct accesskit_text_selection set_text_selection;
    };
  };
} accesskit_action_data;

/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_action_data {
  bool has_value;
  struct accesskit_action_data value;
} accesskit_opt_action_data;

typedef struct accesskit_action_request {
  accesskit_action action;
  accesskit_node_id target;
  struct accesskit_opt_action_data data;
} accesskit_action_request;

/**
 * A 2D vector. Derived from [kurbo](https://github.com/linebender/kurbo).
 *
 * This is intended primarily for a vector in the mathematical sense,
 * but it can be interpreted as a translation, and converted to and
 * from a point (vector relative to the origin) and size.
 */
typedef struct accesskit_vec2 {
  /**
   * The x-coordinate.
   */
  double x;
  /**
   * The y-coordinate.
   */
  double y;
} accesskit_vec2;

/**
 * A 2D size. Derived from [kurbo](https://github.com/linebender/kurbo).
 */
typedef struct accesskit_size {
  /**
   * The width.
   */
  double width;
  /**
   * The height.
   */
  double height;
} accesskit_size;

/**
 * Ownership of `request` is transferred to the callback. `request` must
 * be freed using `accesskit_action_request_free`.
 */
typedef void (*accesskit_action_handler_callback)(
    struct accesskit_action_request *request, void *userdata);

typedef void *accesskit_tree_update_factory_userdata;

/**
 * This function can't return a null pointer. Ownership of the returned value
 * will be transferred to the caller.
 */
typedef struct accesskit_tree_update *(*accesskit_tree_update_factory)(
    accesskit_tree_update_factory_userdata);

typedef struct accesskit_tree_update *(*accesskit_activation_handler_callback)(
    void *userdata);

typedef void (*accesskit_deactivation_handler_callback)(void *userdata);

#if defined(_WIN32)
/**
 * Represents an optional value.
 *
 * If `has_value` is false, do not read the `value` field.
 */
typedef struct accesskit_opt_lresult {
  bool has_value;
  LRESULT value;
} accesskit_opt_lresult;
#endif

#ifdef __cplusplus
extern "C" {
#endif  // __cplusplus

accesskit_role accesskit_node_role(const struct accesskit_node *node);

void accesskit_node_set_role(struct accesskit_node *node, accesskit_role value);

bool accesskit_node_supports_action(const struct accesskit_node *node,
                                    accesskit_action action);

void accesskit_node_add_action(struct accesskit_node *node,
                               accesskit_action action);

void accesskit_node_remove_action(struct accesskit_node *node,
                                  accesskit_action action);

void accesskit_node_clear_actions(struct accesskit_node *node);

bool accesskit_node_is_hidden(const struct accesskit_node *node);

void accesskit_node_set_hidden(struct accesskit_node *node);

void accesskit_node_clear_hidden(struct accesskit_node *node);

bool accesskit_node_is_linked(const struct accesskit_node *node);

void accesskit_node_set_linked(struct accesskit_node *node);

void accesskit_node_clear_linked(struct accesskit_node *node);

bool accesskit_node_is_multiselectable(const struct accesskit_node *node);

void accesskit_node_set_multiselectable(struct accesskit_node *node);

void accesskit_node_clear_multiselectable(struct accesskit_node *node);

bool accesskit_node_is_required(const struct accesskit_node *node);

void accesskit_node_set_required(struct accesskit_node *node);

void accesskit_node_clear_required(struct accesskit_node *node);

bool accesskit_node_is_visited(const struct accesskit_node *node);

void accesskit_node_set_visited(struct accesskit_node *node);

void accesskit_node_clear_visited(struct accesskit_node *node);

bool accesskit_node_is_busy(const struct accesskit_node *node);

void accesskit_node_set_busy(struct accesskit_node *node);

void accesskit_node_clear_busy(struct accesskit_node *node);

bool accesskit_node_is_live_atomic(const struct accesskit_node *node);

void accesskit_node_set_live_atomic(struct accesskit_node *node);

void accesskit_node_clear_live_atomic(struct accesskit_node *node);

bool accesskit_node_is_modal(const struct accesskit_node *node);

void accesskit_node_set_modal(struct accesskit_node *node);

void accesskit_node_clear_modal(struct accesskit_node *node);

bool accesskit_node_is_touch_transparent(const struct accesskit_node *node);

void accesskit_node_set_touch_transparent(struct accesskit_node *node);

void accesskit_node_clear_touch_transparent(struct accesskit_node *node);

bool accesskit_node_is_read_only(const struct accesskit_node *node);

void accesskit_node_set_read_only(struct accesskit_node *node);

void accesskit_node_clear_read_only(struct accesskit_node *node);

bool accesskit_node_is_disabled(const struct accesskit_node *node);

void accesskit_node_set_disabled(struct accesskit_node *node);

void accesskit_node_clear_disabled(struct accesskit_node *node);

bool accesskit_node_is_bold(const struct accesskit_node *node);

void accesskit_node_set_bold(struct accesskit_node *node);

void accesskit_node_clear_bold(struct accesskit_node *node);

bool accesskit_node_is_italic(const struct accesskit_node *node);

void accesskit_node_set_italic(struct accesskit_node *node);

void accesskit_node_clear_italic(struct accesskit_node *node);

bool accesskit_node_clips_children(const struct accesskit_node *node);

void accesskit_node_set_clips_children(struct accesskit_node *node);

void accesskit_node_clear_clips_children(struct accesskit_node *node);

bool accesskit_node_is_line_breaking_object(const struct accesskit_node *node);

void accesskit_node_set_is_line_breaking_object(struct accesskit_node *node);

void accesskit_node_clear_is_line_breaking_object(struct accesskit_node *node);

bool accesskit_node_is_page_breaking_object(const struct accesskit_node *node);

void accesskit_node_set_is_page_breaking_object(struct accesskit_node *node);

void accesskit_node_clear_is_page_breaking_object(struct accesskit_node *node);

bool accesskit_node_is_spelling_error(const struct accesskit_node *node);

void accesskit_node_set_is_spelling_error(struct accesskit_node *node);

void accesskit_node_clear_is_spelling_error(struct accesskit_node *node);

bool accesskit_node_is_grammar_error(const struct accesskit_node *node);

void accesskit_node_set_is_grammar_error(struct accesskit_node *node);

void accesskit_node_clear_is_grammar_error(struct accesskit_node *node);

bool accesskit_node_is_search_match(const struct accesskit_node *node);

void accesskit_node_set_is_search_match(struct accesskit_node *node);

void accesskit_node_clear_is_search_match(struct accesskit_node *node);

bool accesskit_node_is_suggestion(const struct accesskit_node *node);

void accesskit_node_set_is_suggestion(struct accesskit_node *node);

void accesskit_node_clear_is_suggestion(struct accesskit_node *node);

struct accesskit_node_ids accesskit_node_children(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_children(struct accesskit_node *node, size_t length,
                                 const accesskit_node_id *values);

void accesskit_node_push_child(struct accesskit_node *node,
                               accesskit_node_id item);

void accesskit_node_clear_children(struct accesskit_node *node);

struct accesskit_node_ids accesskit_node_controls(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_controls(struct accesskit_node *node, size_t length,
                                 const accesskit_node_id *values);

void accesskit_node_push_controlled(struct accesskit_node *node,
                                    accesskit_node_id item);

void accesskit_node_clear_controls(struct accesskit_node *node);

struct accesskit_node_ids accesskit_node_details(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_details(struct accesskit_node *node, size_t length,
                                const accesskit_node_id *values);

void accesskit_node_push_detail(struct accesskit_node *node,
                                accesskit_node_id item);

void accesskit_node_clear_details(struct accesskit_node *node);

struct accesskit_node_ids accesskit_node_described_by(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_described_by(struct accesskit_node *node, size_t length,
                                     const accesskit_node_id *values);

void accesskit_node_push_described_by(struct accesskit_node *node,
                                      accesskit_node_id item);

void accesskit_node_clear_described_by(struct accesskit_node *node);

struct accesskit_node_ids accesskit_node_flow_to(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_flow_to(struct accesskit_node *node, size_t length,
                                const accesskit_node_id *values);

void accesskit_node_push_flow_to(struct accesskit_node *node,
                                 accesskit_node_id item);

void accesskit_node_clear_flow_to(struct accesskit_node *node);

struct accesskit_node_ids accesskit_node_labelled_by(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_labelled_by(struct accesskit_node *node, size_t length,
                                    const accesskit_node_id *values);

void accesskit_node_push_labelled_by(struct accesskit_node *node,
                                     accesskit_node_id item);

void accesskit_node_clear_labelled_by(struct accesskit_node *node);

struct accesskit_node_ids accesskit_node_owns(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_owns(struct accesskit_node *node, size_t length,
                             const accesskit_node_id *values);

void accesskit_node_push_owned(struct accesskit_node *node,
                               accesskit_node_id item);

void accesskit_node_clear_owns(struct accesskit_node *node);

struct accesskit_node_ids accesskit_node_radio_group(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_radio_group(struct accesskit_node *node, size_t length,
                                    const accesskit_node_id *values);

void accesskit_node_push_to_radio_group(struct accesskit_node *node,
                                        accesskit_node_id item);

void accesskit_node_clear_radio_group(struct accesskit_node *node);

struct accesskit_opt_node_id accesskit_node_active_descendant(
    const struct accesskit_node *node);

void accesskit_node_set_active_descendant(struct accesskit_node *node,
                                          accesskit_node_id value);

void accesskit_node_clear_active_descendant(struct accesskit_node *node);

struct accesskit_opt_node_id accesskit_node_error_message(
    const struct accesskit_node *node);

void accesskit_node_set_error_message(struct accesskit_node *node,
                                      accesskit_node_id value);

void accesskit_node_clear_error_message(struct accesskit_node *node);

struct accesskit_opt_node_id accesskit_node_in_page_link_target(
    const struct accesskit_node *node);

void accesskit_node_set_in_page_link_target(struct accesskit_node *node,
                                            accesskit_node_id value);

void accesskit_node_clear_in_page_link_target(struct accesskit_node *node);

struct accesskit_opt_node_id accesskit_node_member_of(
    const struct accesskit_node *node);

void accesskit_node_set_member_of(struct accesskit_node *node,
                                  accesskit_node_id value);

void accesskit_node_clear_member_of(struct accesskit_node *node);

struct accesskit_opt_node_id accesskit_node_next_on_line(
    const struct accesskit_node *node);

void accesskit_node_set_next_on_line(struct accesskit_node *node,
                                     accesskit_node_id value);

void accesskit_node_clear_next_on_line(struct accesskit_node *node);

struct accesskit_opt_node_id accesskit_node_previous_on_line(
    const struct accesskit_node *node);

void accesskit_node_set_previous_on_line(struct accesskit_node *node,
                                         accesskit_node_id value);

void accesskit_node_clear_previous_on_line(struct accesskit_node *node);

struct accesskit_opt_node_id accesskit_node_popup_for(
    const struct accesskit_node *node);

void accesskit_node_set_popup_for(struct accesskit_node *node,
                                  accesskit_node_id value);

void accesskit_node_clear_popup_for(struct accesskit_node *node);

/**
 * Only call this function with a string that originated from AccessKit.
 */
void accesskit_string_free(char *string);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_label(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_label(struct accesskit_node *node, const char *value);

void accesskit_node_clear_label(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_description(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_description(struct accesskit_node *node,
                                    const char *value);

void accesskit_node_clear_description(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_value(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_value(struct accesskit_node *node, const char *value);

void accesskit_node_clear_value(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_access_key(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_access_key(struct accesskit_node *node,
                                   const char *value);

void accesskit_node_clear_access_key(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_author_id(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_author_id(struct accesskit_node *node,
                                  const char *value);

void accesskit_node_clear_author_id(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_class_name(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_class_name(struct accesskit_node *node,
                                   const char *value);

void accesskit_node_clear_class_name(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_font_family(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_font_family(struct accesskit_node *node,
                                    const char *value);

void accesskit_node_clear_font_family(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_html_tag(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_html_tag(struct accesskit_node *node,
                                 const char *value);

void accesskit_node_clear_html_tag(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_inner_html(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_inner_html(struct accesskit_node *node,
                                   const char *value);

void accesskit_node_clear_inner_html(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_keyboard_shortcut(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_keyboard_shortcut(struct accesskit_node *node,
                                          const char *value);

void accesskit_node_clear_keyboard_shortcut(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_language(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_language(struct accesskit_node *node,
                                 const char *value);

void accesskit_node_clear_language(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_placeholder(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_placeholder(struct accesskit_node *node,
                                    const char *value);

void accesskit_node_clear_placeholder(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_role_description(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_role_description(struct accesskit_node *node,
                                         const char *value);

void accesskit_node_clear_role_description(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_state_description(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_state_description(struct accesskit_node *node,
                                          const char *value);

void accesskit_node_clear_state_description(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_tooltip(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_tooltip(struct accesskit_node *node, const char *value);

void accesskit_node_clear_tooltip(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_url(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_url(struct accesskit_node *node, const char *value);

void accesskit_node_clear_url(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_row_index_text(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_row_index_text(struct accesskit_node *node,
                                       const char *value);

void accesskit_node_clear_row_index_text(struct accesskit_node *node);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_node_column_index_text(const struct accesskit_node *node);

/**
 * Caller is responsible for freeing the memory pointed by `value`.
 */
void accesskit_node_set_column_index_text(struct accesskit_node *node,
                                          const char *value);

void accesskit_node_clear_column_index_text(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_scroll_x(
    const struct accesskit_node *node);

void accesskit_node_set_scroll_x(struct accesskit_node *node, double value);

void accesskit_node_clear_scroll_x(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_scroll_x_min(
    const struct accesskit_node *node);

void accesskit_node_set_scroll_x_min(struct accesskit_node *node, double value);

void accesskit_node_clear_scroll_x_min(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_scroll_x_max(
    const struct accesskit_node *node);

void accesskit_node_set_scroll_x_max(struct accesskit_node *node, double value);

void accesskit_node_clear_scroll_x_max(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_scroll_y(
    const struct accesskit_node *node);

void accesskit_node_set_scroll_y(struct accesskit_node *node, double value);

void accesskit_node_clear_scroll_y(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_scroll_y_min(
    const struct accesskit_node *node);

void accesskit_node_set_scroll_y_min(struct accesskit_node *node, double value);

void accesskit_node_clear_scroll_y_min(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_scroll_y_max(
    const struct accesskit_node *node);

void accesskit_node_set_scroll_y_max(struct accesskit_node *node, double value);

void accesskit_node_clear_scroll_y_max(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_numeric_value(
    const struct accesskit_node *node);

void accesskit_node_set_numeric_value(struct accesskit_node *node,
                                      double value);

void accesskit_node_clear_numeric_value(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_min_numeric_value(
    const struct accesskit_node *node);

void accesskit_node_set_min_numeric_value(struct accesskit_node *node,
                                          double value);

void accesskit_node_clear_min_numeric_value(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_max_numeric_value(
    const struct accesskit_node *node);

void accesskit_node_set_max_numeric_value(struct accesskit_node *node,
                                          double value);

void accesskit_node_clear_max_numeric_value(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_numeric_value_step(
    const struct accesskit_node *node);

void accesskit_node_set_numeric_value_step(struct accesskit_node *node,
                                           double value);

void accesskit_node_clear_numeric_value_step(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_numeric_value_jump(
    const struct accesskit_node *node);

void accesskit_node_set_numeric_value_jump(struct accesskit_node *node,
                                           double value);

void accesskit_node_clear_numeric_value_jump(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_font_size(
    const struct accesskit_node *node);

void accesskit_node_set_font_size(struct accesskit_node *node, double value);

void accesskit_node_clear_font_size(struct accesskit_node *node);

struct accesskit_opt_double accesskit_node_font_weight(
    const struct accesskit_node *node);

void accesskit_node_set_font_weight(struct accesskit_node *node, double value);

void accesskit_node_clear_font_weight(struct accesskit_node *node);

struct accesskit_opt_index accesskit_node_row_count(
    const struct accesskit_node *node);

void accesskit_node_set_row_count(struct accesskit_node *node, size_t value);

void accesskit_node_clear_row_count(struct accesskit_node *node);

struct accesskit_opt_index accesskit_node_column_count(
    const struct accesskit_node *node);

void accesskit_node_set_column_count(struct accesskit_node *node, size_t value);

void accesskit_node_clear_column_count(struct accesskit_node *node);

struct accesskit_opt_index accesskit_node_row_index(
    const struct accesskit_node *node);

void accesskit_node_set_row_index(struct accesskit_node *node, size_t value);

void accesskit_node_clear_row_index(struct accesskit_node *node);

struct accesskit_opt_index accesskit_node_column_index(
    const struct accesskit_node *node);

void accesskit_node_set_column_index(struct accesskit_node *node, size_t value);

void accesskit_node_clear_column_index(struct accesskit_node *node);

struct accesskit_opt_index accesskit_node_row_span(
    const struct accesskit_node *node);

void accesskit_node_set_row_span(struct accesskit_node *node, size_t value);

void accesskit_node_clear_row_span(struct accesskit_node *node);

struct accesskit_opt_index accesskit_node_column_span(
    const struct accesskit_node *node);

void accesskit_node_set_column_span(struct accesskit_node *node, size_t value);

void accesskit_node_clear_column_span(struct accesskit_node *node);

struct accesskit_opt_index accesskit_node_level(
    const struct accesskit_node *node);

void accesskit_node_set_level(struct accesskit_node *node, size_t value);

void accesskit_node_clear_level(struct accesskit_node *node);

struct accesskit_opt_index accesskit_node_size_of_set(
    const struct accesskit_node *node);

void accesskit_node_set_size_of_set(struct accesskit_node *node, size_t value);

void accesskit_node_clear_size_of_set(struct accesskit_node *node);

struct accesskit_opt_index accesskit_node_position_in_set(
    const struct accesskit_node *node);

void accesskit_node_set_position_in_set(struct accesskit_node *node,
                                        size_t value);

void accesskit_node_clear_position_in_set(struct accesskit_node *node);

struct accesskit_opt_color accesskit_node_color_value(
    const struct accesskit_node *node);

void accesskit_node_set_color_value(struct accesskit_node *node,
                                    uint32_t value);

void accesskit_node_clear_color_value(struct accesskit_node *node);

struct accesskit_opt_color accesskit_node_background_color(
    const struct accesskit_node *node);

void accesskit_node_set_background_color(struct accesskit_node *node,
                                         uint32_t value);

void accesskit_node_clear_background_color(struct accesskit_node *node);

struct accesskit_opt_color accesskit_node_foreground_color(
    const struct accesskit_node *node);

void accesskit_node_set_foreground_color(struct accesskit_node *node,
                                         uint32_t value);

void accesskit_node_clear_foreground_color(struct accesskit_node *node);

struct accesskit_opt_text_decoration accesskit_node_overline(
    const struct accesskit_node *node);

void accesskit_node_set_overline(struct accesskit_node *node,
                                 accesskit_text_decoration value);

void accesskit_node_clear_overline(struct accesskit_node *node);

struct accesskit_opt_text_decoration accesskit_node_strikethrough(
    const struct accesskit_node *node);

void accesskit_node_set_strikethrough(struct accesskit_node *node,
                                      accesskit_text_decoration value);

void accesskit_node_clear_strikethrough(struct accesskit_node *node);

struct accesskit_opt_text_decoration accesskit_node_underline(
    const struct accesskit_node *node);

void accesskit_node_set_underline(struct accesskit_node *node,
                                  accesskit_text_decoration value);

void accesskit_node_clear_underline(struct accesskit_node *node);

struct accesskit_lengths accesskit_node_character_lengths(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_character_lengths(struct accesskit_node *node,
                                          size_t length, const uint8_t *values);

void accesskit_node_clear_character_lengths(struct accesskit_node *node);

struct accesskit_lengths accesskit_node_word_lengths(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_word_lengths(struct accesskit_node *node, size_t length,
                                     const uint8_t *values);

void accesskit_node_clear_word_lengths(struct accesskit_node *node);

struct accesskit_opt_coords accesskit_node_character_positions(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_character_positions(struct accesskit_node *node,
                                            size_t length, const float *values);

void accesskit_node_clear_character_positions(struct accesskit_node *node);

struct accesskit_opt_coords accesskit_node_character_widths(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_character_widths(struct accesskit_node *node,
                                         size_t length, const float *values);

void accesskit_node_clear_character_widths(struct accesskit_node *node);

struct accesskit_opt_bool accesskit_node_is_expanded(
    const struct accesskit_node *node);

void accesskit_node_set_expanded(struct accesskit_node *node, bool value);

void accesskit_node_clear_expanded(struct accesskit_node *node);

struct accesskit_opt_bool accesskit_node_is_selected(
    const struct accesskit_node *node);

void accesskit_node_set_selected(struct accesskit_node *node, bool value);

void accesskit_node_clear_selected(struct accesskit_node *node);

struct accesskit_opt_invalid accesskit_node_invalid(
    const struct accesskit_node *node);

void accesskit_node_set_invalid(struct accesskit_node *node,
                                accesskit_invalid value);

void accesskit_node_clear_invalid(struct accesskit_node *node);

struct accesskit_opt_toggled accesskit_node_toggled(
    const struct accesskit_node *node);

void accesskit_node_set_toggled(struct accesskit_node *node,
                                accesskit_toggled value);

void accesskit_node_clear_toggled(struct accesskit_node *node);

struct accesskit_opt_live accesskit_node_live(
    const struct accesskit_node *node);

void accesskit_node_set_live(struct accesskit_node *node, accesskit_live value);

void accesskit_node_clear_live(struct accesskit_node *node);

struct accesskit_opt_text_direction accesskit_node_text_direction(
    const struct accesskit_node *node);

void accesskit_node_set_text_direction(struct accesskit_node *node,
                                       accesskit_text_direction value);

void accesskit_node_clear_text_direction(struct accesskit_node *node);

struct accesskit_opt_orientation accesskit_node_orientation(
    const struct accesskit_node *node);

void accesskit_node_set_orientation(struct accesskit_node *node,
                                    accesskit_orientation value);

void accesskit_node_clear_orientation(struct accesskit_node *node);

struct accesskit_opt_sort_direction accesskit_node_sort_direction(
    const struct accesskit_node *node);

void accesskit_node_set_sort_direction(struct accesskit_node *node,
                                       accesskit_sort_direction value);

void accesskit_node_clear_sort_direction(struct accesskit_node *node);

struct accesskit_opt_aria_current accesskit_node_aria_current(
    const struct accesskit_node *node);

void accesskit_node_set_aria_current(struct accesskit_node *node,
                                     accesskit_aria_current value);

void accesskit_node_clear_aria_current(struct accesskit_node *node);

struct accesskit_opt_auto_complete accesskit_node_auto_complete(
    const struct accesskit_node *node);

void accesskit_node_set_auto_complete(struct accesskit_node *node,
                                      accesskit_auto_complete value);

void accesskit_node_clear_auto_complete(struct accesskit_node *node);

struct accesskit_opt_has_popup accesskit_node_has_popup(
    const struct accesskit_node *node);

void accesskit_node_set_has_popup(struct accesskit_node *node,
                                  accesskit_has_popup value);

void accesskit_node_clear_has_popup(struct accesskit_node *node);

struct accesskit_opt_list_style accesskit_node_list_style(
    const struct accesskit_node *node);

void accesskit_node_set_list_style(struct accesskit_node *node,
                                   accesskit_list_style value);

void accesskit_node_clear_list_style(struct accesskit_node *node);

struct accesskit_opt_text_align accesskit_node_text_align(
    const struct accesskit_node *node);

void accesskit_node_set_text_align(struct accesskit_node *node,
                                   accesskit_text_align value);

void accesskit_node_clear_text_align(struct accesskit_node *node);

struct accesskit_opt_vertical_offset accesskit_node_vertical_offset(
    const struct accesskit_node *node);

void accesskit_node_set_vertical_offset(struct accesskit_node *node,
                                        accesskit_vertical_offset value);

void accesskit_node_clear_vertical_offset(struct accesskit_node *node);

const struct accesskit_affine *accesskit_node_transform(
    const struct accesskit_node *node);

void accesskit_node_set_transform(struct accesskit_node *node,
                                  struct accesskit_affine value);

void accesskit_node_clear_transform(struct accesskit_node *node);

struct accesskit_opt_rect accesskit_node_bounds(
    const struct accesskit_node *node);

void accesskit_node_set_bounds(struct accesskit_node *node,
                               struct accesskit_rect value);

void accesskit_node_clear_bounds(struct accesskit_node *node);

struct accesskit_opt_text_selection accesskit_node_text_selection(
    const struct accesskit_node *node);

void accesskit_node_set_text_selection(struct accesskit_node *node,
                                       struct accesskit_text_selection value);

void accesskit_node_clear_text_selection(struct accesskit_node *node);

struct accesskit_custom_action accesskit_custom_action_new(
    int32_t id, const char *description);

void accesskit_custom_actions_free(struct accesskit_custom_actions *value);

/**
 * Caller is responsible for freeing the returned value.
 */
const struct accesskit_custom_actions *accesskit_node_custom_actions(
    const struct accesskit_node *node);

/**
 * Caller is responsible for freeing `values`.
 */
void accesskit_node_set_custom_actions(
    struct accesskit_node *node, size_t length,
    const struct accesskit_custom_action *values);

void accesskit_node_push_custom_action(struct accesskit_node *node,
                                       struct accesskit_custom_action item);

void accesskit_node_clear_custom_actions(struct accesskit_node *node);

struct accesskit_node *accesskit_node_new(accesskit_role role);

void accesskit_node_free(struct accesskit_node *node);

struct accesskit_tree *accesskit_tree_new(accesskit_node_id root);

void accesskit_tree_free(struct accesskit_tree *tree);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_tree_get_toolkit_name(const struct accesskit_tree *tree);

void accesskit_tree_set_toolkit_name(struct accesskit_tree *tree,
                                     const char *toolkit_name);

void accesskit_tree_clear_toolkit_name(struct accesskit_tree *tree);

/**
 * Caller must call `accesskit_string_free` with the return value.
 */
char *accesskit_tree_get_toolkit_version(const struct accesskit_tree *tree);

void accesskit_tree_set_toolkit_version(struct accesskit_tree *tree,
                                        const char *toolkit_version);

void accesskit_tree_clear_toolkit_version(struct accesskit_tree *tree);

struct accesskit_tree_update *accesskit_tree_update_with_focus(
    accesskit_node_id focus);

struct accesskit_tree_update *accesskit_tree_update_with_capacity_and_focus(
    size_t capacity, accesskit_node_id focus);

void accesskit_tree_update_free(struct accesskit_tree_update *update);

/**
 * Appends the provided node to the tree update's list of nodes.
 * Takes ownership of `node`.
 */
void accesskit_tree_update_push_node(struct accesskit_tree_update *update,
                                     accesskit_node_id id,
                                     struct accesskit_node *node);

void accesskit_tree_update_set_tree(struct accesskit_tree_update *update,
                                    struct accesskit_tree *tree);

void accesskit_tree_update_clear_tree(struct accesskit_tree_update *update);

void accesskit_tree_update_set_focus(struct accesskit_tree_update *update,
                                     accesskit_node_id focus);

void accesskit_action_request_free(struct accesskit_action_request *request);

struct accesskit_affine accesskit_affine_identity(void);

struct accesskit_affine accesskit_affine_flip_y(void);

struct accesskit_affine accesskit_affine_flip_x(void);

struct accesskit_affine accesskit_affine_scale(double s);

struct accesskit_affine accesskit_affine_scale_non_uniform(double s_x,
                                                           double s_y);

struct accesskit_affine accesskit_affine_translate(struct accesskit_vec2 p);

struct accesskit_affine accesskit_affine_map_unit_square(
    struct accesskit_rect rect);

double accesskit_affine_determinant(struct accesskit_affine affine);

struct accesskit_affine accesskit_affine_inverse(
    struct accesskit_affine affine);

struct accesskit_rect accesskit_affine_transform_rect_bbox(
    struct accesskit_affine affine, struct accesskit_rect rect);

bool accesskit_affine_is_finite(const struct accesskit_affine *affine);

bool accesskit_affine_is_nan(const struct accesskit_affine *affine);

struct accesskit_vec2 accesskit_point_to_vec2(struct accesskit_point point);

struct accesskit_rect accesskit_rect_from_points(struct accesskit_point p0,
                                                 struct accesskit_point p1);

struct accesskit_rect accesskit_rect_from_origin_size(
    struct accesskit_point origin, struct accesskit_size size);

struct accesskit_rect accesskit_rect_with_origin(struct accesskit_rect rect,
                                                 struct accesskit_point origin);

struct accesskit_rect accesskit_rect_with_size(struct accesskit_rect rect,
                                               struct accesskit_size size);

double accesskit_rect_width(const struct accesskit_rect *rect);

double accesskit_rect_height(const struct accesskit_rect *rect);

double accesskit_rect_min_x(const struct accesskit_rect *rect);

double accesskit_rect_max_x(const struct accesskit_rect *rect);

double accesskit_rect_min_y(const struct accesskit_rect *rect);

double accesskit_rect_max_y(const struct accesskit_rect *rect);

struct accesskit_point accesskit_rect_origin(const struct accesskit_rect *rect);

struct accesskit_size accesskit_rect_size(const struct accesskit_rect *rect);

struct accesskit_rect accesskit_rect_abs(const struct accesskit_rect *rect);

double accesskit_rect_area(const struct accesskit_rect *rect);

bool accesskit_rect_is_empty(const struct accesskit_rect *rect);

bool accesskit_rect_contains(const struct accesskit_rect *rect,
                             struct accesskit_point point);

struct accesskit_rect accesskit_rect_union(const struct accesskit_rect *rect,
                                           struct accesskit_rect other);

struct accesskit_rect accesskit_rect_union_pt(const struct accesskit_rect *rect,
                                              struct accesskit_point pt);

struct accesskit_rect accesskit_rect_intersect(
    const struct accesskit_rect *rect, struct accesskit_rect other);

struct accesskit_vec2 accesskit_size_to_vec2(struct accesskit_size size);

struct accesskit_point accesskit_vec2_to_point(struct accesskit_vec2 vec2);

struct accesskit_size accesskit_vec2_to_size(struct accesskit_vec2 vec2);

#if defined(__APPLE__)
/**
 * Memory is also freed when calling this function.
 */
void accesskit_macos_queued_events_raise(
    struct accesskit_macos_queued_events *events);
#endif

#if defined(__APPLE__)
/**
 * # Safety
 *
 * `view` must be a valid, unreleased pointer to an `NSView`.
 */
struct accesskit_macos_adapter *accesskit_macos_adapter_new(
    void *view, bool is_view_focused,
    accesskit_action_handler_callback action_handler,
    void *action_handler_userdata);
#endif

#if defined(__APPLE__)
void accesskit_macos_adapter_free(struct accesskit_macos_adapter *adapter);
#endif

#if defined(__APPLE__)
/**
 * You must call `accesskit_macos_queued_events_raise` on the returned pointer.
 * It can be null if the adapter is not active.
 */
struct accesskit_macos_queued_events *accesskit_macos_adapter_update_if_active(
    struct accesskit_macos_adapter *adapter,
    accesskit_tree_update_factory update_factory,
    void *update_factory_userdata);
#endif

#if defined(__APPLE__)
/**
 * Update the tree state based on whether the window is focused.
 *
 * You must call `accesskit_macos_queued_events_raise` on the returned pointer.
 * It can be null if the adapter is not active.
 */
struct accesskit_macos_queued_events *
accesskit_macos_adapter_update_view_focus_state(
    struct accesskit_macos_adapter *adapter, bool is_focused);
#endif

#if defined(__APPLE__)
/**
 * Returns a pointer to an `NSArray`. Ownership of the pointer is not
 * transferred.
 */
void *accesskit_macos_adapter_view_children(
    struct accesskit_macos_adapter *adapter,
    accesskit_activation_handler_callback activation_handler,
    void *activation_handler_userdata);
#endif

#if defined(__APPLE__)
/**
 * Returns a pointer to an `NSObject`. Ownership of the pointer is not
 * transferred.
 */
void *accesskit_macos_adapter_focus(
    struct accesskit_macos_adapter *adapter,
    accesskit_activation_handler_callback activation_handler,
    void *activation_handler_userdata);
#endif

#if defined(__APPLE__)
/**
 * Returns a pointer to an `NSObject`. Ownership of the pointer is not
 * transferred.
 */
void *accesskit_macos_adapter_hit_test(
    struct accesskit_macos_adapter *adapter, double x, double y,
    accesskit_activation_handler_callback activation_handler,
    void *activation_handler_userdata);
#endif

#if defined(__APPLE__)
/**
 * # Safety
 *
 * `view` must be a valid, unreleased pointer to an `NSView`.
 */
struct accesskit_macos_subclassing_adapter *
accesskit_macos_subclassing_adapter_new(
    void *view, accesskit_activation_handler_callback activation_handler,
    void *activation_handler_userdata,
    accesskit_action_handler_callback action_handler,
    void *action_handler_userdata);
#endif

#if defined(__APPLE__)
/**
 * # Safety
 *
 * `window` must be a valid, unreleased pointer to an `NSWindow`.
 *
 * # Panics
 *
 * This function panics if the specified window doesn't currently have
 * a content view.
 */
struct accesskit_macos_subclassing_adapter *
accesskit_macos_subclassing_adapter_for_window(
    void *window, accesskit_activation_handler_callback activation_handler,
    void *activation_handler_userdata,
    accesskit_action_handler_callback action_handler,
    void *action_handler_userdata);
#endif

#if defined(__APPLE__)
void accesskit_macos_subclassing_adapter_free(
    struct accesskit_macos_subclassing_adapter *adapter);
#endif

#if defined(__APPLE__)
/**
 * You must call `accesskit_macos_queued_events_raise` on the returned pointer.
 * It can be null if the adapter is not active.
 */
struct accesskit_macos_queued_events *
accesskit_macos_subclassing_adapter_update_if_active(
    struct accesskit_macos_subclassing_adapter *adapter,
    accesskit_tree_update_factory update_factory,
    void *update_factory_userdata);
#endif

#if defined(__APPLE__)
/**
 * Update the tree state based on whether the window is focused.
 *
 * You must call `accesskit_macos_queued_events_raise` on the returned pointer.
 * It can be null if the adapter is not active.
 */
struct accesskit_macos_queued_events *
accesskit_macos_subclassing_adapter_update_view_focus_state(
    struct accesskit_macos_subclassing_adapter *adapter, bool is_focused);
#endif

#if defined(__APPLE__)
/**
 * Modifies the specified class, which must be a subclass of `NSWindow`,
 * to include an `accessibilityFocusedUIElement` method that calls
 * the corresponding method on the window's content view. This is needed
 * for windowing libraries such as SDL that place the keyboard focus
 * directly on the window rather than the content view.
 *
 * # Safety
 *
 * This function is declared unsafe because the caller must ensure that the
 * code for this library is never unloaded from the application process,
 * since it's not possible to reverse this operation. It's safest
 * if this library is statically linked into the application's main executable.
 * Also, this function assumes that the specified class is a subclass
 * of `NSWindow`.
 */
void accesskit_macos_add_focus_forwarder_to_window_class(
    const char *class_name);
#endif

#if (defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
     defined(__NetBSD__) || defined(__OpenBSD__))
/**
 * All of the handlers will always be called from another thread.
 */
struct accesskit_unix_adapter *accesskit_unix_adapter_new(
    accesskit_activation_handler_callback activation_handler,
    void *activation_handler_userdata,
    accesskit_action_handler_callback action_handler,
    void *action_handler_userdata,
    accesskit_deactivation_handler_callback deactivation_handler,
    void *deactivation_handler_userdata);
#endif

#if (defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
     defined(__NetBSD__) || defined(__OpenBSD__))
void accesskit_unix_adapter_free(struct accesskit_unix_adapter *adapter);
#endif

#if (defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
     defined(__NetBSD__) || defined(__OpenBSD__))
void accesskit_unix_adapter_set_root_window_bounds(
    struct accesskit_unix_adapter *adapter, struct accesskit_rect outer,
    struct accesskit_rect inner);
#endif

#if (defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
     defined(__NetBSD__) || defined(__OpenBSD__))
void accesskit_unix_adapter_update_if_active(
    struct accesskit_unix_adapter *adapter,
    accesskit_tree_update_factory update_factory,
    void *update_factory_userdata);
#endif

#if (defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
     defined(__NetBSD__) || defined(__OpenBSD__))
/**
 * Update the tree state based on whether the window is focused.
 */
void accesskit_unix_adapter_update_window_focus_state(
    struct accesskit_unix_adapter *adapter, bool is_focused);
#endif

#if defined(_WIN32)
/**
 * Memory is also freed when calling this function.
 */
void accesskit_windows_queued_events_raise(
    struct accesskit_windows_queued_events *events);
#endif

#if defined(_WIN32)
struct accesskit_windows_adapter *accesskit_windows_adapter_new(
    HWND hwnd, bool is_window_focused,
    accesskit_action_handler_callback action_handler,
    void *action_handler_userdata);
#endif

#if defined(_WIN32)
void accesskit_windows_adapter_free(struct accesskit_windows_adapter *adapter);
#endif

#if defined(_WIN32)
/**
 * You must call `accesskit_windows_queued_events_raise` on the returned
 * pointer. It can be null if the adapter is not active.
 */
struct accesskit_windows_queued_events *
accesskit_windows_adapter_update_if_active(
    struct accesskit_windows_adapter *adapter,
    accesskit_tree_update_factory update_factory,
    void *update_factory_userdata);
#endif

#if defined(_WIN32)
/**
 * Update the tree state based on whether the window is focused.
 *
 * You must call `accesskit_windows_queued_events_raise` on the returned
 * pointer.
 */
struct accesskit_windows_queued_events *
accesskit_windows_adapter_update_window_focus_state(
    struct accesskit_windows_adapter *adapter, bool is_focused);
#endif

#if defined(_WIN32)
struct accesskit_opt_lresult accesskit_windows_adapter_handle_wm_getobject(
    struct accesskit_windows_adapter *adapter, WPARAM wparam, LPARAM lparam,
    accesskit_activation_handler_callback activation_handler,
    void *activation_handler_userdata);
#endif

#if defined(_WIN32)
/**
 * Creates a new Windows platform adapter using window subclassing.
 * This must be done before the window is shown or focused
 * for the first time.
 *
 * This must be called on the thread that owns the window. The activation
 * handler will always be called on that thread. The action handler
 * may or may not be called on that thread.
 *
 * # Panics
 *
 * Panics if the window is already visible.
 */
struct accesskit_windows_subclassing_adapter *
accesskit_windows_subclassing_adapter_new(
    HWND hwnd, accesskit_activation_handler_callback activation_handler,
    void *activation_handler_userdata,
    accesskit_action_handler_callback action_handler,
    void *action_handler_userdata);
#endif

#if defined(_WIN32)
void accesskit_windows_subclassing_adapter_free(
    struct accesskit_windows_subclassing_adapter *adapter);
#endif

#if defined(_WIN32)
/**
 * You must call `accesskit_windows_queued_events_raise` on the returned
 * pointer. It can be null if the adapter is not active.
 */
struct accesskit_windows_queued_events *
accesskit_windows_subclassing_adapter_update_if_active(
    struct accesskit_windows_subclassing_adapter *adapter,
    accesskit_tree_update_factory update_factory,
    void *update_factory_userdata);
#endif

#ifdef __cplusplus
}  // extern "C"
#endif  // __cplusplus

#endif /* ACCESSKIT_H */