mirror of
https://github.com/Almamu/linux-wallpaperengine.git
synced 2025-07-13 21:02:34 +08:00
initial impl
This commit is contained in:
parent
13e43bada7
commit
e5b447bdc9
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,2 +1,4 @@
|
|||||||
cmake-build-debug*
|
cmake-build-debug*
|
||||||
.idea
|
.idea
|
||||||
|
build/
|
||||||
|
.vscode/
|
@ -41,6 +41,7 @@ include_directories(
|
|||||||
${FREEIMAGE_INCLUDE_DIR}
|
${FREEIMAGE_INCLUDE_DIR}
|
||||||
${PULSEAUDIO_INCLUDE_DIR}
|
${PULSEAUDIO_INCLUDE_DIR}
|
||||||
src
|
src
|
||||||
|
${CMAKE_SOURCE_DIR}
|
||||||
include)
|
include)
|
||||||
|
|
||||||
add_executable(
|
add_executable(
|
||||||
@ -129,15 +130,21 @@ add_executable(
|
|||||||
src/WallpaperEngine/Render/Drivers/Detectors/CFullScreenDetector.h
|
src/WallpaperEngine/Render/Drivers/Detectors/CFullScreenDetector.h
|
||||||
src/WallpaperEngine/Render/Drivers/Detectors/CX11FullScreenDetector.cpp
|
src/WallpaperEngine/Render/Drivers/Detectors/CX11FullScreenDetector.cpp
|
||||||
src/WallpaperEngine/Render/Drivers/Detectors/CX11FullScreenDetector.h
|
src/WallpaperEngine/Render/Drivers/Detectors/CX11FullScreenDetector.h
|
||||||
|
src/WallpaperEngine/Render/Drivers/Detectors/CWaylandFullScreenDetector.cpp
|
||||||
|
src/WallpaperEngine/Render/Drivers/Detectors/CWaylandFullScreenDetector.h
|
||||||
|
|
||||||
src/WallpaperEngine/Render/Drivers/Output/COutput.cpp
|
src/WallpaperEngine/Render/Drivers/Output/COutput.cpp
|
||||||
src/WallpaperEngine/Render/Drivers/Output/COutput.h
|
src/WallpaperEngine/Render/Drivers/Output/COutput.h
|
||||||
src/WallpaperEngine/Render/Drivers/Output/CX11Output.cpp
|
src/WallpaperEngine/Render/Drivers/Output/CX11Output.cpp
|
||||||
src/WallpaperEngine/Render/Drivers/Output/CX11Output.h
|
src/WallpaperEngine/Render/Drivers/Output/CX11Output.h
|
||||||
|
src/WallpaperEngine/Render/Drivers/Output/CWaylandOutput.cpp
|
||||||
|
src/WallpaperEngine/Render/Drivers/Output/CWaylandOutput.h
|
||||||
src/WallpaperEngine/Render/Drivers/Output/CGLFWWindowOutput.cpp
|
src/WallpaperEngine/Render/Drivers/Output/CGLFWWindowOutput.cpp
|
||||||
src/WallpaperEngine/Render/Drivers/Output/CGLFWWindowOutput.h
|
src/WallpaperEngine/Render/Drivers/Output/CGLFWWindowOutput.h
|
||||||
src/WallpaperEngine/Render/Drivers/CX11OpenGLDriver.h
|
src/WallpaperEngine/Render/Drivers/CX11OpenGLDriver.h
|
||||||
src/WallpaperEngine/Render/Drivers/CX11OpenGLDriver.cpp
|
src/WallpaperEngine/Render/Drivers/CX11OpenGLDriver.cpp
|
||||||
|
src/WallpaperEngine/Render/Drivers/CWaylandOpenGLDriver.h
|
||||||
|
src/WallpaperEngine/Render/Drivers/CWaylandOpenGLDriver.cpp
|
||||||
src/WallpaperEngine/Render/Drivers/CVideoDriver.h
|
src/WallpaperEngine/Render/Drivers/CVideoDriver.h
|
||||||
src/WallpaperEngine/Render/Drivers/CVideoDriver.cpp
|
src/WallpaperEngine/Render/Drivers/CVideoDriver.cpp
|
||||||
src/WallpaperEngine/Render/CRenderContext.h
|
src/WallpaperEngine/Render/CRenderContext.h
|
||||||
@ -284,7 +291,15 @@ target_link_libraries(linux-wallpaperengine
|
|||||||
${FREEIMAGE_LIBRARIES}
|
${FREEIMAGE_LIBRARIES}
|
||||||
${MPV_LIBRARY}
|
${MPV_LIBRARY}
|
||||||
${PULSEAUDIO_LIBRARY}
|
${PULSEAUDIO_LIBRARY}
|
||||||
glfw)
|
${CMAKE_SOURCE_DIR}/wlr-layer-shell-unstable-v1.o
|
||||||
|
${CMAKE_SOURCE_DIR}/xdg-shell-protocol.o
|
||||||
|
glfw
|
||||||
|
GLESv2
|
||||||
|
pthread
|
||||||
|
wayland-cursor
|
||||||
|
/usr/lib/libEGL.so.1
|
||||||
|
wayland-client
|
||||||
|
wayland-egl)
|
||||||
|
|
||||||
file(CREATE_LINK linux-wallpaperengine wallengine SYMBOLIC)
|
file(CREATE_LINK linux-wallpaperengine wallengine SYMBOLIC)
|
||||||
|
|
||||||
|
285
protocols/wlr-layer-shell-unstable-v1.xml
Normal file
285
protocols/wlr-layer-shell-unstable-v1.xml
Normal file
@ -0,0 +1,285 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<protocol name="wlr_layer_shell_v1_unstable_v1">
|
||||||
|
<copyright>
|
||||||
|
Copyright © 2017 Drew DeVault
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
|
software and its documentation for any purpose is hereby granted
|
||||||
|
without fee, provided that the above copyright notice appear in
|
||||||
|
all copies and that both that copyright notice and this permission
|
||||||
|
notice appear in supporting documentation, and that the name of
|
||||||
|
the copyright holders not be used in advertising or publicity
|
||||||
|
pertaining to distribution of the software without specific,
|
||||||
|
written prior permission. The copyright holders make no
|
||||||
|
representations about the suitability of this software for any
|
||||||
|
purpose. It is provided "as is" without express or implied
|
||||||
|
warranty.
|
||||||
|
|
||||||
|
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
||||||
|
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
||||||
|
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||||
|
THIS SOFTWARE.
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<interface name="zwlr_layer_shell_v1" version="1">
|
||||||
|
<description summary="create surfaces that are layers of the desktop">
|
||||||
|
Clients can use this interface to assign the surface_layer role to
|
||||||
|
wl_surfaces. Such surfaces are assigned to a "layer" of the output and
|
||||||
|
rendered with a defined z-depth respective to each other. They may also be
|
||||||
|
anchored to the edges and corners of a screen and specify input handling
|
||||||
|
semantics. This interface should be suitable for the implementation of
|
||||||
|
many desktop shell components, and a broad number of other applications
|
||||||
|
that interact with the desktop.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="get_layer_surface">
|
||||||
|
<description summary="create a layer_surface from a surface">
|
||||||
|
Create a layer surface for an existing surface. This assigns the role of
|
||||||
|
layer_surface, or raises a protocol error if another role is already
|
||||||
|
assigned.
|
||||||
|
|
||||||
|
Creating a layer surface from a wl_surface 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 layer_surface.configure call
|
||||||
|
must also be treated as errors.
|
||||||
|
|
||||||
|
You may pass NULL for output to allow the compositor to decide which
|
||||||
|
output to use. Generally this will be the one that the user most
|
||||||
|
recently interacted with.
|
||||||
|
|
||||||
|
Clients can specify a namespace that defines the purpose of the layer
|
||||||
|
surface.
|
||||||
|
</description>
|
||||||
|
<arg name="id" type="new_id" interface="zwlr_layer_surface_v1"/>
|
||||||
|
<arg name="surface" type="object" interface="wl_surface"/>
|
||||||
|
<arg name="output" type="object" interface="wl_output" allow-null="true"/>
|
||||||
|
<arg name="layer" type="uint" enum="layer" summary="layer to add this surface to"/>
|
||||||
|
<arg name="namespace" type="string" summary="namespace for the layer surface"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<enum name="error">
|
||||||
|
<entry name="role" value="0" summary="wl_surface has another role"/>
|
||||||
|
<entry name="invalid_layer" value="1" summary="layer value is invalid"/>
|
||||||
|
<entry name="already_constructed" value="2" summary="wl_surface has a buffer attached or committed"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<enum name="layer">
|
||||||
|
<description summary="available layers for surfaces">
|
||||||
|
These values indicate which layers a surface can be rendered in. They
|
||||||
|
are ordered by z depth, bottom-most first. Traditional shell surfaces
|
||||||
|
will typically be rendered between the bottom and top layers.
|
||||||
|
Fullscreen shell surfaces are typically rendered at the top layer.
|
||||||
|
Multiple surfaces can share a single layer, and ordering within a
|
||||||
|
single layer is undefined.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<entry name="background" value="0"/>
|
||||||
|
<entry name="bottom" value="1"/>
|
||||||
|
<entry name="top" value="2"/>
|
||||||
|
<entry name="overlay" value="3"/>
|
||||||
|
</enum>
|
||||||
|
</interface>
|
||||||
|
|
||||||
|
<interface name="zwlr_layer_surface_v1" version="1">
|
||||||
|
<description summary="layer metadata interface">
|
||||||
|
An interface that may be implemented by a wl_surface, for surfaces that
|
||||||
|
are designed to be rendered as a layer of a stacked desktop-like
|
||||||
|
environment.
|
||||||
|
|
||||||
|
Layer surface state (size, anchor, exclusive zone, margin, interactivity)
|
||||||
|
is double-buffered, and will be applied at the time wl_surface.commit of
|
||||||
|
the corresponding wl_surface is called.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<request name="set_size">
|
||||||
|
<description summary="sets the size of the surface">
|
||||||
|
Sets the size of the surface in surface-local coordinates. The
|
||||||
|
compositor will display the surface centered with respect to its
|
||||||
|
anchors.
|
||||||
|
|
||||||
|
If you pass 0 for either value, the compositor will assign it and
|
||||||
|
inform you of the assignment in the configure event. You must set your
|
||||||
|
anchor to opposite edges in the dimensions you omit; not doing so is a
|
||||||
|
protocol error. Both values are 0 by default.
|
||||||
|
|
||||||
|
Size is double-buffered, see wl_surface.commit.
|
||||||
|
</description>
|
||||||
|
<arg name="width" type="uint"/>
|
||||||
|
<arg name="height" type="uint"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_anchor">
|
||||||
|
<description summary="configures the anchor point of the surface">
|
||||||
|
Requests that the compositor anchor the surface to the specified edges
|
||||||
|
and corners. If two orthoginal edges are specified (e.g. 'top' and
|
||||||
|
'left'), then the anchor point will be the intersection of the edges
|
||||||
|
(e.g. the top left corner of the output); otherwise the anchor point
|
||||||
|
will be centered on that edge, or in the center if none is specified.
|
||||||
|
|
||||||
|
Anchor is double-buffered, see wl_surface.commit.
|
||||||
|
</description>
|
||||||
|
<arg name="anchor" type="uint" enum="anchor"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_exclusive_zone">
|
||||||
|
<description summary="configures the exclusive geometry of this surface">
|
||||||
|
Requests that the compositor avoids occluding an area of the surface
|
||||||
|
with other surfaces. The compositor's use of this information is
|
||||||
|
implementation-dependent - do not assume that this region will not
|
||||||
|
actually be occluded.
|
||||||
|
|
||||||
|
A positive value is only meaningful if the surface is anchored to an
|
||||||
|
edge, rather than a corner. The zone is the number of surface-local
|
||||||
|
coordinates from the edge that are considered exclusive.
|
||||||
|
|
||||||
|
Surfaces that do not wish to have an exclusive zone may instead specify
|
||||||
|
how they should interact with surfaces that do. If set to zero, the
|
||||||
|
surface indicates that it would like to be moved to avoid occluding
|
||||||
|
surfaces with a positive excluzive zone. If set to -1, the surface
|
||||||
|
indicates that it would not like to be moved to accommodate for other
|
||||||
|
surfaces, and the compositor should extend it all the way to the edges
|
||||||
|
it is anchored to.
|
||||||
|
|
||||||
|
For example, a panel might set its exclusive zone to 10, so that
|
||||||
|
maximized shell surfaces are not shown on top of it. A notification
|
||||||
|
might set its exclusive zone to 0, so that it is moved to avoid
|
||||||
|
occluding the panel, but shell surfaces are shown underneath it. A
|
||||||
|
wallpaper or lock screen might set their exclusive zone to -1, so that
|
||||||
|
they stretch below or over the panel.
|
||||||
|
|
||||||
|
The default value is 0.
|
||||||
|
|
||||||
|
Exclusive zone is double-buffered, see wl_surface.commit.
|
||||||
|
</description>
|
||||||
|
<arg name="zone" type="int"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_margin">
|
||||||
|
<description summary="sets a margin from the anchor point">
|
||||||
|
Requests that the surface be placed some distance away from the anchor
|
||||||
|
point on the output, in surface-local coordinates. Setting this value
|
||||||
|
for edges you are not anchored to has no effect.
|
||||||
|
|
||||||
|
The exclusive zone includes the margin.
|
||||||
|
|
||||||
|
Margin is double-buffered, see wl_surface.commit.
|
||||||
|
</description>
|
||||||
|
<arg name="top" type="int"/>
|
||||||
|
<arg name="right" type="int"/>
|
||||||
|
<arg name="bottom" type="int"/>
|
||||||
|
<arg name="left" type="int"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="set_keyboard_interactivity">
|
||||||
|
<description summary="requests keyboard events">
|
||||||
|
Set to 1 to request that the seat send keyboard events to this layer
|
||||||
|
surface. For layers below the shell surface layer, the seat will use
|
||||||
|
normal focus semantics. For layers above the shell surface layers, the
|
||||||
|
seat will always give exclusive keyboard focus to the top-most layer
|
||||||
|
which has keyboard interactivity set to true.
|
||||||
|
|
||||||
|
Layer surfaces receive pointer, touch, and tablet events normally. If
|
||||||
|
you do not want to receive them, set the input region on your surface
|
||||||
|
to an empty region.
|
||||||
|
|
||||||
|
Events is double-buffered, see wl_surface.commit.
|
||||||
|
</description>
|
||||||
|
<arg name="keyboard_interactivity" type="uint"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="get_popup">
|
||||||
|
<description summary="assign this layer_surface as an xdg_popup parent">
|
||||||
|
This assigns an xdg_popup's parent to this layer_surface. This popup
|
||||||
|
should have been created via xdg_surface::get_popup with the parent set
|
||||||
|
to NULL, and this request must be invoked before committing the popup's
|
||||||
|
initial state.
|
||||||
|
|
||||||
|
See the documentation of xdg_popup for more details about what an
|
||||||
|
xdg_popup is and how it is used.
|
||||||
|
</description>
|
||||||
|
<arg name="popup" type="object" interface="xdg_popup"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="ack_configure">
|
||||||
|
<description summary="ack a configure event">
|
||||||
|
When a configure event is received, if a client commits the
|
||||||
|
surface in response to the configure event, then the client
|
||||||
|
must make an ack_configure request sometime before the commit
|
||||||
|
request, passing along the serial of the configure event.
|
||||||
|
|
||||||
|
If the client receives multiple configure events before it
|
||||||
|
can respond to one, it only has to ack the last configure event.
|
||||||
|
|
||||||
|
A client is not required to commit immediately after sending
|
||||||
|
an ack_configure request - it may even ack_configure several times
|
||||||
|
before its next surface commit.
|
||||||
|
|
||||||
|
A client may send multiple ack_configure requests before committing, but
|
||||||
|
only the last request sent before a commit indicates which configure
|
||||||
|
event the client really is responding to.
|
||||||
|
</description>
|
||||||
|
<arg name="serial" type="uint" summary="the serial from the configure event"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor">
|
||||||
|
<description summary="destroy the layer_surface">
|
||||||
|
This request destroys the layer surface.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<event name="configure">
|
||||||
|
<description summary="suggest a surface change">
|
||||||
|
The configure event asks the client to resize its surface.
|
||||||
|
|
||||||
|
Clients should arrange their surface for the new states, and then send
|
||||||
|
an ack_configure request with the serial sent in this configure event at
|
||||||
|
some point before committing the new surface.
|
||||||
|
|
||||||
|
The client is free to dismiss all but the last configure event it
|
||||||
|
received.
|
||||||
|
|
||||||
|
The width and height arguments specify the size of the window in
|
||||||
|
surface-local coordinates.
|
||||||
|
|
||||||
|
The size is a hint, in the sense that the client is free to ignore it if
|
||||||
|
it doesn't resize, pick a smaller size (to satisfy aspect ratio or
|
||||||
|
resize in steps of NxM pixels). If the client picks a smaller size and
|
||||||
|
is anchored to two opposite anchors (e.g. 'top' and 'bottom'), the
|
||||||
|
surface will be centered on this axis.
|
||||||
|
|
||||||
|
If the width or height arguments are zero, it means the client should
|
||||||
|
decide its own window dimension.
|
||||||
|
</description>
|
||||||
|
<arg name="serial" type="uint"/>
|
||||||
|
<arg name="width" type="uint"/>
|
||||||
|
<arg name="height" type="uint"/>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<event name="closed">
|
||||||
|
<description summary="surface should be closed">
|
||||||
|
The closed event is sent by the compositor when the surface will no
|
||||||
|
longer be shown. The output may have been destroyed or the user may
|
||||||
|
have asked for it to be removed. Further changes to the surface will be
|
||||||
|
ignored. The client should destroy the resource after receiving this
|
||||||
|
event, and create a new surface if they so choose.
|
||||||
|
</description>
|
||||||
|
</event>
|
||||||
|
|
||||||
|
<enum name="error">
|
||||||
|
<entry name="invalid_surface_state" value="0" summary="provided surface state is invalid"/>
|
||||||
|
<entry name="invalid_size" value="1" summary="size is invalid"/>
|
||||||
|
<entry name="invalid_anchor" value="2" summary="anchor bitfield is invalid"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<enum name="anchor" bitfield="true">
|
||||||
|
<entry name="top" value="1" summary="the top edge of the anchor rectangle"/>
|
||||||
|
<entry name="bottom" value="2" summary="the bottom edge of the anchor rectangle"/>
|
||||||
|
<entry name="left" value="4" summary="the left edge of the anchor rectangle"/>
|
||||||
|
<entry name="right" value="8" summary="the right edge of the anchor rectangle"/>
|
||||||
|
</enum>
|
||||||
|
</interface>
|
||||||
|
</protocol>
|
@ -29,6 +29,8 @@ namespace WallpaperEngine::Application
|
|||||||
X11_BACKGROUND = 1,
|
X11_BACKGROUND = 1,
|
||||||
/** Explicit window mode with specified geometry */
|
/** Explicit window mode with specified geometry */
|
||||||
EXPLICIT_WINDOW = 2,
|
EXPLICIT_WINDOW = 2,
|
||||||
|
/** Wayland mode - zwlr_layer_shell_v1 */
|
||||||
|
WAYLAND_LAYER_SHELL = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|
@ -3,14 +3,10 @@
|
|||||||
#include "Steam/FileSystem/FileSystem.h"
|
#include "Steam/FileSystem/FileSystem.h"
|
||||||
#include "WallpaperEngine/Assets/CDirectory.h"
|
#include "WallpaperEngine/Assets/CDirectory.h"
|
||||||
#include "WallpaperEngine/Assets/CVirtualContainer.h"
|
#include "WallpaperEngine/Assets/CVirtualContainer.h"
|
||||||
#include "WallpaperEngine/Audio/Drivers/CSDLAudioDriver.h"
|
|
||||||
#include "WallpaperEngine/Core/CVideo.h"
|
#include "WallpaperEngine/Core/CVideo.h"
|
||||||
#include "WallpaperEngine/Logging/CLog.h"
|
#include "WallpaperEngine/Logging/CLog.h"
|
||||||
#include "WallpaperEngine/Render/CRenderContext.h"
|
#include "WallpaperEngine/Render/CRenderContext.h"
|
||||||
#include "WallpaperEngine/Render/Drivers/Output/CGLFWWindowOutput.h"
|
|
||||||
#include "WallpaperEngine/Render/Drivers/Output/CX11Output.h"
|
|
||||||
#include "WallpaperEngine/Application/CApplicationState.h"
|
#include "WallpaperEngine/Application/CApplicationState.h"
|
||||||
#include "WallpaperEngine/Render/Drivers/Detectors/CX11FullScreenDetector.h"
|
|
||||||
#include "WallpaperEngine/Audio/Drivers/Detectors/CPulseAudioPlayingDetector.h"
|
#include "WallpaperEngine/Audio/Drivers/Detectors/CPulseAudioPlayingDetector.h"
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -267,80 +263,72 @@ namespace WallpaperEngine::Application
|
|||||||
void CWallpaperApplication::show ()
|
void CWallpaperApplication::show ()
|
||||||
{
|
{
|
||||||
// initialize OpenGL driver
|
// initialize OpenGL driver
|
||||||
WallpaperEngine::Render::Drivers::CX11OpenGLDriver videoDriver ("wallpaperengine", this->m_context);
|
const bool WAYLAND = getenv("WAYLAND_DISPLAY");
|
||||||
// initialize the input subsystem
|
if (WAYLAND) {
|
||||||
WallpaperEngine::Input::CInputContext inputContext (videoDriver);
|
videoDriver = std::make_unique<WallpaperEngine::Render::Drivers::CWaylandOpenGLDriver>("wallpaperengine", this->m_context, this);
|
||||||
// output requested
|
inputContext = std::make_unique<WallpaperEngine::Input::CInputContext>(*(WallpaperEngine::Render::Drivers::CWaylandOpenGLDriver*)videoDriver.get());
|
||||||
WallpaperEngine::Render::Drivers::Output::COutput* output;
|
this->m_context.settings.render.mode = CApplicationContext::WAYLAND_LAYER_SHELL;
|
||||||
// fullscreen detector is common for the different render modes
|
} else {
|
||||||
WallpaperEngine::Render::Drivers::Detectors::CX11FullScreenDetector fullscreenDetector (this->m_context, videoDriver);
|
videoDriver = std::make_unique<WallpaperEngine::Render::Drivers::CX11OpenGLDriver>("wallpaperengine", this->m_context);
|
||||||
|
inputContext = std::make_unique<WallpaperEngine::Input::CInputContext>(*(WallpaperEngine::Render::Drivers::CX11OpenGLDriver*)videoDriver.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WAYLAND)
|
||||||
|
fullscreenDetector = std::make_unique<WallpaperEngine::Render::Drivers::Detectors::CWaylandFullScreenDetector>(this->m_context, *(WallpaperEngine::Render::Drivers::CWaylandOpenGLDriver*)videoDriver.get());
|
||||||
|
else
|
||||||
|
fullscreenDetector = std::make_unique<WallpaperEngine::Render::Drivers::Detectors::CX11FullScreenDetector>(this->m_context, *videoDriver);
|
||||||
// stereo mix recorder for audio processing
|
// stereo mix recorder for audio processing
|
||||||
WallpaperEngine::Audio::Drivers::Recorders::CPulseAudioPlaybackRecorder audioRecorder;
|
WallpaperEngine::Audio::Drivers::Recorders::CPulseAudioPlaybackRecorder audioRecorder;
|
||||||
// audio playing detector
|
// audio playing detector
|
||||||
WallpaperEngine::Audio::Drivers::Detectors::CPulseAudioPlayingDetector audioDetector (this->m_context, fullscreenDetector);
|
WallpaperEngine::Audio::Drivers::Detectors::CPulseAudioPlayingDetector audioDetector (this->m_context, *fullscreenDetector);
|
||||||
// initialize sdl audio driver
|
// initialize sdl audio driver
|
||||||
WallpaperEngine::Audio::Drivers::CSDLAudioDriver audioDriver (this->m_context, audioDetector, audioRecorder);
|
audioDriver = std::make_unique<WallpaperEngine::Audio::Drivers::CSDLAudioDriver> (this->m_context, audioDetector, audioRecorder);
|
||||||
// initialize audio context
|
// initialize audio context
|
||||||
WallpaperEngine::Audio::CAudioContext audioContext (audioDriver);
|
audioContext = std::make_unique<WallpaperEngine::Audio::CAudioContext> (*audioDriver);
|
||||||
|
|
||||||
// initialize the requested output
|
// initialize the requested output
|
||||||
switch (this->m_context.settings.render.mode)
|
switch (this->m_context.settings.render.mode)
|
||||||
{
|
{
|
||||||
case CApplicationContext::EXPLICIT_WINDOW:
|
case CApplicationContext::EXPLICIT_WINDOW:
|
||||||
case CApplicationContext::NORMAL_WINDOW:
|
case CApplicationContext::NORMAL_WINDOW:
|
||||||
output = new WallpaperEngine::Render::Drivers::Output::CGLFWWindowOutput (this->m_context, videoDriver, fullscreenDetector);
|
output = new WallpaperEngine::Render::Drivers::Output::CGLFWWindowOutput (this->m_context, *videoDriver, *fullscreenDetector);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CApplicationContext::X11_BACKGROUND:
|
case CApplicationContext::X11_BACKGROUND:
|
||||||
output = new WallpaperEngine::Render::Drivers::Output::CX11Output (this->m_context, videoDriver, fullscreenDetector);
|
output = new WallpaperEngine::Render::Drivers::Output::CX11Output (this->m_context, *videoDriver, *fullscreenDetector);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CApplicationContext::WAYLAND_LAYER_SHELL:
|
||||||
|
output = new WallpaperEngine::Render::Drivers::Output::CWaylandOutput (this->m_context, *videoDriver, *fullscreenDetector);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialize render context
|
// initialize render context
|
||||||
WallpaperEngine::Render::CRenderContext context (output, videoDriver, inputContext, *this);
|
context = std::make_unique<WallpaperEngine::Render::CRenderContext> (output, *videoDriver, *inputContext, *this);
|
||||||
|
|
||||||
// set all the specific wallpapers required
|
// set all the specific wallpapers required
|
||||||
for (const auto& it : this->m_backgrounds)
|
for (const auto& it : this->m_backgrounds)
|
||||||
context.setWallpaper (
|
context->setWallpaper (
|
||||||
it.first,
|
it.first,
|
||||||
WallpaperEngine::Render::CWallpaper::fromWallpaper (it.second->getWallpaper (), context, audioContext)
|
WallpaperEngine::Render::CWallpaper::fromWallpaper (it.second->getWallpaper (), *context, *audioContext)
|
||||||
);
|
);
|
||||||
|
|
||||||
// set the default rendering wallpaper if available
|
// set the default rendering wallpaper if available
|
||||||
if (this->m_defaultBackground != nullptr)
|
if (this->m_defaultBackground != nullptr)
|
||||||
context.setDefaultWallpaper (WallpaperEngine::Render::CWallpaper::fromWallpaper (
|
context->setDefaultWallpaper (WallpaperEngine::Render::CWallpaper::fromWallpaper (
|
||||||
this->m_defaultBackground->getWallpaper (), context, audioContext
|
this->m_defaultBackground->getWallpaper (), *context, *audioContext
|
||||||
));
|
));
|
||||||
|
|
||||||
float startTime, endTime, minimumTime = 1.0f / this->m_context.settings.render.maximumFPS;
|
if (WAYLAND) {
|
||||||
|
renderFrame();
|
||||||
|
|
||||||
while (!videoDriver.closeRequested () && this->m_context.state.general.keepRunning)
|
while (this->m_context.state.general.keepRunning && !videoDriver->closeRequested ()) {
|
||||||
{
|
videoDriver->dispatchEventQueue();
|
||||||
// update audio recorder
|
}
|
||||||
audioDriver.update ();
|
} else {
|
||||||
// update input information
|
while (!videoDriver->closeRequested () && this->m_context.state.general.keepRunning) {
|
||||||
inputContext.update ();
|
renderFrame();
|
||||||
// keep track of the previous frame's time
|
}
|
||||||
g_TimeLast = g_Time;
|
|
||||||
// calculate the current time value
|
|
||||||
g_Time = videoDriver.getRenderTime ();
|
|
||||||
// get the start time of the frame
|
|
||||||
startTime = g_Time;
|
|
||||||
// render the scene
|
|
||||||
context.render ();
|
|
||||||
// get the end time of the frame
|
|
||||||
endTime = videoDriver.getRenderTime ();
|
|
||||||
|
|
||||||
// ensure the frame time is correct to not overrun FPS
|
|
||||||
if ((endTime - startTime) < minimumTime)
|
|
||||||
usleep ((minimumTime - (endTime - startTime)) * CLOCKS_PER_SEC);
|
|
||||||
|
|
||||||
if (!this->m_context.settings.screenshot.take || videoDriver.getFrameCounter () != 5)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
this->takeScreenshot (context, this->m_context.settings.screenshot.path, this->m_context.settings.screenshot.format);
|
|
||||||
// disable screenshot just in case the counter overflows
|
|
||||||
this->m_context.settings.screenshot.take = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensure this is updated as sometimes it might not come from a signal
|
// ensure this is updated as sometimes it might not come from a signal
|
||||||
@ -351,6 +339,37 @@ namespace WallpaperEngine::Application
|
|||||||
SDL_Quit ();
|
SDL_Quit ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CWallpaperApplication::renderFrame() {
|
||||||
|
|
||||||
|
float startTime, endTime, minimumTime = 1.0f / this->m_context.settings.render.maximumFPS;
|
||||||
|
|
||||||
|
// update audio recorder
|
||||||
|
audioDriver->update ();
|
||||||
|
// update input information
|
||||||
|
inputContext->update ();
|
||||||
|
// keep track of the previous frame's time
|
||||||
|
g_TimeLast = g_Time;
|
||||||
|
// calculate the current time value
|
||||||
|
g_Time = videoDriver->getRenderTime ();
|
||||||
|
// get the start time of the frame
|
||||||
|
startTime = g_Time;
|
||||||
|
// render the scene
|
||||||
|
context->render ();
|
||||||
|
// get the end time of the frame
|
||||||
|
endTime = videoDriver->getRenderTime ();
|
||||||
|
|
||||||
|
// ensure the frame time is correct to not overrun FPS
|
||||||
|
if ((endTime - startTime) < minimumTime)
|
||||||
|
usleep ((minimumTime - (endTime - startTime)) * CLOCKS_PER_SEC);
|
||||||
|
|
||||||
|
if (!this->m_context.settings.screenshot.take || videoDriver->getFrameCounter () != 5)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this->takeScreenshot (*context, this->m_context.settings.screenshot.path, this->m_context.settings.screenshot.format);
|
||||||
|
// disable screenshot just in case the counter overflows
|
||||||
|
this->m_context.settings.screenshot.take = false;
|
||||||
|
}
|
||||||
|
|
||||||
void CWallpaperApplication::signal (int signal)
|
void CWallpaperApplication::signal (int signal)
|
||||||
{
|
{
|
||||||
this->m_context.state.general.keepRunning = false;
|
this->m_context.state.general.keepRunning = false;
|
||||||
|
@ -9,6 +9,18 @@
|
|||||||
#include "WallpaperEngine/Render/CWallpaper.h"
|
#include "WallpaperEngine/Render/CWallpaper.h"
|
||||||
#include "WallpaperEngine/Render/CRenderContext.h"
|
#include "WallpaperEngine/Render/CRenderContext.h"
|
||||||
#include "WallpaperEngine/Render/Drivers/CX11OpenGLDriver.h"
|
#include "WallpaperEngine/Render/Drivers/CX11OpenGLDriver.h"
|
||||||
|
#include "WallpaperEngine/Render/Drivers/CWaylandOpenGLDriver.h"
|
||||||
|
|
||||||
|
#include "WallpaperEngine/Render/Drivers/Detectors/CX11FullScreenDetector.h"
|
||||||
|
#include "WallpaperEngine/Render/Drivers/Detectors/CWaylandFullScreenDetector.h"
|
||||||
|
|
||||||
|
#include "WallpaperEngine/Render/Drivers/Output/CGLFWWindowOutput.h"
|
||||||
|
#include "WallpaperEngine/Render/Drivers/Output/CX11Output.h"
|
||||||
|
#include "WallpaperEngine/Render/Drivers/Output/CWaylandOutput.h"
|
||||||
|
|
||||||
|
#include "WallpaperEngine/Audio/Drivers/CSDLAudioDriver.h"
|
||||||
|
|
||||||
|
#include "WallpaperEngine/Input/CInputContext.h"
|
||||||
|
|
||||||
namespace WallpaperEngine::Application
|
namespace WallpaperEngine::Application
|
||||||
{
|
{
|
||||||
@ -44,6 +56,10 @@ namespace WallpaperEngine::Application
|
|||||||
* @return The current application context
|
* @return The current application context
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] CApplicationContext& getContext () const;
|
[[nodiscard]] CApplicationContext& getContext () const;
|
||||||
|
/**
|
||||||
|
* Renders a frame
|
||||||
|
*/
|
||||||
|
void renderFrame();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
@ -89,5 +105,13 @@ namespace WallpaperEngine::Application
|
|||||||
CApplicationContext& m_context;
|
CApplicationContext& m_context;
|
||||||
/** Maps screens to backgrounds */
|
/** Maps screens to backgrounds */
|
||||||
std::map <std::string, Core::CProject*> m_backgrounds;
|
std::map <std::string, Core::CProject*> m_backgrounds;
|
||||||
|
|
||||||
|
std::unique_ptr<WallpaperEngine::Render::Drivers::CVideoDriver> videoDriver;
|
||||||
|
std::unique_ptr<WallpaperEngine::Input::CInputContext> inputContext;
|
||||||
|
WallpaperEngine::Render::Drivers::Output::COutput* output;
|
||||||
|
std::unique_ptr<WallpaperEngine::Render::Drivers::Detectors::CFullScreenDetector> fullscreenDetector;
|
||||||
|
std::unique_ptr<WallpaperEngine::Audio::Drivers::CSDLAudioDriver> audioDriver;
|
||||||
|
std::unique_ptr<WallpaperEngine::Render::CRenderContext> context;
|
||||||
|
std::unique_ptr<WallpaperEngine::Audio::CAudioContext> audioContext;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "CInputContext.h"
|
#include "CInputContext.h"
|
||||||
#include "WallpaperEngine/Render/Drivers/CX11OpenGLDriver.h"
|
#include "WallpaperEngine/Render/Drivers/CX11OpenGLDriver.h"
|
||||||
|
#include "WallpaperEngine/Render/Drivers/CWaylandOpenGLDriver.h"
|
||||||
|
|
||||||
using namespace WallpaperEngine::Input;
|
using namespace WallpaperEngine::Input;
|
||||||
using namespace WallpaperEngine::Render::Drivers;
|
using namespace WallpaperEngine::Render::Drivers;
|
||||||
@ -9,6 +10,12 @@ CInputContext::CInputContext (CX11OpenGLDriver& videoDriver) :
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CInputContext::CInputContext (CWaylandOpenGLDriver& videoDriver) :
|
||||||
|
m_mouse (nullptr)
|
||||||
|
{
|
||||||
|
// todo
|
||||||
|
}
|
||||||
|
|
||||||
void CInputContext::update ()
|
void CInputContext::update ()
|
||||||
{
|
{
|
||||||
this->m_mouse.update ();
|
this->m_mouse.update ();
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "WallpaperEngine/Render/Drivers/CX11OpenGLDriver.h"
|
#include "WallpaperEngine/Render/Drivers/CX11OpenGLDriver.h"
|
||||||
|
#include "WallpaperEngine/Render/Drivers/CWaylandOpenGLDriver.h"
|
||||||
#include "CMouseInput.h"
|
#include "CMouseInput.h"
|
||||||
|
|
||||||
namespace WallpaperEngine::Render::Drivers
|
namespace WallpaperEngine::Render::Drivers
|
||||||
@ -14,6 +15,7 @@ namespace WallpaperEngine::Input
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit CInputContext (Render::Drivers::CX11OpenGLDriver& videoDriver);
|
explicit CInputContext (Render::Drivers::CX11OpenGLDriver& videoDriver);
|
||||||
|
explicit CInputContext (Render::Drivers::CWaylandOpenGLDriver& videoDriver);
|
||||||
void update ();
|
void update ();
|
||||||
|
|
||||||
[[nodiscard]] const CMouseInput& getMouseInput () const;
|
[[nodiscard]] const CMouseInput& getMouseInput () const;
|
||||||
|
@ -7,6 +7,9 @@ CMouseInput::CMouseInput (GLFWwindow* window) : position (), m_mousePosition (),
|
|||||||
|
|
||||||
void CMouseInput::update ()
|
void CMouseInput::update ()
|
||||||
{
|
{
|
||||||
|
if (!m_window)
|
||||||
|
return;
|
||||||
|
|
||||||
// update current mouse position
|
// update current mouse position
|
||||||
glfwGetCursorPos (this->m_window, &this->m_mousePosition.x, &this->m_mousePosition.y);
|
glfwGetCursorPos (this->m_window, &this->m_mousePosition.x, &this->m_mousePosition.y);
|
||||||
// interpolate to the new position
|
// interpolate to the new position
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
#include "CVideoDriver.h"
|
#include "CVideoDriver.h"
|
||||||
|
|
||||||
using namespace WallpaperEngine::Render::Drivers;
|
using namespace WallpaperEngine::Render::Drivers;
|
||||||
|
|
||||||
|
void CVideoDriver::dispatchEventQueue() const {
|
||||||
|
// intentionally left blank
|
||||||
|
}
|
||||||
|
|
||||||
|
void CVideoDriver::makeCurrent() const {
|
||||||
|
// intentionally left blank
|
||||||
|
}
|
@ -48,5 +48,13 @@ namespace WallpaperEngine::Render::Drivers
|
|||||||
* @return The number of rendered frames since the start of the driver
|
* @return The number of rendered frames since the start of the driver
|
||||||
*/
|
*/
|
||||||
virtual uint32_t getFrameCounter () const = 0;
|
virtual uint32_t getFrameCounter () const = 0;
|
||||||
|
/**
|
||||||
|
* Wayland only: dispatch wayland event queue
|
||||||
|
*/
|
||||||
|
virtual void dispatchEventQueue() const;
|
||||||
|
/**
|
||||||
|
* Wayland only: make EGL current
|
||||||
|
*/
|
||||||
|
void makeCurrent() const;
|
||||||
};
|
};
|
||||||
}
|
}
|
346
src/WallpaperEngine/Render/Drivers/CWaylandOpenGLDriver.cpp
Normal file
346
src/WallpaperEngine/Render/Drivers/CWaylandOpenGLDriver.cpp
Normal file
@ -0,0 +1,346 @@
|
|||||||
|
#include "CWaylandOpenGLDriver.h"
|
||||||
|
#include "WallpaperEngine/Application/CWallpaperApplication.h"
|
||||||
|
|
||||||
|
#include <FreeImage.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#define class _class
|
||||||
|
#define namespace _namespace
|
||||||
|
#define static
|
||||||
|
extern "C" {
|
||||||
|
#include "xdg-shell-protocol.h"
|
||||||
|
#include "wlr-layer-shell-unstable-v1.h"
|
||||||
|
}
|
||||||
|
#undef class
|
||||||
|
#undef namespace
|
||||||
|
#undef static
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
using namespace WallpaperEngine::Render::Drivers;
|
||||||
|
|
||||||
|
void geometry(void* data, wl_output* output, int32_t x, int32_t y, int32_t width_mm, int32_t height_mm, int32_t subpixel, const char* make, const char* model,
|
||||||
|
int32_t transform) {
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
|
||||||
|
void mode(void* data, wl_output* output, uint32_t flags, int32_t width, int32_t height, int32_t refresh) {
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
|
||||||
|
void done(void* data, wl_output* wl_output) {
|
||||||
|
const auto PMONITOR = (SWaylandOutput*)data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void scale(void* data, wl_output* wl_output, int32_t scale) {
|
||||||
|
const auto PMONITOR = (SWaylandOutput*)data;
|
||||||
|
|
||||||
|
PMONITOR->scale = scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void name(void* data, wl_output* wl_output, const char* name) {
|
||||||
|
const auto PMONITOR = (SWaylandOutput*)data;
|
||||||
|
|
||||||
|
if (name)
|
||||||
|
PMONITOR->name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void description(void* data, wl_output* wl_output, const char* description) {
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
|
||||||
|
const wl_output_listener outputListener = {.geometry = geometry, .mode = mode, .done = done, .scale = scale, .name = name, .description = description};
|
||||||
|
|
||||||
|
static void handleGlobal(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) {
|
||||||
|
const auto PDRIVER = (CWaylandOpenGLDriver*)data;
|
||||||
|
|
||||||
|
if (strcmp(interface, wl_compositor_interface.name) == 0) {
|
||||||
|
PDRIVER->waylandContext.compositor = (wl_compositor*)wl_registry_bind(registry, name, &wl_compositor_interface, 4);
|
||||||
|
} else if (strcmp(interface, wl_shm_interface.name) == 0) {
|
||||||
|
PDRIVER->waylandContext.shm = (wl_shm*)wl_registry_bind(registry, name, &wl_shm_interface, 1);
|
||||||
|
} else if (strcmp(interface, wl_output_interface.name) == 0) {
|
||||||
|
const auto POUTPUT = PDRIVER->m_outputs.emplace_back(std::make_unique<SWaylandOutput>()).get();
|
||||||
|
POUTPUT->output = (wl_output*)wl_registry_bind(registry, name, &wl_output_interface, 4);
|
||||||
|
POUTPUT->name = "";
|
||||||
|
POUTPUT->size = {0, 0};
|
||||||
|
POUTPUT->waylandName = name;
|
||||||
|
wl_output_add_listener(POUTPUT->output, &outputListener, POUTPUT);
|
||||||
|
} else if (strcmp(interface, zwlr_layer_shell_v1_interface.name) == 0) {
|
||||||
|
PDRIVER->waylandContext.layerShell = (zwlr_layer_shell_v1*)wl_registry_bind(registry, name, &zwlr_layer_shell_v1_interface, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handleGlobalRemoved(void *data, struct wl_registry *registry, uint32_t id) {
|
||||||
|
// todo: outputs
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct wl_registry_listener registryListener = {
|
||||||
|
.global = handleGlobal,
|
||||||
|
.global_remove = handleGlobalRemoved,
|
||||||
|
};
|
||||||
|
|
||||||
|
void CWaylandOpenGLDriver::initEGL() {
|
||||||
|
const char* CLIENT_EXTENSIONS = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
|
||||||
|
if (!CLIENT_EXTENSIONS)
|
||||||
|
sLog.exception("Failed to query EGL Extensions");
|
||||||
|
|
||||||
|
const std::string CLIENTEXTENSIONS = std::string(CLIENT_EXTENSIONS);
|
||||||
|
|
||||||
|
if (CLIENTEXTENSIONS.find("EGL_EXT_platform_base") == std::string::npos)
|
||||||
|
sLog.exception("EGL_EXT_platform_base not supported by EGL!");
|
||||||
|
|
||||||
|
if (CLIENTEXTENSIONS.find("EGL_EXT_platform_wayland") == std::string::npos)
|
||||||
|
sLog.exception("EGL_EXT_platform_wayland not supported by EGL!");
|
||||||
|
|
||||||
|
PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT");
|
||||||
|
eglContext.eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
|
||||||
|
|
||||||
|
if (!eglGetPlatformDisplayEXT || !eglContext.eglCreatePlatformWindowSurfaceEXT)
|
||||||
|
sLog.exception("EGL did not return EXT proc pointers!");
|
||||||
|
|
||||||
|
auto deinitEGL = [&] () -> void {
|
||||||
|
eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
|
if (eglContext.display)
|
||||||
|
eglTerminate(eglContext.display);
|
||||||
|
eglReleaseThread();
|
||||||
|
};
|
||||||
|
|
||||||
|
eglContext.display = eglGetPlatformDisplayEXT(EGL_PLATFORM_WAYLAND_EXT, waylandContext.display, nullptr);
|
||||||
|
|
||||||
|
if (eglContext.display == EGL_NO_DISPLAY) {
|
||||||
|
deinitEGL();
|
||||||
|
sLog.exception("eglGetPlatformDisplayEXT failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!eglInitialize(eglContext.display, nullptr, nullptr)) {
|
||||||
|
deinitEGL();
|
||||||
|
sLog.exception("eglInitialize failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string CLIENTEXTENSIONSPOSTINIT = std::string(eglQueryString(eglContext.display, EGL_EXTENSIONS));
|
||||||
|
|
||||||
|
if (CLIENTEXTENSIONSPOSTINIT.find("EGL_KHR_create_context") == std::string::npos) {
|
||||||
|
deinitEGL();
|
||||||
|
sLog.exception("EGL_KHR_create_context not supported!");
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLint matchedConfigs = 0;
|
||||||
|
const EGLint CONFIG_ATTRIBUTES[] = {
|
||||||
|
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||||
|
EGL_RED_SIZE, 1,
|
||||||
|
EGL_GREEN_SIZE, 1,
|
||||||
|
EGL_BLUE_SIZE, 1,
|
||||||
|
EGL_ALPHA_SIZE, 1,
|
||||||
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
||||||
|
EGL_NONE,
|
||||||
|
};
|
||||||
|
if (!eglChooseConfig(eglContext.display, CONFIG_ATTRIBUTES, &eglContext.config, 1, &matchedConfigs)) {
|
||||||
|
deinitEGL();
|
||||||
|
sLog.exception("eglChooseConfig failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matchedConfigs == 0) {
|
||||||
|
deinitEGL();
|
||||||
|
sLog.exception("eglChooseConfig failed! (matched 0 configs)");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!eglBindAPI(EGL_OPENGL_API)) {
|
||||||
|
deinitEGL();
|
||||||
|
sLog.exception("eglBindAPI failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
const EGLint CONTEXT_ATTRIBUTES[] = {
|
||||||
|
EGL_CONTEXT_MAJOR_VERSION_KHR, 3,
|
||||||
|
EGL_CONTEXT_MINOR_VERSION_KHR, 3,
|
||||||
|
EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR,
|
||||||
|
EGL_NONE,
|
||||||
|
};
|
||||||
|
eglContext.context = eglCreateContext(eglContext.display, eglContext.config, EGL_NO_CONTEXT, CONTEXT_ATTRIBUTES);
|
||||||
|
|
||||||
|
if (eglContext.context == EGL_NO_CONTEXT) {
|
||||||
|
sLog.error("eglCreateContext error " + std::to_string(eglGetError()));
|
||||||
|
deinitEGL();
|
||||||
|
sLog.exception("eglCreateContext failed!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandOpenGLDriver::finishEGL() {
|
||||||
|
eglMakeCurrent(eglContext.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
|
eglDestroyContext(eglContext.display, eglContext.context);
|
||||||
|
eglTerminate(eglContext.display);
|
||||||
|
eglReleaseThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void handleLSConfigure(void *data, zwlr_layer_surface_v1 *surface, uint32_t serial, uint32_t w, uint32_t h) {
|
||||||
|
const auto PDRIVER = (CWaylandOpenGLDriver*)data;
|
||||||
|
PDRIVER->waylandContext.layerSurface.size = {w, h};
|
||||||
|
|
||||||
|
if (PDRIVER->waylandContext.layerSurface.eglWindow)
|
||||||
|
wl_egl_window_resize(PDRIVER->waylandContext.layerSurface.eglWindow, w, h, 0, 0);
|
||||||
|
|
||||||
|
zwlr_layer_surface_v1_ack_configure(surface, serial);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handleLSClosed(void *data, zwlr_layer_surface_v1 *surface) {
|
||||||
|
const auto PDRIVER = (CWaylandOpenGLDriver*)data;
|
||||||
|
PDRIVER->onLayerClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandOpenGLDriver::onLayerClose() {
|
||||||
|
eglDestroySurface(eglContext.display, waylandContext.layerSurface.eglSurface);
|
||||||
|
wl_egl_window_destroy(waylandContext.layerSurface.eglWindow);
|
||||||
|
zwlr_layer_surface_v1_destroy(waylandContext.layerSurface.layerSurface);
|
||||||
|
wl_surface_destroy(waylandContext.layerSurface.surface);
|
||||||
|
sLog.exception("Compositor closed our LS!"); // todo: handle this?
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct zwlr_layer_surface_v1_listener layerSurfaceListener = {
|
||||||
|
.configure = handleLSConfigure,
|
||||||
|
.closed = handleLSClosed,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void surfaceFrameCallback(void *data, struct wl_callback *cb, uint32_t time) {
|
||||||
|
const auto PDRIVER = (CWaylandOpenGLDriver*)data;
|
||||||
|
wl_callback_destroy(cb);
|
||||||
|
PDRIVER->waylandContext.layerSurface.frameCallback = nullptr;
|
||||||
|
PDRIVER->wallpaperApplication->renderFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct wl_callback_listener frameListener = {
|
||||||
|
.done = surfaceFrameCallback
|
||||||
|
};
|
||||||
|
|
||||||
|
CWaylandOpenGLDriver::CWaylandOpenGLDriver(const char* windowTitle, CApplicationContext& context, CWallpaperApplication* app) : m_frameCounter(0) {
|
||||||
|
wallpaperApplication = app;
|
||||||
|
waylandContext.display = wl_display_connect(NULL);
|
||||||
|
|
||||||
|
if (!waylandContext.display)
|
||||||
|
sLog.exception("Failed to query wayland display");
|
||||||
|
|
||||||
|
waylandContext.registry = wl_display_get_registry(waylandContext.display);
|
||||||
|
wl_registry_add_listener(waylandContext.registry, ®istryListener, this);
|
||||||
|
|
||||||
|
wl_display_dispatch(waylandContext.display);
|
||||||
|
wl_display_roundtrip(waylandContext.display);
|
||||||
|
|
||||||
|
if (!waylandContext.compositor || !waylandContext.shm || !waylandContext.layerShell || m_outputs.empty())
|
||||||
|
sLog.exception("Failed to bind to required interfaces");
|
||||||
|
|
||||||
|
const auto XCURSORSIZE = getenv("XCURSOR_SIZE") ? std::stoi(getenv("XCURSOR_SIZE")) : 24;
|
||||||
|
const auto PRCURSORTHEME = wl_cursor_theme_load(NULL, XCURSORSIZE, waylandContext.shm);
|
||||||
|
|
||||||
|
if (!PRCURSORTHEME)
|
||||||
|
sLog.exception("Failed to get a cursor theme");
|
||||||
|
|
||||||
|
waylandContext.pointer = wl_cursor_theme_get_cursor(PRCURSORTHEME, "left_ptr");
|
||||||
|
waylandContext.cursorSurface = wl_compositor_create_surface(waylandContext.compositor);
|
||||||
|
|
||||||
|
if (!waylandContext.cursorSurface)
|
||||||
|
sLog.exception("Failed to get a cursor surface");
|
||||||
|
|
||||||
|
initEGL();
|
||||||
|
|
||||||
|
waylandContext.layerSurface.surface = wl_compositor_create_surface(waylandContext.compositor);
|
||||||
|
waylandContext.layerSurface.layerSurface = zwlr_layer_shell_v1_get_layer_surface(waylandContext.layerShell, waylandContext.layerSurface.surface, m_outputs[0]->output, ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND, "linux-wallpaperengine");
|
||||||
|
|
||||||
|
if (!waylandContext.layerSurface.layerSurface) {
|
||||||
|
finishEGL();
|
||||||
|
sLog.exception("Failed to get a layer surface");
|
||||||
|
}
|
||||||
|
|
||||||
|
wl_region* region = wl_compositor_create_region(waylandContext.compositor);
|
||||||
|
|
||||||
|
zwlr_layer_surface_v1_set_size(waylandContext.layerSurface.layerSurface, 0, 0);
|
||||||
|
zwlr_layer_surface_v1_set_anchor(waylandContext.layerSurface.layerSurface, ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM);
|
||||||
|
zwlr_layer_surface_v1_set_keyboard_interactivity(waylandContext.layerSurface.layerSurface, false);
|
||||||
|
zwlr_layer_surface_v1_add_listener(waylandContext.layerSurface.layerSurface, &layerSurfaceListener, this);
|
||||||
|
zwlr_layer_surface_v1_set_exclusive_zone(waylandContext.layerSurface.layerSurface, -1);
|
||||||
|
wl_surface_set_input_region(waylandContext.layerSurface.surface, region);
|
||||||
|
wl_surface_commit(waylandContext.layerSurface.surface);
|
||||||
|
wl_display_roundtrip(waylandContext.display);
|
||||||
|
|
||||||
|
waylandContext.layerSurface.eglWindow = wl_egl_window_create(waylandContext.layerSurface.surface, waylandContext.layerSurface.size.x, waylandContext.layerSurface.size.y);
|
||||||
|
waylandContext.layerSurface.eglSurface = eglContext.eglCreatePlatformWindowSurfaceEXT(eglContext.display, eglContext.config, waylandContext.layerSurface.eglWindow, nullptr);
|
||||||
|
wl_surface_commit(waylandContext.layerSurface.surface);
|
||||||
|
wl_display_roundtrip(waylandContext.display);
|
||||||
|
wl_display_flush(waylandContext.display);
|
||||||
|
|
||||||
|
if (eglMakeCurrent(eglContext.display, waylandContext.layerSurface.eglSurface, waylandContext.layerSurface.eglSurface, eglContext.context) == EGL_FALSE) {
|
||||||
|
finishEGL();
|
||||||
|
sLog.exception("Failed to make egl current");
|
||||||
|
}
|
||||||
|
|
||||||
|
GLenum result = glewInit ();
|
||||||
|
|
||||||
|
if (result != GLEW_OK)
|
||||||
|
sLog.error("Failed to initialize GLEW: ", glewGetErrorString (result));
|
||||||
|
|
||||||
|
FreeImage_Initialise (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
CWaylandOpenGLDriver::~CWaylandOpenGLDriver() {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandOpenGLDriver::dispatchEventQueue() const {
|
||||||
|
wl_display_dispatch(waylandContext.display);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* CWaylandOpenGLDriver::getWindowHandle () const {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
float CWaylandOpenGLDriver::getRenderTime () const {
|
||||||
|
return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - renderStart).count() / 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWaylandOpenGLDriver::closeRequested () {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandOpenGLDriver::resizeWindow (glm::ivec2 size) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandOpenGLDriver::resizeWindow (glm::ivec4 sizeandpos) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandOpenGLDriver::showWindow () {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandOpenGLDriver::hideWindow () {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::ivec2 CWaylandOpenGLDriver::getFramebufferSize () const {
|
||||||
|
return waylandContext.layerSurface.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandOpenGLDriver::swapBuffers () {
|
||||||
|
waylandContext.layerSurface.frameCallback = wl_surface_frame(waylandContext.layerSurface.surface);
|
||||||
|
wl_callback_add_listener(waylandContext.layerSurface.frameCallback, &frameListener, this);
|
||||||
|
eglSwapBuffers(eglContext.display, waylandContext.layerSurface.eglSurface);
|
||||||
|
wl_surface_set_buffer_scale(waylandContext.layerSurface.surface, 1);
|
||||||
|
wl_surface_damage_buffer(waylandContext.layerSurface.surface, 0, 0, INT32_MAX, INT32_MAX);
|
||||||
|
wl_surface_commit(waylandContext.layerSurface.surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t CWaylandOpenGLDriver::getFrameCounter () const {
|
||||||
|
return m_frameCounter;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLFWwindow* CWaylandOpenGLDriver::getWindow () {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
void CWaylandOpenGLDriver::makeCurrent() const {
|
||||||
|
if (eglMakeCurrent(eglContext.display, waylandContext.layerSurface.eglSurface, waylandContext.layerSurface.eglSurface, eglContext.context) == EGL_FALSE) {
|
||||||
|
std::cerr << "Couldn't make egl current";
|
||||||
|
}
|
||||||
|
}
|
101
src/WallpaperEngine/Render/Drivers/CWaylandOpenGLDriver.h
Normal file
101
src/WallpaperEngine/Render/Drivers/CWaylandOpenGLDriver.h
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <wayland-client.h>
|
||||||
|
#include <wayland-cursor.h>
|
||||||
|
#include <wayland-egl.h>
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
#include <EGL/eglext.h>
|
||||||
|
#include <GL/glew.h>
|
||||||
|
|
||||||
|
#include "WallpaperEngine/Render/Drivers/CVideoDriver.h"
|
||||||
|
#include "WallpaperEngine/Application/CApplicationContext.h"
|
||||||
|
|
||||||
|
namespace WallpaperEngine::Application
|
||||||
|
{
|
||||||
|
class CApplicationContext;
|
||||||
|
class CWallpaperApplication;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct GLFWwindow;
|
||||||
|
typedef GLFWwindow GLFWWindow;
|
||||||
|
struct zwlr_layer_shell_v1;
|
||||||
|
struct zwlr_layer_surface_v1;
|
||||||
|
|
||||||
|
namespace WallpaperEngine::Render::Drivers
|
||||||
|
{
|
||||||
|
using namespace WallpaperEngine::Application;
|
||||||
|
|
||||||
|
struct SWaylandOutput {
|
||||||
|
wl_output* output;
|
||||||
|
std::string name;
|
||||||
|
glm::ivec2 size;
|
||||||
|
uint32_t waylandName;
|
||||||
|
int scale = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CWaylandOpenGLDriver : public CVideoDriver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit CWaylandOpenGLDriver (const char* windowTitle, CApplicationContext& context, CWallpaperApplication* app);
|
||||||
|
~CWaylandOpenGLDriver();
|
||||||
|
|
||||||
|
void* getWindowHandle () const;
|
||||||
|
float getRenderTime () const override;
|
||||||
|
bool closeRequested () override;
|
||||||
|
void resizeWindow (glm::ivec2 size) override;
|
||||||
|
void resizeWindow (glm::ivec4 sizeandpos) override;
|
||||||
|
void showWindow () override;
|
||||||
|
void hideWindow () override;
|
||||||
|
glm::ivec2 getFramebufferSize () const override;
|
||||||
|
void swapBuffers () override;
|
||||||
|
uint32_t getFrameCounter () const override;
|
||||||
|
void dispatchEventQueue() const override;
|
||||||
|
void makeCurrent() const;
|
||||||
|
|
||||||
|
GLFWwindow* getWindow ();
|
||||||
|
|
||||||
|
struct {
|
||||||
|
wl_display* display = nullptr;
|
||||||
|
wl_registry* registry = nullptr;
|
||||||
|
wl_compositor* compositor = nullptr;
|
||||||
|
wl_shm* shm = nullptr;
|
||||||
|
zwlr_layer_shell_v1* layerShell = nullptr;
|
||||||
|
wl_cursor* pointer = nullptr;
|
||||||
|
wl_surface* cursorSurface = nullptr;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
wl_egl_window* eglWindow = nullptr;
|
||||||
|
EGLSurface eglSurface = nullptr;
|
||||||
|
wl_surface* surface = nullptr;
|
||||||
|
zwlr_layer_surface_v1* layerSurface = nullptr;
|
||||||
|
glm::ivec2 size;
|
||||||
|
wl_callback* frameCallback = nullptr;
|
||||||
|
} layerSurface;
|
||||||
|
} waylandContext;
|
||||||
|
|
||||||
|
void onLayerClose();
|
||||||
|
|
||||||
|
std::vector<std::unique_ptr<SWaylandOutput>> m_outputs;
|
||||||
|
|
||||||
|
CWallpaperApplication* wallpaperApplication;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void initEGL();
|
||||||
|
void finishEGL();
|
||||||
|
|
||||||
|
struct {
|
||||||
|
EGLDisplay display = nullptr;
|
||||||
|
EGLConfig config = nullptr;
|
||||||
|
EGLContext context = nullptr;
|
||||||
|
PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC eglCreatePlatformWindowSurfaceEXT = nullptr;
|
||||||
|
} eglContext;
|
||||||
|
|
||||||
|
uint32_t m_frameCounter;
|
||||||
|
|
||||||
|
std::chrono::high_resolution_clock::time_point renderStart = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
|
friend class CWaylandOutput;
|
||||||
|
friend class CWallpaperApplication;
|
||||||
|
};
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
#include "CWaylandFullScreenDetector.h"
|
||||||
|
|
||||||
|
using namespace WallpaperEngine::Render::Drivers::Detectors;
|
||||||
|
|
||||||
|
CWaylandFullScreenDetector::CWaylandFullScreenDetector (Application::CApplicationContext& appContext, CWaylandOpenGLDriver& driver) :
|
||||||
|
CFullScreenDetector (appContext) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
CWaylandFullScreenDetector::~CWaylandFullScreenDetector () {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWaylandFullScreenDetector::anythingFullscreen () const {
|
||||||
|
return false; // todo
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandFullScreenDetector::reset () {
|
||||||
|
;
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <glm/vec4.hpp>
|
||||||
|
|
||||||
|
#include "CFullScreenDetector.h"
|
||||||
|
#include "WallpaperEngine/Render/Drivers/CVideoDriver.h"
|
||||||
|
#include "WallpaperEngine/Render/Drivers/CWaylandOpenGLDriver.h"
|
||||||
|
|
||||||
|
namespace WallpaperEngine::Render::Drivers::Detectors
|
||||||
|
{
|
||||||
|
class CWaylandFullScreenDetector : public CFullScreenDetector
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CWaylandFullScreenDetector (Application::CApplicationContext& appContext, CWaylandOpenGLDriver& driver);
|
||||||
|
~CWaylandFullScreenDetector ();
|
||||||
|
|
||||||
|
[[nodiscard]] bool anythingFullscreen () const override;
|
||||||
|
void reset () override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
}
|
43
src/WallpaperEngine/Render/Drivers/Output/CWaylandOutput.cpp
Normal file
43
src/WallpaperEngine/Render/Drivers/Output/CWaylandOutput.cpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#include "CWaylandOutput.h"
|
||||||
|
#include "../CWaylandOpenGLDriver.h"
|
||||||
|
|
||||||
|
using namespace WallpaperEngine::Render::Drivers::Output;
|
||||||
|
|
||||||
|
CWaylandOutput::CWaylandOutput (CApplicationContext& context, CVideoDriver& driver, Detectors::CFullScreenDetector& detector) :
|
||||||
|
COutput (context, detector),
|
||||||
|
m_driver (driver)
|
||||||
|
{
|
||||||
|
const auto PDRIVER = (CWaylandOpenGLDriver*)&driver;
|
||||||
|
for (auto& o : PDRIVER->m_outputs) {
|
||||||
|
m_viewports[o->name] = {{0, 0, o->size.x, o->size.y}, o->name};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CWaylandOutput::~CWaylandOutput ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandOutput::reset () {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWaylandOutput::renderVFlip () const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWaylandOutput::renderMultiple () const {
|
||||||
|
return false; // todo
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWaylandOutput::haveImageBuffer () const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* CWaylandOutput::getImageBuffer () const {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWaylandOutput::updateRender () const {
|
||||||
|
;
|
||||||
|
}
|
29
src/WallpaperEngine/Render/Drivers/Output/CWaylandOutput.h
Normal file
29
src/WallpaperEngine/Render/Drivers/Output/CWaylandOutput.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include <glm/vec4.hpp>
|
||||||
|
|
||||||
|
#include "WallpaperEngine/Render/Drivers/CVideoDriver.h"
|
||||||
|
#include "COutput.h"
|
||||||
|
|
||||||
|
namespace WallpaperEngine::Render::Drivers::Output
|
||||||
|
{
|
||||||
|
class CWaylandOutput : public COutput
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CWaylandOutput (CApplicationContext& context, CVideoDriver& driver, Detectors::CFullScreenDetector& detector);
|
||||||
|
~CWaylandOutput ();
|
||||||
|
|
||||||
|
void reset () override;
|
||||||
|
|
||||||
|
bool renderVFlip () const override;
|
||||||
|
bool renderMultiple () const override;
|
||||||
|
bool haveImageBuffer () const override;
|
||||||
|
void* getImageBuffer () const override;
|
||||||
|
void updateRender () const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
CVideoDriver& m_driver;
|
||||||
|
};
|
||||||
|
}
|
91
wlr-layer-shell-unstable-v1.c
Normal file
91
wlr-layer-shell-unstable-v1.c
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/* Generated by wayland-scanner 1.22.0 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright © 2017 Drew DeVault
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, distribute, and sell this
|
||||||
|
* software and its documentation for any purpose is hereby granted
|
||||||
|
* without fee, provided that the above copyright notice appear in
|
||||||
|
* all copies and that both that copyright notice and this permission
|
||||||
|
* notice appear in supporting documentation, and that the name of
|
||||||
|
* the copyright holders not be used in advertising or publicity
|
||||||
|
* pertaining to distribution of the software without specific,
|
||||||
|
* written prior permission. The copyright holders make no
|
||||||
|
* representations about the suitability of this software for any
|
||||||
|
* purpose. It is provided "as is" without express or implied
|
||||||
|
* warranty.
|
||||||
|
*
|
||||||
|
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
||||||
|
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
* FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
||||||
|
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||||
|
* THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "wayland-util.h"
|
||||||
|
|
||||||
|
#ifndef __has_attribute
|
||||||
|
# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)
|
||||||
|
#define WL_PRIVATE __attribute__ ((visibility("hidden")))
|
||||||
|
#else
|
||||||
|
#define WL_PRIVATE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern const struct wl_interface wl_output_interface;
|
||||||
|
extern const struct wl_interface wl_surface_interface;
|
||||||
|
extern const struct wl_interface xdg_popup_interface;
|
||||||
|
extern const struct wl_interface zwlr_layer_surface_v1_interface;
|
||||||
|
|
||||||
|
static const struct wl_interface *wlr_layer_shell_v1_unstable_v1_types[] = {
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&zwlr_layer_surface_v1_interface,
|
||||||
|
&wl_surface_interface,
|
||||||
|
&wl_output_interface,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&xdg_popup_interface,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_layer_shell_v1_requests[] = {
|
||||||
|
{ "get_layer_surface", "no?ous", wlr_layer_shell_v1_unstable_v1_types + 4 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface zwlr_layer_shell_v1_interface = {
|
||||||
|
"zwlr_layer_shell_v1", 1,
|
||||||
|
1, zwlr_layer_shell_v1_requests,
|
||||||
|
0, NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_layer_surface_v1_requests[] = {
|
||||||
|
{ "set_size", "uu", wlr_layer_shell_v1_unstable_v1_types + 0 },
|
||||||
|
{ "set_anchor", "u", wlr_layer_shell_v1_unstable_v1_types + 0 },
|
||||||
|
{ "set_exclusive_zone", "i", wlr_layer_shell_v1_unstable_v1_types + 0 },
|
||||||
|
{ "set_margin", "iiii", wlr_layer_shell_v1_unstable_v1_types + 0 },
|
||||||
|
{ "set_keyboard_interactivity", "u", wlr_layer_shell_v1_unstable_v1_types + 0 },
|
||||||
|
{ "get_popup", "o", wlr_layer_shell_v1_unstable_v1_types + 9 },
|
||||||
|
{ "ack_configure", "u", wlr_layer_shell_v1_unstable_v1_types + 0 },
|
||||||
|
{ "destroy", "", wlr_layer_shell_v1_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_layer_surface_v1_events[] = {
|
||||||
|
{ "configure", "uuu", wlr_layer_shell_v1_unstable_v1_types + 0 },
|
||||||
|
{ "closed", "", wlr_layer_shell_v1_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface zwlr_layer_surface_v1_interface = {
|
||||||
|
"zwlr_layer_surface_v1", 1,
|
||||||
|
8, zwlr_layer_surface_v1_requests,
|
||||||
|
2, zwlr_layer_surface_v1_events,
|
||||||
|
};
|
||||||
|
|
563
wlr-layer-shell-unstable-v1.h
Normal file
563
wlr-layer-shell-unstable-v1.h
Normal file
@ -0,0 +1,563 @@
|
|||||||
|
/* Generated by wayland-scanner 1.22.0 */
|
||||||
|
|
||||||
|
#ifndef WLR_LAYER_SHELL_V1_UNSTABLE_V1_CLIENT_PROTOCOL_H
|
||||||
|
#define WLR_LAYER_SHELL_V1_UNSTABLE_V1_CLIENT_PROTOCOL_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "wayland-client.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @page page_wlr_layer_shell_v1_unstable_v1 The wlr_layer_shell_v1_unstable_v1 protocol
|
||||||
|
* @section page_ifaces_wlr_layer_shell_v1_unstable_v1 Interfaces
|
||||||
|
* - @subpage page_iface_zwlr_layer_shell_v1 - create surfaces that are layers of the desktop
|
||||||
|
* - @subpage page_iface_zwlr_layer_surface_v1 - layer metadata interface
|
||||||
|
* @section page_copyright_wlr_layer_shell_v1_unstable_v1 Copyright
|
||||||
|
* <pre>
|
||||||
|
*
|
||||||
|
* Copyright © 2017 Drew DeVault
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, distribute, and sell this
|
||||||
|
* software and its documentation for any purpose is hereby granted
|
||||||
|
* without fee, provided that the above copyright notice appear in
|
||||||
|
* all copies and that both that copyright notice and this permission
|
||||||
|
* notice appear in supporting documentation, and that the name of
|
||||||
|
* the copyright holders not be used in advertising or publicity
|
||||||
|
* pertaining to distribution of the software without specific,
|
||||||
|
* written prior permission. The copyright holders make no
|
||||||
|
* representations about the suitability of this software for any
|
||||||
|
* purpose. It is provided "as is" without express or implied
|
||||||
|
* warranty.
|
||||||
|
*
|
||||||
|
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
||||||
|
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
* FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
||||||
|
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||||
|
* THIS SOFTWARE.
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
struct wl_output;
|
||||||
|
struct wl_surface;
|
||||||
|
struct xdg_popup;
|
||||||
|
struct zwlr_layer_shell_v1;
|
||||||
|
struct zwlr_layer_surface_v1;
|
||||||
|
|
||||||
|
#ifndef ZWLR_LAYER_SHELL_V1_INTERFACE
|
||||||
|
#define ZWLR_LAYER_SHELL_V1_INTERFACE
|
||||||
|
/**
|
||||||
|
* @page page_iface_zwlr_layer_shell_v1 zwlr_layer_shell_v1
|
||||||
|
* @section page_iface_zwlr_layer_shell_v1_desc Description
|
||||||
|
*
|
||||||
|
* Clients can use this interface to assign the surface_layer role to
|
||||||
|
* wl_surfaces. Such surfaces are assigned to a "layer" of the output and
|
||||||
|
* rendered with a defined z-depth respective to each other. They may also be
|
||||||
|
* anchored to the edges and corners of a screen and specify input handling
|
||||||
|
* semantics. This interface should be suitable for the implementation of
|
||||||
|
* many desktop shell components, and a broad number of other applications
|
||||||
|
* that interact with the desktop.
|
||||||
|
* @section page_iface_zwlr_layer_shell_v1_api API
|
||||||
|
* See @ref iface_zwlr_layer_shell_v1.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @defgroup iface_zwlr_layer_shell_v1 The zwlr_layer_shell_v1 interface
|
||||||
|
*
|
||||||
|
* Clients can use this interface to assign the surface_layer role to
|
||||||
|
* wl_surfaces. Such surfaces are assigned to a "layer" of the output and
|
||||||
|
* rendered with a defined z-depth respective to each other. They may also be
|
||||||
|
* anchored to the edges and corners of a screen and specify input handling
|
||||||
|
* semantics. This interface should be suitable for the implementation of
|
||||||
|
* many desktop shell components, and a broad number of other applications
|
||||||
|
* that interact with the desktop.
|
||||||
|
*/
|
||||||
|
extern const struct wl_interface zwlr_layer_shell_v1_interface;
|
||||||
|
#endif
|
||||||
|
#ifndef ZWLR_LAYER_SURFACE_V1_INTERFACE
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_INTERFACE
|
||||||
|
/**
|
||||||
|
* @page page_iface_zwlr_layer_surface_v1 zwlr_layer_surface_v1
|
||||||
|
* @section page_iface_zwlr_layer_surface_v1_desc Description
|
||||||
|
*
|
||||||
|
* An interface that may be implemented by a wl_surface, for surfaces that
|
||||||
|
* are designed to be rendered as a layer of a stacked desktop-like
|
||||||
|
* environment.
|
||||||
|
*
|
||||||
|
* Layer surface state (size, anchor, exclusive zone, margin, interactivity)
|
||||||
|
* is double-buffered, and will be applied at the time wl_surface.commit of
|
||||||
|
* the corresponding wl_surface is called.
|
||||||
|
* @section page_iface_zwlr_layer_surface_v1_api API
|
||||||
|
* See @ref iface_zwlr_layer_surface_v1.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @defgroup iface_zwlr_layer_surface_v1 The zwlr_layer_surface_v1 interface
|
||||||
|
*
|
||||||
|
* An interface that may be implemented by a wl_surface, for surfaces that
|
||||||
|
* are designed to be rendered as a layer of a stacked desktop-like
|
||||||
|
* environment.
|
||||||
|
*
|
||||||
|
* Layer surface state (size, anchor, exclusive zone, margin, interactivity)
|
||||||
|
* is double-buffered, and will be applied at the time wl_surface.commit of
|
||||||
|
* the corresponding wl_surface is called.
|
||||||
|
*/
|
||||||
|
extern const struct wl_interface zwlr_layer_surface_v1_interface;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ZWLR_LAYER_SHELL_V1_ERROR_ENUM
|
||||||
|
#define ZWLR_LAYER_SHELL_V1_ERROR_ENUM
|
||||||
|
enum zwlr_layer_shell_v1_error {
|
||||||
|
/**
|
||||||
|
* wl_surface has another role
|
||||||
|
*/
|
||||||
|
ZWLR_LAYER_SHELL_V1_ERROR_ROLE = 0,
|
||||||
|
/**
|
||||||
|
* layer value is invalid
|
||||||
|
*/
|
||||||
|
ZWLR_LAYER_SHELL_V1_ERROR_INVALID_LAYER = 1,
|
||||||
|
/**
|
||||||
|
* wl_surface has a buffer attached or committed
|
||||||
|
*/
|
||||||
|
ZWLR_LAYER_SHELL_V1_ERROR_ALREADY_CONSTRUCTED = 2,
|
||||||
|
};
|
||||||
|
#endif /* ZWLR_LAYER_SHELL_V1_ERROR_ENUM */
|
||||||
|
|
||||||
|
#ifndef ZWLR_LAYER_SHELL_V1_LAYER_ENUM
|
||||||
|
#define ZWLR_LAYER_SHELL_V1_LAYER_ENUM
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_shell_v1
|
||||||
|
* available layers for surfaces
|
||||||
|
*
|
||||||
|
* These values indicate which layers a surface can be rendered in. They
|
||||||
|
* are ordered by z depth, bottom-most first. Traditional shell surfaces
|
||||||
|
* will typically be rendered between the bottom and top layers.
|
||||||
|
* Fullscreen shell surfaces are typically rendered at the top layer.
|
||||||
|
* Multiple surfaces can share a single layer, and ordering within a
|
||||||
|
* single layer is undefined.
|
||||||
|
*/
|
||||||
|
enum zwlr_layer_shell_v1_layer {
|
||||||
|
ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND = 0,
|
||||||
|
ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM = 1,
|
||||||
|
ZWLR_LAYER_SHELL_V1_LAYER_TOP = 2,
|
||||||
|
ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY = 3,
|
||||||
|
};
|
||||||
|
#endif /* ZWLR_LAYER_SHELL_V1_LAYER_ENUM */
|
||||||
|
|
||||||
|
#define ZWLR_LAYER_SHELL_V1_GET_LAYER_SURFACE 0
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_shell_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SHELL_V1_GET_LAYER_SURFACE_SINCE_VERSION 1
|
||||||
|
|
||||||
|
/** @ingroup iface_zwlr_layer_shell_v1 */
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_shell_v1_set_user_data(struct zwlr_layer_shell_v1 *zwlr_layer_shell_v1, void *user_data)
|
||||||
|
{
|
||||||
|
wl_proxy_set_user_data((struct wl_proxy *) zwlr_layer_shell_v1, user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ingroup iface_zwlr_layer_shell_v1 */
|
||||||
|
static inline void *
|
||||||
|
zwlr_layer_shell_v1_get_user_data(struct zwlr_layer_shell_v1 *zwlr_layer_shell_v1)
|
||||||
|
{
|
||||||
|
return wl_proxy_get_user_data((struct wl_proxy *) zwlr_layer_shell_v1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
zwlr_layer_shell_v1_get_version(struct zwlr_layer_shell_v1 *zwlr_layer_shell_v1)
|
||||||
|
{
|
||||||
|
return wl_proxy_get_version((struct wl_proxy *) zwlr_layer_shell_v1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ingroup iface_zwlr_layer_shell_v1 */
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_shell_v1_destroy(struct zwlr_layer_shell_v1 *zwlr_layer_shell_v1)
|
||||||
|
{
|
||||||
|
wl_proxy_destroy((struct wl_proxy *) zwlr_layer_shell_v1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_shell_v1
|
||||||
|
*
|
||||||
|
* Create a layer surface for an existing surface. This assigns the role of
|
||||||
|
* layer_surface, or raises a protocol error if another role is already
|
||||||
|
* assigned.
|
||||||
|
*
|
||||||
|
* Creating a layer surface from a wl_surface 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 layer_surface.configure call
|
||||||
|
* must also be treated as errors.
|
||||||
|
*
|
||||||
|
* You may pass NULL for output to allow the compositor to decide which
|
||||||
|
* output to use. Generally this will be the one that the user most
|
||||||
|
* recently interacted with.
|
||||||
|
*
|
||||||
|
* Clients can specify a namespace that defines the purpose of the layer
|
||||||
|
* surface.
|
||||||
|
*/
|
||||||
|
static inline struct zwlr_layer_surface_v1 *
|
||||||
|
zwlr_layer_shell_v1_get_layer_surface(struct zwlr_layer_shell_v1 *zwlr_layer_shell_v1, struct wl_surface *surface, struct wl_output *output, uint32_t layer, const char *namespace)
|
||||||
|
{
|
||||||
|
struct wl_proxy *id;
|
||||||
|
|
||||||
|
id = wl_proxy_marshal_flags((struct wl_proxy *) zwlr_layer_shell_v1,
|
||||||
|
ZWLR_LAYER_SHELL_V1_GET_LAYER_SURFACE, &zwlr_layer_surface_v1_interface, wl_proxy_get_version((struct wl_proxy *) zwlr_layer_shell_v1), 0, NULL, surface, output, layer, namespace);
|
||||||
|
|
||||||
|
return (struct zwlr_layer_surface_v1 *) id;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef ZWLR_LAYER_SURFACE_V1_ERROR_ENUM
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_ERROR_ENUM
|
||||||
|
enum zwlr_layer_surface_v1_error {
|
||||||
|
/**
|
||||||
|
* provided surface state is invalid
|
||||||
|
*/
|
||||||
|
ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SURFACE_STATE = 0,
|
||||||
|
/**
|
||||||
|
* size is invalid
|
||||||
|
*/
|
||||||
|
ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SIZE = 1,
|
||||||
|
/**
|
||||||
|
* anchor bitfield is invalid
|
||||||
|
*/
|
||||||
|
ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_ANCHOR = 2,
|
||||||
|
};
|
||||||
|
#endif /* ZWLR_LAYER_SURFACE_V1_ERROR_ENUM */
|
||||||
|
|
||||||
|
#ifndef ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM
|
||||||
|
enum zwlr_layer_surface_v1_anchor {
|
||||||
|
/**
|
||||||
|
* the top edge of the anchor rectangle
|
||||||
|
*/
|
||||||
|
ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP = 1,
|
||||||
|
/**
|
||||||
|
* the bottom edge of the anchor rectangle
|
||||||
|
*/
|
||||||
|
ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM = 2,
|
||||||
|
/**
|
||||||
|
* the left edge of the anchor rectangle
|
||||||
|
*/
|
||||||
|
ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT = 4,
|
||||||
|
/**
|
||||||
|
* the right edge of the anchor rectangle
|
||||||
|
*/
|
||||||
|
ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT = 8,
|
||||||
|
};
|
||||||
|
#endif /* ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
* @struct zwlr_layer_surface_v1_listener
|
||||||
|
*/
|
||||||
|
struct zwlr_layer_surface_v1_listener {
|
||||||
|
/**
|
||||||
|
* suggest a surface change
|
||||||
|
*
|
||||||
|
* The configure event asks the client to resize its surface.
|
||||||
|
*
|
||||||
|
* Clients should arrange their surface for the new states, and
|
||||||
|
* then send an ack_configure request with the serial sent in this
|
||||||
|
* configure event at some point before committing the new surface.
|
||||||
|
*
|
||||||
|
* The client is free to dismiss all but the last configure event
|
||||||
|
* it received.
|
||||||
|
*
|
||||||
|
* The width and height arguments specify the size of the window in
|
||||||
|
* surface-local coordinates.
|
||||||
|
*
|
||||||
|
* The size is a hint, in the sense that the client is free to
|
||||||
|
* ignore it if it doesn't resize, pick a smaller size (to satisfy
|
||||||
|
* aspect ratio or resize in steps of NxM pixels). If the client
|
||||||
|
* picks a smaller size and is anchored to two opposite anchors
|
||||||
|
* (e.g. 'top' and 'bottom'), the surface will be centered on this
|
||||||
|
* axis.
|
||||||
|
*
|
||||||
|
* If the width or height arguments are zero, it means the client
|
||||||
|
* should decide its own window dimension.
|
||||||
|
*/
|
||||||
|
void (*configure)(void *data,
|
||||||
|
struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1,
|
||||||
|
uint32_t serial,
|
||||||
|
uint32_t width,
|
||||||
|
uint32_t height);
|
||||||
|
/**
|
||||||
|
* surface should be closed
|
||||||
|
*
|
||||||
|
* The closed event is sent by the compositor when the surface
|
||||||
|
* will no longer be shown. The output may have been destroyed or
|
||||||
|
* the user may have asked for it to be removed. Further changes to
|
||||||
|
* the surface will be ignored. The client should destroy the
|
||||||
|
* resource after receiving this event, and create a new surface if
|
||||||
|
* they so choose.
|
||||||
|
*/
|
||||||
|
void (*closed)(void *data,
|
||||||
|
struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
static inline int
|
||||||
|
zwlr_layer_surface_v1_add_listener(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1,
|
||||||
|
const struct zwlr_layer_surface_v1_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
return wl_proxy_add_listener((struct wl_proxy *) zwlr_layer_surface_v1,
|
||||||
|
(void (**)(void)) listener, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_SET_SIZE 0
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_SET_ANCHOR 1
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_SET_EXCLUSIVE_ZONE 2
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_SET_MARGIN 3
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_SET_KEYBOARD_INTERACTIVITY 4
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_GET_POPUP 5
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_ACK_CONFIGURE 6
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_DESTROY 7
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_CONFIGURE_SINCE_VERSION 1
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_CLOSED_SINCE_VERSION 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_SET_SIZE_SINCE_VERSION 1
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_SET_ANCHOR_SINCE_VERSION 1
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_SET_EXCLUSIVE_ZONE_SINCE_VERSION 1
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_SET_MARGIN_SINCE_VERSION 1
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_SET_KEYBOARD_INTERACTIVITY_SINCE_VERSION 1
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_GET_POPUP_SINCE_VERSION 1
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_ACK_CONFIGURE_SINCE_VERSION 1
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*/
|
||||||
|
#define ZWLR_LAYER_SURFACE_V1_DESTROY_SINCE_VERSION 1
|
||||||
|
|
||||||
|
/** @ingroup iface_zwlr_layer_surface_v1 */
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_surface_v1_set_user_data(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1, void *user_data)
|
||||||
|
{
|
||||||
|
wl_proxy_set_user_data((struct wl_proxy *) zwlr_layer_surface_v1, user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ingroup iface_zwlr_layer_surface_v1 */
|
||||||
|
static inline void *
|
||||||
|
zwlr_layer_surface_v1_get_user_data(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1)
|
||||||
|
{
|
||||||
|
return wl_proxy_get_user_data((struct wl_proxy *) zwlr_layer_surface_v1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
zwlr_layer_surface_v1_get_version(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1)
|
||||||
|
{
|
||||||
|
return wl_proxy_get_version((struct wl_proxy *) zwlr_layer_surface_v1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*
|
||||||
|
* Sets the size of the surface in surface-local coordinates. The
|
||||||
|
* compositor will display the surface centered with respect to its
|
||||||
|
* anchors.
|
||||||
|
*
|
||||||
|
* If you pass 0 for either value, the compositor will assign it and
|
||||||
|
* inform you of the assignment in the configure event. You must set your
|
||||||
|
* anchor to opposite edges in the dimensions you omit; not doing so is a
|
||||||
|
* protocol error. Both values are 0 by default.
|
||||||
|
*
|
||||||
|
* Size is double-buffered, see wl_surface.commit.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_surface_v1_set_size(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1, uint32_t width, uint32_t height)
|
||||||
|
{
|
||||||
|
wl_proxy_marshal_flags((struct wl_proxy *) zwlr_layer_surface_v1,
|
||||||
|
ZWLR_LAYER_SURFACE_V1_SET_SIZE, NULL, wl_proxy_get_version((struct wl_proxy *) zwlr_layer_surface_v1), 0, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*
|
||||||
|
* Requests that the compositor anchor the surface to the specified edges
|
||||||
|
* and corners. If two orthoginal edges are specified (e.g. 'top' and
|
||||||
|
* 'left'), then the anchor point will be the intersection of the edges
|
||||||
|
* (e.g. the top left corner of the output); otherwise the anchor point
|
||||||
|
* will be centered on that edge, or in the center if none is specified.
|
||||||
|
*
|
||||||
|
* Anchor is double-buffered, see wl_surface.commit.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_surface_v1_set_anchor(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1, uint32_t anchor)
|
||||||
|
{
|
||||||
|
wl_proxy_marshal_flags((struct wl_proxy *) zwlr_layer_surface_v1,
|
||||||
|
ZWLR_LAYER_SURFACE_V1_SET_ANCHOR, NULL, wl_proxy_get_version((struct wl_proxy *) zwlr_layer_surface_v1), 0, anchor);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*
|
||||||
|
* Requests that the compositor avoids occluding an area of the surface
|
||||||
|
* with other surfaces. The compositor's use of this information is
|
||||||
|
* implementation-dependent - do not assume that this region will not
|
||||||
|
* actually be occluded.
|
||||||
|
*
|
||||||
|
* A positive value is only meaningful if the surface is anchored to an
|
||||||
|
* edge, rather than a corner. The zone is the number of surface-local
|
||||||
|
* coordinates from the edge that are considered exclusive.
|
||||||
|
*
|
||||||
|
* Surfaces that do not wish to have an exclusive zone may instead specify
|
||||||
|
* how they should interact with surfaces that do. If set to zero, the
|
||||||
|
* surface indicates that it would like to be moved to avoid occluding
|
||||||
|
* surfaces with a positive excluzive zone. If set to -1, the surface
|
||||||
|
* indicates that it would not like to be moved to accommodate for other
|
||||||
|
* surfaces, and the compositor should extend it all the way to the edges
|
||||||
|
* it is anchored to.
|
||||||
|
*
|
||||||
|
* For example, a panel might set its exclusive zone to 10, so that
|
||||||
|
* maximized shell surfaces are not shown on top of it. A notification
|
||||||
|
* might set its exclusive zone to 0, so that it is moved to avoid
|
||||||
|
* occluding the panel, but shell surfaces are shown underneath it. A
|
||||||
|
* wallpaper or lock screen might set their exclusive zone to -1, so that
|
||||||
|
* they stretch below or over the panel.
|
||||||
|
*
|
||||||
|
* The default value is 0.
|
||||||
|
*
|
||||||
|
* Exclusive zone is double-buffered, see wl_surface.commit.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_surface_v1_set_exclusive_zone(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1, int32_t zone)
|
||||||
|
{
|
||||||
|
wl_proxy_marshal_flags((struct wl_proxy *) zwlr_layer_surface_v1,
|
||||||
|
ZWLR_LAYER_SURFACE_V1_SET_EXCLUSIVE_ZONE, NULL, wl_proxy_get_version((struct wl_proxy *) zwlr_layer_surface_v1), 0, zone);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*
|
||||||
|
* Requests that the surface be placed some distance away from the anchor
|
||||||
|
* point on the output, in surface-local coordinates. Setting this value
|
||||||
|
* for edges you are not anchored to has no effect.
|
||||||
|
*
|
||||||
|
* The exclusive zone includes the margin.
|
||||||
|
*
|
||||||
|
* Margin is double-buffered, see wl_surface.commit.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_surface_v1_set_margin(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1, int32_t top, int32_t right, int32_t bottom, int32_t left)
|
||||||
|
{
|
||||||
|
wl_proxy_marshal_flags((struct wl_proxy *) zwlr_layer_surface_v1,
|
||||||
|
ZWLR_LAYER_SURFACE_V1_SET_MARGIN, NULL, wl_proxy_get_version((struct wl_proxy *) zwlr_layer_surface_v1), 0, top, right, bottom, left);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*
|
||||||
|
* Set to 1 to request that the seat send keyboard events to this layer
|
||||||
|
* surface. For layers below the shell surface layer, the seat will use
|
||||||
|
* normal focus semantics. For layers above the shell surface layers, the
|
||||||
|
* seat will always give exclusive keyboard focus to the top-most layer
|
||||||
|
* which has keyboard interactivity set to true.
|
||||||
|
*
|
||||||
|
* Layer surfaces receive pointer, touch, and tablet events normally. If
|
||||||
|
* you do not want to receive them, set the input region on your surface
|
||||||
|
* to an empty region.
|
||||||
|
*
|
||||||
|
* Events is double-buffered, see wl_surface.commit.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_surface_v1_set_keyboard_interactivity(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1, uint32_t keyboard_interactivity)
|
||||||
|
{
|
||||||
|
wl_proxy_marshal_flags((struct wl_proxy *) zwlr_layer_surface_v1,
|
||||||
|
ZWLR_LAYER_SURFACE_V1_SET_KEYBOARD_INTERACTIVITY, NULL, wl_proxy_get_version((struct wl_proxy *) zwlr_layer_surface_v1), 0, keyboard_interactivity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*
|
||||||
|
* This assigns an xdg_popup's parent to this layer_surface. This popup
|
||||||
|
* should have been created via xdg_surface::get_popup with the parent set
|
||||||
|
* to NULL, and this request must be invoked before committing the popup's
|
||||||
|
* initial state.
|
||||||
|
*
|
||||||
|
* See the documentation of xdg_popup for more details about what an
|
||||||
|
* xdg_popup is and how it is used.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_surface_v1_get_popup(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1, struct xdg_popup *popup)
|
||||||
|
{
|
||||||
|
wl_proxy_marshal_flags((struct wl_proxy *) zwlr_layer_surface_v1,
|
||||||
|
ZWLR_LAYER_SURFACE_V1_GET_POPUP, NULL, wl_proxy_get_version((struct wl_proxy *) zwlr_layer_surface_v1), 0, popup);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*
|
||||||
|
* When a configure event is received, if a client commits the
|
||||||
|
* surface in response to the configure event, then the client
|
||||||
|
* must make an ack_configure request sometime before the commit
|
||||||
|
* request, passing along the serial of the configure event.
|
||||||
|
*
|
||||||
|
* If the client receives multiple configure events before it
|
||||||
|
* can respond to one, it only has to ack the last configure event.
|
||||||
|
*
|
||||||
|
* A client is not required to commit immediately after sending
|
||||||
|
* an ack_configure request - it may even ack_configure several times
|
||||||
|
* before its next surface commit.
|
||||||
|
*
|
||||||
|
* A client may send multiple ack_configure requests before committing, but
|
||||||
|
* only the last request sent before a commit indicates which configure
|
||||||
|
* event the client really is responding to.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_surface_v1_ack_configure(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1, uint32_t serial)
|
||||||
|
{
|
||||||
|
wl_proxy_marshal_flags((struct wl_proxy *) zwlr_layer_surface_v1,
|
||||||
|
ZWLR_LAYER_SURFACE_V1_ACK_CONFIGURE, NULL, wl_proxy_get_version((struct wl_proxy *) zwlr_layer_surface_v1), 0, serial);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup iface_zwlr_layer_surface_v1
|
||||||
|
*
|
||||||
|
* This request destroys the layer surface.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
zwlr_layer_surface_v1_destroy(struct zwlr_layer_surface_v1 *zwlr_layer_surface_v1)
|
||||||
|
{
|
||||||
|
wl_proxy_marshal_flags((struct wl_proxy *) zwlr_layer_surface_v1,
|
||||||
|
ZWLR_LAYER_SURFACE_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zwlr_layer_surface_v1), WL_MARSHAL_FLAG_DESTROY);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
BIN
wlr-layer-shell-unstable-v1.o
Normal file
BIN
wlr-layer-shell-unstable-v1.o
Normal file
Binary file not shown.
183
xdg-shell-protocol.c
Normal file
183
xdg-shell-protocol.c
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
/* Generated by wayland-scanner 1.21.90 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright © 2008-2013 Kristian Høgsberg
|
||||||
|
* Copyright © 2013 Rafael Antognolli
|
||||||
|
* Copyright © 2013 Jasper St. Pierre
|
||||||
|
* Copyright © 2010-2013 Intel Corporation
|
||||||
|
* Copyright © 2015-2017 Samsung Electronics Co., Ltd
|
||||||
|
* Copyright © 2015-2017 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "wayland-util.h"
|
||||||
|
|
||||||
|
#ifndef __has_attribute
|
||||||
|
# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)
|
||||||
|
#define WL_PRIVATE __attribute__ ((visibility("hidden")))
|
||||||
|
#else
|
||||||
|
#define WL_PRIVATE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern const struct wl_interface wl_output_interface;
|
||||||
|
extern const struct wl_interface wl_seat_interface;
|
||||||
|
extern const struct wl_interface wl_surface_interface;
|
||||||
|
extern const struct wl_interface xdg_popup_interface;
|
||||||
|
extern const struct wl_interface xdg_positioner_interface;
|
||||||
|
extern const struct wl_interface xdg_surface_interface;
|
||||||
|
extern const struct wl_interface xdg_toplevel_interface;
|
||||||
|
|
||||||
|
static const struct wl_interface *xdg_shell_types[] = {
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&xdg_positioner_interface,
|
||||||
|
&xdg_surface_interface,
|
||||||
|
&wl_surface_interface,
|
||||||
|
&xdg_toplevel_interface,
|
||||||
|
&xdg_popup_interface,
|
||||||
|
&xdg_surface_interface,
|
||||||
|
&xdg_positioner_interface,
|
||||||
|
&xdg_toplevel_interface,
|
||||||
|
&wl_seat_interface,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&wl_seat_interface,
|
||||||
|
NULL,
|
||||||
|
&wl_seat_interface,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&wl_output_interface,
|
||||||
|
&wl_seat_interface,
|
||||||
|
NULL,
|
||||||
|
&xdg_positioner_interface,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message xdg_wm_base_requests[] = {
|
||||||
|
{ "destroy", "", xdg_shell_types + 0 },
|
||||||
|
{ "create_positioner", "n", xdg_shell_types + 4 },
|
||||||
|
{ "get_xdg_surface", "no", xdg_shell_types + 5 },
|
||||||
|
{ "pong", "u", xdg_shell_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message xdg_wm_base_events[] = {
|
||||||
|
{ "ping", "u", xdg_shell_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface xdg_wm_base_interface = {
|
||||||
|
"xdg_wm_base", 5,
|
||||||
|
4, xdg_wm_base_requests,
|
||||||
|
1, xdg_wm_base_events,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message xdg_positioner_requests[] = {
|
||||||
|
{ "destroy", "", xdg_shell_types + 0 },
|
||||||
|
{ "set_size", "ii", xdg_shell_types + 0 },
|
||||||
|
{ "set_anchor_rect", "iiii", xdg_shell_types + 0 },
|
||||||
|
{ "set_anchor", "u", xdg_shell_types + 0 },
|
||||||
|
{ "set_gravity", "u", xdg_shell_types + 0 },
|
||||||
|
{ "set_constraint_adjustment", "u", xdg_shell_types + 0 },
|
||||||
|
{ "set_offset", "ii", xdg_shell_types + 0 },
|
||||||
|
{ "set_reactive", "3", xdg_shell_types + 0 },
|
||||||
|
{ "set_parent_size", "3ii", xdg_shell_types + 0 },
|
||||||
|
{ "set_parent_configure", "3u", xdg_shell_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface xdg_positioner_interface = {
|
||||||
|
"xdg_positioner", 5,
|
||||||
|
10, xdg_positioner_requests,
|
||||||
|
0, NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message xdg_surface_requests[] = {
|
||||||
|
{ "destroy", "", xdg_shell_types + 0 },
|
||||||
|
{ "get_toplevel", "n", xdg_shell_types + 7 },
|
||||||
|
{ "get_popup", "n?oo", xdg_shell_types + 8 },
|
||||||
|
{ "set_window_geometry", "iiii", xdg_shell_types + 0 },
|
||||||
|
{ "ack_configure", "u", xdg_shell_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message xdg_surface_events[] = {
|
||||||
|
{ "configure", "u", xdg_shell_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface xdg_surface_interface = {
|
||||||
|
"xdg_surface", 5,
|
||||||
|
5, xdg_surface_requests,
|
||||||
|
1, xdg_surface_events,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message xdg_toplevel_requests[] = {
|
||||||
|
{ "destroy", "", xdg_shell_types + 0 },
|
||||||
|
{ "set_parent", "?o", xdg_shell_types + 11 },
|
||||||
|
{ "set_title", "s", xdg_shell_types + 0 },
|
||||||
|
{ "set_app_id", "s", xdg_shell_types + 0 },
|
||||||
|
{ "show_window_menu", "ouii", xdg_shell_types + 12 },
|
||||||
|
{ "move", "ou", xdg_shell_types + 16 },
|
||||||
|
{ "resize", "ouu", xdg_shell_types + 18 },
|
||||||
|
{ "set_max_size", "ii", xdg_shell_types + 0 },
|
||||||
|
{ "set_min_size", "ii", xdg_shell_types + 0 },
|
||||||
|
{ "set_maximized", "", xdg_shell_types + 0 },
|
||||||
|
{ "unset_maximized", "", xdg_shell_types + 0 },
|
||||||
|
{ "set_fullscreen", "?o", xdg_shell_types + 21 },
|
||||||
|
{ "unset_fullscreen", "", xdg_shell_types + 0 },
|
||||||
|
{ "set_minimized", "", xdg_shell_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message xdg_toplevel_events[] = {
|
||||||
|
{ "configure", "iia", xdg_shell_types + 0 },
|
||||||
|
{ "close", "", xdg_shell_types + 0 },
|
||||||
|
{ "configure_bounds", "4ii", xdg_shell_types + 0 },
|
||||||
|
{ "wm_capabilities", "5a", xdg_shell_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface xdg_toplevel_interface = {
|
||||||
|
"xdg_toplevel", 5,
|
||||||
|
14, xdg_toplevel_requests,
|
||||||
|
4, xdg_toplevel_events,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message xdg_popup_requests[] = {
|
||||||
|
{ "destroy", "", xdg_shell_types + 0 },
|
||||||
|
{ "grab", "ou", xdg_shell_types + 22 },
|
||||||
|
{ "reposition", "3ou", xdg_shell_types + 24 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message xdg_popup_events[] = {
|
||||||
|
{ "configure", "iiii", xdg_shell_types + 0 },
|
||||||
|
{ "popup_done", "", xdg_shell_types + 0 },
|
||||||
|
{ "repositioned", "3u", xdg_shell_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface xdg_popup_interface = {
|
||||||
|
"xdg_popup", 5,
|
||||||
|
3, xdg_popup_requests,
|
||||||
|
3, xdg_popup_events,
|
||||||
|
};
|
||||||
|
|
2275
xdg-shell-protocol.h
Normal file
2275
xdg-shell-protocol.h
Normal file
File diff suppressed because it is too large
Load Diff
BIN
xdg-shell-protocol.o
Normal file
BIN
xdg-shell-protocol.o
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user