- Use WOutputRenderWindow interface for output configuration
- Complete output state management with all properties
- Ensure settings only saved when configuration succeeds
The WSurface's `aboutToBeInvalidated` signal connection was incorrectly
using `QObject::connect` instead of `safeConnect`. This could lead
to issues when the WSurface object is modified using `setSurface`,
as the previous object's `aboutToBeInvalidated` signal would not be
disconnected, potentially causing a crash or unexpected behavior. This
change replaces the regular `QObject::connect` with `safeConnect` to
ensure proper disconnection and avoid potential issues when the surface
is replaced.
Influence:
1. Test replacing a WSurface multiple times with different WSurface
objects using `setSurface`.
2. Verify that the `releaseResources` function is only called when the
current WSurface is truly invalidated and not prematurely.
3. Observe application behavior under heavy WSurface replacement
scenarios to ensure stability and prevent crashes.
fix: 使用 safeConnect 连接 aboutToBeInvalidated 信号
WSurface 的 `aboutToBeInvalidated` 信号连接错误地使用了
`QObject::connect` 而不是 `safeConnect`。当使用 `setSurface` 修改
WSurface 对象时,这可能导致问题,因为前一个对象的 `aboutToBeInvalidated`
信号不会断开,可能导致崩溃或意外行为。此更改将常规的 `QObject::connect`
替换为 `safeConnect`,以确保正确断开连接并避免在表面替换时出现潜在问题。
Influence:
1. 使用 `setSurface` 多次用不同的 WSurface 对象替换 WSurface。
2. 验证 `releaseResources` 函数仅在当前 WSurface 真正失效时才被调用,而
不是过早调用。
3. 观察在大量 WSurface 替换场景下的应用程序行为,以确保稳定并防止崩溃。
- Track each WXWayland instance by uid so every session gets its own
XWayland socket
- Hide/show XWayland surfaces when switching users to prevent previous
windows leaking
为不同用户管理独立的 XWayland 会话
- 为每个 uid 记录 WXWayland 实例,实现按用户隔离的 XWayland socket
- 切换用户时自动隐藏/显示对应的 XWayland 窗口,避免旧会话窗口外泄
This change addresses the issue where the client process ID associated
with an XWayland surface could not be directly obtained through
`WClient`. Previously, accessing the `WClient` of an XWayland
surface always returned the XWayland process itself. To resolve
this, two virtual functions, `pid()` and `pidFD()`, have been added
to the `WObject` class and overridden in `WXWaylandSurface`. These
functions allow retrieving the actual PID and PID file descriptor
of the XWayland window's client. The `pidFD` is obtained by using
`syscall(SYS_pidfd_open, pid(), 0)`. This approach enables correct
identification of the client process owning the XWayland surface.
Influence:
1. Verify that the `pid()` function on a `WXWaylandSurface` object
returns the correct process ID of the client application, not the
XWayland process.
2. Confirm that `pidFD()` returns a valid file descriptor for the client
application's PID. Check the returned file descriptor is valid.
3. Ensure that these new functions do not negatively impact other parts
of the Waylib codebase.
4. Test multiple XWayland applications to ensure consistent and accurate
PID retrieval.
5. Test on different platforms to ensure `syscall(SYS_pidfd_open, pid(),
0)` is working correctly, and fallback gracefully if not.
feat: 暴露 XWayland surface 进程 ID
此更改解决了无法通过 `WClient` 直接获取与 XWayland surface 关联的客户
端进程 ID 的问题。 以前,访问 XWayland surface 的 `WClient` 始终返回
XWayland 进程本身。 为了解决这个问题,我们在 `WObject` 类中添加了两个虚
函数 `pid()` 和 `pidFD()`,并在 `WXWaylandSurface` 中重写了它们。 这些函
数允许检索 XWayland 窗口客户端的实际 PID 和 PID 文件描述符。 `pidFD` 通
过使用 `syscall(SYS_pidfd_open, pid(), 0)` 获得。 这种方法可以正确识别拥
有 XWayland surface 的客户端进程。
Influence:
1. 验证 `WXWaylandSurface` 对象上的 `pid()` 函数返回客户端应用程序的正确
进程 ID,而不是 XWayland 进程。
2. 确认 `pidFD()` 为客户端应用程序的 PID 返回有效的文件描述符。 检查返回
的文件描述符是否有效。
3. 确保这些新函数不会对 Waylib 代码库的其他部分产生负面影响。
4. 测试多个 XWayland 应用程序,以确保一致且准确的 PID 检索。
5. 在不同平台上进行测试,以确保 `syscall(SYS_pidfd_open, pid(), 0)` 正常
工作,如果不能正常工作,则优雅地回退。
The build was failing on Arch Linux due to an upgrade to Qt 6.10.
This version of Qt requires explicitly finding the private modules
(QuickPrivate, WaylandClientPrivate). This commit updates the
CMakeLists.txt files in the affected directories (src/, src/treeland-
shortcut/, waylib/examples/tinywl/, and waylib/src/server/) to
explicitly find these private modules. It also updates the minimum
required Qt version in some waylib CMakeLists.txt files to 6.8 to align
with the actual required version.
修复了在 Arch Linux 上的构建失败
由于升级到 Qt 6.10,导致在 Arch Linux 上的构建失败。 此版本的 Qt 需要显
式查找私有模块(QuickPrivate, WaylandClientPrivate)。 此提交更新了受影
响目录(src/、src/treeland-shortcut/、waylib/examples/tinywl/ 和 waylib/
src/server/)中的 CMakeLists.txt 文件,以显式查找这些私有模块。 它还在一
些 waylib CMakeLists.txt 文件中更新了最低要求的 Qt 版本到 6.8,以与实际
要求的版本保持一致。
This commit explicitly includes `GuiPrivate` and `QuickPrivate` Qt
modules in `CMakeLists.txt` for both the `waylib` and `waylib/src/
server` directories. This is necessary because Qt 6.11 and later
versions no longer implicitly include these private modules. Failing
to include them results in build failures due to missing headers and
symbols.
Log: Fixed build issue with Qt 6.11 and later versions by explicitly
including necessary private Qt modules.
Influence:
1. Verify that the project builds successfully with Qt versions 6.11
and later.
2. Ensure that all functionalities relying on Qt private modules
(e.g., custom QML components, internal Qt API usage) continue to work
as expected.
3. Test on different platforms (Linux, Windows, macOS) where Qt is used.
fix: 为 Qt 6.11 包含 Qt 私有模块
此提交在 `waylib` 和 `waylib/src/server` 目录的 `CMakeLists.txt` 中显式
包含 `GuiPrivate` 和 `QuickPrivate` Qt 模块。 这是必要的,因为 Qt 6.11
及更高版本不再隐式包含这些私有模块。 未能包含它们会导致由于缺少头文件和
符号而导致构建失败。
Log: 通过显式包含必要的私有 Qt 模块,修复了 Qt 6.11 及更高版本的构建
问题。
Influence:
1. 验证项目是否可以使用 Qt 6.11 及更高版本成功构建。
2. 确保所有依赖于 Qt 私有模块的功能(例如,自定义 QML 组件、内部 Qt API
使用)继续按预期工作。
3. 在使用 Qt 的不同平台(Linux、Windows、macOS)上进行测试。
This commit adds support for the Wayland ext-session-lock-v1 protocol.
1. Added Class
- WSessionLockManager
- WSessionLock
- WSessionLockSurface
2. Implementation Details
Lifecycle of WSessionLock is managed by the WSessionLockManager.
Lifecycle of WSessionLockSurface is managed by its WSessionLock.
WSessionLock handles identification of all possible states a session lock
object can experiance, they are listed as follows:
- Created: default state
- Locked: session locked (after send_locked() is sent)
- Unlocked: client sent unlock_and_destroy()
- Finished: locking denyed by server sending finish()
- Canceled: lock destroyed by client before send_locked() is sent
- Abandoned: lock abnormally destroyed by client after locking
3. tinywl
An example usage is provided in the updated tinywl compositor.
This commit added the override specifier for waylandClient() and
instantRelease() methods in class WLayerSurfacePirvate.
waylandClient() is a virtual function in class WObjectPrivate,
instantRelease() is a virtual function in clas WWrapObjectPrivate.
This commit addresses an issue where the application would fail with
an assertion failure related to `qw_buffer` objects not being properly
released upon exiting the application. The previous implementation
directly called `QCoreApplication::exit` or `QCoreApplication::quit`,
which would trigger the destruction of various `QObject` instances
(such as `Helper` and `QmlEngine`) *after* the Qt event loop had already
exited.
Since many of these objects relied on `deleteLater` for their
destruction, and `deleteLater` calls are ineffective once the event loop
has terminated, these objects were not being fully destructed, leading
to resource leaks and the aforementioned assertion failure.
The solution involves ensuring that all necessary objects are
explicitly destroyed *before* calling `QCoreApplication::exit` or
`QCoreApplication::quit`. Specifically:
1. A `quit()` method has been added to the `Treeland` class, which
disconnects the object from all signals and slots, and then resets the
`d_ptr` (unique pointer to the private implementation) to ensure all
Treeland related objects are properly deleted. This cleanup happens
before calling `qApp->quit()`.
2. The signal connection between `QQmlEngine::quit` and
`QCoreApplication::quit` is changed to a `Qt::QueuedConnection` to avoid
potential issues when the quit call originates from within an event
handler (e.g., a cursor button press/release event).
3. A new signal `requestQuit()` is introduced in `Helper` and emitted
instead of directly calling `qApp->quit()`. This signal is then
connected to the `Treeland::quit()` method using `Qt::QueuedConnection`.
4. In the `tinywl` example, the `QmlEngine` object is now
dynamically allocated and explicitly deleted before `app.exit()`
is called. The `Helper::requestQuit` signal is also connected to
`QmlEngine::deleteLater`.
These changes ensure that all relevant objects have been properly
cleaned up before the application terminates, resolving the assertion
failure and preventing potential resource leaks.
Influence:
1. Verify that the application exits cleanly without any assertion
failures related to `qw_buffer` or other resources.
2. Test exiting the application using various methods (e.g., the window
close button, a menu item, or a keyboard shortcut).
3. Ensure that all application data is saved correctly before exiting.
4. Test that the `LockScreen` object is properly destroyed by manually
creating and destroying a LockScreen object with the setLockScreenImpl
call in Helper.
修复程序退出前对象未正确销毁的问题
此提交修复了应用程序退出时,由于 `qw_buffer` 对象未正确释放而导
致的断言失败问题。 之前的实现直接调用 `QCoreApplication::exit` 或
`QCoreApplication::quit`,导致各种 `QObject` 实例(例如 `Helper` 和
`QmlEngine`)在 Qt 事件循环结束后才被销毁。
由于许多这些对象依赖于 `deleteLater` 进行销毁,并且一旦事件循环终止,
`deleteLater` 调用将无效,因此这些对象没有被完全销毁,从而导致资源泄漏和
前面提到的断言失败。
解决方案包括确保在调用 `QCoreApplication::exit` 或
`QCoreApplication::quit` 之前显式销毁所有必要的对象。 具体来说:
1. 在 `Treeland` 类中添加了一个 `quit()` 方法,该方法断开对象与所有
信号和槽的连接,然后重置 `d_ptr`(指向私有实现的唯一指针),以确保与
Treeland 相关的所有对象都得到正确删除。 此清理发生在调用 `qApp->quit()`
之前。
2. `QQmlEngine::quit` 和 `QCoreApplication::quit` 之间的信号连接已更改
为 `Qt::QueuedConnection`,以避免在退出调用源自事件处理程序内(例如,光
标按钮按下/释放事件)时出现潜在问题。
3. 在 `Helper` 中引入了一个新的信号 `requestQuit()`,并发出该信号而不是
直接调用 `qApp->quit()`。 然后使用 `Qt::QueuedConnection` 将此信号连接到
`Treeland::quit()` 方法。
4. 在`tinywl`示例中,`QmlEngine` 对象现在是动态分配的,并在调
用 `app.exit()` 之前显式删除。 `Helper::requestQuit` 信号也连接到
`QmlEngine::deleteLater`。
这些更改确保在应用程序终止之前已正确清理所有相关对象,从而解决了断言失败
并防止了潜在的资源泄漏。
Influence:
1. 验证应用程序是否干净地退出,而不会出现与 `qw_buffer` 或其他资源相关的
任何断言失败。
2. 使用各种方法(例如,窗口关闭按钮、菜单项或键盘快捷键)测试退出应用
程序。
3. 确保在退出之前正确保存所有应用程序数据。
4. 通过使用 Helper 中的 setLockScreenImpl 调用手动创建和销毁 LockScreen
对象来测试 LockScreen 对象是否已正确销毁。
1. Changed the destruction timing of RenderControl. Using deleteLater()
on RenderControl caused a crash when OpenGL makeCurrent() was called.
This is because the RenderControl was being deleted in a deferred
manner, potentially after the OpenGL context was already being used
or destroyed.
2. Switched to immediate deletion of RenderControl in the
WOutputRenderWindow destructor to avoid the crash.
3. Modified WBufferRenderer to use std::unique_ptr for buffer
management to ensure timely unlocking.
Influence:
1. Verify that applications using WOutputRenderWindow do not crash
on shutdown.
2. Check resource usage related to graphics buffers to ensure proper
allocation and deallocation.
3. Run performance tests to ensure that the change in deletion timing
does not negatively impact rendering performance.
4. Test the texture provider to verify the buffer is handled correctly.
fix: 改善 RenderControl 的资源管理
1. 更改了 RenderControl 的销毁时机。在 RenderControl 上使用
deleteLater() 会导致调用 OpenGL makeCurrent() 时崩溃。这是因为
RenderControl 以延迟方式被删除,可能在 OpenGL 上下文已经被使用或销毁
之后。
2. 切换到在 WOutputRenderWindow 析构函数中立即删除 RenderControl,以避
免崩溃。
3. 修改 WBufferRenderer 以使用 std::unique_ptr 进行缓冲区管理,以确保及
时解锁。
Influence:
1. 验证使用 WOutputRenderWindow 的应用程序在关闭时不会崩溃。
2. 检查与图形缓冲区相关的资源使用情况,以确保正确分配和释放。
3. 运行性能测试以确保删除时机的变化不会对渲染性能产生负面影响。
4. 测试纹理提供程序以验证缓冲区是否已正确处理。
The WQuickCursor was using a raw pointer to WCursor, which could be
accessed after the WCursor object had been destroyed during application
shutdown, leading to a heap-use-after-free error. This change replaces
the raw pointer with a QPointer, ensuring that the WQuickCursor only
accesses the WCursor object if it is still valid.
Influence:
1. Run the application and exit to ensure no heap-use-after-free error
occurs.
2. Test cursor functionalities to ensure they still work as expected.
fix: 修复程序退出时堆释放后使用问题
WQuickCursor 使用指向 WCursor 的原始指针,该指针可能在应用程序关闭期间
WCursor 对象被销毁后被访问,从而导致堆释放后使用错误。此更改将原始指针替
换为 QPointer,确保 WQuickCursor 仅在 WCursor 对象仍然有效时才访问它。
Influence:
1. 运行应用程序并退出,确保不会发生堆释放后使用错误。
2. 测试光标功能,确保它们仍然按预期工作。
The verbosity of cursor input and touch event logs has been reduced
from `QtDebugMsg` to `QtInfoMsg`. The high volume of debug logs was
overwhelming during development and debugging, making it difficult to
identify important information. By reducing the default log level,
only essential cursor-related information will be displayed unless debug
logging is specifically enabled. This change improves the clarity and
usability of log output during development.
Influence:
1. Verify cursor functionality remains unaffected by the log level
change.
2. Confirm that important cursor events are still logged at the
`QtInfoMsg` level.
3. Enable debug logging to ensure detailed cursor information is
available when needed.
4. Test with different input devices (mouse, touchpad, touch screen) to
ensure consistent behavior.
refactor: 降低光标相关日志的详细程度
光标输入和触摸事件日志的详细程度已从 `QtDebugMsg` 降低到 `QtInfoMsg`。
大量的调试日志在开发和调试过程中造成了信息过载,难以识别重要信息。 通过
降低默认日志级别,除非专门启用调试日志记录,否则只会显示基本的光标相关信
息。 此更改提高了开发期间日志输出的清晰度和可用性。
Influence:
1. 验证光标功能是否未受日志级别更改的影响。
2. 确认重要的光标事件仍然以 `QtInfoMsg` 级别记录。
3. 启用调试日志记录以确保在需要时可以使用详细的光标信息。
4. 使用不同的输入设备(鼠标、触摸板、触摸屏)进行测试,以确保行为一致。
1. Set server socket to non-blocking mode to prevent accept() calls from
blocking the main thread indefinitely.
2. Improved wl_os_accept_cloexec function to use accept4 with SOCK_CLOEXEC
flag as the preferred method on modern Linux systems, with fallback to
traditional accept() + fcntl approach for compatibility.
3. Added proper error handling for ENOSYS case when accept4 is not supported.
The blocking issue occurred when the Wayland server was waiting for client
connections, causing the entire compositor to freeze. This fix follows the
same pattern used in libwayland for robust socket handling.
Log: Fixed Wayland server socket blocking in accept() calls
Influence:
1. Test server startup and client connection establishment
2. Verify proper handling of multiple concurrent client connections
3. Check compatibility on systems without accept4 support
4. Ensure no regression in socket file descriptor management
修复:修复Wayland服务器连接处理中的socket阻塞问题
1. 将服务器socket设置为非阻塞模式,防止accept()调用无限期阻塞主线程。
2. 改进wl_os_accept_cloexec函数,在现代Linux系统上优先使用带SOCK_CLOEXEC
标志的accept4方法,同时为兼容性保留传统的accept() + fcntl方法作为后备。
3. 为不支持accept4的ENOSYS情况添加了适当的错误处理。
当Wayland服务器等待客户端连接时会发生阻塞问题,导致整个合成器冻结。此修复
遵循libwayland中用于健壮socket处理的相同模式。
Log: 修复Wayland服务器socket在accept()调用中的阻塞问题
Influence:
1. 测试服务器启动和客户端连接建立
2. 验证多个并发客户端连接的正确处理
3. 检查在不支持accept4的系统上的兼容性
4. 确保socket文件描述符管理中没有回归
1. Fixed a crash issue where clients created through the security
context could not obtain the corresponding WClient object.
2. Clients created via security context use a new socket connection,
which is not managed by WSocket by default.
3. The wlroots protocol provides limited information for monitoring
such wl_clients.
4. This commit adapts the wlroots implementation: in
`security_context_handle_commit`, a new WSocket object is created for
the listening socket, and the new wl_client object created from this
socket is added to WClient for management.
Influence:
1. Test the creation of clients using the security context.
2. Verify that the created clients can correctly obtain the WClient
object.
3. Ensure that newly created sockets are correctly managed.
修复:修复通过安全上下文创建的客户端崩溃问题
1. 修复了通过安全上下文创建的客户端无法获取对应的 WClient 对象导致崩溃的
问题。
2. 通过安全上下文创建的客户端使用新的套接字连接,默认情况下不由 WSocket
管理。
3. wlroots 协议为监控此类 wl_clients 提供的相关信息有限。
4. 本次提交采纳了 wlroots 的实现:在 `security_context_handle_commit`
中,为监听的套接字创建一个新的 WSocket 对象,并将由此套接字创建的新
wl_client 对象添加到 WClient 中进行管理。
Influence:
1. 测试使用安全上下文创建客户端的过程。
2. 验证创建的客户端能否正确获取 WClient 对象。
3. 确保新创建的套接字能够得到正确的管理。
- Added include for `wxdgtoplevelsurface.h`
- Added include for `qwxdgshell.h`
- Handled initialization check for XDG toplevel surface
- Updated logic to set owns output and ensure surface position validity for XDG toplevel surface
- Added support to set Xwayland position from surface when initialized
Background:
When the window is destroyed while being dragged, `endMoveResize` is triggered. If `config` function is called after the window is destroyed, it will crash. Therefore, the check for `initialized` is added due to its reset in `reset_xdg_surface` where an `xdg_surface` implementation is reset under the following conditions:
1) A surface is unmapped due to a commit with NULL buffer
2) The `xdg_surface` role object is destroyed
3) `wlr_xdg_surface` is destroyed
1. Fixed an issue where the client window's refresh rate was incorrect
when using multiple monitors.
2. The problem was caused by sending `frame_done` notifications to the
client window regardless of which screen refreshed. This resulted in
double the `frame_done` notifications being sent when using two screens.
3. The solution is to only send `frame_done` notifications to the
surface when the screen with the highest refresh rate, where the surface
is located, commits. This behavior is consistent with how wlroots and
mutter handle it.
4. The code was modified in `WOutputRenderWindow::doRender` to track
which outputs were actually committed and then the `WSurfaceItem` checks
that it only sends `notifyFrameDone` if the `framePacingOutput` was
committed.
5. Added logging for when there is no `WOutputRenderWindow`.
Influence:
1. Test with multiple monitors with different refresh rates.
2. Verify that the client window's refresh rate matches the refresh rate
of the screen it's primarily on.
3. Use a tool like http://testufo.com/ to visually confirm the correct
refresh rate.
4. Test moving the window between screens with different refresh rates
and observe the refresh rate change.
fix: 修复多显示器刷新率错误问题
1. 修复了使用多个显示器时客户端窗口刷新率不正确的问题。
2. 问题的原因是无论哪个屏幕刷新,都会向客户端窗口发送 `frame_done` 通
知。这导致在使用两个屏幕时发送双倍的 `frame_done` 通知。
3. 解决方案是仅在表面所在的具有最高刷新率的屏幕提交时才向该表面发送
`frame_done` 通知。此行为与 wlroots 和 mutter 的处理方式一致。
4. 修改了 `WOutputRenderWindow::doRender` 中的代码以跟踪实际提交的输出,
然后 `WSurfaceItem` 检查它是否仅在 `framePacingOutput` 已提交时才发送
`notifyFrameDone`。
5. 添加了在没有 `WOutputRenderWindow` 时的日志记录。
Influence:
1. 使用具有不同刷新率的多个显示器进行测试。
2. 验证客户端窗口的刷新率与其主要所在的屏幕的刷新率相匹配。
3. 使用 http://testufo.com/ 等工具以直观地确认正确的刷新率。
4. 测试在具有不同刷新率的屏幕之间移动窗口并观察刷新率的变化。
1. The previous logic only redrew the surface when the buffer changed,
which is insufficient.
2. Firefox frequently updates the frame callback list using
`WLR_SURFACE_STATE_FRAME_CALLBACK_LIST`. Receiving such commits should
also trigger a redraw to trigger the frame done event for the surface.
3. This fixes an issue where Firefox windows would often not refresh
until the mouse was moved.
Influence:
1. Verify that Firefox windows now refresh correctly without requiring
mouse movement.
2. Ensure that other applications are not negatively affected by this
change.
3. Check for any performance regressions related to the increased redraw
frequency.
fix: 当帧回调列表更新时重绘
1. 之前的逻辑仅在缓冲区更改时才重绘表面,这不足够。
2. Firefox 经常使用 `WLR_SURFACE_STATE_FRAME_CALLBACK_LIST` 更新帧回调列
表。收到此类提交也应触发重绘,以触发表面的帧完成事件。
3. 这修复了 Firefox 窗口经常不刷新直到鼠标移动的问题。
Influence:
1. 验证 Firefox 窗口现在可以正确刷新,而无需移动鼠标。
2. 确保其他应用程序不会受到此更改的负面影响。
3. 检查与增加的重绘频率相关的任何性能下降。
1. Add wlr_buffer.h header to access buffer locking functionality
2. Lock buffer during copy operation to prevent race conditions
3. Implement comprehensive validation of source and destination buffers
4. Add dynamic constraint updating when buffer size mismatches occur
5. Handle client buffer source explicitly for better compatibility
6. Add detailed logging for debugging copy operations
The changes fix a critical crash that occurred during window resizing by
ensuring proper buffer synchronization and validation. The fix includes
safety checks to validate buffer dimensions, pointer validity, and
proper constraint handling when sizes change. By locking buffers during
copy operations and properly handling client buffer sources, we prevent
race conditions that could lead to crashes during window resizing.
fix: 修复录窗口时resize崩溃
1. 添加 wlr_buffer.h 头文件以访问缓冲区锁定功能
2. 在复制操作期间锁定缓冲区以防止竞争条件
3. 实现对源缓冲区和目标缓冲区的全面验证
4. 在缓冲区大小不匹配时动态更新约束条件
5. 显式处理客户端缓冲区源以提高兼容性
6. 添加详细的日志记录用于调试复制操作
When cooperating with DDM, switching VT will not drop DRM FD. This makes
treeland still able to draw to the DRM after VT switch, which will cause
wrong display rendering when switching VT too quickly. This commit
cooperate new treeland-ddm-v1 protocol and expose interface to enable /
disable global rendering, which is used in DDM to control render before
/ after TTY switching, to solve the render issue.
1. Remove dependence of seatd-dde.service, use system provided seatd
service;
2. Add private wayland protocol treeland-private-protocol.xml for IPC
3. Acquire VT control immediately after first rendering complete;
4. Call DDM to switch VT when Ctrl+Alt+Fx is pressed, if available;
5. Expose wayland request for deactivate and re-activate session to DDM;
1. Replace manual CMake configuration with --preset ci in all ArchLinux
workflows
2. Add new CI build preset in CMakePresets.json with -Werror enabled
3. Remove redundant per-project CMake configuration steps
4. Simplify workflow steps by combining configure and build phases
5. Maintain compatibility with existing build requirements while
standardizing
The changes standardize build configuration across projects using a
centralized CMake preset. This ensures consistent build behavior while
maintaining the strict -Werror flag for CI builds. The update simplifies
workflow maintenance and improves build reliability by using CMake's
modern preset system.
1. Remove `WBufferRenderer::resetTextureProvider` to avoid accidentally
cleaning the cached buffer in `WBufferRenderer` when switching from a
software cursor to a hardware cursor.
2. The root cause was that switching from a software cursor
to a hardware cursor inadvertently cleared the cached buffer
in `WBufferRenderer`, causing the buffer referenced by
`BufferRendererProxy` to become null.
3. The `resetTextureProvider` function was originally introduced in
the `WOutputLayer` implementation (https://github.com/vioken/waylib/
commit/ea814c44), and the buffer lock/unlock mechanism was introduced
in https://github.com/vioken/waylib/commit/35fdcb72. The lock/unlock
mechanism is a new design, so manually resetting the buffer is no longer
necessary.
4. Update `WSGTextureProvider::setBuffer` to emit `textureChanged()`
signal when `buffer` is not null and the buffer object is not changed,
but maybe the buffer's content is changed.
Influence:
1. Verify that the cursor no longer flickers during screen recording,
especially when switching between software and hardware cursors.
2. Test screen sharing and ensure that the shared content is displayed
correctly without any visual artifacts.
3. Check the buffer management to ensure that buffers are properly
locked and unlocked, and that no memory leaks occur.
fix: 修复录屏时光标闪烁问题
1. 移除 `WBufferRenderer::resetTextureProvider` 以避免在从软光标切换到
硬光标时意外清理 `WBufferRenderer` 中的缓存 buffer。
2. 根本原因是,从软光标切换到硬光标时,无意中清除了 `WBufferRenderer`
中的缓存 buffer,导致 `BufferRendererProxy` 引用的 buffer 变为 null。
3. `resetTextureProvider` 函数最初是在 `WOutputLayer` 实现中引入的
(https://github.com/vioken/waylib/commit/ea814c44),buffer 锁/解锁机制是
在 https://github.com/vioken/waylib/commit/35fdcb72 中引入的。 锁/解锁机
制是一种新的设计,因此不再需要手动重置 buffer。
4. 更新 `WSGTextureProvider::setBuffer`,当 `buffer` 不为 null 且
buffer 对象没有更改时,发出 `textureChanged()` 信号,但 buffer 的内容可
能会更改。
Influence:
1. 验证在屏幕录制过程中,尤其是在软件和硬件光标之间切换时,光标不再
闪烁。
2. 测试屏幕共享,确保共享内容显示正确,没有任何视觉伪影。
3. 检查 buffer 管理,确保 buffer 被正确锁定和解锁,并且没有发生内存
泄漏。
Add detailed logging guidelines for both treeland and waylib modules,
and update logging implementation across multiple files to follow the
new standards.
1. Create comprehensive logging documentation covering:
- Category organization patterns for treeland and waylib
- Log level usage guidelines
- Best practices for message formatting and context
- Implementation examples for both module types
- Debugging tips and common mistakes to avoid
2. Update waylib modules with new logging categories:
- wcursor.cpp: Add detailed cursor-related categories and update
logging statements
- winputdevice.cpp: Add input device category and improve debug
messages
- woutput.cpp: Add output-related categories and enhance buffer/
output logging
- wseat.cpp: Replace old logging categories with new structured ones
- wsocket.cpp: Add socket management category and improve connection
logging
3. Remove outdated logging categories:
- Remove lcGeneral from wglobal.cpp
- Remove obsolete qLcWlrCursor and related categories
4. Improve logging quality throughout:
- Add contextual information to log messages
- Use appropriate log levels for different message types
- Add missing debug statements for important state changes
- Fix incorrect
- Initialize Content pointer to nullptr for safety.
- Use Qt::UniqueConnection when connecting BlitTextureProvider::textureChanged
to Content::update, both in Content and WRenderBufferBlitterPrivate, to avoid
multiple identical connections and ensure the slot is triggered only once per
signal emission.
- Add QMetaObject::Connection and QMutex members to WQuickTextureProxyPrivate
to track and protect the textureChanged signal connection.
- Disconnect previous textureChanged connections in initSourceItem to
avoid dangling or duplicate connections.
- Use a mutex to ensure thread-safety when establishing the textureChanged
connection in updatePaintNode.
This change helps prevent occasional crashes when moving the cursor by ensuring
signals are properly managed and connections are safely handled.
Fixes: #494
Log:
Use the q pointer as the context object host.
Use QPointer to prevent crash when WOutputCursor is
destroyed during signal handling.
Fixes: linuxdeepin/treeland#490
Log:
1. Replace generic static_assert with Qt-specific type check
2. Use QtPrivate::HasQ_OBJECT_Macro to ensure proper QObject inheritance
3. Add explicit QObject include for better header dependency management
4. Maintain existing functionality while improving compile-time safety
The change replaces a generic type trait check with Qt's specific type
validation mechanism, ensuring that template parameters properly inherit
from QObject. This provides better error messages and stronger type
safety guarantees during compilation.
fix: 改进渲染缓冲节点的类型安全性
1. 用 Qt 特定的类型检查替换通用的 static_assert
2. 使用 QtPrivate::HasQ_OBJECT_Macro 确保正确的 QObject 继承关系
3. 添加显式的 QObject 包含头文件以改善头文件依赖管理
4. 在保持现有功能的同时提高编译时的安全性
该修改将通用类型特征检查替换为 Qt 的特定类型验证机制,确保模板参数正确地
继承自 QObject。这提供了更好的错误提示信息,并在编译时提供了更强的类型安
全保证。
1. Added QT_MESSAGELOGCONTEXT definition to enable detailed logging in
Qt applications
2. Downgraded cursor shape manager protocol version from 2 to 1
temporarily due to wlroots version constraints
3. The changes help with debugging while maintaining compatibility with
current wlroots version (pre-0.20)
chore: 启用 Qt 日志上下文并调整光标形状管理器版本
1. 添加 QT_MESSAGELOGCONTEXT 定义以启用 Qt 应用程序的详细日志记录功能
2. 由于 wlroots 版本限制(尚未升级到 0.20),临时将光标形状管理器协议版
本从 2 降级为 1
3. 这些更改有助于调试,同时保持与当前 wlroots 版本的兼容性
Update the version number of the CURSOR_SHAPE_MANAGER_V1 protocol from
1 to 2 to reflect recent implementation changes and ensure protocol
version consistency across components.
refactor: 更新光标形状管理器版本至 2
将 CURSOR_SHAPE_MANAGER_V1 协议的版本号从 1 更新至 2,以反映最近的实现更
改,并确保组件间的协议版本一致性。
1. Remove setOutputProxy method from Helper class
2. Delete corresponding declaration in header file
3. The function was never implemented and not used anywhere in the
codebase
4. Cleaning up unused code improves code maintainability and reduces
technical debt
fix: 移除未使用的 setOutputProxy 函数
1. 从 Helper 类中移除 setOutputProxy 方法
2. 同时删除头文件中的相应声明
3. 该函数从未被实现且代码库中没有任何使用
4. 清理未使用的代码可提高代码可维护性并减少技术债务
Replace all instances of Q_EMIT with the modern signal
emission syntax
and replace Q_SLOTS with the modern slots syntax. Also add
[[maybe_unused]] attributes to parameters that are intentionally unused.
fix: 替换 Q_EMIT 和 Q_SLOTS 为 Qt5 风格的信号/槽
替换所有 Q_EMIT 为现代风格的信号发射语法,并将 Q_SLOTS 替换为现代风格的槽语法。
同时为故意未使用的参数添加 [[maybe_unused]] 属性。
1. Fix order of member variable initialization in qw_interface
constructor
2. Move add_compile_options after ASAN flags to ensure proper priority
3. Fix member variable order in TreelandConfig to match declaration
4. Add [[maybe_unused]] attribute to unused function parameters
5. Fix surface wrapper bitfield member ordering
6. Fix cursor image index comparison type mismatch
7. Fix various minor code style and structure issues
fix: 解决编译警告并改进代码结构
1. 修复 qw_interface 构造函数中成员变量的初始化顺序
2. 将 add_compile_options 移至 ASAN 标志之后以确保优先级
3. 修复 TreelandConfig 中成员变量顺序以匹配声明
4. 为未使用的函数参数添加 [[maybe_unused]] 属性
5. 修复 surface wrapper 位域成员顺序
6. 修复光标图像索引比较的类型不匹配问题
7. 解决其他次要的代码风格和结构问题
Added resetGlState() call immediately after ending frame to ensure correct
OpenGL state before committing outputs in doRender(), improving GPU context
handling, prevent gles2-render exception in wlroots.
Fixes: linuxdeepin/treeland#488
Log:
The QRhi-based render() implementation in WSGRenderFootprintNode relies on explicit rendering
flags to ensure correct and efficient rendering behavior. This commit introduces an override
for the flags() method, returning a combination of QSGRenderNode::NoExternalRendering and
QSGRenderNode::BoundedRectRendering. These flags clarify the rendering node's capabilities
to the Qt scene graph, preventing potential rendering issues or crashes.
This change may address issues reported in https://github.com/linuxdeepin/treeland/issues/478.
Log:
1. Replace Q_ASSERT with proper error handling in image capture code
2. Add comprehensive validation checks for null pointers and invalid
states
3. Replace manual memory management with RAII-style helper classes
4. Move constraint building logic to dedicated helper struct
5. Add proper copyright headers to source files
6. Update CMakeLists.txt with consistent TODO markers
7. Implement WPixmanRegion class for automatic region management
8. Add detailed debug logging for capture operations
The changes enhance code reliability by properly handling error
conditions instead of relying on assertions, improve memory safety
through better resource management, and make the code more maintainable
with clearer structure and documentation.
fix: 改进图像捕获错误处理和代码结构
1. 在图像捕获代码中替换 Q_ASSERT 为适当的错误处理
2. 添加全面的空指针和无效状态验证检查
3. 使用 RAII 风格的辅助类替代手动内存管理
4. 将约束构建逻辑移至专用辅助结构体
5. 为源文件添加正确的版权标头
6. 在 CMakeLists.txt 中使用一致的 TODO 标记
7. 实现 WPixmanRegion
Qt will create virtual device for QInputEvent when no physical device
available (e.g. switched to another VT), which will leads to a failed
assertion and make treeland crash. This commit applies a special guarded
getter for such case.
* fix: Handle VT switching keys
This commit addresses an issue where the XF86Switch_VT_1 to
XF86Switch_VT_12 keys were not properly handled by Qt. Qt does not
directly support these keys. The fix involves converting these keys to
Ctrl+Alt+F1 through Ctrl+Alt+F12 when the Ctrl and Alt modifiers are
already pressed. This enables users to switch virtual terminals within
the Wayland environment using these key combinations, matching the
expected behavior on traditional Linux systems. This conversion only
happens when Ctrl+Alt are already pressed, preventing accidental mapping
of other keys.
fix: 处理 VT 切换键
此提交解决了一个 Qt 无法正确处理 XF86Switch_VT_1 到 XF86Switch_VT_12
键的问题。Qt 不直接支持这些键。此修复包括将这些键转换为 Ctrl+Alt+F1
到 Ctrl+Alt+F12(如果 Ctrl 和 Alt 修改键已被按下)。这使得用户能够在
Wayland 环境中使用这些组合键切换虚拟终端,从而匹配传统 Linux 系统上的预
期行为。此转换仅在 Ctrl+Alt 已被按下时发生,防止意外映射其他键。
1. Introduce `default.nix` at the root to define Nix packages and
dependencies
2. Migrate CMakeLists.txt to use `option()` and `add_feature_info()` for
better feature management
3. Update `flake.nix` to import and organize Nix modules and packages
4. Modify `nix/default.nix` to use `nix-filter.lib` and add new
dependencies like `qwlroots` and `waylib`
5. Update `waylib/flake.nix` and `waylib/nix/default.nix` to improve
test support and source filtering
feat: 添加 Nix flake 支持以优化项目配置
1. 在项目根目录引入 `default.nix` 来定义 Nix 包及其依赖
2. 将 CMakeLists.txt 中的配置改为使用 `option()` 和 `add_feature_info()`
以更好地管理功能选项
3. 更新 `flake.nix` 以导入并组织 Nix 模块和包
4. 修改 `nix/default.nix` 使用 `nix-filter.lib` 并添加 `qwlroots` 和
`waylib` 等包
This commit enforces the use of Ninja as the build system during the
debian package creation process for treeland, qwlroots, and waylib.
This change was made to significantly improve build times, as Ninja
generally offers faster and more efficient builds compared to the
default make system. The changes involve adding `ninja-build` as a
build dependency in the `debian/control` files and adding `-GNinja` to
the `dh_auto_configure` commands in the `debian/rules` files for all
three packages. This ensures that CMake uses Ninja to generate the build
files.
chore: 在 deb 打包过程中强制使用 Ninja 构建
此提交强制在 treeland、qwlroots 和 waylib 的 debian 包创建过程中使用
Ninja 作为构建系统。 此更改旨在显着缩短构建时间,因为与默认的 make 系统
相比,Ninja 通常提供更快、更高效的构建。 更改包括在 `debian/control` 文
件中添加 `ninja-build` 作为构建依赖项,并在所有三个包的 `debian/rules`
文件中的 `dh_auto_configure` 命令中添加 `-GNinja`。 这确保 CMake 使用
Ninja 来生成构建文件。
1. Fixes and updates CI configurations for treeland.
2. Merges `reuse` files for comprehensive license information.
3. Updates dependencies in `debian/control` to align with the combined
codebase.
4. Introduces separate build workflows for `waylib` and `qwlroots` to
ensure they can be built independently.
5. This ensures modularity and prevents accidental breakages during
future development, maintaining the option to separate these components
again.
chore: 修复 CI 并启用独立构建
1. 修复并更新了 treeland 的 CI 配置。
2. 合并 `reuse` 文件以提供全面的许可证信息。
3. 更新了 `debian/control` 中的依赖项,以与合并的代码库保持一致。
4. 引入了 `waylib` 和 `qwlroots` 的独立构建工作流程,以确保它们可以独立
构建。
5. 确保模块化,防止未来开发过程中意外损坏,保持再次分离这些组件的选项。
Removed qwlroots and waylib from git submodules, and merged their
source code directly into the treeland repository. This change
reduces development overhead during the rapid iteration phase of
treeland, as frequent coordinated changes are required across
treeland, qwlroots, and waylib. By merging them now, we simplify
development and maintenance. In the future, when the project
stabilizes, we may consider splitting them back into independent
repositories.
To prepare for this possible future split, the original directory
structures and all files from qwlroots and waylib are preserved and
placed under separate subdirectories in treeland.
Original project commits at the time of merge:
- qwlroots: https://github.com/vioken/qwlroots(00b09f9047ac0eaf26757e8af3d31f35d22bbce3)
- waylib: https://github.com/vioken/waylib(9564027cc6c89dc5262c03d183f743b71a0e621e)
重构:将 qwlroots 和 waylib 项目代码合并到 treeland
将 qwlroots 和 waylib 从 git 子模块中移除,直接把它们的代码合并
到 treeland 项目中。这样做是为了在 treeland 快速迭代期间减少开发
成本,因为经常需要同时修改 treeland、waylib 和 qwlroots,合并后
开发会更方便,待项目稳定后再考虑重新拆分为独立项目。
为方便将来拆分,保留了原项目的目录结构和全部文件,并使用独立子
目录维护代码。
合并时原项目的提交信息如下:
- qwlroots: https://github.com/vioken/qwlroots(00b09f9047ac0eaf26757e8af3d31f35d22bbce3)
- waylib: https://github.com/vioken/waylib(9564027cc6c89dc5262c03d183f743b71a0e621e)