Copyright 2020 The River Developers Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. This protocol allows clients to access a typed key-value store of options. These options are identified by string keys and are scoped either globally or per-output. This protocol does not define any semantic meaning of the options, that is left up to compositors. Compositors are free to set options themselves at any time, though the type of any given option is immutable once set. Options may never be unset once set. This request indicates that the client will not use the manager object any more. Objects that have been created through this instance are not affected. If the output argument is non-null, the option is local to the given output. Otherwise it is considered global. On binding this object, one of the events will immediately be sent by the server to inform the client of the current state of the option. New events will be sent as the state changes. This request indicates that the client will not use the zriver_option_handle_v1 any more and that it may be safely destroyed. The option with this key has never been set, so the first set_*_value request received from any client will determine its type. This can only ever be sent as the first event after binding this interface as options cannot be unset once set. This indicates to the client that the option is of type int as well as the current value of the option. Once set the type of the option can never change. This indicates to the client that the option is of type uint as well as the current value of the option. Once set the type of the option can never change. This indicates to the client that the option is of type fixed as well as the current value of the option. Once set the type of the option can never change. This indicates to the client that the option is of type string as well as the current value of the option. Once set the type of the option can never change. If the option is either unset or set to a value of type int, this request asks the compositor to set the value of the option as well as the type if previously unset. The compositor is not required to honor this request. If the option is already set and is not of type int, this request does nothing. If the option is either unset or set to a value of type uint, this request asks the compositor to set the value of the option as well as the type if previously unset. The compositor is not required to honor this request. If the option is already set and is not of type uint, this request does nothing. If the option is either unset or set to a value of type fixed, this request asks the compositor to set the value of the option as well as the type if previously unset. The compositor is not required to honor this request. If the option is already set and is not of type fixed, this request does nothing. If the option is either unset or set to a value of type string, this request asks the compositor to set the value of the option as well as the type if previously unset. The compositor is not required to honor this request. If the option is already set and is not of type string, this request does nothing.