From aa78229b2aef963d5f840b72d8aa3cad3a78dfc4 Mon Sep 17 00:00:00 2001
From: Jules Aguillon
Date: Sun, 3 Apr 2022 17:15:12 +0200
Subject: Add the Programming Layout option
Allow specifying a layout for programming and add a key for switching to
it easily.
The switching key is placed on the top edge of the space bar.
The option has no effect by default because the ergonomic isn't ideal,
it needs to be enabled explicitly.
Users of Latin-script languages certainly prefer to use one layout (for
programming or not). This feature might be removed in favor of a better
language-switching mechanisms in the future.
---
res/values/arrays.xml | 10 ++++++++++
res/values/strings.xml | 2 ++
res/xml/bottom_row.xml | 2 +-
res/xml/settings.xml | 1 +
srcs/juloo.keyboard2/Config.java | 13 +++++++++++--
srcs/juloo.keyboard2/KeyEventHandler.java | 10 ++++++----
srcs/juloo.keyboard2/KeyValue.java | 6 ++++--
srcs/juloo.keyboard2/Keyboard2.java | 27 +++++++++++++++++++++++----
8 files changed, 58 insertions(+), 13 deletions(-)
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 0c968e4..7412d55 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -28,6 +28,16 @@
- Bulgarian (Phonetic Traditional)
- Dvorak
+
+ - none
+ - qwerty
+ - dvorak
+
+
+ - @string/pref_programming_layout_none
+ - QWERTY
+ - Dvorak
+
- @string/pref_accents_e_all_installed
- @string/pref_accents_e_selected
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 906803f..250c2ac 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -11,6 +11,8 @@
Only show accents for the selected language
Show all accents
Hide accents
+ Keyboard layout for programming
+ None
Typing
Swiping distance
Distance of characters in the corners of the keys (%s)
diff --git a/res/xml/bottom_row.xml b/res/xml/bottom_row.xml
index 3602605..1121aed 100644
--- a/res/xml/bottom_row.xml
+++ b/res/xml/bottom_row.xml
@@ -2,7 +2,7 @@
-
+
diff --git a/res/xml/settings.xml b/res/xml/settings.xml
index a3d4957..c6900cd 100644
--- a/res/xml/settings.xml
+++ b/res/xml/settings.xml
@@ -3,6 +3,7 @@
+
diff --git a/srcs/juloo.keyboard2/Config.java b/srcs/juloo.keyboard2/Config.java
index 3c436c3..427b0f2 100644
--- a/srcs/juloo.keyboard2/Config.java
+++ b/srcs/juloo.keyboard2/Config.java
@@ -23,6 +23,7 @@ final class Config
// From preferences
public int layout; // Or '-1' for the system defaults
+ public int programming_layout; // Or '-1' for none
public float swipe_dist_px;
public boolean vibrateEnabled;
public long vibrateDuration;
@@ -41,6 +42,7 @@ final class Config
// Dynamically set
public boolean shouldOfferSwitchingToNextInputMethod;
+ public boolean shouldOfferSwitchingToProgramming;
public String actionLabel; // Might be 'null'
public int actionId; // Meaningful only when 'actionLabel' isn't 'null'
public boolean swapEnterActionKey; // Swap the "enter" and "action" keys
@@ -58,6 +60,7 @@ final class Config
sublabelTextSize = res.getFloat(R.integer.sublabel_text_size);
// default values
layout = -1;
+ programming_layout = -1;
vibrateEnabled = true;
vibrateDuration = 20;
longPressTimeout = 600;
@@ -74,6 +77,7 @@ final class Config
refresh(context);
// initialized later
shouldOfferSwitchingToNextInputMethod = false;
+ shouldOfferSwitchingToProgramming = false;
actionLabel = null;
actionId = 0;
swapEnterActionKey = false;
@@ -101,7 +105,10 @@ final class Config
{
keyboardHeightPercent = prefs.getInt("keyboard_height", 35);
}
- layout = layoutId_of_string(prefs.getString("layout", "system"));
+ String layout_s = prefs.getString("layout", "system");
+ layout = layout_s.equals("system") ? -1 : layoutId_of_string(layout_s);
+ String prog_layout_s = prefs.getString("programming_layout", "none");
+ programming_layout = prog_layout_s.equals("none") ? -1 : layoutId_of_string(prog_layout_s);
// The swipe distance is defined relatively to the "exact physical pixels
// per inch of the screen", which isn't affected by the scaling settings.
// Take the mean of both dimensions as an approximation of the diagonal.
@@ -156,6 +163,8 @@ final class Config
case KeyValue.EVENT_ACTION:
return (swapEnterActionKey && action_key != null) ?
KeyValue.getKeyByName("enter") : action_key;
+ case KeyValue.EVENT_SWITCH_PROGRAMMING:
+ return shouldOfferSwitchingToProgramming ? key : null;
default:
if (key.flags != 0)
{
@@ -214,7 +223,7 @@ final class Config
case "qwerty_sv_se": return R.xml.qwerty_sv_se;
case "qwertz": return R.xml.qwertz;
case "ru_jcuken": return R.xml.local_ru_jcuken;
- case "system": default: return -1;
+ default: throw new IllegalArgumentException("layoutId_of_string: Unknown layout: " + name);
}
}
diff --git a/srcs/juloo.keyboard2/KeyEventHandler.java b/srcs/juloo.keyboard2/KeyEventHandler.java
index 217a2cd..8382737 100644
--- a/srcs/juloo.keyboard2/KeyEventHandler.java
+++ b/srcs/juloo.keyboard2/KeyEventHandler.java
@@ -18,12 +18,13 @@ class KeyEventHandler implements Config.IKeyEventHandler
switch (key.eventCode)
{
case KeyValue.EVENT_CONFIG: _recv.showKeyboardConfig(); return;
- case KeyValue.EVENT_SWITCH_TEXT: _recv.setLayout(-1); return;
- case KeyValue.EVENT_SWITCH_NUMERIC: _recv.setLayout(R.xml.numeric); return;
+ case KeyValue.EVENT_SWITCH_TEXT: _recv.switchMain(); return;
+ case KeyValue.EVENT_SWITCH_NUMERIC: _recv.switchNumeric(); return;
case KeyValue.EVENT_SWITCH_EMOJI: _recv.setPane_emoji(); return;
case KeyValue.EVENT_SWITCH_BACK_EMOJI: _recv.setPane_normal(); return;
case KeyValue.EVENT_CHANGE_METHOD: _recv.switchToNextInputMethod(); return;
case KeyValue.EVENT_ACTION: _recv.performAction(); return;
+ case KeyValue.EVENT_SWITCH_PROGRAMMING: _recv.switchProgramming(); return;
default:
if ((flags & (KeyValue.FLAG_CTRL | KeyValue.FLAG_ALT | KeyValue.FLAG_META)) != 0)
handleKeyUpWithModifier(key, flags);
@@ -91,8 +92,9 @@ class KeyEventHandler implements Config.IKeyEventHandler
public void showKeyboardConfig();
public void performAction();
- /** 'res_id' is '-1' for the currently selected layout. */
- public void setLayout(int res_id);
+ public void switchMain();
+ public void switchNumeric();
+ public void switchProgramming();
public void sendKeyEvent(int eventAction, int eventCode, int meta);
diff --git a/srcs/juloo.keyboard2/KeyValue.java b/srcs/juloo.keyboard2/KeyValue.java
index 9d747cb..3c7c305 100644
--- a/srcs/juloo.keyboard2/KeyValue.java
+++ b/srcs/juloo.keyboard2/KeyValue.java
@@ -14,6 +14,7 @@ class KeyValue
public static final int EVENT_SWITCH_BACK_EMOJI = -6;
public static final int EVENT_CHANGE_METHOD = -7;
public static final int EVENT_ACTION = -8;
+ public static final int EVENT_SWITCH_PROGRAMMING = -9;
public static final char CHAR_NONE = '\0';
// Behavior flags
@@ -234,10 +235,11 @@ class KeyValue
addCharKey('£', EVENT_NONE, FLAG_LOCALIZED);
addSpecialKey("config", "\u0004", EVENT_CONFIG, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
- addSpecialKey("switch_text", "ABC", EVENT_SWITCH_TEXT | FLAG_SMALLER_FONT);
- addSpecialKey("switch_numeric", "123+", EVENT_SWITCH_NUMERIC | FLAG_SMALLER_FONT);
+ addSpecialKey("switch_text", "ABC", EVENT_SWITCH_TEXT, FLAG_SMALLER_FONT);
+ addSpecialKey("switch_numeric", "123+", EVENT_SWITCH_NUMERIC, FLAG_SMALLER_FONT);
addSpecialKey("switch_emoji", "\u0001" , EVENT_SWITCH_EMOJI, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
addSpecialKey("switch_back_emoji", "ABC", EVENT_SWITCH_BACK_EMOJI);
+ addSpecialKey("switch_programming", "Prog", EVENT_SWITCH_PROGRAMMING, FLAG_SMALLER_FONT);
addSpecialKey("change_method", "\u0009", EVENT_CHANGE_METHOD, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
addSpecialKey("action", "Action", EVENT_ACTION, FLAG_SMALLER_FONT); // Will always be replaced
diff --git a/srcs/juloo.keyboard2/Keyboard2.java b/srcs/juloo.keyboard2/Keyboard2.java
index 70c0892..abea412 100644
--- a/srcs/juloo.keyboard2/Keyboard2.java
+++ b/srcs/juloo.keyboard2/Keyboard2.java
@@ -139,6 +139,9 @@ public class Keyboard2 extends InputMethodService
refreshSubtypeLayout(subtype);
refreshAccentsOption(imm, subtype);
}
+ _config.shouldOfferSwitchingToProgramming =
+ _config.programming_layout != -1 &&
+ _currentTextLayout != _config.programming_layout;
}
private String actionLabel_of_imeAction(int action)
@@ -276,11 +279,27 @@ public class Keyboard2 extends InputMethodService
conn.performEditorAction(_config.actionId);
}
- public void setLayout(int res_id)
+ public void switchMain()
{
- if (res_id == -1)
- res_id = _currentTextLayout;
- _keyboardView.setKeyboard(getLayout(res_id));
+ _keyboardView.setKeyboard(getLayout(_currentTextLayout));
+ }
+
+ public void switchNumeric()
+ {
+ _keyboardView.setKeyboard(getLayout(R.xml.numeric));
+ }
+
+ public void switchProgramming()
+ {
+ if (_config.programming_layout == -1)
+ return;
+ KeyboardData layout =
+ getLayout(_config.programming_layout).replaceKeys(key -> {
+ if (key != null && key.eventCode == KeyValue.EVENT_SWITCH_PROGRAMMING)
+ return KeyValue.getKeyByName("switch_text");
+ return key;
+ });
+ _keyboardView.setKeyboard(layout);
}
public void sendKeyEvent(int eventAction, int eventCode, int meta)
--
cgit v1.2.3