Skip to content

Commit

Permalink
Fix auto-capitalisation disabling locked shift
Browse files Browse the repository at this point in the history
Shift locked via the "caps lock" key use the "fake pointer" mechanism
that is also used by auto-capitalisation.

Make sure that unlatching a fake pointer do not disabled a locked
modifier.

The implementation is moved into the Pointers class for a safer API and
easier implementation.
  • Loading branch information
Julow committed Mar 3, 2024
1 parent ce38a4f commit 5e5937b
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 22 deletions.
14 changes: 1 addition & 13 deletions srcs/juloo.keyboard2/Keyboard2View.java
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
42 changes: 33 additions & 9 deletions srcs/juloo.keyboard2/Pointers.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand Down

0 comments on commit 5e5937b

Please sign in to comment.