Reached a decision about Area keystroke handling; noted it in the planning document. I just now need to figure out one thing...
This commit is contained in:
parent
88b8937c30
commit
81670724e8
81
areaplan.md
81
areaplan.md
|
@ -678,3 +678,84 @@ Character translation at all | Provided by OS, but not sure about some behaviora
|
|||
Single-keystroke character translation | *TODO* | Constants exist for whatever keyboard layout you can imagine | *TODO*
|
||||
Multi-keystroke character translation | `WM_DEADCHAR`/`WM_UNICHAR` | (see GTK+ s ectiona bove for issues) | Provided by OS; escape hatches avialable
|
||||
Character translation ignoring input language (so the programmer can know that the A key was pressed regardless of language) | *TODO* | *TODO* | *maybe* `charactersIgnoringModifiers`? *TODO*
|
||||
|
||||
### OK new consensus
|
||||
Windows: use virtual key codes<br>
|
||||
OS X: use `charactersIgnoringModifiers`
|
||||
|
||||
```go
|
||||
(on the Area comment)
|
||||
// Do not use an Area if you intend to read text.
|
||||
// Due to platform differences regarding text input,
|
||||
// keyboard events have beem compromised in
|
||||
// such a way that attempting to read Unicode data
|
||||
// in platform-native ways is painful.
|
||||
// [Use TextArea instead, providing a TextAreaHandler.]
|
||||
(corollary: this means multi-line edits will need a different name; corollary 2: this means I will have to start providing font resource acquisition, something I didn't want to do (I wanted to relegate that to freetype-go or similar, assuming that was even capable of doing so))
|
||||
|
||||
// A KeyEvent represents a keypress in an Area.
|
||||
//
|
||||
// KeyEvent has been designed to be predictable.
|
||||
// As the different operating systems supported by package ui
|
||||
// expose wildly different APIs and rules for reading keystrokes,
|
||||
// this means that KeyEvent has certain rules and restrictions
|
||||
// that you must mind. This makes KeyEvent unsuitable
|
||||
// for reading text (as Area's comment will say).
|
||||
// As another consequence, no KeyEvent will be generated if
|
||||
// package ui cannot portably report a given key. Supported
|
||||
// keys are described in the comments for the Rune field and
|
||||
// the ExtKey and Modifiers types.
|
||||
type KeyArea struct {
|
||||
// Rune contains a lowercase rune specifying the name
|
||||
// of the key pressed that triggered the event.
|
||||
// Ideally, this would generally correspond to
|
||||
// the raw character pressed (so there would be two
|
||||
// events 'k', 'a' instead of 'か', if Japanese characters are
|
||||
// input that way on a given machine). This will hold true
|
||||
// on systems where IME returns are separate from
|
||||
// keypress codes. On other systems, an attempt has
|
||||
// been made to map backwards based on information
|
||||
// that can be provided in the most portable (if the
|
||||
// system provides multiple of its own backends) way.
|
||||
// See [TODO] for a list of Rune values that are guaranteed
|
||||
// to be available. There is no way to differentiate between
|
||||
// multiple differnet Keys with the same name (for instance,
|
||||
// there is no way to differentiate between '1' on the typewriter
|
||||
// section of a standard 101-key keyboard and '1' on the numeric
|
||||
// keypad section).
|
||||
// If this field is zero, see ExtKey.
|
||||
Rune rune
|
||||
|
||||
// If Rune is zero, ExtKey contains a predeclared identifier
|
||||
// naming an extended key. See ExtKey for details.
|
||||
// If both Rune and ExtKey are zero, a Modifier by itself
|
||||
// was pressed. Rune and ExtKey will not both be nonzero.
|
||||
ExtKey ExtKey
|
||||
|
||||
Modifiers Modifiers
|
||||
|
||||
// If Up is true, the key was released; if not, the key was pressed.
|
||||
// There is no guarantee that all pressed keys shall have
|
||||
// corresponding release events (for instance, if the user switches
|
||||
// programs while holding the key down, then releases the key).
|
||||
// Keys that have been held down are reported as multiple
|
||||
// key press events.
|
||||
Up bool
|
||||
}
|
||||
|
||||
// ExtKey represents keys that do not have a Rune representation.
|
||||
// There is no way to differentiate between left and right ExtKeys.
|
||||
type ExtKey uintptr
|
||||
const (
|
||||
keyname1 ExtKey = iota
|
||||
keyname2
|
||||
keyname3
|
||||
)
|
||||
(notes: this will have to be produced based on what's available on each platform (Mac OS X might be the biggest filter here); also as a personal favor-the-user decision Print Screen shall not be supported)
|
||||
```
|
||||
|
||||
If I ever intend on providing alternate text-based widgets, I will need to use `GtkTextArea` and `NSTextArea` to make things work the most fluidly, so this will require another type. Woo...
|
||||
|
||||
Also this answers the what if a key has been held down and switches away from the program question: Windows does not send a key up.
|
||||
|
||||
This just leaves the GTK+ geometry mapping: there is a way to do it if X11 is the only supported backend, but Wayland exists...
|
||||
|
|
Loading…
Reference in New Issue