diff --git a/srcs/juloo.keyboard2/Keyboard2View.java b/srcs/juloo.keyboard2/Keyboard2View.java index bad75bbd0..c0ec68f10 100644 --- a/srcs/juloo.keyboard2/Keyboard2View.java +++ b/srcs/juloo.keyboard2/Keyboard2View.java @@ -120,19 +120,7 @@ void set_fake_ptr_latched(KeyboardData.Key key, KeyValue kv, boolean latched, { if (_keyboard == null || key == null) return; - int flags = _pointers.getKeyFlags(key, kv); - if (latched) - { - if (flags != -1 && !lock) - return; // Don't replace an existing pointer - _pointers.add_fake_pointer(kv, key, lock); - } - else - { - if ((flags & KeyValue.FLAG_FAKE_PTR) == 0) - return; // Don't remove locked pointers - _pointers.remove_fake_pointer(kv, key); - } + _pointers.set_fake_pointer_state(key, kv, latched, lock); } /** Called by auto-capitalisation. */ diff --git a/srcs/juloo.keyboard2/Pointers.java b/srcs/juloo.keyboard2/Pointers.java index 65919378b..c03599c61 100644 --- a/srcs/juloo.keyboard2/Pointers.java +++ b/srcs/juloo.keyboard2/Pointers.java @@ -85,13 +85,10 @@ public int getKeyFlags(KeyboardData.Key key, KeyValue kv) return ptr.flags; } - /** Fake pointers are latched and not lockable. */ - public void add_fake_pointer(KeyValue kv, KeyboardData.Key key, boolean locked) + /** The key must not be already latched . */ + void add_fake_pointer(KeyboardData.Key key, KeyValue kv, boolean locked) { - Pointer ptr = getLatched(key, kv); - if (ptr != null) - removePtr(ptr); // Already latched, replace pointer. - ptr = new Pointer(-1, key, kv, 0.f, 0.f, Modifiers.EMPTY); + Pointer ptr = new Pointer(-1, key, kv, 0.f, 0.f, Modifiers.EMPTY); ptr.flags &= ~(KeyValue.FLAG_LATCH | KeyValue.FLAG_LOCK); ptr.flags |= KeyValue.FLAG_FAKE_PTR; if (locked) @@ -100,12 +97,39 @@ public void add_fake_pointer(KeyValue kv, KeyboardData.Key key, boolean locked) _handler.onPointerFlagsChanged(false); } - public void remove_fake_pointer(KeyValue kv, KeyboardData.Key key) + /** Set whether a key is latched or locked by adding a "fake" pointer, a + pointer that is not due to user interaction. + This is used by auto-capitalisation. + + When [lock] is true, [latched] control whether the modifier is locked or disabled. + When [lock] is false, an existing locked pointer is not affected. */ + public void set_fake_pointer_state(KeyboardData.Key key, KeyValue kv, + boolean latched, boolean lock) { Pointer ptr = getLatched(key, kv); - if (ptr != null && (ptr.flags & KeyValue.FLAG_FAKE_PTR) != 0) + if (ptr == null) + { + // No existing pointer, latch the key. + if (latched) + add_fake_pointer(key, kv, lock); + } + else if ((ptr.flags & KeyValue.FLAG_FAKE_PTR) != 0) + {} // Key already latched but not by a fake ptr, do nothing. + else if (lock) + { + // Acting on locked modifiers, replace the pointer each time. removePtr(ptr); - _handler.onPointerFlagsChanged(false); + if (latched) + add_fake_pointer(key, kv, lock); + } + else if ((ptr.flags & KeyValue.FLAG_LOCKED) != 0) + {} // Existing ptr is locked but [lock] is false, do not continue. + else if (!latched) + { + // Key is latched by a fake ptr. Unlatch if requested. + removePtr(ptr); + _handler.onPointerFlagsChanged(false); + } } // Receiving events