Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions examples/test_input_manager/inputmanagerclient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,21 @@
<< "delay:" << delay;
}

void TreelandKeyboardSettingsV1::configureXkbRulesAndApply(const QString &layout,
const QString &model,
const QString &variant,
const QString &options)
{
set_xkb_rules(layout, model, variant, options);
apply();
qWarning() << "Keyboard XKB rules applied:"
<< "layout:" << layout
<< "model:" << model
<< "variant:" << variant
<< "options:" << options;
}

void TreelandKeyboardSettingsV1::treeland_keyboard_settings_v1_repeat(int32_t rate, int32_t delay)

Check warning on line 254 in examples/test_input_manager/inputmanagerclient.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'treeland_keyboard_settings_v1_repeat' is never used.
{
qWarning() << "repeat rate:" << rate << "delay:" << delay;
}
Expand All @@ -257,3 +271,16 @@
qWarning() << "keyboard settings: done";
qWarning() << "";
}

void TreelandKeyboardSettingsV1::treeland_keyboard_settings_v1_xkb_rules(

Check warning on line 275 in examples/test_input_manager/inputmanagerclient.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'treeland_keyboard_settings_v1_xkb_rules' is never used.
const QString &layout,
const QString &model,
const QString &variant,
const QString &options)
{
qWarning() << "xkb_rules:"
<< "layout:" << layout
<< "model:" << model
<< "variant:" << variant
<< "options:" << options;
}
10 changes: 9 additions & 1 deletion examples/test_input_manager/inputmanagerclient.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class TreelandInputManagerV1
{
Q_OBJECT
public:
static constexpr int InterfaceVersion = 1;
static constexpr int InterfaceVersion = 2;
explicit TreelandInputManagerV1();
~TreelandInputManagerV1() override;

Expand Down Expand Up @@ -75,13 +75,21 @@ class TreelandKeyboardSettingsV1

bool hasFeature(uint32_t flag) const;
void configureAndApply(int32_t rate, int32_t delay);
void configureXkbRulesAndApply(const QString &layout,
const QString &model,
const QString &variant,
const QString &options);

protected:
void treeland_keyboard_settings_v1_feature(uint32_t feature) override;
void treeland_keyboard_settings_v1_repeat(int32_t rate, int32_t delay) override;
void treeland_keyboard_settings_v1_num_lock(uint32_t state) override;
void treeland_keyboard_settings_v1_failed() override;
void treeland_keyboard_settings_v1_done() override;
void treeland_keyboard_settings_v1_xkb_rules(const QString &layout,
const QString &model,
const QString &variant,
const QString &options) override;

private:
uint32_t m_features = 0;
Expand Down
39 changes: 39 additions & 0 deletions examples/test_input_manager/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,34 @@ int main(int argc, char *argv[])
);
parser.addOption(keyboardNumLockOption);

QCommandLineOption keyboardXkbLayoutOption(
QStringLiteral("keyboard-xkb-layout"),
QStringLiteral("Comma-separated XKB keyboard layouts (e.g. us or cz,us)."),
QStringLiteral("layout")
);
parser.addOption(keyboardXkbLayoutOption);

QCommandLineOption keyboardXkbModelOption(
QStringLiteral("keyboard-xkb-model"),
QStringLiteral("XKB keyboard model (e.g. pc104 or pc105)."),
QStringLiteral("model")
);
parser.addOption(keyboardXkbModelOption);

QCommandLineOption keyboardXkbVariantOption(
QStringLiteral("keyboard-xkb-variant"),
QStringLiteral("Comma-separated XKB keyboard variants (e.g. ,dvorak)."),
QStringLiteral("variant")
);
parser.addOption(keyboardXkbVariantOption);

QCommandLineOption keyboardXkbOptionsOption(
QStringLiteral("keyboard-xkb-options"),
QStringLiteral("Comma-separated XKB keyboard options (e.g. grp:win_space_toggle)."),
QStringLiteral("options")
);
parser.addOption(keyboardXkbOptionsOption);

parser.process(app);

auto *manager = new TreelandInputManagerV1;
Expand Down Expand Up @@ -334,6 +362,17 @@ int main(int argc, char *argv[])
keyboardSettings->apply();
qDebug() << "Keyboard num lock applied:" << (state ? "on" : "off");
}

if (parser.isSet("keyboard-xkb-layout")
|| parser.isSet("keyboard-xkb-model")
|| parser.isSet("keyboard-xkb-variant")
|| parser.isSet("keyboard-xkb-options")) {
keyboardSettings->configureXkbRulesAndApply(
parser.value("keyboard-xkb-layout"),
parser.value("keyboard-xkb-model"),
parser.value("keyboard-xkb-variant"),
parser.value("keyboard-xkb-options"));
}
} else {
qWarning() << "Failed to get keyboard settings";
}
Expand Down
8 changes: 4 additions & 4 deletions misc/dconfig/org.deepin.dde.treeland.user.seat.json
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@
"xkbLayout": {
"value": "",
"serial": 0,
"flags": ["global"],
"flags": [],
"name": "Keyboard Layout",
"name[zh_CN]": "键盘布局",
"description": "XKB keyboard layout(s). Comma-separated list for multiple layouts, e.g. \"us\" or \"cz,us\". Empty string means XKB default (\"us\").",
Expand All @@ -170,7 +170,7 @@
"xkbModel": {
"value": "",
"serial": 0,
"flags": ["global"],
"flags": [],
"name": "Keyboard Model",
"name[zh_CN]": "键盘型号",
"description": "XKB keyboard model, e.g. \"pc104\" or \"pc105\". Empty string means XKB default.",
Expand All @@ -181,7 +181,7 @@
"xkbVariant": {
"value": "",
"serial": 0,
"flags": ["global"],
"flags": [],
"name": "Keyboard Variant",
"name[zh_CN]": "键盘变体",
"description": "XKB keyboard variant(s). Comma-separated list matching the layouts, e.g. \"\" or \",dvorak\". Empty string means no variant (XKB default).",
Expand All @@ -192,7 +192,7 @@
"xkbOptions": {
"value": "",
"serial": 0,
"flags": ["global"],
"flags": [],
"name": "Keyboard Options",
"name[zh_CN]": "键盘选项",
"description": "XKB keyboard options, comma-separated, e.g. \"grp:win_space_toggle\". Empty string means no extra options.",
Expand Down
52 changes: 39 additions & 13 deletions src/input/inputmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,6 @@ void InputManager::setupSeat(WSeat *seat)

applyXkbConfigForSeat(seat);

connect(config, &SeatUserDConfig::xkbLayoutChanged, this,
[this, seat] { applyXkbConfigForSeat(seat); });
connect(config, &SeatUserDConfig::xkbModelChanged, this,
[this, seat] { applyXkbConfigForSeat(seat); });
connect(config, &SeatUserDConfig::xkbVariantChanged, this,
[this, seat] { applyXkbConfigForSeat(seat); });
connect(config, &SeatUserDConfig::xkbOptionsChanged, this,
[this, seat] { applyXkbConfigForSeat(seat); });

Comment thread
zzxyb marked this conversation as resolved.
const auto devices = seat->deviceList();
for (WInputDevice *device : devices)
onInputAssigned(device);
Expand Down Expand Up @@ -177,6 +168,11 @@ bool InputManager::initializeKeyboardSettings(KeyboardSettingsInterfaceV1 *inter
interface->sendFeature(features, true);
interface->sendNumLock(globalConfig->keyboardNumLock(), true);
interface->sendRepeat(seatConfig->keyboardRate(), seatConfig->keyboardDelay(), true);
interface->sendXkbRules(seatConfig->xkbLayout(),
seatConfig->xkbModel(),
seatConfig->xkbVariant(),
seatConfig->xkbOptions(),
true);
interface->sendDone();

connect(interface,
Expand Down Expand Up @@ -483,6 +479,13 @@ void InputManager::onKeyboardSettingsApplied(KeyboardSettingsInterfaceV1::Change
seatConfig->setKeyboardRate(interface->repeatRate());
}

if (changes.testFlag(KeyboardSettingsInterfaceV1::XkbRulesChanged)) {
seatConfig->setXkbLayout(interface->xkbLayout());
seatConfig->setXkbModel(interface->xkbModel());
seatConfig->setXkbVariant(interface->xkbVariant());
seatConfig->setXkbOptions(interface->xkbOptions());
}

auto *keyboardDevice = interface->wSeat()->keyboardGroupKeyboard();
if (keyboardDevice) {
if (keyboardDevice->handle()->type == WLR_INPUT_DEVICE_KEYBOARD) {
Expand All @@ -495,6 +498,14 @@ void InputManager::onKeyboardSettingsApplied(KeyboardSettingsInterfaceV1::Change

if (changes.testFlag(KeyboardSettingsInterfaceV1::NumLockChanged))
setNumLockForSeat(interface->wSeat(), interface->numLock());

if (changes.testFlag(KeyboardSettingsInterfaceV1::XkbRulesChanged)) {
applyXkbConfig(interface->wSeat(),
interface->xkbLayout(),
interface->xkbModel(),
interface->xkbVariant(),
interface->xkbOptions());
}
}

void InputManager::applyNumLockToKeyboards()
Expand All @@ -521,11 +532,26 @@ void InputManager::applyXkbConfigForSeat(WSeat *seat)

auto *seatConfig = seatUserConfig(seat);

applyXkbConfig(seat,
seatConfig->xkbLayout(),
seatConfig->xkbModel(),
seatConfig->xkbVariant(),
seatConfig->xkbOptions());
}

void InputManager::applyXkbConfig(WSeat *seat,
const QString &layoutName,
const QString &modelName,
const QString &variantName,
const QString &optionsName)
{
Q_ASSERT(seat);

struct xkb_rule_names rules = {};
QByteArray layout = seatConfig->xkbLayout().toUtf8();
QByteArray model = seatConfig->xkbModel().toUtf8();
QByteArray variant = seatConfig->xkbVariant().toUtf8();
QByteArray options = seatConfig->xkbOptions().toUtf8();
QByteArray layout = layoutName.toUtf8();
QByteArray model = modelName.toUtf8();
QByteArray variant = variantName.toUtf8();
QByteArray options = optionsName.toUtf8();
rules.layout = layout.constData();
rules.model = model.constData();
rules.variant = variant.constData();
Expand Down
5 changes: 5 additions & 0 deletions src/input/inputmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ private Q_SLOTS:
void setupSeat(WSeat *seat);
void applyNumLockToKeyboards();
void applyXkbConfigForSeat(WSeat *seat);
void applyXkbConfig(WSeat *seat,
const QString &layout,
const QString &model,
const QString &variant,
const QString &options);
static void setNumLockForSeat(WSeat *seat, bool enabled);

QString m_userName;
Expand Down
74 changes: 74 additions & 0 deletions src/modules/input-manager/inputmanagerinterfacev1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ static QList<MouseSettingsInterfaceV1 *> s_mouseSettings;
static QList<TouchpadSettingsInterfaceV1 *> s_touchpadSettings;
static QList<KeyboardSettingsInterfaceV1 *> s_keyboardSettings;

static QString normalizeNullableXkbString(const QString &value)
{
return value.isNull() ? QStringLiteral("") : value;
}

class TreelandInputManagerInterfaceV1Private : public QtWaylandServer::treeland_input_manager_v1
{
public:
Expand Down Expand Up @@ -854,13 +859,22 @@ class KeyboardSettingsInterfaceV1Private : public QtWaylandServer::treeland_keyb
int32_t repeatRate = 0;
int32_t repeatDelay = 0;
bool numLock = false;
QString xkbLayout;
QString xkbModel;
QString xkbVariant;
QString xkbOptions;

protected:
void destroy_resource(Resource *resource) override;
void destroy(Resource *resource) override;
void set_repeat(Resource *resource, int32_t rate, int32_t delay) override;
void set_num_lock(Resource *resource, uint32_t state) override;
void apply(Resource *resource) override;
void set_xkb_rules(Resource *resource,
const QString &layout,
const QString &model,
const QString &variant,
const QString &options) override;
};

KeyboardSettingsInterfaceV1Private::KeyboardSettingsInterfaceV1Private(KeyboardSettingsInterfaceV1 *_q,
Expand Down Expand Up @@ -914,6 +928,19 @@ void KeyboardSettingsInterfaceV1Private::apply([[maybe_unused]] Resource *resour
pendingChanges = KeyboardSettingsInterfaceV1::NoChange;
}

void KeyboardSettingsInterfaceV1Private::set_xkb_rules([[maybe_unused]] Resource *resource,
const QString &layout,
const QString &model,
const QString &variant,
const QString &options)
{
xkbLayout = normalizeNullableXkbString(layout);
xkbModel = normalizeNullableXkbString(model);
xkbVariant = normalizeNullableXkbString(variant);
xkbOptions = normalizeNullableXkbString(options);
pendingChanges |= KeyboardSettingsInterfaceV1::XkbRulesChanged;
}

KeyboardSettingsInterfaceV1::KeyboardSettingsInterfaceV1(wl_resource *resource,
wl_resource *seat,
QObject *parent)
Expand Down Expand Up @@ -957,6 +984,33 @@ void KeyboardSettingsInterfaceV1::sendNumLock(bool enabled, bool force)
d->numLock = enabled;
}

void KeyboardSettingsInterfaceV1::sendXkbRules(const QString &layout,
const QString &model,
const QString &variant,
const QString &options,
bool force)
{
const QString normalizedLayout = normalizeNullableXkbString(layout);
const QString normalizedModel = normalizeNullableXkbString(model);
const QString normalizedVariant = normalizeNullableXkbString(variant);
const QString normalizedOptions = normalizeNullableXkbString(options);

if (d->resource()->version() < XkbVersion
|| (!force
&& d->xkbLayout == normalizedLayout
&& d->xkbModel == normalizedModel
&& d->xkbVariant == normalizedVariant
&& d->xkbOptions == normalizedOptions)) {
return;
}

d->send_xkb_rules(normalizedLayout, normalizedModel, normalizedVariant, normalizedOptions);
d->xkbLayout = normalizedLayout;
d->xkbModel = normalizedModel;
d->xkbVariant = normalizedVariant;
d->xkbOptions = normalizedOptions;
}

void KeyboardSettingsInterfaceV1::sendFailed()
{
d->send_failed();
Expand All @@ -982,6 +1036,26 @@ bool KeyboardSettingsInterfaceV1::numLock() const
return d->numLock;
}

const QString &KeyboardSettingsInterfaceV1::xkbLayout() const
{
return d->xkbLayout;
}

const QString &KeyboardSettingsInterfaceV1::xkbModel() const
{
return d->xkbModel;
}

const QString &KeyboardSettingsInterfaceV1::xkbVariant() const
{
return d->xkbVariant;
}

const QString &KeyboardSettingsInterfaceV1::xkbOptions() const
{
return d->xkbOptions;
}

wl_resource *KeyboardSettingsInterfaceV1::seat() const
{
return d->seat;
Expand Down
Loading
Loading