abouttreesummaryrefslogcommitdiff
diff options
context:
space:
mode:
-rw-r--r--srcs/juloo.keyboard2/Keyboard2View.java102
1 files changed, 60 insertions, 42 deletions
diff --git a/srcs/juloo.keyboard2/Keyboard2View.java b/srcs/juloo.keyboard2/Keyboard2View.java
index 37a210f..16cb85f 100644
--- a/srcs/juloo.keyboard2/Keyboard2View.java
+++ b/srcs/juloo.keyboard2/Keyboard2View.java
@@ -208,24 +208,10 @@ public class Keyboard2View extends View
float keyW = _keyWidth * key.width;
if (touchX >= x && touchX < (x + keyW))
{
- KeyDown down = getKeyDown(key);
- if (down != null)
- {
- if ((down.flags & KeyValue.FLAG_LOCK) != 0)
- {
- down.flags ^= KeyValue.FLAG_LOCK;
- down.flags |= KeyValue.FLAG_LOCKED;
- }
- else if (down.pointerId == -1)
- down.pointerId = pointerId;
- }
- else
- {
- int what = _currentWhat++;
- if (key.key0 != null && (key.key0.flags & KeyValue.FLAG_NOREPEAT) == 0)
- _handler.sendEmptyMessageDelayed(what, _config.longPressTimeout);
- _downKeys.add(new KeyDown(pointerId, key, touchX, touchY, what));
- }
+ int what = _currentWhat++;
+ if (key.key0 != null && (key.key0.flags & KeyValue.FLAG_NOREPEAT) == 0)
+ _handler.sendEmptyMessageDelayed(what, _config.longPressTimeout);
+ _downKeys.add(new KeyDown(pointerId, key, touchX, touchY, what));
handleKeyDown(key.key0);
updateFlags();
invalidate();
@@ -236,36 +222,67 @@ public class Keyboard2View extends View
}
}
+ // Whether a key is already activated (key down but pointer up)
+ private KeyDown getActivatedKey(KeyValue kv)
+ {
+ for (KeyDown k : _downKeys)
+ {
+ if (k.value == kv && k.pointerId == -1)
+ return (k);
+ }
+ return (null);
+ }
+
private void onTouchUp(int pointerId)
{
KeyDown k = getKeyDown(pointerId);
if (k != null)
{
- if (k.timeoutWhat != -1)
- {
- _handler.removeMessages(k.timeoutWhat);
- k.timeoutWhat = -1;
- }
- if ((k.flags & KeyValue.FLAG_KEEP_ON) != 0)
- {
- k.flags ^= KeyValue.FLAG_KEEP_ON;
- k.pointerId = -1;
- return ;
- }
- for (int i = 0; i < _downKeys.size(); i++)
- {
- KeyDown downKey = _downKeys.get(i);
- if (downKey.pointerId == -1 && (downKey.flags & KeyValue.FLAG_LOCKED) == 0)
- _downKeys.remove(i--);
- else if ((downKey.flags & KeyValue.FLAG_KEEP_ON) != 0)
- downKey.flags ^= KeyValue.FLAG_KEEP_ON;
- }
- _downKeys.remove(k);
- handleKeyUp(k);
- updateFlags();
- invalidate();
- return ;
+ // Stop key repeat
+ if (k.timeoutWhat != -1)
+ {
+ _handler.removeMessages(k.timeoutWhat);
+ k.timeoutWhat = -1;
+ }
+ KeyDown k_on = getActivatedKey(k.value);
+ if (k_on != null)
+ {
+ _downKeys.remove(k); // Remove dupplicate
+ // Same key with FLAG_LOCK is already on, do lock
+ if ((k_on.flags & KeyValue.FLAG_LOCK) != 0)
+ {
+ k_on.flags ^= KeyValue.FLAG_LOCK; // Next time, disable it
+ k_on.flags |= KeyValue.FLAG_LOCKED;
+ }
+ // Otherwise, toggle it
+ else
+ {
+ _downKeys.remove(k_on);
+ }
+ }
+ // Key stay activated
+ else if ((k.flags & KeyValue.FLAG_KEEP_ON) != 0)
+ {
+ k.pointerId = -1; // Set pointer up
+ }
+ else // Regular key up
+ {
+ for (int i = 0; i < _downKeys.size(); i++)
+ {
+ KeyDown downKey = _downKeys.get(i);
+ // Disable other activated keys that aren't locked
+ if (downKey.pointerId == -1 && (downKey.flags & KeyValue.FLAG_LOCKED) == 0)
+ _downKeys.remove(i--);
+ // Other keys currently down won't stay activated
+ else if ((downKey.flags & KeyValue.FLAG_KEEP_ON) != 0)
+ downKey.flags ^= KeyValue.FLAG_KEEP_ON;
+ }
+ _downKeys.remove(k);
+ handleKeyUp(k);
+ }
+ updateFlags();
+ invalidate();
}
}
@@ -413,6 +430,7 @@ public class Keyboard2View extends View
private static class KeyDown
{
+ /* -1 if pointer is up. */
public int pointerId;
public KeyValue value;
public KeyboardData.Key key;