Compare commits

...

6 commits

Author SHA1 Message Date
Simon Ser
90f9f59041 xwayland: try flushing immediately in xwm_schedule_flush()
wl_event_source_fd_update() goes through another event loop cycle, which
delays writes. This extra cycle was introduced in 6ada67da9b
("xwayland/xwm: implement somewhat asynchronous request flushing").

Try flushing the X11 WM FD immediately if we can.

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/4044
2026-02-04 00:14:49 +01:00
rewine
7cb4e30bfd
wlr_cursor: fix event type in handle_tablet_tool_button 2026-02-03 21:25:50 +08:00
rewine
98196bbd89
wlr_cursor: add comments for signal parameters 2026-02-03 21:24:32 +08:00
rewine
4fe51aa439 types: Simplify wlr_keyboard_group_destroy
If the wlr_keyboard_group_remove_keyboard function is expanded, the code
is equivalent to:

```
	wl_list_for_each_safe(device, tmp_device, &group->devices, link) {
		struct wlr_keyboard_group *_group = group;
		struct wlr_keyboard *_keyboard = device->keyboard;
		struct keyboard_group_device *_device, *_tmp;
		wl_list_for_each_safe(_device, _tmp, &_group->devices, link) {
			if (_device->keyboard == _keyboard) {
				remove_keyboard_group_device(_device);
				continue;
			}
		}
	}
```

It's just running one more loop meaninglessly.
2026-02-02 10:46:20 -05:00
liupeng
12c9502edf render/drm_syncobj: fix function name in drmSyncobjTimelineWait() error log
Signed-off-by: liupeng <liupeng01@kylinos.cn>
2026-02-02 09:12:39 +08:00
liupeng
7f87e258b2 render/drm_syncobj: drop unnecessary drmSyncobjTimelineWait() arg
Signed-off-by: liupeng <liupeng01@kylinos.cn>
2026-02-02 09:11:41 +08:00
5 changed files with 40 additions and 25 deletions

View file

@ -49,30 +49,30 @@ struct wlr_cursor {
* your responsibility.
*/
struct {
struct wl_signal motion;
struct wl_signal motion_absolute;
struct wl_signal button;
struct wl_signal axis;
struct wl_signal motion; // struct wlr_pointer_motion_event
struct wl_signal motion_absolute; // struct wlr_pointer_motion_absolute_event
struct wl_signal button; // struct wlr_pointer_button_event
struct wl_signal axis; // struct wlr_pointer_axis_event
struct wl_signal frame;
struct wl_signal swipe_begin;
struct wl_signal swipe_update;
struct wl_signal swipe_end;
struct wl_signal pinch_begin;
struct wl_signal pinch_update;
struct wl_signal pinch_end;
struct wl_signal hold_begin;
struct wl_signal hold_end;
struct wl_signal swipe_begin; // struct wlr_pointer_swipe_begin_event
struct wl_signal swipe_update; // struct wlr_pointer_swipe_update_event
struct wl_signal swipe_end; // struct wlr_pointer_swipe_end_event
struct wl_signal pinch_begin; // struct wlr_pointer_pinch_begin_event
struct wl_signal pinch_update; // struct wlr_pointer_pinch_update_event
struct wl_signal pinch_end; // struct wlr_pointer_pinch_end_event
struct wl_signal hold_begin; // struct wlr_pointer_hold_begin_event
struct wl_signal hold_end; // struct wlr_pointer_hold_end_event
struct wl_signal touch_up;
struct wl_signal touch_down;
struct wl_signal touch_motion;
struct wl_signal touch_cancel;
struct wl_signal touch_up; // struct wlr_touch_up_event
struct wl_signal touch_down; // struct wlr_touch_down_event
struct wl_signal touch_motion; // struct wlr_touch_motion_event
struct wl_signal touch_cancel; // struct wlr_touch_cancel_event
struct wl_signal touch_frame;
struct wl_signal tablet_tool_axis;
struct wl_signal tablet_tool_proximity;
struct wl_signal tablet_tool_tip;
struct wl_signal tablet_tool_button;
struct wl_signal tablet_tool_axis; // struct wlr_tablet_tool_axis_event
struct wl_signal tablet_tool_proximity; // struct wlr_tablet_tool_proximity_event
struct wl_signal tablet_tool_tip; // struct wlr_tablet_tool_tip_event
struct wl_signal tablet_tool_button; // struct wlr_tablet_tool_button_event
} events;
void *data;

View file

@ -167,10 +167,9 @@ bool wlr_drm_syncobj_timeline_check(struct wlr_drm_syncobj_timeline *timeline,
etime = ETIME;
#endif
uint32_t signaled_point;
int ret = drmSyncobjTimelineWait(timeline->drm_fd, &timeline->handle, &point, 1, 0, flags, &signaled_point);
int ret = drmSyncobjTimelineWait(timeline->drm_fd, &timeline->handle, &point, 1, 0, flags, NULL);
if (ret != 0 && ret != -etime) {
wlr_log_errno(WLR_ERROR, "drmSyncobjWait() failed");
wlr_log_errno(WLR_ERROR, "drmSyncobjTimelineWait() failed");
return false;
}

View file

@ -956,7 +956,7 @@ static void handle_tablet_tool_axis(struct wl_listener *listener, void *data) {
static void handle_tablet_tool_button(struct wl_listener *listener,
void *data) {
struct wlr_tablet_tool_button *event = data;
struct wlr_tablet_tool_button_event *event = data;
struct wlr_cursor_device *device;
device = wl_container_of(listener, device, tablet_tool_button);
wl_signal_emit_mutable(&device->cursor->events.tablet_tool_button, event);

View file

@ -308,7 +308,7 @@ void wlr_keyboard_group_remove_keyboard(struct wlr_keyboard_group *group,
void wlr_keyboard_group_destroy(struct wlr_keyboard_group *group) {
struct keyboard_group_device *device, *tmp_device;
wl_list_for_each_safe(device, tmp_device, &group->devices, link) {
wlr_keyboard_group_remove_keyboard(group, device->keyboard);
remove_keyboard_group_device(device);
}
// Now group->keys might not be empty if a wlr_keyboard has emitted

View file

@ -1,5 +1,6 @@
#include <assert.h>
#include <drm_fourcc.h>
#include <poll.h>
#include <stdlib.h>
#include <unistd.h>
#include <wlr/types/wlr_buffer.h>
@ -2881,5 +2882,20 @@ xcb_connection_t *wlr_xwayland_get_xwm_connection(
}
void xwm_schedule_flush(struct wlr_xwm *xwm) {
struct pollfd pollfd = {
.fd = xcb_get_file_descriptor(xwm->xcb_conn),
.events = POLLOUT,
};
if (poll(&pollfd, 1, 0) < 0) {
wlr_log(WLR_ERROR, "poll() failed");
return;
}
// If we can write immediately, do so
if (pollfd.revents & POLLOUT) {
xcb_flush(xwm->xcb_conn);
return;
}
wl_event_source_fd_update(xwm->event_source, WL_EVENT_READABLE | WL_EVENT_WRITABLE);
}