326 lines
13 KiB
Python
326 lines
13 KiB
Python
# This file has been autogenerated by the pywayland scanner
|
|
|
|
# Copyright © 2008-2011 Kristian Høgsberg
|
|
# Copyright © 2010-2011 Intel Corporation
|
|
# Copyright © 2012-2013 Collabora, Ltd.
|
|
#
|
|
# 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,
|
|
)
|
|
|
|
|
|
class WlDataOffer(Interface):
|
|
"""Offer to transfer data
|
|
|
|
A :class:`WlDataOffer` represents a piece of data offered for transfer by
|
|
another client (the source client). It is used by the copy-and-paste and
|
|
drag-and-drop mechanisms. The offer describes the different mime types
|
|
that the data can be converted to and provides the mechanism for
|
|
transferring the data directly from the source client.
|
|
"""
|
|
|
|
name = "wl_data_offer"
|
|
version = 3
|
|
|
|
class error(enum.IntEnum):
|
|
invalid_finish = 0
|
|
invalid_action_mask = 1
|
|
invalid_action = 2
|
|
invalid_offer = 3
|
|
|
|
|
|
class WlDataOfferProxy(Proxy[WlDataOffer]):
|
|
interface = WlDataOffer
|
|
|
|
@WlDataOffer.request(
|
|
Argument(ArgumentType.Uint),
|
|
Argument(ArgumentType.String, nullable=True),
|
|
)
|
|
def accept(self, serial: int, mime_type: str | None) -> None:
|
|
"""Accept one of the offered mime types
|
|
|
|
Indicate that the client can accept the given mime type, or NULL for
|
|
not accepted.
|
|
|
|
For objects of version 2 or older, this request is used by the client
|
|
to give feedback whether the client can receive the given mime type, or
|
|
NULL if none is accepted; the feedback does not determine whether the
|
|
drag-and-drop operation succeeds or not.
|
|
|
|
For objects of version 3 or newer, this request determines the final
|
|
result of the drag-and-drop operation. If the end result is that no
|
|
mime types were accepted, the drag-and-drop operation will be cancelled
|
|
and the corresponding drag source will receive
|
|
:func:`WlDataSource.cancelled()
|
|
<pywayland.protocol.wayland.WlDataSource.cancelled>`. Clients may still
|
|
use this event in conjunction with :func:`WlDataSource.action()
|
|
<pywayland.protocol.wayland.WlDataSource.action>` for feedback.
|
|
|
|
:param serial:
|
|
serial number of the accept request
|
|
:type serial:
|
|
`ArgumentType.Uint`
|
|
:param mime_type:
|
|
mime type accepted by the client
|
|
:type mime_type:
|
|
`ArgumentType.String` or `None`
|
|
"""
|
|
self._marshal(0, serial, mime_type)
|
|
|
|
@WlDataOffer.request(
|
|
Argument(ArgumentType.String),
|
|
Argument(ArgumentType.FileDescriptor),
|
|
)
|
|
def receive(self, mime_type: str, fd: int) -> None:
|
|
"""Request that the data is transferred
|
|
|
|
To transfer the offered data, the client issues this request and
|
|
indicates the mime type it wants to receive. The transfer happens
|
|
through the passed file descriptor (typically created with the pipe
|
|
system call). The source client writes the data in the mime type
|
|
representation requested and then closes the file descriptor.
|
|
|
|
The receiving client reads from the read end of the pipe until EOF and
|
|
then closes its end, at which point the transfer is complete.
|
|
|
|
This request may happen multiple times for different mime types, both
|
|
before and after :func:`WlDataDevice.drop()
|
|
<pywayland.protocol.wayland.WlDataDevice.drop>`. Drag-and-drop
|
|
destination clients may preemptively fetch data or examine it more
|
|
closely to determine acceptance.
|
|
|
|
:param mime_type:
|
|
mime type desired by receiver
|
|
:type mime_type:
|
|
`ArgumentType.String`
|
|
:param fd:
|
|
file descriptor for data transfer
|
|
:type fd:
|
|
`ArgumentType.FileDescriptor`
|
|
"""
|
|
self._marshal(1, mime_type, fd)
|
|
|
|
@WlDataOffer.request()
|
|
def destroy(self) -> None:
|
|
"""Destroy data offer
|
|
|
|
Destroy the data offer.
|
|
"""
|
|
self._marshal(2)
|
|
self._destroy()
|
|
|
|
@WlDataOffer.request(version=3)
|
|
def finish(self) -> None:
|
|
"""The offer will no longer be used
|
|
|
|
Notifies the compositor that the drag destination successfully finished
|
|
the drag-and-drop operation.
|
|
|
|
Upon receiving this request, the compositor will emit
|
|
:func:`WlDataSource.dnd_finished()
|
|
<pywayland.protocol.wayland.WlDataSource.dnd_finished>` on the drag
|
|
source client.
|
|
|
|
It is a client error to perform other requests than
|
|
:func:`WlDataOffer.destroy()` after this one. It is also an error to
|
|
perform this request after a NULL mime type has been set in
|
|
:func:`WlDataOffer.accept()` or no action was received through
|
|
:func:`WlDataOffer.action()`.
|
|
|
|
If :func:`WlDataOffer.finish()` request is received for a non drag and
|
|
drop operation, the invalid_finish protocol error is raised.
|
|
"""
|
|
self._marshal(3)
|
|
|
|
@WlDataOffer.request(
|
|
Argument(ArgumentType.Uint),
|
|
Argument(ArgumentType.Uint),
|
|
version=3,
|
|
)
|
|
def set_actions(self, dnd_actions: int, preferred_action: int) -> None:
|
|
"""Set the available/preferred drag-and-drop actions
|
|
|
|
Sets the actions that the destination side client supports for this
|
|
operation. This request may trigger the emission of
|
|
:func:`WlDataSource.action()
|
|
<pywayland.protocol.wayland.WlDataSource.action>` and
|
|
:func:`WlDataOffer.action()` events if the compositor needs to change
|
|
the selected action.
|
|
|
|
This request can be called multiple times throughout the drag-and-drop
|
|
operation, typically in response to :func:`WlDataDevice.enter()
|
|
<pywayland.protocol.wayland.WlDataDevice.enter>` or
|
|
:func:`WlDataDevice.motion()
|
|
<pywayland.protocol.wayland.WlDataDevice.motion>` events.
|
|
|
|
This request determines the final result of the drag-and-drop
|
|
operation. If the end result is that no action is accepted, the drag
|
|
source will receive :func:`WlDataSource.cancelled()
|
|
<pywayland.protocol.wayland.WlDataSource.cancelled>`.
|
|
|
|
The dnd_actions argument must contain only values expressed in the
|
|
:func:`WlDataDeviceManager.dnd_actions()
|
|
<pywayland.protocol.wayland.WlDataDeviceManager.dnd_actions>` enum, and
|
|
the preferred_action argument must only contain one of those values
|
|
set, otherwise it will result in a protocol error.
|
|
|
|
While managing an "ask" action, the destination drag-and-drop client
|
|
may perform further :func:`WlDataOffer.receive()` requests, and is
|
|
expected to perform one last :func:`WlDataOffer.set_actions()` request
|
|
with a preferred action other than "ask" (and optionally
|
|
:func:`WlDataOffer.accept()`) before requesting
|
|
:func:`WlDataOffer.finish()`, in order to convey the action selected by
|
|
the user. If the preferred action is not in the
|
|
:func:`WlDataOffer.source_actions()` mask, an error will be raised.
|
|
|
|
If the "ask" action is dismissed (e.g. user cancellation), the client
|
|
is expected to perform :func:`WlDataOffer.destroy()` right away.
|
|
|
|
This request can only be made on drag-and-drop offers, a protocol error
|
|
will be raised otherwise.
|
|
|
|
:param dnd_actions:
|
|
actions supported by the destination client
|
|
:type dnd_actions:
|
|
`ArgumentType.Uint`
|
|
:param preferred_action:
|
|
action preferred by the destination client
|
|
:type preferred_action:
|
|
`ArgumentType.Uint`
|
|
"""
|
|
self._marshal(4, dnd_actions, preferred_action)
|
|
|
|
|
|
class WlDataOfferResource(Resource):
|
|
interface = WlDataOffer
|
|
|
|
@WlDataOffer.event(
|
|
Argument(ArgumentType.String),
|
|
)
|
|
def offer(self, mime_type: str) -> None:
|
|
"""Advertise offered mime type
|
|
|
|
Sent immediately after creating the :class:`WlDataOffer` object. One
|
|
event per offered mime type.
|
|
|
|
:param mime_type:
|
|
offered mime type
|
|
:type mime_type:
|
|
`ArgumentType.String`
|
|
"""
|
|
self._post_event(0, mime_type)
|
|
|
|
@WlDataOffer.event(
|
|
Argument(ArgumentType.Uint),
|
|
version=3,
|
|
)
|
|
def source_actions(self, source_actions: int) -> None:
|
|
"""Notify the source-side available actions
|
|
|
|
This event indicates the actions offered by the data source. It will be
|
|
sent immediately after creating the :class:`WlDataOffer` object, or
|
|
anytime the source side changes its offered actions through
|
|
:func:`WlDataSource.set_actions()
|
|
<pywayland.protocol.wayland.WlDataSource.set_actions>`.
|
|
|
|
:param source_actions:
|
|
actions offered by the data source
|
|
:type source_actions:
|
|
`ArgumentType.Uint`
|
|
"""
|
|
self._post_event(1, source_actions)
|
|
|
|
@WlDataOffer.event(
|
|
Argument(ArgumentType.Uint),
|
|
version=3,
|
|
)
|
|
def action(self, dnd_action: int) -> None:
|
|
"""Notify the selected action
|
|
|
|
This event indicates the action selected by the compositor after
|
|
matching the source/destination side actions. Only one action (or none)
|
|
will be offered here.
|
|
|
|
This event can be emitted multiple times during the drag-and-drop
|
|
operation in response to destination side action changes through
|
|
:func:`WlDataOffer.set_actions()`.
|
|
|
|
This event will no longer be emitted after :func:`WlDataDevice.drop()
|
|
<pywayland.protocol.wayland.WlDataDevice.drop>` happened on the drag-
|
|
and-drop destination, the client must honor the last action received,
|
|
or the last preferred one set through :func:`WlDataOffer.set_actions()`
|
|
when handling an "ask" action.
|
|
|
|
Compositors may also change the selected action on the fly, mainly in
|
|
response to keyboard modifier changes during the drag-and-drop
|
|
operation.
|
|
|
|
The most recent action received is always the valid one. Prior to
|
|
receiving :func:`WlDataDevice.drop()
|
|
<pywayland.protocol.wayland.WlDataDevice.drop>`, the chosen action may
|
|
change (e.g. due to keyboard modifiers being pressed). At the time of
|
|
receiving :func:`WlDataDevice.drop()
|
|
<pywayland.protocol.wayland.WlDataDevice.drop>` the drag-and-drop
|
|
destination must honor the last action received.
|
|
|
|
Action changes may still happen after :func:`WlDataDevice.drop()
|
|
<pywayland.protocol.wayland.WlDataDevice.drop>`, especially on "ask"
|
|
actions, where the drag-and-drop destination may choose another action
|
|
afterwards. Action changes happening at this stage are always the
|
|
result of inter-client negotiation, the compositor shall no longer be
|
|
able to induce a different action.
|
|
|
|
Upon "ask" actions, it is expected that the drag-and-drop destination
|
|
may potentially choose a different action and/or mime type, based on
|
|
:func:`WlDataOffer.source_actions()` and finally chosen by the user
|
|
(e.g. popping up a menu with the available options). The final
|
|
:func:`WlDataOffer.set_actions()` and :func:`WlDataOffer.accept()`
|
|
requests must happen before the call to :func:`WlDataOffer.finish()`.
|
|
|
|
:param dnd_action:
|
|
action selected by the compositor
|
|
:type dnd_action:
|
|
`ArgumentType.Uint`
|
|
"""
|
|
self._post_event(2, dnd_action)
|
|
|
|
|
|
class WlDataOfferGlobal(Global):
|
|
interface = WlDataOffer
|
|
|
|
|
|
WlDataOffer._gen_c()
|
|
WlDataOffer.proxy_class = WlDataOfferProxy
|
|
WlDataOffer.resource_class = WlDataOfferResource
|
|
WlDataOffer.global_class = WlDataOfferGlobal
|