diff options
author | emersion <contact@emersion.fr> | 2018-10-19 15:27:58 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-19 15:27:58 +0200 |
commit | 9e060be04bf25c111ce7906967ac3c714ccb2db3 (patch) | |
tree | c904180abc841db886736ac2e41e01d7c12cc29f | |
parent | d88fffa5c492a5f73738d15a106e4e21a1b9aa4b (diff) | |
parent | dfdbc1f87097b92ae80e82b5d92150d81a49dcca (diff) |
Merge pull request #1320 from emersion/fix-duplicate-cursors
output-layout, cursor: fix duplicate cursors
-rw-r--r-- | types/wlr_cursor.c | 10 | ||||
-rw-r--r-- | types/wlr_output_layout.c | 13 |
2 files changed, 19 insertions, 4 deletions
diff --git a/types/wlr_cursor.c b/types/wlr_cursor.c index e97dd840..8094ff18 100644 --- a/types/wlr_cursor.c +++ b/types/wlr_cursor.c @@ -620,8 +620,14 @@ static void handle_layout_output_destroy(struct wl_listener *listener, static void layout_add(struct wlr_cursor_state *state, struct wlr_output_layout_output *l_output) { - struct wlr_cursor_output_cursor *output_cursor = - calloc(1, sizeof(struct wlr_cursor_output_cursor)); + struct wlr_cursor_output_cursor *output_cursor; + wl_list_for_each(output_cursor, &state->output_cursors, link) { + if (output_cursor->output_cursor->output == l_output->output) { + return; // already added + } + } + + output_cursor = calloc(1, sizeof(struct wlr_cursor_output_cursor)); if (output_cursor == NULL) { wlr_log(WLR_ERROR, "Failed to allocate wlr_cursor_output_cursor"); return; diff --git a/types/wlr_output_layout.c b/types/wlr_output_layout.c index b51153ae..6ba856f8 100644 --- a/types/wlr_output_layout.c +++ b/types/wlr_output_layout.c @@ -204,6 +204,7 @@ void wlr_output_layout_add(struct wlr_output_layout *layout, struct wlr_output *output, int lx, int ly) { struct wlr_output_layout_output *l_output = wlr_output_layout_get(layout, output); + bool is_new = l_output == NULL; if (!l_output) { l_output = output_layout_output_create(layout, output); if (!l_output) { @@ -211,12 +212,16 @@ void wlr_output_layout_add(struct wlr_output_layout *layout, return; } } + l_output->x = lx; l_output->y = ly; l_output->state->auto_configured = false; output_layout_reconfigure(layout); output_update_global(output); - wlr_signal_emit_safe(&layout->events.add, l_output); + + if (is_new) { + wlr_signal_emit_safe(&layout->events.add, l_output); + } } struct wlr_output_layout_output *wlr_output_layout_get( @@ -409,6 +414,7 @@ void wlr_output_layout_add_auto(struct wlr_output_layout *layout, struct wlr_output *output) { struct wlr_output_layout_output *l_output = wlr_output_layout_get(layout, output); + bool is_new = l_output == NULL; if (!l_output) { l_output = output_layout_output_create(layout, output); if (!l_output) { @@ -420,7 +426,10 @@ void wlr_output_layout_add_auto(struct wlr_output_layout *layout, l_output->state->auto_configured = true; output_layout_reconfigure(layout); output_update_global(output); - wlr_signal_emit_safe(&layout->events.add, l_output); + + if (is_new) { + wlr_signal_emit_safe(&layout->events.add, l_output); + } } struct wlr_output *wlr_output_layout_get_center_output( |