# This file has been autogenerated by the pywayland scanner

# Copyright 2014 © Stephen "Lyude" Chandler Paul
# Copyright 2015-2016 © 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 wp_tablet_manager.get_tablet_seat.
    """

    name = "zwp_tablet_manager_v2"
    version = 1


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 wp_tablet_pad.group event and wp_tablet_pad_group.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 wp_tablet_pad_group.mode_switch event both
    whenever it is switched, and after wp_tablet_pad.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 wp_tablet_pad_group.mode_switch event for more details.
    """

    name = "zwp_tablet_pad_group_v2"
    version = 1


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 wl_tablet_pad_ring.frame
    event.
    """

    name = "zwp_tablet_pad_ring_v2"
    version = 1

    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 wl_tablet_pad_strip.frame
    event.
    """

    name = "zwp_tablet_pad_strip_v2"
    version = 1

    class source(enum.IntEnum):
        finger = 1


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

    A pad device is a set of buttons, rings and strips 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
    wp_tablet_seat.pad_added event before any actual events from this pad. This
    initial event sequence is terminated by a wp_tablet_pad.done event.

    All pad features (buttons, rings and strips) are logically divided into
    groups and all pads have at least one group. The available groups are
    notified through the wp_tablet_pad.group event; the compositor will emit
    one event per group before emitting wp_tablet_pad.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 = 1

    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
    wp_tablet_seat.tablet_added and wp_tablet_seat.tool_added events.
    """

    name = "zwp_tablet_seat_v2"
    version = 1


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 wp_tablet_tool object stays valid
    until the client destroys it; the compositor reuses the wp_tablet_tool
    object to indicate that the object's respective physical tool has come into
    proximity of a tablet again.

    A wp_tablet_tool 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 wp_tablet_seat.tool_added event before any actual events
    from this tool. This initial event sequence is terminated by a
    wp_tablet_tool.done event.

    Tablet tool events are grouped by wp_tablet_tool.frame events. Any events
    received before a wp_tablet_tool.frame event should be considered part of
    the same hardware state change.
    """

    name = "zwp_tablet_tool_v2"
    version = 1

    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 wp_tablet interface represents one graphics tablet device. The tablet
    interface itself does not generate events; all events are generated by
    wp_tablet_tool 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
    wp_tablet_seat.tablet_added event. This initial event sequence is
    terminated by a wp_tablet.done event.
    """

    name = "zwp_tablet_v2"
    version = 1


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


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

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

        Sent on wp_tablet_pad_group 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
        wp_tablet_pad_group.done event.

        Some buttons are reserved by the compositor. These buttons may not be
        assigned to any wp_tablet_pad_group. 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 wp_tablet_pad_group 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
        wp_tablet_pad_group.done event.

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

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

        Sent on wp_tablet_pad 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
        wp_tablet_pad_group.done event.

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

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

        Sent on wp_tablet_pad_group 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
        wl_tablet_pad_group.mode_switch event to toggle between these
        configurations. Mode indices start at 0.

        Switching modes is compositor-dependent. See the
        wp_tablet_pad_group.mode_switch event for more details.

        This event is sent in the initial burst of events before the
        wp_tablet_pad_group.done event. This event is only sent when more than
        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 and strips 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 client 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 wp_tablet_pad.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
        wp_tablet_pad.set_feedback request for each changed button.

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

        :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)


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
        wp_tablet_pad_ring.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
        wp_tablet_pad_ring.source.finger, a wp_tablet_pad_ring.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 wp_tablet_pad_ring.source types, a wp_tablet_pad_ring.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 wp_tablet_pad_ring.source documentation for information on when
        this event may be generated.

        Any wp_tablet_pad_ring.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 wp_tablet_pad_ring events before a wp_tablet_pad_ring.frame event
        belong logically together. For example, on termination of a finger
        interaction on a ring the compositor will send a
        wp_tablet_pad_ring.source event, a wp_tablet_pad_ring.stop event and a
        wp_tablet_pad_ring.frame event.

        A wp_tablet_pad_ring.frame event is sent for every logical event group,
        even if the group only contains a single wp_tablet_pad_ring 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
        wp_tablet_pad_strip.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
        wp_tablet_pad_strip.source.finger, a wp_tablet_pad_strip.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 wp_tablet_pad_strip.source types, a wp_tablet_pad_strip.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 wp_tablet_pad_strip.source documentation for information on
        when this event may be generated.

        Any wp_tablet_pad_strip.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 wp_tablet_pad_strip events before a wp_tablet_pad_strip.frame event
        belong logically together. For example, on termination of a finger
        interaction on a strip the compositor will send a
        wp_tablet_pad_strip.source event, a wp_tablet_pad_strip.stop event and
        a wp_tablet_pad_strip.frame event.

        A wp_tablet_pad_strip.frame event is sent for every logical event
        group, even if the group only contains a single wp_tablet_pad_strip
        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 wp_tablet_pad 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
        wp_tablet_pad.done event. At least one group will be announced.

        :param pad_group:
        :type pad_group:
            :class:`~pywayland.protocol.tablet_unstable_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 wp_tablet_pad. 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
        wp_tablet_pad.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 wp_tablet_pad initialization to announce the available buttons.

        This event is sent in the initial burst of events before the
        wp_tablet_pad.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_unstable_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
        wp_tablet_pad.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 wp_tablet interface.

        :param id:
            the newly added graphics tablet
        :type id:
            :class:`~pywayland.protocol.tablet_unstable_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 wp_tablet_tool interface.

        :param id:
            the newly added tablet tool
        :type id:
            :class:`~pywayland.protocol.tablet_unstable_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 wp_tablet_seat.tablet_added.
        However, some standalone pad devices logically attach to tablets at
        runtime, and the client must wait for wp_tablet_pad.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 wp_tablet_pad interface.

        :param id:
            the newly added pad
        :type id:
            :class:`~pywayland.protocol.tablet_unstable_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
        wp_tablet_tool.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
        wp_tablet_tool objects will be created, one per tablet.

        This event is sent in the initial burst of events before the
        wp_tablet_tool.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
        wp_tablet_tool.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
        wp_tablet_tool.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 wp_tablet_tool 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 wp_tablet_tool.proximity_out for the
        handling of any buttons logically down.

        When this event is received, the client must wp_tablet_tool.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_unstable_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 wp_tablet.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
        wp_tablet.proximity_in event, followed by a wp_tablet.down event and a
        wp_tablet.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
        wp_tablet.up event, followed by a wp_tablet.proximity_out event and a
        wp_tablet.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,
        wl_tablet_tool.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
        wp_tablet_tool.proximity_in and wp_tablet_tool.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
        wp_tablet.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 usb vendor/product id

        The USB vendor and product IDs for the tablet device.

        If the device has no USB 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
        wp_tablet.done event.

        :param vid:
            USB vendor id
        :type vid:
            `ArgumentType.Uint`
        :param pid:
            USB 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 wp_tablet. 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
        wp_tablet.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
        wp_tablet.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 wp_tablet.destroy the
        object.
        """
        self._post_event(4)


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 wp_tablet_seat 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_unstable_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 wp_tablet_manager object. Objects created from this object
        are unaffected and should be destroyed separately.
        """
        self._marshal(1)
        self._destroy()


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

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

        Destroy the wp_tablet_pad_group 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
        wp_tablet_pad_group.mode_switch event from the corresponding group is
        received, or whenever the ring is mapped to a different action. See
        wp_tablet_pad_group.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
        wp_tablet_pad_group.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
        wp_tablet_pad_group.mode_switch event from the corresponding group is
        received, or whenever the strip is mapped to a different action. See
        wp_tablet_pad_group.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
        wp_tablet_pad_group.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
        wp_tablet_pad_group.mode_switch event from the corresponding group is
        received, or whenever a button is mapped to a different action. See
        wp_tablet_pad_group.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
        wp_tablet_pad_group) 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
        wp_tablet_pad_group.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 wp_tablet_pad 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 wp_tablet_seat 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 wp_tablet_tool cursor. A
        surface may only ever be used as the cursor surface for one
        wp_tablet_tool. 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 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


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
