# This file has been autogenerated by the pywayland scanner

# Copyright © 2023-2024 Matthias Klumpp
# Copyright ©      2024 David Edmundson
#
# 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 WlBuffer
from .wayland import WlBufferProxy
from .xdg_shell import XdgToplevel
from .xdg_shell import XdgToplevelProxy


class XdgToplevelIconManagerV1(Interface):
    """Interface to manage toplevel icons

    This interface allows clients to create toplevel window icons and set them
    on toplevel windows to be displayed to the user.
    """

    name = "xdg_toplevel_icon_manager_v1"
    version = 1


class XdgToplevelIconV1(Interface):
    """A toplevel window icon

    This interface defines a toplevel icon. An icon can have a name, and
    multiple buffers. In order to be applied, the icon must have either a name,
    or at least one buffer assigned. Applying an empty icon (with no buffer or
    name) to a toplevel should reset its icon to the default icon.

    It is up to compositor policy whether to prefer using a buffer or loading
    an icon via its name. See 'set_name' and 'add_buffer' for details.
    """

    name = "xdg_toplevel_icon_v1"
    version = 1

    class error(enum.IntEnum):
        invalid_buffer = 1
        immutable = 2
        no_buffer = 3


class XdgToplevelIconManagerV1Resource(Resource[XdgToplevelIconManagerV1]):
    interface = XdgToplevelIconManagerV1

    @XdgToplevelIconManagerV1.event(
        Argument(ArgumentType.Int),
    )
    def icon_size(self, size: int) -> None:
        """Describes a supported & preferred icon size

        This event indicates an icon size the compositor prefers to be
        available if the client has scalable icons and can render to any size.

        When the 'xdg_toplevel_icon_manager_v1' object is created, the
        compositor may send one or more 'icon_size' events to describe the list
        of preferred icon sizes. If the compositor has no size preference, it
        may not send any 'icon_size' event, and it is up to the client to
        decide a suitable icon size.

        A sequence of 'icon_size' events must be finished with a 'done' event.
        If the compositor has no size preferences, it must still send the
        'done' event, without any preceding 'icon_size' events.

        :param size:
            the edge size of the square icon in surface-local coordinates, e.g.
            64
        :type size:
            `ArgumentType.Int`
        """
        self._post_event(0, size)

    @XdgToplevelIconManagerV1.event()
    def done(self) -> None:
        """All information has been sent

        This event is sent after all 'icon_size' events have been sent.
        """
        self._post_event(1)


class XdgToplevelIconV1Resource(Resource[XdgToplevelIconV1]):
    interface = XdgToplevelIconV1


class XdgToplevelIconManagerV1Proxy(Proxy[XdgToplevelIconManagerV1]):
    interface = XdgToplevelIconManagerV1

    @XdgToplevelIconManagerV1.request()
    def destroy(self) -> None:
        """Destroy the toplevel icon manager

        Destroy the toplevel icon manager. This does not destroy objects
        created with the manager.
        """
        self._marshal(0)
        self._destroy()

    @XdgToplevelIconManagerV1.request(
        Argument(ArgumentType.NewId, interface=XdgToplevelIconV1),
    )
    def create_icon(self) -> XdgToplevelIconV1Proxy:
        """Create a new icon instance

        Creates a new icon object. This icon can then be attached to a
        :class:`~pywayland.protocol.xdg_shell.XdgToplevel` via the 'set_icon'
        request.

        :returns:
            :class:`~pywayland.protocol.xdg_toplevel_icon_v1.XdgToplevelIconV1`
        """
        id = self._marshal_constructor(1, XdgToplevelIconV1)
        return id

    @XdgToplevelIconManagerV1.request(
        Argument(ArgumentType.Object, interface=XdgToplevel),
        Argument(ArgumentType.Object, interface=XdgToplevelIconV1, nullable=True),
    )
    def set_icon(self, toplevel: XdgToplevelProxy, icon: XdgToplevelIconV1Proxy | None) -> None:
        """Set an icon on a toplevel window

        This request assigns the icon 'icon' to 'toplevel', or clears the
        toplevel icon if 'icon' was null. This state is double-buffered and is
        applied on the next :func:`WlSurface.commit()
        <pywayland.protocol.wayland.WlSurface.commit>` of the toplevel.

        After making this call, the
        :class:`~pywayland.protocol.xdg_toplevel_icon_v1.XdgToplevelIconV1`
        provided as 'icon' can be destroyed by the client without 'toplevel'
        losing its icon. The
        :class:`~pywayland.protocol.xdg_toplevel_icon_v1.XdgToplevelIconV1` is
        immutable from this point, and any future attempts to change it must
        raise the
        ':class:`~pywayland.protocol.xdg_toplevel_icon_v1.XdgToplevelIconV1`.immutable'
        protocol error.

        The compositor must set the toplevel icon from either the pixel data
        the icon provides, or by loading a stock icon using the icon name. See
        the description of 'xdg_toplevel_icon_v1' for details.

        If 'icon' is set to null, the icon of the respective toplevel is reset
        to its default icon (usually the icon of the application, derived from
        its desktop-entry file, or a placeholder icon). If this request is
        passed an icon with no pixel buffers or icon name assigned, the icon
        must be reset just like if 'icon' was null.

        :param toplevel:
            the toplevel to act on
        :type toplevel:
            :class:`~pywayland.protocol.xdg_shell.XdgToplevel`
        :param icon:
        :type icon:
            :class:`~pywayland.protocol.xdg_toplevel_icon_v1.XdgToplevelIconV1` or `None`
        """
        self._marshal(2, toplevel, icon)


class XdgToplevelIconV1Proxy(Proxy[XdgToplevelIconV1]):
    interface = XdgToplevelIconV1

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

        Destroys the 'xdg_toplevel_icon_v1' object. The icon must still remain
        set on every toplevel it was assigned to, until the toplevel icon is
        reset explicitly.
        """
        self._marshal(0)
        self._destroy()

    @XdgToplevelIconV1.request(
        Argument(ArgumentType.String),
    )
    def set_name(self, icon_name: str) -> None:
        """Set an icon name

        This request assigns an icon name to this icon. Any previously set name
        is overridden.

        The compositor must resolve 'icon_name' according to the lookup rules
        described in the XDG icon theme specification[1] using the
        environment's current icon theme.

        If the compositor does not support icon names or cannot resolve
        'icon_name' according to the XDG icon theme specification it must fall
        back to using pixel buffer data instead.

        If this request is made after the icon has been assigned to a toplevel
        via 'set_icon', an 'immutable' error must be raised.

        [1]: https://specifications.freedesktop.org/icon-theme-spec/icon-theme-
        spec-latest.html

        :param icon_name:
        :type icon_name:
            `ArgumentType.String`
        """
        self._marshal(1, icon_name)

    @XdgToplevelIconV1.request(
        Argument(ArgumentType.Object, interface=WlBuffer),
        Argument(ArgumentType.Int),
    )
    def add_buffer(self, buffer: WlBufferProxy, scale: int) -> None:
        """Add icon data from a pixel buffer

        This request adds pixel data supplied as
        :class:`~pywayland.protocol.wayland.WlBuffer` to the icon.

        The client should add pixel data for all icon sizes and scales that it
        can provide, or which are explicitly requested by the compositor via
        'icon_size' events on
        :class:`~pywayland.protocol.xdg_toplevel_icon_v1.XdgToplevelIconManagerV1`.

        The :class:`~pywayland.protocol.wayland.WlBuffer` supplying pixel data
        as 'buffer' must be backed by
        :class:`~pywayland.protocol.wayland.WlShm` and must be a square (width
        and height being equal). If any of these buffer requirements are not
        fulfilled, a 'invalid_buffer' error must be raised.

        If this icon instance already has a buffer of the same size and scale
        from a previous 'add_buffer' request, data from the last request
        overrides the preexisting pixel data.

        The :class:`~pywayland.protocol.wayland.WlBuffer` must be kept alive
        for as long as the xdg_toplevel_icon it is associated with is not
        destroyed, otherwise a 'no_buffer' error is raised. The buffer contents
        must not be modified after it was assigned to the icon. As a result,
        the region of the wl_shm_pool's backing storage used for the
        :class:`~pywayland.protocol.wayland.WlBuffer` must not be modified
        after this request is sent. The :func:`WlBuffer.release()
        <pywayland.protocol.wayland.WlBuffer.release>` event is unused.

        If this request is made after the icon has been assigned to a toplevel
        via 'set_icon', an 'immutable' error must be raised.

        :param buffer:
        :type buffer:
            :class:`~pywayland.protocol.wayland.WlBuffer`
        :param scale:
            the scaling factor of the icon, e.g. 1
        :type scale:
            `ArgumentType.Int`
        """
        self._marshal(2, buffer, scale)


class XdgToplevelIconManagerV1Global(Global[XdgToplevelIconManagerV1]):
    interface = XdgToplevelIconManagerV1


class XdgToplevelIconV1Global(Global[XdgToplevelIconV1]):
    interface = XdgToplevelIconV1


XdgToplevelIconManagerV1._gen_c()
XdgToplevelIconManagerV1.proxy_class = XdgToplevelIconManagerV1Proxy
XdgToplevelIconManagerV1.resource_class = XdgToplevelIconManagerV1Resource
XdgToplevelIconManagerV1.global_class = XdgToplevelIconManagerV1Global


XdgToplevelIconV1._gen_c()
XdgToplevelIconV1.proxy_class = XdgToplevelIconV1Proxy
XdgToplevelIconV1.resource_class = XdgToplevelIconV1Resource
XdgToplevelIconV1.global_class = XdgToplevelIconV1Global
