code: func interpretSymList(xu *xgbutil.XUtil, keycode xproto.Keycode) (
  	k1 string, k2 string, k3 string, k4 string) {
  
  	ks1 := KeysymGet(xu, keycode, 0)
  	ks2 := KeysymGet(xu, keycode, 1)
  	ks3 := KeysymGet(xu, keycode, 2)
  	ks4 := KeysymGet(xu, keycode, 3)
  
  	// follow the rules, third paragraph
  	switch {
  	case ks2 == 0 && ks3 == 0 && ks4 == 0:
  		ks3 = ks1
  	case ks3 == 0 && ks4 == 0:
  		ks3 = ks1
  		ks4 = ks2
  	case ks4 == 0:
  		ks4 = 0
  	}
  
  	// Now convert keysyms to strings, so we can do alphabetic shit.
  	k1 = KeysymToStr(ks1)
  	k2 = KeysymToStr(ks2)
  	k3 = KeysymToStr(ks3)
  	k4 = KeysymToStr(ks4)
  
  	// follow the rules, fourth paragraph
  	if k2 == "" {
  		if len(k1) == 1 && unicode.IsLetter(rune(k1[0])) {
  			k1 = string(unicode.ToLower(rune(k1[0])))
  			k2 = string(unicode.ToUpper(rune(k1[0])))
  		} else {
  			k2 = k1
  		}
  	}
  	if k4 == "" {
  		if len(k3) == 1 && unicode.IsLetter(rune(k3[0])) {
  			k3 = string(unicode.ToLower(rune(k3[0])))
  			k4 = string(unicode.ToUpper(rune(k4[0])))
  		} else {
  			k4 = k3
  		}
  	}
  
  	return
  }
docs: // interpretSymList interprets the keysym list for a particular keycode as
  // described in the third and fourth paragraphs of http://goo.gl/qum9q