Merge branch 'cursor-outputs-update' into 'master'

cursor: add outputs_update event

See merge request wlroots/wlroots!4065
This commit is contained in:
Simon Ser 2023-06-04 20:54:33 +00:00
commit 8aa4eae7b6
2 changed files with 47 additions and 0 deletions

View file

@ -29,6 +29,11 @@ struct wlr_input_device;
struct wlr_box;
struct wlr_cursor_state;
struct wlr_cursor_outputs_update_event {
struct wlr_output *const *outputs;
size_t outputs_len;
};
struct wlr_cursor {
struct wlr_cursor_state *state;
double x, y;
@ -72,6 +77,8 @@ struct wlr_cursor {
struct wl_signal tablet_tool_proximity;
struct wl_signal tablet_tool_tip;
struct wl_signal tablet_tool_button;
struct wl_signal outputs_update; // struct wlr_cursor_outputs_update_event
} events;
void *data;

View file

@ -78,6 +78,9 @@ struct wlr_cursor_state {
struct wl_listener layout_add;
struct wl_listener layout_change;
struct wl_listener layout_destroy;
struct wl_array outputs;
uint64_t prev_output_mask;
};
struct wlr_cursor *wlr_cursor_create(void) {
@ -128,6 +131,8 @@ struct wlr_cursor *wlr_cursor_create(void) {
wl_signal_init(&cur->events.tablet_tool_button);
wl_signal_init(&cur->events.tablet_tool_proximity);
wl_signal_init(&cur->events.outputs_update);
cur->x = 100;
cur->y = 100;
@ -142,6 +147,7 @@ static void output_cursor_destroy(
wl_list_remove(&output_cursor->layout_output_destroy.link);
wl_list_remove(&output_cursor->link);
wlr_output_cursor_destroy(output_cursor->output_cursor);
output_cursor->cursor->state->prev_output_mask = 0;
free(output_cursor);
}
@ -205,6 +211,7 @@ void wlr_cursor_destroy(struct wlr_cursor *cur) {
cursor_device_destroy(device);
}
wl_array_release(&cur->state->outputs);
free(cur->state);
free(cur);
}
@ -230,6 +237,10 @@ static void cursor_warp_unchecked(struct wlr_cursor *cur,
return;
}
assert(cur->state->outputs.size == 0);
size_t i = 0;
uint64_t output_mask = 0;
struct wlr_cursor_output_cursor *output_cursor;
wl_list_for_each(output_cursor, &cur->state->output_cursors, link) {
double output_x = lx, output_y = ly;
@ -237,8 +248,36 @@ static void cursor_warp_unchecked(struct wlr_cursor *cur,
output_cursor->output_cursor->output, &output_x, &output_y);
wlr_output_cursor_move(output_cursor->output_cursor,
output_x, output_y);
assert(i < 64);
uint64_t output_bit = 1 << i;
i++;
if (!output_cursor->output_cursor->visible) {
continue;
}
output_mask |= output_bit;
struct wlr_output **output_ptr =
wl_array_add(&cur->state->outputs, sizeof(struct wlr_output *));
if (output_ptr == NULL) {
wlr_log_errno(WLR_ERROR, "Allocation failed");
break;
}
*output_ptr = output_cursor->output_cursor->output;
}
if (output_mask != cur->state->prev_output_mask) {
struct wlr_cursor_outputs_update_event event = {
.outputs = cur->state->outputs.data,
.outputs_len = cur->state->outputs.size / sizeof(struct wlr_output *),
};
wl_signal_emit_mutable(&cur->events.outputs_update, &event);
cur->state->prev_output_mask = output_mask;
}
cur->state->outputs.size = 0;
cur->x = lx;
cur->y = ly;
}
@ -934,6 +973,7 @@ static void layout_add(struct wlr_cursor_state *state,
&output_cursor->layout_output_destroy);
wl_list_insert(&state->output_cursors, &output_cursor->link);
state->prev_output_mask = 0;
}
static void handle_layout_add(struct wl_listener *listener, void *data) {