tcell icon indicating copy to clipboard operation
tcell copied to clipboard

Support for multi-rune character input

Open indiejames opened this issue 1 year ago β€’ 2 comments

EventKey only supports a single rune, which doesn't allow for multi-rune characters that can be input in macOS using the emoji/symbols popup menu. SInceSetContent supports multi-rune characters, it would be useful if EventKey could handle multiple runes.

indiejames avatar Apr 12 '24 01:04 indiejames

Can you give an example? Is this combining characters or something like that?

gdamore avatar Apr 12 '24 06:04 gdamore

Yes, this would be using combining characters. Given the following code that reads from stdin:

package main

import (
	"fmt"
	"os"

	"golang.org/x/term"
)

func main() {
	// switch stdin into 'raw' mode
	oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
	if err != nil {
		fmt.Println(err)
		return
	}
	defer term.Restore(int(os.Stdin.Fd()), oldState)

	b := make([]byte, 16)
	var len int
	for {
		len, err = os.Stdin.Read(b)
		if err != nil {
			fmt.Println(err)
			return
		}
		if string(b[0:len]) == "q" {
			break
		}
		fmt.Println("read", len, "bytes")
		fmt.Printf("the char %s was hit\n", string(b[0:len]))
	}
}

I can run this and enter πŸ‡ΎπŸ‡ͺ which consistently prints out the following:

read 8 bytes the char πŸ‡ΎπŸ‡ͺ was hit

I have tried using os.Stdin.Read with a tcell/tview project as a work-around, which works somewhat, but it seems to drop about every other typed character. This is without calling SetInputCapture on the tview application. Not sure if there is a way to fix that (I can ask on the tview site), but I thought it better to use EventKey if it could handle multi-rune character input.

indiejames avatar Apr 12 '24 12:04 indiejames