Compare commits

..

8 Commits

Author SHA1 Message Date
Jules Aguillon
545a956b0c Make vertical sliders slower
Make vertical sliders slower. The intention is to make the up/down
slider slower, as we have less visibility and do smaller movements in
that direction.
2025-06-29 16:45:06 +02:00
Jules Aguillon
f36a7c8e9d Fix unwanted bottom margin on Samsung OneUI 7 (#1022)
This fixes the unwanted margin at the bottom of the screen on
Samsung One UI 7 based on Android 15.
2025-06-29 16:18:49 +02:00
solokot
004ed95dfd Update Russian translation (#1021)
Some checks failed
Check layouts / check_layout.output (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
2025-06-29 11:41:12 +02:00
alotbsol555
9d12981b34 cut and copy with built in keys only if text is selected (#1019)
Some checks failed
Make Apk CI / Build-Apk (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Check layouts / check_layout.output (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
cut and copy with built in keys only if text is selected to keep existing clipboard content. does not work for key combinations like ctrl+x or ctrl+c.
2025-06-21 22:15:22 +02:00
Jules Aguillon
c6da6d6ab5 Fix selection mode not exited when selection cleared (#1020)
Some checks failed
Make Apk CI / Build-Apk (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Check layouts / check_layout.output (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
The selection mode was not exited when the selection was cleared with,
for example, ctrl+x.
2025-06-19 23:12:37 +02:00
David
2e0be0b32b Added Macedonian language layout (#1016) 2025-06-19 23:11:17 +02:00
Jules Aguillon
42528ab211 Improve selection mode when selection ends cross (#1013)
Some checks failed
Check layouts / check_layout.output (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Make Apk CI / Build-Apk (push) Has been cancelled
Emptying the selection with the spacebar slider puts the selection mode
in an unexpected state. This checks that this doesn't happen.

The selection ends can now cross each other, reversing the selection
order. Special care is made to make sure that the sliders go in the
expected direction.

Pointers is changed to send a `onPointerDown` for the first slider event
instead of a `onPointerHold`. This event is detected in
`KeyEventHandler` and the selection ends are reordered if needed when
sliding again.
2025-06-19 01:10:06 +02:00
Jules Aguillon
71d2784026 Add <row scale=""> attribute (#1018)
Some checks failed
Make Apk CI / Build-Apk (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Check layouts / check_layout.output (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
* Add <row scale=""> attribute

Scale the width of the keys in the row to match a value. Useful to
remove space on the right of the row without adding a 'width' attribute
to each key.

* layouts: Use the 'scale=""' attribute in builtin layouts

This removes the very specific 'width' values.
2025-06-18 00:49:34 +02:00
17 changed files with 187 additions and 120 deletions

View File

@@ -7,6 +7,7 @@ arab_pc_hindu: Layout includes some ASCII punctuation but not all, missing: !, '
arab_pc_ir: Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], `, {, |, } arab_pc_ir: Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], `, {, |, }
beng_national: Layout includes some ASCII punctuation but not all, missing: $ beng_national: Layout includes some ASCII punctuation but not all, missing: $
beng_provat: Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >, [, \, ], `, {, |, } beng_provat: Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >, [, \, ], `, {, |, }
cyrl_lynyertdz_mk: Layout includes some ASCII punctuation but not all, missing: "
cyrl_yaverti: Layout includes some ASCII punctuation but not all, missing: ~ cyrl_yaverti: Layout includes some ASCII punctuation but not all, missing: ~
cyrl_yxukeng_os: Layout includes some ASCII punctuation but not all, missing: ", #, $, &, ', @, [, ], ~ cyrl_yxukeng_os: Layout includes some ASCII punctuation but not all, missing: ", #, $, &, ', @, [, ], ~
deva_alt: Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), *, +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~ deva_alt: Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), *, +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~

View File

@@ -52,9 +52,11 @@ The `<keyboard>`...`</keyboard>` pair follows the declaration tag and encloses t
* `locale_extra_keys`: Whether Unexpected should add language-dependent extra keys from [method.xml](../res/xml/method.xml) to this layout. It accepts `true` or `false`, and defaults to `true`. To disable these automatic additions, specify `locale_extra_keys="false"`. * `locale_extra_keys`: Whether Unexpected should add language-dependent extra keys from [method.xml](../res/xml/method.xml) to this layout. It accepts `true` or `false`, and defaults to `true`. To disable these automatic additions, specify `locale_extra_keys="false"`.
## Row ## Row
The `<row>`...`</row>` pair encloses one row on the keyboard. It has only one optional property: The `<row>`...`</row>` pair encloses one row on the keyboard. It has the following optional property:
* `height`: The height of the row: a positive floating-point value. * `height`: The height of the row: a positive floating-point value.
* `scale`: A positive floating-point value. If present, scale the width of each key so that the total is equal to the specified value, in key width unit.
A row's default height is 1.0 (one quarter of the keyboard height specified on the Settings menu). The `height` property makes the row taller or shorter than this. For example, if you define a 5-row keyboard but one row has `height="0.7"`, then the keyboard's total height is 4.7 units. If the total is different from 4.0, the keyboard will be taller or shorter than that specified in Settings. A row's default height is 1.0 (one quarter of the keyboard height specified on the Settings menu). The `height` property makes the row taller or shorter than this. For example, if you define a 5-row keyboard but one row has `height="0.7"`, then the keyboard's total height is 4.7 units. If the total is different from 4.0, the keyboard will be taller or shorter than that specified in Settings.
## Key ## Key

View File

@@ -5,9 +5,9 @@
<string name="short_description">Легкая клавиатура для пользователей, заботящихся о конфиденциальности.</string> <string name="short_description">Легкая клавиатура для пользователей, заботящихся о конфиденциальности.</string>
<string name="store_description">Главная особенность клавиатуры — это возможность легко напечатать любой ASCII-символ жестами в углы клавиш.\n\nПриложение изначально было разработано для использования с Termux.\nНа данный момент оно также удобно в повседневном использовании.\n\nПриложение не содержит рекламы, не осуществляет никаких запросов в сеть и имеет открытый исходный код.</string> <string name="store_description">Главная особенность клавиатуры — это возможность легко напечатать любой ASCII-символ жестами в углы клавиш.\n\nПриложение изначально было разработано для использования с Termux.\nНа данный момент оно также удобно в повседневном использовании.\n\nПриложение не содержит рекламы, не осуществляет никаких запросов в сеть и имеет открытый исходный код.</string>
<string name="pref_portrait">В портретном режиме</string> <string name="pref_portrait">В портретном режиме</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> --> <string name="pref_portrait_unfolded">В развернутом портретном режиме</string>
<string name="pref_landscape">В ландшафтном режиме</string> <string name="pref_landscape">В ландшафтном режиме</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> --> <string name="pref_landscape_unfolded">В развернутом ландшафтном режиме</string>
<string name="pref_category_layout">Расположение</string> <string name="pref_category_layout">Расположение</string>
<string name="pref_label_brightness">Изменить яркость клавиатуры</string> <string name="pref_label_brightness">Изменить яркость клавиатуры</string>
<string name="pref_keyboard_opacity">Изменить прозрачность фона</string> <string name="pref_keyboard_opacity">Изменить прозрачность фона</string>

View File

@@ -20,6 +20,7 @@
<item>cyrl_jcuken_kk</item> <item>cyrl_jcuken_kk</item>
<item>cyrl_jcuken_ru</item> <item>cyrl_jcuken_ru</item>
<item>cyrl_jcuken_uk</item> <item>cyrl_jcuken_uk</item>
<item>cyrl_lynyertdz_mk</item>
<item>cyrl_lynyertz_sr</item> <item>cyrl_lynyertz_sr</item>
<item>cyrl_ueishsht</item> <item>cyrl_ueishsht</item>
<item>cyrl_yaverti</item> <item>cyrl_yaverti</item>
@@ -105,6 +106,7 @@
<item>ЙЦУКЕН (Қазақша)</item> <item>ЙЦУКЕН (Қазақша)</item>
<item>ЙЦУКЕН (Русский)</item> <item>ЙЦУКЕН (Русский)</item>
<item>ЙЦУКЕН (Українська)</item> <item>ЙЦУКЕН (Українська)</item>
<item>ЉЊЕРТЅ (Македонски)</item>
<item>ЉЊЕРТЗ (Српски)</item> <item>ЉЊЕРТЗ (Српски)</item>
<item>УЕИШЩ (Български, БДС)</item> <item>УЕИШЩ (Български, БДС)</item>
<item>ЯВЕРТЪ</item> <item>ЯВЕРТЪ</item>
@@ -190,6 +192,7 @@
<item>@xml/cyrl_jcuken_kk</item> <item>@xml/cyrl_jcuken_kk</item>
<item>@xml/cyrl_jcuken_ru</item> <item>@xml/cyrl_jcuken_ru</item>
<item>@xml/cyrl_jcuken_uk</item> <item>@xml/cyrl_jcuken_uk</item>
<item>@xml/cyrl_lynyertdz_mk</item>
<item>@xml/cyrl_lynyertz_sr</item> <item>@xml/cyrl_lynyertz_sr</item>
<item>@xml/cyrl_ueishsht</item> <item>@xml/cyrl_ueishsht</item>
<item>@xml/cyrl_yaverti</item> <item>@xml/cyrl_yaverti</item>

View File

@@ -41,6 +41,7 @@
<subtype android:label="%s" android:languageTag="ko" android:imeSubtypeLocale="ko_KR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hangul,default_layout=latn_qwerty_us"/> <subtype android:label="%s" android:languageTag="ko" android:imeSubtypeLocale="ko_KR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hangul,default_layout=latn_qwerty_us"/>
<subtype android:label="%s" android:languageTag="lt" android:imeSubtypeLocale="lt_LT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lt,extra_keys=accent_ogonek:ą:ę:į:ų@s|accent_caron:č:š:ž@f|accent_dot_above:ė@s|accent_macron:ū@o|€"/> <subtype android:label="%s" android:languageTag="lt" android:imeSubtypeLocale="lt_LT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lt,extra_keys=accent_ogonek:ą:ę:į:ų@s|accent_caron:č:š:ž@f|accent_dot_above:ė@s|accent_macron:ū@o|€"/>
<subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lv,extra_keys=accent_macron:ā:ē:ī:ū@o|accent_caron:č:š:ž@f|accent_ogonek:ķ:ļ:ņ@s|accent_cedille:ģ@c|€"/> <subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lv,extra_keys=accent_macron:ā:ē:ī:ū@o|accent_caron:č:š:ž@f|accent_ogonek:ķ:ļ:ņ@s|accent_cedille:ģ@c|€"/>
<subtype android:label="%s" android:languageTag="mk" android:imeSubtypeLocale="mk" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_lynyertdz_mk,extra_keys=ѕ|ѓ|ќ|ѝ|ѐ|љ|њ|џ|„|“|€"/>
<subtype android:label="%s" android:languageTag="mn" android:imeSubtypeLocale="mn_MN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_fcuzhen_mn,extra_keys=ү|ө"/> <subtype android:label="%s" android:languageTag="mn" android:imeSubtypeLocale="mn_MN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_fcuzhen_mn,extra_keys=ү|ө"/>
<subtype android:label="%s" android:languageTag="mr" android:imeSubtypeLocale="mr_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/> <subtype android:label="%s" android:languageTag="mr" android:imeSubtypeLocale="mr_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/>
<subtype android:label="%s" android:languageTag="mt" android:imeSubtypeLocale="mt_MT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_mt,extra_keys=accent_grave:à:è:ì:ò:ù|accent_dot_above:ċ:ż:ġ|ħ"/> <subtype android:label="%s" android:languageTag="mt" android:imeSubtypeLocale="mt_MT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_mt,extra_keys=accent_grave:à:è:ì:ò:ù|accent_dot_above:ċ:ż:ġ|ħ"/>

View File

@@ -78,6 +78,11 @@ public final class KeyEventHandler
case Compose_pending: case Compose_pending:
_autocap.stop(); _autocap.stop();
break; break;
case Slider:
// Don't wait for the next key_up and move the cursor right away. This
// is called after the trigger distance have been travelled.
handle_slider(key.getSlider(), key.getSliderRepeat(), true);
break;
default: break; default: break;
} }
} }
@@ -99,7 +104,7 @@ public final class KeyEventHandler
case Modifier: break; case Modifier: break;
case Editing: handle_editing_key(key.getEditing()); break; case Editing: handle_editing_key(key.getEditing()); break;
case Compose_pending: _recv.set_compose_pending(true); break; case Compose_pending: _recv.set_compose_pending(true); break;
case Slider: handle_slider(key.getSlider(), key.getSliderRepeat()); break; case Slider: handle_slider(key.getSlider(), key.getSliderRepeat(), false); break;
case Macro: evaluate_macro(key.getMacro()); break; case Macro: evaluate_macro(key.getMacro()); break;
} }
update_meta_state(old_mods); update_meta_state(old_mods);
@@ -229,9 +234,9 @@ public final class KeyEventHandler
{ {
switch (ev) switch (ev)
{ {
case COPY: send_context_menu_action(android.R.id.copy); break; case COPY: if(is_selection_not_empty()) send_context_menu_action(android.R.id.copy); break;
case PASTE: send_context_menu_action(android.R.id.paste); break; case PASTE: send_context_menu_action(android.R.id.paste); break;
case CUT: send_context_menu_action(android.R.id.cut); break; case CUT: if(is_selection_not_empty()) send_context_menu_action(android.R.id.cut); break;
case SELECT_ALL: send_context_menu_action(android.R.id.selectAll); break; case SELECT_ALL: send_context_menu_action(android.R.id.selectAll); break;
case SHARE: send_context_menu_action(android.R.id.shareText); break; case SHARE: send_context_menu_action(android.R.id.shareText); break;
case PASTE_PLAIN: send_context_menu_action(android.R.id.pasteAsPlainText); break; case PASTE_PLAIN: send_context_menu_action(android.R.id.pasteAsPlainText); break;
@@ -261,7 +266,7 @@ public final class KeyEventHandler
} }
/** [r] might be negative, in which case the direction is reversed. */ /** [r] might be negative, in which case the direction is reversed. */
void handle_slider(KeyValue.Slider s, int r) void handle_slider(KeyValue.Slider s, int r, boolean key_down)
{ {
switch (s) switch (s)
{ {
@@ -269,8 +274,8 @@ public final class KeyEventHandler
case Cursor_right: move_cursor(r); break; case Cursor_right: move_cursor(r); break;
case Cursor_up: move_cursor_vertical(-r); break; case Cursor_up: move_cursor_vertical(-r); break;
case Cursor_down: move_cursor_vertical(r); break; case Cursor_down: move_cursor_vertical(r); break;
case Selection_cursor_left: move_cursor_sel(r, true); break; case Selection_cursor_left: move_cursor_sel(r, true, key_down); break;
case Selection_cursor_right: move_cursor_sel(r, false); break; case Selection_cursor_right: move_cursor_sel(r, false, key_down); break;
} }
} }
@@ -310,7 +315,7 @@ public final class KeyEventHandler
/** Move one of the two side of a selection. If [sel_left] is true, the left /** Move one of the two side of a selection. If [sel_left] is true, the left
position is moved, otherwise the right position is moved. */ position is moved, otherwise the right position is moved. */
void move_cursor_sel(int d, boolean sel_left) void move_cursor_sel(int d, boolean sel_left, boolean key_down)
{ {
InputConnection conn = _recv.getCurrentInputConnection(); InputConnection conn = _recv.getCurrentInputConnection();
if (conn == null) if (conn == null)
@@ -320,10 +325,17 @@ public final class KeyEventHandler
{ {
int sel_start = et.selectionStart; int sel_start = et.selectionStart;
int sel_end = et.selectionEnd; int sel_end = et.selectionEnd;
boolean modify_sel_start = sel_left == (sel_start <= sel_end); // Reorder the selection when the slider has just been pressed. The
// selection might have been reversed if one end crossed the other end
// with a previous slider.
if (key_down && sel_start > sel_end)
{
sel_start = et.selectionEnd;
sel_end = et.selectionStart;
}
do do
{ {
if (modify_sel_start) if (sel_left)
sel_start += d; sel_start += d;
else else
sel_end += d; sel_end += d;
@@ -454,6 +466,13 @@ public final class KeyEventHandler
_recv.selection_state_changed(false); _recv.selection_state_changed(false);
} }
boolean is_selection_not_empty()
{
InputConnection conn = _recv.getCurrentInputConnection();
if (conn == null) return false;
return (conn.getSelectedText(0) != null);
}
public static interface IReceiver public static interface IReceiver
{ {
public void handle_event_key(KeyValue.Event ev); public void handle_event_key(KeyValue.Event ev);

View File

@@ -315,6 +315,7 @@ public class Keyboard2 extends InputMethodService
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
// Allow to draw behind system bars // Allow to draw behind system bars
wattrs.setFitInsetsTypes(0); wattrs.setFitInsetsTypes(0);
window.setDecorFitsSystemWindows(false);
} }
updateLayoutHeightOf(window, ViewGroup.LayoutParams.MATCH_PARENT); updateLayoutHeightOf(window, ViewGroup.LayoutParams.MATCH_PARENT);
final View inputArea = window.findViewById(android.R.id.inputArea); final View inputArea = window.findViewById(android.R.id.inputArea);

View File

@@ -277,28 +277,13 @@ public class Keyboard2View extends View
width = metrics.getBounds().width(); width = metrics.getBounds().width();
WindowInsets wi = metrics.getWindowInsets(); WindowInsets wi = metrics.getWindowInsets();
int insets_types = int insets_types =
WindowInsets.Type.statusBars() WindowInsets.Type.systemBars()
| WindowInsets.Type.displayCutout() | WindowInsets.Type.displayCutout()
| WindowInsets.Type.mandatorySystemGestures() | WindowInsets.Type.mandatorySystemGestures();
| WindowInsets.Type.navigationBars();
Insets insets = wi.getInsets(insets_types); Insets insets = wi.getInsets(insets_types);
insets_left = insets.left; insets_left = insets.left;
insets_right = insets.right; insets_right = insets.right;
// On API 35, the keyboard is allowed to draw under the insets_bottom = Math.max(insets.bottom, _config.bottomInsetMin);
// button-navigation bar but on lower APIs, it must be discounted from
// the width.
if (VERSION.SDK_INT < 35)
{
Insets nav_insets = wi.getInsets(WindowInsets.Type.navigationBars());
width -= nav_insets.left + nav_insets.right;
insets_left -= nav_insets.left;
insets_right -= nav_insets.right;
}
// [insets.bottom] doesn't take into account the buttons that appear in
// the gesture navigation bar when the IME is showing so ensure a minimum
// of margin is added.
if (VERSION.SDK_INT >= 35)
insets_bottom = Math.max(insets.bottom, _config.bottomInsetMin);
} }
else else
{ {

View File

@@ -336,9 +336,13 @@ public final class KeyboardData
int status; int status;
float h = attribute_float(parser, "height", 1f); float h = attribute_float(parser, "height", 1f);
float shift = attribute_float(parser, "shift", 0f); float shift = attribute_float(parser, "shift", 0f);
float scale = attribute_float(parser, "scale", 0f);
while (expect_tag(parser, "key")) while (expect_tag(parser, "key"))
keys.add(Key.parse(parser)); keys.add(Key.parse(parser));
return new Row(keys, h, shift); Row row = new Row(keys, h, shift);
if (scale > 0f)
row = row.updateWidth(scale);
return row;
} }
public Row copy() public Row copy()

View File

@@ -108,7 +108,10 @@ public final class Pointers implements Handler.Callback
{ {
// No existing pointer, latch the key. // No existing pointer, latch the key.
if (latched) if (latched)
{
add_fake_pointer(key, kv, lock); add_fake_pointer(key, kv, lock);
_handler.onPointerFlagsChanged(false);
}
} }
else if ((ptr.flags & FLAG_P_FAKE) == 0) else if ((ptr.flags & FLAG_P_FAKE) == 0)
{} // Key already latched but not by a fake ptr, do nothing. {} // Key already latched but not by a fake ptr, do nothing.
@@ -118,6 +121,7 @@ public final class Pointers implements Handler.Callback
removePtr(ptr); removePtr(ptr);
if (latched) if (latched)
add_fake_pointer(key, kv, lock); add_fake_pointer(key, kv, lock);
_handler.onPointerFlagsChanged(false);
} }
else if ((ptr.flags & FLAG_P_LOCKED) != 0) else if ((ptr.flags & FLAG_P_LOCKED) != 0)
{} // Existing ptr is locked but [lock] is false, do not continue. {} // Existing ptr is locked but [lock] is false, do not continue.
@@ -306,7 +310,6 @@ public final class Pointers implements Handler.Callback
// Start sliding mode // Start sliding mode
if (new_value.getKind() == KeyValue.Kind.Slider) if (new_value.getKind() == KeyValue.Kind.Slider)
startSliding(ptr, x, y, dx, dy, new_value); startSliding(ptr, x, y, dx, dy, new_value);
_handler.onPointerDown(new_value, true);
} }
} }
@@ -469,7 +472,7 @@ public final class Pointers implements Handler.Callback
stopLongPress(ptr); stopLongPress(ptr);
ptr.flags |= FLAG_P_SLIDING; ptr.flags |= FLAG_P_SLIDING;
ptr.sliding = new Sliding(x, y, dirx, diry, kv.getSlider()); ptr.sliding = new Sliding(x, y, dirx, diry, kv.getSlider());
_handler.onPointerHold(kv, ptr.modifiers); _handler.onPointerDown(kv, true);
} }
/** Return the [FLAG_P_*] flags that correspond to pressing [kv]. */ /** Return the [FLAG_P_*] flags that correspond to pressing [kv]. */
@@ -605,6 +608,10 @@ public final class Pointers implements Handler.Callback
static final float SPEED_SMOOTHING = 0.7f; static final float SPEED_SMOOTHING = 0.7f;
/** Avoid absurdly large values. */ /** Avoid absurdly large values. */
static final float SPEED_MAX = 4.f; static final float SPEED_MAX = 4.f;
/** Make vertical sliders slower. The intention is to make the up/down
slider slower, as we have less visibility and do smaller movements in
that direction. */
static final float SPEED_VERTICAL_MULT = 0.5f;
public void onTouchMove(Pointer ptr, float x, float y) public void onTouchMove(Pointer ptr, float x, float y)
{ {
@@ -618,8 +625,9 @@ public final class Pointers implements Handler.Callback
return; return;
last_move_ms = System.currentTimeMillis(); last_move_ms = System.currentTimeMillis();
} }
d += ((x - last_x) * direction_x + (y - last_y) * direction_y) d += ((x - last_x) * speed * direction_x
* speed / _config.slide_step_px; + (y - last_y) * speed * SPEED_VERTICAL_MULT * direction_y)
/ _config.slide_step_px;
update_speed(travelled, x, y); update_speed(travelled, x, y);
// Send an event when [abs(d)] exceeds [1]. // Send an event when [abs(d)] exceeds [1].
int d_ = (int)d; int d_ = (int)d;

View File

@@ -26,17 +26,17 @@
<key key0="ж" key2="=" key3="+"/> <key key0="ж" key2="=" key3="+"/>
<key key0="э" key2="|" key3="\\"/> <key key0="э" key2="|" key3="\\"/>
</row> </row>
<row> <row scale="11">
<key width="1.18" key0="shift" key2="loc capslock"/> <key width="1.22" key0="shift" key2="loc capslock"/>
<key width="0.96" key0="я"/> <key key0="я"/>
<key width="0.96" key0="ч"/> <key key0="ч"/>
<key width="0.96" key0="с"/> <key key0="с"/>
<key width="0.96" key0="м"/> <key key0="м"/>
<key width="0.96" key0="и" key1="loc і" key2="&lt;" key3="."/> <key key0="и" key1="loc і" key2="&lt;" key3="."/>
<key width="0.96" key0="т" key2="&gt;" key3=","/> <key key0="т" key2="&gt;" key3=","/>
<key width="0.96" key0="ь" key1="ъ" key2="\?" key3="/"/> <key key0="ь" key1="ъ" key2="\?" key3="/"/>
<key width="0.96" key0="б" key2=":" key3=";"/> <key key0="б" key2=":" key3=";"/>
<key width="0.96" key0="ю" key2="&quot;" key3="'"/> <key key0="ю" key2="&quot;" key3="'"/>
<key width="1.18" key0="backspace" key2="delete"/> <key width="1.22" key0="backspace" key2="delete"/>
</row> </row>
</keyboard> </keyboard>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<keyboard name="ЉЊЕРТЅ (Македонски)" script="cyrillic">
<row scale="11">
<key key0="љ" key2="1" key4="esc"/>
<key key0="њ" key1="~" key2="2" key3="\@"/>
<key key0="е" key1="!" key2="3" key3="\#" key4="ѐ"/>
<key key0="р" key2="4" key3="$"/>
<key key0="т" key2="5" key3="%"/>
<key key0="ѕ" key2="6" key3="^"/>
<key key0="у" key2="7" key3="&amp;"/>
<key key0="и" key2="8" key3="*" key4="ѝ"/>
<key key0="о" key2="9" key3="(" key4=")"/>
<key key0="п" key2="0" key3="[" key4="]"/>
<key key0="ш" key2="€" key3="{" key4="}"/>
</row>
<row scale="11">
<key key0="а" key1="tab"/>
<key key0="с"/>
<key key0="д"/>
<key key0="ф"/>
<key key0="г"/>
<key key0="х"/>
<key key0="ј"/>
<key key0="к"/>
<key key0="л" key2="|" key3="\\"/>
<key key0="ч" key2="-" key3="_"/>
<key key0="ќ" key2="=" key3="+"/>
</row>
<row scale="11">
<key width="1.5" key0="shift" key2="loc capslock"/>
<key key0="з"/>
<key key0="џ"/>
<key key0="ц"/>
<key key0="в" key2="&lt;" key3="."/>
<key key0="б" key2="&gt;" key3=","/>
<key key0="н" key2="\?" key3="/"/>
<key key0="м" key2=":" key3=";"/>
<key key0="ѓ" key2="`" key3="'"/>
<key key0="ж" key2="“" key3="„"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -26,17 +26,17 @@
<key key0="ж" key7="0" /> <key key0="ж" key7="0" />
<key key0="э" key7="\?" key3="/" /> <key key0="э" key7="\?" key3="/" />
</row> </row>
<row> <row scale="11">
<key width="1.18" key0="shift" key2="loc capslock" /> <key width="1.22" key0="shift" key2="loc capslock" />
<key width="0.96" key0="я" key7="`" key8=";" /> <key key0="я" key7="`" key8=";" />
<key width="0.96" key0="ч" key7="*" key8=":" /> <key key0="ч" key7="*" key8=":" />
<key width="0.96" key0="с" key7="&amp;" key8="\#" /> <key key0="с" key7="&amp;" key8="\#" />
<key width="0.96" key0="м" key7="|" key8="\\" /> <key key0="м" key7="|" key8="\\" />
<key width="0.96" key0="и" key7="~" /> <key key0="и" key7="~" />
<key width="0.96" key0="т" key7="ц" /> <key key0="т" key7="ц" />
<key width="0.96" key0="ӣ" key3="&lt;" key2="&gt;" /> <key key0="ӣ" key3="&lt;" key2="&gt;" />
<key width="0.96" key0="б" key7="ъ" key8="ы" /> <key key0="б" key7="ъ" key8="ы" />
<key width="0.96" key0="ю" key7="&quot;" key8="'"/> <key key0="ю" key7="&quot;" key8="'"/>
<key width="1.18" key0="." key7="," /> <key width="1.22" key0="." key7="," />
</row> </row>
</keyboard> </keyboard>

View File

@@ -26,17 +26,17 @@
<key key0="ж" key7="0" /> <key key0="ж" key7="0" />
<key key0="э" key7="/" key8="|" /> <key key0="э" key7="/" key8="|" />
</row> </row>
<row> <row scale="11">
<key width="1.18" key0="shift" /> <key width="1.22" key0="shift" />
<key width="0.96" key0="ꙗ" key7="combining_breve" key8=";" /> <key key0="ꙗ" key7="combining_breve" key8=";" />
<key width="0.96" key0="ч" key7="combining_pokrytie" key8=":" /> <key key0="ч" key7="combining_pokrytie" key8=":" />
<key width="0.96" key0="с" key7="combining_inverted_breve" key8="`" /> <key key0="с" key7="combining_inverted_breve" key8="`" />
<key width="0.96" key0="м" key7="ѭ" /> <key key0="м" key7="ѭ" />
<key width="0.96" key0="и" key7="combining_vertical_tilde" key8="-" /> <key key0="и" key7="combining_vertical_tilde" key8="-" />
<key width="0.96" key0="т" key7="\?" key8="\\" /> <key key0="т" key7="\?" key8="\\" />
<key width="0.96" key0="ц" key3="&lt;" key2="&gt;" /> <key key0="ц" key3="&lt;" key2="&gt;" />
<key width="0.96" key0="б" key3="(" key2=")" /> <key key0="б" key3="(" key2=")" />
<key width="0.96" key0="ю" key3="{" key2="}" /> <key key0="ю" key3="{" key2="}" />
<key width="1.18" key0="." key7="," key8="_" /> <key width="1.22" key0="." key7="," key8="_" />
</row> </row>
</keyboard> </keyboard>

View File

@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard name="देवनागरी (हिंदी)-2" script="devanagari"> <keyboard name="देवनागरी (हिंदी)-2" script="devanagari">
<row> <row scale="6.6">
<key shift="0.35" width="0.9" c="क" nw="ख" ne="घ" sw="ङ" se="ग"/> <key shift="0.35" c="क" nw="ख" ne="घ" sw="ङ" se="ग"/>
<key width="0.9" c="च" nw="छ" ne="झ" sw="ञ" se="ज"/> <key c="च" nw="छ" ne="झ" sw="ञ" se="ज"/>
<key width="0.9" c="ट" nw="ठ" ne="ढ" sw="ण" se="ड" anticircle="७" indication="७"/> <key c="ट" nw="ठ" ne="ढ" sw="ण" se="ड" anticircle="७" indication="७"/>
<key width="0.9" c="त" nw="थ" ne="ध" sw="न" se="द" anticircle="८" indication="८"/> <key c="त" nw="थ" ne="ध" sw="न" se="द" anticircle="८" indication="८"/>
<key width="0.9" c="प" nw="फ" ne="भ" sw="म" se="ब" anticircle="९" indication="९"/> <key c="प" nw="फ" ne="भ" sw="म" se="ब" anticircle="९" indication="९"/>
<key width="0.9" c="र" nw="ज्ञ" ne="ल" sw="य" se="व"/> <key c="र" nw="ज्ञ" ne="ल" sw="य" se="व"/>
<key width="0.9" c="ह" nw="श" ne="ळ" sw="स" se="ष"/> <key c="ह" nw="श" ne="ळ" sw="स" se="ष"/>
</row> </row>
<row> <row scale="6.6">
<key shift="0.35" width="0.9" c="ा" nw="अ" ne="आ"/> <key shift="0.35" c="ा" nw="अ" ne="आ"/>
<key width="0.9" c="ि" nw="इ"/> <key c="ि" nw="इ"/>
<key width="0.9" c="ी" nw="ई" anticircle="४" indication="४"/> <key c="ी" nw="ई" anticircle="४" indication="४"/>
<key width="0.9" c="ु" nw="उ" ne="ऊ" se="ू" anticircle="५" indication="५"/> <key c="ु" nw="उ" ne="ऊ" se="ू" anticircle="५" indication="५"/>
<key width="0.9" c="े" nw="ए" ne="ऋ" se="ृ" anticircle="६" indication="६"/> <key c="े" nw="ए" ne="ऋ" se="ृ" anticircle="६" indication="६"/>
<key width="0.9" c="ै" nw="ऐ" ne="ऌ" se="ॢ"/> <key c="ै" nw="ऐ" ne="ऌ" se="ॢ"/>
<key width="0.9" c="ो" nw="ओ" ne="औ" se="ौ"/> <key c="ो" nw="ओ" ne="औ" se="ौ"/>
</row> </row>
<row> <row>
<key c="ऽ" se="\@"/> <key c="ऽ" se="\@"/>

View File

@@ -14,17 +14,17 @@
<key key0="פ" key2="0" key3="b)" key4="rlm"/> <key key0="פ" key2="0" key3="b)" key4="rlm"/>
<key key0="backspace" key2="delete"/> <key key0="backspace" key2="delete"/>
</row> </row>
<row> <row scale="11">
<key key0="ש" key2="`" key1="loc tab" key3="sindot_placeholder" key4="shindot_placeholder" width="1.333"/> <key key0="ש" key2="`" key1="loc tab" key3="sindot_placeholder" key4="shindot_placeholder" width="1.30"/>
<key key0="ד" key1="~" width="1.0333"/> <key key0="ד" key1="~"/>
<key key0="ג" key1="geresh" key2="gershayim" width="1.0333"/> <key key0="ג" key1="geresh" key2="gershayim"/>
<key key0="כ" width="1.0333"/> <key key0="כ"/>
<key key0="ע" width="1.0333"/> <key key0="ע"/>
<key key0="י" key2="-" key3="_" key4="maqaf" width="1.0333"/> <key key0="י" key2="-" key3="_" key4="maqaf"/>
<key key0="ח" key2="=" key3="+" width="1.0333"/> <key key0="ח" key2="=" key3="+"/>
<key key0="ל" key2="b[" key3="b{" width="1.0333"/> <key key0="ל" key2="b[" key3="b{"/>
<key key0="ך" key2="b]" key3="b}" width="1.0333"/> <key key0="ך" key2="b]" key3="b}"/>
<key key0="ף" key2="," key3="&quot;" key1=":" width="1.4006"/> <key key0="ף" key2="," key3="&quot;" key1=":" width="1.35"/>
</row> </row>
<row> <row>
<key key0="\\" key1="|" key2="shift" key3="loc capslock"/> <key key0="\\" key1="|" key2="shift" key3="loc capslock"/>

View File

@@ -1,29 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Inspired by the bépo layout, but adapted to smartphone --> <!-- Inspired by the bépo layout, but adapted to smartphone -->
<keyboard name="BEPO (Français)" script="latin"> <keyboard name="BEPO (Français)" script="latin">
<row> <row scale="11">
<key width="1.1" key0="b" key1="loc esc" key2="1" key4="|"/> <key key0="b" key1="loc esc" key2="1" key4="|"/>
<key width="1.1" key0="é" key2="2" key4="è"/> <key key0="é" key2="2" key4="è"/>
<key width="1.1" key0="p" key2="3"/> <key key0="p" key2="3"/>
<key width="1.1" key0="o" key2="4" key4="accent_circonflexe"/> <key key0="o" key2="4" key4="accent_circonflexe"/>
<key width="1.1" key0="v" key2="5" key4="{"/> <key key0="v" key2="5" key4="{"/>
<key width="1.1" key0="d" key2="6" key4="}"/> <key key0="d" key2="6" key4="}"/>
<key width="1.1" key0="l" key2="7" key4="("/> <key key0="l" key2="7" key4="("/>
<key width="1.1" key0="j" key2="8" key4=")"/> <key key0="j" key2="8" key4=")"/>
<key width="1.1" key0="z" key2="9" key4="["/> <key key0="z" key2="9" key4="["/>
<key width="1.1" key0="w" key2="0" key4="]"/> <key key0="w" key2="0" key4="]"/>
</row> </row>
<row> <row scale="11">
<key width="1.1" key0="a" key1="loc tab" key4="à"/> <key key0="a" key1="loc tab" key4="à"/>
<key width="1.1" key0="u" key1="$" key4="ù"/> <key key0="u" key1="$" key4="ù"/>
<key width="1.1" key0="i" key4="&amp;"/> <key key0="i" key4="&amp;"/>
<key width="1.1" key0="e" key1="+" key2="accent_trema" key4="€"/> <key key0="e" key1="+" key2="accent_trema" key4="€"/>
<key width="1.1" key0="c" key1="=" key4="ç"/> <key key0="c" key1="=" key4="ç"/>
<key width="1.1" key0="t" key1="^" key4=";"/> <key key0="t" key1="^" key4=";"/>
<key width="1.1" key0="s" key4="!"/> <key key0="s" key4="!"/>
<key width="1.1" key0="r" key4="\?"/> <key key0="r" key4="\?"/>
<key width="1.1" key0="n" key1="`" key2="'" key4=":"/> <key key0="n" key1="`" key2="'" key4=":"/>
<key width="1.1" key0="m" key2="&quot;"/> <key key0="m" key2="&quot;"/>
</row> </row>
<row> <row>
<key width="1.5" key0="shift" key2="loc capslock" key3="&lt;"/> <key width="1.5" key0="shift" key2="loc capslock" key3="&lt;"/>