From 7e30dc139cd8731944fcccd554ce2827b49c89d5 Mon Sep 17 00:00:00 2001 From: "alan (NyxTrail)" Date: Mon, 4 Mar 2024 17:02:57 +0000 Subject: [PATCH 2/2] Upstream version based on commit: 0c2ce70 (20230811) Hyprland targets a specific commit of hyprland-protocols: 0c2ce70 --- LICENSE | 29 +++ README.md | 18 ++ flake.lock | 43 ++++ flake.nix | 44 ++++ hyprland-protocols.pc.in | 7 + meson.build | 60 ++++++ nix/default.nix | 22 ++ protocols/hyprland-global-shortcuts-v1.xml | 112 ++++++++++ protocols/hyprland-toplevel-export-v1.xml | 228 +++++++++++++++++++++ 9 files changed, 563 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 hyprland-protocols.pc.in create mode 100644 meson.build create mode 100644 nix/default.nix create mode 100644 protocols/hyprland-global-shortcuts-v1.xml create mode 100644 protocols/hyprland-toplevel-export-v1.xml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2c7ed93 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2022, Hypr Development +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f928506 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# hyprland-protocols +Wayland protocol extensions for Hyprland. + +This repository exists in an effort to bridge the gap between Hyprland and KDE/Gnome's functionality. + +Since `wlr-protocols` is closed for new submissions, and `wayland-protocols` is very slow with changes, this repo will hold protocols used by Hyprland to bridge the aforementioned gap. + +# Finished protocols +- `hyprland_toplevel_export` -> for exporting toplevel buffers (aka. windows) for screensharing +- `hyprland_global_keybindings` -> for managing global keybinds via D-Bus. + +# 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. + +Fixing typos / adding explanations to existing protocols - welcome. + +Adding functionality to protocols / new revisions - welcome, if accompanied with a reason and an impl. + diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..f2d8075 --- /dev/null +++ b/flake.lock @@ -0,0 +1,43 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1683014792, + "narHash": "sha256-6Va9iVtmmsw4raBc3QKvQT2KT/NGRWlvUlJj46zN8B8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1a411f23ba299db155a5b45d5e145b85a7aafc42", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + } + }, + "systems": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..b8b3b54 --- /dev/null +++ b/flake.nix @@ -0,0 +1,44 @@ +{ + description = "Hyprland Protocols"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + # + systems.url = "github:nix-systems/default-linux"; + }; + + outputs = { + self, + nixpkgs, + systems, + ... + }: let + inherit (nixpkgs) lib; + eachSystem = lib.genAttrs (import systems); + pkgsFor = eachSystem (system: + import nixpkgs { + localSystem = system; + overlays = [self.overlays.hyprland-protocols]; + }); + mkDate = longDate: (lib.concatStringsSep "-" [ + (builtins.substring 0 4 longDate) + (builtins.substring 4 2 longDate) + (builtins.substring 6 2 longDate) + ]); + version = "0.1" + "+date=" + (mkDate (self.lastModifiedDate or "19700101")) + "_" + (self.shortRev or "dirty"); + in { + overlays = { + hyprland-protocols = final: prev: { + hyprland-protocols = final.callPackage ./nix/default.nix {inherit version;}; + }; + default = self.overlays.hyprland-protocols; + }; + + packages = eachSystem (system: { + inherit (pkgsFor.${system}) hyprland-protocols; + default = self.packages.${system}.hyprland-protocols; + }); + + formatter = eachSystem (system: nixpkgs.legacyPackages.${system}.alejandra); + }; +} diff --git a/hyprland-protocols.pc.in b/hyprland-protocols.pc.in new file mode 100644 index 0000000..919ff33 --- /dev/null +++ b/hyprland-protocols.pc.in @@ -0,0 +1,7 @@ +prefix=@prefix@ +datarootdir=@datarootdir@ +pkgdatadir=${pc_sysrootdir}${datarootdir}/@PACKAGE@ + +Name: Hyprland Protocols +Description: Hyprland protocol files +Version: @HYPRLAND_PROTOCOLS_VERSION@ diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..8d0c095 --- /dev/null +++ b/meson.build @@ -0,0 +1,60 @@ +project('hyprland-protocols', + version: '0.2', + meson_version: '>= 0.55.0', +) + +hyprland_protocols_version = meson.project_version() + +fs = import('fs') + +protocols = { + 'hyprland-toplevel-export': ['v1'], + 'hyprland-global-shortcuts': ['v1'] +} + +protocol_files = [] + +foreach name : protocols.keys() + foreach version : protocols.get(name) + protocol_files += [ + 'protocols/@0@-@1@.xml'.format(name, version) + ] + endforeach +endforeach + +foreach protocol_file : protocol_files + protocol_install_dir = fs.parent(join_paths( + get_option('datadir'), + 'hyprland-protocols', + protocol_file, + )) + install_data( + protocol_file, + install_dir: protocol_install_dir, + ) +endforeach + +hyprland_protocols_srcdir = meson.current_source_dir() + +pkgconfig_configuration = configuration_data() +pkgconfig_configuration.set('prefix', get_option('prefix')) +pkgconfig_configuration.set('datarootdir', '${prefix}/@0@'.format(get_option('datadir'))) +pkgconfig_configuration.set('abs_top_srcdir', hyprland_protocols_srcdir) +pkgconfig_configuration.set('PACKAGE', 'hyprland-protocols') +pkgconfig_configuration.set('HYPRLAND_PROTOCOLS_VERSION', hyprland_protocols_version) + +pkg_install_dir = join_paths(get_option('datadir'), 'pkgconfig') +configure_file( + input: 'hyprland-protocols.pc.in', + output: 'hyprland-protocols.pc', + configuration: pkgconfig_configuration, + install_dir: pkg_install_dir, +) + +hyprland_protocols = declare_dependency( + variables: { + 'pkgdatadir': hyprland_protocols_srcdir, + }, +) + +meson.override_dependency('hyprland-protocols', hyprland_protocols) diff --git a/nix/default.nix b/nix/default.nix new file mode 100644 index 0000000..62b7ed4 --- /dev/null +++ b/nix/default.nix @@ -0,0 +1,22 @@ +{ + lib, + stdenv, + meson, + ninja, + version, +}: +stdenv.mkDerivation { + pname = "hyprland-protocols"; + inherit version; + + src = ../.; + + nativeBuildInputs = [meson ninja]; + + meta = { + homepage = "https://github.com/hyprwm/hyprland-protocols"; + description = "Wayland protocol extensions for Hyprland"; + license = lib.licenses.bsd3; + platforms = lib.platforms.linux; + }; +} diff --git a/protocols/hyprland-global-shortcuts-v1.xml b/protocols/hyprland-global-shortcuts-v1.xml new file mode 100644 index 0000000..784d887 --- /dev/null +++ b/protocols/hyprland-global-shortcuts-v1.xml @@ -0,0 +1,112 @@ + + + + Copyright © 2022 Vaxry + 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 a client to register triggerable actions, + meant to be global shortcuts. + + + + + This object is a manager which offers requests to create global shortcuts. + + + + + Register a new global shortcut. + + A global shortcut is anonymous, meaning the app does not know what key(s) trigger it. + + The shortcut's keybinding shall be dealt with by the compositor. + + In the case of a duplicate app_id + id combination, the already_taken protocol error is raised. + + + + + + + + + + + All objects created by the manager will still remain valid, until their + appropriate destroy request has been called. + + + + + + + + + + + This object represents a single shortcut. + + + + + The keystroke was pressed. + + tv_ values hold the timestamp of the occurrence. + + + + + + + + + The keystroke was released. + + tv_ values hold the timestamp of the occurrence. + + + + + + + + + Destroys the shortcut. Can be sent at any time by the client. + + + + diff --git a/protocols/hyprland-toplevel-export-v1.xml b/protocols/hyprland-toplevel-export-v1.xml new file mode 100644 index 0000000..b1185aa --- /dev/null +++ b/protocols/hyprland-toplevel-export-v1.xml @@ -0,0 +1,228 @@ + + + + Copyright © 2022 Vaxry + 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 ask for exporting another toplevel's + surface(s) to a buffer. + + Particularly useful for sharing a single window. + + + + + This object is a manager which offers requests to start capturing from a + source. + + + + + Capture the next frame of a toplevel. (window) + + The captured frame will not contain any server-side decorations and will + ignore the compositor-set geometry, like e.g. rounded corners. + + It will contain all the subsurfaces and popups, however the latter will be clipped + to the geometry of the base surface. + + The handle parameter refers to the address of the window as seen in `hyprctl clients`. + For example, for d161e7b0 it would be 3512854448. + + + + + + + + + All objects created by the manager will still remain valid, until their + appropriate destroy request has been called. + + + + + + + Same as capture_toplevel, but with a zwlr_foreign_toplevel_handle_v1 handle. + + + + + + + + + + + This object represents a single frame. + + When created, a series of buffer events will be sent, each representing a + supported buffer type. The "buffer_done" event is sent afterwards to + indicate that all supported buffer types have been enumerated. The client + will then be able to send a "copy" request. If the capture is successful, + the compositor will send a "flags" followed by a "ready" event. + + wl_shm buffers are always supported, ie. the "buffer" event is guaranteed to be sent. + + If the capture failed, the "failed" event is sent. This can happen anytime + before the "ready" event. + + Once either a "ready" or a "failed" event is received, the client should + destroy the frame. + + + + + Provides information about wl_shm buffer parameters that need to be + used for this frame. This event is sent once after the frame is created + if wl_shm buffers are supported. + + + + + + + + + + Copy the frame to the supplied buffer. The buffer must have the + correct size, see hyprland_toplevel_export_frame_v1.buffer and + hyprland_toplevel_export_frame_v1.linux_dmabuf. The buffer needs to have a + supported format. + + If the frame is successfully copied, a "flags" and a "ready" event is + sent. Otherwise, a "failed" event is sent. + + This event will wait for appropriate damage to be copied, unless the ignore_damage + arg is set to a non-zero value. + + + + + + + + This event is sent right before the ready event when ignore_damage was + not set. It may be generated multiple times for each copy + request. + + The arguments describe a box around an area that has changed since the + last copy request that was derived from the current screencopy manager + instance. + + The union of all regions received between the call to copy + and a ready event is the total damage since the prior ready event. + + + + + + + + + + + + + + + + + + + Provides flags about the frame. This event is sent once before the + "ready" event. + + + + + + + Called as soon as the frame is copied, indicating it is available + for reading. This event includes the time at which presentation happened + at. + + The timestamp is expressed as tv_sec_hi, tv_sec_lo, tv_nsec triples, + each component being an unsigned 32-bit value. Whole seconds are in + tv_sec which is a 64-bit value combined from tv_sec_hi and tv_sec_lo, + and the additional fractional part in tv_nsec as nanoseconds. Hence, + for valid timestamps tv_nsec must be in [0, 999999999]. The seconds part + may have an arbitrary offset at start. + + After receiving this event, the client should destroy the object. + + + + + + + + + This event indicates that the attempted frame copy has failed. + + After receiving this event, the client should destroy the object. + + + + + + Destroys the frame. This request can be sent at any time by the client. + + + + + + Provides information about linux-dmabuf buffer parameters that need to + be used for this frame. This event is sent once after the frame is + created if linux-dmabuf buffers are supported. + + + + + + + + + This event is sent once after all buffer events have been sent. + + The client should proceed to create a buffer of one of the supported + types, and send a "copy" request. + + + +