mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-02 03:45:58 +01:00
wlr_output: update cursor when scale changed
Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3699
This commit is contained in:
parent
61903ed66b
commit
73db481037
1 changed files with 22 additions and 23 deletions
|
@ -159,6 +159,7 @@ static void output_cursor_destroy(struct wlr_cursor_output_cursor *output_cursor
|
||||||
cursor_output_cursor_reset_image(output_cursor);
|
cursor_output_cursor_reset_image(output_cursor);
|
||||||
wl_list_remove(&output_cursor->layout_output_destroy.link);
|
wl_list_remove(&output_cursor->layout_output_destroy.link);
|
||||||
wl_list_remove(&output_cursor->link);
|
wl_list_remove(&output_cursor->link);
|
||||||
|
wl_list_remove(&output_cursor->output_commit.link);
|
||||||
wlr_output_cursor_destroy(output_cursor->output_cursor);
|
wlr_output_cursor_destroy(output_cursor->output_cursor);
|
||||||
free(output_cursor);
|
free(output_cursor);
|
||||||
}
|
}
|
||||||
|
@ -409,9 +410,6 @@ void wlr_cursor_move(struct wlr_cursor *cur, struct wlr_input_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cursor_output_cursor_reset_image(struct wlr_cursor_output_cursor *output_cursor) {
|
static void cursor_output_cursor_reset_image(struct wlr_cursor_output_cursor *output_cursor) {
|
||||||
wl_list_remove(&output_cursor->output_commit.link);
|
|
||||||
wl_list_init(&output_cursor->output_commit.link);
|
|
||||||
|
|
||||||
output_cursor->xcursor = NULL;
|
output_cursor->xcursor = NULL;
|
||||||
output_cursor->xcursor_index = 0;
|
output_cursor->xcursor_index = 0;
|
||||||
if (output_cursor->xcursor_timer != NULL) {
|
if (output_cursor->xcursor_timer != NULL) {
|
||||||
|
@ -488,20 +486,6 @@ static void output_cursor_set_xcursor_image(struct wlr_cursor_output_cursor *out
|
||||||
wl_event_source_timer_update(output_cursor->xcursor_timer, image->delay);
|
wl_event_source_timer_update(output_cursor->xcursor_timer, image->delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void output_cursor_output_handle_output_commit(
|
|
||||||
struct wl_listener *listener, void *data) {
|
|
||||||
struct wlr_cursor_output_cursor *output_cursor =
|
|
||||||
wl_container_of(listener, output_cursor, output_commit);
|
|
||||||
const struct wlr_output_event_commit *event = data;
|
|
||||||
struct wlr_surface *surface = output_cursor->cursor->state->surface;
|
|
||||||
assert(surface != NULL);
|
|
||||||
|
|
||||||
if (output_cursor->output_cursor->visible &&
|
|
||||||
(event->committed & WLR_OUTPUT_STATE_BUFFER)) {
|
|
||||||
wlr_surface_send_frame_done(surface, event->when);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cursor_output_cursor_update(struct wlr_cursor_output_cursor *output_cursor) {
|
static void cursor_output_cursor_update(struct wlr_cursor_output_cursor *output_cursor) {
|
||||||
struct wlr_cursor *cur = output_cursor->cursor;
|
struct wlr_cursor *cur = output_cursor->cursor;
|
||||||
|
|
||||||
|
@ -540,10 +524,6 @@ static void cursor_output_cursor_update(struct wlr_cursor_output_cursor *output_
|
||||||
} else if (cur->state->surface != NULL) {
|
} else if (cur->state->surface != NULL) {
|
||||||
struct wlr_surface *surface = cur->state->surface;
|
struct wlr_surface *surface = cur->state->surface;
|
||||||
|
|
||||||
wl_signal_add(&output_cursor->output_cursor->output->events.commit,
|
|
||||||
&output_cursor->output_commit);
|
|
||||||
output_cursor->output_commit.notify = output_cursor_output_handle_output_commit;
|
|
||||||
|
|
||||||
struct wlr_texture *texture = wlr_surface_get_texture(surface);
|
struct wlr_texture *texture = wlr_surface_get_texture(surface);
|
||||||
int32_t hotspot_x = cur->state->surface_hotspot.x;
|
int32_t hotspot_x = cur->state->surface_hotspot.x;
|
||||||
int32_t hotspot_y = cur->state->surface_hotspot.y;
|
int32_t hotspot_y = cur->state->surface_hotspot.y;
|
||||||
|
@ -581,6 +561,23 @@ static void cursor_output_cursor_update(struct wlr_cursor_output_cursor *output_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void output_cursor_output_handle_output_commit(
|
||||||
|
struct wl_listener *listener, void *data) {
|
||||||
|
struct wlr_cursor_output_cursor *output_cursor =
|
||||||
|
wl_container_of(listener, output_cursor, output_commit);
|
||||||
|
const struct wlr_output_event_commit *event = data;
|
||||||
|
|
||||||
|
if (event->committed & WLR_OUTPUT_STATE_SCALE) {
|
||||||
|
cursor_output_cursor_update(output_cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct wlr_surface *surface = output_cursor->cursor->state->surface;
|
||||||
|
if (surface && output_cursor->output_cursor->visible &&
|
||||||
|
(event->committed & WLR_OUTPUT_STATE_BUFFER)) {
|
||||||
|
wlr_surface_send_frame_done(surface, event->when);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void cursor_update_outputs(struct wlr_cursor *cur) {
|
static void cursor_update_outputs(struct wlr_cursor *cur) {
|
||||||
struct wlr_cursor_output_cursor *output_cursor;
|
struct wlr_cursor_output_cursor *output_cursor;
|
||||||
wl_list_for_each(output_cursor, &cur->state->output_cursors, link) {
|
wl_list_for_each(output_cursor, &cur->state->output_cursors, link) {
|
||||||
|
@ -1076,8 +1073,6 @@ static void layout_add(struct wlr_cursor_state *state,
|
||||||
}
|
}
|
||||||
output_cursor->cursor = &state->cursor;
|
output_cursor->cursor = &state->cursor;
|
||||||
|
|
||||||
wl_list_init(&output_cursor->output_commit.link);
|
|
||||||
|
|
||||||
output_cursor->output_cursor = wlr_output_cursor_create(l_output->output);
|
output_cursor->output_cursor = wlr_output_cursor_create(l_output->output);
|
||||||
if (output_cursor->output_cursor == NULL) {
|
if (output_cursor->output_cursor == NULL) {
|
||||||
wlr_log(WLR_ERROR, "Failed to create wlr_output_cursor");
|
wlr_log(WLR_ERROR, "Failed to create wlr_output_cursor");
|
||||||
|
@ -1091,6 +1086,10 @@ static void layout_add(struct wlr_cursor_state *state,
|
||||||
|
|
||||||
wl_list_insert(&state->output_cursors, &output_cursor->link);
|
wl_list_insert(&state->output_cursors, &output_cursor->link);
|
||||||
|
|
||||||
|
wl_signal_add(&output_cursor->output_cursor->output->events.commit,
|
||||||
|
&output_cursor->output_commit);
|
||||||
|
output_cursor->output_commit.notify = output_cursor_output_handle_output_commit;
|
||||||
|
|
||||||
cursor_output_cursor_update(output_cursor);
|
cursor_output_cursor_update(output_cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue