Skip to content

Commit

Permalink
Add image capture source protocol
Browse files Browse the repository at this point in the history
  • Loading branch information
ehopperdietzel committed Aug 24, 2024
1 parent f6003ec commit 2ad1cf7
Show file tree
Hide file tree
Showing 18 changed files with 747 additions and 3 deletions.
17 changes: 17 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
Louvre (2.8.0-1)

# New Protocols

* Image Capture Source.

# API Changes

* LActivationToken: The destructor has been made private, and move/copy constructors have been deleted to prevent API misuse.

# Building

* Removed an unnecessary flag in meson.build that was generating excessive warnings when using clang.

-- Eduardo Hopperdietzel <[email protected]> Sat, 23 Aug 2024 22:15:24 -0400


Louvre (2.7.0-1)

# New Protocols
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="Louvre is released under the MIT license." />
</a>
<a href="https://github.com/CuarzoSoftware/Louvre">
<img src="https://img.shields.io/badge/version-2.7.0-brightgreen" alt="Current Louvre version." />
<img src="https://img.shields.io/badge/version-2.8.0-brightgreen" alt="Current Louvre version." />
</a>
</p>

Expand Down Expand Up @@ -63,8 +63,9 @@ Fortunately, Louvre simplifies this intricate process by handling all the comple
* Content Type Hint
* Wlr Gamma Control
* Wlr Layer Shell
* Wlr Screen Copy
* Wlr Foreign Toplevel Management
* Wlr Screen Copy
* Image Capture Source
* Foreign Toplevel List
* Pointer Gestures
* Pointer Constraints
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.7.0
2.8.0
10 changes: 10 additions & 0 deletions src/lib/core/LClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,16 @@ const std::vector<ScreenCopy::GScreenCopyManager *> &LClient::screenCopyManagerG
return imp()->screenCopyManagerGlobals;
}

const std::vector<ImageCaptureSource::GOutputImageCaptureSourceManager *> &LClient::outputImageCaptureSourceManagerGlobals() const noexcept
{
return imp()->outputImageCaptureSourceManagerGlobals;
}

const std::vector<ImageCaptureSource::GForeignToplevelImageCaptureSourceManager *> &LClient::foreignToplevelImageCaptureSourceManagerGlobals() const noexcept
{
return imp()->foreignToplevelImageCaptureSourceManagerGlobals;
}

const std::vector<LayerShell::GLayerShell *> &LClient::layerShellGlobals() const noexcept
{
return imp()->layerShellGlobals;
Expand Down
14 changes: 14 additions & 0 deletions src/lib/core/LClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,20 @@ class Louvre::LClient : public LFactoryObject
*/
const std::vector<Protocols::ScreenCopy::GScreenCopyManager*> &screenCopyManagerGlobals() const noexcept;

/**
* Resources created when the client binds to the
* [ext_output_image_capture_source_manager_v1](https://wayland.app/protocols/ext-image-capture-source-v1#ext_output_image_capture_source_manager_v1) global
* of the Image Capture Source protocol.
*/
const std::vector<Protocols::ImageCaptureSource::GOutputImageCaptureSourceManager*> &outputImageCaptureSourceManagerGlobals() const noexcept;

/**
* Resources created when the client binds to the
* [ext_foreign_toplevel_image_capture_source_manager_v1](https://wayland.app/protocols/ext-image-capture-source-v1#ext_foreign_toplevel_image_capture_source_manager_v1) global
* of the Image Capture Source protocol.
*/
const std::vector<Protocols::ImageCaptureSource::GForeignToplevelImageCaptureSourceManager*> &foreignToplevelImageCaptureSourceManagerGlobals() const noexcept;

/**
* Resources created when the client binds to the
* [zwlr_layer_shell_v1](https://wayland.app/protocols/wlr-layer-shell-unstable-v1#zwlr_layer_shell_v1) global
Expand Down
19 changes: 19 additions & 0 deletions src/lib/core/LNamespaces.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
#define LOUVRE_SESSION_LOCK_MANAGER_VERSION 1
#define LOUVRE_POINTER_CONSTRAINTS_VERSION 1
#define LOUVRE_SCREEN_COPY_MANAGER_VERSION 3
#define LOUVRE_OUTPUT_IMAGE_CAPTURE_SOURCE_MANAGER 1
#define LOUVRE_FOREIGN_TOPLEVEL_IMAGE_CAPTURE_SOURCE_MANAGER 1
#define LOUVRE_LAYER_SHELL_VERSION 5
#define LOUVRE_FOREIGN_TOPLEVEL_MANAGER_VERSION 3
#define LOUVRE_FOREIGN_TOPLEVEL_LIST_VERSION 1
Expand Down Expand Up @@ -305,6 +307,15 @@ namespace Louvre
UInt32 build; ///< Build number.
};

/**
* @brief Image capture source type
*/
enum class LImageCaptureSourceType : UInt32
{
Output, ///< LOutput
ForeignToplevel ///< LToplevelRole
};

namespace Protocols
{
namespace Wayland
Expand Down Expand Up @@ -432,6 +443,14 @@ namespace Louvre
class RScreenCopyFrame;
};

namespace ImageCaptureSource
{
class GOutputImageCaptureSourceManager;
class GForeignToplevelImageCaptureSourceManager;

class RImageCaptureSource;
}

namespace PointerConstraints
{
class GPointerConstraints;
Expand Down
8 changes: 8 additions & 0 deletions src/lib/core/default/LCompositorDefault.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#include <protocols/ImageCaptureSource/GForeignToplevelImageCaptureSourceManager.h>
#include <protocols/ImageCaptureSource/GOutputImageCaptureSourceManager.h>
#include <protocols/ForeignToplevelManagement/GForeignToplevelManager.h>
#include <protocols/SinglePixelBuffer/GSinglePixelBufferManager.h>
#include <protocols/ForeignToplevelList/GForeignToplevelList.h>
Expand Down Expand Up @@ -113,6 +115,12 @@ bool LCompositor::createGlobalsRequest()
// Allows clients to capture outputs
createGlobal<ScreenCopy::GScreenCopyManager>();

// Allows toplevels to be used as image capture sources
createGlobal<ImageCaptureSource::GForeignToplevelImageCaptureSourceManager>();

// Allows outputs to be used as image capture sources
createGlobal<ImageCaptureSource::GOutputImageCaptureSourceManager>();

// Allows clients to create wlr_layer_shell surfaces
createGlobal<LayerShell::GLayerShell>();

Expand Down
2 changes: 2 additions & 0 deletions src/lib/core/private/LClientPrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class LClient::LClientPrivate
std::vector<IdleNotify::GIdleNotifier*> idleNotifierGlobals;
std::vector<IdleInhibit::GIdleInhibitManager*> idleInhibitManagerGlobals;
std::vector<XdgActivation::GXdgActivation*> xdgActivationGlobals;
std::vector<ImageCaptureSource::GOutputImageCaptureSourceManager*> outputImageCaptureSourceManagerGlobals;
std::vector<ImageCaptureSource::GForeignToplevelImageCaptureSourceManager*> foreignToplevelImageCaptureSourceManagerGlobals;
bool destroyed { false };
};

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#include <protocols/ImageCaptureSource/GForeignToplevelImageCaptureSourceManager.h>
#include <protocols/ImageCaptureSource/ext-image-capture-source-v1.h>
#include <protocols/ImageCaptureSource/RImageCaptureSource.h>
#include <private/LClientPrivate.h>
#include <LUtils.h>

using namespace Louvre::Protocols::ImageCaptureSource;
using namespace Louvre;

static const struct ext_foreign_toplevel_image_capture_source_manager_v1_interface imp
{
.create_source = &GForeignToplevelImageCaptureSourceManager::create_source,
.destroy = &GForeignToplevelImageCaptureSourceManager::destroy
};

void GForeignToplevelImageCaptureSourceManager::bind(wl_client *client, void */*data*/, UInt32 version, UInt32 id) noexcept
{
new GForeignToplevelImageCaptureSourceManager(client, version, id);
}

Int32 GForeignToplevelImageCaptureSourceManager::maxVersion() noexcept
{
return LOUVRE_FOREIGN_TOPLEVEL_IMAGE_CAPTURE_SOURCE_MANAGER;
}

const wl_interface *GForeignToplevelImageCaptureSourceManager::interface() noexcept
{
return &ext_foreign_toplevel_image_capture_source_manager_v1_interface;
}

GForeignToplevelImageCaptureSourceManager::GForeignToplevelImageCaptureSourceManager(
wl_client *client,
Int32 version,
UInt32 id
) noexcept
:LResource
(
client,
interface(),
version,
id,
&imp
)
{
this->client()->imp()->foreignToplevelImageCaptureSourceManagerGlobals.emplace_back(this);
}

GForeignToplevelImageCaptureSourceManager::~GForeignToplevelImageCaptureSourceManager() noexcept
{
LVectorRemoveOneUnordered(client()->imp()->foreignToplevelImageCaptureSourceManagerGlobals, this);
}

/******************** REQUESTS ********************/

void GForeignToplevelImageCaptureSourceManager::destroy(wl_client */*client*/, wl_resource *resource) noexcept
{
wl_resource_destroy(resource);
}

void GForeignToplevelImageCaptureSourceManager::create_source(wl_client */*client*/, wl_resource *resource, UInt32 id, wl_resource *toplevel_handle) noexcept
{
new RImageCaptureSource(
static_cast<GForeignToplevelImageCaptureSourceManager*>(wl_resource_get_user_data(resource))->client(),
wl_resource_get_version(resource),
id,
LImageCaptureSourceType::ForeignToplevel,
static_cast<LResource*>(wl_resource_get_user_data(toplevel_handle)));
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#ifndef GFOREIGNTOPLEVELIMAGECAPTURESOURCEMANAGER_H
#define GFOREIGNTOPLEVELIMAGECAPTURESOURCEMANAGER_H

#include <LResource.h>

class Louvre::Protocols::ImageCaptureSource::GForeignToplevelImageCaptureSourceManager final : public LResource
{
public:
static void destroy(wl_client *client, wl_resource *resource) noexcept;
static void create_source(wl_client *client, wl_resource *resource, UInt32 id, wl_resource *toplevel_handle) noexcept;
private:
LGLOBAL_INTERFACE
GForeignToplevelImageCaptureSourceManager(wl_client *client, Int32 version, UInt32 id) noexcept;
~GForeignToplevelImageCaptureSourceManager() noexcept;
};


#endif // GFOREIGNTOPLEVELIMAGECAPTURESOURCEMANAGER_H
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#include <protocols/ImageCaptureSource/GOutputImageCaptureSourceManager.h>
#include <protocols/ImageCaptureSource/ext-image-capture-source-v1.h>
#include <protocols/ImageCaptureSource/RImageCaptureSource.h>
#include <private/LClientPrivate.h>
#include <LUtils.h>

using namespace Louvre::Protocols::ImageCaptureSource;
using namespace Louvre;

static const struct ext_output_image_capture_source_manager_v1_interface imp
{
.create_source = &GOutputImageCaptureSourceManager::create_source,
.destroy = &GOutputImageCaptureSourceManager::destroy
};

void GOutputImageCaptureSourceManager::bind(wl_client *client, void */*data*/, UInt32 version, UInt32 id) noexcept
{
new GOutputImageCaptureSourceManager(client, version, id);
}

Int32 GOutputImageCaptureSourceManager::maxVersion() noexcept
{
return LOUVRE_OUTPUT_IMAGE_CAPTURE_SOURCE_MANAGER;
}

const wl_interface *GOutputImageCaptureSourceManager::interface() noexcept
{
return &ext_output_image_capture_source_manager_v1_interface;
}

GOutputImageCaptureSourceManager::GOutputImageCaptureSourceManager(
wl_client *client,
Int32 version,
UInt32 id
) noexcept
:LResource
(
client,
interface(),
version,
id,
&imp
)
{
this->client()->imp()->outputImageCaptureSourceManagerGlobals.emplace_back(this);
}

GOutputImageCaptureSourceManager::~GOutputImageCaptureSourceManager() noexcept
{
LVectorRemoveOneUnordered(client()->imp()->outputImageCaptureSourceManagerGlobals, this);
}

/******************** REQUESTS ********************/

void GOutputImageCaptureSourceManager::destroy(wl_client */*client*/, wl_resource *resource) noexcept
{
wl_resource_destroy(resource);
}

void GOutputImageCaptureSourceManager::create_source(wl_client */*client*/, wl_resource *resource, UInt32 id, wl_resource *output) noexcept
{
new RImageCaptureSource(
static_cast<GOutputImageCaptureSourceManager*>(wl_resource_get_user_data(resource))->client(),
wl_resource_get_version(resource),
id,
LImageCaptureSourceType::Output,
static_cast<LResource*>(wl_resource_get_user_data(output)));
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef GOUTPUTIMAGECAPTURESOURCEMANAGER_H
#define GOUTPUTIMAGECAPTURESOURCEMANAGER_H

#include <LResource.h>

class Louvre::Protocols::ImageCaptureSource::GOutputImageCaptureSourceManager final : public LResource
{
public:
static void destroy(wl_client *client, wl_resource *resource) noexcept;
static void create_source(wl_client *client, wl_resource *resource, UInt32 id, wl_resource *output) noexcept;
private:
LGLOBAL_INTERFACE
GOutputImageCaptureSourceManager(wl_client *client, Int32 version, UInt32 id) noexcept;
~GOutputImageCaptureSourceManager() noexcept;
};

#endif // GOUTPUTIMAGECAPTURESOURCEMANAGER_H
35 changes: 35 additions & 0 deletions src/lib/protocols/ImageCaptureSource/RImageCaptureSource.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include <protocols/ImageCaptureSource/ext-image-capture-source-v1.h>
#include <protocols/ImageCaptureSource/RImageCaptureSource.h>

using namespace Louvre::Protocols::ImageCaptureSource;

static const struct ext_image_capture_source_v1_interface imp
{
.destroy = &RImageCaptureSource::destroy,
};

RImageCaptureSource::RImageCaptureSource
(LClient *client,
Int32 version,
UInt32 id,
LImageCaptureSourceType type,
LResource *source
) noexcept
:LResource
(
client,
&ext_image_capture_source_v1_interface,
version,
id,
&imp
),
m_source(source),
m_type(type)
{}

/******************** REQUESTS ********************/

void RImageCaptureSource::destroy(wl_client */*client*/, wl_resource *resource) noexcept
{
wl_resource_destroy(resource);
}
36 changes: 36 additions & 0 deletions src/lib/protocols/ImageCaptureSource/RImageCaptureSource.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#ifndef RIMAGECAPTURESOURCE_H
#define RIMAGECAPTURESOURCE_H

#include <LResource.h>
#include <LWeak.h>

class Louvre::Protocols::ImageCaptureSource::RImageCaptureSource final : public LResource
{
public:

LImageCaptureSourceType type() const noexcept
{
return m_type;
}

LResource *source() const noexcept
{
return m_source.get();
}

/******************** REQUESTS ********************/

static void destroy(wl_client *client, wl_resource *resource) noexcept;

private:
friend class Louvre::Protocols::ImageCaptureSource::GOutputImageCaptureSourceManager;
friend class Louvre::Protocols::ImageCaptureSource::GForeignToplevelImageCaptureSourceManager;

RImageCaptureSource(LClient *client, Int32 version, UInt32 id, LImageCaptureSourceType type, LResource *source) noexcept;
~RImageCaptureSource() = default;

LWeak<LResource> m_source; // Wayland::GOutput or ForeignToplevelList::RForeignToplevelHandle
LImageCaptureSourceType m_type;
};

#endif // RIMAGECAPTURESOURCE_H
Loading

0 comments on commit 2ad1cf7

Please sign in to comment.