diff --git a/src/screen.c b/src/screen.c
index 196492029d734aa3747a3ba80528c88e68df947f..d3533d00f0b4a6d139c991f334bd42ec26ef454a 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -414,7 +414,17 @@ myScreenGrabKeys (ScreenInfo *screen_info)
 
     dpy = myScreenGetXDisplay (screen_info);
 
-    for (i = 0; i < KEY_COUNT; i++)
+    /*
+       Ugly hack: KEY_CANCEL is used just for cancelling window ops
+       it should not be grabbed all the time (especially when you
+       realize that it's mapped to Esc by default, damn, I can't
+       switch back to command mode in vi anymore, I'm stuck in 
+       edition mode ;)
+
+       That's why we start at FIRST_KEY which is defined after 
+       KEY_CANCEL...
+     */
+    for (i = FIRST_KEY; i < KEY_COUNT; i++)
     {
         grabKey (dpy, &screen_info->params->keys[i], screen_info->xroot);
     }
diff --git a/src/settings.h b/src/settings.h
index 977a5e3e26cbc9e01999dbaa42d56b7be7cfb463..0c4c631e401671616b66e05dd65cff28d8904b69 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -40,10 +40,11 @@ enum
     TITLE_SHADOW_FRAME
 };
 
+#define FIRST_KEY KEY_ADD_WORKSPACE
 enum
 {
+    KEY_CANCEL = 0,
     KEY_ADD_WORKSPACE,
-    KEY_CANCEL,
     KEY_CLOSE_WINDOW,
     KEY_CYCLE_WINDOWS,
     KEY_DEL_WORKSPACE,