Releases: CuarzoSoftware/Louvre
Louvre v2.3.1-1
Louvre (2.3.1-1)
Bug Fixes
- Fixed issue preventing apps from launching when
LLauncher
daemon fails to redirectstdin
to/dev/null
. - Removed unnecessary override of SRM environment variables that may cause some hardware to function suboptimally.
Dependencies
- Updated SRM dependency to v0.6.1.
-- Eduardo Hopperdietzel [email protected] Sun, 07 Jul 2024 14:28:24 -0400
Louvre v2.3.0-1
Louvre (2.3.0-1)
New Protocols
- Content Type Hint (see LOutput::setContentType() and LSurface::contentType()).
Bug Fixes
- Fixed bug preventing fallback keyboard map from loading when faulty XKB_DEFAULT_* environment variables are set, thanks to @Fox2Code for noticing it.
- Fixed bug in
louvre-views
where fullscreen toplevel subsurfaces incorrectly appeared on top of the topbar. - Fixed bug in
louvre-views
causing fullscreen toplevels to move behind the black background when a child popup is mapped.
Backends
- Moved responsibility for restoring gamma and cursor planes during TTY switching to SRM.
- Wayland Backend: Added multiple cursor buffers to handle compositors that do not release buffers immediately.
Documentation
- Added link to the old tutorial.
Examples
- Reused the
TextRenderer
component inlouvre-views
andlouvre-weston-clone
.
-- Eduardo Hopperdietzel [email protected] Sat, 29 Jun 2024 18:14:25 -0400
Louvre v2.2.0-1
Louvre (2.2.0-1)
New Protocols
- Single Pixel Buffer.
Environment Variables
- Removed the hardcoded call to
LKeyboard::setKeymap()
inside theLCompositor::initialized()
event, enabling the use of XKB environment variables to override the default keyboard map. Refer to the Environment page for more details.
Bug Fixes
- Fixed bug causing unnecessary repaints on outputs using fractional scaling with oversampling.
Examples
- Cleaned up
louvre-weston-clone
example and replaced most raw pointers with smart pointers.
-- Eduardo Hopperdietzel [email protected] Mon, 24 Jun 2024 13:40:52 -0400
Louvre v2.1.0-1
Louvre (2.1.0-1)
New Protocols
- Wlr Foreign Toplevel Management (Refer to the
LForeignToplevelController
class for details).
API Additions
- Add
activateRequest()
,closeRequest()
andunsetMinimizedRequest()
to theLToplevelRole
class.
Minor API changes
- Removed unused constructor overload in the
LResource
class. - Disabled bottom constraints by default during interactive toplevel move sessions.
Bug Fixes
- Implemented a temporary fix to allow
xdg_popups
to trigger reposition requests before being mapped (until GTK4 fixes it). - Removed unnecessary checks in
LLauncher::startDaemon()
that prevented it from starting the daemon on some systems.
-- Eduardo Hopperdietzel [email protected] Mon, 17 Jun 2024 22:22:05 -0400
Louvre v2.0.0-1
New Protocols/Globals
- Session Lock
- Wlr Layer Shell
- Wlr Screen Copy
- Pointer Gestures
- Pointer Constraints
- Relative Pointer
- Wayland Touch Events
- XDG Output
- Update xdg_wm_base global to v6.
- Update zwp_linux_dmabuf global to v5.
Backends
- Introduced a new Wayland input and graphic backend for running compositors as nested Wayland clients.
- Added support for absolute Libinput pointer events, enabling proper handling of pointer events when running inside QEMU or Virtual Box, thanks to @milisarge.
- Removed unnecessary SRM headers prefix from the DRM backend, thanks to @EBADBEEF.
Rendering
- Added support for automatic and custom blending modes in
LPainter
. - Included premultiplied alpha hints to
LTexture
. - Introduced the
LFramebufferWrapper
class, enabling the use ofLPainter
in native OpenGL framebuffers. - Removed deprecated
LPainter
API.
Layout
- Introduced the concept of surface layers: background, bottom, middle, top, and overlay, simplifying surface ordering management based on their role.
- Added the concept of available geometry and exclusive edges to
LOutput
. - Included the
LExclusiveZone
class for easy calculation and modification of available geometry for outputs.
Roles
- Introduced the
LLayerRole
class forwlr_layer_shell
surfaces, featuring a default implementation that automatically updates their position and size, as well as the available outputs geometry. - Introduced the
LSessionLockRole
for session_lock surfaces, featuring a default implementation that automatically updates their position, size, and mapping state based on the session state. - Detached toplevel move and resize sessions from
LPointer
, moving them into the newLToplevelMoveSession
andLToplevelResizeSession
classes. - Move and resize sessions constraints can now be updated dynamically as needed.
- Now multiple move and resize toplevel sessions are allowed at a time (e.g. pointer and touch at the same time).
- Replaced
LToplevelRole::ResizeEdge
enum with the newLEdge
flags. - Replaced individual
LToplevelRole
andLPopupRole
property change events withatomsChanged()
, enabling the handling of multiple property changes simultaneously while accessing the previous state. This prevents issues that arose from the order in which events were previously triggered. - Added
setExtraGeometry()
toLToplevelRole
to simplify the calculation of position, size, and constraints for toplevels using server-side decorations. - Popups are now immediately unmapped when dismissed.
- Optimized popup position recalculations, preventing unnecessary processing.
Screencasting
- Added support for screencasting through the
wlr_screencopy
protocol, also compatible with thexdg-desktop-portal-wlr
portal, thanks to @Fox2Code for providing feedback on the API design.
Cursor
- Added new
LClientCursor
class for easier tracking and management of client cursors. When assigned toLCursor
, the texture, hotspot, and visibility automatically adjust based on the underlyingLCursorRole
state. LPointer::setCursorRequest()
now provides anLClientCursor
instead of a rawLCursorRole
and hotspot.- The
LClient
class now stores and provides access to the last cursor set by a client viaLClient::lastCursor()
. LCursor
enablement and hardware compositing can be now toggled for specific outputs usingLCursor::enable()
andLCursor::enableHwCompositing()
.- Manual cursor drawing is no longer necessary when hardware composition is not supported.
Clipboard / Drag & Drop
- Removed the
LDataDevice
,LDataSource
, andLDataOffer
classes, their functionality is now handled internally by Louvre. - Migrated clipboard functionality from
LSeat
to the new dedicatedLClipboard
class. - It is now possible to specify which MIME types of the clipboard to make persistent through
LClipboard::persistentMimeTypeFilter()
. - Renamed the
LDNDManager
class toLDND
. - Transferred drag & drop enter, move, and leave events from
LPointer
toLDND
, facilitating support for touch or other forms of DND sessions. - It is now possible to distinguish whether a DND session is originated from a pointer, keyboard, or touch event using
LDND::triggeringEvent()
.
Input Events
- Redesigned the entire input system, with each input event now having its own
LEvent
subclass providing detailed information. - Added support for touch events through the
LTouch
,LTouchPoint
, andLSceneTouchPoint
classes. - Introduced the
LInputDevice
class for configuring and accessing basic input device properties. - Requests triggered by user interactions now include the specific event that triggered them.
- Included support for pointer constraints.
- Added support for swipe, pinch, and hold pointer gestures.
LClient
now provideseventHistory()
andfindEventBySerial()
for querying the last events sent from the compositor.- Removed the
LKeyboard::sendModifiersEvent()
method. Modifiers are now automatically sent to focused surfaces whenever they change.
Security
- Introduced the
LWeak
class for efficient management of weak references toLObjects
, automatically setting them tonullptr
upon object destruction, with an optional destruction callback. - Replaced
LClient::destroy()
withdestroyLater()
to prevent immediate client resource destruction and reduce potential access to freed memory. - Added assert to prevent users from creating factory objects outside
LCompositor::createObjectRequest()
.
Protocol Globals
- Introduced the new
LGlobal
class for managing protocol globals. - Added proper methods in
LCompositor
for safely adding and removing protocol globals (enabling/disabling protocols). - Included
globalsFilter()
inLCompositor
to allow only well-known clients to bind to specific protocols.
Factory
- All classes that provide an interface are now subclasses of
LFactoryObject
. - Replaced all virtual constructors/destructors in
LCompositor
withcreateObjectRequest()
andonAnticipatedObjectDestruction()
.
Cleaning / Performance
- Removed unnecessary 'inline' keywords from class member methods, thanks to @Paraworker for the suggestion.
- Added 'noexcept' keyword to all class member methods that do not throw exceptions.
- Removed unnecessary pimpl pattern from multiple classes, enhancing cache locality and performance.
Bug Fixes
- Fixed incorrect axis scroll values sent to clients using
wl_pointer
v1. - Resolved a segmentation fault issue triggered by accessing
LOutput
buffers following mode changes. - Addressed synchronization problems related to the presentation time protocol.
louvre-views example
- Added fade-in/out toplevel animations.
- Added
Meta + Shift + L + Up/Down
shortcut for modifying the priority of a focusedLLayerRole
surface. - Added
Meta + Shift + W
to launchWofi
. - Added
LLauncher
commands at startup to automatically enable thexdg-desktop-portal-wlr
portal if installed.
-- Eduardo Hopperdietzel [email protected] Mon, 10 Jun 2024 18:53:58 -0400
Louvre v1.2.1-2
Louvre (1.2.1-2)
Internal Changes
- Replaced raw boolean pointer of
LObject
alive indicator withstd::shared_ptr
- Thanks to @Paraworker.
Building
- Fixed header include problem preventing Louvre from building on Musl-based distros - Thanks to @ahmadraniri1994 for reporting the issue.
Building
- Added a link to a curated list of compositors using Louvre into
README.md
- Suggested by @wiki-me.
-- Eduardo Hopperdietzel [email protected] Mon, 19 Feb 2024 13:02:10 -0300
Louvre v1.2.0-2
Louvre (1.2.0-2)
New Protocols
- Viewporter (refer to
LSurface::srcRect()
). - Fractional Scale (refer to
LOutput::setScale()
). - Wlr Gamma Control (refer to
LOutput::setGammaRequest()
). - Tearing Control (refer to
LSurface::preferVSync()
andLOutput::enableVSync()
).
New Features
LOutput
now supports fractional scales with optional oversampling to reduce aliasing artifacts when necessary.- Added VSync disabling capability in
LOutput
with optional refresh rate limits. LOutput
now supports custom gamma correction curves throughLOutput::setGamma()
and the newLGammaTable
class.LPainter
has new methods for rendering texture regions with higher precision and applied transforms.LTextureView
now supports custom source rects and transforms, seeLTextureView::setSrcRect()
andLTextureView::setTransform()
.- Introduced
LBitset
class to reduce memory usage for storing binary conditions. - Introduced
isKeySymbolPressed()
toLKeyboard
, allowing querying the state of key symbols instead of raw key codes.
Minor API Changes
- Replaced most of the non-order-dependent lists with vectors to minimize cache misses.
LOutput
setBufferDamage()
now takesLRegion *
as an argument instead ofLRegion &
.- Updated all virtual constructor parameters in
LCompositor
toconst void *
. - Removed the
create()
method inLAnimation
andLTimer
, replaced with class constructors for stack allocation. - Replaced LView's
paintRect()
event withpaintEvent()
.
Graphic Backend
- The graphic backend modules API has been refactored with a cleaner and more efficient API (this does not affect Louvre public API).
Input Backend
- The Caps Lock key LED is now automatically toggled based on the state of the keyboard modifiers.
Bug Fixes
- Resolved a bug causing the compositor to respond to multiple frame callbacks when a client sent multiple frames before waiting for a reply, thanks to @yurikhan for identifying and reporting it.
Examples
- The
louvre-views
example now uses a single texture atlas for UI elements instead of individual images. - Transitioned most heap-allocated objects to stack allocation.
- Workspace switching and fullscreen transition animations have undergone optimization, resulting in a smoother visual experience.
- Added new shortcuts for changing the output transform, scale, mode, and toggling VSync.
Building
- Updated C++ standard to version 20.
- SRM dependency now requires version 0.5.2 or later.
Documentation
- Rewrote most of the tutorial for clearer explanations and code.
- Created a new repo containing the code of the final result after completing the tutorial.
- Expanded the tutorial with new chapters on gamma correction, fractional scaling, and VSync.
- Remove white spaces from code, thanks to @zlice.
-- Eduardo Hopperdietzel [email protected] Tue, 13 Feb 2024 13:28:39 -0300
Louvre v1.1.0-1
Louvre (1.1.0-1)
License
- License updated from GPLv3 to MIT.
Dependencies
- Substituted the FreeImage dependency with STB Image.
Building
- Substituted
LConfig.h
configuration header withLCompositor
methods for querying default assets paths and backends. - Incorporated soversion in
meson.build
.
Minor API Changes
- The
LCompositor loadGraphicBackend()
andloadInputBackend()
methods now acceptconst std::string &
as an argument instead ofconst char *
. - The
LToplevelRole
appId()
andtitle()
methods now returnconst std::string &
instead ofconst char *
. - The use of
LCompositor::nextSerial()
is now deprecated, andLTime::nextSerial()
should be used instead. LView::paintRect()
now takes anLView::PaintRectParams
struct reference as an argument, eliminating the need to pass all parameters by value.- The
LView::setBlendFunc()
method now follows theglBlendFuncSeparate()
parameters, enabling a more precise blend function configuration.
Additions
- Introduce
LToplevelRole
pendingStates()
andpendingSize()
methods for querying the lastconfigure()
parameters. - Introduce the
LVersion
struct and theLCompositor::version()
method to facilitate querying the current Louvre version in use. - Introduce the
LTime
nextSerial()
andus()
functions for obtaining incremental integer numbers and timestamps with microsecond granularity. - Introduce the
LLauncher
auxiliary class, designed for creating a daemon and safely launching applications. - Introduce the
PaintRectParams
struct toLView
for utilization inLView::paintRect()
calls from anLScene
, aiming to reduce the memory transfer overhead associated with each call. - Introduce the
enableAutoBlendFunc()
option toLView
to enable Louvre to automatically select the OpenGL blend function based on whether the target framebuffer is an output framebuffer or a custom framebuffer. This addition aims to address and resolve alpha-related issues while rendering. - Add
pressedButtons()
andisButtonPressed()
methods toLPointer
, providing the ability to query the state of pointer buttons at any given time. - The
LSurface
class now features theviews()
method, providing access to allLSurfaceViews
created for the surface.
Internal Changes
- Error and fatal messages from
LLog
are now directed tostderr
, thanks to @brianhsu. LToplevelRole
configure events are now stored and dispatched at the conclusion of a main loop iteration.- Toplevels are now automatically configured with the pending states and size if the developer does not explicitly configure them during set or unset fullscreen or maximize requests.
- Within the Libinput backend, the Libinput context is no longer recreated with each session switch. Previously, this recreation was necessary when forks were created while the compositor was running, as failure to do so would lead to compositor crashes.
- Pageflip output events are no longer designated as critical sections, enabling them to run concurrently with the main thread loop. This enhancement improves the output refresh rate.
Bug Fixes
- Addressed a bug in
LPainter::clearScreen()
where it failed to clear the entire screen when the current framebuffer transform differed fromLFramebuffer::Transform::Normal
. - Addressed a bug where the data source cancelled event wasn't sent to the client when start drag & drop sessions were denied.
- Resolved a bug where
LSolidColorViews
were not marked as damaged when their color was changed.
Benchmark
- Include details about the environment in which the benchmark was conducted.
- Enhance benchmark scripts to more safely retrieve the compositors' process IDs.
-- Eduardo Hopperdietzel [email protected] Mon, 18 Dec 2023 19:06:14 -0300
Louvre v1.0.1-1
Louvre (1.0.1-1)
Additions
- Introduce new environment variables enabling backend selection, thanks to @2xsaiko for the idea.
Building
- Incorporate pkg-config into
meson.build
to enhance dependency resolution, special thanks to @jengelh. - Integrate meson.build options to streamline the configuration of assets and backends.
Documentation
- Rectify a package error in Fedora build instructions, thanks to @jwijenbergh.
- Append notes to
LCompositor::loadGraphicBackend()
andLCompositor::loadInputBackend()
methods. - Enhance benchmark documentation with operational details and transition build system from qmake to Meson.
-- Eduardo Hopperdietzel [email protected] Mon, 20 Nov 2023 00:56:50 -0300
Louvre v1.0.0-1
Louvre (1.0.0-1)
Added
- Multi-GPU support is now available.
- Introduction of
LObject
as the base class facilitates sharing future functionality among classes. - Pluggable scene and views system introduced for efficient rendering and handling of input events.
- New
LAnimation
class for creating time-based animations. - New
LTimer
class for time-based triggered callbacks. - New
LResource
wrapper class forwl_resource
structs; each protocol resource or global now has its ownLResource
subclass. - Developers can add or modify default compositor globals by overriding the
LCompositor::createGlobalsRequest()
virtual method. - New example,
louvre-views
, a MacOS X lookalike compositor that uses the scene and views system. LOutput
framebuffers can now be used as textures.LOutput
now supports framebuffer transforms.- New
LRenderBuffer
class for rendering into framebuffers and using them as textures. - Added support for XDG Decoration, Presentation Time, and Linux DMA-Buf protocols.
- Libseat can now be enabled or disabled using the LOUVRE_ENABLE_LIBSEAT environment variable.
- Single, double, or triple buffering can now be configured using SRM library environment variables.
Changed
LCompositor::start()
method is now non-blocking; developers can control the rate of compositor events processing using the pollableLCompositor::fd()
andLCompositor::processLoop()
methods.- New directory structure for protocol interfaces located in
src/lib/protocols
. - Clients can now bind multiple times to the
wl_seat
global, resolving the Firefox issue where it could only receive pointer events. - Clients can now create a
wl_data_device
for eachwl_seat
. - Clients can now bind multiple times to the
wl_subcompositor
global. ping()
andpong()
methods moved from XDG Shell toLClient
class.- The DRM graphic backend now uses the SRM library.
Removed
- X11 graphic and input backends are no longer supported.
LOutputManager
class has been eliminated, and its functionality has been integrated into theLSeat
class.
-- Eduardo Hopperdietzel [email protected] Sun, 12 Nov 2023 23:22:58 -0300