aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-10-19 15:27:58 +0200
committerGitHub <noreply@github.com>2018-10-19 15:27:58 +0200
commit9e060be04bf25c111ce7906967ac3c714ccb2db3 (patch)
treec904180abc841db886736ac2e41e01d7c12cc29f
parentd88fffa5c492a5f73738d15a106e4e21a1b9aa4b (diff)
parentdfdbc1f87097b92ae80e82b5d92150d81a49dcca (diff)
Merge pull request #1320 from emersion/fix-duplicate-cursors
output-layout, cursor: fix duplicate cursors
-rw-r--r--types/wlr_cursor.c10
-rw-r--r--types/wlr_output_layout.c13
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(