[RFC wayland-protocols v4] Add Primary Selection Protocol Version 1
Michal Suchanek
hramrach at gmail.com
Wed Feb 24 09:25:19 UTC 2016
On 24 February 2016 at 05:33, Jonas Ådahl <jadahl at gmail.com> wrote:
> On Sat, Feb 20, 2016 at 01:31:59AM +0100, Carlos Garnacho wrote:
>> From: Lyude <cpaul at redhat.com>
>>
>> This primary selection is similar in spirit to the eponimous
>> in X11, allowing a quick "select text + middle click" shortcut
>> to copying and pasting.
>>
>> It's otherwise very similar to it wayland counterpart, and
>> explicitly made consistent with it.
>>
>> Signed-off-by: Lyude <cpaul at redhat.com>
>> Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
>> ---
>> After having talked with Lyude, I'll be trying to move this ahead.
>>
>> Changes since v3:
>> - Added a rather verbose protocol description, including a
>> high-level overview of the workings.
>> - Made event emission 1:1 with wayland core protocol selections,
>> wp_primary_selection_offer.offer events are now expected to be
>> emitted between wp_primary_data_device.data_offer and
>> wp_primary_data_device.selection
>> - Improved wording here and there.
>> - Added serial argument to wp_primary_data_offer.receive that can be
>> used to match against recent events.
>>
>>
>> Makefile.am | 1 +
>> unstable/primary-selection/README | 4 +
>> .../primary-selection-unstable-v1.xml | 229 +++++++++++++++++++++
>> 3 files changed, 234 insertions(+)
>> create mode 100644 unstable/primary-selection/README
>> create mode 100644 unstable/primary-selection/primary-selection-unstable-v1.xml
>>
>> diff --git a/Makefile.am b/Makefile.am
>> index 57d0023..eefa20f 100644
>> --- a/Makefile.am
>> +++ b/Makefile.am
>> @@ -7,6 +7,7 @@ unstable_protocols = \
>> unstable/xdg-shell/xdg-shell-unstable-v5.xml \
>> unstable/relative-pointer/relative-pointer-unstable-v1.xml \
>> unstable/pointer-constraints/pointer-constraints-unstable-v1.xml \
>> + unstable/primary-selection/primary-selection-unstable-v1.xml \
>> $(NULL)
>>
>> stable_protocols = \
>> diff --git a/unstable/primary-selection/README b/unstable/primary-selection/README
>> new file mode 100644
>> index 0000000..6d8c0c6
>> --- /dev/null
>> +++ b/unstable/primary-selection/README
>> @@ -0,0 +1,4 @@
>> +Primary selection protocol
>> +
>> +Maintainers:
>> +Lyude <cpaul at redhat.com>
>> diff --git a/unstable/primary-selection/primary-selection-unstable-v1.xml b/unstable/primary-selection/primary-selection-unstable-v1.xml
>> new file mode 100644
>> index 0000000..a3618d5
>> --- /dev/null
>> +++ b/unstable/primary-selection/primary-selection-unstable-v1.xml
>> @@ -0,0 +1,229 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<protocol name="primary_selection_unstable_v1">
>> + <copyright>
>> + Copyright © 2015 Red Hat
>> +
>> + 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.
>> + </copyright>
>> +
>> + <description summary="Primary selection protocol">
>> + This protocol provides the ability to have a primary selection device to
>> + match that of the X server. This primary selection is a shortcut to the
>> + common clipboard selection, where text just needs to be selected in order
>> + to allow copying it elsewhere. The de facto way to perform this action
>> + is the middle mouse button, although it is not limited to this one.
>> +
>> + Clients wishing to honor primary selection should create a primary
>> + selection source and set it as the selection through
>> + wp_primary_selection_device.set_selection whenever the text selection
>> + changes. In order to minimize calls in pointer-driven text selection,
>> + it should happen only once after the operation finished. Similarly,
>> + a NULL source should be set when text is unselected.
>> +
>> + wp_primary_selection_offer objects are first announced through the
>> + wp_primary_selection_device.data_offer event. Immediately after this event,
>> + the primary data offer will emit wp_primary_selection_offer.offer events
>> + to let know of the mime types being offered.
>> +
>> + When the primary selection changes, the client with the keyboard focus
>> + will receive wp_primary_selection_device.selection events. Only the client
>> + with the keyboard focus will receive such events with a non-NULL
>> + wp_primary_selection_offer. Across keyboard focus changes, previously
>> + focused clients will receive wp_primary_selection_device.events with a
>> + NULL wp_primary_selection_offer.
>> +
>> + In order to request the primary selection data, the client must pass
>> + a recent serial pertaining to the press event that is triggering the
>> + operation, if the compositor deems the serial valid and recent, the
>> + wp_primary_selection_source.send event will happen in the other end
>> + to let the transfer begin. The client owning the primary selection
>> + should write the requested data, and close the file descriptor
>> + immediately.
>> +
>> + If the primary selection owner client disappeared during the transfer,
>> + the client reading the data will receive a
>> + wp_primary_selection_device.selection event with a NULL
>> + wp_primary_selection_offer, the client should take this as a hint
>> + to finish the reads related to the no longer existing offer.
>> +
>> + The primary selection owner should be checking for errors during
>> + writes, merely cancelling the ongoing transfer if any happened.
>> + </description>
>> +
>> + <interface name="zwp_primary_selection_device_manager_v1" version="1">
>> + <description summary="X primary selection emulation">
>> + The primary selection device manager is the base interface of primary
>> + selection, it allows to create wp_primary_selection_source objects, as
>> + well as retrieving the per-seat wp_primary_selection_device objects.
>> + </description>
>> +
>> + <request name="create_source">
>> + <description summary="create a new primary selection source">
>> + Create a new primary selection source.
>> + </description>
>> + <arg name="id" type="new_id" interface="zwp_primary_selection_source_v1"/>
>> + </request>
>> +
>> + <request name="get_device">
>> + <description summary="primary selection device manager">
>> + Singleton global object that manages the zwp_primary_selection_device_v1
>> + objects for each wl_seat.
>> + </description>
>> + <arg name="id" type="new_id" interface="zwp_primary_selection_device_v1"/>
>> + <arg name="seat" type="object" interface="wl_seat"/>
>> + </request>
>> +
>> + <request name="destroy" type="destructor">
>> + <description summary="destroy the primary selection device manager">
>> + Destroy the primary selection device manager.
>> + </description>
>> + </request>
>> + </interface>
>> +
>> + <interface name="zwp_primary_selection_device_v1" version="1">
>> + <request name="set_selection">
>> + <description summary="set the primary selection">
>> + Set the current contents of the primary selection buffer. This clears
>> + anything which was previously held in the primary selection buffer.
>> + </description>
>> + <arg name="source" type="object" interface="zwp_primary_selection_source_v1" allow-null="true"/>
>
> While reviewing the implementation, I noticed that while
> wl_data_device.set_selection takes a serial, the set_selection here
> doesn't. Does this mean that a client can set the selection without
> foucus and without any user interaction?
>
> It seems reasonable to me to require this as (not only offer.receive)
> would require a valid serial to have any effect.
>
Actually it seems reasonable to not require a serial for anything. If
the application has a valid offer for the current selection it should
be able to get it or set a new one (unless it's for some reason denied
one of the operations altogether).
That's one place to check the policy and it works with middle mouse
button paste, any other event the compositor knows of, any even the
compositor dose not know of ( such as remote desktop/remote control
apps, input devices used directly by the application, .. ) and
anything else.
Thanks
Michal
More information about the wayland-devel
mailing list