photo
Jordan Sissel
geek

Sat, 14 Jun 2008

keynav - retire your mouse.

What is keynav?

Another episode in the revolution against mouse-requisite interfaces. It's one more step towards impulse-driven computing.

Enough marketing jargon. keynav is a piece of an on-going experiment to make pointer-driven interfaces easier and faster for users to operate. It lets you move the pointer quickly to most points on the screen with only a few key strokes.

Note that I said pointer, not mouse. The mouse simply drives the pointer. We can drive the pointer with other devices too. keynav turns your keyboard into an fast pointer mover.

What does it do?

You select a piece of the screen. The screen is initially wholely selected. One move will cut that region by half. A move is a direction: up, down, left, and right.

Once you're done moving, you simply indicate (with a key stroke) that you want to move. Boom, cursor moves.

Why it is fast?

keynav is geared towards selecting a piece of the screen very quickly.

Recall from above that you are selecting a region by cutting the previous region by half. This gives us logarithmic scaling. High resolution screens incur about the same number of moves to select an area as smaller screens do.

For example, to select any pixel on a screen with resolution 1920x1200 it would take 21 moves. 21 moves is horrible. There is a bright side!

How often do you really want to click on a single specific pixel on your screen using your mouse? Never, right? Well, maybe almost never. Most of the time you want to:
  • Raise a window and give it focus: 80x80 pixel target (worst: 9 moves)
  • Click on an "OK" button: 60x25 pixels (worst: 11 moves)
  • Click on a text widget to activate it: 80x25 or larger

Watch the demo!

Bored of reading? How about a screencast demonstration? Click here or the image below.
Hopefully the demo gives you a good idea of what keynav does.

Mailing list

The keynav users mailing list is: keynav-users@googlegroups.com

I'll be announcing new versions on this mailing list. Additionally, if you want help or want to contribute patches to keynav, the mailing list is a good place to go.

Supported Platforms

keynav is currently written in C and only works in X11 (Unix graphics environment). I am planning on porting keynav to both Windows and OS X. If you are interested in helping me with this, please contact me! Known working:
  • FreeBSD + Xorg 6.9.0
  • FreeBSD + Xorg 7.2.0
  • Ubuntu Dapper + Xorg 7.0.0
  • Ubuntu Feisty + Xorg 7.2.0
  • Ubuntu Hardy + Xorg 7.2.0
  • Cygwin + Xorg 6.8.x
  • Fedora 9
I've seen strong interest in this software working on other platforms, so I'm doing the best I can. Again, if you're a .NET (or just Windows) or OS X coder, and are willing to help port this, let me know. It's only 200 lines of C in Xlib, so it can't be more than a one-day-long project.

Download it!

keynav-20080614.01.tar.gz

Looking for an older version? Try the keynav releases archive

Build instructions

make keynav

The above should be all you need to do.

How to use it

Run keynav, and activate it by pressing Control+Semicolon. You should see a thin frame on the screen with a cross in it.

The following is the default configuration:
  • h : select the left half of the region
  • j : select the bottom half of the region
  • k : select the top half of the region
  • l : select the right half of the region
  • shift+h : move the region left
  • shift+j : move the region down
  • shift+k : move the region top
  • shift+l : move the region right
  • semicolon : Move the mouse to the center of the selected region
  • spacebar : Move the mouse and left-click
  • escape : Cancel the move

Configuration file

Your config file must live in ~/.keynavrc. Such as /home/jls/.keynavrc

The config file format consists of a keysequence followed by a comma-separated list of commands. For example:
space warp,click 1,end
This would move the mouse, click left mouse button, and finish (close the keynav selector) when you hit spacebar while keynav was active. A sample config file comes with the distribution as 'keynavrc'.

The following is a list of key modifiers: shift, ctrl, alt, or any valid X Keysym, such as Shift_L, etc.

List of commands:
start
Activate keynav
end
Deactivate keynav
cut-left, cut-right, cut-up, and cut-down
Cut half of the selection in a given direction. For example, cut-left will select the left half of keynav selector region. If you attempt to cut the window too small, the operation will abort. Cut can take a percentage value to cut by. The default is ".5"
move-left, move-right, move-up, move-down
Move the selector window a given direction. The movement amount is equal to the width or height of the selector depending on the direction. You cannot move the window outside the bounds of the screen. Move can take percentage value that specifies the distance relative to the size of the window. The default is "1.0"
warp
Move the mouse to the center of the selector
click <button>
Click the given mouse button once. 1 == left, 2 == middle, 3 == right.
doubleclick <button>
Click the mouse button twice, quickly. This can also be achieved by doing "click 1,click 1" in your command sequence.
drag <button> [keyseq]
Toggle dragging mode for the given button. If keyseq is given then that keysequence is held during the initial mouse button down event. This is useful in invocations such as 'drag 1 alt' to do a alt+click-drag on a window to move it.
grid <rows>x<columns> [Added 20080509]
Change the grid layout of the selection. For example, specifying 'grid 3x3' will divde the screen selection into 9 cells, 3 rows and 3 columns. Specifying 'grid 2x3' will divide the screen selection into 6 cells, 2 rows and 3 columns.
cell-select <row>x<column> OR cell-select <cell> [Added 20080509]
Select a specific cell in the grid. The NxM syntax selects the specific row and column. The single number syntax selects the cell numbered counting from the top left to the bottom left. For example, a 3x3 grid would be numbered this way:
1 2 3
4 5 6
7 8 9

The Future of keynav

Allow me to make an analogy.

You approach an elevator. To call the elevator, you aimlessly smack the button with you hand. Your hand hits the button and activates it, calling the elevator. You also make significant contact with the wall. Nothing else happens because the wall doesn't do anything when you press it. There's a benefit of having your whole hand (large) to use in an attempt to press the elevator button (small).

With computers, the relationship is different. Your hand is extremely tiny in size and the targets are somewhat larger. This allows us some degree of imprecision when clicking but we must remain within the confines of the button to successfully click it. The goal is like hitting the broad side of a barn with a baseball. Sounds, easy, right?

What if we use a barn to hit a baseball? The game gets much easier. What happens if you use keynav to zoom "close enough" to a button, and simply say "click the button inside this box". The effect is that you "slap" the selected region and activate whatever button or interactive element.

An example follows. It is a partial screenshot of the downloads window in Firefox.
If we throw the a baseball at the button, we have to hit the small red area. If we throw a barn at the button, we have a much much larger area of possible effect.

This is delightful, because we can be less accurate with our clicks. It comes with some trade-offs though.
  • Sometimes I want to click on the pixel my mouse is actually on
  • The "barn" approach may hit more than one interface element that is clickable.
I believe both of these can be solved. The first is simple. The next requires more thought. Perhaps a means by which to select specific elements in the selected area? Who knows. More research will help.

Comments: 46 (view comments)

Permalink: /projects/keynav/main
posted at: 06:22


46 responses to 'keynav - retire your mouse.'

Bob/Paul posted at Wed Nov 8 14:14:11 2006...
Doesn't compile on Ubuntu Edgy:

keynav.c:17:22: error: X11/Xlib.h: No such file or directory
keynav.c:18:27: error: X11/Xresource.h: No such file or directory
keynav.c:19:23: error: X11/Xutil.h: No such file or directory
keynav.c:20:34: error: X11/extensions/shape.h: No such file or directory
keynav.c:21:34: error: X11/extensions/XTest.h: No such file or directory

I think it has additional dependencies...

Jordan Sissel posted at Wed Nov 8 16:31:08 2006...
Sorta. If your system doesn't install header files by default, you won't be able to build keynav until you install them.

You probably want any Xorg packages that end in -dev. Unfortunately Ubuntu and Debian insist on not including these by default.

Bob/Paul posted at Wed Nov 8 18:38:10 2006...
Thanks.  I needed the xlibs-dev package.

Still complains that there is no make entry for the man page, but I have a feeling that's to be expected. This is a great addition to MythTV. Now I have remote-controlled mouse. Thanks!

Sawan Gupta posted at Wed Nov 29 01:01:23 2006...
Nice Utility. Its good to work using keyboard.

Vineet Chaitanya posted at Wed Jun 6 07:17:52 2007...
Excellent! Thank you very much.
Am I right in thinking that it would be possible to combine it with Expect to build autoit kind of program for X Windows System?

Vineet Chaitanya

Miernik posted at Tue Jul 3 21:11:19 2007...
I can't get keynav to work. I use wmii window manager, Xorg 7.2 from Debian sid, it compiled OK, but pressing Ctrl-; doesn't do anything. If I do it over an xterm, just ; appears in my xterm, and nothing else. My Ctrl-key is mapped to my CapsLock in .Xmodmap:

keycode  66  = Control_L Control_R
clear control
add  control = Control_L Control_R

Besides that above you write that the distribution contains a sample keynavrc, but it doesn't. Any clues how can I make it work?

Jordan Sissel posted at Tue Jul 3 21:54:59 2007...
@Miernik, oops. I forgot that file in the release! My bad.

A new version is up (20070703) that includes the keynavrc example.

Kartik Mistry posted at Wed Jul 4 06:01:00 2007...
Hi,

I tried keynav with Debian Sid. As, Miernik said, same happened with me too!

I used 20070703 version. I have prepared Debian Package :)

But, I don't think I will have enough time to maintain it right now.

Miernik posted at Wed Jul 4 09:47:24 2007...
For me version 20070703 still doesn't work. Having a Debian package is not much fun if it doesn't work. So what's the difference between Ubuntu and Debian that it works on Ubuntu, but not on Debian?

Jordan Sissel posted at Wed Jul 4 12:09:26 2007...
Very strange.

What of keynav doesn't work?
- Does it build?
- Does it run (ie; can you do ./keynav without errors)
- Does hitting ctrl+; work?
- What locality keyboard are you using? (I developed this only with US known). It's possible locality plays in here.
- If ctrl+; works, what fails?

Kartik Mistry posted at Thu Jul 5 06:47:22 2007...
Yes, strange.

- Does it build?
Yes.

- Does it run (ie; can you do ./keynav without errors)
Yes

- Does hitting ctrl+; work?
No

- What locality keyboard are you using? (I developed this only with US known). It's possible locality plays in here.
en-US, en-IN

- If ctrl+; works, what fails?
No, it doesn't work.

Miernik posted at Thu Jul 5 21:01:50 2007...
My answers are the same at Kartik's, besides that:

miernik@tarnica:~$ locale
LANG=en_US.UTF-8
LANGUAGE=en_PL:en_US:en_GB:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
miernik@tarnica:~$

and from my xorg.conf:

Section "InputDevice"
  Identifier  "Generic Keyboard"
  Driver  "kbd"
  Option  "CoreKeyboard"
  Option  "XkbRules"  "xorg"
  Option  "XkbModel"  "pc105"
  Option  "XkbLayout"  "pl"
EndSection

Jordan Sissel posted at Fri Jul 6 01:35:00 2007...
It's possible that your keyboard layout doesn't have ';' aka semicolon?

What does xev tell you when you hit ; when it's focused?

Mine says:

KeyPress event, serial 25, synthetic NO, window 0x3000001,
  root 0x3f, subw 0x0, time 365923270, (336,210), root:(1189,225),
  state 0x0, keycode 47 (keysym 0x3b, semicolon), same_screen YES,
  XLookupString gives 1 bytes: (3b) ";"
  XmbLookupString gives 1 bytes: (3b) ";"
  XFilterEvent returns: False

Jordan Sissel posted at Fri Jul 6 02:02:02 2007...
Another update: I added logging for when a keycode can't be found for whatever reason. I think the reason keynav is not working for you guys is because  the locality (pl, for example) redefines the keymap such that 'semicolon' doesn't seem to be present. I haven't verified this, however.

To be sure, download the new version 20070705 which will report an error message when it can't lookup a key. xev output will help too. Email me this if you wouldn't mind :)

Worst case, can you try using different keybindings via keynavrc? There's a sample keynavrc that you can use and modify. Copy it to ~/.keynavrc

Jake posted at Thu Aug 2 11:52:50 2007...
Any update on the Windows version of this utility? I'm really interested in using it on a daily basis.

Jordan Sissel posted at Thu Aug 2 12:40:00 2007...
@Jake,

I the windows version halfway done. There was a lifehacker entry that implements keynav with authotkey and does work in windows:
http://lifehacker.com/software/mouser/hack-attack-more-on-mouseless-navigation-217420.php

I may finish the windows version eventually, we'll see. Sorry ;)

Timothy posted at Mon Aug 13 21:28:43 2007...
um, I don't see why you didn't make this twice as fast by taking quarters of the screen...


407
408 void cmd_cut_up(char *args) {
409  if (appstate & STATE_ACTIVE == 0)
410  return;
411  wininfo.h /= 2;
412  wininfo.w /= 2;
413  wininfo.y += wininfo.h;
414  update();
415 }
416
417 void cmd_cut_down(char *args) {
418  if (appstate & STATE_ACTIVE == 0)
419  return;
420  wininfo.h /= 2;
421  wininfo.w /= 2;
422  wininfo.y += wininfo.h;
423  wininfo.x += wininfo.w;
424  update();
425 }
426
427 void cmd_cut_left(char *args) {
428  if (appstate & STATE_ACTIVE == 0)
429  return;
430  wininfo.h /= 2;
431  wininfo.w /= 2;
432  update();
433 }
434
435 void cmd_cut_right(char *args) {
436  if (appstate & STATE_ACTIVE == 0)
437  return;
438  wininfo.h /= 2;
439  wininfo.w /= 2;
440  wininfo.x += wininfo.w;
441  update();
442 }
443

Timothy posted at Mon Aug 13 22:04:17 2007...
if you then put the move commands on the other home row, and make them move only half a width...
then it really is better.

444void cmd_move_up(char *args) {
445  if (appstate & STATE_ACTIVE == 0)
446  return;
447  wininfo.y -= (wininfo.h/2);
448  update();
449 }
450
451 void cmd_move_down(char *args) {
452  if (appstate & STATE_ACTIVE == 0)
453  return;
454  wininfo.y += (wininfo.h/2);
455  update();
456 }
457
458 void cmd_move_left(char *args) {
459  if (appstate & STATE_ACTIVE == 0)
460  return;
461  wininfo.x -= (wininfo.w/2);
462  update();
463 }
464
465 void cmd_move_right(char *args) {
466  if (appstate & STATE_ACTIVE == 0)
467  return;
468  wininfo.x += (wininfo.w/2);
469  update();
470 }

Timothy posted at Mon Aug 13 22:21:40 2007...
sorry to keep posting... update should be changed too, gota click the very top of the screen!
523 void update() {
524  if (wininfo.x < -(wininfo.w/2))
525  wininfo.x = -(wininfo.w/2);
526  if (wininfo.x + (wininfo.w /2) > rootattr.width)
527  wininfo.x = rootattr.width - (wininfo.w/2);
528  if (wininfo.y < -(wininfo.h/2))
529  wininfo.y = -(wininfo.h/2);
530  if (wininfo.y + (wininfo.h/2) > rootattr.height)
531  wininfo.y = rootattr.height - (wininfo.h/2);
532
533  if (wininfo.w <= 1 || wininfo.h <= 1) {
534  cmd_end(NULL);
535  return;
536  }

Jordan Sissel posted at Mon Aug 13 22:23:47 2007...
@Tim,

I'd considered adding diagonal movements but I've never gotten around to it.

Perhaps it would make sense to have the movement and cut commands be configurable, so you could write:

shift+j move-down [amount-to-move-down-by]

Something like:
shift+j move-down y/2

Maybe?

Jordan Sissel posted at Mon Aug 13 22:24:49 2007...
Also, I accept patches readily :)

paulo posted at Tue Aug 14 17:03:58 2007...
I have implemented several patches for keynav (the older version, not the one based on xdotool) that incorporates diagonal cutting and movenment, and it really is twice as fast (or at least, half the keypresses) once you get used to it.

I wouldn't completely overwrite the "up/down/left/right" vi-keys though; they're still pretty handy for fine-tuning.

http://iacs5.ucsd.edu/~pbang/keynav-5pba.tar.gz

also:

http://iacs5.ucsd.edu/~pbang/mouseless.htm

Timothy posted at Tue Aug 14 17:17:44 2007...
this should have no effect with a normal config file... here are some examples of lines you can do though.
17 h cut-top-left
18 t cut-top-right
19 space cut-bottom-left
20 n cut-bottom-right
22 a move-left half
17 through 20 cut to the corner of the window named. and 22 demonstraits how adding half after a move command makes it move half the dimension.
http://timtheli.freeshell.org/keynav.patch

Timothy posted at Tue Aug 14 19:34:53 2007...
paulo, have you not heard of vimperator?

paulo posted at Tue Aug 14 20:04:37 2007...
@timothy -- I have, but that only works in Firefox. =D

Timothy posted at Tue Aug 14 22:07:10 2007...
May I ask what web browser you use instead?

paulo posted at Tue Aug 14 23:54:59 2007...
The browser I use in those screenshots are of 'hv3'. (http://tkhtml.tcl.tk/hv3.html)

I used it in those shots not just because I like 'hv3' (after hacking away a bit at the code not unlike with keynav =), but also because the drag-to-select mode doesn't quite work right with Firefox-- but it works perfectly with hv3 and xterm and most other X apps I've tried it with.

Jordan Sissel posted at Wed Aug 15 01:35:15 2007...
@Tim, fwiw, there isn't any reason to implment 'cut_bottom_left' because you can bind keys to execute multiple commands.

In .keynavrc:
y cut-left,cut-up


This has the effect of "cut up left" without  patches :)

Jordan Sissel posted at Wed Aug 15 01:40:27 2007...
Regarding cut/movement adjustment, I'll add an optional argument to the move and cut commands that is a percentage value multiplied against the current value being modified. That is,

"move-up .5" would move up by 50% of the normal move value. The normal vertical move value is the height of the window.

Hopefully this will be reasonable. I'm open to other suggestions :)

Timothy posted at Wed Aug 15 11:50:09 2007...
I'm just going to continue using my code unless drag gets fixed...

paulo posted at Fri Aug 31 17:15:13 2007...
Possible new features for keynav: undo and nine-grid.

Nine-grid is a mode where instead of cutting up the area into four sections, we cut them up into nine instead. I thought of this soon after implementing diagonal movement in regular "four-grid" keynav. It's faster in that it takes a lot less hits to zoom in, but it's a steep learning curve. (It's also similar to mousegrid schemes used by speech-recognition programs.)

Undo is more straightforward. Just a function that lets you "unzoom"; particularly useful for nine-grid or diagonal movement.

I've implemented it here <http://iacs5.ucsd.edu/~pbang/keynav-7pba.tar.gz>, if you're interested, but that's from the older 'keynav' codebase.

paulo posted at Fri Aug 31 17:51:04 2007...
Possible new features for keynav: undo and nine-grid.

Nine-grid is a mode where instead of cutting up the area into four sections, we cut them up into nine instead. I thought of this soon after implementing diagonal movement in regular "four-grid" keynav. It's faster in that it takes a lot less hits to zoom in, but it's a steep learning curve. (It's also similar to mousegrid schemes used by speech-recognition programs.)

Undo is more straightforward. Just a function that lets you "unzoom"; particularly useful for nine-grid or diagonal movement.

I've implemented it here <http://iacs5.ucsd.edu/~pbang/keynav-7pba.tar.gz>, if you're interested, but that's from the older 'keynav' codebase.

Dan Fitch posted at Mon Oct 22 14:58:14 2007...
Finally started trying to use this, and finding that it is a pretty awesome tool. Much better after getting familiar with it than it seems at first.

However, I can't get the keynavrc to use the key combination I want... I would like to use Super_L+apostrophe to start it (capslock being Super_L here, also set to Mod2) but I can't get anything to work.

Neither `Super_L+apostrophe` or `Mod2+apostrophe`  work here. Can anyone clue me in as to why?

Jordan Sissel posted at Tue Oct 23 03:10:19 2007...
@Dan,

I can confirm your problem. However, I think I have a fix.

1) My code doesn't check for Mod4Mask (typically what Super_L modifies). I've added this now
2) I had trouble getting capslock recognized as Super_L because I already mapped it to Control_L previously. Here is my fix:

% xmodmap - << XMODMAP
remove Lock = Caps_Lock
keycode 66 = Super_L
add Mod4 = Super_L
XMODMAP

I'll put a new release out now. Thanks for the report!

Jeremiah posted at Thu May 1 04:11:46 2008...
This is awesome - thank you Jordan for making such an inspirational and useful tool!

Dave posted at Thu May 1 09:14:38 2008...
Nine-grid sounds good - especially if rigged up to handy keybindings (wer, sdf, xcv or 789, 456, 123 in the numpad).

Between Alt-Tab and Gnome Do I only really use the mouse to either reposition windows or to move around inside the active window - I'll have a look at messing with the source to add some extra modes - I'm thinking different start up keys for different modes.

I'll post again if I get anywhere with it.

Mark posted at Thu May 1 12:04:44 2008...
Made some changes involving parsing the config file, diff here: http://n.ethz.ch/~nevillm/download/keynav.diff
Changes:
* ~/.keynavrc extends defaults rather than replacing them
* "clear" in ~/.keynavrc resets keybindings
* comments can appear anywhere on a line

Feel free to use them if you wish.

Eric posted at Thu May 1 16:41:48 2008...
I made a slight change to the percent_of function which will interpret an arg >= 1.0 as an absolute value instead of a percentage.

I find this very helpful when targeting a small space that i can get close to in 2 or 3 keystrokes and can then move in 10 px intervals until I'm on target.

Otherwise, after the first 2 or 3 it usually takes several more cuts, or when using the percentage move, it moves too far if the blocks are still large.

|*** 334,339 ****
|--- 334,342 ----
|  if (sscanf(args, "%f", &pct) <= 0)
|  pct = default_val;
|
|+  if (pct >= 1.0)
|+  return pct;
|+
|  value = (int)((num * (pct * precision)) / precision);
|  return value;
|  }

Gwern posted at Thu May 1 21:13:54 2008...
This looks pretty neat, but the vi bindings are unusable for me, and quartering strikes me as too slow (maybe it's just me, but at that point, I might as well just reach for the trackball).

While you're considering how to make it more flexible, what I'd like to be able to do is divide the screen up in 6 sections, and then bind the six sections to a block of six keys (the Insert/Delete/Home/End/PgUp/PgDwn slab). I think that'd work well for me.

Jordan Sissel posted at Fri May 2 13:47:20 2008...
Included Mark and Eric's patches in the latest release.

JimmyT posted at Fri May 2 16:46:11 2008...
Hi Jordan, I and a friend whipped up a C# version.  Can you email me your email address so I can email it to you (over email)?  We don't want to maintain it.  :)

Enko posted at Sat May 3 10:00:38 2008...
First I wanted to say that keynav is a realy great app and fills in very wide open gap :D.

I have 2 problems with keynav. The first is a bit strange one, I can activate keynav with C-j, this could be possible because j+second modifier equals to ;. You can obtain my xmodmap from https://neo.eigenheimstrasse.de/svn/linux/xmodmap/neo_de.xmodmap to test this.

The second issue maybe related to the first, is that keynav crashes with the following error message:


$ ./keynav
X Error of failed request:  BadWindow (invalid Window parameter)
  Major opcode of failed request:  12 (X_ConfigureWindow)
  Resource id in failed request:  0x2400001
  Serial number of failed request:  86
  Current serial number in output stream:  88


Thanks a lot for this great piece of software :).

quazibongo posted at Sun May 4 00:25:33 2008...
I can't view the demonstration video because it's flash.

Can you maybe direct link to the underlying video so I can play it with mplayer or vlc?

Jordan Sissel posted at Sun May 4 14:10:55 2008...
The demo was made using Wink, which (iirc) only outputs flash. I don't have the original files anymore anyway.

I can try to make a new one, but your best bet is to just install flash, or find a platform with flash.

Jordan Sissel posted at Thu May 8 13:04:23 2008...
I found a maintainer for the windows version. It should have a project page soon.

Deech posted at Thu Jun 12 17:01:08 2008...
The xdotool program fails to compile on my machine because sizeof (int) and sizeof (long) both report 4. The compiler complains about a duplicate case in the following method of xdotool.c:

void window_print(Window wid) {
  switch (sizeof(Window)) {
  case sizeof(int):
  printf("%d\n", (int)wid);
  break;
  case sizeof(long):
  printf("%ld\n", (long)wid);
  break;
  default:
  printf("Unknown window storage size (%ld)\n", sizeof(Window));
  }
}

Commenting out the second case fixed the issue. Perhaps some kind of #ifdef is in order.

Thanks for a great tool and concept.


Leave a reply

You need javascript enabled to use this form. Anti-spam efforts ongoing. Also, if the comment doesn't show up, it's because the form expired. Go back and copy your comment, reload the form, and resubmit. Apologies if this is a hassle, I'm just playing with antispam methods right now. If this insists on not working, please email me about it.

Name (required)
E-mail (optional, if you want me to be able to email you back)
URL (also optional)
Comment:


Search this site

Navigation

Metadata

Home About Resume My Code (SVN)

Articles

ARP Security Dynamic DNS with DHCP OpenLDAP+Kerberos+SASL PPP over SSH SSH Security: /bin/false Week of Unix Tools Work Efficiency

Projects

fex firefox tabsearch firefox urledit grok keynav liboverride newpsm (FreeBSD) nis2ldap pam_captcha poor man's backup Solaris audio utility xboxproxy xdotool xmlpresenter xpathtool misc scripts

Presentations

Yahoo! Hack Day '06 Unix Essentials Vi/Vim Essentials

Tag Cloud

Calendar

< June 2008
SuMoTuWeThFrSa
1 2 3 4 5 6 7
8 91011121314
15161718192021
22232425262728
2930     

Friends

BarCamp Kent Brewster Tantek Çelik John Resig Wesley Shields Tyler Shields

Technorati