9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
From: cinap_lenrek@gmx.de
To: 9fans@9fans.net
Subject: [9fans] mouse cursor madness
Date: Sun, 14 Apr 2013 19:16:06 +0200	[thread overview]
Message-ID: <cbfb0708653f90cf5a067b03f02782dd@rei2.9hal> (raw)

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



             reply	other threads:[~2013-04-14 17:16 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-14 17:16 cinap_lenrek [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cbfb0708653f90cf5a067b03f02782dd@rei2.9hal \
    --to=cinap_lenrek@gmx.de \
    --cc=9fans@9fans.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).