- Entries : Category [ Software ]
05 November
2007
Is Mousing Faster?
Where keith responds to an industry titan
There's been some discussion on the Mac blogosphere this week regarding the relative speed of using the mouse v the keyboard. I obviously have a horse in this race, and that horse is called MercuryMover (a program that lets you move and resize your windows via the keyboard.) Scott Stevenson wrote about how some of the changes in Leopard may seem to negatively impact usability, but in actuality might be a net gain for users due to difficult-to-quantify reasons (this is a poor thumbnail sketch, you should definitely read the original). He cites none other than Bruce Tognazzini: User Interface Superhero. According to this article :
We've done a cool $50 million of R & D on the Apple Human Interface. We discovered, among other things, two pertinent facts:
- Test subjects consistently report that keyboarding is faster than mousing.
- The stopwatch consistently proves mousing is faster than keyboarding.
Scott's take home point is that the obvious solution (provide better keyboard navigation since it feels faster) may not actually provide a better experience.
My angle on this is clear: I think that keyboarding is cool. The original article was written 18 years ago, at a time when the average monitor had only a few hundred thousand pixels of real estate. By contrast, my new iMac has well over 2 million. I have a lot more ground to cover with my mouse than Tog did back in the day. My snazzy new keyboard may very well be faster under these circumstances (although my one-man-shop isn't going to spring for the usability study to find out.) Secondly, and this is really Scott's point, i love to use my keyboard. It feels much faster to me and that's why i (no joke) love to use MercuryMover. I wrote this program because i knew it would make me feel just slightly more powerful when i used my Mac; and indeed it does every day.
Posted by
kalperin at
00:02
|
Comments (0)
I (NS)Screen, You (NS)Screen
Where Keith fixes a longstanding bug
A problem that has dogged me with MercuryMover since the beginning is getting MercuryMover to recognize where the edges of the screen are when using two displays in a top-to-bottom configuration. (If using your mouse to move and resize windows is dogging you then try MercuryMover!) Having promised a user that this would be fixed in the upcoming v2.0 release, i finally had to sit down and figure it out. The crux of the problem is that while the NSScreen API dutifully returns the dimensions of any screen as an NSRect, and the Accessibility API lets us determine the position and size of any window (by copying the values to an NSRect), these two operations return NSRects in different coordinate systems. The NSScreen API returns a coordinate system where the bottom left corner of the main screen is 0,0 with the y axis going up. Accessibility however treats the top left corner of the main screen as 0,0 with the y axis going down. While the latter seems more sensible to me, i don't claim to be smarter than the engineers at apple (quite the contrary!) so it's not for me to question, but to convert. Fortunately, those same Apple engineers (the royal Apple Engineers, the editorial Apple Engineers) provide us with a mechanism to transform one coordinate system to another. Using NSAffineTransform, we can specify a transformation like so:
NSAffineTransform* coordinateFlipper = [NSAffineTransform transform];
[coordinateFlipper translateXBy:0.0 yBy:frameOfMainScreen.size.height];
[coordinateFlipper scaleXBy:1.0 yBy:-1.0];
[coordinateFlipper concat];
There's more than meets the eye here. This transformer will take a point and let us work with it as if its origin were push up the y axis by the an amount equal to the height of the main screen:
[coordinateFlipper translateXBy:0.0 yBy:frameOfMainScreen.size.height];
This accounts for the fact that the two coordinate systems have origins on opposite left hand corners. Secondly, this guy will change the direction that the y axis counts (numbers getting bigger as you move down the screen, instead of up):
[coordinateFlipper scaleXBy:1.0 yBy:-1.0];
Now, i can transform the origin of my key window (the one that MercuryMover is controlling):
NSRect flippedRectOfKeyWindow = rectOfKeyWindow;
flippedRectOfKeyWindow.origin =
[coordinateFlipper transformPoint:flippedRectOfKeyWindow.origin];
and my coordinate systems line up.