Wayland requires its clients to handle key repeating themselves.
Our strategy is simple: start a timer on key down and fire key
events at regular intervals until another key event arrives.
However, if the program blocks the event loop while processing a
synchronous event, key repeats might pile up before the stopping
key event is processed.
This change use the timestamp of the stopping key event to only
dispatch the repeats queued up before the stop time.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
We don't have full IME-aware editor yet. Fortunately, the BaseInputConnection
has a "dummy mode" setting to allow us to receive input from the fancier keyboards
without implementing the full IME interface.
Fixes gio#7 (I hope; I tested with SwiftKey that had the same symptoms)
Signed-off-by: Elias Naur <mail@eliasnaur.com>
It seems that the iOS simulator can return NaN from texture2D, so
even though width == 0, the resulting cover is not.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Now that the gio tool can generate runnable mobile and webassembly
apps, the support files are no longer needed.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
With a <textarea> DOM element pressing the enter key will result in
a "Enter" key down event and a "\n" input event. We're only
interested in the key event, so switching to a single line <input>
avoids the extra "\n".
Signed-off-by: Elias Naur <mail@eliasnaur.com>
To avoid passing a queue type for each kind of input (pointer, key),
introduce package input for mapping a handler key to all input events.
Future input sources can be added without changes to programs, and
as an added bonus, event ordering is preserved across input sources.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
When merging the key and pointers input sources, we can't return
the text input state as a side effect of the Frame method.
Expose it as a method in the key event queue instead.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Similar to the previous change for pointers, only determine the
activeness of a handler from its presence in the ops list.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
We're about to merge the pointer and key event streams in a single
input queue. To do that, we need to simplify Queue.For to just returning
events for the given handler.
First step is the handler active flag.
Dropping handlers that haven't had their events read doesn't seem
worth it. Drop that special case and only determine a handler's activeness
from its presence in the ops list.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Layouts and path builders are transient and need an ops list for
operation. However, instead of passing the ops list to every method,
pass the list in an init method and store it for subsequent methods.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Instead of using the most recent area for hit testing a pointer handler,
use the intersection of the areas up until the handler.
Fixes a bug where layout.List children received pointer events in their
clipped areas.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
Split out OpArea from OpHandler to allow stacked areas in a followup.
Replace hit closures with static shapes (rectangles and ellipses) to
avoid allocations. If needed, generic hit functions can be introduced
again later.
Signed-off-by: Elias Naur <mail@eliasnaur.com>