Use XDG decoration protocol.

This commit is contained in:
Bartosz Taudul 2022-12-04 20:44:05 +01:00
parent 9d7cdf2a29
commit 12a109d303
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3

View File

@ -16,6 +16,7 @@
#include <wayland-egl.h> #include <wayland-egl.h>
#include "wayland/xdg-activation.h" #include "wayland/xdg-activation.h"
#include "wayland/xdg-decoration.h"
#include "wayland/xdg-shell.h" #include "wayland/xdg-shell.h"
#include "Backend.hpp" #include "Backend.hpp"
@ -42,6 +43,8 @@ static struct wl_surface* s_cursorSurf;
static int32_t s_cursorX, s_cursorY; static int32_t s_cursorX, s_cursorY;
static struct xdg_activation_v1* s_activation; static struct xdg_activation_v1* s_activation;
static struct xdg_activation_token_v1* s_actToken; static struct xdg_activation_token_v1* s_actToken;
static struct zxdg_decoration_manager_v1* s_decoration;
static struct zxdg_toplevel_decoration_v1* s_tldec;
struct Output struct Output
{ {
@ -200,6 +203,15 @@ constexpr struct wl_output_listener outputListener = {
}; };
static void DecorationConfigure( void*, struct zxdg_toplevel_decoration_v1* tldec, uint32_t mode )
{
}
constexpr struct zxdg_toplevel_decoration_v1_listener decorationListener = {
.configure = DecorationConfigure
};
static void RegistryGlobal( void*, struct wl_registry* reg, uint32_t name, const char* interface, uint32_t version ) static void RegistryGlobal( void*, struct wl_registry* reg, uint32_t name, const char* interface, uint32_t version )
{ {
if( strcmp( interface, wl_compositor_interface.name ) == 0 ) if( strcmp( interface, wl_compositor_interface.name ) == 0 )
@ -231,6 +243,16 @@ static void RegistryGlobal( void*, struct wl_registry* reg, uint32_t name, const
wl_output_add_listener( output, &outputListener, ptr.get() ); wl_output_add_listener( output, &outputListener, ptr.get() );
s_output.emplace( name, std::move( ptr ) ); s_output.emplace( name, std::move( ptr ) );
} }
else if( strcmp( interface, zxdg_decoration_manager_v1_interface.name ) == 0 )
{
s_decoration = (zxdg_decoration_manager_v1*)wl_registry_bind( reg, name, &zxdg_decoration_manager_v1_interface, 1 );
}
else if( strcmp( interface, zxdg_toplevel_decoration_v1_interface.name ) == 0 )
{
s_tldec = (zxdg_toplevel_decoration_v1*)wl_registry_bind( reg, name, &zxdg_toplevel_decoration_v1_interface, 1 );
zxdg_toplevel_decoration_v1_add_listener( s_tldec, &decorationListener, nullptr );
zxdg_toplevel_decoration_v1_set_mode( s_tldec, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE );
}
} }
static void RegistryGlobalRemove( void*, struct wl_registry* reg, uint32_t name ) static void RegistryGlobalRemove( void*, struct wl_registry* reg, uint32_t name )
@ -358,6 +380,12 @@ Backend::Backend( const char* title, std::function<void()> redraw, RunQueue* mai
xdg_toplevel_set_title( s_toplevel, title ); xdg_toplevel_set_title( s_toplevel, title );
xdg_toplevel_set_app_id( s_toplevel, "tracy" ); xdg_toplevel_set_app_id( s_toplevel, "tracy" );
if( s_decoration )
{
zxdg_decoration_manager_v1_get_toplevel_decoration( s_decoration, s_toplevel );
wl_display_roundtrip( s_dpy );
}
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
io.BackendPlatformName = "wayland (tracy profiler)"; io.BackendPlatformName = "wayland (tracy profiler)";
s_time = std::chrono::duration_cast<std::chrono::microseconds>( std::chrono::high_resolution_clock::now().time_since_epoch() ).count(); s_time = std::chrono::duration_cast<std::chrono::microseconds>( std::chrono::high_resolution_clock::now().time_since_epoch() ).count();
@ -365,6 +393,8 @@ Backend::Backend( const char* title, std::function<void()> redraw, RunQueue* mai
Backend::~Backend() Backend::~Backend()
{ {
if( s_tldec ) zxdg_toplevel_decoration_v1_destroy( s_tldec );
if( s_decoration ) zxdg_decoration_manager_v1_destroy( s_decoration );
if( s_actToken ) xdg_activation_token_v1_destroy( s_actToken ); if( s_actToken ) xdg_activation_token_v1_destroy( s_actToken );
if( s_activation ) xdg_activation_v1_destroy( s_activation ); if( s_activation ) xdg_activation_v1_destroy( s_activation );
if( s_pointer ) wl_pointer_destroy( s_pointer ); if( s_pointer ) wl_pointer_destroy( s_pointer );