Cellwriter needs to have a keycode for every simulated keysym it does. It tries to find an existing keycode <-> keysym mapping if possible, but the code that does it unnecessarily checks for the second (shifted) keysym before checking the unshifted one first; so some keysyms are always delivered with a simulated shift key even if it is not necessary. Fixed. James 2015. diff -ur cellwriter-1.3.5/src/keyevent.c cellwriter-1.3.5-new/src/keyevent.c --- cellwriter-1.3.5/src/keyevent.c 2012-11-12 13:52:30.000000000 +0700 +++ cellwriter-1.3.5-new/src/keyevent.c 2015-04-12 01:26:51.000000000 +0700 @@ -263,7 +263,7 @@ key_event->shift = FALSE; #ifndef ALWAYS_OVERWRITE for (i = 0; i <= key_max - key_min; i++) { - if (keysyms[i * key_codes + 1] == keysym) + if (keysyms[i * key_codes] != keysym && keysyms[i * key_codes + 1] == keysym) key_event->shift = TRUE; if (keysyms[i * key_codes] == keysym || key_event->shift) { key_event->keycode = key_min + i;