New Prototype Screen Lock Program: zedlock
Clarke Wixon
cwixon at usa.net
Fri Oct 12 02:27:27 CEST 2007
I have put together a proof-of-concept "screen lock" prototype intended
to prevent unintended touchscreen inputs while the phone is pocketed,
against your ear, etc. The program is called "zedlock" and it's
available at my wiki page:
http://wiki.openmoko.org/wiki/User:Quicksand#zedlock
There are also screenshots there.
The prototype requires python, pygtk, and pycairo, but the final version
will be in C.
I'm interested in comments and thoughts from the community.
The README follows:
---
Zedlock 0.0.1 PROTOTYPE
Copyright (C) 2007 Clarke Wixon
How it works
This is a screen-lock program in prototype form. To run it, just run
zedlock.py from a terminal in the directory where it's installed.
It's really simple. To unlock, just trace a large 'Z' with a single
stroke of your finger or stylus, anywhere on the screen. It must be BIG
ENOUGH (about half the smallest screen dimension in both height and
width, approx. 2cm on the Neo), it must be drawn in the CORRECT SEQUENCE
(from top-left to bottom-right), and it must be QUICK ENOUGH (completed
in less than one second). Within these parameters, a fair amount of
variation (i.e., sloppiness) is tolerated. (As a result, you can make
some non-Z patterns that fool it.)
Who's Zed?
Zed's dead, baby, Zed's dead.
No, really, why Zed?
There are a bunch of things out there already called "zlock" or the
like. I selected the 'Z' glyph because it's fast and easy to make
without looking, and its four points are easy to pull out of a stream of
touchscreen data -- they are simply the maxima and minima of the
functions (x+y) and (x-y). I don't need to keep a linked list of
intermediate points or anything like that; these points are updated
on-the-fly.
Why would I want this?
You don't need to be looking at the screen to unlock it. It is pretty
unlikely to unlock accidentally (by your face while you are on the
phone, in your pocket, etc.). But it's simple and fast enough to perform
frequently and easily, and to become second-nature.
Plus it looks nice: gtk+ and cairo are used for fluid anti-aliased
graphics. Visual feedback is provided after a stroke is completed: an
openmoko-orange line shows where you made your stroke, and if it finds
the 'Z' pattern, it is highlighted in white for a moment. If your
stroke doesn't meet the criteria, you get a big red 'X' on the screen
and a three-second lockout.
With the iPhone and the Qtopia phone platform, you need to be looking at
the touchscreen to unlock it. Their sliders and animated keys are cool,
but this is better.
Remember, this is a prototype
To install it, copy zedlock.py and zedlock.png to your home directory
(or a subdirectory), make sure zedlock.py is executable, and run it from
the directory you installed it in. The program depends on python-pygtk
and python-pycairo. Note that it doesn't actually do anything all that
functional yet -- it is simply a demonstration program. This prototype
doesn't actually lock or unlock anything; it just clears the screen
after each stroke (and the subsequent visual feedback) so you can try it
again and again and again.
The program should be more-or-less QVGA-friendly (well, almost, just
change two global variables) and orientation-friendly already, but YMMV.
Yes, it's slow, especially to start up. But that's embedded python for
ya. Plus I had to do some weird hacky things in cairo to get it to
render predictably. This is my first cairo project and my first python
program, SO DON'T GIVE ME ANY GRIEF! There are probably terrible, ugly,
spaghetti-code-monsters in there if you care to look. They'll go away
over time. :)
Future Plans
After the featureset solidifies a bit more, I will rewrite it in C
(which I'm much more comfortable with), optimize it (a lot!), and add
some features:
1) It will be rotationally insensitive so you don't need to look at it
to determine portrait vs. landscape before you unlock. This will be
pretty easy to add.
2) The text on there is statically-coded right now, and fixing that will
be trivial, so don't complain about it now. It doesn't actually tell you
the GSM/GPRS status or even the real time of day. Yes, wise guy, IT'S
ALWAYS 5:35 pm HERE.
3) Eventually it will get a battery/charging state icon, GSM signal
strength bars, and a ringer volume indicator, so you can see those
things while the screen remains locked. I don't want to make the
interface too cluttered, but those items seem essential.
4) Ideally this will slip right into the OpenMoko power management
scheme. Preferably neod and/or the dialer will *lock* the screen and
require an unlock program (such as zedlock) in the following circumstances:
* immediately after an incoming call is answered
(to prevent touchscreen input from the user's face or ear)
* immediately after an outgoing call is dialed
(ditto)
* on request
(via a lock button or menu, before you put it in your pocket)
* upon an automatic return-from-suspend
(e.g., a datebook alarm, incoming phone call, SMS, etc.)
* but *not* following a manual return-from-suspend
Note that this concept of screen-lock is different from the
power-management concept of screen blanking. Screen LOCK should probably
occur more often, and is intended primarily to prevent accidental
user-interface manipulation while the touchscreen is against the user's
face, in the user's pocket, or otherwise subject to spurious inputs. It
is not intended to save power.
More information about the openmoko-devel
mailing list