VoiceOver Commands (HTML version)

Created an HMTL version of Apple’s VoiceOver commands PDF.

VoiceOver Commands / Keyboard Shortcuts in Dotjay’s Lab

We will remember them

In May last year, I took a trip to Dronten in Holland where my father took part in several remembrance services for those who gave their lives in the Second World War. The Dutch really celebrate their freedom, May 5th being their Liberation Day, which marks the day The Netherlands were freed from German occupation in 1945. It was quite emotional to be part of several ceremonies and festivals where people who fell, many nameless, were remembered and celebrated.

Unfortunately, we were unable to go to Holland again this year, but our friends sent us a link to a video of this year’s commemoration day in Dronten (4 May, 2009), which shows a fly past by one of the last two Lancaster bombers still flying.

So today – as we do on November 11th – I remember our heroes, and I’m proud to include my own father among them.

“We will remember them”

They shall not grow old as we who are left grow old.

Age shall not weary them, nor the years condemn.

At the going down of the sun and in the morning,

We will remember them.

Related

  • We Will Remember Them – a UK site dedicated to servicemen and women who have gave their lives in defence of their nation.

Photo: Avro Lancaster – RIAT Fairford 2008 (Danny McL)

Holding up the ⌘+Q

Something that’s been bugging me for a while now is reaching for Command+W to close an open Finder window or a tab in Firefox, and hitting that blasted Q key by accident. Well, no more, I decided!

For the uninitiated, hitting Command+Q on a Mac keyboard quits the current application – as far as I’m aware – without exception. Some applications will give you a warning that you are about to quit and you may lose unsaved data. Since Firefox introduced built-in session management so that it will fire up just as you left it, it no longer seems to warn you when you quit. Looking at about:config in one of my Firefox tabs shows browser.warnOnQuit set to true. Firefox will warn me when I try to close a window with multiple tabs open in it, but it doesn’t warn my when I hit Command+Q.

So, in trying to fix this little problem, I discovered a few ways to create helpful keyboard shortcuts and tame some not-so-useful ones.

Custom keyboard shortcuts in OS X

You can set custom keyboard shortcuts for various aspects of OS X and any of your installed applications in System Preferences – it’s under Keyboard & Mouse, and then the Keyboard Shortcuts tab.

  1. Hit the + (plus) button to begin adding a new shortcut.
  2. Select an application to customise, or let it affect all applications.
  3. Type in the Menu Title, which is the text as it appears in the menu item you’re wanting to customise. You can just switch to the application in question to check it.
  4. Hit the Keyboard Shortcut box and then do the desired key stoke you want to use for that menu item.

Now, I knew about this before and have set a couple of my own shortcuts previously. Here’s a couple of examples from my preferences:

  • In Safari, Shift+Command+S is set to Disable Styles from Safari’s Develop menu.
  • In Thunderbird, Option+Command+V is set to Paste Without Formatting.

So, it was a bit annoying to find the same didn’t work when trying to fix my premature evacuation woes in Firefox. You seem to be able to assign keyboard shortcuts to Firefox menu items, but if you set Command+Q to a menu item other than Quit, it still quits the application. You can also try setting a different shortcut to Quit (I tried Option+Command+Q), but still no joy.

Taming Firefox keyboard shortcuts with Keyconfig

There’s an extension for Firefox called Keyconfig, which remained unusable with Firefox 3 for a while. I read that the latest build now works, so I tried it, and — hey presto! — it installed. Alas, it wouldn’t override Command+Q for me. However, it did help me fix up some keyboard conflicts caused by various add-ons.

Once Keyconfig is installed, you can go to Keyconfig… under the Tools menu to see all the keyboard shortcuts that Firefox uses. Any shortcuts that are assigned to more than one action are highlighted for you. This is great for tracking down and fixing keyboard conflicts caused by some cheeky little add-on hijacking the shortcuts you’ve grown to know and love. (Yay, Shift+Command+F now opens Web Developer‘s Display Element Information tool again, instead of opening up the settings for Foxmarks!)

So, I began to assume that Command+Q is engrained into the application somewhere, possibly at the Cocoa level.

Hacking key bindings with brute force

With the help of this OS X hint and a little poking around (thanks Sean), running this in Terminal has worked for me:

defaults write org.mozilla.firefox NSUserKeyEquivalents '{"Quit Firefox"="@~Q";}'

This tells Firefox (the org.mozilla.firefox package) to use Option+Command+Q as the shortcut (keyboard equivalent) for the Quit Firefox menu item.

As with the System Preferences method above, you need to address the menu item using the text as it appears in the menu, so "Quit Firefox". To my knowledge, this technique will only work with Firefox 3, as that release was built using Cocoa.

You can customise the shortcut where my code has @~Q by using these characters to represent the desired keys:

@
Command
$
Shift
~
Option
^
Control

Apparently, you can set these keyboard equivalents globally, but I decided not to do this. If you want to target a specific application in the way I have, the following may help you find out its package name:

  1. Fire up Terminal and type ps -ax | grep firefox, but replace “firefox” with the application you’re looking for. This should help you to figure out the application’s process name. For example, Firefox’s process name is “firefox-bin”.
  2. Now fire up Script Editor and run the AppleScript tell application "System Events" to get bundle identifier of application process "firefox-bin", replacing “firefox-bin” with your target application’s process name. That code goes in the top pane of Script Editor. Then hit Run.
  3. You should see the package name appear in the output pane below the script, e.g. org.mozilla.firefox.

So, as another example, running ps -ax | grep twhirl in Terminal tells me that the process name I want for Twhirl is in fact “twhirl”. Running the AppleScript tell application "System Events" to get bundle identifier of application process "twhirl" gives me the package name de.makesoft.twhirl.[SOMEHASH].

Save your head, your desk, the world!

That’s all for now. I hope this stops a few people from banging their heads on their desks!

Joining OmniTI

Right, now that the cat’s out of the bag, I’m happy to announce here that I will be joining Jon at OmniTI to form part of their interface design team as an accessibility engineer!

Essentially, I’ll be doing the stuff I love: accessible interface design, consulting and training, and quality assurance (“pedant duties”). And I’ll be doing it from within the loving arms of one of the Web’s cleverest companies. To echo what I said the other day, working with the people at OmniTI over recent months has been great. Even though I’ve been working remotely, I’ve been surrounded by really clever folks, which means it’s always a learning experience, and always fun. Hopefully, some of them feel that they have been learning from me, too.

I’ve always sat somewhere between the back-end development geeks and the front-end creative types. In my new job, I will be concentrating on interface design, but I will be working closely with other teams to help ensure accessibility is built into the applications built by OmniTI. It’s perfect for me, and I’m really looking forward to it.

What a way to round off the year! I have a feeling there’s going to be a lot of cool stuff in store for 2009. I hope you all have a great Christmas, and I’ll see you on the other side of New Year!

End of the year—all change, please!

Wow! These past few weeks have been a bit of a roller coaster ride. Sit with me a while, and try not to throw up on my trousers…

November

In November, I was invited to the Web Developers Conference in Bristol to sit on a panel with Elliot, Elliott, Dan and Dan (spooky, eh?) to talk about Working in the Industry & Loving the Web. It was a great day, organised by Alex Older to give web design students at UWE in Bristol the chance to meet and talk to people in the industry. The panel was great to be part of—it was my first time seeing a conference from the stage and I really enjoyed it. Hopefully, we imparted some valuable words of wisdom to the audience! As always, it was a real pleasure to meet wonderful folk from our community, and to talk with some of the students in the bar after the event. Both the conference and Bristol SkillSwap the night before were great. If you’re a web design student at UWE, go to next year’s conference. It’s really something that other universities should be doing as well.

November was also brought to you by the number 5, the colour blue, and a healthy dose of rock music. Unfortunately, I didn’t get to PHP North West, but I heard it was excellent and lots of fun.

December

This month, I’ve mostly been wearing my editor’s hat, both at work and in play. I have a strange affection for editorial work, especially as I was pretty crap at English at school. My inner stickler for correct grammar seems to prefer the written word as a medium for articulating my thoughts—a little like how just the right amount of alcohol brings moments of clarity. One of this month’s highlights has been working with Chris, Sean and Jon to set up and run this year’s PHP Advent Calendar. If you’re a PHP developer, be sure to head over there for a good read.

But the big, fat news is that my esteemed colleague and friend, Jon Tan, has joined OmniTI as their Creative Director. We’ve been doing work with OmniTI for some time, and I must say that working with them has been edifying and a real pleasure. The offer they extended to Jon is a great testament to his talents and character, and is truly deserved. Congratulations, my friend.

What about Grow Collective? Well, you’ll have to wait and see what the New Year brings. Well, now that the cat’s out of the bag, I can tell you: I will also be joining OmniTI. In the meantime, I’m off to start my Christmas holiday by getting cosy with a glass of mulled wine and a mince pie! Happy Christmas to you and yours, and I’ll see you in 2009.

Linkage

  1. Alex Older: WDC2008, It’s over….for now
  2. Dan Donald: Web Developers Conference
  3. Elliot Jay Stocks: Round-up of 2008 speaking events
  4. Pete Coles: Web Developers Conference Write Up
  5. Rick Hurst: Web Developers Conference 2008

Updated assistive technology videos following comments from Victor Tsaran

Updated some of the notes following comments from Victor Tsaran. Loads of new videos to be added shortly.

Aural CSS notes updated following tests with Opera Voice and FireVox

Opera and the FireVox extension for Firefox both claim to support some of the CSS 3 Speech module properties. Following some quick tests on Windows, Opera 9.62 seems to work reasonably well, but the latest FireVox appears to have broken support.

jQuery UI accordion: enabling keyboard navigation

A couple of weeks back, Karl asked a question about jQuery UI’s Accordion interface widget and keyboard accessibility. I’ve got my head in various JavaScript frameworks at the moment, so I took a quick look.

This article is now a little out of date. The jQuery UI team seem to have updated the framework to use tabindex="-1", fixing one of the problems I outline below. The example code may now be obsolete. I hope to review this soon.

So, what’s an accordion when it’s at home?

You’ve got an accordion interface when you have a small collection of vertically-stacked, collapsible layers of content that a user can flip between. It’s a similar concept to tabbed interfaces where you view one chunk of content at a time, but in an accordion each of the interface controls are vertical and span the full width of the content. It’s easiest explained with an example (make sure you have JavaScript enabled).

Problems with keyboard accessibility

Karl was finding that, while you could navigate and control the accordion using the keyboard in Safari 3 and Internet Explorer 7, there were problems when using Firefox 3. I’m not yet sure why, but it didn’t work at all for me in Opera 9.6.

When testing with Firefox 3, I observed the following:

  • If there is a link inside the accordion control, you cannot navigate to it when tabbing forwards through the page. However, you can access the link when tabbing backwards using Shift+Tab.
  • You cannot tab back through the page from the accordion control using Shift+Tab. Keyboard navigation is trapped.

I traced the problem to the tabindex="0" that jQuery dynamically adds to the accordion controls. The idea is to actually improve accessibility; tabindex="0" should tell browsers to make the accordion control part of the tab order, no matter what type of element it is. For example, if you have a heading as a control for your accordion, setting tabindex="0" on it should allow you to tab to it, even though a heading is not normally accessible using a keyboard.

The onclick problem

Despite this seemingly life-saving technique for adding elements to the tab order of a page, it doesn’t necessarily ensure that our interface is now keyboard accessible. I’ll be doing some testing and explain in a follow-up entry. Following Alistair’s comment, I’ll clarify here by adding that the tabindex technique is valid, but I believe it needs to mature before it can be relied upon.

For now, I can only advise that developers use standard HTML control elements (such as <a> and <button>) to ensure accessibility to keyboard users.

Firefox has problems handling tabindex="0"

So, back to the problem at hand…

Unfortunately, it seems that Firefox has problems with tabindex="0", causing the keyboard navigation issue that Karl was experiencing. The technique could be a good solution, but only if it was widely supported by browsers and was sure to work with assistive technology.

It looks like Jörn Zaefferer is on the case at the jQuery end and is removing the tabindex attributes set by jQuery. In the meantime, this move will (hopefully) force developers to use standard HTML control elements for their interface controls. Unfortunately, the majority of developers may see their interfaces working when using a mouse, assume that it’s all okay, and not test keyboard accessibility.

Fixing it in the meantime

You can “undo” the tabindex that jQuery sets by setting up your accordion something like this:

$('#accordion').accordion({
	header: ".ui-accordion-header"
});
$('#accordion .ui-accordion-header').attr('tabindex','');

Here, we’ve told jQuery to blank all the tabindex attributes on the accordion “headers” (i.e. the accordion interface controls).

An even better solution would use standard HTML control elements (<a>, <button>, …) in the first place, as mentioned above. However, this can restrict your markup a little, and may not make much sense, for example, if you’ve marked up each of your accordion layers with a heading. In any case, you can always the accordion controls dynamically, giving you a bit more freedom as to what element you use.

Added jQuery UI Accordion keyboard accessibility tests

Added examples of jQuery UI‘s Accordion widget to test keyboard accessibility, particularly in Firefox, which seems to have an issue with tabindex="0".

dotjay feeds fixed

I’ve been aware of a problem with my feeds for a little while. The main feed has been working okay, but some of the others I used to offer went a bit screwy. It should all be fixed again now.

You can subscribe to just my blog entries or to entries with a particular tag. So if you only want to be fed my accessibility posts, you can just subscribe to my accessibility feed. I’ve also included a new lab updates feed. Lab updates will also appear in the main feed. I’ve tried to redirect all previous feed URLs so that they will continue to work. My apologies if they break.

Elsewhere