code: func ParseString(
  	xu *xgbutil.XUtil, s string) (uint16, []xproto.Keycode, error) {
  
  	mods, kcs := uint16(0), []xproto.Keycode{}
  	for _, part := range strings.Split(s, "-") {
  		switch strings.ToLower(part) {
  		case "shift":
  			mods |= xproto.ModMaskShift
  		case "lock":
  			mods |= xproto.ModMaskLock
  		case "control":
  			mods |= xproto.ModMaskControl
  		case "mod1":
  			mods |= xproto.ModMask1
  		case "mod2":
  			mods |= xproto.ModMask2
  		case "mod3":
  			mods |= xproto.ModMask3
  		case "mod4":
  			mods |= xproto.ModMask4
  		case "mod5":
  			mods |= xproto.ModMask5
  		case "any":
  			mods |= xproto.ModMaskAny
  		default: // a key code!
  			if len(kcs) == 0 { // only accept the first keycode we see
  				kcs = StrToKeycodes(xu, part)
  			}
  		}
  	}
  
  	if len(kcs) == 0 {
  		return 0, nil, fmt.Errorf("Could not find a valid keycode in the "+
  			"string '%s'. Key binding failed.", s)
  	}
  
  	return mods, kcs, nil
  }
docs: // ParseString takes a string of the format '[Mod[-Mod[...]]]-KEY',
  // i.e., 'Mod4-j', and returns a modifiers/keycode combo.
  // An error is returned if the string is malformed, or if no valid KEY can
  // be found.
  // Valid values of KEY should include almost anything returned by pressing
  // keys with the 'xev' program. Alternatively, you may reference the keys
  // of the 'keysyms' map defined in keybind/keysymdef.go.