- Double-space replaced the space via a Backspace keysym, which clients apply after the commit: use delete_surrounding_text with the commit - Tests use a shared FakeEngine that applies ops to a simulated field - Double-tap shift locks at a sentence start; typing between taps doesn't - Organization name set: config lives in ~/.config/sloposk/ - Settings (auto-capitalization, double-space period) with a ⚙ panel - Letter rows come from the compositor's XKB keymap; other letters of the layout become long-press alternates; globe switches the system layout over org.kde.keyboard - One JSON template for non-letter layers; stretch keys even out rows Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
1.3 KiB
C++
43 lines
1.3 KiB
C++
#include "KeyGeometry.h"
|
|
|
|
#include <algorithm>
|
|
|
|
qreal rowUnits(const Row &row)
|
|
{
|
|
qreal units = 0;
|
|
for (const KeyDef &key : row)
|
|
units += key.width;
|
|
return units;
|
|
}
|
|
|
|
QList<QRectF> computeKeyRects(const Layer &layer, QSizeF size, KeyboardMetrics metrics)
|
|
{
|
|
QList<QRectF> rects;
|
|
if (layer.rows.isEmpty())
|
|
return rects;
|
|
|
|
qreal maxUnits = 0;
|
|
for (const Row &row : layer.rows)
|
|
maxUnits = std::max(maxUnits, rowUnits(row));
|
|
|
|
const qreal innerWidth = size.width() - 2 * metrics.padding;
|
|
const qreal innerHeight = size.height() - 2 * metrics.padding;
|
|
const int rowCount = int(layer.rows.size());
|
|
|
|
// Each cell includes one trailing gap; the last gap of a row is dropped.
|
|
const qreal unitWidth = (innerWidth + metrics.gap) / maxUnits;
|
|
const qreal rowHeight = (innerHeight - (rowCount - 1) * metrics.gap) / rowCount;
|
|
|
|
qreal y = metrics.padding;
|
|
for (const Row &row : layer.rows) {
|
|
qreal x = metrics.padding + (maxUnits - rowUnits(row)) * unitWidth / 2;
|
|
for (const KeyDef &key : row) {
|
|
const qreal cellWidth = key.width * unitWidth;
|
|
rects.append(QRectF(x, y, std::max<qreal>(0, cellWidth - metrics.gap), rowHeight));
|
|
x += cellWidth;
|
|
}
|
|
y += rowHeight + metrics.gap;
|
|
}
|
|
return rects;
|
|
}
|