312 Commits

Author SHA1 Message Date
Carlos Garnacho
f3c26ae17f keyboard: Minor refactor
This small function is just called from a single place,
drop it.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
834be93666 keyboard: Drop dead code
This getGroups() method was not called anywhere for
a long time, the last user was dropped at commit
8fdf47ea5b ("keyboard: Do not create widgetry for
all keyboard groups at once").

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
c6d2f7d6c4 keyboard: Simplify group change emission at KeyboardController
Since we now just store the current group, we do not need to track
closely source changes vs selection changes in the available sources.
We just re-generate the current OSK keymap for all, so coalesce both
signals into a more generic "group-changed".

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
50e8203ce7 keyboard: Honor emoji-visible through input hints
And fix it so it is effective again. This is a small piece of
smarts the code needs to earn, so that keys with the "emoji"
action are hidden, and their width assigned to the next key.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
99ab1988d2 keyboard: Refer to levels by name instead of index
And drop some more guesswork in the code, since some layouts have
less than 4 levels. This also allows for having OSK maps with more
than 4 levels. Let us hope that the sanity of our future kin will
remain below that threshold.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
b78b61a0be keyboard: Handle number/phone input purposes specifically
Add OSK keymaps for these, with the special keys necessary to
type numbers(positive, negative, fractional, ...) and phone numbers
(with */+/#)

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6550
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
32ada34e1d keyboard: Replace Keypad object with a "digits" JSON OSK keymap
Drop some code, in favor of a numeric keypad that is driven through
the same JSON-based maps. This is also a first use of the "height"
key property in the JSON files, for the Enter key.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
3f6f2f2376 keyboard: Figure out keypad visibility through purpose hints
Drop the keypad-visible KeyController signal, and figure it out
through the already notified purpose hint.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
4a4582b76c keyboard: Allow for terminal variants in specific languages
Do not hardcode the us-terminal OSK keymap, and append '-extended'
to the current group name, accounting with the existing 'us' fallback.
This allows for concerned individuals to propose language-specific
terminal layouts.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
0131408c0d keyboard: Keep OSK widgetry for a single group
Keep enough widgetry in memory for just the current group,
this means we more eagerly destroy and re-create actors on
language changes.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
35bfb4501d keyboard: Handle extended keyboards through TERMINAL input purpose
Drop the channeling of this specific signal from the InputMethod, and
update the OSK Keyboard object to using the purpose hint to find out
whether a extended keymap is necessary.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
173d70dc70 keyboard: Forward input purpose from KeyboardController
Instead of adding more emoji/keypad signals, forward the input
purpose, so that in future commits the Keyboard object can figure
out the right layout from the purpose hint.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
8673758336 keyboard: Rename function
Avoid the "ForGroup" suffix, and get the keyboard group implicitly.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
9c8452269d keyboard: Minor refactor
Call the _updateKeys() method, instead of inlining it.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
cfc0d42c7a keyboard: Add/document "height" optional property
This will allow OSK descriptions to declare "tall" keys. May be
used in combination with the "start" property added in previous
commits, in case a gap needs to be explicitly left.

No OSK description uses this yet.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
d1aa2acef1 keyboard: Add/document "leftOffset" optional property on OSK keys
This optional property defines the offset the a key should have
relative to the previous key (on its left) or the start of the
column if it is the first key. If this property is not
present, the key will be placed with no relative offset.

This for example allows keymaps to explicitly define the padding
of the rows that are not "full" relative to other rows, without
guesswork in the code. It is used for this purpose in the
keymaps/levels/rows that needed it.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Carlos Garnacho
a93858b862 keyboard: Simplify key width handling
We do not need to store the key width in the Key object
itself when constructing the layout, and can attach it
to the grid from the model data right away.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
2024-02-29 16:34:21 +01:00
Sebastian Keller
7a409bfffc keyboard: Delete selected text on backspace
Previously backspace would only ever remove a single character left of
the cursor, regardless of selection.

This requires the application to correctly set the anchor position in
text_input::set_surrounding_text(), which currently only gtk4 seems to
do. When there is no selection or on other applications that always set
cursor = anchor, like gtk3 does, the behavior is not changed and still
only deletes one character.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2746>
2024-02-29 14:56:16 +00:00
Sebastian Keller
484a237002 keyboard: Fix deleting the previous word
Since mutter@33088d59 the cursor we receive from mutter already is a
character index while the code here still treated it like a byte offset.

Further the code to detect the previous word position was treating the
cursor parameter already like a character index, while passing the
cursor that was prior to that commit a byte offset.

The function also had some unreachable and redundant code paths. The
pos < 0 case can never be reached due to the max(). Also the regex
already ensures that all whitespace is considered, so the code to remove
spaces not actually do anything except when deleting the first word in
the text, in which it would cause the first character to not get
deleted.

Also it was not handling characters with more than 2 bytes correctly. In
the presence of these JS string functions, such as search(), can not be
considered to operate on character indices anymore but rather the number
of UTF-16 byte pairs. Issues with this can be avoided by using
iterators, which unlike anything else iterate on characters, not byte
pairs and by not using the results returned by JS string functions for
anything but JS strings.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2746>
2024-02-29 14:56:16 +00:00
Carlos Garnacho
1940573bef keyboard: Avoid markup escaping when setting button labels
These are no longer interpreted as Pango markup.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3149>
2024-01-29 22:15:53 +00:00
Sam Hewitt
8e1241c29b popupMenu: Use less ambiguous symbols for radio options
- new checked and unchecked dot ornament assets
- updated JS with a NO_DOT ornament state, replaced instances of NONE with this

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3027>
2023-12-02 10:11:10 +00:00
Zander Brown
350cd296fa js: Stop using ClutterContainer API
These have been long deprecated over in clutter, and (via several
vtables) simply forward the call to the equivalent ClutterActor methods

Save ourselves the hassle and just use ClutterActor methods directly

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3010>
2023-11-10 20:19:13 +00:00
Sebastian Keller
4722dd0d32 keyboard: Fix backspace not getting released after deleting preedit
When deleting is toggled while a preedit string is present, this causes
_toggleDelete() to use keyvalPress(). After the entire preedit string
has been deleted, _toggleDelete() will no longer hit the code path that
would call keyvalRelease() due to hasPreedit() now being false.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7171
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3009>
2023-11-08 15:01:10 +01:00
Carlos Garnacho
bc3b890e75 keyboard: Only reset to the default level on unlocked latched levels
Reportedly, non-alphanumeric key levels were able to stick by
happenstance, and let the user press multiple keys until explicitly
switching to a different mode. Reportedly, this broke, switching to
the default level after the first key press on the additional levels.

Since we have this information in the OSK key models (each level has
a "mode" field to either default/latched/locked), retrieve this
information for them for each level, and only reset to the default
level if on one of those latched levels, and the relevant key was not
locked through long-press.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5763
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2945>
2023-09-08 19:42:38 +00:00
Carlos Garnacho
08f3ad3835 keyboard: Reset latched levels on string commit on all situations
The _commitAction() paths have early returns, which made resetting the
latched mode inconsistent depending on the paths taken to commit the
string. This made latched modes not return to normal on e.g. Shell
entries.

Make this happen outside the function, and after the only calling
point, so that the level is correctly reset on all situations.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2945>
2023-09-08 19:42:38 +00:00
Florian Müllner
a42f7c2384 cleanup: Use type-safe comparisons
We have been using type-safe comparisons in new code for quite a while
now, however old code has only been adapted slowly.

Change all the remaining bits to get rid of another legacy style
difference.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2866>
2023-08-09 15:10:38 +00:00
Florian Müllner
9a3913d4a0 cleanup: Use consistent 4-space indent
This is another bit where we've made good progress, and just need
a final push to complete the transition.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2866>
2023-08-09 15:10:37 +00:00
Florian Müllner
071f92cfb6 cleanup: Remove spaces in object literals
We only adopted this style relatively recently, so there's a bit
more to adjust. Still, it's manageable and another step towards
getting rid of the legacy style.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2866>
2023-08-09 15:10:37 +00:00
Evan Welsh
a751e213f6 js: Port to modules
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1499>
2023-08-06 13:02:49 +02:00
Evan Welsh
1e9b906cbc js: Split gi imports to be on new lines to prepare for ES modules
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2794>
2023-06-21 04:50:33 -07:00
Roshan-R
63904a09bf keyboard: Change osk menu entry to control-center keyboard pane
Currenty, the osk settings popup has the menu entry of "Region and
Language settings" which should be changed to the "Keyboard" pane
instead as input source configuration is done there.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6134

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2554>
2022-11-24 13:49:55 +01:00
Carlos Garnacho
a33e3eaf22 keyboard: Ensure completion is disabled when OSK is destroyed
If the OSK is destroyed while visible without being close()'d first,
the completion mode might remain turned on. Ensure it is turned off
on OSK destruction so that typing-booster has no chance to remain
turned on.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2543>
2022-11-16 18:06:27 +00:00
Carlos Garnacho
52253625b8 keyboard: Disconnect from InputMethod::terminal-mode-changed on destruction
The OSK may be created and destroyed, while it connects to signals from the
longer-lived InputMethod object. This makes these signals linger and issue
copious warnings while trying to change the extended keymap and new ratio
on a defunct OSK.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6085
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2543>
2022-11-16 18:06:27 +00:00
Carlos Garnacho
a0352ba312 keyboard: Bind emoji pager visibility to swipeTracker enabled state
The swipeTracker may connect gestures on the stage, so we might end up
in the odd situation that the swipeTracker is handling events for an
invisible actor. Avoid doing this.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2543>
2022-11-16 18:06:27 +00:00
Carlos Garnacho
7e4f7c7e5b keyboard: Explicitly destroy swipeTracker after emoji panel destruction
Even though the emoji panel may be destroyed with the OSK, the swipeTracker
that is set up to navigate between pages is left lingering, and handling
events for some gestures in the stage. This results in warnings like:

  JS ERROR: TypeError: this._panel is null
  set delta@resource:///org/gnome/shell/ui/keyboard.js:720:9
  _onSwipeUpdate@resource:///org/gnome/shell/ui/keyboard.js:750:22
  _updateGesture@resource:///org/gnome/shell/ui/swipeTracker.js:670:14
  vfunc_gesture_progress@resource:///org/gnome/shell/ui/swipeTracker.js:288>

on touch interaction after the OSK was shown and dismissed. In order to fix
this, issue explicit destruction of the swipeTracker when the emoji pager
actor is destroyed.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2543>
2022-11-16 18:06:27 +00:00
Carlos Garnacho
b2f2266199 keyboard: Synchronize input method state after toggling completion
Make the input method synchronize its state after the engine changes
resulting from completion being toggled.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2512>
2022-10-26 10:00:37 +00:00
Carlos Garnacho
76090c14eb inputMethod: Check return value when letting IM handle virtual keys
When propagating keys from the OSK, we usually feed these directly to
the IBusInputContext and let the IM handle the effects of this virtual
key event (which may also include feeding a key event back to us).

But these functions may also return a FALSE value if the key was "let
through" by the IM, which means the ball is in our yard again, and
we are responsible of letting this event get to its destination.

If that happens, just fall through, so the string is committed to
the client as an UTF-8 string, or propagated through keyboard events.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5930
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2508>
2022-10-18 19:31:51 +00:00
Carlos Garnacho
766314acb2 keyboard: Refactor code
Move inline anonymous function to be its own. This method
will become asynchronous in following commits.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2508>
2022-10-18 19:31:51 +00:00
Carlos Garnacho
622590179b keyboard: Use the right property to figure out modifiers set size
During development of the OSK updates, this._modifiers turned from an
array into a Set(), but this location missed switching from length()
to size() to get the cardinality of the contained values.

As a result, the OSK misbehaved and resorted for key event forwarding
for impossible keyvals, instead of handing them directly to the IM.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5766
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2445>
2022-08-23 18:37:11 +00:00
Carlos Garnacho
9bd91ca4d8 keyboard: Change page switching animation in emoji picker
Use a carousel animation to switch pages, and set up the emoji
picker to have the system text direction so that coordinate
flipping is mostly done for us in RTL.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5616
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00
Carlos Garnacho
c6c6eb5310 keyboard: Shuffle text direction initialization
We do set the full OSK as LTR since keymaps are defined in that
direction. Other actors inside the OSK might want differently so
move this piece of setup to init(), so child actors can set their
own without the OSK overwriting the value.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00
Carlos Garnacho
2b81355fa1 keyboard: Use SwipeTracker for emoji panel page switching
This allows handling scroll events, in addition to 1fg and pointer
gestures. 3fg gestures are less relevant here.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00
Carlos Garnacho
aab9899cb7 keyboard: Propagate ratio changes to the emoji selection panel
Update the emoji panel so it can handle ratio changes dynamically,
and propagate the ratio from the Keyboard itself, so that the
emoji panel has a size that fits the OSK panel it was launched
from.

This is more important now with widely varying ratios, like
extended keyboards.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00
Carlos Garnacho
90bd0c4a25 keyboard: Add Hangul OSK keymap
This keymap requires the corresponding input method for Hangul
input, and the hangul mode to be enabled. Look up for the right
state, and use a corresponding 'us' keymap for english input
otherwise, in order to follow hangul IM behavior.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00
Carlos Garnacho
b18ab0086e keyboard: Let the OSK take 1/4th of height in portrait mode
And let the keys shrink horizontally to cover the full area.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00
Carlos Garnacho
f1fcce66aa keyboard: Always use ratio of visible level
Since the OSK keymap actors are cached, we no longer update the aspect
container ratio as often as we should. Ensure to update the aspect ratio
with language/level changes.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00
Carlos Garnacho
c0a75faf89 keyboard: Use extended US keyboard for terminal mode
If the input hint is "terminal", use the extended keyboard.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00
Carlos Garnacho
aa341104e5 keyboard: Fill suggestion on button-press-event
Like OSK key buttons, we must avoid the default grabbing behavior
of StButton here. Hook to button-press-event to commit the selected
words, so we get a chance to prevent focus changes on the current
key focus.

Likewise, connect to ::touch-event to handle touch input.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00
Carlos Garnacho
b210b2de72 ibusManager: Add OSK completion mode
This mode changes the current IBus engine to ibus-typing-booster
under the rug (i.e. no changes in keyboard status menu) for any
XKB engine selected.

In order to make it useful for the currently selected language,
the typing-booster dictionary is changed to the current XKB
layout language. And since the OSK has its own emoji panel,
typing-boosters own emoji completion is disabled.

These changes only apply as long as the OSK panel is shown,
reverting to the original engine and typing-booster configuration
after it is hidden. This in theory also caters for users that
do have ibus-typing-booster enabled as an input source.

The final effect is text prediction for the language that is
being typed, according to the OSK layout, given that
ibus-typing-booster and the relevant hunspell dictionaries are
used.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00
Carlos Garnacho
fce376939f keyboard: Add 'delete' OSK key action
This action will replace CLUTTER_KEY_Backspace emission for
the OSK backspace key. Following the available mockups, implement
different modes of operation:

- Single tap deletes a single character
- Long tap starts deleting characters one by one
- Longer tap switches to word-by-word deletion

This is made possible via the input method surrounding text,
inspecting the string to look the previous char/word position
backwards, and relies on IM focus providing enough context.

Since deleting text and getting surrounding text are both
async operations, we make one happen after the other, until
the button is released.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2278>
2022-08-10 17:11:26 +00:00