summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-11-10 13:30:15 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2014-11-10 13:37:26 +0000
commitb2492fa45beaf3c676eea2d5d75e35d60b91d769 (patch)
treede28bfc732963c1dddb53a3b348af0aa5cb74b5b
parent0267f5902ddaceced870dcd8451ef8729e33e5c2 (diff)
sna: Only reshow unhidden cursors after modesetting
Reported-by: Maarten Lankhorst <maarten.lankhorst@canonical.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna.h1
-rw-r--r--src/sna/sna_display.c14
2 files changed, 12 insertions, 3 deletions
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 9d139ede..8129eaed 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -326,6 +326,7 @@ struct sna {
uint32_t fg, bg;
int size;
+ int active;
int last_x;
int last_y;
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index f16a46cb..d098642d 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -4728,6 +4728,7 @@ sna_show_cursors(ScrnInfoPtr scrn)
}
}
sigio_unblock(sigio);
+ sna->cursor.active = true;
}
static void
@@ -4792,6 +4793,7 @@ sna_hide_cursors(ScrnInfoPtr scrn)
int sigio, c;
DBG(("%s\n", __FUNCTION__));
+ sna->cursor.active = false;
sigio = sigio_block();
for (c = 0; c < sna->mode.num_real_crtc; c++) {
@@ -5136,9 +5138,11 @@ sna_cursors_init(ScreenPtr screen, struct sna *sna)
static void
sna_cursors_reload(struct sna *sna)
{
- sna_set_cursor_position(sna->scrn,
- sna->cursor.last_x,
- sna->cursor.last_y);
+ DBG(("%s: active?=%d\n", __FUNCTION__, sna->cursor.active));
+ if (sna->cursor.active)
+ sna_set_cursor_position(sna->scrn,
+ sna->cursor.last_x,
+ sna->cursor.last_y);
}
static void
@@ -5933,6 +5937,9 @@ sna_mode_disable(struct sna *sna)
if (!sna->scrn->vtSema)
return false;
+ /* XXX we will cause previously hidden cursors to be reshown, but
+ * this should be a rare fixup case for severe fragmentation.
+ */
sna_hide_cursors(sna->scrn);
for (i = 0; i < sna->mode.num_real_crtc; i++)
sna_crtc_disable(config->crtc[i]);
@@ -5967,6 +5974,7 @@ sna_mode_enable(struct sna *sna)
}
update_flush_interval(sna);
+ sna_show_cursors(sna->scrn);
}
void