9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
* [9fans] mouse cursor madness
@ 2013-04-14 17:16 cinap_lenrek
  2013-04-15 17:28 ` erik quanstrom
  0 siblings, 1 reply; 7+ messages in thread
From: cinap_lenrek @ 2013-04-14 17:16 UTC (permalink / raw)
  To: 9fans

the way the mouse cursor is drawn currently is quite complicated.
the cursor is redrawn from a timer interrupt 30 times a second
and the software cursor also installs its own timer interrupt
handler to redraw itself when it got overdrawm (swcursoravoid).

when a programs use draw operations heavily, the chances become high
that when the software cursor interrupt handler finds the drawlock
busy, so it has to retry to draw on the next tick. (thats why
cursoron() has a return value... to indicate the retry).

this causes ugly flickering and it keeps the machine busy for
no reason.

i found a nice approch for 9front now that might be worth
porting back to bell-labs plan9 / 9atom or anyone who is
interested.

instead of using a timer interrupt, we just create a kernel
process in devmouse that calls cursoroff() and cursoron()
and then waits on a rendezvous point that is woken up every
time the cursor needs to be redrawn. (this can be triggered
by a new mouseredraw() function)

now, all call sites for cursoron() and cursoroff() are from
process contexts, so we can just wait on the drawlock in the
cursoron and cursoroff implementations for the software cursor.

the new mouseredraw() function is used by the software cursor
to schedule a cursor redraw (after the drawlock gets released
again) from swcursoravoid() or swcursorload().

theres no bookkeeping needed anymore like swvers or swpt/swvispt
because we actively trigger the redraw with mouseredraw().

the result is a much more responsive mouse and no flickering
even when having the software cursor over a window that does
heavy drawing. the kernel process still has a sleep timeout to
satisfy the drawactive() interface (screen blanking) but it
can sleep much longer.

code is in the 9front repo.

--
cinap



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-04-15 21:03 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-04-14 17:16 [9fans] mouse cursor madness cinap_lenrek
2013-04-15 17:28 ` erik quanstrom
2013-04-15 17:35   ` cinap_lenrek
2013-04-15 19:23     ` erik quanstrom
2013-04-15 19:27       ` cinap_lenrek
2013-04-15 21:03         ` erik quanstrom
2013-04-15 20:01     ` erik quanstrom

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).