# This file has been autogenerated by the pywayland scanner

# Copyright 2014 © Stephen "Lyude" Chandler Paul
# Copyright 2015-2024 © Red Hat, Inc.
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice (including the
# next paragraph) shall be included in all copies or substantial
# portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

from __future__ import annotations

import enum

from pywayland.protocol_core import Argument, ArgumentType, Global, Interface, Proxy, Resource

from .wayland import WlSeat
from .wayland import WlSeatProxy
from .wayland import WlSurface
from .wayland import WlSurfaceProxy


class ZwpTabletManagerV2(Interface):
    """Controller object for graphic tablet devices

    An object that provides access to the graphics tablets available on this
    system. All tablets are associated with a seat, to get access to the actual
    tablets, use :func:`ZwpTabletManagerV2.get_tablet_seat()`.
    """

    name = "zwp_tablet_manager_v2"
    version = 2


class ZwpTabletPadDialV2(Interface):
    """Pad dial

    A rotary control, e.g. a dial or a wheel.

    Events on a dial are logically grouped by the
    :func:`ZwpTabletPadDialV2.frame()` event.
    """

    name = "zwp_tablet_pad_dial_v2"
    version = 2


class ZwpTabletPadGroupV2(Interface):
    """A set of buttons, rings and strips

    A pad group describes a distinct (sub)set of buttons, rings and strips
    present in the tablet. The criteria of this grouping is usually positional,
    eg. if a tablet has buttons on the left and right side, 2 groups will be
    presented. The physical arrangement of groups is undisclosed and may change
    on the fly.

    Pad groups will announce their features during pad initialization. Between
    the corresponding :func:`ZwpTabletPadV2.group()
    <pywayland.protocol.tablet_v2.ZwpTabletPadV2.group>` event and
    :func:`ZwpTabletPadGroupV2.done()`, the pad group will announce the
    buttons, rings and strips contained in it, plus the number of supported
    modes.

    Modes are a mechanism to allow multiple groups of actions for every element
    in the pad group. The number of groups and available modes in each is
    persistent across device plugs. The current mode is user-switchable, it
    will be announced through the :func:`ZwpTabletPadGroupV2.mode_switch()`
    event both whenever it is switched, and after :func:`ZwpTabletPadV2.enter()
    <pywayland.protocol.tablet_v2.ZwpTabletPadV2.enter>`.

    The current mode logically applies to all elements in the pad group,
    although it is at clients' discretion whether to actually perform different
    actions, and/or issue the respective .set_feedback requests to notify the
    compositor. See the :func:`ZwpTabletPadGroupV2.mode_switch()` event for
    more details.
    """

    name = "zwp_tablet_pad_group_v2"
    version = 2


class ZwpTabletPadRingV2(Interface):
    """Pad ring

    A circular interaction area, such as the touch ring on the Wacom Intuos Pro
    series tablets.

    Events on a ring are logically grouped by the
    :func:`ZwpTabletPadRingV2.frame()` event.
    """

    name = "zwp_tablet_pad_ring_v2"
    version = 2

    class source(enum.IntEnum):
        finger = 1


class ZwpTabletPadStripV2(Interface):
    """Pad strip

    A linear interaction area, such as the strips found in Wacom Cintiq models.

    Events on a strip are logically grouped by the
    :func:`ZwpTabletPadStripV2.frame()` event.
    """

    name = "zwp_tablet_pad_strip_v2"
    version = 2

    class source(enum.IntEnum):
        finger = 1


class ZwpTabletPadV2(Interface):
    """A set of buttons, rings, strips and dials

    A pad device is a set of buttons, rings, strips and dials usually
    physically present on the tablet device itself. Some exceptions exist where
    the pad device is physically detached, e.g. the Wacom ExpressKey Remote.

    Pad devices have no axes that control the cursor and are generally
    auxiliary devices to the tool devices used on the tablet surface.

    A pad device has a number of static characteristics, e.g. the number of
    rings. These capabilities are sent in an event sequence after the
    :func:`ZwpTabletSeatV2.pad_added()
    <pywayland.protocol.tablet_v2.ZwpTabletSeatV2.pad_added>` event before any
    actual events from this pad. This initial event sequence is terminated by a
    :func:`ZwpTabletPadV2.done()` event.

    All pad features (buttons, rings, strips and dials) are logically divided
    into groups and all pads have at least one group. The available groups are
    notified through the :func:`ZwpTabletPadV2.group()` event; the compositor
    will emit one event per group before emitting
    :func:`ZwpTabletPadV2.done()`.

    Groups may have multiple modes. Modes allow clients to map multiple actions
    to a single pad feature. Only one mode can be active per group, although
    different groups may have different active modes.
    """

    name = "zwp_tablet_pad_v2"
    version = 2

    class button_state(enum.IntEnum):
        released = 0
        pressed = 1


class ZwpTabletSeatV2(Interface):
    """Controller object for graphic tablet devices of a seat

    An object that provides access to the graphics tablets available on this
    seat. After binding to this interface, the compositor sends a set of
    :func:`ZwpTabletSeatV2.tablet_added()` and
    :func:`ZwpTabletSeatV2.tool_added()` events.
    """

    name = "zwp_tablet_seat_v2"
    version = 2


class ZwpTabletToolV2(Interface):
    """A physical tablet tool

    An object that represents a physical tool that has been, or is currently in
    use with a tablet in this seat. Each :class:`ZwpTabletToolV2` object stays
    valid until the client destroys it; the compositor reuses the
    :class:`ZwpTabletToolV2` object to indicate that the object's respective
    physical tool has come into proximity of a tablet again.

    A :class:`ZwpTabletToolV2` object's relation to a physical tool depends on
    the tablet's ability to report serial numbers. If the tablet supports this
    capability, then the object represents a specific physical tool and can be
    identified even when used on multiple tablets.

    A tablet tool has a number of static characteristics, e.g. tool type,
    hardware_serial and capabilities. These capabilities are sent in an event
    sequence after the :func:`ZwpTabletSeatV2.tool_added()
    <pywayland.protocol.tablet_v2.ZwpTabletSeatV2.tool_added>` event before any
    actual events from this tool. This initial event sequence is terminated by
    a :func:`ZwpTabletToolV2.done()` event.

    Tablet tool events are grouped by :func:`ZwpTabletToolV2.frame()` events.
    Any events received before a :func:`ZwpTabletToolV2.frame()` event should
    be considered part of the same hardware state change.
    """

    name = "zwp_tablet_tool_v2"
    version = 2

    class type(enum.IntEnum):
        pen = 0x140
        eraser = 0x141
        brush = 0x142
        pencil = 0x143
        airbrush = 0x144
        finger = 0x145
        mouse = 0x146
        lens = 0x147

    class capability(enum.IntEnum):
        tilt = 1
        pressure = 2
        distance = 3
        rotation = 4
        slider = 5
        wheel = 6

    class button_state(enum.IntEnum):
        released = 0
        pressed = 1

    class error(enum.IntEnum):
        role = 0


class ZwpTabletV2(Interface):
    """Graphics tablet device

    The :class:`ZwpTabletV2` interface represents one graphics tablet device.
    The tablet interface itself does not generate events; all events are
    generated by :class:`~pywayland.protocol.tablet_v2.ZwpTabletToolV2` objects
    when in proximity above a tablet.

    A tablet has a number of static characteristics, e.g. device name and
    pid/vid. These capabilities are sent in an event sequence after the
    :func:`ZwpTabletSeatV2.tablet_added()
    <pywayland.protocol.tablet_v2.ZwpTabletSeatV2.tablet_added>` event. This
    initial event sequence is terminated by a :func:`ZwpTabletV2.done()` event.
    """

    name = "zwp_tablet_v2"
    version = 2

    class bustype(enum.IntEnum):
        usb = 3
        bluetooth = 5
        virtual = 6
        serial = 17
        i2c = 24


class ZwpTabletManagerV2Resource(Resource[ZwpTabletManagerV2]):
    interface = ZwpTabletManagerV2


class ZwpTabletPadDialV2Resource(Resource[ZwpTabletPadDialV2]):
    interface = ZwpTabletPadDialV2

    @ZwpTabletPadDialV2.event(
        Argument(ArgumentType.Int),
    )
    def delta(self, value120: int) -> None:
        """Delta movement

        Sent whenever the position on a dial changes.

        This event carries the wheel delta as multiples or fractions of 120
        with each multiple of 120 representing one logical wheel detent. For
        example, an axis_value120 of 30 is one quarter of a logical wheel step
        in the positive direction, a value120 of -240 are two logical wheel
        steps in the negative direction within the same hardware event. See the
        :class:`~pywayland.protocol.wayland.WlPointer`.axis_value120 for more
        details.

        The value120 must not be zero.

        :param value120:
            rotation distance as fraction of 120
        :type value120:
            `ArgumentType.Int`
        """
        self._post_event(0, value120)

    @ZwpTabletPadDialV2.event(
        Argument(ArgumentType.Uint),
    )
    def frame(self, time: int) -> None:
        """End of a dial event sequence

        Indicates the end of a set of events that represent one logical
        hardware dial event. A client is expected to accumulate the data in all
        events within the frame before proceeding.

        All :class:`ZwpTabletPadDialV2` events before a
        :func:`ZwpTabletPadDialV2.frame()` event belong logically together.

        A :func:`ZwpTabletPadDialV2.frame()` event is sent for every logical
        event group, even if the group only contains a single
        :class:`ZwpTabletPadDialV2` event. Specifically, a client may get a
        sequence: delta, frame, delta, frame, etc.

        :param time:
            timestamp with millisecond granularity
        :type time:
            `ArgumentType.Uint`
        """
        self._post_event(1, time)


class ZwpTabletPadGroupV2Resource(Resource[ZwpTabletPadGroupV2]):
    interface = ZwpTabletPadGroupV2

    @ZwpTabletPadGroupV2.event(
        Argument(ArgumentType.Array),
    )
    def buttons(self, buttons: list) -> None:
        """Buttons announced

        Sent on :class:`ZwpTabletPadGroupV2` initialization to announce the
        available buttons in the group. Button indices start at 0, a button may
        only be in one group at a time.

        This event is first sent in the initial burst of events before the
        :func:`ZwpTabletPadGroupV2.done()` event.

        Some buttons are reserved by the compositor. These buttons may not be
        assigned to any :class:`ZwpTabletPadGroupV2`. Compositors may broadcast
        this event in the case of changes to the mapping of these reserved
        buttons. If the compositor happens to reserve all buttons in a group,
        this event will be sent with an empty array.

        :param buttons:
            buttons in this group
        :type buttons:
            `ArgumentType.Array`
        """
        self._post_event(0, buttons)

    @ZwpTabletPadGroupV2.event(
        Argument(ArgumentType.NewId, interface=ZwpTabletPadRingV2),
    )
    def ring(self, ring: ZwpTabletPadRingV2) -> None:
        """Ring announced

        Sent on :class:`ZwpTabletPadGroupV2` initialization to announce
        available rings. One event is sent for each ring available on this pad
        group.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletPadGroupV2.done()` event.

        :param ring:
        :type ring:
            :class:`~pywayland.protocol.tablet_v2.ZwpTabletPadRingV2`
        """
        self._post_event(1, ring)

    @ZwpTabletPadGroupV2.event(
        Argument(ArgumentType.NewId, interface=ZwpTabletPadStripV2),
    )
    def strip(self, strip: ZwpTabletPadStripV2) -> None:
        """Strip announced

        Sent on :class:`~pywayland.protocol.tablet_v2.ZwpTabletPadV2`
        initialization to announce available strips. One event is sent for each
        strip available on this pad group.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletPadGroupV2.done()` event.

        :param strip:
        :type strip:
            :class:`~pywayland.protocol.tablet_v2.ZwpTabletPadStripV2`
        """
        self._post_event(2, strip)

    @ZwpTabletPadGroupV2.event(
        Argument(ArgumentType.Uint),
    )
    def modes(self, modes: int) -> None:
        """Mode-switch ability announced

        Sent on :class:`ZwpTabletPadGroupV2` initialization to announce that
        the pad group may switch between modes. A client may use a mode to
        store a specific configuration for buttons, rings and strips and use
        the :func:`ZwpTabletPadGroupV2.mode_switch()` event to toggle between
        these configurations. Mode indices start at 0.

        Switching modes is compositor-dependent. See the
        :func:`ZwpTabletPadGroupV2.mode_switch()` event for more details.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletPadGroupV2.done()` event. This event is only sent when
        more than one mode is available.

        :param modes:
            the number of modes
        :type modes:
            `ArgumentType.Uint`
        """
        self._post_event(3, modes)

    @ZwpTabletPadGroupV2.event()
    def done(self) -> None:
        """Tablet group description events sequence complete

        This event is sent immediately to signal the end of the initial burst
        of descriptive events. A client may consider the static description of
        the tablet to be complete and finalize initialization of the tablet
        group.
        """
        self._post_event(4)

    @ZwpTabletPadGroupV2.event(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Uint),
    )
    def mode_switch(self, time: int, serial: int, mode: int) -> None:
        """Mode switch event

        Notification that the mode was switched.

        A mode applies to all buttons, rings, strips and dials in a group
        simultaneously, but a client is not required to assign different
        actions for each mode. For example, a client may have mode-specific
        button mappings but map the ring to vertical scrolling in all modes.
        Mode indices start at 0.

        Switching modes is compositor-dependent. The compositor may provide
        visual cues to the user about the mode, e.g. by toggling LEDs on the
        tablet device. Mode-switching may be software-controlled or controlled
        by one or more physical buttons. For example, on a Wacom Intuos Pro,
        the button inside the ring may be assigned to switch between modes.

        The compositor will also send this event after
        :func:`ZwpTabletPadV2.enter()
        <pywayland.protocol.tablet_v2.ZwpTabletPadV2.enter>` on each group in
        order to notify of the current mode. Groups that only feature one mode
        will use mode=0 when emitting this event.

        If a button action in the new mode differs from the action in the
        previous mode, the client should immediately issue a
        :func:`ZwpTabletPadV2.set_feedback()
        <pywayland.protocol.tablet_v2.ZwpTabletPadV2.set_feedback>` request for
        each changed button.

        If a ring, strip or dial action in the new mode differs from the action
        in the previous mode, the client should immediately issue a
        zwp_tablet_ring_v2.set_feedback, zwp_tablet_strip_v2.set_feedback or
        zwp_tablet_dial_v2.set_feedback request for each changed ring, strip or
        dial.

        :param time:
            the time of the event with millisecond granularity
        :type time:
            `ArgumentType.Uint`
        :param serial:
        :type serial:
            `ArgumentType.Uint`
        :param mode:
            the new mode of the pad
        :type mode:
            `ArgumentType.Uint`
        """
        self._post_event(5, time, serial, mode)

    @ZwpTabletPadGroupV2.event(
        Argument(ArgumentType.NewId, interface=ZwpTabletPadDialV2),
        version=2,
    )
    def dial(self, dial: ZwpTabletPadDialV2) -> None:
        """Dial announced

        Sent on :class:`~pywayland.protocol.tablet_v2.ZwpTabletPadV2`
        initialization to announce available dials. One event is sent for each
        dial available on this pad group.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletPadGroupV2.done()` event.

        :param dial:
        :type dial:
            :class:`~pywayland.protocol.tablet_v2.ZwpTabletPadDialV2`
        """
        self._post_event(6, dial)


class ZwpTabletPadRingV2Resource(Resource[ZwpTabletPadRingV2]):
    interface = ZwpTabletPadRingV2

    @ZwpTabletPadRingV2.event(
        Argument(ArgumentType.Uint),
    )
    def source(self, source: int) -> None:
        """Ring event source

        Source information for ring events.

        This event does not occur on its own. It is sent before a
        :func:`ZwpTabletPadRingV2.frame()` event and carries the source
        information for all events within that frame.

        The source specifies how this event was generated. If the source is
        :func:`ZwpTabletPadRingV2.source()`.finger, a
        :func:`ZwpTabletPadRingV2.stop()` event will be sent when the user
        lifts the finger off the device.

        This event is optional. If the source is unknown for an interaction, no
        event is sent.

        :param source:
            the event source
        :type source:
            `ArgumentType.Uint`
        """
        self._post_event(0, source)

    @ZwpTabletPadRingV2.event(
        Argument(ArgumentType.Fixed),
    )
    def angle(self, degrees: float) -> None:
        """Angle changed

        Sent whenever the angle on a ring changes.

        The angle is provided in degrees clockwise from the logical north of
        the ring in the pad's current rotation.

        :param degrees:
            the current angle in degrees
        :type degrees:
            `ArgumentType.Fixed`
        """
        self._post_event(1, degrees)

    @ZwpTabletPadRingV2.event()
    def stop(self) -> None:
        """Interaction stopped

        Stop notification for ring events.

        For some :func:`ZwpTabletPadRingV2.source()` types, a
        :func:`ZwpTabletPadRingV2.stop()` event is sent to notify a client that
        the interaction with the ring has terminated. This enables the client
        to implement kinetic scrolling. See the
        :func:`ZwpTabletPadRingV2.source()` documentation for information on
        when this event may be generated.

        Any :func:`ZwpTabletPadRingV2.angle()` events with the same source
        after this event should be considered as the start of a new
        interaction.
        """
        self._post_event(2)

    @ZwpTabletPadRingV2.event(
        Argument(ArgumentType.Uint),
    )
    def frame(self, time: int) -> None:
        """End of a ring event sequence

        Indicates the end of a set of ring events that logically belong
        together. A client is expected to accumulate the data in all events
        within the frame before proceeding.

        All :class:`ZwpTabletPadRingV2` events before a
        :func:`ZwpTabletPadRingV2.frame()` event belong logically together. For
        example, on termination of a finger interaction on a ring the
        compositor will send a :func:`ZwpTabletPadRingV2.source()` event, a
        :func:`ZwpTabletPadRingV2.stop()` event and a
        :func:`ZwpTabletPadRingV2.frame()` event.

        A :func:`ZwpTabletPadRingV2.frame()` event is sent for every logical
        event group, even if the group only contains a single
        :class:`ZwpTabletPadRingV2` event. Specifically, a client may get a
        sequence: angle, frame, angle, frame, etc.

        :param time:
            timestamp with millisecond granularity
        :type time:
            `ArgumentType.Uint`
        """
        self._post_event(3, time)


class ZwpTabletPadStripV2Resource(Resource[ZwpTabletPadStripV2]):
    interface = ZwpTabletPadStripV2

    @ZwpTabletPadStripV2.event(
        Argument(ArgumentType.Uint),
    )
    def source(self, source: int) -> None:
        """Strip event source

        Source information for strip events.

        This event does not occur on its own. It is sent before a
        :func:`ZwpTabletPadStripV2.frame()` event and carries the source
        information for all events within that frame.

        The source specifies how this event was generated. If the source is
        :func:`ZwpTabletPadStripV2.source()`.finger, a
        :func:`ZwpTabletPadStripV2.stop()` event will be sent when the user
        lifts their finger off the device.

        This event is optional. If the source is unknown for an interaction, no
        event is sent.

        :param source:
            the event source
        :type source:
            `ArgumentType.Uint`
        """
        self._post_event(0, source)

    @ZwpTabletPadStripV2.event(
        Argument(ArgumentType.Uint),
    )
    def position(self, position: int) -> None:
        """Position changed

        Sent whenever the position on a strip changes.

        The position is normalized to a range of [0, 65535], the 0-value
        represents the top-most and/or left-most position of the strip in the
        pad's current rotation.

        :param position:
            the current position
        :type position:
            `ArgumentType.Uint`
        """
        self._post_event(1, position)

    @ZwpTabletPadStripV2.event()
    def stop(self) -> None:
        """Interaction stopped

        Stop notification for strip events.

        For some :func:`ZwpTabletPadStripV2.source()` types, a
        :func:`ZwpTabletPadStripV2.stop()` event is sent to notify a client
        that the interaction with the strip has terminated. This enables the
        client to implement kinetic scrolling. See the
        :func:`ZwpTabletPadStripV2.source()` documentation for information on
        when this event may be generated.

        Any :func:`ZwpTabletPadStripV2.position()` events with the same source
        after this event should be considered as the start of a new
        interaction.
        """
        self._post_event(2)

    @ZwpTabletPadStripV2.event(
        Argument(ArgumentType.Uint),
    )
    def frame(self, time: int) -> None:
        """End of a strip event sequence

        Indicates the end of a set of events that represent one logical
        hardware strip event. A client is expected to accumulate the data in
        all events within the frame before proceeding.

        All :class:`ZwpTabletPadStripV2` events before a
        :func:`ZwpTabletPadStripV2.frame()` event belong logically together.
        For example, on termination of a finger interaction on a strip the
        compositor will send a :func:`ZwpTabletPadStripV2.source()` event, a
        :func:`ZwpTabletPadStripV2.stop()` event and a
        :func:`ZwpTabletPadStripV2.frame()` event.

        A :func:`ZwpTabletPadStripV2.frame()` event is sent for every logical
        event group, even if the group only contains a single
        :class:`ZwpTabletPadStripV2` event. Specifically, a client may get a
        sequence: position, frame, position, frame, etc.

        :param time:
            timestamp with millisecond granularity
        :type time:
            `ArgumentType.Uint`
        """
        self._post_event(3, time)


class ZwpTabletPadV2Resource(Resource[ZwpTabletPadV2]):
    interface = ZwpTabletPadV2

    @ZwpTabletPadV2.event(
        Argument(ArgumentType.NewId, interface=ZwpTabletPadGroupV2),
    )
    def group(self, pad_group: ZwpTabletPadGroupV2) -> None:
        """Group announced

        Sent on :class:`ZwpTabletPadV2` initialization to announce available
        groups. One event is sent for each pad group available.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletPadV2.done()` event. At least one group will be
        announced.

        :param pad_group:
        :type pad_group:
            :class:`~pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2`
        """
        self._post_event(0, pad_group)

    @ZwpTabletPadV2.event(
        Argument(ArgumentType.String),
    )
    def path(self, path: str) -> None:
        """Path to the device

        A system-specific device path that indicates which device is behind
        this :class:`ZwpTabletPadV2`. This information may be used to gather
        additional information about the device, e.g. through libwacom.

        The format of the path is unspecified, it may be a device node, a sysfs
        path, or some other identifier. It is up to the client to identify the
        string provided.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletPadV2.done()` event.

        :param path:
            path to local device
        :type path:
            `ArgumentType.String`
        """
        self._post_event(1, path)

    @ZwpTabletPadV2.event(
        Argument(ArgumentType.Uint),
    )
    def buttons(self, buttons: int) -> None:
        """Buttons announced

        Sent on :class:`ZwpTabletPadV2` initialization to announce the
        available buttons.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletPadV2.done()` event. This event is only sent when at
        least one button is available.

        :param buttons:
            the number of buttons
        :type buttons:
            `ArgumentType.Uint`
        """
        self._post_event(2, buttons)

    @ZwpTabletPadV2.event()
    def done(self) -> None:
        """Pad description event sequence complete

        This event signals the end of the initial burst of descriptive events.
        A client may consider the static description of the pad to be complete
        and finalize initialization of the pad.
        """
        self._post_event(3)

    @ZwpTabletPadV2.event(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Uint),
    )
    def button(self, time: int, button: int, state: int) -> None:
        """Physical button state

        Sent whenever the physical state of a button changes.

        :param time:
            the time of the event with millisecond granularity
        :type time:
            `ArgumentType.Uint`
        :param button:
            the index of the button that changed state
        :type button:
            `ArgumentType.Uint`
        :param state:
        :type state:
            `ArgumentType.Uint`
        """
        self._post_event(4, time, button, state)

    @ZwpTabletPadV2.event(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Object, interface=ZwpTabletV2),
        Argument(ArgumentType.Object, interface=WlSurface),
    )
    def enter(self, serial: int, tablet: ZwpTabletV2, surface: WlSurface) -> None:
        """Enter event

        Notification that this pad is focused on the specified surface.

        :param serial:
            serial number of the enter event
        :type serial:
            `ArgumentType.Uint`
        :param tablet:
            the tablet the pad is attached to
        :type tablet:
            :class:`~pywayland.protocol.tablet_v2.ZwpTabletV2`
        :param surface:
            surface the pad is focused on
        :type surface:
            :class:`~pywayland.protocol.wayland.WlSurface`
        """
        self._post_event(5, serial, tablet, surface)

    @ZwpTabletPadV2.event(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Object, interface=WlSurface),
    )
    def leave(self, serial: int, surface: WlSurface) -> None:
        """Leave event

        Notification that this pad is no longer focused on the specified
        surface.

        :param serial:
            serial number of the leave event
        :type serial:
            `ArgumentType.Uint`
        :param surface:
            surface the pad is no longer focused on
        :type surface:
            :class:`~pywayland.protocol.wayland.WlSurface`
        """
        self._post_event(6, serial, surface)

    @ZwpTabletPadV2.event()
    def removed(self) -> None:
        """Pad removed event

        Sent when the pad has been removed from the system. When a tablet is
        removed its pad(s) will be removed too.

        When this event is received, the client must destroy all rings, strips
        and groups that were offered by this pad, and issue
        :func:`ZwpTabletPadV2.destroy()` the pad itself.
        """
        self._post_event(7)


class ZwpTabletSeatV2Resource(Resource[ZwpTabletSeatV2]):
    interface = ZwpTabletSeatV2

    @ZwpTabletSeatV2.event(
        Argument(ArgumentType.NewId, interface=ZwpTabletV2),
    )
    def tablet_added(self, id: ZwpTabletV2) -> None:
        """New device notification

        This event is sent whenever a new tablet becomes available on this
        seat. This event only provides the object id of the tablet, any static
        information about the tablet (device name, vid/pid, etc.) is sent
        through the :class:`~pywayland.protocol.tablet_v2.ZwpTabletV2`
        interface.

        :param id:
            the newly added graphics tablet
        :type id:
            :class:`~pywayland.protocol.tablet_v2.ZwpTabletV2`
        """
        self._post_event(0, id)

    @ZwpTabletSeatV2.event(
        Argument(ArgumentType.NewId, interface=ZwpTabletToolV2),
    )
    def tool_added(self, id: ZwpTabletToolV2) -> None:
        """A new tool has been used with a tablet

        This event is sent whenever a tool that has not previously been used
        with a tablet comes into use. This event only provides the object id of
        the tool; any static information about the tool (capabilities, type,
        etc.) is sent through the
        :class:`~pywayland.protocol.tablet_v2.ZwpTabletToolV2` interface.

        :param id:
            the newly added tablet tool
        :type id:
            :class:`~pywayland.protocol.tablet_v2.ZwpTabletToolV2`
        """
        self._post_event(1, id)

    @ZwpTabletSeatV2.event(
        Argument(ArgumentType.NewId, interface=ZwpTabletPadV2),
    )
    def pad_added(self, id: ZwpTabletPadV2) -> None:
        """New pad notification

        This event is sent whenever a new pad is known to the system.
        Typically, pads are physically attached to tablets and a pad_added
        event is sent immediately after the
        :func:`ZwpTabletSeatV2.tablet_added()`. However, some standalone pad
        devices logically attach to tablets at runtime, and the client must
        wait for :func:`ZwpTabletPadV2.enter()
        <pywayland.protocol.tablet_v2.ZwpTabletPadV2.enter>` to know the tablet
        a pad is attached to.

        This event only provides the object id of the pad. All further features
        (buttons, strips, rings) are sent through the
        :class:`~pywayland.protocol.tablet_v2.ZwpTabletPadV2` interface.

        :param id:
            the newly added pad
        :type id:
            :class:`~pywayland.protocol.tablet_v2.ZwpTabletPadV2`
        """
        self._post_event(2, id)


class ZwpTabletToolV2Resource(Resource[ZwpTabletToolV2]):
    interface = ZwpTabletToolV2

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Uint),
    )
    def type(self, tool_type: int) -> None:
        """Tool type

        The tool type is the high-level type of the tool and usually decides
        the interaction expected from this tool.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletToolV2.done()` event.

        :param tool_type:
            the physical tool type
        :type tool_type:
            `ArgumentType.Uint`
        """
        self._post_event(0, tool_type)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Uint),
    )
    def hardware_serial(self, hardware_serial_hi: int, hardware_serial_lo: int) -> None:
        """Unique hardware serial number of the tool

        If the physical tool can be identified by a unique 64-bit serial
        number, this event notifies the client of this serial number.

        If multiple tablets are available in the same seat and the tool is
        uniquely identifiable by the serial number, that tool may move between
        tablets.

        Otherwise, if the tool has no serial number and this event is missing,
        the tool is tied to the tablet it first comes into proximity with. Even
        if the physical tool is used on multiple tablets, separate
        :class:`ZwpTabletToolV2` objects will be created, one per tablet.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletToolV2.done()` event.

        :param hardware_serial_hi:
            the unique serial number of the tool, most significant bits
        :type hardware_serial_hi:
            `ArgumentType.Uint`
        :param hardware_serial_lo:
            the unique serial number of the tool, least significant bits
        :type hardware_serial_lo:
            `ArgumentType.Uint`
        """
        self._post_event(1, hardware_serial_hi, hardware_serial_lo)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Uint),
    )
    def hardware_id_wacom(self, hardware_id_hi: int, hardware_id_lo: int) -> None:
        """Hardware id notification in wacom's format

        This event notifies the client of a hardware id available on this tool.

        The hardware id is a device-specific 64-bit id that provides extra
        information about the tool in use, beyond the wl_tool.type enumeration.
        The format of the id is specific to tablets made by Wacom Inc. For
        example, the hardware id of a Wacom Grip Pen (a stylus) is 0x802.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletToolV2.done()` event.

        :param hardware_id_hi:
            the hardware id, most significant bits
        :type hardware_id_hi:
            `ArgumentType.Uint`
        :param hardware_id_lo:
            the hardware id, least significant bits
        :type hardware_id_lo:
            `ArgumentType.Uint`
        """
        self._post_event(2, hardware_id_hi, hardware_id_lo)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Uint),
    )
    def capability(self, capability: int) -> None:
        """Tool capability notification

        This event notifies the client of any capabilities of this tool, beyond
        the main set of x/y axes and tip up/down detection.

        One event is sent for each extra capability available on this tool.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletToolV2.done()` event.

        :param capability:
            the capability
        :type capability:
            `ArgumentType.Uint`
        """
        self._post_event(3, capability)

    @ZwpTabletToolV2.event()
    def done(self) -> None:
        """Tool description events sequence complete

        This event signals the end of the initial burst of descriptive events.
        A client may consider the static description of the tool to be complete
        and finalize initialization of the tool.
        """
        self._post_event(4)

    @ZwpTabletToolV2.event()
    def removed(self) -> None:
        """Tool removed

        This event is sent when the tool is removed from the system and will
        send no further events. Should the physical tool come back into
        proximity later, a new :class:`ZwpTabletToolV2` object will be created.

        It is compositor-dependent when a tool is removed. A compositor may
        remove a tool on proximity out, tablet removal or any other reason. A
        compositor may also keep a tool alive until shutdown.

        If the tool is currently in proximity, a proximity_out event will be
        sent before the removed event. See
        :func:`ZwpTabletToolV2.proximity_out()` for the handling of any buttons
        logically down.

        When this event is received, the client must
        :func:`ZwpTabletToolV2.destroy()` the object.
        """
        self._post_event(5)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Object, interface=ZwpTabletV2),
        Argument(ArgumentType.Object, interface=WlSurface),
    )
    def proximity_in(self, serial: int, tablet: ZwpTabletV2, surface: WlSurface) -> None:
        """Proximity in event

        Notification that this tool is focused on a certain surface.

        This event can be received when the tool has moved from one surface to
        another, or when the tool has come back into proximity above the
        surface.

        If any button is logically down when the tool comes into proximity, the
        respective button event is sent after the proximity_in event but within
        the same frame as the proximity_in event.

        :param serial:
        :type serial:
            `ArgumentType.Uint`
        :param tablet:
            The tablet the tool is in proximity of
        :type tablet:
            :class:`~pywayland.protocol.tablet_v2.ZwpTabletV2`
        :param surface:
            The current surface the tablet tool is over
        :type surface:
            :class:`~pywayland.protocol.wayland.WlSurface`
        """
        self._post_event(6, serial, tablet, surface)

    @ZwpTabletToolV2.event()
    def proximity_out(self) -> None:
        """Proximity out event

        Notification that this tool has either left proximity, or is no longer
        focused on a certain surface.

        When the tablet tool leaves proximity of the tablet, button release
        events are sent for each button that was held down at the time of
        leaving proximity. These events are sent before the proximity_out event
        but within the same :func:`ZwpTabletV2.frame()
        <pywayland.protocol.tablet_v2.ZwpTabletV2.frame>`.

        If the tool stays within proximity of the tablet, but the focus changes
        from one surface to another, a button release event may not be sent
        until the button is actually released or the tool leaves the proximity
        of the tablet.
        """
        self._post_event(7)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Uint),
    )
    def down(self, serial: int) -> None:
        """Tablet tool is making contact

        Sent whenever the tablet tool comes in contact with the surface of the
        tablet.

        If the tool is already in contact with the tablet when entering the
        input region, the client owning said region will receive a
        :func:`ZwpTabletV2.proximity_in()
        <pywayland.protocol.tablet_v2.ZwpTabletV2.proximity_in>` event,
        followed by a :func:`ZwpTabletV2.down()
        <pywayland.protocol.tablet_v2.ZwpTabletV2.down>` event and a
        :func:`ZwpTabletV2.frame()
        <pywayland.protocol.tablet_v2.ZwpTabletV2.frame>` event.

        Note that this event describes logical contact, not physical contact.
        On some devices, a compositor may not consider a tool in logical
        contact until a minimum physical pressure threshold is exceeded.

        :param serial:
        :type serial:
            `ArgumentType.Uint`
        """
        self._post_event(8, serial)

    @ZwpTabletToolV2.event()
    def up(self) -> None:
        """Tablet tool is no longer making contact

        Sent whenever the tablet tool stops making contact with the surface of
        the tablet, or when the tablet tool moves out of the input region and
        the compositor grab (if any) is dismissed.

        If the tablet tool moves out of the input region while in contact with
        the surface of the tablet and the compositor does not have an ongoing
        grab on the surface, the client owning said region will receive a
        :func:`ZwpTabletV2.up() <pywayland.protocol.tablet_v2.ZwpTabletV2.up>`
        event, followed by a :func:`ZwpTabletV2.proximity_out()
        <pywayland.protocol.tablet_v2.ZwpTabletV2.proximity_out>` event and a
        :func:`ZwpTabletV2.frame()
        <pywayland.protocol.tablet_v2.ZwpTabletV2.frame>` event. If the
        compositor has an ongoing grab on this device, this event sequence is
        sent whenever the grab is dismissed in the future.

        Note that this event describes logical contact, not physical contact.
        On some devices, a compositor may not consider a tool out of logical
        contact until physical pressure falls below a specific threshold.
        """
        self._post_event(9)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Fixed),
        Argument(ArgumentType.Fixed),
    )
    def motion(self, x: float, y: float) -> None:
        """Motion event

        Sent whenever a tablet tool moves.

        :param x:
            surface-local x coordinate
        :type x:
            `ArgumentType.Fixed`
        :param y:
            surface-local y coordinate
        :type y:
            `ArgumentType.Fixed`
        """
        self._post_event(10, x, y)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Uint),
    )
    def pressure(self, pressure: int) -> None:
        """Pressure change event

        Sent whenever the pressure axis on a tool changes. The value of this
        event is normalized to a value between 0 and 65535.

        Note that pressure may be nonzero even when a tool is not in logical
        contact. See the down and up events for more details.

        :param pressure:
            The current pressure value
        :type pressure:
            `ArgumentType.Uint`
        """
        self._post_event(11, pressure)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Uint),
    )
    def distance(self, distance: int) -> None:
        """Distance change event

        Sent whenever the distance axis on a tool changes. The value of this
        event is normalized to a value between 0 and 65535.

        Note that distance may be nonzero even when a tool is not in logical
        contact. See the down and up events for more details.

        :param distance:
            The current distance value
        :type distance:
            `ArgumentType.Uint`
        """
        self._post_event(12, distance)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Fixed),
        Argument(ArgumentType.Fixed),
    )
    def tilt(self, tilt_x: float, tilt_y: float) -> None:
        """Tilt change event

        Sent whenever one or both of the tilt axes on a tool change. Each tilt
        value is in degrees, relative to the z-axis of the tablet. The angle is
        positive when the top of a tool tilts along the positive x or y axis.

        :param tilt_x:
            The current value of the X tilt axis
        :type tilt_x:
            `ArgumentType.Fixed`
        :param tilt_y:
            The current value of the Y tilt axis
        :type tilt_y:
            `ArgumentType.Fixed`
        """
        self._post_event(13, tilt_x, tilt_y)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Fixed),
    )
    def rotation(self, degrees: float) -> None:
        """Z-rotation change event

        Sent whenever the z-rotation axis on the tool changes. The rotation
        value is in degrees clockwise from the tool's logical neutral position.

        :param degrees:
            The current rotation of the Z axis
        :type degrees:
            `ArgumentType.Fixed`
        """
        self._post_event(14, degrees)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Int),
    )
    def slider(self, position: int) -> None:
        """Slider position change event

        Sent whenever the slider position on the tool changes. The value is
        normalized between -65535 and 65535, with 0 as the logical neutral
        position of the slider.

        The slider is available on e.g. the Wacom Airbrush tool.

        :param position:
            The current position of slider
        :type position:
            `ArgumentType.Int`
        """
        self._post_event(15, position)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Fixed),
        Argument(ArgumentType.Int),
    )
    def wheel(self, degrees: float, clicks: int) -> None:
        """Wheel delta event

        Sent whenever the wheel on the tool emits an event. This event contains
        two values for the same axis change. The degrees value is in the same
        orientation as the :func:`WlPointer.vertical_scroll()
        <pywayland.protocol.wayland.WlPointer.vertical_scroll>` axis. The
        clicks value is in discrete logical clicks of the mouse wheel. This
        value may be zero if the movement of the wheel was less than one
        logical click.

        Clients should choose either value and avoid mixing degrees and clicks.
        The compositor may accumulate values smaller than a logical click and
        emulate click events when a certain threshold is met. Thus,
        :func:`ZwpTabletToolV2.wheel()` events with non-zero clicks values may
        have different degrees values.

        :param degrees:
            The wheel delta in degrees
        :type degrees:
            `ArgumentType.Fixed`
        :param clicks:
            The wheel delta in discrete clicks
        :type clicks:
            `ArgumentType.Int`
        """
        self._post_event(16, degrees, clicks)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Uint),
    )
    def button(self, serial: int, button: int, state: int) -> None:
        """Button event

        Sent whenever a button on the tool is pressed or released.

        If a button is held down when the tool moves in or out of proximity,
        button events are generated by the compositor. See
        :func:`ZwpTabletToolV2.proximity_in()` and
        :func:`ZwpTabletToolV2.proximity_out()` for details.

        :param serial:
        :type serial:
            `ArgumentType.Uint`
        :param button:
            The button whose state has changed
        :type button:
            `ArgumentType.Uint`
        :param state:
            Whether the button was pressed or released
        :type state:
            `ArgumentType.Uint`
        """
        self._post_event(17, serial, button, state)

    @ZwpTabletToolV2.event(
        Argument(ArgumentType.Uint),
    )
    def frame(self, time: int) -> None:
        """Frame event

        Marks the end of a series of axis and/or button updates from the
        tablet. The Wayland protocol requires axis updates to be sent
        sequentially, however all events within a frame should be considered
        one hardware event.

        :param time:
            The time of the event with millisecond granularity
        :type time:
            `ArgumentType.Uint`
        """
        self._post_event(18, time)


class ZwpTabletV2Resource(Resource[ZwpTabletV2]):
    interface = ZwpTabletV2

    @ZwpTabletV2.event(
        Argument(ArgumentType.String),
    )
    def name(self, name: str) -> None:
        """Tablet device name

        A descriptive name for the tablet device.

        If the device has no descriptive name, this event is not sent.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletV2.done()` event.

        :param name:
            the device name
        :type name:
            `ArgumentType.String`
        """
        self._post_event(0, name)

    @ZwpTabletV2.event(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Uint),
    )
    def id(self, vid: int, pid: int) -> None:
        """Tablet device vendor/product id

        The vendor and product IDs for the tablet device.

        The interpretation of the id depends on the
        :func:`ZwpTabletV2.bustype()`. Prior to version v2 of this protocol,
        the id was implied to be a USB vendor and product ID. If no
        :func:`ZwpTabletV2.bustype()` is sent, the ID is to be interpreted as
        USB vendor and product ID.

        If the device has no vendor/product ID, this event is not sent. This
        can happen for virtual devices or non-USB devices, for instance.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletV2.done()` event.

        :param vid:
            vendor id
        :type vid:
            `ArgumentType.Uint`
        :param pid:
            product id
        :type pid:
            `ArgumentType.Uint`
        """
        self._post_event(1, vid, pid)

    @ZwpTabletV2.event(
        Argument(ArgumentType.String),
    )
    def path(self, path: str) -> None:
        """Path to the device

        A system-specific device path that indicates which device is behind
        this :class:`ZwpTabletV2`. This information may be used to gather
        additional information about the device, e.g. through libwacom.

        A device may have more than one device path. If so, multiple
        :func:`ZwpTabletV2.path()` events are sent. A device may be emulated
        and not have a device path, and in that case this event will not be
        sent.

        The format of the path is unspecified, it may be a device node, a sysfs
        path, or some other identifier. It is up to the client to identify the
        string provided.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletV2.done()` event.

        :param path:
            path to local device
        :type path:
            `ArgumentType.String`
        """
        self._post_event(2, path)

    @ZwpTabletV2.event()
    def done(self) -> None:
        """Tablet description events sequence complete

        This event is sent immediately to signal the end of the initial burst
        of descriptive events. A client may consider the static description of
        the tablet to be complete and finalize initialization of the tablet.
        """
        self._post_event(3)

    @ZwpTabletV2.event()
    def removed(self) -> None:
        """Tablet removed event

        Sent when the tablet has been removed from the system. When a tablet is
        removed, some tools may be removed.

        When this event is received, the client must
        :func:`ZwpTabletV2.destroy()` the object.
        """
        self._post_event(4)

    @ZwpTabletV2.event(
        Argument(ArgumentType.Uint),
        version=2,
    )
    def bustype(self, bustype: int) -> None:
        """Tablet device bus type

        The bustype argument is one of the BUS_ defines in the Linux kernel's
        linux/input.h

        If the device has no known bustype or the bustype cannot be queried,
        this event is not sent.

        This event is sent in the initial burst of events before the
        :func:`ZwpTabletV2.done()` event.

        :param bustype:
            bus type
        :type bustype:
            `ArgumentType.Uint`
        """
        self._post_event(5, bustype)


class ZwpTabletManagerV2Proxy(Proxy[ZwpTabletManagerV2]):
    interface = ZwpTabletManagerV2

    @ZwpTabletManagerV2.request(
        Argument(ArgumentType.NewId, interface=ZwpTabletSeatV2),
        Argument(ArgumentType.Object, interface=WlSeat),
    )
    def get_tablet_seat(self, seat: WlSeatProxy) -> ZwpTabletSeatV2Proxy:
        """Get the tablet seat

        Get the :class:`~pywayland.protocol.tablet_v2.ZwpTabletSeatV2` object
        for the given seat. This object provides access to all graphics tablets
        in this seat.

        :param seat:
            The :class:`~pywayland.protocol.wayland.WlSeat` object to retrieve
            the tablets for
        :type seat:
            :class:`~pywayland.protocol.wayland.WlSeat`
        :returns:
            :class:`~pywayland.protocol.tablet_v2.ZwpTabletSeatV2`
        """
        tablet_seat = self._marshal_constructor(0, ZwpTabletSeatV2, seat)
        return tablet_seat

    @ZwpTabletManagerV2.request()
    def destroy(self) -> None:
        """Release the memory for the tablet manager object

        Destroy the :class:`ZwpTabletManagerV2` object. Objects created from
        this object are unaffected and should be destroyed separately.
        """
        self._marshal(1)
        self._destroy()


class ZwpTabletPadDialV2Proxy(Proxy[ZwpTabletPadDialV2]):
    interface = ZwpTabletPadDialV2

    @ZwpTabletPadDialV2.request(
        Argument(ArgumentType.String),
        Argument(ArgumentType.Uint),
    )
    def set_feedback(self, description: str, serial: int) -> None:
        """Set compositor feedback

        Requests the compositor to use the provided feedback string associated
        with this dial. This request should be issued immediately after a
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` event
        from the corresponding group is received, or whenever the dial is
        mapped to a different action. See
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` for
        more details.

        Clients are encouraged to provide context-aware descriptions for the
        actions associated with the dial, and compositors may use this
        information to offer visual feedback about the button layout (eg. on-
        screen displays).

        The provided string 'description' is a UTF-8 encoded string to be
        associated with this ring, and is considered user-visible; general
        internationalization rules apply.

        The serial argument will be that of the last
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` event
        received for the group of this dial. Requests providing other serials
        than the most recent one will be ignored.

        :param description:
            dial description
        :type description:
            `ArgumentType.String`
        :param serial:
            serial of the mode switch event
        :type serial:
            `ArgumentType.Uint`
        """
        self._marshal(0, description, serial)

    @ZwpTabletPadDialV2.request()
    def destroy(self) -> None:
        """Destroy the dial object

        This destroys the client's resource for this dial object.
        """
        self._marshal(1)
        self._destroy()


class ZwpTabletPadGroupV2Proxy(Proxy[ZwpTabletPadGroupV2]):
    interface = ZwpTabletPadGroupV2

    @ZwpTabletPadGroupV2.request()
    def destroy(self) -> None:
        """Destroy the pad object

        Destroy the :class:`ZwpTabletPadGroupV2` object. Objects created from
        this object are unaffected and should be destroyed separately.
        """
        self._marshal(0)
        self._destroy()


class ZwpTabletPadRingV2Proxy(Proxy[ZwpTabletPadRingV2]):
    interface = ZwpTabletPadRingV2

    @ZwpTabletPadRingV2.request(
        Argument(ArgumentType.String),
        Argument(ArgumentType.Uint),
    )
    def set_feedback(self, description: str, serial: int) -> None:
        """Set compositor feedback

        Request that the compositor use the provided feedback string associated
        with this ring. This request should be issued immediately after a
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` event
        from the corresponding group is received, or whenever the ring is
        mapped to a different action. See
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` for
        more details.

        Clients are encouraged to provide context-aware descriptions for the
        actions associated with the ring; compositors may use this information
        to offer visual feedback about the button layout (eg. on-screen
        displays).

        The provided string 'description' is a UTF-8 encoded string to be
        associated with this ring, and is considered user-visible; general
        internationalization rules apply.

        The serial argument will be that of the last
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` event
        received for the group of this ring. Requests providing other serials
        than the most recent one will be ignored.

        :param description:
            ring description
        :type description:
            `ArgumentType.String`
        :param serial:
            serial of the mode switch event
        :type serial:
            `ArgumentType.Uint`
        """
        self._marshal(0, description, serial)

    @ZwpTabletPadRingV2.request()
    def destroy(self) -> None:
        """Destroy the ring object

        This destroys the client's resource for this ring object.
        """
        self._marshal(1)
        self._destroy()


class ZwpTabletPadStripV2Proxy(Proxy[ZwpTabletPadStripV2]):
    interface = ZwpTabletPadStripV2

    @ZwpTabletPadStripV2.request(
        Argument(ArgumentType.String),
        Argument(ArgumentType.Uint),
    )
    def set_feedback(self, description: str, serial: int) -> None:
        """Set compositor feedback

        Requests the compositor to use the provided feedback string associated
        with this strip. This request should be issued immediately after a
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` event
        from the corresponding group is received, or whenever the strip is
        mapped to a different action. See
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` for
        more details.

        Clients are encouraged to provide context-aware descriptions for the
        actions associated with the strip, and compositors may use this
        information to offer visual feedback about the button layout (eg. on-
        screen displays).

        The provided string 'description' is a UTF-8 encoded string to be
        associated with this ring, and is considered user-visible; general
        internationalization rules apply.

        The serial argument will be that of the last
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` event
        received for the group of this strip. Requests providing other serials
        than the most recent one will be ignored.

        :param description:
            strip description
        :type description:
            `ArgumentType.String`
        :param serial:
            serial of the mode switch event
        :type serial:
            `ArgumentType.Uint`
        """
        self._marshal(0, description, serial)

    @ZwpTabletPadStripV2.request()
    def destroy(self) -> None:
        """Destroy the strip object

        This destroys the client's resource for this strip object.
        """
        self._marshal(1)
        self._destroy()


class ZwpTabletPadV2Proxy(Proxy[ZwpTabletPadV2]):
    interface = ZwpTabletPadV2

    @ZwpTabletPadV2.request(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.String),
        Argument(ArgumentType.Uint),
    )
    def set_feedback(self, button: int, description: str, serial: int) -> None:
        """Set compositor feedback

        Requests the compositor to use the provided feedback string associated
        with this button. This request should be issued immediately after a
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` event
        from the corresponding group is received, or whenever a button is
        mapped to a different action. See
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` for
        more details.

        Clients are encouraged to provide context-aware descriptions for the
        actions associated with each button, and compositors may use this
        information to offer visual feedback on the button layout (e.g. on-
        screen displays).

        Button indices start at 0. Setting the feedback string on a button that
        is reserved by the compositor (i.e. not belonging to any
        :class:`~pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2`) does not
        generate an error but the compositor is free to ignore the request.

        The provided string 'description' is a UTF-8 encoded string to be
        associated with this ring, and is considered user-visible; general
        internationalization rules apply.

        The serial argument will be that of the last
        :func:`ZwpTabletPadGroupV2.mode_switch()
        <pywayland.protocol.tablet_v2.ZwpTabletPadGroupV2.mode_switch>` event
        received for the group of this button. Requests providing other serials
        than the most recent one will be ignored.

        :param button:
            button index
        :type button:
            `ArgumentType.Uint`
        :param description:
            button description
        :type description:
            `ArgumentType.String`
        :param serial:
            serial of the mode switch event
        :type serial:
            `ArgumentType.Uint`
        """
        self._marshal(0, button, description, serial)

    @ZwpTabletPadV2.request()
    def destroy(self) -> None:
        """Destroy the pad object

        Destroy the :class:`ZwpTabletPadV2` object. Objects created from this
        object are unaffected and should be destroyed separately.
        """
        self._marshal(1)
        self._destroy()


class ZwpTabletSeatV2Proxy(Proxy[ZwpTabletSeatV2]):
    interface = ZwpTabletSeatV2

    @ZwpTabletSeatV2.request()
    def destroy(self) -> None:
        """Release the memory for the tablet seat object

        Destroy the :class:`ZwpTabletSeatV2` object. Objects created from this
        object are unaffected and should be destroyed separately.
        """
        self._marshal(0)
        self._destroy()


class ZwpTabletToolV2Proxy(Proxy[ZwpTabletToolV2]):
    interface = ZwpTabletToolV2

    @ZwpTabletToolV2.request(
        Argument(ArgumentType.Uint),
        Argument(ArgumentType.Object, interface=WlSurface, nullable=True),
        Argument(ArgumentType.Int),
        Argument(ArgumentType.Int),
    )
    def set_cursor(self, serial: int, surface: WlSurfaceProxy | None, hotspot_x: int, hotspot_y: int) -> None:
        """Set the tablet tool's surface

        Sets the surface of the cursor used for this tool on the given tablet.
        This request only takes effect if the tool is in proximity of one of
        the requesting client's surfaces or the surface parameter is the
        current pointer surface. If there was a previous surface set with this
        request it is replaced. If surface is NULL, the cursor image is hidden.

        The parameters hotspot_x and hotspot_y define the position of the
        pointer surface relative to the pointer location. Its top-left corner
        is always at (x, y) - (hotspot_x, hotspot_y), where (x, y) are the
        coordinates of the pointer location, in surface-local coordinates.

        On surface.attach requests to the pointer surface, hotspot_x and
        hotspot_y are decremented by the x and y parameters passed to the
        request. Attach must be confirmed by :func:`WlSurface.commit()
        <pywayland.protocol.wayland.WlSurface.commit>` as usual.

        The hotspot can also be updated by passing the currently set pointer
        surface to this request with new values for hotspot_x and hotspot_y.

        The current and pending input regions of the
        :class:`~pywayland.protocol.wayland.WlSurface` are cleared, and
        :func:`WlSurface.set_input_region()
        <pywayland.protocol.wayland.WlSurface.set_input_region>` is ignored
        until the :class:`~pywayland.protocol.wayland.WlSurface` is no longer
        used as the cursor. When the use as a cursor ends, the current and
        pending input regions become undefined, and the
        :class:`~pywayland.protocol.wayland.WlSurface` is unmapped.

        This request gives the surface the role of a :class:`ZwpTabletToolV2`
        cursor. A surface may only ever be used as the cursor surface for one
        :class:`ZwpTabletToolV2`. If the surface already has another role or
        has previously been used as cursor surface for a different tool, a
        protocol error is raised.

        :param serial:
            serial of the proximity_in event
        :type serial:
            `ArgumentType.Uint`
        :param surface:
        :type surface:
            :class:`~pywayland.protocol.wayland.WlSurface` or `None`
        :param hotspot_x:
            surface-local x coordinate
        :type hotspot_x:
            `ArgumentType.Int`
        :param hotspot_y:
            surface-local y coordinate
        :type hotspot_y:
            `ArgumentType.Int`
        """
        self._marshal(0, serial, surface, hotspot_x, hotspot_y)

    @ZwpTabletToolV2.request()
    def destroy(self) -> None:
        """Destroy the tool object

        This destroys the client's resource for this tool object.
        """
        self._marshal(1)
        self._destroy()


class ZwpTabletV2Proxy(Proxy[ZwpTabletV2]):
    interface = ZwpTabletV2

    @ZwpTabletV2.request()
    def destroy(self) -> None:
        """Destroy the tablet object

        This destroys the client's resource for this tablet object.
        """
        self._marshal(0)
        self._destroy()


class ZwpTabletManagerV2Global(Global[ZwpTabletManagerV2]):
    interface = ZwpTabletManagerV2


class ZwpTabletPadDialV2Global(Global[ZwpTabletPadDialV2]):
    interface = ZwpTabletPadDialV2


class ZwpTabletPadGroupV2Global(Global[ZwpTabletPadGroupV2]):
    interface = ZwpTabletPadGroupV2


class ZwpTabletPadRingV2Global(Global[ZwpTabletPadRingV2]):
    interface = ZwpTabletPadRingV2


class ZwpTabletPadStripV2Global(Global[ZwpTabletPadStripV2]):
    interface = ZwpTabletPadStripV2


class ZwpTabletPadV2Global(Global[ZwpTabletPadV2]):
    interface = ZwpTabletPadV2


class ZwpTabletSeatV2Global(Global[ZwpTabletSeatV2]):
    interface = ZwpTabletSeatV2


class ZwpTabletToolV2Global(Global[ZwpTabletToolV2]):
    interface = ZwpTabletToolV2


class ZwpTabletV2Global(Global[ZwpTabletV2]):
    interface = ZwpTabletV2


ZwpTabletManagerV2._gen_c()
ZwpTabletManagerV2.proxy_class = ZwpTabletManagerV2Proxy
ZwpTabletManagerV2.resource_class = ZwpTabletManagerV2Resource
ZwpTabletManagerV2.global_class = ZwpTabletManagerV2Global


ZwpTabletPadDialV2._gen_c()
ZwpTabletPadDialV2.proxy_class = ZwpTabletPadDialV2Proxy
ZwpTabletPadDialV2.resource_class = ZwpTabletPadDialV2Resource
ZwpTabletPadDialV2.global_class = ZwpTabletPadDialV2Global


ZwpTabletPadGroupV2._gen_c()
ZwpTabletPadGroupV2.proxy_class = ZwpTabletPadGroupV2Proxy
ZwpTabletPadGroupV2.resource_class = ZwpTabletPadGroupV2Resource
ZwpTabletPadGroupV2.global_class = ZwpTabletPadGroupV2Global


ZwpTabletPadRingV2._gen_c()
ZwpTabletPadRingV2.proxy_class = ZwpTabletPadRingV2Proxy
ZwpTabletPadRingV2.resource_class = ZwpTabletPadRingV2Resource
ZwpTabletPadRingV2.global_class = ZwpTabletPadRingV2Global


ZwpTabletPadStripV2._gen_c()
ZwpTabletPadStripV2.proxy_class = ZwpTabletPadStripV2Proxy
ZwpTabletPadStripV2.resource_class = ZwpTabletPadStripV2Resource
ZwpTabletPadStripV2.global_class = ZwpTabletPadStripV2Global


ZwpTabletPadV2._gen_c()
ZwpTabletPadV2.proxy_class = ZwpTabletPadV2Proxy
ZwpTabletPadV2.resource_class = ZwpTabletPadV2Resource
ZwpTabletPadV2.global_class = ZwpTabletPadV2Global


ZwpTabletSeatV2._gen_c()
ZwpTabletSeatV2.proxy_class = ZwpTabletSeatV2Proxy
ZwpTabletSeatV2.resource_class = ZwpTabletSeatV2Resource
ZwpTabletSeatV2.global_class = ZwpTabletSeatV2Global


ZwpTabletToolV2._gen_c()
ZwpTabletToolV2.proxy_class = ZwpTabletToolV2Proxy
ZwpTabletToolV2.resource_class = ZwpTabletToolV2Resource
ZwpTabletToolV2.global_class = ZwpTabletToolV2Global


ZwpTabletV2._gen_c()
ZwpTabletV2.proxy_class = ZwpTabletV2Proxy
ZwpTabletV2.resource_class = ZwpTabletV2Resource
ZwpTabletV2.global_class = ZwpTabletV2Global
