diff --git a/README.md b/README.md index f928506..f360827 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ Since `wlr-protocols` is closed for new submissions, and `wayland-protocols` is # Finished protocols - `hyprland_toplevel_export` -> for exporting toplevel buffers (aka. windows) for screensharing - `hyprland_global_keybindings` -> for managing global keybinds via D-Bus. +- `hyprland_focus_grab` -> for grabbing input focus, primarily for complex context menus. # Contributing Adding new protocols is *discouraged*. If the protocol has a good reason to be, and you have an impl ready, feel free to make a PR. diff --git a/meson.build b/meson.build index 8d0c095..f3dd015 100644 --- a/meson.build +++ b/meson.build @@ -9,7 +9,8 @@ fs = import('fs') protocols = { 'hyprland-toplevel-export': ['v1'], - 'hyprland-global-shortcuts': ['v1'] + 'hyprland-global-shortcuts': ['v1'], + 'hyprland-focus-grab': ['v1'], } protocol_files = [] diff --git a/protocols/hyprland-focus-grab-v1.xml b/protocols/hyprland-focus-grab-v1.xml new file mode 100644 index 0000000..3b3cd34 --- /dev/null +++ b/protocols/hyprland-focus-grab-v1.xml @@ -0,0 +1,128 @@ + + + + Copyright © 2024 outfoxxed + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + This protocol allows clients to limit input focus to a specific set + of surfaces and receive a notification when the limiter is removed as + detailed below. + + + + + This interface allows a client to create surface grab objects. + + + + + Create a surface grab object. + + + + + + + + Destroy the focus grab manager. + This doesn't destroy existing focus grab objects. + + + + + + + This interface restricts input focus to a specified whitelist of + surfaces as long as the focus grab object exists and has at least + one comitted surface. + + Mouse and touch events inside a whitelisted surface will be passed + to the surface normally, while events outside of a whitelisted surface + will clear the grab object. Keyboard events will be passed to the client + and a compositor-picked surface in the whitelist will receive a + wl_keyboard::enter event if a whitelisted surface is not already entered. + + Upon meeting implementation-defined criteria usually meaning a mouse or + touch input outside of any whitelisted surfaces, the compositor will + clear the whitelist, rendering the grab inert and sending the cleared + event. The same will happen if another focus grab or similar action + is started at the compositor's discretion. + + + + + Add a surface to the whitelist. Destroying the surface is treated the + same as an explicit call to remove_surface and duplicate additions are + ignored. + + Does not take effect until commit is called. + + + + + + + + Remove a surface from the whitelist. Destroying the surface is treated + the same as an explicit call to this function. + + If the grab was active and the removed surface was entered by the + keyboard, another surface will be entered on commit. + + Does not take effect until commit is called. + + + + + + + + Commit pending changes to the surface whitelist. + + If the list previously had no entries and now has at least one, the grab + will start. If it previously had entries and now has none, the grab will + become inert. + + + + + + Destroy the grab object and remove the grab if active. + + + + + + Sent when an active grab is cancelled by the compositor, + regardless of cause. + + + +