Add Wayland support

Not everything is yet implemented, either for Godot or personal
limitations (I don't have all hardware in the world). A brief list of
the most important issues follows:

- Single-window only: the `DisplayServer` API doesn't expose enough
information for properly creating XDG shell windows.

- Very dumb rendering loop: this is very complicated, just know that
the low consumption mode is forced to 2000 Hz and some clever hacks are
in place to overcome a specific Wayland limitation. This will be
improved to the extent possible both downstream and upstream.

- Features to implement yet: IME, touch input, native file dialog,
drawing tablet (commented out due to a refactor), screen recording.

- Mouse passthrough can't be implement through a poly API, we need a
rect-based one.

- The cursor doesn't yet support fractional scaling.

- Auto scale is rounded up when using fractional scaling as we don't
have a per-window scale query API (basically we need
`DisplayServer::window_get_scale`).

- Building with `x11=no wayland=yes opengl=yes openxr=yes` fails.

This also adds a new project property and editor setting for selecting the
default DisplayServer to start, to allow this backend to start first in
exported projects (X11 is still the default for now). The editor setting
always overrides the project setting.

Special thanks to Drew Devault, toger5, Sebastian Krzyszkowiak, Leandro
Benedet Garcia, Subhransu, Yury Zhuravlev and Mara Huldra.
This commit is contained in:
Riteo 2023-12-15 02:55:34 +01:00
parent 51991e2014
commit 7e0f7d3abd
71 changed files with 25085 additions and 80 deletions

View File

@ -96,6 +96,11 @@ jobs:
sudo add-apt-repository "deb https://ppa.launchpadcontent.net/kisak/turtle/ubuntu focal main"
sudo apt-get install -qq mesa-vulkan-drivers
# TODO: Figure out somehow how to embed this one.
- name: wayland-scanner dependency
run: |
sudo apt-get install libwayland-bin
- name: Free disk space on runner
run: |
echo "Disk usage before:" && df -h

View File

@ -515,6 +515,26 @@ Comment: Vulkan Memory Allocator
Copyright: 2017-2021, Advanced Micro Devices, Inc.
License: Expat
Files: ./thirdparty/wayland/
Comment: Wayland core protocol
Copyright: 2008-2012, Kristian Høgsberg
2010-2012, Intel Corporation
2011, Benjamin Franzke
2012, Collabora, Ltd.
License: Expat
Files: ./thirdparty/wayland-protocols/
Comment: Wayland protocols that add functionality not available in the core protocol
Copyright: 2008-2013, Kristian Høgsberg
2010-2013, Intel Corporation
2013, Rafael Antognolli
2013, Jasper St. Pierre
2014, Jonas Ådahl
2014, Jason Ekstrand
2014-2015, Collabora, Ltd.
2015, Red Hat Inc.
License: Expat
Files: ./thirdparty/wslay/
Comment: Wslay
Copyright: 2011, 2012, 2015, Tatsuhiro Tsujikawa

View File

@ -26,7 +26,7 @@
<return type="String" />
<description>
Returns the user's [url=https://unix.stackexchange.com/questions/139191/whats-the-difference-between-primary-selection-and-clipboard-buffer]primary[/url] clipboard as a string if possible. This is the clipboard that is set when the user selects text in any application, rather than when pressing [kbd]Ctrl + C[/kbd]. The clipboard data can then be pasted by clicking the middle mouse button in any application that supports the primary clipboard mechanism.
[b]Note:[/b] This method is only implemented on Linux (X11).
[b]Note:[/b] This method is only implemented on Linux (X11/Wayland).
</description>
</method>
<method name="clipboard_has" qualifiers="const">
@ -53,7 +53,7 @@
<param index="0" name="clipboard_primary" type="String" />
<description>
Sets the user's [url=https://unix.stackexchange.com/questions/139191/whats-the-difference-between-primary-selection-and-clipboard-buffer]primary[/url] clipboard content to the given string. This is the clipboard that is set when the user selects text in any application, rather than when pressing [kbd]Ctrl + C[/kbd]. The clipboard data can then be pasted by clicking the middle mouse button in any application that supports the primary clipboard mechanism.
[b]Note:[/b] This method is only implemented on Linux (X11).
[b]Note:[/b] This method is only implemented on Linux (X11/Wayland).
</description>
</method>
<method name="cursor_get_shape" qualifiers="const">
@ -120,7 +120,7 @@
<description>
Displays OS native dialog for selecting files or directories in the file system.
Callbacks have the following arguments: [code]status: bool, selected_paths: PackedStringArray, selected_filter_index: int[/code].
[b]Note:[/b] This method is implemented if the display server has the [constant FEATURE_NATIVE_DIALOG] feature, i.e. Linux, Windows, and macOS.
[b]Note:[/b] This method is implemented if the display server has the [constant FEATURE_NATIVE_DIALOG] feature, i.e. Linux (X11), Windows, and macOS.
[b]Note:[/b] [param current_directory] might be ignored.
[b]Note:[/b] On Linux, [param show_hidden] is ignored.
[b]Note:[/b] On macOS, native file dialogs have no title.
@ -147,7 +147,7 @@
Callbacks have the following arguments: [code]status: bool, selected_paths: PackedStringArray, selected_filter_index: int, selected_option: Dictionary[/code].
[b]Note:[/b] This method is implemented if the display server has the [constant FEATURE_NATIVE_DIALOG] feature, i.e. Linux, Windows, and macOS.
[b]Note:[/b] [param current_directory] might be ignored.
[b]Note:[/b] On Linux, [param show_hidden] is ignored.
[b]Note:[/b] On Linux (X11), [param show_hidden] is ignored.
[b]Note:[/b] On macOS, native file dialogs have no title.
[b]Note:[/b] On macOS, sandboxed apps will save security-scoped bookmarks to retain access to the opened folders across multiple sessions. Use [method OS.get_granted_permissions] to get a list of saved bookmarks.
</description>
@ -188,8 +188,8 @@
<method name="get_name" qualifiers="const">
<return type="String" />
<description>
Returns the name of the [DisplayServer] currently in use. Most operating systems only have a single [DisplayServer], but Linux has access to more than one [DisplayServer] (although only X11 is currently implemented in Godot).
The names of built-in display servers are [code]Windows[/code], [code]macOS[/code], [code]X11[/code] (Linux), [code]Android[/code], [code]iOS[/code], [code]web[/code] (HTML5) and [code]headless[/code] (when started with the [code]--headless[/code] [url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command line argument[/url]).
Returns the name of the [DisplayServer] currently in use. Most operating systems only have a single [DisplayServer], but Linux has access to more than one [DisplayServer] (currently X11 and Wayland).
The names of built-in display servers are [code]Windows[/code], [code]macOS[/code], [code]X11[/code] (Linux), [code]Wayland[/code] (Linux), [code]Android[/code], [code]iOS[/code], [code]web[/code] (HTML5), and [code]headless[/code] (when started with the [code]--headless[/code] [url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command line argument[/url]).
</description>
</method>
<method name="get_primary_screen" qualifiers="const">
@ -877,14 +877,14 @@
<return type="bool" />
<description>
Returns [code]true[/code] if OS is using dark mode.
[b]Note:[/b] This method is implemented on Android, iOS, macOS, Windows, and Linux (X11).
[b]Note:[/b] This method is implemented on Android, iOS, macOS, Windows, and Linux (X11/Wayland).
</description>
</method>
<method name="is_dark_mode_supported" qualifiers="const">
<return type="bool" />
<description>
Returns [code]true[/code] if OS supports dark mode.
[b]Note:[/b] This method is implemented on Android, iOS, macOS, Windows, and Linux (X11).
[b]Note:[/b] This method is implemented on Android, iOS, macOS, Windows, and Linux (X11/Wayland).
</description>
</method>
<method name="is_touchscreen_available" qualifiers="const">
@ -897,7 +897,7 @@
<return type="int" />
<description>
Returns active keyboard layout index.
[b]Note:[/b] This method is implemented on Linux (X11), macOS and Windows.
[b]Note:[/b] This method is implemented on Linux (X11/Wayland), macOS, and Windows.
</description>
</method>
<method name="keyboard_get_keycode_from_physical" qualifiers="const">
@ -905,7 +905,7 @@
<param index="0" name="keycode" type="int" enum="Key" />
<description>
Converts a physical (US QWERTY) [param keycode] to one in the active keyboard layout.
[b]Note:[/b] This method is implemented on Linux (X11), macOS and Windows.
[b]Note:[/b] This method is implemented on Linux (X11/Wayland), macOS and Windows.
</description>
</method>
<method name="keyboard_get_label_from_physical" qualifiers="const">
@ -913,14 +913,14 @@
<param index="0" name="keycode" type="int" enum="Key" />
<description>
Converts a physical (US QWERTY) [param keycode] to localized label printed on the key in the active keyboard layout.
[b]Note:[/b] This method is implemented on Linux (X11), macOS and Windows.
[b]Note:[/b] This method is implemented on Linux (X11/Wayland), macOS and Windows.
</description>
</method>
<method name="keyboard_get_layout_count" qualifiers="const">
<return type="int" />
<description>
Returns the number of keyboard layouts.
[b]Note:[/b] This method is implemented on Linux (X11), macOS and Windows.
[b]Note:[/b] This method is implemented on Linux (X11/Wayland), macOS and Windows.
</description>
</method>
<method name="keyboard_get_layout_language" qualifiers="const">
@ -928,7 +928,7 @@
<param index="0" name="index" type="int" />
<description>
Returns the ISO-639/BCP-47 language code of the keyboard layout at position [param index].
[b]Note:[/b] This method is implemented on Linux (X11), macOS and Windows.
[b]Note:[/b] This method is implemented on Linux (X11/Wayland), macOS and Windows.
</description>
</method>
<method name="keyboard_get_layout_name" qualifiers="const">
@ -936,7 +936,7 @@
<param index="0" name="index" type="int" />
<description>
Returns the localized name of the keyboard layout at position [param index].
[b]Note:[/b] This method is implemented on Linux (X11), macOS and Windows.
[b]Note:[/b] This method is implemented on Linux (X11/Wayland), macOS and Windows.
</description>
</method>
<method name="keyboard_set_current_layout">
@ -944,7 +944,7 @@
<param index="0" name="index" type="int" />
<description>
Sets the active keyboard layout.
[b]Note:[/b] This method is implemented on Linux (X11), macOS and Windows.
[b]Note:[/b] This method is implemented on Linux (X11/Wayland), macOS and Windows.
</description>
</method>
<method name="mouse_get_button_state" qualifiers="const">
@ -993,7 +993,7 @@
xxhdpi - 480 dpi
xxxhdpi - 640 dpi
[/codeblock]
[b]Note:[/b] This method is implemented on Android, Linux (X11), macOS and Windows. Returns [code]72[/code] on unsupported platforms.
[b]Note:[/b] This method is implemented on Android, Linux (X11/Wayland), macOS and Windows. Returns [code]72[/code] on unsupported platforms.
</description>
</method>
<method name="screen_get_image" qualifiers="const">
@ -1044,6 +1044,7 @@
+-------------+ +-------+
[/codeblock]
See also [method screen_get_size].
[b]Note:[/b] On Linux (Wayland) this method always returns [code](0, 0)[/code].
</description>
</method>
<method name="screen_get_refresh_rate" qualifiers="const">
@ -1162,7 +1163,7 @@
- [code]id[/code] is voice identifier.
- [code]language[/code] is language code in [code]lang_Variant[/code] format. The [code]lang[/code] part is a 2 or 3-letter code based on the ISO-639 standard, in lowercase. The [code skip-lint]Variant[/code] part is an engine-dependent string describing country, region or/and dialect.
Note that Godot depends on system libraries for text-to-speech functionality. These libraries are installed by default on Windows and macOS, but not on all Linux distributions. If they are not present, this method will return an empty list. This applies to both Godot users on Linux, as well as end-users on Linux running Godot games that use text-to-speech.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11/Wayland), macOS, and Windows.
[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be [code]true[/code] to use text-to-speech.
</description>
</method>
@ -1171,7 +1172,7 @@
<param index="0" name="language" type="String" />
<description>
Returns an [PackedStringArray] of voice identifiers for the [param language].
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11/Wayland), macOS, and Windows.
[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be [code]true[/code] to use text-to-speech.
</description>
</method>
@ -1179,7 +1180,7 @@
<return type="bool" />
<description>
Returns [code]true[/code] if the synthesizer is in a paused state.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11/Wayland), macOS, and Windows.
[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be [code]true[/code] to use text-to-speech.
</description>
</method>
@ -1187,7 +1188,7 @@
<return type="bool" />
<description>
Returns [code]true[/code] if the synthesizer is generating speech, or have utterance waiting in the queue.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11/Wayland), macOS, and Windows.
[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be [code]true[/code] to use text-to-speech.
</description>
</method>
@ -1195,7 +1196,7 @@
<return type="void" />
<description>
Puts the synthesizer into a paused state.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11/Wayland), macOS, and Windows.
[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be [code]true[/code] to use text-to-speech.
</description>
</method>
@ -1203,7 +1204,7 @@
<return type="void" />
<description>
Resumes the synthesizer if it was paused.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11/Wayland), macOS, and Windows.
[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be [code]true[/code] to use text-to-speech.
</description>
</method>
@ -1216,7 +1217,7 @@
- [constant TTS_UTTERANCE_STARTED], [constant TTS_UTTERANCE_ENDED], and [constant TTS_UTTERANCE_CANCELED] callable's method should take one [int] parameter, the utterance ID.
- [constant TTS_UTTERANCE_BOUNDARY] callable's method should take two [int] parameters, the index of the character and the utterance ID.
[b]Note:[/b] The granularity of the boundary callbacks is engine dependent.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11/Wayland), macOS, and Windows.
[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be [code]true[/code] to use text-to-speech.
</description>
</method>
@ -1236,9 +1237,9 @@
- [param pitch] ranges from [code]0.0[/code] (lowest) to [code]2.0[/code] (highest), [code]1.0[/code] is default pitch for the current voice.
- [param rate] ranges from [code]0.1[/code] (lowest) to [code]10.0[/code] (highest), [code]1.0[/code] is a normal speaking rate. Other values act as a percentage relative.
- [param utterance_id] is passed as a parameter to the callback functions.
[b]Note:[/b] On Windows and Linux (X11), utterance [param text] can use SSML markup. SSML support is engine and voice dependent. If the engine does not support SSML, you should strip out all XML markup before calling [method tts_speak].
[b]Note:[/b] On Windows and Linux (X11/Wayland), utterance [param text] can use SSML markup. SSML support is engine and voice dependent. If the engine does not support SSML, you should strip out all XML markup before calling [method tts_speak].
[b]Note:[/b] The granularity of pitch, rate, and volume is engine and voice dependent. Values may be truncated.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11/Wayland), macOS, and Windows.
[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be [code]true[/code] to use text-to-speech.
</description>
</method>
@ -1246,7 +1247,7 @@
<return type="void" />
<description>
Stops synthesis in progress and removes all utterances from the queue.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), macOS, and Windows.
[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11/Linux), macOS, and Windows.
[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be [code]true[/code] to use text-to-speech.
</description>
</method>
@ -1286,7 +1287,7 @@
<param index="0" name="position" type="Vector2i" />
<description>
Sets the mouse cursor position to the given [param position] relative to an origin at the upper left corner of the currently focused game Window Manager window.
[b]Note:[/b] [method warp_mouse] is only supported on Windows, macOS and Linux. It has no effect on Android, iOS and Web.
[b]Note:[/b] [method warp_mouse] is only supported on Windows, macOS, and Linux (X11/Wayland). It has no effect on Android, iOS, and Web.
</description>
</method>
<method name="window_can_draw" qualifiers="const">
@ -1351,7 +1352,7 @@
<param index="1" name="window_id" type="int" default="0" />
<description>
Returns internal structure pointers for use in plugins.
[b]Note:[/b] This method is implemented on Android, Linux (X11), macOS and Windows.
[b]Note:[/b] This method is implemented on Android, Linux (X11/Wayland), macOS, and Windows.
</description>
</method>
<method name="window_get_popup_safe_rect" qualifiers="const">
@ -1469,7 +1470,7 @@
<description>
Sets the [param callback] that should be called when files are dropped from the operating system's file manager to the window specified by [param window_id].
[b]Warning:[/b] Advanced users only! Adding such a callback to a [Window] node will override its default implementation, which can introduce bugs.
[b]Note:[/b] This method is implemented on Windows, macOS, Linux (X11) and Web.
[b]Note:[/b] This method is implemented on Windows, macOS, Linux (X11/Wayland), and Web.
</description>
</method>
<method name="window_set_exclusive">
@ -1612,6 +1613,7 @@
[/codeblock]
See also [method window_get_position] and [method window_set_size].
[b]Note:[/b] It's recommended to change this value using [member Window.position] instead.
[b]Note:[/b] On Linux (Wayland): this method is a no-op.
</description>
</method>
<method name="window_set_rect_changed_callback">
@ -1693,22 +1695,22 @@
Display server supports touchscreen input. [b]Windows, Linux (X11), Android, iOS, Web[/b]
</constant>
<constant name="FEATURE_MOUSE" value="3" enum="Feature">
Display server supports mouse input. [b]Windows, macOS, Linux (X11), Android, Web[/b]
Display server supports mouse input. [b]Windows, macOS, Linux (X11/Wayland), Android, Web[/b]
</constant>
<constant name="FEATURE_MOUSE_WARP" value="4" enum="Feature">
Display server supports warping mouse coordinates to keep the mouse cursor constrained within an area, but looping when one of the edges is reached. [b]Windows, macOS, Linux (X11)[/b]
Display server supports warping mouse coordinates to keep the mouse cursor constrained within an area, but looping when one of the edges is reached. [b]Windows, macOS, Linux (X11/Wayland)[/b]
</constant>
<constant name="FEATURE_CLIPBOARD" value="5" enum="Feature">
Display server supports setting and getting clipboard data. See also [constant FEATURE_CLIPBOARD_PRIMARY]. [b]Windows, macOS, Linux (X11), Android, iOS, Web[/b]
Display server supports setting and getting clipboard data. See also [constant FEATURE_CLIPBOARD_PRIMARY]. [b]Windows, macOS, Linux (X11/Wayland), Android, iOS, Web[/b]
</constant>
<constant name="FEATURE_VIRTUAL_KEYBOARD" value="6" enum="Feature">
Display server supports popping up a virtual keyboard when requested to input text without a physical keyboard. [b]Android, iOS, Web[/b]
</constant>
<constant name="FEATURE_CURSOR_SHAPE" value="7" enum="Feature">
Display server supports setting the mouse cursor shape to be different from the default. [b]Windows, macOS, Linux (X11), Android, Web[/b]
Display server supports setting the mouse cursor shape to be different from the default. [b]Windows, macOS, Linux (X11/Wayland), Android, Web[/b]
</constant>
<constant name="FEATURE_CUSTOM_CURSOR_SHAPE" value="8" enum="Feature">
Display server supports setting the mouse cursor shape to a custom image. [b]Windows, macOS, Linux (X11), Web[/b]
Display server supports setting the mouse cursor shape to a custom image. [b]Windows, macOS, Linux (X11/Wayland), Web[/b]
</constant>
<constant name="FEATURE_NATIVE_DIALOG" value="9" enum="Feature">
Display server supports spawning dialogs using the operating system's native look-and-feel. [b]macOS[/b]
@ -1717,10 +1719,10 @@
Display server supports [url=https://en.wikipedia.org/wiki/Input_method]Input Method Editor[/url], which is commonly used for inputting Chinese/Japanese/Korean text. This is handled by the operating system, rather than by Godot. [b]Windows, macOS, Linux (X11)[/b]
</constant>
<constant name="FEATURE_WINDOW_TRANSPARENCY" value="11" enum="Feature">
Display server supports windows can use per-pixel transparency to make windows behind them partially or fully visible. [b]Windows, macOS, Linux (X11)[/b]
Display server supports windows can use per-pixel transparency to make windows behind them partially or fully visible. [b]Windows, macOS, Linux (X11/Wayland)[/b]
</constant>
<constant name="FEATURE_HIDPI" value="12" enum="Feature">
Display server supports querying the operating system's display scale factor. This allows for [i]reliable[/i] automatic hiDPI display detection, as opposed to guessing based on the screen resolution and reported display DPI (which can be unreliable due to broken monitor EDID). [b]Windows, macOS[/b]
Display server supports querying the operating system's display scale factor. This allows for [i]reliable[/i] automatic hiDPI display detection, as opposed to guessing based on the screen resolution and reported display DPI (which can be unreliable due to broken monitor EDID). [b]Windows, Linux (Wayland), macOS[/b]
</constant>
<constant name="FEATURE_ICON" value="13" enum="Feature">
Display server supports changing the window icon (usually displayed in the top-left corner). [b]Windows, macOS, Linux (X11)[/b]
@ -1732,13 +1734,13 @@
Display server supports changing the screen orientation. [b]Android, iOS[/b]
</constant>
<constant name="FEATURE_SWAP_BUFFERS" value="16" enum="Feature">
Display server supports V-Sync status can be changed from the default (which is forced to be enabled platforms not supporting this feature). [b]Windows, macOS, Linux (X11)[/b]
Display server supports V-Sync status can be changed from the default (which is forced to be enabled platforms not supporting this feature). [b]Windows, macOS, Linux (X11/Wayland)[/b]
</constant>
<constant name="FEATURE_CLIPBOARD_PRIMARY" value="18" enum="Feature">
Display server supports Primary clipboard can be used. This is a different clipboard from [constant FEATURE_CLIPBOARD]. [b]Linux (X11)[/b]
Display server supports Primary clipboard can be used. This is a different clipboard from [constant FEATURE_CLIPBOARD]. [b]Linux (X11/Wayland)[/b]
</constant>
<constant name="FEATURE_TEXT_TO_SPEECH" value="19" enum="Feature">
Display server supports text-to-speech. See [code]tts_*[/code] methods. [b]Windows, macOS, Linux (X11), Android, iOS, Web[/b]
Display server supports text-to-speech. See [code]tts_*[/code] methods. [b]Windows, macOS, Linux (X11/Wayland), Android, iOS, Web[/b]
</constant>
<constant name="FEATURE_EXTEND_TO_TITLE" value="20" enum="Feature">
Display server supports expanding window content to the title. See [constant WINDOW_FLAG_EXTEND_TO_TITLE]. [b]macOS[/b]
@ -1764,15 +1766,19 @@
</constant>
<constant name="SCREEN_WITH_MOUSE_FOCUS" value="-4">
Represents the screen containing the mouse pointer.
[b]Note:[/b] On Linux (Wayland), this constant always represents the screen at index [code]0[/code].
</constant>
<constant name="SCREEN_WITH_KEYBOARD_FOCUS" value="-3">
Represents the screen containing the window with the keyboard focus.
[b]Note:[/b] On Linux (Wayland), this constant always represents the screen at index [code]0[/code].
</constant>
<constant name="SCREEN_PRIMARY" value="-2">
Represents the primary screen.
[b]Note:[/b] On Linux (Wayland), this constant always represents the screen at index [code]0[/code].
</constant>
<constant name="SCREEN_OF_MAIN_WINDOW" value="-1">
Represents the screen where the main window is located. This is usually the default value in functions that allow specifying one of several screens.
[b]Note:[/b] On Linux (Wayland), this constant always represents the screen at index [code]0[/code].
</constant>
<constant name="MAIN_WINDOW_ID" value="0">
The ID of the main window spawned by the engine, which can be passed to methods expecting a [code]window_id[/code].
@ -1931,7 +1937,7 @@
<constant name="WINDOW_FLAG_TRANSPARENT" value="3" enum="WindowFlags">
The window background can be transparent.
[b]Note:[/b] This flag has no effect if [member ProjectSettings.display/window/per_pixel_transparency/allowed] is set to [code]false[/code].
[b]Note:[/b] Transparency support is implemented on Linux (X11), macOS and Windows, but availability might vary depending on GPU driver, display manager, and compositor capabilities.
[b]Note:[/b] Transparency support is implemented on Linux (X11/Wayland), macOS, and Windows, but availability might vary depending on GPU driver, display manager, and compositor capabilities.
</constant>
<constant name="WINDOW_FLAG_NO_FOCUS" value="4" enum="WindowFlags">
The window can't be focused. No-focus window will ignore all input, except mouse clicks.
@ -2013,7 +2019,7 @@
<constant name="OPENGL_CONTEXT" value="3" enum="HandleType">
OpenGL context (only with the GL Compatibility renderer):
- Windows: [code]HGLRC[/code] for the window (native GL), or [code]EGLContext[/code] for the window (ANGLE).
- Linux: [code]GLXContext*[/code] for the window.
- Linux (X11): [code]GLXContext*[/code] for the window.
- macOS: [code]NSOpenGLContext*[/code] for the window (native GL), or [code]EGLContext[/code] for the window (ANGLE).
- Android: [code]EGLContext[/code] for the window.
</constant>

View File

@ -762,6 +762,9 @@
<member name="run/output/font_size" type="int" setter="" getter="">
The size of the font in the [b]Output[/b] panel at the bottom of the editor. This setting does not impact the font size of the script editor (see [member interface/editor/code_font_size]).
</member>
<member name="run/platforms/linuxbsd/prefer_wayland" type="bool" setter="" getter="">
If [code]true[/code], on Linux/BSD, the editor will check for Wayland first instead of X11 (if available).
</member>
<member name="run/window_placement/android_window" type="int" setter="" getter="">
The Android window to display the project on when starting the project from the editor.
[b]Note:[/b] Only available in the Android editor.

View File

@ -742,6 +742,24 @@
<member name="debug/shapes/paths/geometry_width" type="float" setter="" getter="" default="2.0">
Line width of the curve path geometry, visible when "Visible Paths" is enabled in the Debug menu.
</member>
<member name="display/display_server/driver" type="String" setter="" getter="">
Sets the driver to be used by the display server. This property can not be edited directly, instead, set the driver using the platform-specific overrides.
</member>
<member name="display/display_server/driver.android" type="String" setter="" getter="">
Android override for [member display/display_server/driver].
</member>
<member name="display/display_server/driver.ios" type="String" setter="" getter="">
iOS override for [member display/display_server/driver].
</member>
<member name="display/display_server/driver.linuxbsd" type="String" setter="" getter="">
LinuxBSD override for [member display/display_server/driver].
</member>
<member name="display/display_server/driver.macos" type="String" setter="" getter="">
MacOS override for [member display/display_server/driver].
</member>
<member name="display/display_server/driver.windows" type="String" setter="" getter="">
Windows override for [member display/display_server/driver].
</member>
<member name="display/mouse_cursor/custom_image" type="String" setter="" getter="" default="&quot;&quot;">
Custom image for the mouse cursor (limited to 256×256).
</member>

View File

@ -17,8 +17,11 @@ if env["platform"] == "android":
env.AppendUnique(CPPDEFINES=["VK_USE_PLATFORM_ANDROID_KHR"])
elif env["platform"] == "ios":
env.AppendUnique(CPPDEFINES=["VK_USE_PLATFORM_IOS_MVK"])
elif env["platform"] == "linuxbsd" and env["x11"]:
env.AppendUnique(CPPDEFINES=["VK_USE_PLATFORM_XLIB_KHR"])
elif env["platform"] == "linuxbsd":
if env["x11"]:
env.AppendUnique(CPPDEFINES=["VK_USE_PLATFORM_XLIB_KHR"])
if env["wayland"]:
env.AppendUnique(CPPDEFINES=["VK_USE_PLATFORM_WAYLAND_KHR"])
elif env["platform"] == "macos":
env.AppendUnique(CPPDEFINES=["VK_USE_PLATFORM_MACOS_MVK"])
elif env["platform"] == "windows":

View File

@ -764,6 +764,10 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("run/output/always_open_output_on_play", true);
_initial_set("run/output/always_close_output_on_stop", false);
// Platform
_initial_set("run/platforms/linuxbsd/prefer_wayland", false);
set_restart_if_changed("run/platforms/linuxbsd/prefer_wayland", true);
/* Network */
// Debug
@ -1419,6 +1423,12 @@ String EditorSettings::get_editor_layouts_config() const {
}
float EditorSettings::get_auto_display_scale() const {
#ifdef LINUXBSD_ENABLED
if (DisplayServer::get_singleton()->get_name() == "Wayland") {
return DisplayServer::get_singleton()->screen_get_max_scale();
}
#endif
#if defined(MACOS_ENABLED) || defined(ANDROID_ENABLED)
return DisplayServer::get_singleton()->screen_get_max_scale();
#else

View File

@ -157,12 +157,12 @@ static bool _start_success = false;
// Drivers
String display_driver = "";
String tablet_driver = "";
String text_driver = "";
String rendering_driver = "";
String rendering_method = "";
static int text_driver_idx = -1;
static int display_driver_idx = -1;
static int audio_driver_idx = -1;
// Engine config/tools
@ -824,7 +824,6 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
I = I->next();
}
String display_driver = "";
String audio_driver = "";
String project_path = ".";
bool upwards = false;
@ -2122,23 +2121,13 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
// Display driver, e.g. X11, Wayland.
// Make sure that headless is the last one, which it is assumed to be by design.
DEV_ASSERT(NULL_DISPLAY_DRIVER == DisplayServer::get_create_function_name(DisplayServer::get_create_function_count() - 1));
for (int i = 0; i < DisplayServer::get_create_function_count(); i++) {
String name = DisplayServer::get_create_function_name(i);
if (display_driver == name) {
display_driver_idx = i;
break;
}
}
if (display_driver_idx < 0) {
// If the requested driver wasn't found, pick the first entry.
// If all else failed it would be the headless server.
display_driver_idx = 0;
}
// Store this in a globally accessible place, so we can retrieve the rendering drivers
// list from the display driver for the editor UI.
OS::get_singleton()->set_display_driver_id(display_driver_idx);
GLOBAL_DEF_RST_NOVAL("display/display_server/driver", "default");
GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "display/display_server/driver.windows", PROPERTY_HINT_ENUM_SUGGESTION, "default,windows,headless"), "default");
GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "display/display_server/driver.linuxbsd", PROPERTY_HINT_ENUM_SUGGESTION, "default,x11,wayland,headless"), "default");
GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "display/display_server/driver.android", PROPERTY_HINT_ENUM_SUGGESTION, "default,android,headless"), "default");
GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "display/display_server/driver.ios", PROPERTY_HINT_ENUM_SUGGESTION, "default,iOS,headless"), "default");
GLOBAL_DEF_RST_NOVAL(PropertyInfo(Variant::STRING, "display/display_server/driver.macos", PROPERTY_HINT_ENUM_SUGGESTION, "default,macos,headless"), "default");
GLOBAL_DEF_RST_NOVAL("audio/driver/driver", AudioDriverManager::get_driver(0)->get_name());
if (audio_driver.is_empty()) { // Specified in project.godot.
@ -2382,7 +2371,26 @@ Error Main::setup2() {
rp_new.ext_func = _parse_resource_dummy;
rp_new.sub_func = _parse_resource_dummy;
while (true) {
bool screen_found = false;
String screen_property;
bool prefer_wayland_found = false;
if (editor) {
screen_property = "interface/editor/editor_screen";
} else if (project_manager) {
screen_property = "interface/editor/project_manager_screen";
} else {
// Skip.
screen_found = true;
}
if (!display_driver.is_empty()) {
// Skip.
prefer_wayland_found = true;
}
while (!screen_found || !prefer_wayland_found) {
assign = Variant();
next_tag.fields.clear();
next_tag.name = String();
@ -2391,17 +2399,21 @@ Error Main::setup2() {
if (err == ERR_FILE_EOF) {
break;
}
if (err == OK && !assign.is_empty()) {
if (project_manager) {
if (assign == "interface/editor/project_manager_screen") {
init_screen = value;
break;
}
} else if (editor) {
if (assign == "interface/editor/editor_screen") {
init_screen = value;
break;
if (!screen_found && assign == screen_property) {
init_screen = value;
screen_found = true;
}
if (!prefer_wayland_found && assign == "run/platforms/linuxbsd/prefer_wayland") {
if (value) {
display_driver = "wayland";
} else {
display_driver = "default";
}
prefer_wayland_found = true;
}
}
}
@ -2459,7 +2471,33 @@ Error Main::setup2() {
{
OS::get_singleton()->benchmark_begin_measure("Servers", "Display");
String display_driver = DisplayServer::get_create_function_name(display_driver_idx);
if (display_driver.is_empty()) {
display_driver = GLOBAL_GET("display/display_server/driver");
}
int display_driver_idx = -1;
if (display_driver.is_empty() || display_driver == "default") {
display_driver_idx = 0;
} else {
for (int i = 0; i < DisplayServer::get_create_function_count(); i++) {
String name = DisplayServer::get_create_function_name(i);
if (display_driver == name) {
display_driver_idx = i;
break;
}
}
if (display_driver_idx < 0) {
// If the requested driver wasn't found, pick the first entry.
// If all else failed it would be the headless server.
display_driver_idx = 0;
}
}
// Store this in a globally accessible place, so we can retrieve the rendering drivers
// list from the display driver for the editor UI.
OS::get_singleton()->set_display_driver_id(display_driver_idx);
Vector2i *window_position = nullptr;
Vector2i position = init_custom_pos;

View File

@ -24,6 +24,9 @@ elif env["platform"] == "linuxbsd":
if env["x11"]:
env_openxr.AppendUnique(CPPDEFINES=["XR_USE_PLATFORM_XLIB"])
if env["wayland"]:
env_openxr.AppendUnique(CPPDEFINES=["XR_USE_PLATFORM_WAYLAND"])
# FIXME: Review what needs to be set for Android and macOS.
env_openxr.AppendUnique(CPPDEFINES=["HAVE_SECURE_GETENV"])
elif env["platform"] == "windows":

View File

@ -131,9 +131,9 @@ bool OpenXROpenGLExtension::check_graphics_api_support(XrVersion p_desired_versi
#ifdef WIN32
XrGraphicsBindingOpenGLWin32KHR OpenXROpenGLExtension::graphics_binding_gl;
#elif ANDROID_ENABLED
#elif defined(ANDROID_ENABLED)
XrGraphicsBindingOpenGLESAndroidKHR OpenXROpenGLExtension::graphics_binding_gl;
#else
#elif defined(X11_ENABLED)
XrGraphicsBindingOpenGLXlibKHR OpenXROpenGLExtension::graphics_binding_gl;
#endif
@ -147,20 +147,24 @@ void *OpenXROpenGLExtension::set_session_create_and_get_next_pointer(void *p_nex
DisplayServer *display_server = DisplayServer::get_singleton();
#ifdef WAYLAND_ENABLED
ERR_FAIL_COND_V_MSG(display_server->get_name() == "Wayland", p_next_pointer, "OpenXR is not yet supported on OpenGL Wayland.");
#endif
#ifdef WIN32
graphics_binding_gl.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR,
graphics_binding_gl.next = p_next_pointer;
graphics_binding_gl.hDC = (HDC)display_server->window_get_native_handle(DisplayServer::WINDOW_VIEW);
graphics_binding_gl.hGLRC = (HGLRC)display_server->window_get_native_handle(DisplayServer::OPENGL_CONTEXT);
#elif ANDROID_ENABLED
#elif defined(ANDROID_ENABLED)
graphics_binding_gl.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR;
graphics_binding_gl.next = p_next_pointer;
graphics_binding_gl.display = (void *)display_server->window_get_native_handle(DisplayServer::DISPLAY_HANDLE);
graphics_binding_gl.config = (EGLConfig)0; // https://github.com/KhronosGroup/OpenXR-SDK-Source/blob/master/src/tests/hello_xr/graphicsplugin_opengles.cpp#L122
graphics_binding_gl.context = (void *)display_server->window_get_native_handle(DisplayServer::OPENGL_CONTEXT);
#else
#elif defined(X11_ENABLED)
graphics_binding_gl.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR;
graphics_binding_gl.next = p_next_pointer;

View File

@ -19,6 +19,9 @@ if env["use_sowrap"]:
if env["x11"]:
common_linuxbsd += SConscript("x11/SCsub")
if env["wayland"]:
common_linuxbsd += SConscript("wayland/SCsub")
if env["speechd"]:
common_linuxbsd.append("tts_linux.cpp")
if env["use_sowrap"]:

View File

@ -47,6 +47,8 @@ def get_opts():
BoolVariable("fontconfig", "Use fontconfig for system fonts support", True),
BoolVariable("udev", "Use udev for gamepad connection callbacks", True),
BoolVariable("x11", "Enable X11 display", True),
BoolVariable("wayland", "Enable Wayland display", True),
BoolVariable("libdecor", "Enable libdecor support", True),
BoolVariable("touch", "Enable touch events", True),
BoolVariable("execinfo", "Use libexecinfo on systems where glibc is not available", False),
]
@ -204,6 +206,11 @@ def configure(env: "Environment"):
if env["use_sowrap"]:
env.Append(CPPDEFINES=["SOWRAP_ENABLED"])
if env["wayland"]:
if os.system("wayland-scanner -v") != 0:
print("wayland-scanner not found. Aborting.")
sys.exit(255)
if env["touch"]:
env.Append(CPPDEFINES=["TOUCH_ENABLED"])
@ -364,9 +371,13 @@ def configure(env: "Environment"):
env.ParseConfig("pkg-config xkbcommon --cflags --libs")
env.Append(CPPDEFINES=["XKB_ENABLED"])
else:
print(
"Warning: libxkbcommon development libraries not found. Disabling dead key composition and key label support."
)
if env["wayland"]:
print("Error: libxkbcommon development libraries required by Wayland not found. Aborting.")
sys.exit(255)
else:
print(
"Warning: libxkbcommon development libraries not found. Disabling dead key composition and key label support."
)
else:
env.Append(CPPDEFINES=["XKB_ENABLED"])
@ -433,6 +444,33 @@ def configure(env: "Environment"):
env.ParseConfig("pkg-config xi --cflags --libs")
env.Append(CPPDEFINES=["X11_ENABLED"])
if env["wayland"]:
if not env["use_sowrap"]:
if os.system("pkg-config --exists libdecor-0"):
print("Warning: libdecor development libraries not found. Disabling client-side decorations.")
env["libdecor"] = False
else:
env.ParseConfig("pkg-config libdecor-0 --cflags --libs")
if os.system("pkg-config --exists wayland-client"):
print("Error: Wayland client library not found. Aborting.")
sys.exit(255)
env.ParseConfig("pkg-config wayland-client --cflags --libs")
if os.system("pkg-config --exists wayland-cursor"):
print("Error: Wayland cursor library not found. Aborting.")
sys.exit(255)
env.ParseConfig("pkg-config wayland-cursor --cflags --libs")
if os.system("pkg-config --exists wayland-egl"):
print("Error: Wayland EGL library not found. Aborting.")
sys.exit(255)
env.ParseConfig("pkg-config wayland-egl --cflags --libs")
if env["libdecor"]:
env.Append(CPPDEFINES=["LIBDECOR_ENABLED"])
env.Prepend(CPPPATH=["#platform/linuxbsd", "#thirdparty/linuxbsd_headers/wayland/"])
env.Append(CPPDEFINES=["WAYLAND_ENABLED"])
env.Append(LIBS=["rt"]) # Needed by glibc, used by _allocate_shm_file
if env["vulkan"]:
env.Append(CPPDEFINES=["VULKAN_ENABLED", "RD_ENABLED"])
if not env["use_volk"]:

View File

@ -41,7 +41,7 @@ void register_linuxbsd_exporter_types() {
void register_linuxbsd_exporter() {
Ref<EditorExportPlatformLinuxBSD> platform;
platform.instantiate();
platform->set_name("Linux/X11");
platform->set_name("Linux");
platform->set_os_name("Linux");
platform->set_chmod_flags(0755);

View File

@ -39,6 +39,10 @@
#include "x11/display_server_x11.h"
#endif
#ifdef WAYLAND_ENABLED
#include "wayland/display_server_wayland.h"
#endif
#include "modules/modules_enabled.gen.h" // For regex.
#ifdef MODULE_REGEX_ENABLED
#include "modules/regex/regex.h"
@ -123,6 +127,14 @@ void OS_LinuxBSD::alert(const String &p_alert, const String &p_title) {
}
}
int OS_LinuxBSD::get_low_processor_usage_mode_sleep_usec() const {
if (DisplayServer::get_singleton() == nullptr || DisplayServer::get_singleton()->get_name() != "Wayland" || is_in_low_processor_usage_mode()) {
return OS::get_low_processor_usage_mode_sleep_usec();
}
return 500; // Roughly 2000 FPS, improves frame time when emulating VSync.
}
void OS_LinuxBSD::initialize() {
crash_handler.initialize();
@ -1166,6 +1178,10 @@ OS_LinuxBSD::OS_LinuxBSD() {
DisplayServerX11::register_x11_driver();
#endif
#ifdef WAYLAND_ENABLED
DisplayServerWayland::register_wayland_driver();
#endif
#ifdef FONTCONFIG_ENABLED
#ifdef SOWRAP_ENABLED
#ifdef DEBUG_ENABLED

View File

@ -127,6 +127,8 @@ public:
virtual void alert(const String &p_alert, const String &p_title = "ALERT!") override;
virtual int get_low_processor_usage_mode_sleep_usec() const override;
virtual bool _check_internal_feature_support(const String &p_feature) override;
void run();

View File

@ -0,0 +1,197 @@
#!/usr/bin/env python
Import("env")
# TODO: Add warning to headers and code about their autogenerated status.
if env["use_sowrap"]:
# We have to implement separate builders for so wrappers as the
# autogenerated Wayland protocol wrapper must include them instead of the
# native libraries.
WAYLAND_BUILDERS_SOWRAP = {
"WAYLAND_API_HEADER": Builder(
action=Action(
"wayland-scanner -c client-header < ${SOURCE} | sed 's:wayland-client-core\.h:../dynwrappers/wayland-client-core-so_wrap\.h:' > ${TARGET}",
'Generating Wayland client header: "${TARGET}"',
),
single_source=True,
),
"WAYLAND_API_CODE": Builder(
action=Action(
"wayland-scanner -c private-code < ${SOURCE} | sed 's:wayland-util\.h:../dynwrappers/wayland-client-core-so_wrap\.h:' > ${TARGET}",
'Generating Wayland protocol marshalling code: "${TARGET}"',
),
single_source=True,
),
}
env.Append(BUILDERS=WAYLAND_BUILDERS_SOWRAP)
else:
WAYLAND_BUILDERS = {
"WAYLAND_API_HEADER": Builder(
action=Action(
"wayland-scanner -c client-header < ${SOURCE} > ${TARGET}",
'Generating Wayland client header: "${TARGET}"',
),
single_source=True,
),
"WAYLAND_API_CODE": Builder(
action=Action(
"wayland-scanner -c private-code < ${SOURCE} > ${TARGET}",
'Generating Wayland protocol marshalling code: "${TARGET}"',
),
single_source=True,
),
}
env.Append(BUILDERS=WAYLAND_BUILDERS)
env.WAYLAND_API_HEADER(target="protocol/wayland.gen.h", source="#thirdparty/wayland/protocol/wayland.xml")
env.WAYLAND_API_CODE(target="protocol/wayland.gen.c", source="#thirdparty/wayland/protocol/wayland.xml")
env.WAYLAND_API_HEADER(
target="protocol/viewporter.gen.h", source="#thirdparty/wayland-protocols/stable/viewporter/viewporter.xml"
)
env.WAYLAND_API_CODE(
target="protocol/viewporter.gen.c", source="#thirdparty/wayland-protocols/stable/viewporter/viewporter.xml"
)
env.WAYLAND_API_HEADER(
target="protocol/fractional_scale.gen.h",
source="#thirdparty/wayland-protocols/staging/fractional-scale/fractional-scale-v1.xml",
)
env.WAYLAND_API_CODE(
target="protocol/fractional_scale.gen.c",
source="#thirdparty/wayland-protocols/staging/fractional-scale/fractional-scale-v1.xml",
)
env.WAYLAND_API_HEADER(
target="protocol/xdg_shell.gen.h", source="#thirdparty/wayland-protocols/stable/xdg-shell/xdg-shell.xml"
)
env.WAYLAND_API_CODE(
target="protocol/xdg_shell.gen.c", source="#thirdparty/wayland-protocols/stable/xdg-shell/xdg-shell.xml"
)
env.WAYLAND_API_HEADER(
target="protocol/xdg_decoration.gen.h",
source="#thirdparty/wayland-protocols/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml",
)
env.WAYLAND_API_CODE(
target="protocol/xdg_decoration.gen.c",
source="#thirdparty/wayland-protocols/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml",
)
env.WAYLAND_API_HEADER(
target="protocol/xdg_activation.gen.h",
source="#thirdparty/wayland-protocols/staging/xdg-activation/xdg-activation-v1.xml",
)
env.WAYLAND_API_CODE(
target="protocol/xdg_activation.gen.c",
source="#thirdparty/wayland-protocols/staging/xdg-activation/xdg-activation-v1.xml",
)
env.WAYLAND_API_HEADER(
target="protocol/relative_pointer.gen.h",
source="#thirdparty/wayland-protocols/unstable/relative-pointer/relative-pointer-unstable-v1.xml",
)
env.WAYLAND_API_CODE(
target="protocol/relative_pointer.gen.c",
source="#thirdparty/wayland-protocols/unstable/relative-pointer/relative-pointer-unstable-v1.xml",
)
env.WAYLAND_API_HEADER(
target="protocol/pointer_constraints.gen.h",
source="#thirdparty/wayland-protocols/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml",
)
env.WAYLAND_API_CODE(
target="protocol/pointer_constraints.gen.c",
source="#thirdparty/wayland-protocols/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml",
)
env.WAYLAND_API_HEADER(
target="protocol/pointer_gestures.gen.h",
source="#thirdparty/wayland-protocols/unstable/pointer-gestures/pointer-gestures-unstable-v1.xml",
)
env.WAYLAND_API_CODE(
target="protocol/pointer_gestures.gen.c",
source="#thirdparty/wayland-protocols/unstable/pointer-gestures/pointer-gestures-unstable-v1.xml",
)
env.WAYLAND_API_HEADER(
target="protocol/primary_selection.gen.h",
source="#thirdparty/wayland-protocols/unstable/primary-selection/primary-selection-unstable-v1.xml",
)
env.WAYLAND_API_CODE(
target="protocol/primary_selection.gen.c",
source="#thirdparty/wayland-protocols/unstable/primary-selection/primary-selection-unstable-v1.xml",
)
env.WAYLAND_API_HEADER(
target="protocol/idle_inhibit.gen.h",
source="#thirdparty/wayland-protocols/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml",
)
env.WAYLAND_API_CODE(
target="protocol/idle_inhibit.gen.c",
source="#thirdparty/wayland-protocols/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml",
)
env.WAYLAND_API_HEADER(
target="protocol/tablet.gen.h",
source="#thirdparty/wayland-protocols/unstable/tablet/tablet-unstable-v2.xml",
)
env.WAYLAND_API_CODE(
target="protocol/tablet.gen.c",
source="#thirdparty/wayland-protocols/unstable/tablet/tablet-unstable-v2.xml",
)
source_files = [
"protocol/wayland.gen.c",
"protocol/viewporter.gen.c",
"protocol/fractional_scale.gen.c",
"protocol/xdg_shell.gen.c",
"protocol/xdg_decoration.gen.c",
"protocol/xdg_activation.gen.c",
"protocol/relative_pointer.gen.c",
"protocol/pointer_constraints.gen.c",
"protocol/pointer_gestures.gen.c",
"protocol/primary_selection.gen.c",
"protocol/idle_inhibit.gen.c",
"protocol/tablet.gen.c",
"display_server_wayland.cpp",
"wayland_thread.cpp",
"key_mapping_xkb.cpp",
"detect_prime_egl.cpp",
]
if env["use_sowrap"]:
source_files.append(
[
"dynwrappers/wayland-cursor-so_wrap.c",
"dynwrappers/wayland-client-core-so_wrap.c",
"dynwrappers/wayland-egl-core-so_wrap.c",
]
)
if env["libdecor"]:
source_files.append("dynwrappers/libdecor-so_wrap.c")
if env["vulkan"]:
source_files.append("vulkan_context_wayland.cpp")
if env["opengl3"]:
source_files.append("egl_manager_wayland.cpp")
objects = []
for source_file in source_files:
objects.append(env.Object(source_file))
Return("objects")

View File

@ -0,0 +1,231 @@
/**************************************************************************/
/* detect_prime_egl.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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 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. */
/**************************************************************************/
#ifdef GLES3_ENABLED
#ifdef EGL_ENABLED
#include "detect_prime_egl.h"
#include "core/string/print_string.h"
#include "core/string/ustring.h"
#include <stdlib.h>
#ifdef GLAD_ENABLED
#include "thirdparty/glad/glad/egl.h"
#include "thirdparty/glad/glad/gl.h"
#else
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <GL/glcorearb.h>
#endif // GLAD_ENABLED
#include <cstring>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
// To prevent shadowing warnings.
#undef glGetString
// Runs inside a child. Exiting will not quit the engine.
void DetectPrimeEGL::create_context() {
#if defined(GLAD_ENABLED)
if (!gladLoaderLoadEGL(nullptr)) {
print_verbose("Unable to load EGL, GPU detection skipped.");
quick_exit(1);
}
#endif
EGLDisplay egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
EGLConfig egl_config;
EGLContext egl_context = EGL_NO_CONTEXT;
eglInitialize(egl_display, NULL, NULL);
#if defined(GLAD_ENABLED)
if (!gladLoaderLoadEGL(egl_display)) {
print_verbose("Unable to load EGL, GPU detection skipped.");
quick_exit(1);
}
#endif
eglBindAPI(EGL_OPENGL_API);
EGLint attribs[] = {
EGL_RED_SIZE,
1,
EGL_BLUE_SIZE,
1,
EGL_GREEN_SIZE,
1,
EGL_DEPTH_SIZE,
24,
EGL_NONE,
};
EGLint config_count = 0;
eglChooseConfig(egl_display, attribs, &egl_config, 1, &config_count);
EGLint context_attribs[] = {
EGL_CONTEXT_MAJOR_VERSION, 3,
EGL_CONTEXT_MINOR_VERSION, 3,
EGL_NONE
};
egl_context = eglCreateContext(egl_display, egl_config, EGL_NO_CONTEXT, context_attribs);
if (egl_context == EGL_NO_CONTEXT) {
print_verbose("Unable to create an EGL context, GPU detection skipped.");
quick_exit(1);
}
eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_context);
}
int DetectPrimeEGL::detect_prime() {
pid_t p;
int priorities[4] = {};
String vendors[4];
String renderers[4];
for (int i = 0; i < 4; ++i) {
vendors[i] = "Unknown";
renderers[i] = "Unknown";
}
for (int i = 0; i < 4; ++i) {
int fdset[2];
if (pipe(fdset) == -1) {
print_verbose("Failed to pipe(), using default GPU");
return 0;
}
// Fork so the driver initialization can crash without taking down the engine.
p = fork();
if (p > 0) {
// Main thread
int stat_loc = 0;
char string[201];
string[200] = '\0';
close(fdset[1]);
waitpid(p, &stat_loc, 0);
if (!stat_loc) {
// No need to do anything complicated here. Anything less than
// PIPE_BUF will be delivered in one read() call.
// Leave it 'Unknown' otherwise.
if (read(fdset[0], string, sizeof(string) - 1) > 0) {
vendors[i] = string;
renderers[i] = string + strlen(string) + 1;
}
}
close(fdset[0]);
} else {
// In child, exit() here will not quit the engine.
// Prevent false leak reports as we will not be properly
// cleaning up these processes, and fork() makes a copy
// of all globals.
CoreGlobals::leak_reporting_enabled = false;
char string[201];
close(fdset[0]);
setenv("DRI_PRIME", itos(i).utf8().ptr(), 1);
create_context();
PFNGLGETSTRINGPROC glGetString = (PFNGLGETSTRINGPROC)eglGetProcAddress("glGetString");
const char *vendor = (const char *)glGetString(GL_VENDOR);
const char *renderer = (const char *)glGetString(GL_RENDERER);
unsigned int vendor_len = strlen(vendor) + 1;
unsigned int renderer_len = strlen(renderer) + 1;
if (vendor_len + renderer_len >= sizeof(string)) {
renderer_len = 200 - vendor_len;
}
memcpy(&string, vendor, vendor_len);
memcpy(&string[vendor_len], renderer, renderer_len);
if (write(fdset[1], string, vendor_len + renderer_len) == -1) {
print_verbose("Couldn't write vendor/renderer string.");
}
close(fdset[1]);
// The function quick_exit() is used because exit() will call destructors on static objects copied by fork().
// These objects will be freed anyway when the process finishes execution.
quick_exit(0);
}
}
int preferred = 0;
int priority = 0;
if (vendors[0] == vendors[1]) {
print_verbose("Only one GPU found, using default.");
return 0;
}
for (int i = 3; i >= 0; --i) {
const Vendor *v = vendor_map;
while (v->glxvendor) {
if (v->glxvendor == vendors[i]) {
priorities[i] = v->priority;
if (v->priority >= priority) {
priority = v->priority;
preferred = i;
}
}
++v;
}
}
print_verbose("Found renderers:");
for (int i = 0; i < 4; ++i) {
print_verbose("Renderer " + itos(i) + ": " + renderers[i] + " with priority: " + itos(priorities[i]));
}
print_verbose("Using renderer: " + renderers[preferred]);
return preferred;
}
#endif // EGL_ENABLED
#endif // GLES3_ENABLED

View File

@ -0,0 +1,65 @@
/**************************************************************************/
/* detect_prime_egl.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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 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. */
/**************************************************************************/
#ifndef DETECT_PRIME_EGL_H
#define DETECT_PRIME_EGL_H
#ifdef GLES3_ENABLED
#ifdef EGL_ENABLED
class DetectPrimeEGL {
private:
struct Vendor {
const char *glxvendor = nullptr;
int priority = 0;
};
static constexpr Vendor vendor_map[] = {
{ "Advanced Micro Devices, Inc.", 30 },
{ "AMD", 30 },
{ "NVIDIA Corporation", 30 },
{ "X.Org", 30 },
{ "Intel Open Source Technology Center", 20 },
{ "Intel", 20 },
{ "nouveau", 10 },
{ "Mesa Project", 0 },
{ nullptr, 0 }
};
static void create_context();
public:
static int detect_prime();
};
#endif // GLES3_ENABLED
#endif // EGL_ENABLED
#endif // DETECT_PRIME_EGL_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,290 @@
/**************************************************************************/
/* display_server_wayland.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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 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. */
/**************************************************************************/
#ifndef DISPLAY_SERVER_WAYLAND_H
#define DISPLAY_SERVER_WAYLAND_H
#ifdef WAYLAND_ENABLED
#include "wayland/wayland_thread.h"
#ifdef RD_ENABLED
#include "servers/rendering/rendering_device.h"
#ifdef VULKAN_ENABLED
#include "wayland/vulkan_context_wayland.h"
#endif
#endif //RD_ENABLED
#ifdef GLES3_ENABLED
#include "wayland/egl_manager_wayland.h"
#endif
#if defined(SPEECHD_ENABLED)
#include "tts_linux.h"
#endif
#ifdef DBUS_ENABLED
#include "freedesktop_portal_desktop.h"
#include "freedesktop_screensaver.h"
#endif
#include "core/config/project_settings.h"
#include "core/input/input.h"
#include "scene/resources/atlas_texture.h"
#include "scene/resources/texture.h"
#include "servers/display_server.h"
#include <limits.h>
#include <stdio.h>
#undef CursorShape
class DisplayServerWayland : public DisplayServer {
// No need to register with GDCLASS, it's platform-specific and nothing is added.
struct WindowData {
WindowID id;
Rect2i rect;
Size2i max_size;
Size2i min_size;
Rect2i safe_rect;
#ifdef GLES3_ENABLED
struct wl_egl_window *wl_egl_window = nullptr;
#endif
// Flags whether we have allocated a buffer through the video drivers.
bool visible = false;
DisplayServer::VSyncMode vsync_mode = VSYNC_ENABLED;
uint32_t flags = 0;
DisplayServer::WindowMode mode = WINDOW_MODE_WINDOWED;
Callable rect_changed_callback;
Callable window_event_callback;
Callable input_event_callback;
Callable drop_files_callback;
Callable input_text_callback;
String title;
ObjectID instance_id;
};
struct CustomCursor {
RID rid;
Point2i hotspot;
};
CursorShape cursor_shape = CURSOR_ARROW;
DisplayServer::MouseMode mouse_mode = DisplayServer::MOUSE_MODE_VISIBLE;
HashMap<CursorShape, CustomCursor> custom_cursors;
WindowData main_window;
WaylandThread wayland_thread;
Context context;
bool frame = false;
bool emulate_vsync = false;
String rendering_driver;
#ifdef RD_ENABLED
ApiContextRD *context_rd = nullptr;
RenderingDevice *rendering_device = nullptr;
#endif
#ifdef GLES3_ENABLED
EGLManagerWayland *egl_manager = nullptr;
#endif
#ifdef SPEECHD_ENABLED
TTS_Linux *tts = nullptr;
#endif
#if DBUS_ENABLED
FreeDesktopPortalDesktop *portal_desktop = nullptr;
FreeDesktopScreenSaver *screensaver = nullptr;
bool screensaver_inhibited = false;
#endif
static String _get_app_id_from_context(Context p_context);
void _send_window_event(WindowEvent p_event);
static void dispatch_input_events(const Ref<InputEvent> &p_event);
void _dispatch_input_event(const Ref<InputEvent> &p_event);
void _resize_window(const Size2i &p_size);
virtual void _show_window();
public:
virtual bool has_feature(Feature p_feature) const override;
virtual String get_name() const override;
#ifdef SPEECHD_ENABLED
virtual bool tts_is_speaking() const override;
virtual bool tts_is_paused() const override;
virtual TypedArray<Dictionary> tts_get_voices() const override;
virtual void tts_speak(const String &p_text, const String &p_voice, int p_volume = 50, float p_pitch = 1.f, float p_rate = 1.f, int p_utterance_id = 0, bool p_interrupt = false) override;
virtual void tts_pause() override;
virtual void tts_resume() override;
virtual void tts_stop() override;
#endif
#ifdef DBUS_ENABLED
virtual bool is_dark_mode_supported() const override;
virtual bool is_dark_mode() const override;
#endif
virtual void mouse_set_mode(MouseMode p_mode) override;
virtual MouseMode mouse_get_mode() const override;
virtual void warp_mouse(const Point2i &p_to) override;
virtual Point2i mouse_get_position() const override;
virtual BitField<MouseButtonMask> mouse_get_button_state() const override;
virtual void clipboard_set(const String &p_text) override;
virtual String clipboard_get() const override;
virtual Ref<Image> clipboard_get_image() const override;
virtual void clipboard_set_primary(const String &p_text) override;
virtual String clipboard_get_primary() const override;
virtual int get_screen_count() const override;
virtual int get_primary_screen() const override;
virtual Point2i screen_get_position(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
virtual Size2i screen_get_size(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
virtual Rect2i screen_get_usable_rect(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
virtual int screen_get_dpi(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
virtual float screen_get_scale(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
virtual void screen_set_keep_on(bool p_enable) override;
virtual bool screen_is_kept_on() const override;
virtual Vector<DisplayServer::WindowID> get_window_list() const override;
virtual WindowID get_window_at_screen_position(const Point2i &p_position) const override;
virtual void window_attach_instance_id(ObjectID p_instance, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual ObjectID window_get_attached_instance_id(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual void window_set_title(const String &p_title, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual void window_set_mouse_passthrough(const Vector<Vector2> &p_region, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual void window_set_rect_changed_callback(const Callable &p_callable, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual void window_set_window_event_callback(const Callable &p_callable, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual void window_set_input_event_callback(const Callable &p_callable, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual void window_set_input_text_callback(const Callable &p_callable, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual void window_set_drop_files_callback(const Callable &p_callable, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual int window_get_current_screen(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual void window_set_current_screen(int p_screen, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual Point2i window_get_position(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual Point2i window_get_position_with_decorations(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual void window_set_position(const Point2i &p_position, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual void window_set_max_size(const Size2i p_size, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual Size2i window_get_max_size(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual void gl_window_make_current(DisplayServer::WindowID p_window_id) override;
virtual void window_set_transient(WindowID p_window_id, WindowID p_parent) override;
virtual void window_set_min_size(const Size2i p_size, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual Size2i window_get_min_size(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual void window_set_size(const Size2i p_size, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual Size2i window_get_size(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual Size2i window_get_size_with_decorations(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual void window_set_mode(WindowMode p_mode, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual WindowMode window_get_mode(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual bool window_is_maximize_allowed(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual void window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual bool window_get_flag(WindowFlags p_flag, WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual void window_request_attention(WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual void window_move_to_foreground(WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual bool window_is_focused(WindowID p_window = MAIN_WINDOW_ID) const override;
virtual bool window_can_draw(WindowID p_window_id = MAIN_WINDOW_ID) const override;
virtual bool can_any_window_draw() const override;
virtual void window_set_ime_active(const bool p_active, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual void window_set_ime_position(const Point2i &p_pos, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual void window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window_id = MAIN_WINDOW_ID) override;
virtual DisplayServer::VSyncMode window_get_vsync_mode(WindowID p_window_id) const override;
virtual void cursor_set_shape(CursorShape p_shape) override;
virtual CursorShape cursor_get_shape() const override;
virtual void cursor_set_custom_image(const Ref<Resource> &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) override;
virtual int keyboard_get_layout_count() const override;
virtual int keyboard_get_current_layout() const override;
virtual void keyboard_set_current_layout(int p_index) override;
virtual String keyboard_get_layout_language(int p_index) const override;
virtual String keyboard_get_layout_name(int p_index) const override;
virtual Key keyboard_get_keycode_from_physical(Key p_keycode) const override;
virtual void process_events() override;
virtual void release_rendering_thread() override;
virtual void make_rendering_thread() override;
virtual void swap_buffers() override;
virtual void set_context(Context p_context) override;
static DisplayServer *create_func(const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Point2i *p_position, const Size2i &p_resolution, int p_screen, Error &r_error);
static Vector<String> get_rendering_drivers_func();
static void register_wayland_driver();
DisplayServerWayland(const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error);
~DisplayServerWayland();
};
#endif // WAYLAND_ENABLED
#endif // DISPLAY_SERVER_WAYLAND_H

View File

@ -0,0 +1,453 @@
// This file is generated. Do not edit!
// see https://github.com/hpvb/dynload-wrapper for details
// generated by ./generate-wrapper.py 0.3 on 2022-12-12 10:55:19
// flags: ./generate-wrapper.py --include /usr/include/libdecor-0/libdecor.h --sys-include <libdecor-0/libdecor.h> --soname libdecor-0.so.0 --init-name libdecor --output-header libdecor-so_wrap.h --output-implementation libdecor-so_wrap.c --omit-prefix wl_
//
// EDIT: This has been handpatched to properly report the pointer type of the window_state argument of libdecor_configuration_get_window_state.
#include <stdint.h>
#define libdecor_unref libdecor_unref_dylibloader_orig_libdecor
#define libdecor_new libdecor_new_dylibloader_orig_libdecor
#define libdecor_get_fd libdecor_get_fd_dylibloader_orig_libdecor
#define libdecor_dispatch libdecor_dispatch_dylibloader_orig_libdecor
#define libdecor_decorate libdecor_decorate_dylibloader_orig_libdecor
#define libdecor_frame_ref libdecor_frame_ref_dylibloader_orig_libdecor
#define libdecor_frame_unref libdecor_frame_unref_dylibloader_orig_libdecor
#define libdecor_frame_set_visibility libdecor_frame_set_visibility_dylibloader_orig_libdecor
#define libdecor_frame_is_visible libdecor_frame_is_visible_dylibloader_orig_libdecor
#define libdecor_frame_set_parent libdecor_frame_set_parent_dylibloader_orig_libdecor
#define libdecor_frame_set_title libdecor_frame_set_title_dylibloader_orig_libdecor
#define libdecor_frame_get_title libdecor_frame_get_title_dylibloader_orig_libdecor
#define libdecor_frame_set_app_id libdecor_frame_set_app_id_dylibloader_orig_libdecor
#define libdecor_frame_set_capabilities libdecor_frame_set_capabilities_dylibloader_orig_libdecor
#define libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_dylibloader_orig_libdecor
#define libdecor_frame_has_capability libdecor_frame_has_capability_dylibloader_orig_libdecor
#define libdecor_frame_show_window_menu libdecor_frame_show_window_menu_dylibloader_orig_libdecor
#define libdecor_frame_popup_grab libdecor_frame_popup_grab_dylibloader_orig_libdecor
#define libdecor_frame_popup_ungrab libdecor_frame_popup_ungrab_dylibloader_orig_libdecor
#define libdecor_frame_translate_coordinate libdecor_frame_translate_coordinate_dylibloader_orig_libdecor
#define libdecor_frame_set_min_content_size libdecor_frame_set_min_content_size_dylibloader_orig_libdecor
#define libdecor_frame_set_max_content_size libdecor_frame_set_max_content_size_dylibloader_orig_libdecor
#define libdecor_frame_resize libdecor_frame_resize_dylibloader_orig_libdecor
#define libdecor_frame_move libdecor_frame_move_dylibloader_orig_libdecor
#define libdecor_frame_commit libdecor_frame_commit_dylibloader_orig_libdecor
#define libdecor_frame_set_minimized libdecor_frame_set_minimized_dylibloader_orig_libdecor
#define libdecor_frame_set_maximized libdecor_frame_set_maximized_dylibloader_orig_libdecor
#define libdecor_frame_unset_maximized libdecor_frame_unset_maximized_dylibloader_orig_libdecor
#define libdecor_frame_set_fullscreen libdecor_frame_set_fullscreen_dylibloader_orig_libdecor
#define libdecor_frame_unset_fullscreen libdecor_frame_unset_fullscreen_dylibloader_orig_libdecor
#define libdecor_frame_is_floating libdecor_frame_is_floating_dylibloader_orig_libdecor
#define libdecor_frame_close libdecor_frame_close_dylibloader_orig_libdecor
#define libdecor_frame_map libdecor_frame_map_dylibloader_orig_libdecor
#define libdecor_frame_get_xdg_surface libdecor_frame_get_xdg_surface_dylibloader_orig_libdecor
#define libdecor_frame_get_xdg_toplevel libdecor_frame_get_xdg_toplevel_dylibloader_orig_libdecor
#define libdecor_state_new libdecor_state_new_dylibloader_orig_libdecor
#define libdecor_state_free libdecor_state_free_dylibloader_orig_libdecor
#define libdecor_configuration_get_content_size libdecor_configuration_get_content_size_dylibloader_orig_libdecor
#define libdecor_configuration_get_window_state libdecor_configuration_get_window_state_dylibloader_orig_libdecor
#include <libdecor-0/libdecor.h>
#undef libdecor_unref
#undef libdecor_new
#undef libdecor_get_fd
#undef libdecor_dispatch
#undef libdecor_decorate
#undef libdecor_frame_ref
#undef libdecor_frame_unref
#undef libdecor_frame_set_visibility
#undef libdecor_frame_is_visible
#undef libdecor_frame_set_parent
#undef libdecor_frame_set_title
#undef libdecor_frame_get_title
#undef libdecor_frame_set_app_id
#undef libdecor_frame_set_capabilities
#undef libdecor_frame_unset_capabilities
#undef libdecor_frame_has_capability
#undef libdecor_frame_show_window_menu
#undef libdecor_frame_popup_grab
#undef libdecor_frame_popup_ungrab
#undef libdecor_frame_translate_coordinate
#undef libdecor_frame_set_min_content_size
#undef libdecor_frame_set_max_content_size
#undef libdecor_frame_resize
#undef libdecor_frame_move
#undef libdecor_frame_commit
#undef libdecor_frame_set_minimized
#undef libdecor_frame_set_maximized
#undef libdecor_frame_unset_maximized
#undef libdecor_frame_set_fullscreen
#undef libdecor_frame_unset_fullscreen
#undef libdecor_frame_is_floating
#undef libdecor_frame_close
#undef libdecor_frame_map
#undef libdecor_frame_get_xdg_surface
#undef libdecor_frame_get_xdg_toplevel
#undef libdecor_state_new
#undef libdecor_state_free
#undef libdecor_configuration_get_content_size
#undef libdecor_configuration_get_window_state
#include <dlfcn.h>
#include <stdio.h>
void (*libdecor_unref_dylibloader_wrapper_libdecor)(struct libdecor*);
struct libdecor* (*libdecor_new_dylibloader_wrapper_libdecor)(struct wl_display*,struct libdecor_interface*);
int (*libdecor_get_fd_dylibloader_wrapper_libdecor)(struct libdecor*);
int (*libdecor_dispatch_dylibloader_wrapper_libdecor)(struct libdecor*, int);
struct libdecor_frame* (*libdecor_decorate_dylibloader_wrapper_libdecor)(struct libdecor*,struct wl_surface*,struct libdecor_frame_interface*, void*);
void (*libdecor_frame_ref_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
void (*libdecor_frame_unref_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
void (*libdecor_frame_set_visibility_dylibloader_wrapper_libdecor)(struct libdecor_frame*, bool);
bool (*libdecor_frame_is_visible_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
void (*libdecor_frame_set_parent_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct libdecor_frame*);
void (*libdecor_frame_set_title_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
const char* (*libdecor_frame_get_title_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
void (*libdecor_frame_set_app_id_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
void (*libdecor_frame_set_capabilities_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
void (*libdecor_frame_unset_capabilities_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
bool (*libdecor_frame_has_capability_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
void (*libdecor_frame_show_window_menu_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t, int, int);
void (*libdecor_frame_popup_grab_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
void (*libdecor_frame_popup_ungrab_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
void (*libdecor_frame_translate_coordinate_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int, int*, int*);
void (*libdecor_frame_set_min_content_size_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int);
void (*libdecor_frame_set_max_content_size_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int);
void (*libdecor_frame_resize_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t,enum libdecor_resize_edge);
void (*libdecor_frame_move_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t);
void (*libdecor_frame_commit_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct libdecor_state*,struct libdecor_configuration*);
void (*libdecor_frame_set_minimized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
void (*libdecor_frame_set_maximized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
void (*libdecor_frame_unset_maximized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
void (*libdecor_frame_set_fullscreen_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_output*);
void (*libdecor_frame_unset_fullscreen_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
bool (*libdecor_frame_is_floating_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
void (*libdecor_frame_close_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
void (*libdecor_frame_map_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
struct xdg_surface* (*libdecor_frame_get_xdg_surface_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
struct xdg_toplevel* (*libdecor_frame_get_xdg_toplevel_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
struct libdecor_state* (*libdecor_state_new_dylibloader_wrapper_libdecor)( int, int);
void (*libdecor_state_free_dylibloader_wrapper_libdecor)(struct libdecor_state*);
bool (*libdecor_configuration_get_content_size_dylibloader_wrapper_libdecor)(struct libdecor_configuration*,struct libdecor_frame*, int*, int*);
bool (*libdecor_configuration_get_window_state_dylibloader_wrapper_libdecor)(struct libdecor_configuration*,enum libdecor_window_state*);
int initialize_libdecor(int verbose) {
void *handle;
char *error;
handle = dlopen("libdecor-0.so.0", RTLD_LAZY);
if (!handle) {
if (verbose) {
fprintf(stderr, "%s\n", dlerror());
}
return(1);
}
dlerror();
// libdecor_unref
*(void **) (&libdecor_unref_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_unref");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_new
*(void **) (&libdecor_new_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_new");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_get_fd
*(void **) (&libdecor_get_fd_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_get_fd");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_dispatch
*(void **) (&libdecor_dispatch_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_dispatch");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_decorate
*(void **) (&libdecor_decorate_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_decorate");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_ref
*(void **) (&libdecor_frame_ref_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_ref");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_unref
*(void **) (&libdecor_frame_unref_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_unref");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_set_visibility
*(void **) (&libdecor_frame_set_visibility_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_visibility");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_is_visible
*(void **) (&libdecor_frame_is_visible_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_is_visible");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_set_parent
*(void **) (&libdecor_frame_set_parent_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_parent");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_set_title
*(void **) (&libdecor_frame_set_title_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_title");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_get_title
*(void **) (&libdecor_frame_get_title_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_get_title");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_set_app_id
*(void **) (&libdecor_frame_set_app_id_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_app_id");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_set_capabilities
*(void **) (&libdecor_frame_set_capabilities_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_capabilities");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_unset_capabilities
*(void **) (&libdecor_frame_unset_capabilities_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_unset_capabilities");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_has_capability
*(void **) (&libdecor_frame_has_capability_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_has_capability");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_show_window_menu
*(void **) (&libdecor_frame_show_window_menu_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_show_window_menu");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_popup_grab
*(void **) (&libdecor_frame_popup_grab_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_popup_grab");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_popup_ungrab
*(void **) (&libdecor_frame_popup_ungrab_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_popup_ungrab");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_translate_coordinate
*(void **) (&libdecor_frame_translate_coordinate_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_translate_coordinate");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_set_min_content_size
*(void **) (&libdecor_frame_set_min_content_size_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_min_content_size");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_set_max_content_size
*(void **) (&libdecor_frame_set_max_content_size_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_max_content_size");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_resize
*(void **) (&libdecor_frame_resize_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_resize");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_move
*(void **) (&libdecor_frame_move_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_move");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_commit
*(void **) (&libdecor_frame_commit_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_commit");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_set_minimized
*(void **) (&libdecor_frame_set_minimized_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_minimized");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_set_maximized
*(void **) (&libdecor_frame_set_maximized_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_maximized");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_unset_maximized
*(void **) (&libdecor_frame_unset_maximized_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_unset_maximized");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_set_fullscreen
*(void **) (&libdecor_frame_set_fullscreen_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_set_fullscreen");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_unset_fullscreen
*(void **) (&libdecor_frame_unset_fullscreen_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_unset_fullscreen");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_is_floating
*(void **) (&libdecor_frame_is_floating_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_is_floating");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_close
*(void **) (&libdecor_frame_close_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_close");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_map
*(void **) (&libdecor_frame_map_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_map");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_get_xdg_surface
*(void **) (&libdecor_frame_get_xdg_surface_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_get_xdg_surface");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_frame_get_xdg_toplevel
*(void **) (&libdecor_frame_get_xdg_toplevel_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_frame_get_xdg_toplevel");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_state_new
*(void **) (&libdecor_state_new_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_state_new");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_state_free
*(void **) (&libdecor_state_free_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_state_free");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_configuration_get_content_size
*(void **) (&libdecor_configuration_get_content_size_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_configuration_get_content_size");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// libdecor_configuration_get_window_state
*(void **) (&libdecor_configuration_get_window_state_dylibloader_wrapper_libdecor) = dlsym(handle, "libdecor_configuration_get_window_state");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
return 0;
}

View File

@ -0,0 +1,175 @@
#ifndef DYLIBLOAD_WRAPPER_LIBDECOR
#define DYLIBLOAD_WRAPPER_LIBDECOR
// This file is generated. Do not edit!
// see https://github.com/hpvb/dynload-wrapper for details
// generated by ./generate-wrapper.py 0.3 on 2022-12-12 10:55:19
// flags: ./generate-wrapper.py --include /usr/include/libdecor-0/libdecor.h --sys-include <libdecor-0/libdecor.h> --soname libdecor-0.so.0 --init-name libdecor --output-header libdecor-so_wrap.h --output-implementation libdecor-so_wrap.c --omit-prefix wl_
//
// EDIT: This has been handpatched to properly report the pointer type of the window_state argument of libdecor_configuration_get_window_state.
#include <stdint.h>
#define libdecor_unref libdecor_unref_dylibloader_orig_libdecor
#define libdecor_new libdecor_new_dylibloader_orig_libdecor
#define libdecor_get_fd libdecor_get_fd_dylibloader_orig_libdecor
#define libdecor_dispatch libdecor_dispatch_dylibloader_orig_libdecor
#define libdecor_decorate libdecor_decorate_dylibloader_orig_libdecor
#define libdecor_frame_ref libdecor_frame_ref_dylibloader_orig_libdecor
#define libdecor_frame_unref libdecor_frame_unref_dylibloader_orig_libdecor
#define libdecor_frame_set_visibility libdecor_frame_set_visibility_dylibloader_orig_libdecor
#define libdecor_frame_is_visible libdecor_frame_is_visible_dylibloader_orig_libdecor
#define libdecor_frame_set_parent libdecor_frame_set_parent_dylibloader_orig_libdecor
#define libdecor_frame_set_title libdecor_frame_set_title_dylibloader_orig_libdecor
#define libdecor_frame_get_title libdecor_frame_get_title_dylibloader_orig_libdecor
#define libdecor_frame_set_app_id libdecor_frame_set_app_id_dylibloader_orig_libdecor
#define libdecor_frame_set_capabilities libdecor_frame_set_capabilities_dylibloader_orig_libdecor
#define libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_dylibloader_orig_libdecor
#define libdecor_frame_has_capability libdecor_frame_has_capability_dylibloader_orig_libdecor
#define libdecor_frame_show_window_menu libdecor_frame_show_window_menu_dylibloader_orig_libdecor
#define libdecor_frame_popup_grab libdecor_frame_popup_grab_dylibloader_orig_libdecor
#define libdecor_frame_popup_ungrab libdecor_frame_popup_ungrab_dylibloader_orig_libdecor
#define libdecor_frame_translate_coordinate libdecor_frame_translate_coordinate_dylibloader_orig_libdecor
#define libdecor_frame_set_min_content_size libdecor_frame_set_min_content_size_dylibloader_orig_libdecor
#define libdecor_frame_set_max_content_size libdecor_frame_set_max_content_size_dylibloader_orig_libdecor
#define libdecor_frame_resize libdecor_frame_resize_dylibloader_orig_libdecor
#define libdecor_frame_move libdecor_frame_move_dylibloader_orig_libdecor
#define libdecor_frame_commit libdecor_frame_commit_dylibloader_orig_libdecor
#define libdecor_frame_set_minimized libdecor_frame_set_minimized_dylibloader_orig_libdecor
#define libdecor_frame_set_maximized libdecor_frame_set_maximized_dylibloader_orig_libdecor
#define libdecor_frame_unset_maximized libdecor_frame_unset_maximized_dylibloader_orig_libdecor
#define libdecor_frame_set_fullscreen libdecor_frame_set_fullscreen_dylibloader_orig_libdecor
#define libdecor_frame_unset_fullscreen libdecor_frame_unset_fullscreen_dylibloader_orig_libdecor
#define libdecor_frame_is_floating libdecor_frame_is_floating_dylibloader_orig_libdecor
#define libdecor_frame_close libdecor_frame_close_dylibloader_orig_libdecor
#define libdecor_frame_map libdecor_frame_map_dylibloader_orig_libdecor
#define libdecor_frame_get_xdg_surface libdecor_frame_get_xdg_surface_dylibloader_orig_libdecor
#define libdecor_frame_get_xdg_toplevel libdecor_frame_get_xdg_toplevel_dylibloader_orig_libdecor
#define libdecor_state_new libdecor_state_new_dylibloader_orig_libdecor
#define libdecor_state_free libdecor_state_free_dylibloader_orig_libdecor
#define libdecor_configuration_get_content_size libdecor_configuration_get_content_size_dylibloader_orig_libdecor
#define libdecor_configuration_get_window_state libdecor_configuration_get_window_state_dylibloader_orig_libdecor
#include <libdecor-0/libdecor.h>
#undef libdecor_unref
#undef libdecor_new
#undef libdecor_get_fd
#undef libdecor_dispatch
#undef libdecor_decorate
#undef libdecor_frame_ref
#undef libdecor_frame_unref
#undef libdecor_frame_set_visibility
#undef libdecor_frame_is_visible
#undef libdecor_frame_set_parent
#undef libdecor_frame_set_title
#undef libdecor_frame_get_title
#undef libdecor_frame_set_app_id
#undef libdecor_frame_set_capabilities
#undef libdecor_frame_unset_capabilities
#undef libdecor_frame_has_capability
#undef libdecor_frame_show_window_menu
#undef libdecor_frame_popup_grab
#undef libdecor_frame_popup_ungrab
#undef libdecor_frame_translate_coordinate
#undef libdecor_frame_set_min_content_size
#undef libdecor_frame_set_max_content_size
#undef libdecor_frame_resize
#undef libdecor_frame_move
#undef libdecor_frame_commit
#undef libdecor_frame_set_minimized
#undef libdecor_frame_set_maximized
#undef libdecor_frame_unset_maximized
#undef libdecor_frame_set_fullscreen
#undef libdecor_frame_unset_fullscreen
#undef libdecor_frame_is_floating
#undef libdecor_frame_close
#undef libdecor_frame_map
#undef libdecor_frame_get_xdg_surface
#undef libdecor_frame_get_xdg_toplevel
#undef libdecor_state_new
#undef libdecor_state_free
#undef libdecor_configuration_get_content_size
#undef libdecor_configuration_get_window_state
#ifdef __cplusplus
extern "C" {
#endif
#define libdecor_unref libdecor_unref_dylibloader_wrapper_libdecor
#define libdecor_new libdecor_new_dylibloader_wrapper_libdecor
#define libdecor_get_fd libdecor_get_fd_dylibloader_wrapper_libdecor
#define libdecor_dispatch libdecor_dispatch_dylibloader_wrapper_libdecor
#define libdecor_decorate libdecor_decorate_dylibloader_wrapper_libdecor
#define libdecor_frame_ref libdecor_frame_ref_dylibloader_wrapper_libdecor
#define libdecor_frame_unref libdecor_frame_unref_dylibloader_wrapper_libdecor
#define libdecor_frame_set_visibility libdecor_frame_set_visibility_dylibloader_wrapper_libdecor
#define libdecor_frame_is_visible libdecor_frame_is_visible_dylibloader_wrapper_libdecor
#define libdecor_frame_set_parent libdecor_frame_set_parent_dylibloader_wrapper_libdecor
#define libdecor_frame_set_title libdecor_frame_set_title_dylibloader_wrapper_libdecor
#define libdecor_frame_get_title libdecor_frame_get_title_dylibloader_wrapper_libdecor
#define libdecor_frame_set_app_id libdecor_frame_set_app_id_dylibloader_wrapper_libdecor
#define libdecor_frame_set_capabilities libdecor_frame_set_capabilities_dylibloader_wrapper_libdecor
#define libdecor_frame_unset_capabilities libdecor_frame_unset_capabilities_dylibloader_wrapper_libdecor
#define libdecor_frame_has_capability libdecor_frame_has_capability_dylibloader_wrapper_libdecor
#define libdecor_frame_show_window_menu libdecor_frame_show_window_menu_dylibloader_wrapper_libdecor
#define libdecor_frame_popup_grab libdecor_frame_popup_grab_dylibloader_wrapper_libdecor
#define libdecor_frame_popup_ungrab libdecor_frame_popup_ungrab_dylibloader_wrapper_libdecor
#define libdecor_frame_translate_coordinate libdecor_frame_translate_coordinate_dylibloader_wrapper_libdecor
#define libdecor_frame_set_min_content_size libdecor_frame_set_min_content_size_dylibloader_wrapper_libdecor
#define libdecor_frame_set_max_content_size libdecor_frame_set_max_content_size_dylibloader_wrapper_libdecor
#define libdecor_frame_resize libdecor_frame_resize_dylibloader_wrapper_libdecor
#define libdecor_frame_move libdecor_frame_move_dylibloader_wrapper_libdecor
#define libdecor_frame_commit libdecor_frame_commit_dylibloader_wrapper_libdecor
#define libdecor_frame_set_minimized libdecor_frame_set_minimized_dylibloader_wrapper_libdecor
#define libdecor_frame_set_maximized libdecor_frame_set_maximized_dylibloader_wrapper_libdecor
#define libdecor_frame_unset_maximized libdecor_frame_unset_maximized_dylibloader_wrapper_libdecor
#define libdecor_frame_set_fullscreen libdecor_frame_set_fullscreen_dylibloader_wrapper_libdecor
#define libdecor_frame_unset_fullscreen libdecor_frame_unset_fullscreen_dylibloader_wrapper_libdecor
#define libdecor_frame_is_floating libdecor_frame_is_floating_dylibloader_wrapper_libdecor
#define libdecor_frame_close libdecor_frame_close_dylibloader_wrapper_libdecor
#define libdecor_frame_map libdecor_frame_map_dylibloader_wrapper_libdecor
#define libdecor_frame_get_xdg_surface libdecor_frame_get_xdg_surface_dylibloader_wrapper_libdecor
#define libdecor_frame_get_xdg_toplevel libdecor_frame_get_xdg_toplevel_dylibloader_wrapper_libdecor
#define libdecor_state_new libdecor_state_new_dylibloader_wrapper_libdecor
#define libdecor_state_free libdecor_state_free_dylibloader_wrapper_libdecor
#define libdecor_configuration_get_content_size libdecor_configuration_get_content_size_dylibloader_wrapper_libdecor
#define libdecor_configuration_get_window_state libdecor_configuration_get_window_state_dylibloader_wrapper_libdecor
extern void (*libdecor_unref_dylibloader_wrapper_libdecor)(struct libdecor*);
extern struct libdecor* (*libdecor_new_dylibloader_wrapper_libdecor)(struct wl_display*,struct libdecor_interface*);
extern int (*libdecor_get_fd_dylibloader_wrapper_libdecor)(struct libdecor*);
extern int (*libdecor_dispatch_dylibloader_wrapper_libdecor)(struct libdecor*, int);
extern struct libdecor_frame* (*libdecor_decorate_dylibloader_wrapper_libdecor)(struct libdecor*,struct wl_surface*,struct libdecor_frame_interface*, void*);
extern void (*libdecor_frame_ref_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern void (*libdecor_frame_unref_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern void (*libdecor_frame_set_visibility_dylibloader_wrapper_libdecor)(struct libdecor_frame*, bool);
extern bool (*libdecor_frame_is_visible_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern void (*libdecor_frame_set_parent_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct libdecor_frame*);
extern void (*libdecor_frame_set_title_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
extern const char* (*libdecor_frame_get_title_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern void (*libdecor_frame_set_app_id_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
extern void (*libdecor_frame_set_capabilities_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
extern void (*libdecor_frame_unset_capabilities_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
extern bool (*libdecor_frame_has_capability_dylibloader_wrapper_libdecor)(struct libdecor_frame*,enum libdecor_capabilities);
extern void (*libdecor_frame_show_window_menu_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t, int, int);
extern void (*libdecor_frame_popup_grab_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
extern void (*libdecor_frame_popup_ungrab_dylibloader_wrapper_libdecor)(struct libdecor_frame*,const char*);
extern void (*libdecor_frame_translate_coordinate_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int, int*, int*);
extern void (*libdecor_frame_set_min_content_size_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int);
extern void (*libdecor_frame_set_max_content_size_dylibloader_wrapper_libdecor)(struct libdecor_frame*, int, int);
extern void (*libdecor_frame_resize_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t,enum libdecor_resize_edge);
extern void (*libdecor_frame_move_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_seat*, uint32_t);
extern void (*libdecor_frame_commit_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct libdecor_state*,struct libdecor_configuration*);
extern void (*libdecor_frame_set_minimized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern void (*libdecor_frame_set_maximized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern void (*libdecor_frame_unset_maximized_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern void (*libdecor_frame_set_fullscreen_dylibloader_wrapper_libdecor)(struct libdecor_frame*,struct wl_output*);
extern void (*libdecor_frame_unset_fullscreen_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern bool (*libdecor_frame_is_floating_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern void (*libdecor_frame_close_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern void (*libdecor_frame_map_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern struct xdg_surface* (*libdecor_frame_get_xdg_surface_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern struct xdg_toplevel* (*libdecor_frame_get_xdg_toplevel_dylibloader_wrapper_libdecor)(struct libdecor_frame*);
extern struct libdecor_state* (*libdecor_state_new_dylibloader_wrapper_libdecor)( int, int);
extern void (*libdecor_state_free_dylibloader_wrapper_libdecor)(struct libdecor_state*);
extern bool (*libdecor_configuration_get_content_size_dylibloader_wrapper_libdecor)(struct libdecor_configuration*,struct libdecor_frame*, int*, int*);
extern bool (*libdecor_configuration_get_window_state_dylibloader_wrapper_libdecor)(struct libdecor_configuration*,enum libdecor_window_state*);
int initialize_libdecor(int verbose);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,607 @@
// This file is generated. Do not edit!
// see https://github.com/hpvb/dynload-wrapper for details
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:36:12
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h" --soname libwayland-client.so.0 --init-name wayland_client --output-header platform/linuxbsd/wayland/dynwrappers/wayland-client-core-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-client-core-so_wrap.c
//
// NOTE: This has been hand-patched to workaround some issues.
#include <stdint.h>
#define wl_list_init wl_list_init_dylibloader_orig_wayland_client
#define wl_list_insert wl_list_insert_dylibloader_orig_wayland_client
#define wl_list_remove wl_list_remove_dylibloader_orig_wayland_client
#define wl_list_length wl_list_length_dylibloader_orig_wayland_client
#define wl_list_empty wl_list_empty_dylibloader_orig_wayland_client
#define wl_list_insert_list wl_list_insert_list_dylibloader_orig_wayland_client
#define wl_array_init wl_array_init_dylibloader_orig_wayland_client
#define wl_array_release wl_array_release_dylibloader_orig_wayland_client
#define wl_array_add wl_array_add_dylibloader_orig_wayland_client
#define wl_array_copy wl_array_copy_dylibloader_orig_wayland_client
#define wl_event_queue_destroy wl_event_queue_destroy_dylibloader_orig_wayland_client
#define wl_proxy_marshal_flags wl_proxy_marshal_flags_dylibloader_orig_wayland_client
#define wl_proxy_marshal_array_flags wl_proxy_marshal_array_flags_dylibloader_orig_wayland_client
#define wl_proxy_marshal wl_proxy_marshal_dylibloader_orig_wayland_client
#define wl_proxy_marshal_array wl_proxy_marshal_array_dylibloader_orig_wayland_client
#define wl_proxy_create wl_proxy_create_dylibloader_orig_wayland_client
#define wl_proxy_create_wrapper wl_proxy_create_wrapper_dylibloader_orig_wayland_client
#define wl_proxy_wrapper_destroy wl_proxy_wrapper_destroy_dylibloader_orig_wayland_client
#define wl_proxy_marshal_constructor wl_proxy_marshal_constructor_dylibloader_orig_wayland_client
#define wl_proxy_marshal_constructor_versioned wl_proxy_marshal_constructor_versioned_dylibloader_orig_wayland_client
#define wl_proxy_marshal_array_constructor wl_proxy_marshal_array_constructor_dylibloader_orig_wayland_client
#define wl_proxy_marshal_array_constructor_versioned wl_proxy_marshal_array_constructor_versioned_dylibloader_orig_wayland_client
#define wl_proxy_destroy wl_proxy_destroy_dylibloader_orig_wayland_client
#define wl_proxy_add_listener wl_proxy_add_listener_dylibloader_orig_wayland_client
#define wl_proxy_get_listener wl_proxy_get_listener_dylibloader_orig_wayland_client
#define wl_proxy_add_dispatcher wl_proxy_add_dispatcher_dylibloader_orig_wayland_client
#define wl_proxy_set_user_data wl_proxy_set_user_data_dylibloader_orig_wayland_client
#define wl_proxy_get_user_data wl_proxy_get_user_data_dylibloader_orig_wayland_client
#define wl_proxy_get_version wl_proxy_get_version_dylibloader_orig_wayland_client
#define wl_proxy_get_id wl_proxy_get_id_dylibloader_orig_wayland_client
#define wl_proxy_set_tag wl_proxy_set_tag_dylibloader_orig_wayland_client
#define wl_proxy_get_tag wl_proxy_get_tag_dylibloader_orig_wayland_client
#define wl_proxy_get_class wl_proxy_get_class_dylibloader_orig_wayland_client
#define wl_proxy_set_queue wl_proxy_set_queue_dylibloader_orig_wayland_client
#define wl_display_connect wl_display_connect_dylibloader_orig_wayland_client
#define wl_display_connect_to_fd wl_display_connect_to_fd_dylibloader_orig_wayland_client
#define wl_display_disconnect wl_display_disconnect_dylibloader_orig_wayland_client
#define wl_display_get_fd wl_display_get_fd_dylibloader_orig_wayland_client
#define wl_display_dispatch wl_display_dispatch_dylibloader_orig_wayland_client
#define wl_display_dispatch_queue wl_display_dispatch_queue_dylibloader_orig_wayland_client
#define wl_display_dispatch_queue_pending wl_display_dispatch_queue_pending_dylibloader_orig_wayland_client
#define wl_display_dispatch_pending wl_display_dispatch_pending_dylibloader_orig_wayland_client
#define wl_display_get_error wl_display_get_error_dylibloader_orig_wayland_client
#define wl_display_get_protocol_error wl_display_get_protocol_error_dylibloader_orig_wayland_client
#define wl_display_flush wl_display_flush_dylibloader_orig_wayland_client
#define wl_display_roundtrip_queue wl_display_roundtrip_queue_dylibloader_orig_wayland_client
#define wl_display_roundtrip wl_display_roundtrip_dylibloader_orig_wayland_client
#define wl_display_create_queue wl_display_create_queue_dylibloader_orig_wayland_client
#define wl_display_prepare_read_queue wl_display_prepare_read_queue_dylibloader_orig_wayland_client
#define wl_display_prepare_read wl_display_prepare_read_dylibloader_orig_wayland_client
#define wl_display_cancel_read wl_display_cancel_read_dylibloader_orig_wayland_client
#define wl_display_read_events wl_display_read_events_dylibloader_orig_wayland_client
#define wl_log_set_handler_client wl_log_set_handler_client_dylibloader_orig_wayland_client
#include "./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h"
#undef wl_list_init
#undef wl_list_insert
#undef wl_list_remove
#undef wl_list_length
#undef wl_list_empty
#undef wl_list_insert_list
#undef wl_array_init
#undef wl_array_release
#undef wl_array_add
#undef wl_array_copy
#undef wl_event_queue_destroy
#undef wl_proxy_marshal_flags
#undef wl_proxy_marshal_array_flags
#undef wl_proxy_marshal
#undef wl_proxy_marshal_array
#undef wl_proxy_create
#undef wl_proxy_create_wrapper
#undef wl_proxy_wrapper_destroy
#undef wl_proxy_marshal_constructor
#undef wl_proxy_marshal_constructor_versioned
#undef wl_proxy_marshal_array_constructor
#undef wl_proxy_marshal_array_constructor_versioned
#undef wl_proxy_destroy
#undef wl_proxy_add_listener
#undef wl_proxy_get_listener
#undef wl_proxy_add_dispatcher
#undef wl_proxy_set_user_data
#undef wl_proxy_get_user_data
#undef wl_proxy_get_version
#undef wl_proxy_get_id
#undef wl_proxy_set_tag
#undef wl_proxy_get_tag
#undef wl_proxy_get_class
#undef wl_proxy_set_queue
#undef wl_display_connect
#undef wl_display_connect_to_fd
#undef wl_display_disconnect
#undef wl_display_get_fd
#undef wl_display_dispatch
#undef wl_display_dispatch_queue
#undef wl_display_dispatch_queue_pending
#undef wl_display_dispatch_pending
#undef wl_display_get_error
#undef wl_display_get_protocol_error
#undef wl_display_flush
#undef wl_display_roundtrip_queue
#undef wl_display_roundtrip
#undef wl_display_create_queue
#undef wl_display_prepare_read_queue
#undef wl_display_prepare_read
#undef wl_display_cancel_read
#undef wl_display_read_events
#undef wl_log_set_handler_client
#include <dlfcn.h>
#include <stdio.h>
void (*wl_list_init_dylibloader_wrapper_wayland_client)(struct wl_list*);
void (*wl_list_insert_dylibloader_wrapper_wayland_client)(struct wl_list*,struct wl_list*);
void (*wl_list_remove_dylibloader_wrapper_wayland_client)(struct wl_list*);
int (*wl_list_length_dylibloader_wrapper_wayland_client)(struct wl_list*);
int (*wl_list_empty_dylibloader_wrapper_wayland_client)(struct wl_list*);
void (*wl_list_insert_list_dylibloader_wrapper_wayland_client)(struct wl_list*,struct wl_list*);
void (*wl_array_init_dylibloader_wrapper_wayland_client)(struct wl_array*);
void (*wl_array_release_dylibloader_wrapper_wayland_client)(struct wl_array*);
void* (*wl_array_add_dylibloader_wrapper_wayland_client)(struct wl_array*, size_t);
int (*wl_array_copy_dylibloader_wrapper_wayland_client)(struct wl_array*,struct wl_array*);
void (*wl_event_queue_destroy_dylibloader_wrapper_wayland_client)(struct wl_event_queue*);
struct wl_proxy* (*wl_proxy_marshal_flags_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t, uint32_t,...);
struct wl_proxy* (*wl_proxy_marshal_array_flags_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t, uint32_t,union wl_argument);
void (*wl_proxy_marshal_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,...);
void (*wl_proxy_marshal_array_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument);
struct wl_proxy* (*wl_proxy_create_dylibloader_wrapper_wayland_client)(struct wl_proxy*,const struct wl_interface*);
void* (*wl_proxy_create_wrapper_dylibloader_wrapper_wayland_client)( void*);
void (*wl_proxy_wrapper_destroy_dylibloader_wrapper_wayland_client)( void*);
struct wl_proxy* (*wl_proxy_marshal_constructor_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*,...);
struct wl_proxy* (*wl_proxy_marshal_constructor_versioned_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t,...);
struct wl_proxy* (*wl_proxy_marshal_array_constructor_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument,const struct wl_interface*);
struct wl_proxy* (*wl_proxy_marshal_array_constructor_versioned_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument,const struct wl_interface*, uint32_t);
void (*wl_proxy_destroy_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
int (*wl_proxy_add_listener_dylibloader_wrapper_wayland_client)(struct wl_proxy*, void(**)(void), void*);
const void* (*wl_proxy_get_listener_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
int (*wl_proxy_add_dispatcher_dylibloader_wrapper_wayland_client)(struct wl_proxy*, wl_dispatcher_func_t,const void*, void*);
void (*wl_proxy_set_user_data_dylibloader_wrapper_wayland_client)(struct wl_proxy*, void*);
void* (*wl_proxy_get_user_data_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
uint32_t (*wl_proxy_get_version_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
uint32_t (*wl_proxy_get_id_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
void (*wl_proxy_set_tag_dylibloader_wrapper_wayland_client)(struct wl_proxy*,const char**);
const char** (*wl_proxy_get_tag_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
const char* (*wl_proxy_get_class_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
void (*wl_proxy_set_queue_dylibloader_wrapper_wayland_client)(struct wl_proxy*,struct wl_event_queue*);
struct wl_display* (*wl_display_connect_dylibloader_wrapper_wayland_client)(const char*);
struct wl_display* (*wl_display_connect_to_fd_dylibloader_wrapper_wayland_client)( int);
void (*wl_display_disconnect_dylibloader_wrapper_wayland_client)(struct wl_display*);
int (*wl_display_get_fd_dylibloader_wrapper_wayland_client)(struct wl_display*);
int (*wl_display_dispatch_dylibloader_wrapper_wayland_client)(struct wl_display*);
int (*wl_display_dispatch_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
int (*wl_display_dispatch_queue_pending_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
int (*wl_display_dispatch_pending_dylibloader_wrapper_wayland_client)(struct wl_display*);
int (*wl_display_get_error_dylibloader_wrapper_wayland_client)(struct wl_display*);
uint32_t (*wl_display_get_protocol_error_dylibloader_wrapper_wayland_client)(struct wl_display*,const struct wl_interface**, uint32_t*);
int (*wl_display_flush_dylibloader_wrapper_wayland_client)(struct wl_display*);
int (*wl_display_roundtrip_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
int (*wl_display_roundtrip_dylibloader_wrapper_wayland_client)(struct wl_display*);
struct wl_event_queue* (*wl_display_create_queue_dylibloader_wrapper_wayland_client)(struct wl_display*);
int (*wl_display_prepare_read_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
int (*wl_display_prepare_read_dylibloader_wrapper_wayland_client)(struct wl_display*);
void (*wl_display_cancel_read_dylibloader_wrapper_wayland_client)(struct wl_display*);
int (*wl_display_read_events_dylibloader_wrapper_wayland_client)(struct wl_display*);
void (*wl_log_set_handler_client_dylibloader_wrapper_wayland_client)( wl_log_func_t);
int initialize_wayland_client(int verbose) {
void *handle;
char *error;
handle = dlopen("libwayland-client.so.0", RTLD_LAZY);
if (!handle) {
if (verbose) {
fprintf(stderr, "%s\n", dlerror());
}
return(1);
}
dlerror();
// wl_list_init
*(void **) (&wl_list_init_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_init");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_list_insert
*(void **) (&wl_list_insert_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_insert");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_list_remove
*(void **) (&wl_list_remove_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_remove");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_list_length
*(void **) (&wl_list_length_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_length");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_list_empty
*(void **) (&wl_list_empty_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_empty");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_list_insert_list
*(void **) (&wl_list_insert_list_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_list_insert_list");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_array_init
*(void **) (&wl_array_init_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_array_init");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_array_release
*(void **) (&wl_array_release_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_array_release");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_array_add
*(void **) (&wl_array_add_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_array_add");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_array_copy
*(void **) (&wl_array_copy_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_array_copy");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_event_queue_destroy
*(void **) (&wl_event_queue_destroy_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_event_queue_destroy");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_marshal_flags
*(void **) (&wl_proxy_marshal_flags_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_flags");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_marshal_array_flags
*(void **) (&wl_proxy_marshal_array_flags_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_array_flags");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_marshal
*(void **) (&wl_proxy_marshal_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_marshal_array
*(void **) (&wl_proxy_marshal_array_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_array");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_create
*(void **) (&wl_proxy_create_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_create");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_create_wrapper
*(void **) (&wl_proxy_create_wrapper_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_create_wrapper");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_wrapper_destroy
*(void **) (&wl_proxy_wrapper_destroy_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_wrapper_destroy");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_marshal_constructor
*(void **) (&wl_proxy_marshal_constructor_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_constructor");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_marshal_constructor_versioned
*(void **) (&wl_proxy_marshal_constructor_versioned_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_constructor_versioned");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_marshal_array_constructor
*(void **) (&wl_proxy_marshal_array_constructor_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_array_constructor");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_marshal_array_constructor_versioned
*(void **) (&wl_proxy_marshal_array_constructor_versioned_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_marshal_array_constructor_versioned");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_destroy
*(void **) (&wl_proxy_destroy_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_destroy");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_add_listener
*(void **) (&wl_proxy_add_listener_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_add_listener");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_get_listener
*(void **) (&wl_proxy_get_listener_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_listener");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_add_dispatcher
*(void **) (&wl_proxy_add_dispatcher_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_add_dispatcher");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_set_user_data
*(void **) (&wl_proxy_set_user_data_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_set_user_data");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_get_user_data
*(void **) (&wl_proxy_get_user_data_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_user_data");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_get_version
*(void **) (&wl_proxy_get_version_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_version");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_get_id
*(void **) (&wl_proxy_get_id_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_id");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_set_tag
*(void **) (&wl_proxy_set_tag_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_set_tag");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_get_tag
*(void **) (&wl_proxy_get_tag_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_tag");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_get_class
*(void **) (&wl_proxy_get_class_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_get_class");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_proxy_set_queue
*(void **) (&wl_proxy_set_queue_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_proxy_set_queue");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_connect
*(void **) (&wl_display_connect_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_connect");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_connect_to_fd
*(void **) (&wl_display_connect_to_fd_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_connect_to_fd");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_disconnect
*(void **) (&wl_display_disconnect_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_disconnect");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_get_fd
*(void **) (&wl_display_get_fd_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_get_fd");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_dispatch
*(void **) (&wl_display_dispatch_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_dispatch");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_dispatch_queue
*(void **) (&wl_display_dispatch_queue_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_dispatch_queue");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_dispatch_queue_pending
*(void **) (&wl_display_dispatch_queue_pending_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_dispatch_queue_pending");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_dispatch_pending
*(void **) (&wl_display_dispatch_pending_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_dispatch_pending");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_get_error
*(void **) (&wl_display_get_error_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_get_error");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_get_protocol_error
*(void **) (&wl_display_get_protocol_error_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_get_protocol_error");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_flush
*(void **) (&wl_display_flush_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_flush");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_roundtrip_queue
*(void **) (&wl_display_roundtrip_queue_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_roundtrip_queue");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_roundtrip
*(void **) (&wl_display_roundtrip_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_roundtrip");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_create_queue
*(void **) (&wl_display_create_queue_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_create_queue");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_prepare_read_queue
*(void **) (&wl_display_prepare_read_queue_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_prepare_read_queue");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_prepare_read
*(void **) (&wl_display_prepare_read_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_prepare_read");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_cancel_read
*(void **) (&wl_display_cancel_read_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_cancel_read");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_display_read_events
*(void **) (&wl_display_read_events_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_display_read_events");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_log_set_handler_client
*(void **) (&wl_log_set_handler_client_dylibloader_wrapper_wayland_client) = dlsym(handle, "wl_log_set_handler_client");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
return 0;
}

View File

@ -0,0 +1,231 @@
#ifndef DYLIBLOAD_WRAPPER_WAYLAND_CLIENT
#define DYLIBLOAD_WRAPPER_WAYLAND_CLIENT
// This file is generated. Do not edit!
// see https://github.com/hpvb/dynload-wrapper for details
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:36:12
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h" --soname libwayland-client.so.0 --init-name wayland_client --output-header platform/linuxbsd/wayland/dynwrappers/wayland-client-core-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-client-core-so_wrap.c
//
// NOTE: This has been hand-patched to workaround some issues.
#include <stdint.h>
#define wl_list_init wl_list_init_dylibloader_orig_wayland_client
#define wl_list_insert wl_list_insert_dylibloader_orig_wayland_client
#define wl_list_remove wl_list_remove_dylibloader_orig_wayland_client
#define wl_list_length wl_list_length_dylibloader_orig_wayland_client
#define wl_list_empty wl_list_empty_dylibloader_orig_wayland_client
#define wl_list_insert_list wl_list_insert_list_dylibloader_orig_wayland_client
#define wl_array_init wl_array_init_dylibloader_orig_wayland_client
#define wl_array_release wl_array_release_dylibloader_orig_wayland_client
#define wl_array_add wl_array_add_dylibloader_orig_wayland_client
#define wl_array_copy wl_array_copy_dylibloader_orig_wayland_client
#define wl_event_queue_destroy wl_event_queue_destroy_dylibloader_orig_wayland_client
#define wl_proxy_marshal_flags wl_proxy_marshal_flags_dylibloader_orig_wayland_client
#define wl_proxy_marshal_array_flags wl_proxy_marshal_array_flags_dylibloader_orig_wayland_client
#define wl_proxy_marshal wl_proxy_marshal_dylibloader_orig_wayland_client
#define wl_proxy_marshal_array wl_proxy_marshal_array_dylibloader_orig_wayland_client
#define wl_proxy_create wl_proxy_create_dylibloader_orig_wayland_client
#define wl_proxy_create_wrapper wl_proxy_create_wrapper_dylibloader_orig_wayland_client
#define wl_proxy_wrapper_destroy wl_proxy_wrapper_destroy_dylibloader_orig_wayland_client
#define wl_proxy_marshal_constructor wl_proxy_marshal_constructor_dylibloader_orig_wayland_client
#define wl_proxy_marshal_constructor_versioned wl_proxy_marshal_constructor_versioned_dylibloader_orig_wayland_client
#define wl_proxy_marshal_array_constructor wl_proxy_marshal_array_constructor_dylibloader_orig_wayland_client
#define wl_proxy_marshal_array_constructor_versioned wl_proxy_marshal_array_constructor_versioned_dylibloader_orig_wayland_client
#define wl_proxy_destroy wl_proxy_destroy_dylibloader_orig_wayland_client
#define wl_proxy_add_listener wl_proxy_add_listener_dylibloader_orig_wayland_client
#define wl_proxy_get_listener wl_proxy_get_listener_dylibloader_orig_wayland_client
#define wl_proxy_add_dispatcher wl_proxy_add_dispatcher_dylibloader_orig_wayland_client
#define wl_proxy_set_user_data wl_proxy_set_user_data_dylibloader_orig_wayland_client
#define wl_proxy_get_user_data wl_proxy_get_user_data_dylibloader_orig_wayland_client
#define wl_proxy_get_version wl_proxy_get_version_dylibloader_orig_wayland_client
#define wl_proxy_get_id wl_proxy_get_id_dylibloader_orig_wayland_client
#define wl_proxy_set_tag wl_proxy_set_tag_dylibloader_orig_wayland_client
#define wl_proxy_get_tag wl_proxy_get_tag_dylibloader_orig_wayland_client
#define wl_proxy_get_class wl_proxy_get_class_dylibloader_orig_wayland_client
#define wl_proxy_set_queue wl_proxy_set_queue_dylibloader_orig_wayland_client
#define wl_display_connect wl_display_connect_dylibloader_orig_wayland_client
#define wl_display_connect_to_fd wl_display_connect_to_fd_dylibloader_orig_wayland_client
#define wl_display_disconnect wl_display_disconnect_dylibloader_orig_wayland_client
#define wl_display_get_fd wl_display_get_fd_dylibloader_orig_wayland_client
#define wl_display_dispatch wl_display_dispatch_dylibloader_orig_wayland_client
#define wl_display_dispatch_queue wl_display_dispatch_queue_dylibloader_orig_wayland_client
#define wl_display_dispatch_queue_pending wl_display_dispatch_queue_pending_dylibloader_orig_wayland_client
#define wl_display_dispatch_pending wl_display_dispatch_pending_dylibloader_orig_wayland_client
#define wl_display_get_error wl_display_get_error_dylibloader_orig_wayland_client
#define wl_display_get_protocol_error wl_display_get_protocol_error_dylibloader_orig_wayland_client
#define wl_display_flush wl_display_flush_dylibloader_orig_wayland_client
#define wl_display_roundtrip_queue wl_display_roundtrip_queue_dylibloader_orig_wayland_client
#define wl_display_roundtrip wl_display_roundtrip_dylibloader_orig_wayland_client
#define wl_display_create_queue wl_display_create_queue_dylibloader_orig_wayland_client
#define wl_display_prepare_read_queue wl_display_prepare_read_queue_dylibloader_orig_wayland_client
#define wl_display_prepare_read wl_display_prepare_read_dylibloader_orig_wayland_client
#define wl_display_cancel_read wl_display_cancel_read_dylibloader_orig_wayland_client
#define wl_display_read_events wl_display_read_events_dylibloader_orig_wayland_client
#define wl_log_set_handler_client wl_log_set_handler_client_dylibloader_orig_wayland_client
#include "./thirdparty/linuxbsd_headers/wayland/wayland-client-core.h"
#undef wl_list_init
#undef wl_list_insert
#undef wl_list_remove
#undef wl_list_length
#undef wl_list_empty
#undef wl_list_insert_list
#undef wl_array_init
#undef wl_array_release
#undef wl_array_add
#undef wl_array_copy
#undef wl_event_queue_destroy
#undef wl_proxy_marshal_flags
#undef wl_proxy_marshal_array_flags
#undef wl_proxy_marshal
#undef wl_proxy_marshal_array
#undef wl_proxy_create
#undef wl_proxy_create_wrapper
#undef wl_proxy_wrapper_destroy
#undef wl_proxy_marshal_constructor
#undef wl_proxy_marshal_constructor_versioned
#undef wl_proxy_marshal_array_constructor
#undef wl_proxy_marshal_array_constructor_versioned
#undef wl_proxy_destroy
#undef wl_proxy_add_listener
#undef wl_proxy_get_listener
#undef wl_proxy_add_dispatcher
#undef wl_proxy_set_user_data
#undef wl_proxy_get_user_data
#undef wl_proxy_get_version
#undef wl_proxy_get_id
#undef wl_proxy_set_tag
#undef wl_proxy_get_tag
#undef wl_proxy_get_class
#undef wl_proxy_set_queue
#undef wl_display_connect
#undef wl_display_connect_to_fd
#undef wl_display_disconnect
#undef wl_display_get_fd
#undef wl_display_dispatch
#undef wl_display_dispatch_queue
#undef wl_display_dispatch_queue_pending
#undef wl_display_dispatch_pending
#undef wl_display_get_error
#undef wl_display_get_protocol_error
#undef wl_display_flush
#undef wl_display_roundtrip_queue
#undef wl_display_roundtrip
#undef wl_display_create_queue
#undef wl_display_prepare_read_queue
#undef wl_display_prepare_read
#undef wl_display_cancel_read
#undef wl_display_read_events
#undef wl_log_set_handler_client
#ifdef __cplusplus
extern "C" {
#endif
#define wl_list_init wl_list_init_dylibloader_wrapper_wayland_client
#define wl_list_insert wl_list_insert_dylibloader_wrapper_wayland_client
#define wl_list_remove wl_list_remove_dylibloader_wrapper_wayland_client
#define wl_list_length wl_list_length_dylibloader_wrapper_wayland_client
#define wl_list_empty wl_list_empty_dylibloader_wrapper_wayland_client
#define wl_list_insert_list wl_list_insert_list_dylibloader_wrapper_wayland_client
#define wl_array_init wl_array_init_dylibloader_wrapper_wayland_client
#define wl_array_release wl_array_release_dylibloader_wrapper_wayland_client
#define wl_array_add wl_array_add_dylibloader_wrapper_wayland_client
#define wl_array_copy wl_array_copy_dylibloader_wrapper_wayland_client
#define wl_event_queue_destroy wl_event_queue_destroy_dylibloader_wrapper_wayland_client
#define wl_proxy_marshal_flags wl_proxy_marshal_flags_dylibloader_wrapper_wayland_client
#define wl_proxy_marshal_array_flags wl_proxy_marshal_array_flags_dylibloader_wrapper_wayland_client
#define wl_proxy_marshal wl_proxy_marshal_dylibloader_wrapper_wayland_client
#define wl_proxy_marshal_array wl_proxy_marshal_array_dylibloader_wrapper_wayland_client
#define wl_proxy_create wl_proxy_create_dylibloader_wrapper_wayland_client
#define wl_proxy_create_wrapper wl_proxy_create_wrapper_dylibloader_wrapper_wayland_client
#define wl_proxy_wrapper_destroy wl_proxy_wrapper_destroy_dylibloader_wrapper_wayland_client
#define wl_proxy_marshal_constructor wl_proxy_marshal_constructor_dylibloader_wrapper_wayland_client
#define wl_proxy_marshal_constructor_versioned wl_proxy_marshal_constructor_versioned_dylibloader_wrapper_wayland_client
#define wl_proxy_marshal_array_constructor wl_proxy_marshal_array_constructor_dylibloader_wrapper_wayland_client
#define wl_proxy_marshal_array_constructor_versioned wl_proxy_marshal_array_constructor_versioned_dylibloader_wrapper_wayland_client
#define wl_proxy_destroy wl_proxy_destroy_dylibloader_wrapper_wayland_client
#define wl_proxy_add_listener wl_proxy_add_listener_dylibloader_wrapper_wayland_client
#define wl_proxy_get_listener wl_proxy_get_listener_dylibloader_wrapper_wayland_client
#define wl_proxy_add_dispatcher wl_proxy_add_dispatcher_dylibloader_wrapper_wayland_client
#define wl_proxy_set_user_data wl_proxy_set_user_data_dylibloader_wrapper_wayland_client
#define wl_proxy_get_user_data wl_proxy_get_user_data_dylibloader_wrapper_wayland_client
#define wl_proxy_get_version wl_proxy_get_version_dylibloader_wrapper_wayland_client
#define wl_proxy_get_id wl_proxy_get_id_dylibloader_wrapper_wayland_client
#define wl_proxy_set_tag wl_proxy_set_tag_dylibloader_wrapper_wayland_client
#define wl_proxy_get_tag wl_proxy_get_tag_dylibloader_wrapper_wayland_client
#define wl_proxy_get_class wl_proxy_get_class_dylibloader_wrapper_wayland_client
#define wl_proxy_set_queue wl_proxy_set_queue_dylibloader_wrapper_wayland_client
#define wl_display_connect wl_display_connect_dylibloader_wrapper_wayland_client
#define wl_display_connect_to_fd wl_display_connect_to_fd_dylibloader_wrapper_wayland_client
#define wl_display_disconnect wl_display_disconnect_dylibloader_wrapper_wayland_client
#define wl_display_get_fd wl_display_get_fd_dylibloader_wrapper_wayland_client
#define wl_display_dispatch wl_display_dispatch_dylibloader_wrapper_wayland_client
#define wl_display_dispatch_queue wl_display_dispatch_queue_dylibloader_wrapper_wayland_client
#define wl_display_dispatch_queue_pending wl_display_dispatch_queue_pending_dylibloader_wrapper_wayland_client
#define wl_display_dispatch_pending wl_display_dispatch_pending_dylibloader_wrapper_wayland_client
#define wl_display_get_error wl_display_get_error_dylibloader_wrapper_wayland_client
#define wl_display_get_protocol_error wl_display_get_protocol_error_dylibloader_wrapper_wayland_client
#define wl_display_flush wl_display_flush_dylibloader_wrapper_wayland_client
#define wl_display_roundtrip_queue wl_display_roundtrip_queue_dylibloader_wrapper_wayland_client
#define wl_display_roundtrip wl_display_roundtrip_dylibloader_wrapper_wayland_client
#define wl_display_create_queue wl_display_create_queue_dylibloader_wrapper_wayland_client
#define wl_display_prepare_read_queue wl_display_prepare_read_queue_dylibloader_wrapper_wayland_client
#define wl_display_prepare_read wl_display_prepare_read_dylibloader_wrapper_wayland_client
#define wl_display_cancel_read wl_display_cancel_read_dylibloader_wrapper_wayland_client
#define wl_display_read_events wl_display_read_events_dylibloader_wrapper_wayland_client
#define wl_log_set_handler_client wl_log_set_handler_client_dylibloader_wrapper_wayland_client
extern void (*wl_list_init_dylibloader_wrapper_wayland_client)(struct wl_list*);
extern void (*wl_list_insert_dylibloader_wrapper_wayland_client)(struct wl_list*,struct wl_list*);
extern void (*wl_list_remove_dylibloader_wrapper_wayland_client)(struct wl_list*);
extern int (*wl_list_length_dylibloader_wrapper_wayland_client)(struct wl_list*);
extern int (*wl_list_empty_dylibloader_wrapper_wayland_client)(struct wl_list*);
extern void (*wl_list_insert_list_dylibloader_wrapper_wayland_client)(struct wl_list*,struct wl_list*);
extern void (*wl_array_init_dylibloader_wrapper_wayland_client)(struct wl_array*);
extern void (*wl_array_release_dylibloader_wrapper_wayland_client)(struct wl_array*);
extern void* (*wl_array_add_dylibloader_wrapper_wayland_client)(struct wl_array*, size_t);
extern int (*wl_array_copy_dylibloader_wrapper_wayland_client)(struct wl_array*,struct wl_array*);
extern void (*wl_event_queue_destroy_dylibloader_wrapper_wayland_client)(struct wl_event_queue*);
extern struct wl_proxy* (*wl_proxy_marshal_flags_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t, uint32_t,...);
extern struct wl_proxy* (*wl_proxy_marshal_array_flags_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t, uint32_t,union wl_argument);
extern void (*wl_proxy_marshal_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,...);
extern void (*wl_proxy_marshal_array_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument);
extern struct wl_proxy* (*wl_proxy_create_dylibloader_wrapper_wayland_client)(struct wl_proxy*,const struct wl_interface*);
extern void* (*wl_proxy_create_wrapper_dylibloader_wrapper_wayland_client)( void*);
extern void (*wl_proxy_wrapper_destroy_dylibloader_wrapper_wayland_client)( void*);
extern struct wl_proxy* (*wl_proxy_marshal_constructor_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*,...);
extern struct wl_proxy* (*wl_proxy_marshal_constructor_versioned_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,const struct wl_interface*, uint32_t,...);
extern struct wl_proxy* (*wl_proxy_marshal_array_constructor_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument,const struct wl_interface*);
extern struct wl_proxy* (*wl_proxy_marshal_array_constructor_versioned_dylibloader_wrapper_wayland_client)(struct wl_proxy*, uint32_t,union wl_argument,const struct wl_interface*, uint32_t);
extern void (*wl_proxy_destroy_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
extern int (*wl_proxy_add_listener_dylibloader_wrapper_wayland_client)(struct wl_proxy*, void(**)(void), void*);
extern const void* (*wl_proxy_get_listener_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
extern int (*wl_proxy_add_dispatcher_dylibloader_wrapper_wayland_client)(struct wl_proxy*, wl_dispatcher_func_t,const void*, void*);
extern void (*wl_proxy_set_user_data_dylibloader_wrapper_wayland_client)(struct wl_proxy*, void*);
extern void* (*wl_proxy_get_user_data_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
extern uint32_t (*wl_proxy_get_version_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
extern uint32_t (*wl_proxy_get_id_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
extern void (*wl_proxy_set_tag_dylibloader_wrapper_wayland_client)(struct wl_proxy*,const char**);
extern const char** (*wl_proxy_get_tag_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
extern const char* (*wl_proxy_get_class_dylibloader_wrapper_wayland_client)(struct wl_proxy*);
extern void (*wl_proxy_set_queue_dylibloader_wrapper_wayland_client)(struct wl_proxy*,struct wl_event_queue*);
extern struct wl_display* (*wl_display_connect_dylibloader_wrapper_wayland_client)(const char*);
extern struct wl_display* (*wl_display_connect_to_fd_dylibloader_wrapper_wayland_client)( int);
extern void (*wl_display_disconnect_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern int (*wl_display_get_fd_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern int (*wl_display_dispatch_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern int (*wl_display_dispatch_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
extern int (*wl_display_dispatch_queue_pending_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
extern int (*wl_display_dispatch_pending_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern int (*wl_display_get_error_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern uint32_t (*wl_display_get_protocol_error_dylibloader_wrapper_wayland_client)(struct wl_display*,const struct wl_interface**, uint32_t*);
extern int (*wl_display_flush_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern int (*wl_display_roundtrip_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
extern int (*wl_display_roundtrip_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern struct wl_event_queue* (*wl_display_create_queue_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern int (*wl_display_prepare_read_queue_dylibloader_wrapper_wayland_client)(struct wl_display*,struct wl_event_queue*);
extern int (*wl_display_prepare_read_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern void (*wl_display_cancel_read_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern int (*wl_display_read_events_dylibloader_wrapper_wayland_client)(struct wl_display*);
extern void (*wl_log_set_handler_client_dylibloader_wrapper_wayland_client)( wl_log_func_t);
int initialize_wayland_client(int verbose);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,89 @@
// This file is generated. Do not edit!
// see https://github.com/hpvb/dynload-wrapper for details
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:46:12
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h" --soname libwayland-cursor.so.0 --init-name wayland_cursor --output-header platform/linuxbsd/wayland/dynwrappers/wayland-cursor-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-cursor-so_wrap.c
//
#include <stdint.h>
#define wl_cursor_theme_load wl_cursor_theme_load_dylibloader_orig_wayland_cursor
#define wl_cursor_theme_destroy wl_cursor_theme_destroy_dylibloader_orig_wayland_cursor
#define wl_cursor_theme_get_cursor wl_cursor_theme_get_cursor_dylibloader_orig_wayland_cursor
#define wl_cursor_image_get_buffer wl_cursor_image_get_buffer_dylibloader_orig_wayland_cursor
#define wl_cursor_frame wl_cursor_frame_dylibloader_orig_wayland_cursor
#define wl_cursor_frame_and_duration wl_cursor_frame_and_duration_dylibloader_orig_wayland_cursor
#include "./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h"
#undef wl_cursor_theme_load
#undef wl_cursor_theme_destroy
#undef wl_cursor_theme_get_cursor
#undef wl_cursor_image_get_buffer
#undef wl_cursor_frame
#undef wl_cursor_frame_and_duration
#include <dlfcn.h>
#include <stdio.h>
struct wl_cursor_theme* (*wl_cursor_theme_load_dylibloader_wrapper_wayland_cursor)(const char*, int,struct wl_shm*);
void (*wl_cursor_theme_destroy_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_theme*);
struct wl_cursor* (*wl_cursor_theme_get_cursor_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_theme*,const char*);
struct wl_buffer* (*wl_cursor_image_get_buffer_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_image*);
int (*wl_cursor_frame_dylibloader_wrapper_wayland_cursor)(struct wl_cursor*, uint32_t);
int (*wl_cursor_frame_and_duration_dylibloader_wrapper_wayland_cursor)(struct wl_cursor*, uint32_t, uint32_t*);
int initialize_wayland_cursor(int verbose) {
void *handle;
char *error;
handle = dlopen("libwayland-cursor.so.0", RTLD_LAZY);
if (!handle) {
if (verbose) {
fprintf(stderr, "%s\n", dlerror());
}
return(1);
}
dlerror();
// wl_cursor_theme_load
*(void **) (&wl_cursor_theme_load_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_theme_load");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_cursor_theme_destroy
*(void **) (&wl_cursor_theme_destroy_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_theme_destroy");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_cursor_theme_get_cursor
*(void **) (&wl_cursor_theme_get_cursor_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_theme_get_cursor");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_cursor_image_get_buffer
*(void **) (&wl_cursor_image_get_buffer_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_image_get_buffer");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_cursor_frame
*(void **) (&wl_cursor_frame_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_frame");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_cursor_frame_and_duration
*(void **) (&wl_cursor_frame_and_duration_dylibloader_wrapper_wayland_cursor) = dlsym(handle, "wl_cursor_frame_and_duration");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
return 0;
}

View File

@ -0,0 +1,42 @@
#ifndef DYLIBLOAD_WRAPPER_WAYLAND_CURSOR
#define DYLIBLOAD_WRAPPER_WAYLAND_CURSOR
// This file is generated. Do not edit!
// see https://github.com/hpvb/dynload-wrapper for details
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:46:12
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h" --soname libwayland-cursor.so.0 --init-name wayland_cursor --output-header platform/linuxbsd/wayland/dynwrappers/wayland-cursor-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-cursor-so_wrap.c
//
#include <stdint.h>
#define wl_cursor_theme_load wl_cursor_theme_load_dylibloader_orig_wayland_cursor
#define wl_cursor_theme_destroy wl_cursor_theme_destroy_dylibloader_orig_wayland_cursor
#define wl_cursor_theme_get_cursor wl_cursor_theme_get_cursor_dylibloader_orig_wayland_cursor
#define wl_cursor_image_get_buffer wl_cursor_image_get_buffer_dylibloader_orig_wayland_cursor
#define wl_cursor_frame wl_cursor_frame_dylibloader_orig_wayland_cursor
#define wl_cursor_frame_and_duration wl_cursor_frame_and_duration_dylibloader_orig_wayland_cursor
#include "./thirdparty/linuxbsd_headers/wayland/wayland-cursor.h"
#undef wl_cursor_theme_load
#undef wl_cursor_theme_destroy
#undef wl_cursor_theme_get_cursor
#undef wl_cursor_image_get_buffer
#undef wl_cursor_frame
#undef wl_cursor_frame_and_duration
#ifdef __cplusplus
extern "C" {
#endif
#define wl_cursor_theme_load wl_cursor_theme_load_dylibloader_wrapper_wayland_cursor
#define wl_cursor_theme_destroy wl_cursor_theme_destroy_dylibloader_wrapper_wayland_cursor
#define wl_cursor_theme_get_cursor wl_cursor_theme_get_cursor_dylibloader_wrapper_wayland_cursor
#define wl_cursor_image_get_buffer wl_cursor_image_get_buffer_dylibloader_wrapper_wayland_cursor
#define wl_cursor_frame wl_cursor_frame_dylibloader_wrapper_wayland_cursor
#define wl_cursor_frame_and_duration wl_cursor_frame_and_duration_dylibloader_wrapper_wayland_cursor
extern struct wl_cursor_theme* (*wl_cursor_theme_load_dylibloader_wrapper_wayland_cursor)(const char*, int,struct wl_shm*);
extern void (*wl_cursor_theme_destroy_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_theme*);
extern struct wl_cursor* (*wl_cursor_theme_get_cursor_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_theme*,const char*);
extern struct wl_buffer* (*wl_cursor_image_get_buffer_dylibloader_wrapper_wayland_cursor)(struct wl_cursor_image*);
extern int (*wl_cursor_frame_dylibloader_wrapper_wayland_cursor)(struct wl_cursor*, uint32_t);
extern int (*wl_cursor_frame_and_duration_dylibloader_wrapper_wayland_cursor)(struct wl_cursor*, uint32_t, uint32_t*);
int initialize_wayland_cursor(int verbose);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,67 @@
// This file is generated. Do not edit!
// see https://github.com/hpvb/dynload-wrapper for details
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:49:37
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h" --soname libwayland-egl.so.1 --init-name wayland_egl --output-header platform/linuxbsd/wayland/dynwrappers/wayland-egl-core-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-egl-core-so_wrap.c
//
#include <stdint.h>
#define wl_egl_window_create wl_egl_window_create_dylibloader_orig_wayland_egl
#define wl_egl_window_destroy wl_egl_window_destroy_dylibloader_orig_wayland_egl
#define wl_egl_window_resize wl_egl_window_resize_dylibloader_orig_wayland_egl
#define wl_egl_window_get_attached_size wl_egl_window_get_attached_size_dylibloader_orig_wayland_egl
#include "./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h"
#undef wl_egl_window_create
#undef wl_egl_window_destroy
#undef wl_egl_window_resize
#undef wl_egl_window_get_attached_size
#include <dlfcn.h>
#include <stdio.h>
struct wl_egl_window* (*wl_egl_window_create_dylibloader_wrapper_wayland_egl)(struct wl_surface*, int, int);
void (*wl_egl_window_destroy_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*);
void (*wl_egl_window_resize_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*, int, int, int, int);
void (*wl_egl_window_get_attached_size_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*, int*, int*);
int initialize_wayland_egl(int verbose) {
void *handle;
char *error;
handle = dlopen("libwayland-egl.so.1", RTLD_LAZY);
if (!handle) {
if (verbose) {
fprintf(stderr, "%s\n", dlerror());
}
return(1);
}
dlerror();
// wl_egl_window_create
*(void **) (&wl_egl_window_create_dylibloader_wrapper_wayland_egl) = dlsym(handle, "wl_egl_window_create");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_egl_window_destroy
*(void **) (&wl_egl_window_destroy_dylibloader_wrapper_wayland_egl) = dlsym(handle, "wl_egl_window_destroy");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_egl_window_resize
*(void **) (&wl_egl_window_resize_dylibloader_wrapper_wayland_egl) = dlsym(handle, "wl_egl_window_resize");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
// wl_egl_window_get_attached_size
*(void **) (&wl_egl_window_get_attached_size_dylibloader_wrapper_wayland_egl) = dlsym(handle, "wl_egl_window_get_attached_size");
if (verbose) {
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
}
}
return 0;
}

View File

@ -0,0 +1,34 @@
#ifndef DYLIBLOAD_WRAPPER_WAYLAND_EGL
#define DYLIBLOAD_WRAPPER_WAYLAND_EGL
// This file is generated. Do not edit!
// see https://github.com/hpvb/dynload-wrapper for details
// generated by ../dynload-wrapper/generate-wrapper.py 0.3 on 2023-01-25 17:49:37
// flags: ../dynload-wrapper/generate-wrapper.py --include ./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h --sys-include "./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h" --soname libwayland-egl.so.1 --init-name wayland_egl --output-header platform/linuxbsd/wayland/dynwrappers/wayland-egl-core-so_wrap.h --output-implementation platform/linuxbsd/wayland/dynwrappers/wayland-egl-core-so_wrap.c
//
#include <stdint.h>
#define wl_egl_window_create wl_egl_window_create_dylibloader_orig_wayland_egl
#define wl_egl_window_destroy wl_egl_window_destroy_dylibloader_orig_wayland_egl
#define wl_egl_window_resize wl_egl_window_resize_dylibloader_orig_wayland_egl
#define wl_egl_window_get_attached_size wl_egl_window_get_attached_size_dylibloader_orig_wayland_egl
#include "./thirdparty/linuxbsd_headers/wayland/wayland-egl-core.h"
#undef wl_egl_window_create
#undef wl_egl_window_destroy
#undef wl_egl_window_resize
#undef wl_egl_window_get_attached_size
#ifdef __cplusplus
extern "C" {
#endif
#define wl_egl_window_create wl_egl_window_create_dylibloader_wrapper_wayland_egl
#define wl_egl_window_destroy wl_egl_window_destroy_dylibloader_wrapper_wayland_egl
#define wl_egl_window_resize wl_egl_window_resize_dylibloader_wrapper_wayland_egl
#define wl_egl_window_get_attached_size wl_egl_window_get_attached_size_dylibloader_wrapper_wayland_egl
extern struct wl_egl_window* (*wl_egl_window_create_dylibloader_wrapper_wayland_egl)(struct wl_surface*, int, int);
extern void (*wl_egl_window_destroy_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*);
extern void (*wl_egl_window_resize_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*, int, int, int, int);
extern void (*wl_egl_window_get_attached_size_dylibloader_wrapper_wayland_egl)(struct wl_egl_window*, int*, int*);
int initialize_wayland_egl(int verbose);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,66 @@
/**************************************************************************/
/* egl_manager_wayland.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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 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. */
/**************************************************************************/
#include "egl_manager_wayland.h"
#ifdef WAYLAND_ENABLED
#ifdef EGL_ENABLED
#ifdef GLES3_ENABLED
const char *EGLManagerWayland::_get_platform_extension_name() const {
return "EGL_KHR_platform_wayland";
}
EGLenum EGLManagerWayland::_get_platform_extension_enum() const {
return EGL_PLATFORM_WAYLAND_KHR;
}
EGLenum EGLManagerWayland::_get_platform_api_enum() const {
return EGL_OPENGL_API;
}
Vector<EGLAttrib> EGLManagerWayland::_get_platform_display_attributes() const {
return Vector<EGLAttrib>();
}
Vector<EGLint> EGLManagerWayland::_get_platform_context_attribs() const {
Vector<EGLint> ret;
ret.push_back(EGL_CONTEXT_MAJOR_VERSION);
ret.push_back(3);
ret.push_back(EGL_CONTEXT_MINOR_VERSION);
ret.push_back(3);
ret.push_back(EGL_NONE);
return ret;
}
#endif // GLES3_ENABLED
#endif // EGL_ENABLED
#endif // WAYLAND_ENABLED

View File

@ -0,0 +1,53 @@
/**************************************************************************/
/* egl_manager_wayland.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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 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. */
/**************************************************************************/
#ifndef EGL_MANAGER_WAYLAND_H
#define EGL_MANAGER_WAYLAND_H
#ifdef WAYLAND_ENABLED
#ifdef EGL_ENABLED
#ifdef GLES3_ENABLED
#include "drivers/egl/egl_manager.h"
class EGLManagerWayland : public EGLManager {
public:
virtual const char *_get_platform_extension_name() const override;
virtual EGLenum _get_platform_extension_enum() const override;
virtual EGLenum _get_platform_api_enum() const override;
virtual Vector<EGLAttrib> _get_platform_display_attributes() const override;
virtual Vector<EGLint> _get_platform_context_attribs() const override;
};
#endif // GLES3_ENABLED
#endif // EGL_ENABLED
#endif // WAYLAND_ENABLED
#endif // EGL_MANAGER_WAYLAND_H

View File

@ -0,0 +1,411 @@
/**************************************************************************/
/* key_mapping_xkb.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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 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. */
/**************************************************************************/
#include "key_mapping_xkb.h"
void KeyMappingXKB::initialize() {
// XKB keycode to Godot Key map.
xkb_keycode_map[XKB_KEY_Escape] = Key::ESCAPE;
xkb_keycode_map[XKB_KEY_Tab] = Key::TAB;
xkb_keycode_map[XKB_KEY_ISO_Left_Tab] = Key::BACKTAB;
xkb_keycode_map[XKB_KEY_BackSpace] = Key::BACKSPACE;
xkb_keycode_map[XKB_KEY_Return] = Key::ENTER;
xkb_keycode_map[XKB_KEY_Insert] = Key::INSERT;
xkb_keycode_map[XKB_KEY_Delete] = Key::KEY_DELETE;
xkb_keycode_map[XKB_KEY_Clear] = Key::KEY_DELETE;
xkb_keycode_map[XKB_KEY_Pause] = Key::PAUSE;
xkb_keycode_map[XKB_KEY_Print] = Key::PRINT;
xkb_keycode_map[XKB_KEY_Home] = Key::HOME;
xkb_keycode_map[XKB_KEY_End] = Key::END;
xkb_keycode_map[XKB_KEY_Left] = Key::LEFT;
xkb_keycode_map[XKB_KEY_Up] = Key::UP;
xkb_keycode_map[XKB_KEY_Right] = Key::RIGHT;
xkb_keycode_map[XKB_KEY_Down] = Key::DOWN;
xkb_keycode_map[XKB_KEY_Prior] = Key::PAGEUP;
xkb_keycode_map[XKB_KEY_Next] = Key::PAGEDOWN;
xkb_keycode_map[XKB_KEY_Shift_L] = Key::SHIFT;
xkb_keycode_map[XKB_KEY_Shift_R] = Key::SHIFT;
xkb_keycode_map[XKB_KEY_Shift_Lock] = Key::SHIFT;
xkb_keycode_map[XKB_KEY_Control_L] = Key::CTRL;
xkb_keycode_map[XKB_KEY_Control_R] = Key::CTRL;
xkb_keycode_map[XKB_KEY_Meta_L] = Key::META;
xkb_keycode_map[XKB_KEY_Meta_R] = Key::META;
xkb_keycode_map[XKB_KEY_Alt_L] = Key::ALT;
xkb_keycode_map[XKB_KEY_Alt_R] = Key::ALT;
xkb_keycode_map[XKB_KEY_Caps_Lock] = Key::CAPSLOCK;
xkb_keycode_map[XKB_KEY_Num_Lock] = Key::NUMLOCK;
xkb_keycode_map[XKB_KEY_Scroll_Lock] = Key::SCROLLLOCK;
xkb_keycode_map[XKB_KEY_less] = Key::QUOTELEFT;
xkb_keycode_map[XKB_KEY_grave] = Key::SECTION;
xkb_keycode_map[XKB_KEY_Super_L] = Key::META;
xkb_keycode_map[XKB_KEY_Super_R] = Key::META;
xkb_keycode_map[XKB_KEY_Menu] = Key::MENU;
xkb_keycode_map[XKB_KEY_Hyper_L] = Key::HYPER;
xkb_keycode_map[XKB_KEY_Hyper_R] = Key::HYPER;
xkb_keycode_map[XKB_KEY_Help] = Key::HELP;
xkb_keycode_map[XKB_KEY_KP_Space] = Key::SPACE;
xkb_keycode_map[XKB_KEY_KP_Tab] = Key::TAB;
xkb_keycode_map[XKB_KEY_KP_Enter] = Key::KP_ENTER;
xkb_keycode_map[XKB_KEY_Home] = Key::HOME;
xkb_keycode_map[XKB_KEY_Left] = Key::LEFT;
xkb_keycode_map[XKB_KEY_Up] = Key::UP;
xkb_keycode_map[XKB_KEY_Right] = Key::RIGHT;
xkb_keycode_map[XKB_KEY_Down] = Key::DOWN;
xkb_keycode_map[XKB_KEY_Prior] = Key::PAGEUP;
xkb_keycode_map[XKB_KEY_Next] = Key::PAGEDOWN;
xkb_keycode_map[XKB_KEY_End] = Key::END;
xkb_keycode_map[XKB_KEY_Begin] = Key::CLEAR;
xkb_keycode_map[XKB_KEY_Insert] = Key::INSERT;
xkb_keycode_map[XKB_KEY_Delete] = Key::KEY_DELETE;
xkb_keycode_map[XKB_KEY_KP_Equal] = Key::EQUAL;
xkb_keycode_map[XKB_KEY_KP_Separator] = Key::COMMA;
xkb_keycode_map[XKB_KEY_KP_Decimal] = Key::KP_PERIOD;
xkb_keycode_map[XKB_KEY_KP_Multiply] = Key::KP_MULTIPLY;
xkb_keycode_map[XKB_KEY_KP_Divide] = Key::KP_DIVIDE;
xkb_keycode_map[XKB_KEY_KP_Subtract] = Key::KP_SUBTRACT;
xkb_keycode_map[XKB_KEY_KP_Add] = Key::KP_ADD;
xkb_keycode_map[XKB_KEY_KP_0] = Key::KP_0;
xkb_keycode_map[XKB_KEY_KP_1] = Key::KP_1;
xkb_keycode_map[XKB_KEY_KP_2] = Key::KP_2;
xkb_keycode_map[XKB_KEY_KP_3] = Key::KP_3;
xkb_keycode_map[XKB_KEY_KP_4] = Key::KP_4;
xkb_keycode_map[XKB_KEY_KP_5] = Key::KP_5;
xkb_keycode_map[XKB_KEY_KP_6] = Key::KP_6;
xkb_keycode_map[XKB_KEY_KP_7] = Key::KP_7;
xkb_keycode_map[XKB_KEY_KP_8] = Key::KP_8;
xkb_keycode_map[XKB_KEY_KP_9] = Key::KP_9;
// Same keys but with numlock off.
xkb_keycode_map[XKB_KEY_KP_Insert] = Key::INSERT;
xkb_keycode_map[XKB_KEY_KP_Delete] = Key::KEY_DELETE;
xkb_keycode_map[XKB_KEY_KP_End] = Key::END;
xkb_keycode_map[XKB_KEY_KP_Down] = Key::DOWN;
xkb_keycode_map[XKB_KEY_KP_Page_Down] = Key::PAGEDOWN;
xkb_keycode_map[XKB_KEY_KP_Left] = Key::LEFT;
// X11 documents this (numpad 5) as "begin of line" but no toolkit seems to interpret it this way.
// On Windows this is emitting Key::Clear so for consistency it will be mapped to Key::Clear
xkb_keycode_map[XKB_KEY_KP_Begin] = Key::CLEAR;
xkb_keycode_map[XKB_KEY_KP_Right] = Key::RIGHT;
xkb_keycode_map[XKB_KEY_KP_Home] = Key::HOME;
xkb_keycode_map[XKB_KEY_KP_Up] = Key::UP;
xkb_keycode_map[XKB_KEY_KP_Page_Up] = Key::PAGEUP;
xkb_keycode_map[XKB_KEY_F1] = Key::F1;
xkb_keycode_map[XKB_KEY_F2] = Key::F2;
xkb_keycode_map[XKB_KEY_F3] = Key::F3;
xkb_keycode_map[XKB_KEY_F4] = Key::F4;
xkb_keycode_map[XKB_KEY_F5] = Key::F5;
xkb_keycode_map[XKB_KEY_F6] = Key::F6;
xkb_keycode_map[XKB_KEY_F7] = Key::F7;
xkb_keycode_map[XKB_KEY_F8] = Key::F8;
xkb_keycode_map[XKB_KEY_F9] = Key::F9;
xkb_keycode_map[XKB_KEY_F10] = Key::F10;
xkb_keycode_map[XKB_KEY_F11] = Key::F11;
xkb_keycode_map[XKB_KEY_F12] = Key::F12;
xkb_keycode_map[XKB_KEY_F13] = Key::F13;
xkb_keycode_map[XKB_KEY_F14] = Key::F14;
xkb_keycode_map[XKB_KEY_F15] = Key::F15;
xkb_keycode_map[XKB_KEY_F16] = Key::F16;
xkb_keycode_map[XKB_KEY_F17] = Key::F17;
xkb_keycode_map[XKB_KEY_F18] = Key::F18;
xkb_keycode_map[XKB_KEY_F19] = Key::F19;
xkb_keycode_map[XKB_KEY_F20] = Key::F20;
xkb_keycode_map[XKB_KEY_F21] = Key::F21;
xkb_keycode_map[XKB_KEY_F22] = Key::F22;
xkb_keycode_map[XKB_KEY_F23] = Key::F23;
xkb_keycode_map[XKB_KEY_F24] = Key::F24;
xkb_keycode_map[XKB_KEY_F25] = Key::F25;
xkb_keycode_map[XKB_KEY_F26] = Key::F26;
xkb_keycode_map[XKB_KEY_F27] = Key::F27;
xkb_keycode_map[XKB_KEY_F28] = Key::F28;
xkb_keycode_map[XKB_KEY_F29] = Key::F29;
xkb_keycode_map[XKB_KEY_F30] = Key::F30;
xkb_keycode_map[XKB_KEY_F31] = Key::F31;
xkb_keycode_map[XKB_KEY_F32] = Key::F32;
xkb_keycode_map[XKB_KEY_F33] = Key::F33;
xkb_keycode_map[XKB_KEY_F34] = Key::F34;
xkb_keycode_map[XKB_KEY_F35] = Key::F35;
xkb_keycode_map[XKB_KEY_yen] = Key::YEN;
xkb_keycode_map[XKB_KEY_section] = Key::SECTION;
// Media keys.
xkb_keycode_map[XKB_KEY_XF86Back] = Key::BACK;
xkb_keycode_map[XKB_KEY_XF86Forward] = Key::FORWARD;
xkb_keycode_map[XKB_KEY_XF86Stop] = Key::STOP;
xkb_keycode_map[XKB_KEY_XF86Refresh] = Key::REFRESH;
xkb_keycode_map[XKB_KEY_XF86Favorites] = Key::FAVORITES;
xkb_keycode_map[XKB_KEY_XF86OpenURL] = Key::OPENURL;
xkb_keycode_map[XKB_KEY_XF86HomePage] = Key::HOMEPAGE;
xkb_keycode_map[XKB_KEY_XF86Search] = Key::SEARCH;
xkb_keycode_map[XKB_KEY_XF86AudioLowerVolume] = Key::VOLUMEDOWN;
xkb_keycode_map[XKB_KEY_XF86AudioMute] = Key::VOLUMEMUTE;
xkb_keycode_map[XKB_KEY_XF86AudioRaiseVolume] = Key::VOLUMEUP;
xkb_keycode_map[XKB_KEY_XF86AudioPlay] = Key::MEDIAPLAY;
xkb_keycode_map[XKB_KEY_XF86AudioStop] = Key::MEDIASTOP;
xkb_keycode_map[XKB_KEY_XF86AudioPrev] = Key::MEDIAPREVIOUS;
xkb_keycode_map[XKB_KEY_XF86AudioNext] = Key::MEDIANEXT;
xkb_keycode_map[XKB_KEY_XF86AudioRecord] = Key::MEDIARECORD;
xkb_keycode_map[XKB_KEY_XF86Standby] = Key::STANDBY;
// Launch keys.
xkb_keycode_map[XKB_KEY_XF86Mail] = Key::LAUNCHMAIL;
xkb_keycode_map[XKB_KEY_XF86AudioMedia] = Key::LAUNCHMEDIA;
xkb_keycode_map[XKB_KEY_XF86MyComputer] = Key::LAUNCH0;
xkb_keycode_map[XKB_KEY_XF86Calculator] = Key::LAUNCH1;
xkb_keycode_map[XKB_KEY_XF86Launch0] = Key::LAUNCH2;
xkb_keycode_map[XKB_KEY_XF86Launch1] = Key::LAUNCH3;
xkb_keycode_map[XKB_KEY_XF86Launch2] = Key::LAUNCH4;
xkb_keycode_map[XKB_KEY_XF86Launch3] = Key::LAUNCH5;
xkb_keycode_map[XKB_KEY_XF86Launch4] = Key::LAUNCH6;
xkb_keycode_map[XKB_KEY_XF86Launch5] = Key::LAUNCH7;
xkb_keycode_map[XKB_KEY_XF86Launch6] = Key::LAUNCH8;
xkb_keycode_map[XKB_KEY_XF86Launch7] = Key::LAUNCH9;
xkb_keycode_map[XKB_KEY_XF86Launch8] = Key::LAUNCHA;
xkb_keycode_map[XKB_KEY_XF86Launch9] = Key::LAUNCHB;
xkb_keycode_map[XKB_KEY_XF86LaunchA] = Key::LAUNCHC;
xkb_keycode_map[XKB_KEY_XF86LaunchB] = Key::LAUNCHD;
xkb_keycode_map[XKB_KEY_XF86LaunchC] = Key::LAUNCHE;
xkb_keycode_map[XKB_KEY_XF86LaunchD] = Key::LAUNCHF;
// Scancode to Godot Key map.
scancode_map[0x09] = Key::ESCAPE;
scancode_map[0x0A] = Key::KEY_1;
scancode_map[0x0B] = Key::KEY_2;
scancode_map[0x0C] = Key::KEY_3;
scancode_map[0x0D] = Key::KEY_4;
scancode_map[0x0E] = Key::KEY_5;
scancode_map[0x0F] = Key::KEY_6;
scancode_map[0x10] = Key::KEY_7;
scancode_map[0x11] = Key::KEY_8;
scancode_map[0x12] = Key::KEY_9;
scancode_map[0x13] = Key::KEY_0;
scancode_map[0x14] = Key::MINUS;
scancode_map[0x15] = Key::EQUAL;
scancode_map[0x16] = Key::BACKSPACE;
scancode_map[0x17] = Key::TAB;
scancode_map[0x18] = Key::Q;
scancode_map[0x19] = Key::W;
scancode_map[0x1A] = Key::E;
scancode_map[0x1B] = Key::R;
scancode_map[0x1C] = Key::T;
scancode_map[0x1D] = Key::Y;
scancode_map[0x1E] = Key::U;
scancode_map[0x1F] = Key::I;
scancode_map[0x20] = Key::O;
scancode_map[0x21] = Key::P;
scancode_map[0x22] = Key::BRACELEFT;
scancode_map[0x23] = Key::BRACERIGHT;
scancode_map[0x24] = Key::ENTER;
scancode_map[0x25] = Key::CTRL; // Left
scancode_map[0x26] = Key::A;
scancode_map[0x27] = Key::S;
scancode_map[0x28] = Key::D;
scancode_map[0x29] = Key::F;
scancode_map[0x2A] = Key::G;
scancode_map[0x2B] = Key::H;
scancode_map[0x2C] = Key::J;
scancode_map[0x2D] = Key::K;
scancode_map[0x2E] = Key::L;
scancode_map[0x2F] = Key::SEMICOLON;
scancode_map[0x30] = Key::APOSTROPHE;
scancode_map[0x31] = Key::SECTION;
scancode_map[0x32] = Key::SHIFT; // Left
scancode_map[0x33] = Key::BACKSLASH;
scancode_map[0x34] = Key::Z;
scancode_map[0x35] = Key::X;
scancode_map[0x36] = Key::C;
scancode_map[0x37] = Key::V;
scancode_map[0x38] = Key::B;
scancode_map[0x39] = Key::N;
scancode_map[0x3A] = Key::M;
scancode_map[0x3B] = Key::COMMA;
scancode_map[0x3C] = Key::PERIOD;
scancode_map[0x3D] = Key::SLASH;
scancode_map[0x3E] = Key::SHIFT; // Right
scancode_map[0x3F] = Key::KP_MULTIPLY;
scancode_map[0x40] = Key::ALT; // Left
scancode_map[0x41] = Key::SPACE;
scancode_map[0x42] = Key::CAPSLOCK;
scancode_map[0x43] = Key::F1;
scancode_map[0x44] = Key::F2;
scancode_map[0x45] = Key::F3;
scancode_map[0x46] = Key::F4;
scancode_map[0x47] = Key::F5;
scancode_map[0x48] = Key::F6;
scancode_map[0x49] = Key::F7;
scancode_map[0x4A] = Key::F8;
scancode_map[0x4B] = Key::F9;
scancode_map[0x4C] = Key::F10;
scancode_map[0x4D] = Key::NUMLOCK;
scancode_map[0x4E] = Key::SCROLLLOCK;
scancode_map[0x4F] = Key::KP_7;
scancode_map[0x50] = Key::KP_8;
scancode_map[0x51] = Key::KP_9;
scancode_map[0x52] = Key::KP_SUBTRACT;
scancode_map[0x53] = Key::KP_4;
scancode_map[0x54] = Key::KP_5;
scancode_map[0x55] = Key::KP_6;
scancode_map[0x56] = Key::KP_ADD;
scancode_map[0x57] = Key::KP_1;
scancode_map[0x58] = Key::KP_2;
scancode_map[0x59] = Key::KP_3;
scancode_map[0x5A] = Key::KP_0;
scancode_map[0x5B] = Key::KP_PERIOD;
//scancode_map[0x5C]
//scancode_map[0x5D] // Zenkaku Hankaku
scancode_map[0x5E] = Key::QUOTELEFT;
scancode_map[0x5F] = Key::F11;
scancode_map[0x60] = Key::F12;
//scancode_map[0x61] // Romaji
//scancode_map[0x62] // Katakana
//scancode_map[0x63] // Hiragana
//scancode_map[0x64] // Henkan
//scancode_map[0x65] // Hiragana Katakana
//scancode_map[0x66] // Muhenkan
scancode_map[0x67] = Key::COMMA; // KP_Separator
scancode_map[0x68] = Key::KP_ENTER;
scancode_map[0x69] = Key::CTRL; // Right
scancode_map[0x6A] = Key::KP_DIVIDE;
scancode_map[0x6B] = Key::PRINT;
scancode_map[0x6C] = Key::ALT; // Right
scancode_map[0x6D] = Key::ENTER;
scancode_map[0x6E] = Key::HOME;
scancode_map[0x6F] = Key::UP;
scancode_map[0x70] = Key::PAGEUP;
scancode_map[0x71] = Key::LEFT;
scancode_map[0x72] = Key::RIGHT;
scancode_map[0x73] = Key::END;
scancode_map[0x74] = Key::DOWN;
scancode_map[0x75] = Key::PAGEDOWN;
scancode_map[0x76] = Key::INSERT;
scancode_map[0x77] = Key::KEY_DELETE;
//scancode_map[0x78] // Macro
scancode_map[0x79] = Key::VOLUMEMUTE;
scancode_map[0x7A] = Key::VOLUMEDOWN;
scancode_map[0x7B] = Key::VOLUMEUP;
//scancode_map[0x7C] // Power
scancode_map[0x7D] = Key::EQUAL; // KP_Equal
//scancode_map[0x7E] // KP_PlusMinus
scancode_map[0x7F] = Key::PAUSE;
scancode_map[0x80] = Key::LAUNCH0;
scancode_map[0x81] = Key::COMMA; // KP_Comma
//scancode_map[0x82] // Hangul
//scancode_map[0x83] // Hangul_Hanja
scancode_map[0x84] = Key::YEN;
scancode_map[0x85] = Key::META; // Left
scancode_map[0x86] = Key::META; // Right
scancode_map[0x87] = Key::MENU;
scancode_map[0xA6] = Key::BACK; // On Chromebooks
scancode_map[0xA7] = Key::FORWARD; // On Chromebooks
scancode_map[0xB5] = Key::REFRESH; // On Chromebooks
scancode_map[0xBF] = Key::F13;
scancode_map[0xC0] = Key::F14;
scancode_map[0xC1] = Key::F15;
scancode_map[0xC2] = Key::F16;
scancode_map[0xC3] = Key::F17;
scancode_map[0xC4] = Key::F18;
scancode_map[0xC5] = Key::F19;
scancode_map[0xC6] = Key::F20;
scancode_map[0xC7] = Key::F21;
scancode_map[0xC8] = Key::F22;
scancode_map[0xC9] = Key::F23;
scancode_map[0xCA] = Key::F24;
scancode_map[0xCB] = Key::F25;
scancode_map[0xCC] = Key::F26;
scancode_map[0xCD] = Key::F27;
scancode_map[0xCE] = Key::F28;
scancode_map[0xCF] = Key::F29;
scancode_map[0xD0] = Key::F30;
scancode_map[0xD1] = Key::F31;
scancode_map[0xD2] = Key::F32;
scancode_map[0xD3] = Key::F33;
scancode_map[0xD4] = Key::F34;
scancode_map[0xD5] = Key::F35;
// Godot to scancode map.
for (const KeyValue<unsigned int, Key> &E : scancode_map) {
scancode_map_inv[E.value] = E.key;
}
// Scancode to physical location map.
// Ctrl.
location_map[0x25] = KeyLocation::LEFT;
location_map[0x69] = KeyLocation::RIGHT;
// Shift.
location_map[0x32] = KeyLocation::LEFT;
location_map[0x3E] = KeyLocation::RIGHT;
// Alt.
location_map[0x40] = KeyLocation::LEFT;
location_map[0x6C] = KeyLocation::RIGHT;
// Meta.
location_map[0x85] = KeyLocation::LEFT;
location_map[0x86] = KeyLocation::RIGHT;
}
Key KeyMappingXKB::get_keycode(xkb_keycode_t p_keysym) {
if (p_keysym >= 0x20 && p_keysym < 0x7E) { // ASCII, maps 1-1
if (p_keysym > 0x60 && p_keysym < 0x7B) { // Lowercase ASCII.
return (Key)(p_keysym - 32);
} else {
return (Key)p_keysym;
}
}
const Key *key = xkb_keycode_map.getptr(p_keysym);
if (key) {
return *key;
}
return Key::NONE;
}
Key KeyMappingXKB::get_scancode(unsigned int p_code) {
const Key *key = scancode_map.getptr(p_code);
if (key) {
return *key;
}
return Key::NONE;
}
xkb_keycode_t KeyMappingXKB::get_xkb_keycode(Key p_key) {
const unsigned int *key = scancode_map_inv.getptr(p_key);
if (key) {
return *key;
}
return 0x00;
}
KeyLocation KeyMappingXKB::get_location(unsigned int p_code) {
const KeyLocation *location = location_map.getptr(p_code);
if (location) {
return *location;
}
return KeyLocation::UNSPECIFIED;
}

View File

@ -0,0 +1,65 @@
/**************************************************************************/
/* key_mapping_xkb.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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 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. */
/**************************************************************************/
#ifndef KEY_MAPPING_XKB_H
#define KEY_MAPPING_XKB_H
#include "core/os/keyboard.h"
#include "core/templates/hash_map.h"
#ifdef SOWRAP_ENABLED
#include "xkbcommon-so_wrap.h"
#else
#include <xkbcommon/xkbcommon.h>
#endif // SOWRAP_ENABLED
class KeyMappingXKB {
struct HashMapHasherKeys {
static _FORCE_INLINE_ uint32_t hash(Key p_key) { return hash_fmix32(static_cast<uint32_t>(p_key)); }
static _FORCE_INLINE_ uint32_t hash(unsigned p_key) { return hash_fmix32(p_key); }
};
static inline HashMap<xkb_keycode_t, Key, HashMapHasherKeys> xkb_keycode_map;
static inline HashMap<unsigned int, Key, HashMapHasherKeys> scancode_map;
static inline HashMap<Key, unsigned int, HashMapHasherKeys> scancode_map_inv;
static inline HashMap<unsigned int, KeyLocation, HashMapHasherKeys> location_map;
KeyMappingXKB(){};
public:
static void initialize();
static Key get_keycode(xkb_keysym_t p_keysym);
static xkb_keycode_t get_xkb_keycode(Key p_keycode);
static Key get_scancode(unsigned int p_code);
static KeyLocation get_location(unsigned int p_code);
};
#endif // KEY_MAPPING_XKB_H

View File

@ -0,0 +1,59 @@
/**************************************************************************/
/* vulkan_context_wayland.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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 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. */
/**************************************************************************/
#include "vulkan_context_wayland.h"
#ifdef VULKAN_ENABLED
#ifdef USE_VOLK
#include <volk.h>
#else
#include <vulkan/vulkan.h>
#endif
const char *VulkanContextWayland::_get_platform_surface_extension() const {
return VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME;
}
Error VulkanContextWayland::window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, int p_width, int p_height, const void *p_platform_data) {
const WindowPlatformData *wpd = (const WindowPlatformData *)p_platform_data;
VkWaylandSurfaceCreateInfoKHR createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
createInfo.display = wpd->display;
createInfo.surface = wpd->surface;
VkSurfaceKHR surface = VK_NULL_HANDLE;
VkResult err = vkCreateWaylandSurfaceKHR(get_instance(), &createInfo, nullptr, &surface);
ERR_FAIL_COND_V(err, ERR_CANT_CREATE);
return _window_create(p_window_id, p_vsync_mode, surface, p_width, p_height);
}
#endif // VULKAN_ENABLED

View File

@ -0,0 +1,52 @@
/**************************************************************************/
/* vulkan_context_wayland.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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 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. */
/**************************************************************************/
#ifndef VULKAN_CONTEXT_WAYLAND_H
#define VULKAN_CONTEXT_WAYLAND_H
#ifdef VULKAN_ENABLED
#include "drivers/vulkan/vulkan_context.h"
class VulkanContextWayland : public VulkanContext {
const char *_get_platform_surface_extension() const override final;
public:
struct WindowPlatformData {
struct wl_display *display;
struct wl_surface *surface;
};
Error window_create(DisplayServer::WindowID p_window_id, DisplayServer::VSyncMode p_vsync_mode, int p_width, int p_height, const void *p_platform_data) override final;
};
#endif // VULKAN_ENABLED
#endif // VULKAN_CONTEXT_WAYLAND_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,930 @@
/**************************************************************************/
/* wayland_thread.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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 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. */
/**************************************************************************/
#ifndef WAYLAND_THREAD_H
#define WAYLAND_THREAD_H
#ifdef WAYLAND_ENABLED
#include "key_mapping_xkb.h"
#ifdef SOWRAP_ENABLED
#include "wayland/dynwrappers/wayland-client-core-so_wrap.h"
#include "wayland/dynwrappers/wayland-cursor-so_wrap.h"
#include "wayland/dynwrappers/wayland-egl-core-so_wrap.h"
#include "xkbcommon-so_wrap.h"
#else
#include <wayland-client-core.h>
#include <wayland-cursor.h>
#include <xkbcommon/xkbcommon.h>
#endif // SOWRAP_ENABLED
// These must go after the Wayland client include to work properly.
#include "wayland/protocol/idle_inhibit.gen.h"
#include "wayland/protocol/primary_selection.gen.h"
// These three protocol headers name wl_pointer method arguments as `pointer`,
// which is the same name as X11's pointer typedef. This trips some very
// annoying shadowing warnings. A `#define` works around this issue.
#define pointer wl_pointer
#include "wayland/protocol/pointer_constraints.gen.h"
#include "wayland/protocol/pointer_gestures.gen.h"
#include "wayland/protocol/relative_pointer.gen.h"
#undef pointer
#include "wayland/protocol/fractional_scale.gen.h"
#include "wayland/protocol/tablet.gen.h"
#include "wayland/protocol/viewporter.gen.h"
#include "wayland/protocol/wayland.gen.h"
#include "wayland/protocol/xdg_activation.gen.h"
#include "wayland/protocol/xdg_decoration.gen.h"
#include "wayland/protocol/xdg_shell.gen.h"
#ifdef LIBDECOR_ENABLED
#ifdef SOWRAP_ENABLED
#include "dynwrappers/libdecor-so_wrap.h"
#else
#include <libdecor-0/libdecor.h>
#endif // SOWRAP_ENABLED
#endif // LIBDECOR_ENABLED
#include "core/os/thread.h"
#include "servers/display_server.h"
class WaylandThread {
public:
// Messages used for exchanging information between Godot's and Wayland's thread.
class Message : public RefCounted {
public:
Message() {}
virtual ~Message() = default;
};
// Message data for window rect changes.
class WindowRectMessage : public Message {
public:
// NOTE: This is in "scaled" terms. For example, if there's a 1920x1080 rect
// with a scale factor of 2, the actual value of `rect` will be 3840x2160.
Rect2i rect;
};
class WindowEventMessage : public Message {
public:
DisplayServer::WindowEvent event;
};
class InputEventMessage : public Message {
public:
Ref<InputEvent> event;
};
class DropFilesEventMessage : public Message {
public:
Vector<String> files;
};
struct RegistryState {
WaylandThread *wayland_thread;
// Core Wayland globals.
struct wl_shm *wl_shm = nullptr;
uint32_t wl_shm_name = 0;
struct wl_compositor *wl_compositor = nullptr;
uint32_t wl_compositor_name = 0;
struct wl_subcompositor *wl_subcompositor = nullptr;
uint32_t wl_subcompositor_name = 0;
struct wl_data_device_manager *wl_data_device_manager = nullptr;
uint32_t wl_data_device_manager_name = 0;
List<struct wl_output *> wl_outputs;
List<struct wl_seat *> wl_seats;
// xdg-shell globals.
struct xdg_wm_base *xdg_wm_base = nullptr;
uint32_t xdg_wm_base_name = 0;
// wayland-protocols globals.
struct wp_viewporter *wp_viewporter = nullptr;
uint32_t wp_viewporter_name = 0;
struct wp_fractional_scale_manager_v1 *wp_fractional_scale_manager = nullptr;
uint32_t wp_fractional_scale_manager_name = 0;
struct zxdg_decoration_manager_v1 *xdg_decoration_manager = nullptr;
uint32_t xdg_decoration_manager_name = 0;
struct xdg_activation_v1 *xdg_activation = nullptr;
uint32_t xdg_activation_name = 0;
struct zwp_primary_selection_device_manager_v1 *wp_primary_selection_device_manager = nullptr;
uint32_t wp_primary_selection_device_manager_name = 0;
struct zwp_relative_pointer_manager_v1 *wp_relative_pointer_manager = nullptr;
uint32_t wp_relative_pointer_manager_name = 0;
struct zwp_pointer_constraints_v1 *wp_pointer_constraints = nullptr;
uint32_t wp_pointer_constraints_name = 0;
struct zwp_pointer_gestures_v1 *wp_pointer_gestures = nullptr;
uint32_t wp_pointer_gestures_name = 0;
struct zwp_idle_inhibit_manager_v1 *wp_idle_inhibit_manager = nullptr;
uint32_t wp_idle_inhibit_manager_name = 0;
struct zwp_tablet_manager_v2 *wp_tablet_manager = nullptr;
uint32_t wp_tablet_manager_name = 0;
};
// General Wayland-specific states. Shouldn't be accessed directly.
// TODO: Make private?
struct WindowState {
DisplayServer::WindowID id;
Rect2i rect;
DisplayServer::WindowMode mode = DisplayServer::WINDOW_MODE_WINDOWED;
// These are true by default as it isn't guaranteed that we'll find an
// xdg-shell implementation with wm_capabilities available. If and once we
// receive a wm_capabilities event these will get reset and updated with
// whatever the compositor says.
bool can_minimize = false;
bool can_maximize = false;
bool can_fullscreen = false;
HashSet<struct wl_output *> wl_outputs;
// NOTE: If for whatever reason this callback is destroyed _while_ the event
// thread is still running, it might be a good idea to set its user data to
// `nullptr`. From some initial testing of mine, it looks like it might still
// be called even after being destroyed, pointing to probably invalid window
// data by then and segfaulting hard.
struct wl_callback *frame_callback = nullptr;
struct wl_surface *wl_surface = nullptr;
struct xdg_surface *xdg_surface = nullptr;
struct xdg_toplevel *xdg_toplevel = nullptr;
struct wp_viewport *wp_viewport = nullptr;
struct wp_fractional_scale_v1 *wp_fractional_scale = nullptr;
// Currently applied buffer scale.
int buffer_scale = 1;
// Buffer scale must be applied right before rendering but _after_ committing
// everything else or otherwise we might have an inconsistent state (e.g.
// double scale and odd resolution). This flag assists with that; when set,
// on the next frame, we'll commit whatever is set in `buffer_scale`.
bool buffer_scale_changed = false;
// NOTE: The preferred buffer scale is currently only dynamically calculated.
// It can be accessed by calling `window_state_get_preferred_buffer_scale`.
// Override used by the fractional scale add-on object. If less or equal to 0
// (default) then the normal output-based scale is used instead.
double fractional_scale = 0;
// What the compositor is recommending us.
double preferred_fractional_scale = 0;
struct zxdg_toplevel_decoration_v1 *xdg_toplevel_decoration = nullptr;
struct zwp_idle_inhibitor_v1 *wp_idle_inhibitor = nullptr;
#ifdef LIBDECOR_ENABLED
// If this is null the xdg_* variables must be set and vice-versa. This way we
// can handle this mess gracefully enough to hopefully being able of getting
// rid of this cleanly once we have our own CSDs.
struct libdecor_frame *libdecor_frame = nullptr;
struct libdecor_configuration *pending_libdecor_configuration = nullptr;
#endif
RegistryState *registry;
WaylandThread *wayland_thread;
};
// "High level" Godot-side screen data.
struct ScreenData {
// Geometry data.
Point2i position;
String make;
String model;
Size2i size;
Size2i physical_size;
float refresh_rate = -1;
int scale = 1;
};
struct ScreenState {
uint32_t wl_output_name = 0;
ScreenData pending_data;
ScreenData data;
WaylandThread *wayland_thread;
};
enum class Gesture {
NONE,
MAGNIFY,
};
enum class PointerConstraint {
NONE,
LOCKED,
CONFINED,
};
struct PointerData {
Point2i position;
uint32_t motion_time = 0;
// Relative motion has its own optional event and so needs its own time.
Vector2 relative_motion;
uint32_t relative_motion_time = 0;
BitField<MouseButtonMask> pressed_button_mask;
MouseButton last_button_pressed = MouseButton::NONE;
Point2i last_pressed_position;
// This is needed to check for a new double click every time.
bool double_click_begun = false;
uint32_t button_time = 0;
uint32_t button_serial = 0;
uint32_t scroll_type = WL_POINTER_AXIS_SOURCE_WHEEL;
// The amount "scrolled" in pixels, in each direction.
Vector2 scroll_vector;
// The amount of scroll "clicks" in each direction.
Vector2i discrete_scroll_vector;
uint32_t pinch_scale = 1;
};
struct TabletToolData {
Point2i position;
Vector2i tilt;
uint32_t pressure = 0;
BitField<MouseButtonMask> pressed_button_mask;
MouseButton last_button_pressed = MouseButton::NONE;
Point2i last_pressed_position;
bool double_click_begun = false;
// Note: the protocol doesn't have it (I guess that this isn't really meant to
// be used as a mouse...), but we'll hack one in with the current ticks.
uint64_t button_time = 0;
bool is_eraser = false;
bool in_proximity = false;
bool touching = false;
};
struct OfferState {
HashSet<String> mime_types;
};
struct SeatState {
RegistryState *registry = nullptr;
WaylandThread *wayland_thread = nullptr;
struct wl_seat *wl_seat = nullptr;
uint32_t wl_seat_name = 0;
// Pointer.
struct wl_pointer *wl_pointer = nullptr;
uint32_t pointer_enter_serial = 0;
struct wl_surface *pointed_surface = nullptr;
struct wl_surface *last_pointed_surface = nullptr;
struct zwp_relative_pointer_v1 *wp_relative_pointer = nullptr;
struct zwp_locked_pointer_v1 *wp_locked_pointer = nullptr;
struct zwp_confined_pointer_v1 *wp_confined_pointer = nullptr;
struct zwp_pointer_gesture_pinch_v1 *wp_pointer_gesture_pinch = nullptr;
// NOTE: According to the wp_pointer_gestures protocol specification, there
// can be only one active gesture at a time.
Gesture active_gesture = Gesture::NONE;
// Used for delta calculations.
// NOTE: The wp_pointer_gestures protocol keeps track of the total scale of
// the pinch gesture, while godot instead wants its delta.
wl_fixed_t old_pinch_scale = 0;
struct wl_surface *cursor_surface = nullptr;
struct wl_callback *cursor_frame_callback = nullptr;
uint32_t cursor_time_ms = 0;
// This variable is needed to buffer all pointer changes until a
// wl_pointer.frame event, as per Wayland's specification. Everything is
// first set in `data_buffer` and then `data` is set with its contents on
// an input frame event. All methods should generally read from
// `pointer_data` and write to `data_buffer`.
PointerData pointer_data_buffer;
PointerData pointer_data;
// Keyboard.
struct wl_keyboard *wl_keyboard = nullptr;
struct xkb_context *xkb_context = nullptr;
struct xkb_keymap *xkb_keymap = nullptr;
struct xkb_state *xkb_state = nullptr;
const char *keymap_buffer = nullptr;
uint32_t keymap_buffer_size = 0;
xkb_layout_index_t current_layout_index = 0;
int32_t repeat_key_delay_msec = 0;
int32_t repeat_start_delay_msec = 0;
xkb_keycode_t repeating_keycode = XKB_KEYCODE_INVALID;
uint64_t last_repeat_start_msec = 0;
uint64_t last_repeat_msec = 0;
bool shift_pressed = false;
bool ctrl_pressed = false;
bool alt_pressed = false;
bool meta_pressed = false;
uint32_t last_key_pressed_serial = 0;
struct wl_data_device *wl_data_device = nullptr;
// Drag and drop.
struct wl_data_offer *wl_data_offer_dnd = nullptr;
uint32_t dnd_enter_serial = 0;
// Clipboard.
struct wl_data_source *wl_data_source_selection = nullptr;
Vector<uint8_t> selection_data;
struct wl_data_offer *wl_data_offer_selection = nullptr;
// Primary selection.
struct zwp_primary_selection_device_v1 *wp_primary_selection_device = nullptr;
struct zwp_primary_selection_source_v1 *wp_primary_selection_source = nullptr;
Vector<uint8_t> primary_data;
struct zwp_primary_selection_offer_v1 *wp_primary_selection_offer = nullptr;
// Tablet.
struct zwp_tablet_seat_v2 *wp_tablet_seat = nullptr;
List<struct zwp_tablet_tool_v2 *> tablet_tools;
TabletToolData tablet_tool_data_buffer;
TabletToolData tablet_tool_data;
};
struct CustomCursor {
struct wl_buffer *wl_buffer = nullptr;
uint32_t *buffer_data = nullptr;
uint32_t buffer_data_size = 0;
RID rid;
Point2i hotspot;
};
private:
struct ThreadData {
SafeFlag thread_done;
Mutex mutex;
struct wl_display *wl_display = nullptr;
};
// FIXME: Is this the right thing to do?
inline static const char *proxy_tag = "godot";
Thread events_thread;
ThreadData thread_data;
WindowState main_window;
List<Ref<Message>> messages;
String cursor_theme_name;
int unscaled_cursor_size = 24;
// NOTE: Regarding screen scale handling, the cursor cache is currently
// "static", by which I mean that we try to change it as little as possible and
// thus will be as big as the largest screen. This is mainly due to the fact
// that doing it dynamically doesn't look like it's worth it to me currently,
// especially as usually screen scales don't change continuously.
int cursor_scale = 1;
struct wl_cursor_theme *wl_cursor_theme = nullptr;
struct wl_cursor *wl_cursors[DisplayServer::CURSOR_MAX] = {};
HashMap<DisplayServer::CursorShape, CustomCursor> custom_cursors;
struct wl_cursor *current_wl_cursor = nullptr;
struct CustomCursor *current_custom_cursor = nullptr;
DisplayServer::CursorShape last_cursor_shape = DisplayServer::CURSOR_ARROW;
PointerConstraint pointer_constraint = PointerConstraint::NONE;
struct wl_display *wl_display = nullptr;
struct wl_registry *wl_registry = nullptr;
struct wl_seat *wl_seat_current = nullptr;
bool frame = true;
RegistryState registry;
bool initialized = false;
#ifdef LIBDECOR_ENABLED
struct libdecor *libdecor_context = nullptr;
#endif // LIBDECOR_ENABLED
// Main polling method.
static void _poll_events_thread(void *p_data);
// Core Wayland event handlers.
static void _wl_registry_on_global(void *data, struct wl_registry *wl_registry, uint32_t name, const char *interface, uint32_t version);
static void _wl_registry_on_global_remove(void *data, struct wl_registry *wl_registry, uint32_t name);
static void _wl_surface_on_enter(void *data, struct wl_surface *wl_surface, struct wl_output *wl_output);
static void _wl_surface_on_leave(void *data, struct wl_surface *wl_surface, struct wl_output *wl_output);
static void _frame_wl_callback_on_done(void *data, struct wl_callback *wl_callback, uint32_t callback_data);
static void _wl_output_on_geometry(void *data, struct wl_output *wl_output, int32_t x, int32_t y, int32_t physical_width, int32_t physical_height, int32_t subpixel, const char *make, const char *model, int32_t transform);
static void _wl_output_on_mode(void *data, struct wl_output *wl_output, uint32_t flags, int32_t width, int32_t height, int32_t refresh);
static void _wl_output_on_done(void *data, struct wl_output *wl_output);
static void _wl_output_on_scale(void *data, struct wl_output *wl_output, int32_t factor);
static void _wl_output_on_name(void *data, struct wl_output *wl_output, const char *name);
static void _wl_output_on_description(void *data, struct wl_output *wl_output, const char *description);
static void _wl_seat_on_capabilities(void *data, struct wl_seat *wl_seat, uint32_t capabilities);
static void _wl_seat_on_name(void *data, struct wl_seat *wl_seat, const char *name);
static void _cursor_frame_callback_on_done(void *data, struct wl_callback *wl_callback, uint32_t time_ms);
static void _wl_pointer_on_enter(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t surface_x, wl_fixed_t surface_y);
static void _wl_pointer_on_leave(void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface);
static void _wl_pointer_on_motion(void *data, struct wl_pointer *wl_pointer, uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y);
static void _wl_pointer_on_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state);
static void _wl_pointer_on_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value);
static void _wl_pointer_on_frame(void *data, struct wl_pointer *wl_pointer);
static void _wl_pointer_on_axis_source(void *data, struct wl_pointer *wl_pointer, uint32_t axis_source);
static void _wl_pointer_on_axis_stop(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis);
static void _wl_pointer_on_axis_discrete(void *data, struct wl_pointer *wl_pointer, uint32_t axis, int32_t discrete);
static void _wl_pointer_on_axis_value120(void *data, struct wl_pointer *wl_pointer, uint32_t axis, int32_t value120);
static void _wl_keyboard_on_keymap(void *data, struct wl_keyboard *wl_keyboard, uint32_t format, int32_t fd, uint32_t size);
static void _wl_keyboard_on_enter(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface, struct wl_array *keys);
static void _wl_keyboard_on_leave(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface);
static void _wl_keyboard_on_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, uint32_t time, uint32_t key, uint32_t state);
static void _wl_keyboard_on_modifiers(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group);
static void _wl_keyboard_on_repeat_info(void *data, struct wl_keyboard *wl_keyboard, int32_t rate, int32_t delay);
static void _wl_data_device_on_data_offer(void *data, struct wl_data_device *wl_data_device, struct wl_data_offer *id);
static void _wl_data_device_on_enter(void *data, struct wl_data_device *wl_data_device, uint32_t serial, struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y, struct wl_data_offer *id);
static void _wl_data_device_on_leave(void *data, struct wl_data_device *wl_data_device);
static void _wl_data_device_on_motion(void *data, struct wl_data_device *wl_data_device, uint32_t time, wl_fixed_t x, wl_fixed_t y);
static void _wl_data_device_on_drop(void *data, struct wl_data_device *wl_data_device);
static void _wl_data_device_on_selection(void *data, struct wl_data_device *wl_data_device, struct wl_data_offer *id);
static void _wl_data_offer_on_offer(void *data, struct wl_data_offer *wl_data_offer, const char *mime_type);
static void _wl_data_offer_on_source_actions(void *data, struct wl_data_offer *wl_data_offer, uint32_t source_actions);
static void _wl_data_offer_on_action(void *data, struct wl_data_offer *wl_data_offer, uint32_t dnd_action);
static void _wl_data_source_on_target(void *data, struct wl_data_source *wl_data_source, const char *mime_type);
static void _wl_data_source_on_send(void *data, struct wl_data_source *wl_data_source, const char *mime_type, int32_t fd);
static void _wl_data_source_on_cancelled(void *data, struct wl_data_source *wl_data_source);
static void _wl_data_source_on_dnd_drop_performed(void *data, struct wl_data_source *wl_data_source);
static void _wl_data_source_on_dnd_finished(void *data, struct wl_data_source *wl_data_source);
static void _wl_data_source_on_action(void *data, struct wl_data_source *wl_data_source, uint32_t dnd_action);
// xdg-shell event handlers.
static void _xdg_wm_base_on_ping(void *data, struct xdg_wm_base *xdg_wm_base, uint32_t serial);
static void _xdg_surface_on_configure(void *data, struct xdg_surface *xdg_surface, uint32_t serial);
static void _xdg_toplevel_on_configure(void *data, struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height, struct wl_array *states);
static void _xdg_toplevel_on_close(void *data, struct xdg_toplevel *xdg_toplevel);
static void _xdg_toplevel_on_configure_bounds(void *data, struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height);
static void _xdg_toplevel_on_wm_capabilities(void *data, struct xdg_toplevel *xdg_toplevel, struct wl_array *capabilities);
// wayland-protocols event handlers.
static void _wp_fractional_scale_on_preferred_scale(void *data, struct wp_fractional_scale_v1 *wp_fractional_scale_v1, uint32_t scale);
static void _wp_relative_pointer_on_relative_motion(void *data, struct zwp_relative_pointer_v1 *wp_relative_pointer_v1, uint32_t uptime_hi, uint32_t uptime_lo, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t dx_unaccel, wl_fixed_t dy_unaccel);
static void _wp_pointer_gesture_pinch_on_begin(void *data, struct zwp_pointer_gesture_pinch_v1 *zwp_pointer_gesture_pinch_v1, uint32_t serial, uint32_t time, struct wl_surface *surface, uint32_t fingers);
static void _wp_pointer_gesture_pinch_on_update(void *data, struct zwp_pointer_gesture_pinch_v1 *zwp_pointer_gesture_pinch_v1, uint32_t time, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t scale, wl_fixed_t rotation);
static void _wp_pointer_gesture_pinch_on_end(void *data, struct zwp_pointer_gesture_pinch_v1 *zwp_pointer_gesture_pinch_v1, uint32_t serial, uint32_t time, int32_t cancelled);
static void _wp_primary_selection_device_on_data_offer(void *data, struct zwp_primary_selection_device_v1 *wp_primary_selection_device_v1, struct zwp_primary_selection_offer_v1 *offer);
static void _wp_primary_selection_device_on_selection(void *data, struct zwp_primary_selection_device_v1 *wp_primary_selection_device_v1, struct zwp_primary_selection_offer_v1 *id);
static void _wp_primary_selection_offer_on_offer(void *data, struct zwp_primary_selection_offer_v1 *zwp_primary_selection_offer_v1, const char *mime_type);
static void _wp_primary_selection_source_on_send(void *data, struct zwp_primary_selection_source_v1 *wp_primary_selection_source_v1, const char *mime_type, int32_t fd);
static void _wp_primary_selection_source_on_cancelled(void *data, struct zwp_primary_selection_source_v1 *wp_primary_selection_source_v1);
static void _wp_tablet_seat_on_tablet_added(void *data, struct zwp_tablet_seat_v2 *zwp_tablet_seat_v2, struct zwp_tablet_v2 *id);
static void _wp_tablet_seat_on_tool_added(void *data, struct zwp_tablet_seat_v2 *zwp_tablet_seat_v2, struct zwp_tablet_tool_v2 *id);
static void _wp_tablet_seat_on_pad_added(void *data, struct zwp_tablet_seat_v2 *zwp_tablet_seat_v2, struct zwp_tablet_pad_v2 *id);
static void _wp_tablet_tool_on_type(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t tool_type);
static void _wp_tablet_tool_on_hardware_serial(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t hardware_serial_hi, uint32_t hardware_serial_lo);
static void _wp_tablet_tool_on_hardware_id_wacom(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t hardware_id_hi, uint32_t hardware_id_lo);
static void _wp_tablet_tool_on_capability(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t capability);
static void _wp_tablet_tool_on_done(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2);
static void _wp_tablet_tool_on_removed(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2);
static void _wp_tablet_tool_on_proximity_in(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t serial, struct zwp_tablet_v2 *tablet, struct wl_surface *surface);
static void _wp_tablet_tool_on_proximity_out(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2);
static void _wp_tablet_tool_on_down(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t serial);
static void _wp_tablet_tool_on_up(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2);
static void _wp_tablet_tool_on_motion(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, wl_fixed_t x, wl_fixed_t y);
static void _wp_tablet_tool_on_pressure(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t pressure);
static void _wp_tablet_tool_on_distance(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t distance);
static void _wp_tablet_tool_on_tilt(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, wl_fixed_t tilt_x, wl_fixed_t tilt_y);
static void _wp_tablet_tool_on_rotation(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, wl_fixed_t degrees);
static void _wp_tablet_tool_on_slider(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, int32_t position);
static void _wp_tablet_tool_on_wheel(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, wl_fixed_t degrees, int32_t clicks);
static void _wp_tablet_tool_on_button(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t serial, uint32_t button, uint32_t state);
static void _wp_tablet_tool_on_frame(void *data, struct zwp_tablet_tool_v2 *zwp_tablet_tool_v2, uint32_t time);
static void _xdg_toplevel_decoration_on_configure(void *data, struct zxdg_toplevel_decoration_v1 *xdg_toplevel_decoration, uint32_t mode);
static void _xdg_activation_token_on_done(void *data, struct xdg_activation_token_v1 *xdg_activation_token, const char *token);
// Core Wayland event listeners.
static constexpr struct wl_registry_listener wl_registry_listener = {
.global = _wl_registry_on_global,
.global_remove = _wl_registry_on_global_remove,
};
static constexpr struct wl_surface_listener wl_surface_listener = {
.enter = _wl_surface_on_enter,
.leave = _wl_surface_on_leave,
};
static constexpr struct wl_callback_listener frame_wl_callback_listener {
.done = _frame_wl_callback_on_done,
};
static constexpr struct wl_output_listener wl_output_listener = {
.geometry = _wl_output_on_geometry,
.mode = _wl_output_on_mode,
.done = _wl_output_on_done,
.scale = _wl_output_on_scale,
.name = _wl_output_on_name,
.description = _wl_output_on_description,
};
static constexpr struct wl_seat_listener wl_seat_listener = {
.capabilities = _wl_seat_on_capabilities,
.name = _wl_seat_on_name,
};
static constexpr struct wl_callback_listener cursor_frame_callback_listener {
.done = _cursor_frame_callback_on_done,
};
static constexpr struct wl_pointer_listener wl_pointer_listener = {
.enter = _wl_pointer_on_enter,
.leave = _wl_pointer_on_leave,
.motion = _wl_pointer_on_motion,
.button = _wl_pointer_on_button,
.axis = _wl_pointer_on_axis,
.frame = _wl_pointer_on_frame,
.axis_source = _wl_pointer_on_axis_source,
.axis_stop = _wl_pointer_on_axis_stop,
.axis_discrete = _wl_pointer_on_axis_discrete,
.axis_value120 = _wl_pointer_on_axis_value120,
};
static constexpr struct wl_keyboard_listener wl_keyboard_listener = {
.keymap = _wl_keyboard_on_keymap,
.enter = _wl_keyboard_on_enter,
.leave = _wl_keyboard_on_leave,
.key = _wl_keyboard_on_key,
.modifiers = _wl_keyboard_on_modifiers,
.repeat_info = _wl_keyboard_on_repeat_info,
};
static constexpr struct wl_data_device_listener wl_data_device_listener = {
.data_offer = _wl_data_device_on_data_offer,
.enter = _wl_data_device_on_enter,
.leave = _wl_data_device_on_leave,
.motion = _wl_data_device_on_motion,
.drop = _wl_data_device_on_drop,
.selection = _wl_data_device_on_selection,
};
static constexpr struct wl_data_offer_listener wl_data_offer_listener = {
.offer = _wl_data_offer_on_offer,
.source_actions = _wl_data_offer_on_source_actions,
.action = _wl_data_offer_on_action,
};
static constexpr struct wl_data_source_listener wl_data_source_listener = {
.target = _wl_data_source_on_target,
.send = _wl_data_source_on_send,
.cancelled = _wl_data_source_on_cancelled,
.dnd_drop_performed = _wl_data_source_on_dnd_drop_performed,
.dnd_finished = _wl_data_source_on_dnd_finished,
.action = _wl_data_source_on_action,
};
// xdg-shell event listeners.
static constexpr struct xdg_wm_base_listener xdg_wm_base_listener = {
.ping = _xdg_wm_base_on_ping,
};
static constexpr struct xdg_surface_listener xdg_surface_listener = {
.configure = _xdg_surface_on_configure,
};
static constexpr struct xdg_toplevel_listener xdg_toplevel_listener = {
.configure = _xdg_toplevel_on_configure,
.close = _xdg_toplevel_on_close,
.configure_bounds = _xdg_toplevel_on_configure_bounds,
.wm_capabilities = _xdg_toplevel_on_wm_capabilities,
};
// wayland-protocols event listeners.
static constexpr struct wp_fractional_scale_v1_listener wp_fractional_scale_listener = {
.preferred_scale = _wp_fractional_scale_on_preferred_scale,
};
static constexpr struct zwp_relative_pointer_v1_listener wp_relative_pointer_listener = {
.relative_motion = _wp_relative_pointer_on_relative_motion,
};
static constexpr struct zwp_pointer_gesture_pinch_v1_listener wp_pointer_gesture_pinch_listener = {
.begin = _wp_pointer_gesture_pinch_on_begin,
.update = _wp_pointer_gesture_pinch_on_update,
.end = _wp_pointer_gesture_pinch_on_end,
};
static constexpr struct zwp_primary_selection_device_v1_listener wp_primary_selection_device_listener = {
.data_offer = _wp_primary_selection_device_on_data_offer,
.selection = _wp_primary_selection_device_on_selection,
};
static constexpr struct zwp_primary_selection_offer_v1_listener wp_primary_selection_offer_listener = {
.offer = _wp_primary_selection_offer_on_offer,
};
static constexpr struct zwp_primary_selection_source_v1_listener wp_primary_selection_source_listener = {
.send = _wp_primary_selection_source_on_send,
.cancelled = _wp_primary_selection_source_on_cancelled,
};
static constexpr struct zwp_tablet_seat_v2_listener wp_tablet_seat_listener = {
.tablet_added = _wp_tablet_seat_on_tablet_added,
.tool_added = _wp_tablet_seat_on_tool_added,
.pad_added = _wp_tablet_seat_on_pad_added,
};
static constexpr struct zwp_tablet_tool_v2_listener wp_tablet_tool_listener = {
.type = _wp_tablet_tool_on_type,
.hardware_serial = _wp_tablet_tool_on_hardware_serial,
.hardware_id_wacom = _wp_tablet_tool_on_hardware_id_wacom,
.capability = _wp_tablet_tool_on_capability,
.done = _wp_tablet_tool_on_done,
.removed = _wp_tablet_tool_on_removed,
.proximity_in = _wp_tablet_tool_on_proximity_in,
.proximity_out = _wp_tablet_tool_on_proximity_out,
.down = _wp_tablet_tool_on_down,
.up = _wp_tablet_tool_on_up,
.motion = _wp_tablet_tool_on_motion,
.pressure = _wp_tablet_tool_on_pressure,
.distance = _wp_tablet_tool_on_distance,
.tilt = _wp_tablet_tool_on_tilt,
.rotation = _wp_tablet_tool_on_rotation,
.slider = _wp_tablet_tool_on_slider,
.wheel = _wp_tablet_tool_on_wheel,
.button = _wp_tablet_tool_on_button,
.frame = _wp_tablet_tool_on_frame,
};
static constexpr struct zxdg_toplevel_decoration_v1_listener xdg_toplevel_decoration_listener = {
.configure = _xdg_toplevel_decoration_on_configure,
};
static constexpr struct xdg_activation_token_v1_listener xdg_activation_token_listener = {
.done = _xdg_activation_token_on_done,
};
#ifdef LIBDECOR_ENABLED
// libdecor event handlers.
static void libdecor_on_error(struct libdecor *context, enum libdecor_error error, const char *message);
static void libdecor_frame_on_configure(struct libdecor_frame *frame, struct libdecor_configuration *configuration, void *user_data);
static void libdecor_frame_on_close(struct libdecor_frame *frame, void *user_data);
static void libdecor_frame_on_commit(struct libdecor_frame *frame, void *user_data);
static void libdecor_frame_on_dismiss_popup(struct libdecor_frame *frame, const char *seat_name, void *user_data);
// libdecor event listeners.
static constexpr struct libdecor_interface libdecor_interface = {
.error = libdecor_on_error,
.reserved0 = nullptr,
.reserved1 = nullptr,
.reserved2 = nullptr,
.reserved3 = nullptr,
.reserved4 = nullptr,
.reserved5 = nullptr,
.reserved6 = nullptr,
.reserved7 = nullptr,
.reserved8 = nullptr,
.reserved9 = nullptr,
};
static constexpr struct libdecor_frame_interface libdecor_frame_interface = {
.configure = libdecor_frame_on_configure,
.close = libdecor_frame_on_close,
.commit = libdecor_frame_on_commit,
.dismiss_popup = libdecor_frame_on_dismiss_popup,
.reserved0 = nullptr,
.reserved1 = nullptr,
.reserved2 = nullptr,
.reserved3 = nullptr,
.reserved4 = nullptr,
.reserved5 = nullptr,
.reserved6 = nullptr,
.reserved7 = nullptr,
.reserved8 = nullptr,
.reserved9 = nullptr,
};
#endif // LIBDECOR_ENABLED
static Vector<uint8_t> _read_fd(int fd);
static int _allocate_shm_file(size_t size);
static Vector<uint8_t> _wl_data_offer_read(struct wl_display *wl_display, const char *p_mime, struct wl_data_offer *wl_data_offer);
static Vector<uint8_t> _wp_primary_selection_offer_read(struct wl_display *wl_display, const char *p_mime, struct zwp_primary_selection_offer_v1 *wp_primary_selection_offer);
static void _seat_state_set_current(WaylandThread::SeatState &p_ss);
static bool _seat_state_configure_key_event(WaylandThread::SeatState &p_seat, Ref<InputEventKey> p_event, xkb_keycode_t p_keycode, bool p_pressed);
static void _wayland_state_update_cursor();
void _set_current_seat(struct wl_seat *p_seat);
bool _load_cursor_theme(int p_cursor_size);
void _update_scale(int p_scale);
public:
Mutex &mutex = thread_data.mutex;
struct wl_display *get_wl_display() const;
// Core Wayland utilities for integrating with our own data structures.
static bool wl_proxy_is_godot(struct wl_proxy *p_proxy);
static void wl_proxy_tag_godot(struct wl_proxy *p_proxy);
static WindowState *wl_surface_get_window_state(struct wl_surface *p_surface);
static ScreenState *wl_output_get_screen_state(struct wl_output *p_output);
static SeatState *wl_seat_get_seat_state(struct wl_seat *p_seat);
static OfferState *wl_data_offer_get_offer_state(struct wl_data_offer *p_offer);
static OfferState *wp_primary_selection_offer_get_offer_state(struct zwp_primary_selection_offer_v1 *p_offer);
void seat_state_unlock_pointer(SeatState *p_ss);
void seat_state_lock_pointer(SeatState *p_ss);
void seat_state_set_hint(SeatState *p_ss, int p_x, int p_y);
void seat_state_confine_pointer(SeatState *p_ss);
static void seat_state_update_cursor(SeatState *p_ss);
void seat_state_echo_keys(SeatState *p_ss);
static int window_state_get_preferred_buffer_scale(WindowState *p_ws);
static double window_state_get_scale_factor(WindowState *p_ws);
static void window_state_update_size(WindowState *p_ws, int p_width, int p_height);
static Vector2i scale_vector2i(const Vector2i &p_vector, double p_amount);
void push_message(Ref<Message> message);
bool has_message();
Ref<Message> pop_message();
void window_create(DisplayServer::WindowID p_window_id, int p_width, int p_height);
struct wl_surface *window_get_wl_surface(DisplayServer::WindowID p_window_id) const;
void window_set_max_size(DisplayServer::WindowID p_window_id, const Size2i &p_size);
void window_set_min_size(DisplayServer::WindowID p_window_id, const Size2i &p_size);
bool window_can_set_mode(DisplayServer::WindowID p_window_id, DisplayServer::WindowMode p_window_mode) const;
void window_try_set_mode(DisplayServer::WindowID p_window_id, DisplayServer::WindowMode p_window_mode);
DisplayServer::WindowMode window_get_mode(DisplayServer::WindowID p_window_id) const;
void window_set_borderless(DisplayServer::WindowID p_window_id, bool p_borderless);
void window_set_title(DisplayServer::WindowID p_window_id, const String &p_title);
void window_set_app_id(DisplayServer::WindowID p_window_id, const String &p_app_id);
bool window_is_focused(DisplayServer::WindowID p_window_id);
// Optional - requires xdg_activation_v1
void window_request_attention(DisplayServer::WindowID p_window_id);
// Optional - require idle_inhibit_unstable_v1
void window_set_idle_inhibition(DisplayServer::WindowID p_window_id, bool p_enable);
bool window_get_idle_inhibition(DisplayServer::WindowID p_window_id) const;
ScreenData screen_get_data(int p_screen) const;
int get_screen_count() const;
void pointer_set_constraint(PointerConstraint p_constraint);
void pointer_set_hint(const Point2i &p_hint);
PointerConstraint pointer_get_constraint() const;
DisplayServer::WindowID pointer_get_pointed_window_id() const;
BitField<MouseButtonMask> pointer_get_button_mask() const;
void cursor_hide();
void cursor_set_shape(DisplayServer::CursorShape p_cursor_shape);
void cursor_set_custom_shape(DisplayServer::CursorShape p_cursor_shape);
void cursor_shape_set_custom_image(DisplayServer::CursorShape p_cursor_shape, Ref<Image> p_image, const Point2i &p_hotspot);
void cursor_shape_clear_custom_image(DisplayServer::CursorShape p_cursor_shape);
int keyboard_get_layout_count() const;
int keyboard_get_current_layout_index() const;
void keyboard_set_current_layout_index(int p_index);
String keyboard_get_layout_name(int p_index) const;
Key keyboard_get_key_from_physical(Key p_key) const;
void keyboard_echo_keys();
bool selection_has_mime(const String &p_mime) const;
Vector<uint8_t> selection_get_mime(const String &p_mime) const;
void selection_set_text(const String &p_text);
// Optional primary support - requires wp_primary_selection_unstable_v1
bool primary_has_mime(const String &p_mime) const;
Vector<uint8_t> primary_get_mime(const String &p_mime) const;
void primary_set_text(const String &p_text);
void set_frame();
bool get_reset_frame();
Error init();
void destroy();
};
#endif // WAYLAND_ENABLED
#endif // WAYLAND_THREAD_H

43
thirdparty/README.md vendored
View File

@ -931,6 +931,49 @@ https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/issues/318
Patches in the `patches` directory should be re-applied after updates.
## wayland
- Upstream: https://gitlab.freedesktop.org/wayland/wayland
- Version: 1.21.0 (8135e856ebd79872f886466e9cee39affb7d9ee8, 2022)
- License: MIT
Files extracted from upstream source:
- `protocol/wayland.xml`
- `COPYING`
# wayland-protocols
- Upstream: https://gitlab.freedesktop.org/wayland/wayland-protocols
- Version: 1.32 (681c33c8547d6aefe24455ba2bffe1c5ae11fee5, 2023)
- License: MIT
Files extracted from upstream source:
- `stable/viewporter/README`
- `stable/viewporter/viewporter.xml`
- `stable/xdg-shell/README`
- `stable/xdg-shell/xdg-shell.xml`
- `staging/fractional-scale/README`
- `staging/fractional-scale/fractional-scale-v1.xml`
- `staging/xdg-activation/README`
- `staging/xdg-activation/xdg-activation-v1.xml`
- `unstable/pointer-constraints/README`
- `unstable/pointer-constraints/pointer-constraints-unstable-v1.xml`
- `unstable/pointer-gestures/README`
- `unstable/pointer-gestures/pointer-gestures-unstable-v1.xml`
- `unstable/primary-selection/README`
- `unstable/primary-selection/primary-selection-unstable-v1.xml`
- `unstable/relative-pointer/README`
- `unstable/relative-pointer/relative-pointer-unstable-v1.xml`
- `unstable/tablet/README`
- `unstable/tablet/tablet-unstable-v2.xml`
- `unstable/xdg-decoration/README`
- `unstable/xdg-decoration/xdg-decoration-unstable-v1.xml`
- `COPYING`
## wslay
- Upstream: https://github.com/tatsuhiro-t/wslay

View File

@ -28,6 +28,13 @@ Patches in the `patches` directory should be re-applied after updates.
- License: fontconfig
## libdecor
- Upstream: https://gitlab.freedesktop.org/libdecor/libdecor/
- Version: 0.1.1
- License: MIT
## pulse
- Upstream: http://pulseaudio.org/
@ -49,6 +56,13 @@ Patches in the `patches` directory should be re-applied after updates.
- License: LGPL-2.1+
## wayland
- Upstream: https://gitlab.freedesktop.org/wayland/wayland
- Version: 1.21.0 (8135e856ebd79872f886466e9cee39affb7d9ee8, 2022)
- License: MIT
## X11
- Upstream: https://x.org/wiki/

View File

@ -0,0 +1,521 @@
/*
* Copyright © 2017-2018 Red Hat Inc.
* Copyright © 2018 Jonas Ådahl
*
* 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.
*/
#ifndef LIBDECOR_H
#define LIBDECOR_H
#include <stdbool.h>
#include <wayland-client.h>
#ifdef __cplusplus
extern "C" {
#endif
#if defined(__GNUC__) && __GNUC__ >= 4
#define LIBDECOR_EXPORT __attribute__ ((visibility("default")))
#else
#define LIBDECOR_EXPORT
#endif
struct xdg_toplevel;
/** \class libdecor
*
* \brief A libdecor context instance.
*/
struct libdecor;
/** \class libdecor_frame
*
* \brief A frame used for decorating a Wayland surface.
*/
struct libdecor_frame;
/** \class libdecor_configuration
*
* \brief An object representing a toplevel window configuration.
*/
struct libdecor_configuration;
/** \class libdecor_state
*
* \brief An object corresponding to a configured content state.
*/
struct libdecor_state;
enum libdecor_error {
LIBDECOR_ERROR_COMPOSITOR_INCOMPATIBLE,
LIBDECOR_ERROR_INVALID_FRAME_CONFIGURATION,
};
enum libdecor_window_state {
LIBDECOR_WINDOW_STATE_NONE = 0,
LIBDECOR_WINDOW_STATE_ACTIVE = 1 << 0,
LIBDECOR_WINDOW_STATE_MAXIMIZED = 1 << 1,
LIBDECOR_WINDOW_STATE_FULLSCREEN = 1 << 2,
LIBDECOR_WINDOW_STATE_TILED_LEFT = 1 << 3,
LIBDECOR_WINDOW_STATE_TILED_RIGHT = 1 << 4,
LIBDECOR_WINDOW_STATE_TILED_TOP = 1 << 5,
LIBDECOR_WINDOW_STATE_TILED_BOTTOM = 1 << 6,
};
enum libdecor_resize_edge {
LIBDECOR_RESIZE_EDGE_NONE,
LIBDECOR_RESIZE_EDGE_TOP,
LIBDECOR_RESIZE_EDGE_BOTTOM,
LIBDECOR_RESIZE_EDGE_LEFT,
LIBDECOR_RESIZE_EDGE_TOP_LEFT,
LIBDECOR_RESIZE_EDGE_BOTTOM_LEFT,
LIBDECOR_RESIZE_EDGE_RIGHT,
LIBDECOR_RESIZE_EDGE_TOP_RIGHT,
LIBDECOR_RESIZE_EDGE_BOTTOM_RIGHT,
};
enum libdecor_capabilities {
LIBDECOR_ACTION_MOVE = 1 << 0,
LIBDECOR_ACTION_RESIZE = 1 << 1,
LIBDECOR_ACTION_MINIMIZE = 1 << 2,
LIBDECOR_ACTION_FULLSCREEN = 1 << 3,
LIBDECOR_ACTION_CLOSE = 1 << 4,
};
struct libdecor_interface {
/**
* An error event
*/
void (* error)(struct libdecor *context,
enum libdecor_error error,
const char *message);
/* Reserved */
void (* reserved0)(void);
void (* reserved1)(void);
void (* reserved2)(void);
void (* reserved3)(void);
void (* reserved4)(void);
void (* reserved5)(void);
void (* reserved6)(void);
void (* reserved7)(void);
void (* reserved8)(void);
void (* reserved9)(void);
};
/**
* Interface for integrating a Wayland surface with libdecor.
*/
struct libdecor_frame_interface {
/**
* A new configuration was received. An application should respond to
* this by creating a suitable libdecor_state, and apply it using
* libdecor_frame_commit.
*/
void (* configure)(struct libdecor_frame *frame,
struct libdecor_configuration *configuration,
void *user_data);
/**
* The window was requested to be closed by the compositor.
*/
void (* close)(struct libdecor_frame *frame,
void *user_data);
/**
* The window decoration asked to have the main surface to be
* committed. This is required when the decoration is implemented using
* synchronous subsurfaces.
*/
void (* commit)(struct libdecor_frame *frame,
void *user_data);
/**
* Any mapped popup that has a grab on the given seat should be
* dismissed.
*/
void (* dismiss_popup)(struct libdecor_frame *frame,
const char *seat_name,
void *user_data);
/* Reserved */
void (* reserved0)(void);
void (* reserved1)(void);
void (* reserved2)(void);
void (* reserved3)(void);
void (* reserved4)(void);
void (* reserved5)(void);
void (* reserved6)(void);
void (* reserved7)(void);
void (* reserved8)(void);
void (* reserved9)(void);
};
/**
* Remove a reference to the libdecor instance. When the reference count
* reaches zero, it is freed.
*/
void
libdecor_unref(struct libdecor *context);
/**
* Create a new libdecor context for the given wl_display.
*/
struct libdecor *
libdecor_new(struct wl_display *display,
struct libdecor_interface *iface);
/**
* Get the file descriptor used by libdecor. This is similar to
* wl_display_get_fd(), thus should be polled, and when data is available,
* libdecor_dispatch() should be called.
*/
int
libdecor_get_fd(struct libdecor *context);
/**
* Dispatch events. This function should be called when data is available on
* the file descriptor returned by libdecor_get_fd(). If timeout is zero, this
* function will never block.
*/
int
libdecor_dispatch(struct libdecor *context,
int timeout);
/**
* Decorate the given content wl_surface.
*
* This will create an xdg_surface and an xdg_toplevel, and integrate it
* properly with the windowing system, including creating appropriate
* decorations when needed, as well as handle windowing integration events such
* as resizing, moving, maximizing, etc.
*
* The passed wl_surface should only contain actual application content,
* without any window decoration.
*/
struct libdecor_frame *
libdecor_decorate(struct libdecor *context,
struct wl_surface *surface,
struct libdecor_frame_interface *iface,
void *user_data);
/**
* Add a reference to the frame object.
*/
void
libdecor_frame_ref(struct libdecor_frame *frame);
/**
* Remove a reference to the frame object. When the reference count reaches
* zero, the frame object is destroyed.
*/
void
libdecor_frame_unref(struct libdecor_frame *frame);
/**
* Set the visibility of the frame.
*
* If an application wants to be borderless, it can set the frame visibility to
* false.
*/
void
libdecor_frame_set_visibility(struct libdecor_frame *frame,
bool visible);
/**
* Get the visibility of the frame.
*/
bool
libdecor_frame_is_visible(struct libdecor_frame *frame);
/**
* Set the parent of the window.
*
* This can be used to stack multiple toplevel windows above or under each
* other.
*/
void
libdecor_frame_set_parent(struct libdecor_frame *frame,
struct libdecor_frame *parent);
/**
* Set the title of the window.
*/
void
libdecor_frame_set_title(struct libdecor_frame *frame,
const char *title);
/**
* Get the title of the window.
*/
const char *
libdecor_frame_get_title(struct libdecor_frame *frame);
/**
* Set the application ID of the window.
*/
void
libdecor_frame_set_app_id(struct libdecor_frame *frame,
const char *app_id);
/**
* Set new capabilities of the window.
*
* This determines whether e.g. a window decoration should show a maximize
* button, etc.
*
* Setting a capability does not implicitly unset any other.
*/
void
libdecor_frame_set_capabilities(struct libdecor_frame *frame,
enum libdecor_capabilities capabilities);
/**
* Unset capabilities of the window.
*
* The opposite of libdecor_frame_set_capabilities.
*/
void
libdecor_frame_unset_capabilities(struct libdecor_frame *frame,
enum libdecor_capabilities capabilities);
/**
* Check whether the window has any of the given capabilities.
*/
bool
libdecor_frame_has_capability(struct libdecor_frame *frame,
enum libdecor_capabilities capability);
/**
* Show the window menu.
*/
void
libdecor_frame_show_window_menu(struct libdecor_frame *frame,
struct wl_seat *wl_seat,
uint32_t serial,
int x,
int y);
/**
* Issue a popup grab on the window. Call this when a xdg_popup is mapped, so
* that it can be properly dismissed by the decorations.
*/
void
libdecor_frame_popup_grab(struct libdecor_frame *frame,
const char *seat_name);
/**
* Release the popup grab. Call this when you unmap a popup.
*/
void
libdecor_frame_popup_ungrab(struct libdecor_frame *frame,
const char *seat_name);
/**
* Translate content surface local coordinates to toplevel window local
* coordinates.
*
* This can be used to translate surface coordinates to coordinates useful for
* e.g. showing the window menu, or positioning a popup.
*/
void
libdecor_frame_translate_coordinate(struct libdecor_frame *frame,
int surface_x,
int surface_y,
int *frame_x,
int *frame_y);
/**
* Set the min content size.
*
* This translates roughly to xdg_toplevel_set_min_size().
*/
void
libdecor_frame_set_min_content_size(struct libdecor_frame *frame,
int content_width,
int content_height);
/**
* Set the max content size.
*
* This translates roughly to xdg_toplevel_set_max_size().
*/
void
libdecor_frame_set_max_content_size(struct libdecor_frame *frame,
int content_width,
int content_height);
/**
* Initiate an interactive resize.
*
* This roughly translates to xdg_toplevel_resize().
*/
void
libdecor_frame_resize(struct libdecor_frame *frame,
struct wl_seat *wl_seat,
uint32_t serial,
enum libdecor_resize_edge edge);
/**
* Initiate an interactive move.
*
* This roughly translates to xdg_toplevel_move().
*/
void
libdecor_frame_move(struct libdecor_frame *frame,
struct wl_seat *wl_seat,
uint32_t serial);
/**
* Commit a new window state. This can be called on application driven resizes
* when the window is floating, or in response to received configurations, i.e.
* from e.g. interactive resizes or state changes.
*/
void
libdecor_frame_commit(struct libdecor_frame *frame,
struct libdecor_state *state,
struct libdecor_configuration *configuration);
/**
* Minimize the window.
*
* Roughly translates to xdg_toplevel_set_minimized().
*/
void
libdecor_frame_set_minimized(struct libdecor_frame *frame);
/**
* Maximize the window.
*
* Roughly translates to xdg_toplevel_set_maximized().
*/
void
libdecor_frame_set_maximized(struct libdecor_frame *frame);
/**
* Unmaximize the window.
*
* Roughly translates to xdg_toplevel_unset_maximized().
*/
void
libdecor_frame_unset_maximized(struct libdecor_frame *frame);
/**
* Fullscreen the window.
*
* Roughly translates to xdg_toplevel_set_fullscreen().
*/
void
libdecor_frame_set_fullscreen(struct libdecor_frame *frame,
struct wl_output *output);
/**
* Unfullscreen the window.
*
* Roughly translates to xdg_toplevel_unset_unfullscreen().
*/
void
libdecor_frame_unset_fullscreen(struct libdecor_frame *frame);
/**
* Return true if the window is floating.
*
* A window is floating when it's not maximized, tiled, fullscreen, or in any
* similar way with a fixed size and state.
* Note that this function uses the "applied" configuration. If this function
* is used in the 'configure' callback, the provided configuration has to be
* applied via 'libdecor_frame_commit' first, before it will reflect the current
* window state from the provided configuration.
*/
bool
libdecor_frame_is_floating(struct libdecor_frame *frame);
/**
* Close the window.
*
* Roughly translates to xdg_toplevel_close().
*/
void
libdecor_frame_close(struct libdecor_frame *frame);
/**
* Map the window.
*
* This will eventually result in the initial configure event.
*/
void
libdecor_frame_map(struct libdecor_frame *frame);
/**
* Get the associated xdg_surface for content wl_surface.
*/
struct xdg_surface *
libdecor_frame_get_xdg_surface(struct libdecor_frame *frame);
/**
* Get the associated xdg_toplevel for the content wl_surface.
*/
struct xdg_toplevel *
libdecor_frame_get_xdg_toplevel(struct libdecor_frame *frame);
/**
* Create a new content surface state.
*/
struct libdecor_state *
libdecor_state_new(int width,
int height);
/**
* Free a content surface state.
*/
void
libdecor_state_free(struct libdecor_state *state);
/**
* Get the expected size of the content for this configuration.
*
* If the configuration doesn't contain a size, false is returned.
*/
bool
libdecor_configuration_get_content_size(struct libdecor_configuration *configuration,
struct libdecor_frame *frame,
int *width,
int *height);
/**
* Get the window state for this configuration.
*
* If the configuration doesn't contain any associated window state, false is
* returned, and the application should assume the window state remains
* unchanged.
*/
bool
libdecor_configuration_get_window_state(struct libdecor_configuration *configuration,
enum libdecor_window_state *window_state);
#ifdef __cplusplus
}
#endif
#endif /* LIBDECOR_H */

View File

@ -0,0 +1,292 @@
/*
* Copyright © 2008 Kristian Høgsberg
*
* 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.
*/
#ifndef WAYLAND_CLIENT_CORE_H
#define WAYLAND_CLIENT_CORE_H
#include <stdint.h>
#include "wayland-util.h"
#include "wayland-version.h"
#ifdef __cplusplus
extern "C" {
#endif
/** \class wl_proxy
*
* \brief Represents a protocol object on the client side.
*
* A wl_proxy acts as a client side proxy to an object existing in the
* compositor. The proxy is responsible for converting requests made by the
* clients with \ref wl_proxy_marshal() into Wayland's wire format. Events
* coming from the compositor are also handled by the proxy, which will in
* turn call the handler set with \ref wl_proxy_add_listener().
*
* \note With the exception of function \ref wl_proxy_set_queue(), functions
* accessing a wl_proxy are not normally used by client code. Clients
* should normally use the higher level interface generated by the scanner to
* interact with compositor objects.
*
*/
struct wl_proxy;
/** \class wl_display
*
* \brief Represents a connection to the compositor and acts as a proxy to
* the wl_display singleton object.
*
* A wl_display object represents a client connection to a Wayland
* compositor. It is created with either \ref wl_display_connect() or
* \ref wl_display_connect_to_fd(). A connection is terminated using
* \ref wl_display_disconnect().
*
* A wl_display is also used as the \ref wl_proxy for the wl_display
* singleton object on the compositor side.
*
* A wl_display object handles all the data sent from and to the
* compositor. When a \ref wl_proxy marshals a request, it will write its wire
* representation to the display's write buffer. The data is sent to the
* compositor when the client calls \ref wl_display_flush().
*
* Incoming data is handled in two steps: queueing and dispatching. In the
* queue step, the data coming from the display fd is interpreted and
* added to a queue. On the dispatch step, the handler for the incoming
* event set by the client on the corresponding \ref wl_proxy is called.
*
* A wl_display has at least one event queue, called the <em>default
* queue</em>. Clients can create additional event queues with \ref
* wl_display_create_queue() and assign \ref wl_proxy's to it. Events
* occurring in a particular proxy are always queued in its assigned queue.
* A client can ensure that a certain assumption, such as holding a lock
* or running from a given thread, is true when a proxy event handler is
* called by assigning that proxy to an event queue and making sure that
* this queue is only dispatched when the assumption holds.
*
* The default queue is dispatched by calling \ref wl_display_dispatch().
* This will dispatch any events queued on the default queue and attempt
* to read from the display fd if it's empty. Events read are then queued
* on the appropriate queues according to the proxy assignment.
*
* A user created queue is dispatched with \ref wl_display_dispatch_queue().
* This function behaves exactly the same as wl_display_dispatch()
* but it dispatches given queue instead of the default queue.
*
* A real world example of event queue usage is Mesa's implementation of
* eglSwapBuffers() for the Wayland platform. This function might need
* to block until a frame callback is received, but dispatching the default
* queue could cause an event handler on the client to start drawing
* again. This problem is solved using another event queue, so that only
* the events handled by the EGL code are dispatched during the block.
*
* This creates a problem where a thread dispatches a non-default
* queue, reading all the data from the display fd. If the application
* would call \em poll(2) after that it would block, even though there
* might be events queued on the default queue. Those events should be
* dispatched with \ref wl_display_dispatch_pending() or \ref
* wl_display_dispatch_queue_pending() before flushing and blocking.
*/
struct wl_display;
/** \class wl_event_queue
*
* \brief A queue for \ref wl_proxy object events.
*
* Event queues allows the events on a display to be handled in a thread-safe
* manner. See \ref wl_display for details.
*
*/
struct wl_event_queue;
/** Destroy proxy after marshalling
* @ingroup wl_proxy
*/
#define WL_MARSHAL_FLAG_DESTROY (1 << 0)
void
wl_event_queue_destroy(struct wl_event_queue *queue);
struct wl_proxy *
wl_proxy_marshal_flags(struct wl_proxy *proxy, uint32_t opcode,
const struct wl_interface *interface,
uint32_t version,
uint32_t flags, ...);
struct wl_proxy *
wl_proxy_marshal_array_flags(struct wl_proxy *proxy, uint32_t opcode,
const struct wl_interface *interface,
uint32_t version,
uint32_t flags,
union wl_argument *args);
void
wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...);
void
wl_proxy_marshal_array(struct wl_proxy *p, uint32_t opcode,
union wl_argument *args);
struct wl_proxy *
wl_proxy_create(struct wl_proxy *factory,
const struct wl_interface *interface);
void *
wl_proxy_create_wrapper(void *proxy);
void
wl_proxy_wrapper_destroy(void *proxy_wrapper);
struct wl_proxy *
wl_proxy_marshal_constructor(struct wl_proxy *proxy,
uint32_t opcode,
const struct wl_interface *interface,
...);
struct wl_proxy *
wl_proxy_marshal_constructor_versioned(struct wl_proxy *proxy,
uint32_t opcode,
const struct wl_interface *interface,
uint32_t version,
...);
struct wl_proxy *
wl_proxy_marshal_array_constructor(struct wl_proxy *proxy,
uint32_t opcode, union wl_argument *args,
const struct wl_interface *interface);
struct wl_proxy *
wl_proxy_marshal_array_constructor_versioned(struct wl_proxy *proxy,
uint32_t opcode,
union wl_argument *args,
const struct wl_interface *interface,
uint32_t version);
void
wl_proxy_destroy(struct wl_proxy *proxy);
int
wl_proxy_add_listener(struct wl_proxy *proxy,
void (**implementation)(void), void *data);
const void *
wl_proxy_get_listener(struct wl_proxy *proxy);
int
wl_proxy_add_dispatcher(struct wl_proxy *proxy,
wl_dispatcher_func_t dispatcher_func,
const void * dispatcher_data, void *data);
void
wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data);
void *
wl_proxy_get_user_data(struct wl_proxy *proxy);
uint32_t
wl_proxy_get_version(struct wl_proxy *proxy);
uint32_t
wl_proxy_get_id(struct wl_proxy *proxy);
void
wl_proxy_set_tag(struct wl_proxy *proxy,
const char * const *tag);
const char * const *
wl_proxy_get_tag(struct wl_proxy *proxy);
const char *
wl_proxy_get_class(struct wl_proxy *proxy);
void
wl_proxy_set_queue(struct wl_proxy *proxy, struct wl_event_queue *queue);
struct wl_display *
wl_display_connect(const char *name);
struct wl_display *
wl_display_connect_to_fd(int fd);
void
wl_display_disconnect(struct wl_display *display);
int
wl_display_get_fd(struct wl_display *display);
int
wl_display_dispatch(struct wl_display *display);
int
wl_display_dispatch_queue(struct wl_display *display,
struct wl_event_queue *queue);
int
wl_display_dispatch_queue_pending(struct wl_display *display,
struct wl_event_queue *queue);
int
wl_display_dispatch_pending(struct wl_display *display);
int
wl_display_get_error(struct wl_display *display);
uint32_t
wl_display_get_protocol_error(struct wl_display *display,
const struct wl_interface **interface,
uint32_t *id);
int
wl_display_flush(struct wl_display *display);
int
wl_display_roundtrip_queue(struct wl_display *display,
struct wl_event_queue *queue);
int
wl_display_roundtrip(struct wl_display *display);
struct wl_event_queue *
wl_display_create_queue(struct wl_display *display);
int
wl_display_prepare_read_queue(struct wl_display *display,
struct wl_event_queue *queue);
int
wl_display_prepare_read(struct wl_display *display);
void
wl_display_cancel_read(struct wl_display *display);
int
wl_display_read_events(struct wl_display *display);
void
wl_log_set_handler_client(wl_log_func_t handler);
#ifdef __cplusplus
}
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,42 @@
/*
* Copyright © 2008 Kristian Høgsberg
*
* 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.
*/
/** \file
*
* \brief Include the client API and protocol C API.
*
* \warning Use of this header file is discouraged. Prefer including
* wayland-client-core.h instead, which does not include the
* client protocol header and as such only defines the library
* API.
*/
#ifndef WAYLAND_CLIENT_H
#define WAYLAND_CLIENT_H
#include "wayland-client-core.h"
#include "wayland-client-protocol.h"
#endif

View File

@ -0,0 +1,96 @@
/*
* Copyright © 2012 Intel Corporation
*
* 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.
*/
#ifndef WAYLAND_CURSOR_H
#define WAYLAND_CURSOR_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
struct wl_cursor_theme;
struct wl_buffer;
struct wl_shm;
/** A still image part of a cursor
*
* Use `wl_cursor_image_get_buffer()` to get the corresponding `struct
* wl_buffer` to attach to your `struct wl_surface`. */
struct wl_cursor_image {
/** Actual width */
uint32_t width;
/** Actual height */
uint32_t height;
/** Hot spot x (must be inside image) */
uint32_t hotspot_x;
/** Hot spot y (must be inside image) */
uint32_t hotspot_y;
/** Animation delay to next frame (ms) */
uint32_t delay;
};
/** A cursor, as returned by `wl_cursor_theme_get_cursor()` */
struct wl_cursor {
/** How many images there are in this cursors animation */
unsigned int image_count;
/** The array of still images composing this animation */
struct wl_cursor_image **images;
/** The name of this cursor */
char *name;
};
struct wl_cursor_theme *
wl_cursor_theme_load(const char *name, int size, struct wl_shm *shm);
void
wl_cursor_theme_destroy(struct wl_cursor_theme *theme);
struct wl_cursor *
wl_cursor_theme_get_cursor(struct wl_cursor_theme *theme,
const char *name);
struct wl_buffer *
wl_cursor_image_get_buffer(struct wl_cursor_image *image);
int
wl_cursor_frame(struct wl_cursor *cursor, uint32_t time);
int
wl_cursor_frame_and_duration(struct wl_cursor *cursor, uint32_t time,
uint32_t *duration);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,59 @@
/*
* Copyright © 2011 Kristian Høgsberg
* Copyright © 2011 Benjamin Franzke
*
* 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.
*/
#ifndef WAYLAND_EGL_CORE_H
#define WAYLAND_EGL_CORE_H
#ifdef __cplusplus
extern "C" {
#endif
#define WL_EGL_PLATFORM 1
struct wl_egl_window;
struct wl_surface;
struct wl_egl_window *
wl_egl_window_create(struct wl_surface *surface,
int width, int height);
void
wl_egl_window_destroy(struct wl_egl_window *egl_window);
void
wl_egl_window_resize(struct wl_egl_window *egl_window,
int width, int height,
int dx, int dy);
void
wl_egl_window_get_attached_size(struct wl_egl_window *egl_window,
int *width, int *height);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,765 @@
/*
* Copyright © 2008 Kristian Høgsberg
*
* 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.
*/
/** \file wayland-util.h
*
* \brief Utility classes, functions, and macros.
*/
#ifndef WAYLAND_UTIL_H
#define WAYLAND_UTIL_H
#include <math.h>
#include <stddef.h>
#include <inttypes.h>
#include <stdarg.h>
#ifdef __cplusplus
extern "C" {
#endif
/** Visibility attribute */
#if defined(__GNUC__) && __GNUC__ >= 4
#define WL_EXPORT __attribute__ ((visibility("default")))
#else
#define WL_EXPORT
#endif
/** Deprecated attribute */
#if defined(__GNUC__) && __GNUC__ >= 4
#define WL_DEPRECATED __attribute__ ((deprecated))
#else
#define WL_DEPRECATED
#endif
/**
* Printf-style argument attribute
*
* \param x Ordinality of the format string argument
* \param y Ordinality of the argument to check against the format string
*
* \sa https://gcc.gnu.org/onlinedocs/gcc-3.2.1/gcc/Function-Attributes.html
*/
#if defined(__GNUC__) && __GNUC__ >= 4
#define WL_PRINTF(x, y) __attribute__((__format__(__printf__, x, y)))
#else
#define WL_PRINTF(x, y)
#endif
/** \class wl_object
*
* \brief A protocol object.
*
* A `wl_object` is an opaque struct identifying the protocol object
* underlying a `wl_proxy` or `wl_resource`.
*
* \note Functions accessing a `wl_object` are not normally used by client code.
* Clients should normally use the higher level interface generated by the
* scanner to interact with compositor objects.
*
*/
struct wl_object;
/**
* Protocol message signature
*
* A wl_message describes the signature of an actual protocol message, such as a
* request or event, that adheres to the Wayland protocol wire format. The
* protocol implementation uses a wl_message within its demarshal machinery for
* decoding messages between a compositor and its clients. In a sense, a
* wl_message is to a protocol message like a class is to an object.
*
* The `name` of a wl_message is the name of the corresponding protocol message.
*
* The `signature` is an ordered list of symbols representing the data types
* of message arguments and, optionally, a protocol version and indicators for
* nullability. A leading integer in the `signature` indicates the _since_
* version of the protocol message. A `?` preceding a data type symbol indicates
* that the following argument type is nullable. While it is a protocol violation
* to send messages with non-nullable arguments set to `NULL`, event handlers in
* clients might still get called with non-nullable object arguments set to
* `NULL`. This can happen when the client destroyed the object being used as
* argument on its side and an event referencing that object was sent before the
* server knew about its destruction. As this race cannot be prevented, clients
* should - as a general rule - program their event handlers such that they can
* handle object arguments declared non-nullable being `NULL` gracefully.
*
* When no arguments accompany a message, `signature` is an empty string.
*
* Symbols:
*
* * `i`: int
* * `u`: uint
* * `f`: fixed
* * `s`: string
* * `o`: object
* * `n`: new_id
* * `a`: array
* * `h`: fd
* * `?`: following argument is nullable
*
* While demarshaling primitive arguments is straightforward, when demarshaling
* messages containing `object` or `new_id` arguments, the protocol
* implementation often must determine the type of the object. The `types` of a
* wl_message is an array of wl_interface references that correspond to `o` and
* `n` arguments in `signature`, with `NULL` placeholders for arguments with
* non-object types.
*
* Consider the protocol event wl_display `delete_id` that has a single `uint`
* argument. The wl_message is:
*
* \code
* { "delete_id", "u", [NULL] }
* \endcode
*
* Here, the message `name` is `"delete_id"`, the `signature` is `"u"`, and the
* argument `types` is `[NULL]`, indicating that the `uint` argument has no
* corresponding wl_interface since it is a primitive argument.
*
* In contrast, consider a `wl_foo` interface supporting protocol request `bar`
* that has existed since version 2, and has two arguments: a `uint` and an
* object of type `wl_baz_interface` that may be `NULL`. Such a `wl_message`
* might be:
*
* \code
* { "bar", "2u?o", [NULL, &wl_baz_interface] }
* \endcode
*
* Here, the message `name` is `"bar"`, and the `signature` is `"2u?o"`. Notice
* how the `2` indicates the protocol version, the `u` indicates the first
* argument type is `uint`, and the `?o` indicates that the second argument
* is an object that may be `NULL`. Lastly, the argument `types` array indicates
* that no wl_interface corresponds to the first argument, while the type
* `wl_baz_interface` corresponds to the second argument.
*
* \sa wl_argument
* \sa wl_interface
* \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Wire-Format">Wire Format</a>
*/
struct wl_message {
/** Message name */
const char *name;
/** Message signature */
const char *signature;
/** Object argument interfaces */
const struct wl_interface **types;
};
/**
* Protocol object interface
*
* A wl_interface describes the API of a protocol object defined in the Wayland
* protocol specification. The protocol implementation uses a wl_interface
* within its marshalling machinery for encoding client requests.
*
* The `name` of a wl_interface is the name of the corresponding protocol
* interface, and `version` represents the version of the interface. The members
* `method_count` and `event_count` represent the number of `methods` (requests)
* and `events` in the respective wl_message members.
*
* For example, consider a protocol interface `foo`, marked as version `1`, with
* two requests and one event.
*
* \code{.xml}
* <interface name="foo" version="1">
* <request name="a"></request>
* <request name="b"></request>
* <event name="c"></event>
* </interface>
* \endcode
*
* Given two wl_message arrays `foo_requests` and `foo_events`, a wl_interface
* for `foo` might be:
*
* \code
* struct wl_interface foo_interface = {
* "foo", 1,
* 2, foo_requests,
* 1, foo_events
* };
* \endcode
*
* \note The server side of the protocol may define interface <em>implementation
* types</em> that incorporate the term `interface` in their name. Take
* care to not confuse these server-side `struct`s with a wl_interface
* variable whose name also ends in `interface`. For example, while the
* server may define a type `struct wl_foo_interface`, the client may
* define a `struct wl_interface wl_foo_interface`.
*
* \sa wl_message
* \sa wl_proxy
* \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Interfaces">Interfaces</a>
* \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Versioning">Versioning</a>
*/
struct wl_interface {
/** Interface name */
const char *name;
/** Interface version */
int version;
/** Number of methods (requests) */
int method_count;
/** Method (request) signatures */
const struct wl_message *methods;
/** Number of events */
int event_count;
/** Event signatures */
const struct wl_message *events;
};
/** \class wl_list
*
* \brief Doubly-linked list
*
* On its own, an instance of `struct wl_list` represents the sentinel head of
* a doubly-linked list, and must be initialized using wl_list_init().
* When empty, the list head's `next` and `prev` members point to the list head
* itself, otherwise `next` references the first element in the list, and `prev`
* refers to the last element in the list.
*
* Use the `struct wl_list` type to represent both the list head and the links
* between elements within the list. Use wl_list_empty() to determine if the
* list is empty in O(1).
*
* All elements in the list must be of the same type. The element type must have
* a `struct wl_list` member, often named `link` by convention. Prior to
* insertion, there is no need to initialize an element's `link` - invoking
* wl_list_init() on an individual list element's `struct wl_list` member is
* unnecessary if the very next operation is wl_list_insert(). However, a
* common idiom is to initialize an element's `link` prior to removal - ensure
* safety by invoking wl_list_init() before wl_list_remove().
*
* Consider a list reference `struct wl_list foo_list`, an element type as
* `struct element`, and an element's link member as `struct wl_list link`.
*
* The following code initializes a list and adds three elements to it.
*
* \code
* struct wl_list foo_list;
*
* struct element {
* int foo;
* struct wl_list link;
* };
* struct element e1, e2, e3;
*
* wl_list_init(&foo_list);
* wl_list_insert(&foo_list, &e1.link); // e1 is the first element
* wl_list_insert(&foo_list, &e2.link); // e2 is now the first element
* wl_list_insert(&e2.link, &e3.link); // insert e3 after e2
* \endcode
*
* The list now looks like <em>[e2, e3, e1]</em>.
*
* The `wl_list` API provides some iterator macros. For example, to iterate
* a list in ascending order:
*
* \code
* struct element *e;
* wl_list_for_each(e, foo_list, link) {
* do_something_with_element(e);
* }
* \endcode
*
* See the documentation of each iterator for details.
* \sa http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/list.h
*/
struct wl_list {
/** Previous list element */
struct wl_list *prev;
/** Next list element */
struct wl_list *next;
};
/**
* Initializes the list.
*
* \param list List to initialize
*
* \memberof wl_list
*/
void
wl_list_init(struct wl_list *list);
/**
* Inserts an element into the list, after the element represented by \p list.
* When \p list is a reference to the list itself (the head), set the containing
* struct of \p elm as the first element in the list.
*
* \note If \p elm is already part of a list, inserting it again will lead to
* list corruption.
*
* \param list List element after which the new element is inserted
* \param elm Link of the containing struct to insert into the list
*
* \memberof wl_list
*/
void
wl_list_insert(struct wl_list *list, struct wl_list *elm);
/**
* Removes an element from the list.
*
* \note This operation leaves \p elm in an invalid state.
*
* \param elm Link of the containing struct to remove from the list
*
* \memberof wl_list
*/
void
wl_list_remove(struct wl_list *elm);
/**
* Determines the length of the list.
*
* \note This is an O(n) operation.
*
* \param list List whose length is to be determined
*
* \return Number of elements in the list
*
* \memberof wl_list
*/
int
wl_list_length(const struct wl_list *list);
/**
* Determines if the list is empty.
*
* \param list List whose emptiness is to be determined
*
* \return 1 if empty, or 0 if not empty
*
* \memberof wl_list
*/
int
wl_list_empty(const struct wl_list *list);
/**
* Inserts all of the elements of one list into another, after the element
* represented by \p list.
*
* \note This leaves \p other in an invalid state.
*
* \param list List element after which the other list elements will be inserted
* \param other List of elements to insert
*
* \memberof wl_list
*/
void
wl_list_insert_list(struct wl_list *list, struct wl_list *other);
/**
* Retrieves a pointer to a containing struct, given a member name.
*
* This macro allows "conversion" from a pointer to a member to its containing
* struct. This is useful if you have a contained item like a wl_list,
* wl_listener, or wl_signal, provided via a callback or other means, and would
* like to retrieve the struct that contains it.
*
* To demonstrate, the following example retrieves a pointer to
* `example_container` given only its `destroy_listener` member:
*
* \code
* struct example_container {
* struct wl_listener destroy_listener;
* // other members...
* };
*
* void example_container_destroy(struct wl_listener *listener, void *data)
* {
* struct example_container *ctr;
*
* ctr = wl_container_of(listener, ctr, destroy_listener);
* // destroy ctr...
* }
* \endcode
*
* \note `sample` need not be a valid pointer. A null or uninitialised pointer
* is sufficient.
*
* \param ptr Valid pointer to the contained member
* \param sample Pointer to a struct whose type contains \p ptr
* \param member Named location of \p ptr within the \p sample type
*
* \return The container for the specified pointer
*/
#define wl_container_of(ptr, sample, member) \
(__typeof__(sample))((char *)(ptr) - \
offsetof(__typeof__(*sample), member))
/**
* Iterates over a list.
*
* This macro expresses a for-each iterator for wl_list. Given a list and
* wl_list link member name (often named `link` by convention), this macro
* assigns each element in the list to \p pos, which can then be referenced in
* a trailing code block. For example, given a wl_list of `struct message`
* elements:
*
* \code
* struct message {
* char *contents;
* wl_list link;
* };
*
* struct wl_list *message_list;
* // Assume message_list now "contains" many messages
*
* struct message *m;
* wl_list_for_each(m, message_list, link) {
* do_something_with_message(m);
* }
* \endcode
*
* \param pos Cursor that each list element will be assigned to
* \param head Head of the list to iterate over
* \param member Name of the link member within the element struct
*
* \relates wl_list
*/
#define wl_list_for_each(pos, head, member) \
for (pos = wl_container_of((head)->next, pos, member); \
&pos->member != (head); \
pos = wl_container_of(pos->member.next, pos, member))
/**
* Iterates over a list, safe against removal of the list element.
*
* \note Only removal of the current element, \p pos, is safe. Removing
* any other element during traversal may lead to a loop malfunction.
*
* \sa wl_list_for_each()
*
* \param pos Cursor that each list element will be assigned to
* \param tmp Temporary pointer of the same type as \p pos
* \param head Head of the list to iterate over
* \param member Name of the link member within the element struct
*
* \relates wl_list
*/
#define wl_list_for_each_safe(pos, tmp, head, member) \
for (pos = wl_container_of((head)->next, pos, member), \
tmp = wl_container_of((pos)->member.next, tmp, member); \
&pos->member != (head); \
pos = tmp, \
tmp = wl_container_of(pos->member.next, tmp, member))
/**
* Iterates backwards over a list.
*
* \sa wl_list_for_each()
*
* \param pos Cursor that each list element will be assigned to
* \param head Head of the list to iterate over
* \param member Name of the link member within the element struct
*
* \relates wl_list
*/
#define wl_list_for_each_reverse(pos, head, member) \
for (pos = wl_container_of((head)->prev, pos, member); \
&pos->member != (head); \
pos = wl_container_of(pos->member.prev, pos, member))
/**
* Iterates backwards over a list, safe against removal of the list element.
*
* \note Only removal of the current element, \p pos, is safe. Removing
* any other element during traversal may lead to a loop malfunction.
*
* \sa wl_list_for_each()
*
* \param pos Cursor that each list element will be assigned to
* \param tmp Temporary pointer of the same type as \p pos
* \param head Head of the list to iterate over
* \param member Name of the link member within the element struct
*
* \relates wl_list
*/
#define wl_list_for_each_reverse_safe(pos, tmp, head, member) \
for (pos = wl_container_of((head)->prev, pos, member), \
tmp = wl_container_of((pos)->member.prev, tmp, member); \
&pos->member != (head); \
pos = tmp, \
tmp = wl_container_of(pos->member.prev, tmp, member))
/**
* \class wl_array
*
* Dynamic array
*
* A wl_array is a dynamic array that can only grow until released. It is
* intended for relatively small allocations whose size is variable or not known
* in advance. While construction of a wl_array does not require all elements to
* be of the same size, wl_array_for_each() does require all elements to have
* the same type and size.
*
*/
struct wl_array {
/** Array size */
size_t size;
/** Allocated space */
size_t alloc;
/** Array data */
void *data;
};
/**
* Initializes the array.
*
* \param array Array to initialize
*
* \memberof wl_array
*/
void
wl_array_init(struct wl_array *array);
/**
* Releases the array data.
*
* \note Leaves the array in an invalid state.
*
* \param array Array whose data is to be released
*
* \memberof wl_array
*/
void
wl_array_release(struct wl_array *array);
/**
* Increases the size of the array by \p size bytes.
*
* \param array Array whose size is to be increased
* \param size Number of bytes to increase the size of the array by
*
* \return A pointer to the beginning of the newly appended space, or NULL when
* resizing fails.
*
* \memberof wl_array
*/
void *
wl_array_add(struct wl_array *array, size_t size);
/**
* Copies the contents of \p source to \p array.
*
* \param array Destination array to copy to
* \param source Source array to copy from
*
* \return 0 on success, or -1 on failure
*
* \memberof wl_array
*/
int
wl_array_copy(struct wl_array *array, struct wl_array *source);
/**
* Iterates over an array.
*
* This macro expresses a for-each iterator for wl_array. It assigns each
* element in the array to \p pos, which can then be referenced in a trailing
* code block. \p pos must be a pointer to the array element type, and all
* array elements must be of the same type and size.
*
* \param pos Cursor that each array element will be assigned to
* \param array Array to iterate over
*
* \relates wl_array
* \sa wl_list_for_each()
*/
#define wl_array_for_each(pos, array) \
for (pos = (array)->data; \
(const char *) pos < ((const char *) (array)->data + (array)->size); \
(pos)++)
/**
* Fixed-point number
*
* A `wl_fixed_t` is a 24.8 signed fixed-point number with a sign bit, 23 bits
* of integer precision and 8 bits of decimal precision. Consider `wl_fixed_t`
* as an opaque struct with methods that facilitate conversion to and from
* `double` and `int` types.
*/
typedef int32_t wl_fixed_t;
/**
* Converts a fixed-point number to a floating-point number.
*
* \param f Fixed-point number to convert
*
* \return Floating-point representation of the fixed-point argument
*/
static inline double
wl_fixed_to_double(wl_fixed_t f)
{
union {
double d;
int64_t i;
} u;
u.i = ((1023LL + 44LL) << 52) + (1LL << 51) + f;
return u.d - (3LL << 43);
}
/**
* Converts a floating-point number to a fixed-point number.
*
* \param d Floating-point number to convert
*
* \return Fixed-point representation of the floating-point argument
*/
static inline wl_fixed_t
wl_fixed_from_double(double d)
{
union {
double d;
int64_t i;
} u;
u.d = d + (3LL << (51 - 8));
return (wl_fixed_t)u.i;
}
/**
* Converts a fixed-point number to an integer.
*
* \param f Fixed-point number to convert
*
* \return Integer component of the fixed-point argument
*/
static inline int
wl_fixed_to_int(wl_fixed_t f)
{
return f / 256;
}
/**
* Converts an integer to a fixed-point number.
*
* \param i Integer to convert
*
* \return Fixed-point representation of the integer argument
*/
static inline wl_fixed_t
wl_fixed_from_int(int i)
{
return i * 256;
}
/**
* Protocol message argument data types
*
* This union represents all of the argument types in the Wayland protocol wire
* format. The protocol implementation uses wl_argument within its marshalling
* machinery for dispatching messages between a client and a compositor.
*
* \sa wl_message
* \sa wl_interface
* \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-wire-Format">Wire Format</a>
*/
union wl_argument {
int32_t i; /**< `int` */
uint32_t u; /**< `uint` */
wl_fixed_t f; /**< `fixed` */
const char *s; /**< `string` */
struct wl_object *o; /**< `object` */
uint32_t n; /**< `new_id` */
struct wl_array *a; /**< `array` */
int32_t h; /**< `fd` */
};
/**
* Dispatcher function type alias
*
* A dispatcher is a function that handles the emitting of callbacks in client
* code. For programs directly using the C library, this is done by using
* libffi to call function pointers. When binding to languages other than C,
* dispatchers provide a way to abstract the function calling process to be
* friendlier to other function calling systems.
*
* A dispatcher takes five arguments: The first is the dispatcher-specific
* implementation associated with the target object. The second is the object
* upon which the callback is being invoked (either wl_proxy or wl_resource).
* The third and fourth arguments are the opcode and the wl_message
* corresponding to the callback. The final argument is an array of arguments
* received from the other process via the wire protocol.
*
* \param "const void *" Dispatcher-specific implementation data
* \param "void *" Callback invocation target (wl_proxy or `wl_resource`)
* \param uint32_t Callback opcode
* \param "const struct wl_message *" Callback message signature
* \param "union wl_argument *" Array of received arguments
*
* \return 0 on success, or -1 on failure
*/
typedef int (*wl_dispatcher_func_t)(const void *, void *, uint32_t,
const struct wl_message *,
union wl_argument *);
/**
* Log function type alias
*
* The C implementation of the Wayland protocol abstracts the details of
* logging. Users may customize the logging behavior, with a function conforming
* to the `wl_log_func_t` type, via `wl_log_set_handler_client` and
* `wl_log_set_handler_server`.
*
* A `wl_log_func_t` must conform to the expectations of `vprintf`, and
* expects two arguments: a string to write and a corresponding variable
* argument list. While the string to write may contain format specifiers and
* use values in the variable argument list, the behavior of any `wl_log_func_t`
* depends on the implementation.
*
* \note Take care to not confuse this with `wl_protocol_logger_func_t`, which
* is a specific server-side logger for requests and events.
*
* \param "const char *" String to write to the log, containing optional format
* specifiers
* \param "va_list" Variable argument list
*
* \sa wl_log_set_handler_client
* \sa wl_log_set_handler_server
*/
typedef void (*wl_log_func_t)(const char *, va_list) WL_PRINTF(1, 0);
/**
* Return value of an iterator function
*
* \sa wl_client_for_each_resource_iterator_func_t
* \sa wl_client_for_each_resource
*/
enum wl_iterator_result {
/** Stop the iteration */
WL_ITERATOR_STOP,
/** Continue the iteration */
WL_ITERATOR_CONTINUE
};
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,34 @@
/*
* Copyright © 2012 Intel Corporation
*
* 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.
*/
#ifndef WAYLAND_VERSION_H
#define WAYLAND_VERSION_H
#define WAYLAND_VERSION_MAJOR 1
#define WAYLAND_VERSION_MINOR 21
#define WAYLAND_VERSION_MICRO 0
#define WAYLAND_VERSION "1.21.0"
#endif

33
thirdparty/wayland-protocols/COPYING vendored Normal file
View File

@ -0,0 +1,33 @@
Copyright © 2008-2013 Kristian Høgsberg
Copyright © 2010-2013 Intel Corporation
Copyright © 2013 Rafael Antognolli
Copyright © 2013 Jasper St. Pierre
Copyright © 2014 Jonas Ådahl
Copyright © 2014 Jason Ekstrand
Copyright © 2014-2015 Collabora, Ltd.
Copyright © 2015 Red Hat Inc.
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.
---
The above is the version of the MIT "Expat" License used by X.org:
http://cgit.freedesktop.org/xorg/xserver/tree/COPYING

View File

@ -0,0 +1,7 @@
Viewporter: cropping and scaling extension for surface contents
Previously known as wl_scaler.
Maintainers:
Pekka Paalanen <pekka.paalanen@collabora.co.uk>

View File

@ -0,0 +1,180 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="viewporter">
<copyright>
Copyright © 2013-2016 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.
</copyright>
<interface name="wp_viewporter" version="1">
<description summary="surface cropping and scaling">
The global interface exposing surface cropping and scaling
capabilities is used to instantiate an interface extension for a
wl_surface object. This extended interface will then allow
cropping and scaling the surface contents, effectively
disconnecting the direct relationship between the buffer and the
surface size.
</description>
<request name="destroy" type="destructor">
<description summary="unbind from the cropping and scaling interface">
Informs the server that the client will not be using this
protocol object anymore. This does not affect any other objects,
wp_viewport objects included.
</description>
</request>
<enum name="error">
<entry name="viewport_exists" value="0"
summary="the surface already has a viewport object associated"/>
</enum>
<request name="get_viewport">
<description summary="extend surface interface for crop and scale">
Instantiate an interface extension for the given wl_surface to
crop and scale its content. If the given wl_surface already has
a wp_viewport object associated, the viewport_exists
protocol error is raised.
</description>
<arg name="id" type="new_id" interface="wp_viewport"
summary="the new viewport interface id"/>
<arg name="surface" type="object" interface="wl_surface"
summary="the surface"/>
</request>
</interface>
<interface name="wp_viewport" version="1">
<description summary="crop and scale interface to a wl_surface">
An additional interface to a wl_surface object, which allows the
client to specify the cropping and scaling of the surface
contents.
This interface works with two concepts: the source rectangle (src_x,
src_y, src_width, src_height), and the destination size (dst_width,
dst_height). The contents of the source rectangle are scaled to the
destination size, and content outside the source rectangle is ignored.
This state is double-buffered, and is applied on the next
wl_surface.commit.
The two parts of crop and scale state are independent: the source
rectangle, and the destination size. Initially both are unset, that
is, no scaling is applied. The whole of the current wl_buffer is
used as the source, and the surface size is as defined in
wl_surface.attach.
If the destination size is set, it causes the surface size to become
dst_width, dst_height. The source (rectangle) is scaled to exactly
this size. This overrides whatever the attached wl_buffer size is,
unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface
has no content and therefore no size. Otherwise, the size is always
at least 1x1 in surface local coordinates.
If the source rectangle is set, it defines what area of the wl_buffer is
taken as the source. If the source rectangle is set and the destination
size is not set, then src_width and src_height must be integers, and the
surface size becomes the source rectangle size. This results in cropping
without scaling. If src_width or src_height are not integers and
destination size is not set, the bad_size protocol error is raised when
the surface state is applied.
The coordinate transformations from buffer pixel coordinates up to
the surface-local coordinates happen in the following order:
1. buffer_transform (wl_surface.set_buffer_transform)
2. buffer_scale (wl_surface.set_buffer_scale)
3. crop and scale (wp_viewport.set*)
This means, that the source rectangle coordinates of crop and scale
are given in the coordinates after the buffer transform and scale,
i.e. in the coordinates that would be the surface-local coordinates
if the crop and scale was not applied.
If src_x or src_y are negative, the bad_value protocol error is raised.
Otherwise, if the source rectangle is partially or completely outside of
the non-NULL wl_buffer, then the out_of_buffer protocol error is raised
when the surface state is applied. A NULL wl_buffer does not raise the
out_of_buffer error.
If the wl_surface associated with the wp_viewport is destroyed,
all wp_viewport requests except 'destroy' raise the protocol error
no_surface.
If the wp_viewport object is destroyed, the crop and scale
state is removed from the wl_surface. The change will be applied
on the next wl_surface.commit.
</description>
<request name="destroy" type="destructor">
<description summary="remove scaling and cropping from the surface">
The associated wl_surface's crop and scale state is removed.
The change is applied on the next wl_surface.commit.
</description>
</request>
<enum name="error">
<entry name="bad_value" value="0"
summary="negative or zero values in width or height"/>
<entry name="bad_size" value="1"
summary="destination size is not integer"/>
<entry name="out_of_buffer" value="2"
summary="source rectangle extends outside of the content area"/>
<entry name="no_surface" value="3"
summary="the wl_surface was destroyed"/>
</enum>
<request name="set_source">
<description summary="set the source rectangle for cropping">
Set the source rectangle of the associated wl_surface. See
wp_viewport for the description, and relation to the wl_buffer
size.
If all of x, y, width and height are -1.0, the source rectangle is
unset instead. Any other set of values where width or height are zero
or negative, or x or y are negative, raise the bad_value protocol
error.
The crop and scale state is double-buffered state, and will be
applied on the next wl_surface.commit.
</description>
<arg name="x" type="fixed" summary="source rectangle x"/>
<arg name="y" type="fixed" summary="source rectangle y"/>
<arg name="width" type="fixed" summary="source rectangle width"/>
<arg name="height" type="fixed" summary="source rectangle height"/>
</request>
<request name="set_destination">
<description summary="set the surface size for scaling">
Set the destination size of the associated wl_surface. See
wp_viewport for the description, and relation to the wl_buffer
size.
If width is -1 and height is -1, the destination size is unset
instead. Any other pair of values for width and height that
contains zero or negative values raises the bad_value protocol
error.
The crop and scale state is double-buffered state, and will be
applied on the next wl_surface.commit.
</description>
<arg name="width" type="int" summary="surface width"/>
<arg name="height" type="int" summary="surface height"/>
</request>
</interface>
</protocol>

View File

@ -0,0 +1,5 @@
xdg shell protocol
Maintainers:
Jonas Ådahl <jadahl@gmail.com>
Mike Blumenkrantz <michael.blumenkrantz@gmail.com>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,4 @@
wp fractional scale protocol
Maintainers:
Kenny Levinsen <kl@kl.wtf>

View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="fractional_scale_v1">
<copyright>
Copyright © 2022 Kenny Levinsen
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="Protocol for requesting fractional surface scales">
This protocol allows a compositor to suggest for surfaces to render at
fractional scales.
A client can submit scaled content by utilizing wp_viewport. This is done by
creating a wp_viewport object for the surface and setting the destination
rectangle to the surface size before the scale factor is applied.
The buffer size is calculated by multiplying the surface size by the
intended scale.
The wl_surface buffer scale should remain set to 1.
If a surface has a surface-local size of 100 px by 50 px and wishes to
submit buffers with a scale of 1.5, then a buffer of 150px by 75 px should
be used and the wp_viewport destination rectangle should be 100 px by 50 px.
For toplevel surfaces, the size is rounded halfway away from zero. The
rounding algorithm for subsurface position and size is not defined.
</description>
<interface name="wp_fractional_scale_manager_v1" version="1">
<description summary="fractional surface scale information">
A global interface for requesting surfaces to use fractional scales.
</description>
<request name="destroy" type="destructor">
<description summary="unbind the fractional surface scale interface">
Informs the server that the client will not be using this protocol
object anymore. This does not affect any other objects,
wp_fractional_scale_v1 objects included.
</description>
</request>
<enum name="error">
<entry name="fractional_scale_exists" value="0"
summary="the surface already has a fractional_scale object associated"/>
</enum>
<request name="get_fractional_scale">
<description summary="extend surface interface for scale information">
Create an add-on object for the the wl_surface to let the compositor
request fractional scales. If the given wl_surface already has a
wp_fractional_scale_v1 object associated, the fractional_scale_exists
protocol error is raised.
</description>
<arg name="id" type="new_id" interface="wp_fractional_scale_v1"
summary="the new surface scale info interface id"/>
<arg name="surface" type="object" interface="wl_surface"
summary="the surface"/>
</request>
</interface>
<interface name="wp_fractional_scale_v1" version="1">
<description summary="fractional scale interface to a wl_surface">
An additional interface to a wl_surface object which allows the compositor
to inform the client of the preferred scale.
</description>
<request name="destroy" type="destructor">
<description summary="remove surface scale information for surface">
Destroy the fractional scale object. When this object is destroyed,
preferred_scale events will no longer be sent.
</description>
</request>
<event name="preferred_scale">
<description summary="notify of new preferred scale">
Notification of a new preferred scale for this surface that the
compositor suggests that the client should use.
The sent scale is the numerator of a fraction with a denominator of 120.
</description>
<arg name="scale" type="uint" summary="the new preferred scale"/>
</event>
</interface>
</protocol>

View File

@ -0,0 +1,4 @@
XDG Activation protocol
Maintainers:
Aleix Pol Gonzalez <aleixpol@kde.org>

View File

@ -0,0 +1,200 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="xdg_activation_v1">
<copyright>
Copyright © 2020 Aleix Pol Gonzalez &lt;aleixpol@kde.org&gt;
Copyright © 2020 Carlos Garnacho &lt;carlosg@gnome.org&gt;
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="Protocol for requesting activation of surfaces">
The way for a client to pass focus to another toplevel is as follows.
The client that intends to activate another toplevel uses the
xdg_activation_v1.get_activation_token request to get an activation token.
This token is then forwarded to the client, which is supposed to activate
one of its surfaces, through a separate band of communication.
One established way of doing this is through the XDG_ACTIVATION_TOKEN
environment variable of a newly launched child process. The child process
should unset the environment variable again right after reading it out in
order to avoid propagating it to other child processes.
Another established way exists for Applications implementing the D-Bus
interface org.freedesktop.Application, which should get their token under
activation-token on their platform_data.
In general activation tokens may be transferred across clients through
means not described in this protocol.
The client to be activated will then pass the token
it received to the xdg_activation_v1.activate request. The compositor can
then use this token to decide how to react to the activation request.
The token the activating client gets may be ineffective either already at
the time it receives it, for example if it was not focused, for focus
stealing prevention. The activating client will have no way to discover
the validity of the token, and may still forward it to the to be activated
client.
The created activation token may optionally get information attached to it
that can be used by the compositor to identify the application that we
intend to activate. This can for example be used to display a visual hint
about what application is being started.
Warning! The protocol described in this file is currently in the testing
phase. Backward compatible changes may be added together with the
corresponding interface version bump. Backward incompatible changes can
only be done by creating a new major version of the extension.
</description>
<interface name="xdg_activation_v1" version="1">
<description summary="interface for activating surfaces">
A global interface used for informing the compositor about applications
being activated or started, or for applications to request to be
activated.
</description>
<request name="destroy" type="destructor">
<description summary="destroy the xdg_activation object">
Notify the compositor that the xdg_activation object will no longer be
used.
The child objects created via this interface are unaffected and should
be destroyed separately.
</description>
</request>
<request name="get_activation_token">
<description summary="requests a token">
Creates an xdg_activation_token_v1 object that will provide
the initiating client with a unique token for this activation. This
token should be offered to the clients to be activated.
</description>
<arg name="id" type="new_id" interface="xdg_activation_token_v1"/>
</request>
<request name="activate">
<description summary="notify new interaction being available">
Requests surface activation. It's up to the compositor to display
this information as desired, for example by placing the surface above
the rest.
The compositor may know who requested this by checking the activation
token and might decide not to follow through with the activation if it's
considered unwanted.
Compositors can ignore unknown activation tokens when an invalid
token is passed.
</description>
<arg name="token" type="string" summary="the activation token of the initiating client"/>
<arg name="surface" type="object" interface="wl_surface"
summary="the wl_surface to activate"/>
</request>
</interface>
<interface name="xdg_activation_token_v1" version="1">
<description summary="an exported activation handle">
An object for setting up a token and receiving a token handle that can
be passed as an activation token to another client.
The object is created using the xdg_activation_v1.get_activation_token
request. This object should then be populated with the app_id, surface
and serial information and committed. The compositor shall then issue a
done event with the token. In case the request's parameters are invalid,
the compositor will provide an invalid token.
</description>
<enum name="error">
<entry name="already_used" value="0"
summary="The token has already been used previously"/>
</enum>
<request name="set_serial">
<description summary="specifies the seat and serial of the activating event">
Provides information about the seat and serial event that requested the
token.
The serial can come from an input or focus event. For instance, if a
click triggers the launch of a third-party client, the launcher client
should send a set_serial request with the serial and seat from the
wl_pointer.button event.
Some compositors might refuse to activate toplevels when the token
doesn't have a valid and recent enough event serial.
Must be sent before commit. This information is optional.
</description>
<arg name="serial" type="uint"
summary="the serial of the event that triggered the activation"/>
<arg name="seat" type="object" interface="wl_seat"
summary="the wl_seat of the event"/>
</request>
<request name="set_app_id">
<description summary="specifies the application being activated">
The requesting client can specify an app_id to associate the token
being created with it.
Must be sent before commit. This information is optional.
</description>
<arg name="app_id" type="string"
summary="the application id of the client being activated."/>
</request>
<request name="set_surface">
<description summary="specifies the surface requesting activation">
This request sets the surface requesting the activation. Note, this is
different from the surface that will be activated.
Some compositors might refuse to activate toplevels when the token
doesn't have a requesting surface.
Must be sent before commit. This information is optional.
</description>
<arg name="surface" type="object" interface="wl_surface"
summary="the requesting surface"/>
</request>
<request name="commit">
<description summary="issues the token request">
Requests an activation token based on the different parameters that
have been offered through set_serial, set_surface and set_app_id.
</description>
</request>
<event name="done">
<description summary="the exported activation token">
The 'done' event contains the unique token of this activation request
and notifies that the provider is done.
</description>
<arg name="token" type="string" summary="the exported activation token"/>
</event>
<request name="destroy" type="destructor">
<description summary="destroy the xdg_activation_token_v1 object">
Notify the compositor that the xdg_activation_token_v1 object will no
longer be used. The received token stays valid.
</description>
</request>
</interface>
</protocol>

View File

@ -0,0 +1,4 @@
Screensaver inhibition protocol
Maintainers:
Bryce Harrington <bryce@osg.samsung.com>

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="idle_inhibit_unstable_v1">
<copyright>
Copyright © 2015 Samsung Electronics Co., 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.
</copyright>
<interface name="zwp_idle_inhibit_manager_v1" version="1">
<description summary="control behavior when display idles">
This interface permits inhibiting the idle behavior such as screen
blanking, locking, and screensaving. The client binds the idle manager
globally, then creates idle-inhibitor objects for each surface.
Warning! The protocol described in this file is experimental and
backward incompatible changes may be made. Backward compatible changes
may be added together with the corresponding interface version bump.
Backward incompatible changes are done by bumping the version number in
the protocol and interface names and resetting the interface version.
Once the protocol is to be declared stable, the 'z' prefix and the
version number in the protocol and interface names are removed and the
interface version number is reset.
</description>
<request name="destroy" type="destructor">
<description summary="destroy the idle inhibitor object">
Destroy the inhibit manager.
</description>
</request>
<request name="create_inhibitor">
<description summary="create a new inhibitor object">
Create a new inhibitor object associated with the given surface.
</description>
<arg name="id" type="new_id" interface="zwp_idle_inhibitor_v1"/>
<arg name="surface" type="object" interface="wl_surface"
summary="the surface that inhibits the idle behavior"/>
</request>
</interface>
<interface name="zwp_idle_inhibitor_v1" version="1">
<description summary="context object for inhibiting idle behavior">
An idle inhibitor prevents the output that the associated surface is
visible on from being set to a state where it is not visually usable due
to lack of user interaction (e.g. blanked, dimmed, locked, set to power
save, etc.) Any screensaver processes are also blocked from displaying.
If the surface is destroyed, unmapped, becomes occluded, loses
visibility, or otherwise becomes not visually relevant for the user, the
idle inhibitor will not be honored by the compositor; if the surface
subsequently regains visibility the inhibitor takes effect once again.
Likewise, the inhibitor isn't honored if the system was already idled at
the time the inhibitor was established, although if the system later
de-idles and re-idles the inhibitor will take effect.
</description>
<request name="destroy" type="destructor">
<description summary="destroy the idle inhibitor object">
Remove the inhibitor effect from the associated wl_surface.
</description>
</request>
</interface>
</protocol>

View File

@ -0,0 +1,4 @@
Pointer constraints protocol
Maintainers:
Jonas Ådahl <jadahl@gmail.com>

View File

@ -0,0 +1,339 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="pointer_constraints_unstable_v1">
<copyright>
Copyright © 2014 Jonas Ådahl
Copyright © 2015 Red Hat Inc.
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="protocol for constraining pointer motions">
This protocol specifies a set of interfaces used for adding constraints to
the motion of a pointer. Possible constraints include confining pointer
motions to a given region, or locking it to its current position.
In order to constrain the pointer, a client must first bind the global
interface "wp_pointer_constraints" which, if a compositor supports pointer
constraints, is exposed by the registry. Using the bound global object, the
client uses the request that corresponds to the type of constraint it wants
to make. See wp_pointer_constraints for more details.
Warning! The protocol described in this file is experimental and backward
incompatible changes may be made. Backward compatible changes may be added
together with the corresponding interface version bump. Backward
incompatible changes are done by bumping the version number in the protocol
and interface names and resetting the interface version. Once the protocol
is to be declared stable, the 'z' prefix and the version number in the
protocol and interface names are removed and the interface version number is
reset.
</description>
<interface name="zwp_pointer_constraints_v1" version="1">
<description summary="constrain the movement of a pointer">
The global interface exposing pointer constraining functionality. It
exposes two requests: lock_pointer for locking the pointer to its
position, and confine_pointer for locking the pointer to a region.
The lock_pointer and confine_pointer requests create the objects
wp_locked_pointer and wp_confined_pointer respectively, and the client can
use these objects to interact with the lock.
For any surface, only one lock or confinement may be active across all
wl_pointer objects of the same seat. If a lock or confinement is requested
when another lock or confinement is active or requested on the same surface
and with any of the wl_pointer objects of the same seat, an
'already_constrained' error will be raised.
</description>
<enum name="error">
<description summary="wp_pointer_constraints error values">
These errors can be emitted in response to wp_pointer_constraints
requests.
</description>
<entry name="already_constrained" value="1"
summary="pointer constraint already requested on that surface"/>
</enum>
<enum name="lifetime">
<description summary="constraint lifetime">
These values represent different lifetime semantics. They are passed
as arguments to the factory requests to specify how the constraint
lifetimes should be managed.
</description>
<entry name="oneshot" value="1">
<description summary="the pointer constraint is defunct once deactivated">
A oneshot pointer constraint will never reactivate once it has been
deactivated. See the corresponding deactivation event
(wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) for
details.
</description>
</entry>
<entry name="persistent" value="2">
<description summary="the pointer constraint may reactivate">
A persistent pointer constraint may again reactivate once it has
been deactivated. See the corresponding deactivation event
(wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) for
details.
</description>
</entry>
</enum>
<request name="destroy" type="destructor">
<description summary="destroy the pointer constraints manager object">
Used by the client to notify the server that it will no longer use this
pointer constraints object.
</description>
</request>
<request name="lock_pointer">
<description summary="lock pointer to a position">
The lock_pointer request lets the client request to disable movements of
the virtual pointer (i.e. the cursor), effectively locking the pointer
to a position. This request may not take effect immediately; in the
future, when the compositor deems implementation-specific constraints
are satisfied, the pointer lock will be activated and the compositor
sends a locked event.
The protocol provides no guarantee that the constraints are ever
satisfied, and does not require the compositor to send an error if the
constraints cannot ever be satisfied. It is thus possible to request a
lock that will never activate.
There may not be another pointer constraint of any kind requested or
active on the surface for any of the wl_pointer objects of the seat of
the passed pointer when requesting a lock. If there is, an error will be
raised. See general pointer lock documentation for more details.
The intersection of the region passed with this request and the input
region of the surface is used to determine where the pointer must be
in order for the lock to activate. It is up to the compositor whether to
warp the pointer or require some kind of user interaction for the lock
to activate. If the region is null the surface input region is used.
A surface may receive pointer focus without the lock being activated.
The request creates a new object wp_locked_pointer which is used to
interact with the lock as well as receive updates about its state. See
the the description of wp_locked_pointer for further information.
Note that while a pointer is locked, the wl_pointer objects of the
corresponding seat will not emit any wl_pointer.motion events, but
relative motion events will still be emitted via wp_relative_pointer
objects of the same seat. wl_pointer.axis and wl_pointer.button events
are unaffected.
</description>
<arg name="id" type="new_id" interface="zwp_locked_pointer_v1"/>
<arg name="surface" type="object" interface="wl_surface"
summary="surface to lock pointer to"/>
<arg name="pointer" type="object" interface="wl_pointer"
summary="the pointer that should be locked"/>
<arg name="region" type="object" interface="wl_region" allow-null="true"
summary="region of surface"/>
<arg name="lifetime" type="uint" enum="lifetime" summary="lock lifetime"/>
</request>
<request name="confine_pointer">
<description summary="confine pointer to a region">
The confine_pointer request lets the client request to confine the
pointer cursor to a given region. This request may not take effect
immediately; in the future, when the compositor deems implementation-
specific constraints are satisfied, the pointer confinement will be
activated and the compositor sends a confined event.
The intersection of the region passed with this request and the input
region of the surface is used to determine where the pointer must be
in order for the confinement to activate. It is up to the compositor
whether to warp the pointer or require some kind of user interaction for
the confinement to activate. If the region is null the surface input
region is used.
The request will create a new object wp_confined_pointer which is used
to interact with the confinement as well as receive updates about its
state. See the the description of wp_confined_pointer for further
information.
</description>
<arg name="id" type="new_id" interface="zwp_confined_pointer_v1"/>
<arg name="surface" type="object" interface="wl_surface"
summary="surface to lock pointer to"/>
<arg name="pointer" type="object" interface="wl_pointer"
summary="the pointer that should be confined"/>
<arg name="region" type="object" interface="wl_region" allow-null="true"
summary="region of surface"/>
<arg name="lifetime" type="uint" enum="lifetime" summary="confinement lifetime"/>
</request>
</interface>
<interface name="zwp_locked_pointer_v1" version="1">
<description summary="receive relative pointer motion events">
The wp_locked_pointer interface represents a locked pointer state.
While the lock of this object is active, the wl_pointer objects of the
associated seat will not emit any wl_pointer.motion events.
This object will send the event 'locked' when the lock is activated.
Whenever the lock is activated, it is guaranteed that the locked surface
will already have received pointer focus and that the pointer will be
within the region passed to the request creating this object.
To unlock the pointer, send the destroy request. This will also destroy
the wp_locked_pointer object.
If the compositor decides to unlock the pointer the unlocked event is
sent. See wp_locked_pointer.unlock for details.
When unlocking, the compositor may warp the cursor position to the set
cursor position hint. If it does, it will not result in any relative
motion events emitted via wp_relative_pointer.
If the surface the lock was requested on is destroyed and the lock is not
yet activated, the wp_locked_pointer object is now defunct and must be
destroyed.
</description>
<request name="destroy" type="destructor">
<description summary="destroy the locked pointer object">
Destroy the locked pointer object. If applicable, the compositor will
unlock the pointer.
</description>
</request>
<request name="set_cursor_position_hint">
<description summary="set the pointer cursor position hint">
Set the cursor position hint relative to the top left corner of the
surface.
If the client is drawing its own cursor, it should update the position
hint to the position of its own cursor. A compositor may use this
information to warp the pointer upon unlock in order to avoid pointer
jumps.
The cursor position hint is double buffered. The new hint will only take
effect when the associated surface gets it pending state applied. See
wl_surface.commit for details.
</description>
<arg name="surface_x" type="fixed"
summary="surface-local x coordinate"/>
<arg name="surface_y" type="fixed"
summary="surface-local y coordinate"/>
</request>
<request name="set_region">
<description summary="set a new lock region">
Set a new region used to lock the pointer.
The new lock region is double-buffered. The new lock region will
only take effect when the associated surface gets its pending state
applied. See wl_surface.commit for details.
For details about the lock region, see wp_locked_pointer.
</description>
<arg name="region" type="object" interface="wl_region" allow-null="true"
summary="region of surface"/>
</request>
<event name="locked">
<description summary="lock activation event">
Notification that the pointer lock of the seat's pointer is activated.
</description>
</event>
<event name="unlocked">
<description summary="lock deactivation event">
Notification that the pointer lock of the seat's pointer is no longer
active. If this is a oneshot pointer lock (see
wp_pointer_constraints.lifetime) this object is now defunct and should
be destroyed. If this is a persistent pointer lock (see
wp_pointer_constraints.lifetime) this pointer lock may again
reactivate in the future.
</description>
</event>
</interface>
<interface name="zwp_confined_pointer_v1" version="1">
<description summary="confined pointer object">
The wp_confined_pointer interface represents a confined pointer state.
This object will send the event 'confined' when the confinement is
activated. Whenever the confinement is activated, it is guaranteed that
the surface the pointer is confined to will already have received pointer
focus and that the pointer will be within the region passed to the request
creating this object. It is up to the compositor to decide whether this
requires some user interaction and if the pointer will warp to within the
passed region if outside.
To unconfine the pointer, send the destroy request. This will also destroy
the wp_confined_pointer object.
If the compositor decides to unconfine the pointer the unconfined event is
sent. The wp_confined_pointer object is at this point defunct and should
be destroyed.
</description>
<request name="destroy" type="destructor">
<description summary="destroy the confined pointer object">
Destroy the confined pointer object. If applicable, the compositor will
unconfine the pointer.
</description>
</request>
<request name="set_region">
<description summary="set a new confine region">
Set a new region used to confine the pointer.
The new confine region is double-buffered. The new confine region will
only take effect when the associated surface gets its pending state
applied. See wl_surface.commit for details.
If the confinement is active when the new confinement region is applied
and the pointer ends up outside of newly applied region, the pointer may
warped to a position within the new confinement region. If warped, a
wl_pointer.motion event will be emitted, but no
wp_relative_pointer.relative_motion event.
The compositor may also, instead of using the new region, unconfine the
pointer.
For details about the confine region, see wp_confined_pointer.
</description>
<arg name="region" type="object" interface="wl_region" allow-null="true"
summary="region of surface"/>
</request>
<event name="confined">
<description summary="pointer confined">
Notification that the pointer confinement of the seat's pointer is
activated.
</description>
</event>
<event name="unconfined">
<description summary="pointer unconfined">
Notification that the pointer confinement of the seat's pointer is no
longer active. If this is a oneshot pointer confinement (see
wp_pointer_constraints.lifetime) this object is now defunct and should
be destroyed. If this is a persistent pointer confinement (see
wp_pointer_constraints.lifetime) this pointer confinement may again
reactivate in the future.
</description>
</event>
</interface>
</protocol>

View File

@ -0,0 +1,4 @@
Pointer gestures protocol
Maintainers:
Carlos Garnacho <carlosg@gnome.org>

View File

@ -0,0 +1,253 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="pointer_gestures_unstable_v1">
<interface name="zwp_pointer_gestures_v1" version="3">
<description summary="touchpad gestures">
A global interface to provide semantic touchpad gestures for a given
pointer.
Three gestures are currently supported: swipe, pinch, and hold.
Pinch and swipe gestures follow a three-stage cycle: begin, update,
end, hold gestures follow a two-stage cycle: begin and end. All
gestures are identified by a unique id.
Warning! The protocol described in this file is experimental and
backward incompatible changes may be made. Backward compatible changes
may be added together with the corresponding interface version bump.
Backward incompatible changes are done by bumping the version number in
the protocol and interface names and resetting the interface version.
Once the protocol is to be declared stable, the 'z' prefix and the
version number in the protocol and interface names are removed and the
interface version number is reset.
</description>
<request name="get_swipe_gesture">
<description summary="get swipe gesture">
Create a swipe gesture object. See the
wl_pointer_gesture_swipe interface for details.
</description>
<arg name="id" type="new_id" interface="zwp_pointer_gesture_swipe_v1"/>
<arg name="pointer" type="object" interface="wl_pointer"/>
</request>
<request name="get_pinch_gesture">
<description summary="get pinch gesture">
Create a pinch gesture object. See the
wl_pointer_gesture_pinch interface for details.
</description>
<arg name="id" type="new_id" interface="zwp_pointer_gesture_pinch_v1"/>
<arg name="pointer" type="object" interface="wl_pointer"/>
</request>
<!-- Version 2 additions -->
<request name="release" type="destructor" since="2">
<description summary="destroy the pointer gesture object">
Destroy the pointer gesture object. Swipe, pinch and hold objects
created via this gesture object remain valid.
</description>
</request>
<!-- Version 3 additions -->
<request name="get_hold_gesture" since="3">
<description summary="get hold gesture">
Create a hold gesture object. See the
wl_pointer_gesture_hold interface for details.
</description>
<arg name="id" type="new_id" interface="zwp_pointer_gesture_hold_v1"/>
<arg name="pointer" type="object" interface="wl_pointer"/>
</request>
</interface>
<interface name="zwp_pointer_gesture_swipe_v1" version="2">
<description summary="a swipe gesture object">
A swipe gesture object notifies a client about a multi-finger swipe
gesture detected on an indirect input device such as a touchpad.
The gesture is usually initiated by multiple fingers moving in the
same direction but once initiated the direction may change.
The precise conditions of when such a gesture is detected are
implementation-dependent.
A gesture consists of three stages: begin, update (optional) and end.
There cannot be multiple simultaneous hold, pinch or swipe gestures on a
same pointer/seat, how compositors prevent these situations is
implementation-dependent.
A gesture may be cancelled by the compositor or the hardware.
Clients should not consider performing permanent or irreversible
actions until the end of a gesture has been received.
</description>
<request name="destroy" type="destructor">
<description summary="destroy the pointer swipe gesture object"/>
</request>
<event name="begin">
<description summary="multi-finger swipe begin">
This event is sent when a multi-finger swipe gesture is detected
on the device.
</description>
<arg name="serial" type="uint"/>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
<arg name="surface" type="object" interface="wl_surface"/>
<arg name="fingers" type="uint" summary="number of fingers"/>
</event>
<event name="update">
<description summary="multi-finger swipe motion">
This event is sent when a multi-finger swipe gesture changes the
position of the logical center.
The dx and dy coordinates are relative coordinates of the logical
center of the gesture compared to the previous event.
</description>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
<arg name="dx" type="fixed" summary="delta x coordinate in surface coordinate space"/>
<arg name="dy" type="fixed" summary="delta y coordinate in surface coordinate space"/>
</event>
<event name="end">
<description summary="multi-finger swipe end">
This event is sent when a multi-finger swipe gesture ceases to
be valid. This may happen when one or more fingers are lifted or
the gesture is cancelled.
When a gesture is cancelled, the client should undo state changes
caused by this gesture. What causes a gesture to be cancelled is
implementation-dependent.
</description>
<arg name="serial" type="uint"/>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
<arg name="cancelled" type="int" summary="1 if the gesture was cancelled, 0 otherwise"/>
</event>
</interface>
<interface name="zwp_pointer_gesture_pinch_v1" version="2">
<description summary="a pinch gesture object">
A pinch gesture object notifies a client about a multi-finger pinch
gesture detected on an indirect input device such as a touchpad.
The gesture is usually initiated by multiple fingers moving towards
each other or away from each other, or by two or more fingers rotating
around a logical center of gravity. The precise conditions of when
such a gesture is detected are implementation-dependent.
A gesture consists of three stages: begin, update (optional) and end.
There cannot be multiple simultaneous hold, pinch or swipe gestures on a
same pointer/seat, how compositors prevent these situations is
implementation-dependent.
A gesture may be cancelled by the compositor or the hardware.
Clients should not consider performing permanent or irreversible
actions until the end of a gesture has been received.
</description>
<request name="destroy" type="destructor">
<description summary="destroy the pinch gesture object"/>
</request>
<event name="begin">
<description summary="multi-finger pinch begin">
This event is sent when a multi-finger pinch gesture is detected
on the device.
</description>
<arg name="serial" type="uint"/>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
<arg name="surface" type="object" interface="wl_surface"/>
<arg name="fingers" type="uint" summary="number of fingers"/>
</event>
<event name="update">
<description summary="multi-finger pinch motion">
This event is sent when a multi-finger pinch gesture changes the
position of the logical center, the rotation or the relative scale.
The dx and dy coordinates are relative coordinates in the
surface coordinate space of the logical center of the gesture.
The scale factor is an absolute scale compared to the
pointer_gesture_pinch.begin event, e.g. a scale of 2 means the fingers
are now twice as far apart as on pointer_gesture_pinch.begin.
The rotation is the relative angle in degrees clockwise compared to the previous
pointer_gesture_pinch.begin or pointer_gesture_pinch.update event.
</description>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
<arg name="dx" type="fixed" summary="delta x coordinate in surface coordinate space"/>
<arg name="dy" type="fixed" summary="delta y coordinate in surface coordinate space"/>
<arg name="scale" type="fixed" summary="scale relative to the initial finger position"/>
<arg name="rotation" type="fixed" summary="angle in degrees cw relative to the previous event"/>
</event>
<event name="end">
<description summary="multi-finger pinch end">
This event is sent when a multi-finger pinch gesture ceases to
be valid. This may happen when one or more fingers are lifted or
the gesture is cancelled.
When a gesture is cancelled, the client should undo state changes
caused by this gesture. What causes a gesture to be cancelled is
implementation-dependent.
</description>
<arg name="serial" type="uint"/>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
<arg name="cancelled" type="int" summary="1 if the gesture was cancelled, 0 otherwise"/>
</event>
</interface>
<interface name="zwp_pointer_gesture_hold_v1" version="3">
<description summary="a hold gesture object">
A hold gesture object notifies a client about a single- or
multi-finger hold gesture detected on an indirect input device such as
a touchpad. The gesture is usually initiated by one or more fingers
being held down without significant movement. The precise conditions
of when such a gesture is detected are implementation-dependent.
In particular, this gesture may be used to cancel kinetic scrolling.
A hold gesture consists of two stages: begin and end. Unlike pinch and
swipe there is no update stage.
There cannot be multiple simultaneous hold, pinch or swipe gestures on a
same pointer/seat, how compositors prevent these situations is
implementation-dependent.
A gesture may be cancelled by the compositor or the hardware.
Clients should not consider performing permanent or irreversible
actions until the end of a gesture has been received.
</description>
<request name="destroy" type="destructor" since="3">
<description summary="destroy the hold gesture object"/>
</request>
<event name="begin" since="3">
<description summary="multi-finger hold begin">
This event is sent when a hold gesture is detected on the device.
</description>
<arg name="serial" type="uint"/>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
<arg name="surface" type="object" interface="wl_surface"/>
<arg name="fingers" type="uint" summary="number of fingers"/>
</event>
<event name="end" since="3">
<description summary="multi-finger hold end">
This event is sent when a hold gesture ceases to
be valid. This may happen when the holding fingers are lifted or
the gesture is cancelled, for example if the fingers move past an
implementation-defined threshold, the finger count changes or the hold
gesture changes into a different type of gesture.
When a gesture is cancelled, the client may need to undo state changes
caused by this gesture. What causes a gesture to be cancelled is
implementation-dependent.
</description>
<arg name="serial" type="uint"/>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
<arg name="cancelled" type="int" summary="1 if the gesture was cancelled, 0 otherwise"/>
</event>
</interface>
</protocol>

View File

@ -0,0 +1,4 @@
Primary selection protocol
Maintainers:
Simon Ser <contact@emersion.fr>

View File

@ -0,0 +1,225 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="wp_primary_selection_unstable_v1">
<copyright>
Copyright © 2015, 2016 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 a singleton global object that
provides access to the 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="create a new primary selection device">
Create a new data device for a given 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">
Replaces the current selection. The previous owner of the primary
selection will receive a wp_primary_selection_source.cancelled event.
To unset the selection, set the source to NULL.
</description>
<arg name="source" type="object" interface="zwp_primary_selection_source_v1" allow-null="true"/>
<arg name="serial" type="uint" summary="serial of the event that triggered this request"/>
</request>
<event name="data_offer">
<description summary="introduce a new wp_primary_selection_offer">
Introduces a new wp_primary_selection_offer object that may be used
to receive the current primary selection. Immediately following this
event, the new wp_primary_selection_offer object will send
wp_primary_selection_offer.offer events to describe the offered mime
types.
</description>
<arg name="offer" type="new_id" interface="zwp_primary_selection_offer_v1"/>
</event>
<event name="selection">
<description summary="advertise a new primary selection">
The wp_primary_selection_device.selection event is sent to notify the
client of a new primary selection. This event is sent after the
wp_primary_selection.data_offer event introducing this object, and after
the offer has announced its mimetypes through
wp_primary_selection_offer.offer.
The data_offer is valid until a new offer or NULL is received
or until the client loses keyboard focus. The client must destroy the
previous selection data_offer, if any, upon receiving this event.
</description>
<arg name="id" type="object" interface="zwp_primary_selection_offer_v1" allow-null="true"/>
</event>
<request name="destroy" type="destructor">
<description summary="destroy the primary selection device">
Destroy the primary selection device.
</description>
</request>
</interface>
<interface name="zwp_primary_selection_offer_v1" version="1">
<description summary="offer to transfer primary selection contents">
A wp_primary_selection_offer represents an offer to transfer the contents
of the primary selection clipboard to the client. Similar to
wl_data_offer, the offer also describes the mime types that the data can
be converted to and provides the mechanisms for transferring the data
directly to the client.
</description>
<request name="receive">
<description summary="request that the data is transferred">
To transfer the contents of the primary selection clipboard, the client
issues this request and indicates the mime type that 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
closes its end, at which point the transfer is complete.
</description>
<arg name="mime_type" type="string"/>
<arg name="fd" type="fd"/>
</request>
<request name="destroy" type="destructor">
<description summary="destroy the primary selection offer">
Destroy the primary selection offer.
</description>
</request>
<event name="offer">
<description summary="advertise offered mime type">
Sent immediately after creating announcing the
wp_primary_selection_offer through
wp_primary_selection_device.data_offer. One event is sent per offered
mime type.
</description>
<arg name="mime_type" type="string"/>
</event>
</interface>
<interface name="zwp_primary_selection_source_v1" version="1">
<description summary="offer to replace the contents of the primary selection">
The source side of a wp_primary_selection_offer, it provides a way to
describe the offered data and respond to requests to transfer the
requested contents of the primary selection clipboard.
</description>
<request name="offer">
<description summary="add an offered mime type">
This request adds a mime type to the set of mime types advertised to
targets. Can be called several times to offer multiple types.
</description>
<arg name="mime_type" type="string"/>
</request>
<request name="destroy" type="destructor">
<description summary="destroy the primary selection source">
Destroy the primary selection source.
</description>
</request>
<event name="send">
<description summary="send the primary selection contents">
Request for the current primary selection contents from the client.
Send the specified mime type over the passed file descriptor, then
close it.
</description>
<arg name="mime_type" type="string"/>
<arg name="fd" type="fd"/>
</event>
<event name="cancelled">
<description summary="request for primary selection contents was canceled">
This primary selection source is no longer valid. The client should
clean up and destroy this primary selection source.
</description>
</event>
</interface>
</protocol>

View File

@ -0,0 +1,4 @@
Relative pointer protocol
Maintainers:
Jonas Ådahl <jadahl@gmail.com>

View File

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="relative_pointer_unstable_v1">
<copyright>
Copyright © 2014 Jonas Ådahl
Copyright © 2015 Red Hat Inc.
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="protocol for relative pointer motion events">
This protocol specifies a set of interfaces used for making clients able to
receive relative pointer events not obstructed by barriers (such as the
monitor edge or other pointer barriers).
To start receiving relative pointer events, a client must first bind the
global interface "wp_relative_pointer_manager" which, if a compositor
supports relative pointer motion events, is exposed by the registry. After
having created the relative pointer manager proxy object, the client uses
it to create the actual relative pointer object using the
"get_relative_pointer" request given a wl_pointer. The relative pointer
motion events will then, when applicable, be transmitted via the proxy of
the newly created relative pointer object. See the documentation of the
relative pointer interface for more details.
Warning! The protocol described in this file is experimental and backward
incompatible changes may be made. Backward compatible changes may be added
together with the corresponding interface version bump. Backward
incompatible changes are done by bumping the version number in the protocol
and interface names and resetting the interface version. Once the protocol
is to be declared stable, the 'z' prefix and the version number in the
protocol and interface names are removed and the interface version number is
reset.
</description>
<interface name="zwp_relative_pointer_manager_v1" version="1">
<description summary="get relative pointer objects">
A global interface used for getting the relative pointer object for a
given pointer.
</description>
<request name="destroy" type="destructor">
<description summary="destroy the relative pointer manager object">
Used by the client to notify the server that it will no longer use this
relative pointer manager object.
</description>
</request>
<request name="get_relative_pointer">
<description summary="get a relative pointer object">
Create a relative pointer interface given a wl_pointer object. See the
wp_relative_pointer interface for more details.
</description>
<arg name="id" type="new_id" interface="zwp_relative_pointer_v1"/>
<arg name="pointer" type="object" interface="wl_pointer"/>
</request>
</interface>
<interface name="zwp_relative_pointer_v1" version="1">
<description summary="relative pointer object">
A wp_relative_pointer object is an extension to the wl_pointer interface
used for emitting relative pointer events. It shares the same focus as
wl_pointer objects of the same seat and will only emit events when it has
focus.
</description>
<request name="destroy" type="destructor">
<description summary="release the relative pointer object"/>
</request>
<event name="relative_motion">
<description summary="relative pointer motion">
Relative x/y pointer motion from the pointer of the seat associated with
this object.
A relative motion is in the same dimension as regular wl_pointer motion
events, except they do not represent an absolute position. For example,
moving a pointer from (x, y) to (x', y') would have the equivalent
relative motion (x' - x, y' - y). If a pointer motion caused the
absolute pointer position to be clipped by for example the edge of the
monitor, the relative motion is unaffected by the clipping and will
represent the unclipped motion.
This event also contains non-accelerated motion deltas. The
non-accelerated delta is, when applicable, the regular pointer motion
delta as it was before having applied motion acceleration and other
transformations such as normalization.
Note that the non-accelerated delta does not represent 'raw' events as
they were read from some device. Pointer motion acceleration is device-
and configuration-specific and non-accelerated deltas and accelerated
deltas may have the same value on some devices.
Relative motions are not coupled to wl_pointer.motion events, and can be
sent in combination with such events, but also independently. There may
also be scenarios where wl_pointer.motion is sent, but there is no
relative motion. The order of an absolute and relative motion event
originating from the same physical motion is not guaranteed.
If the client needs button events or focus state, it can receive them
from a wl_pointer object of the same seat that the wp_relative_pointer
object is associated with.
</description>
<arg name="utime_hi" type="uint"
summary="high 32 bits of a 64 bit timestamp with microsecond granularity"/>
<arg name="utime_lo" type="uint"
summary="low 32 bits of a 64 bit timestamp with microsecond granularity"/>
<arg name="dx" type="fixed"
summary="the x component of the motion vector"/>
<arg name="dy" type="fixed"
summary="the y component of the motion vector"/>
<arg name="dx_unaccel" type="fixed"
summary="the x component of the unaccelerated motion vector"/>
<arg name="dy_unaccel" type="fixed"
summary="the y component of the unaccelerated motion vector"/>
</event>
</interface>
</protocol>

View File

@ -0,0 +1,4 @@
Tablet protocol
Maintainers:
Peter Hutterer <peter.hutterer@who-t.net>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,4 @@
xdg_decoration protocol
Maintainers:
Simon Ser <contact@emersion.fr>

View File

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="xdg_decoration_unstable_v1">
<copyright>
Copyright © 2018 Simon Ser
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>
<interface name="zxdg_decoration_manager_v1" version="1">
<description summary="window decoration manager">
This interface allows a compositor to announce support for server-side
decorations.
A window decoration is a set of window controls as deemed appropriate by
the party managing them, such as user interface components used to move,
resize and change a window's state.
A client can use this protocol to request being decorated by a supporting
compositor.
If compositor and client do not negotiate the use of a server-side
decoration using this protocol, clients continue to self-decorate as they
see fit.
Warning! The protocol described in this file is experimental and
backward incompatible changes may be made. Backward compatible changes
may be added together with the corresponding interface version bump.
Backward incompatible changes are done by bumping the version number in
the protocol and interface names and resetting the interface version.
Once the protocol is to be declared stable, the 'z' prefix and the
version number in the protocol and interface names are removed and the
interface version number is reset.
</description>
<request name="destroy" type="destructor">
<description summary="destroy the decoration manager object">
Destroy the decoration manager. This doesn't destroy objects created
with the manager.
</description>
</request>
<request name="get_toplevel_decoration">
<description summary="create a new toplevel decoration object">
Create a new decoration object associated with the given toplevel.
Creating an xdg_toplevel_decoration from an xdg_toplevel which has a
buffer attached or committed is a client error, and any attempts by a
client to attach or manipulate a buffer prior to the first
xdg_toplevel_decoration.configure event must also be treated as
errors.
</description>
<arg name="id" type="new_id" interface="zxdg_toplevel_decoration_v1"/>
<arg name="toplevel" type="object" interface="xdg_toplevel"/>
</request>
</interface>
<interface name="zxdg_toplevel_decoration_v1" version="1">
<description summary="decoration object for a toplevel surface">
The decoration object allows the compositor to toggle server-side window
decorations for a toplevel surface. The client can request to switch to
another mode.
The xdg_toplevel_decoration object must be destroyed before its
xdg_toplevel.
</description>
<enum name="error">
<entry name="unconfigured_buffer" value="0"
summary="xdg_toplevel has a buffer attached before configure"/>
<entry name="already_constructed" value="1"
summary="xdg_toplevel already has a decoration object"/>
<entry name="orphaned" value="2"
summary="xdg_toplevel destroyed before the decoration object"/>
</enum>
<request name="destroy" type="destructor">
<description summary="destroy the decoration object">
Switch back to a mode without any server-side decorations at the next
commit.
</description>
</request>
<enum name="mode">
<description summary="window decoration modes">
These values describe window decoration modes.
</description>
<entry name="client_side" value="1"
summary="no server-side window decoration"/>
<entry name="server_side" value="2"
summary="server-side window decoration"/>
</enum>
<request name="set_mode">
<description summary="set the decoration mode">
Set the toplevel surface decoration mode. This informs the compositor
that the client prefers the provided decoration mode.
After requesting a decoration mode, the compositor will respond by
emitting an xdg_surface.configure event. The client should then update
its content, drawing it without decorations if the received mode is
server-side decorations. The client must also acknowledge the configure
when committing the new content (see xdg_surface.ack_configure).
The compositor can decide not to use the client's mode and enforce a
different mode instead.
Clients whose decoration mode depend on the xdg_toplevel state may send
a set_mode request in response to an xdg_surface.configure event and wait
for the next xdg_surface.configure event to prevent unwanted state.
Such clients are responsible for preventing configure loops and must
make sure not to send multiple successive set_mode requests with the
same decoration mode.
</description>
<arg name="mode" type="uint" enum="mode" summary="the decoration mode"/>
</request>
<request name="unset_mode">
<description summary="unset the decoration mode">
Unset the toplevel surface decoration mode. This informs the compositor
that the client doesn't prefer a particular decoration mode.
This request has the same semantics as set_mode.
</description>
</request>
<event name="configure">
<description summary="suggest a surface change">
The configure event asks the client to change its decoration mode. The
configured state should not be applied immediately. Clients must send an
ack_configure in response to this event. See xdg_surface.configure and
xdg_surface.ack_configure for details.
A configure event can be sent at any time. The specified mode must be
obeyed by the client.
</description>
<arg name="mode" type="uint" enum="mode" summary="the decoration mode"/>
</event>
</interface>
</protocol>

29
thirdparty/wayland/COPYING vendored Normal file
View File

@ -0,0 +1,29 @@
Copyright © 2008-2012 Kristian Høgsberg
Copyright © 2010-2012 Intel Corporation
Copyright © 2011 Benjamin Franzke
Copyright © 2012 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.
---
The above is the version of the MIT "Expat" License used by X.org:
http://cgit.freedesktop.org/xorg/xserver/tree/COPYING

3058
thirdparty/wayland/protocol/wayland.xml vendored Normal file

File diff suppressed because it is too large Load Diff