package x import "github.com/jezek/xgb/xproto" import "github.com/jezek/xgbutil/keybind" import "git.tebibyte.media/sashakoshka/stone" // when making changes to this file, look at keysymdef.h var buttonCodeTable = map[xproto.Keysym] stone.Button { 0xFFFFFF: stone.ButtonUnknown, 0xFF63: stone.KeyInsert, 0xFF67: stone.KeyMenu, 0xFF61: stone.KeyPrintScreen, 0xFF6B: stone.KeyPause, 0xFFE5: stone.KeyCapsLock, 0xFF14: stone.KeyScrollLock, 0xFF7F: stone.KeyNumLock, 0xFF08: stone.KeyBackspace, 0xFF09: stone.KeyTab, 0xFF0A: stone.KeyEnter, 0xFF1B: stone.KeyEscape, 0xFF52: stone.KeyUp, 0xFF54: stone.KeyDown, 0xFF51: stone.KeyLeft, 0xFF53: stone.KeyRight, 0xFF55: stone.KeyPageUp, 0xFF56: stone.KeyPageDown, 0xFF50: stone.KeyHome, 0xFF57: stone.KeyEnd, 0xFFE1: stone.KeyLeftShift, 0xFFE2: stone.KeyRightShift, 0xFFE3: stone.KeyLeftControl, 0xFFE4: stone.KeyRightControl, 0xFFE9: stone.KeyLeftAlt, 0xFFEA: stone.KeyRightAlt, 0xFFEB: stone.KeyLeftSuper, 0xFFEC: stone.KeyRightSuper, 0xFFFF: stone.KeyDelete, 0xFFBE: stone.KeyF1, 0xFFBF: stone.KeyF2, 0xFFC0: stone.KeyF3, 0xFFC1: stone.KeyF4, 0xFFC2: stone.KeyF5, 0xFFC3: stone.KeyF6, 0xFFC4: stone.KeyF7, 0xFFC5: stone.KeyF8, 0xFFC6: stone.KeyF9, 0xFFC7: stone.KeyF10, 0xFFC8: stone.KeyF11, 0xFFC9: stone.KeyF12, } func (backend *Backend) keycodeToKeysym ( keycode xproto.Keycode, ) ( keysym xproto.Keysym, ) { keysym = keybind.KeysymGet(backend.connection, keycode, 0) // TODO: shift isnt working. follow // https://tronche.com/gui/x/xlib/input/keyboard-encoding.html println("--") println(keycode) println(keysym) println(stone.EventPress(keysymToButtonCode(keysym))) return } func keysymToButtonCode (keysym xproto.Keysym) (button stone.Button) { var isControl bool button, isControl = buttonCodeTable[keysym] if isControl { return } // some X keysyms have a single bit set to 1 here. i believe this is to // prevent conflicts with existing codes. if we mask it off we will get // a correct utf-32 code point. if keysym & 0xF000000 == 0x1000000 { button = stone.Button(keysym & 0x0111111) return } // X keysyms like 0xFF.. or 0xFE.. are non-character keys. we already // resolve these by looking them up in the button code table, so if any // that we don't support pop up we should just silence them as it is // effectively garbage data as far as stone applications are concerned. if (keysym >> 8) == 0xFF || (keysym >> 8) == 0xFE { button = stone.ButtonUnknown return } // if none of these things happened, we can safely (i think) assume that // the keysym is an exact utf-32 code point. button = stone.Button(keysym) return }