Keep the user's shift; trust the text guess less

- A tapped shift (on or off) survives the field re-reporting its context:
  it lasts until a character is typed, the hint changes or a field is focused
- An input-method reset forgets the guessed text and pending dead key, so
  double-space can't delete a character the keyboard never saw
- Fields that state typing preferences only get capitals if they ask
- Trackpad moves in fields without surrounding text make the guess unknown;
  Backspace removes a whole grapheme cluster from it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-15 10:13:27 +02:00
co-authored by Claude Opus 5.5
parent 076bc14e2f
commit d44aab7772
9 changed files with 130 additions and 10 deletions
+40
View File
@@ -111,6 +111,46 @@ private Q_SLOTS:
shift.characterTyped();
QCOMPARE(shift.mode(), Mode::Off);
}
void repeatedHintKeepsUserShift()
{
ShiftState shift;
shift.setAutomatic(false);
shift.press(0);
shift.release();
shift.setAutomatic(false); // the field re-reported
QCOMPARE(shift.mode(), Mode::Once);
}
void repeatedHintKeepsUserUnshift()
{
ShiftState shift;
shift.setAutomatic(true);
shift.press(0); // off at a sentence start
shift.release();
shift.setAutomatic(true);
QCOMPARE(shift.mode(), Mode::Off);
}
void changedHintOverridesUserShift()
{
ShiftState shift;
shift.setAutomatic(true);
shift.press(0);
shift.release();
shift.setAutomatic(false);
shift.setAutomatic(true); // e.g. backspaced to a sentence start
QCOMPARE(shift.mode(), Mode::Once);
}
void hintAppliesAgainAfterTyping()
{
ShiftState shift;
shift.setAutomatic(true);
shift.characterTyped(); // e.g. a space at a sentence start
shift.setAutomatic(true);
QCOMPARE(shift.mode(), Mode::Once);
}
};
QTEST_GUILESS_MAIN(TestShiftState)