Skip to content
Open
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
70 changes: 55 additions & 15 deletions include/xstudio/ui/keyboard.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,21 +216,61 @@ class Hotkey {
//{0x7c
{0x7d, "}"},
{0x7e, "~"},
{93, "numpad 0"},
{96, "numpad 1"},
{97, "numpad 2"},
{98, "numpad 3"},
{99, "numpad 4"},
{100, "numpad 5"},
{101, "numpad 6"},
{102, "numpad 7"},
{103, "numpad 8"},
{104, "numpad 9"},
{105, "numpad multiply"},
{106, "numpad add"},
{107, "numpad subtract"},
{109, "numpad decimal point"},
{110, "numpad divide"}};

// Use Javascript keycodes for the numpad
// except for '0' as it conflicts with '`' above
{ 97, "numpad 1"},
{ 98, "numpad 2"},
{ 99, "numpad 3"},
{100, "numpad 4"},
{101, "numpad 5"},
{102, "numpad 6"},
{103, "numpad 7"},
{104, "numpad 8"},
{105, "numpad 9"},
{106, "numpad multiply"},
{107, "numpad add"},
{108, "numpad 0"},
{109, "numpad subtract"},
{110, "numpad decimal point"},
{111, "numpad comma"},
{111, "numpad divide"}};

inline static const std::map<int, int> key_to_numpad_key = {
{0x2a, 106}, // *
{0x2b, 107}, // +
{0x2c, 112}, // , (replaces . on some keyboards)
{0x2d, 109}, // -
{0x2e, 110}, // .
{0x2f, 111}, // /
{0x30, 108}, // 0
{0x31, 97}, // 1
{0x32, 98}, // 2
{0x33, 99}, // 3
{0x34, 100}, // 4
{0x35, 101}, // 5
{0x36, 102}, // 6
{0x37, 103}, // 7
{0x38, 104}, // 8
{0x39, 105}, // 9

#ifndef __apple__
// remap numpad alternate keys to the above
// but not under macOS as it isn't needed
// and actually causes problems
{0x01000006, 108}, // Insert => 0
{0x01000007, 110}, // Delete => .
{0x0100000b, 101}, // Clear => 5
{0x01000010, 103}, // Home => 7
{0x01000011, 97}, // End => 1
{0x01000012, 100}, // Left => 4
{0x01000013, 104}, // Up => 8
{0x01000014, 102}, // Right => 6
{0x01000015, 98}, // Down => 2
{0x01000016, 105}, // PageUp => 9
{0x01000017, 99}, // PageDown => 3
#endif
};

inline static const std::map<int, int> key_to_modifier = {
{0x01000020, (int)ShiftModifier},
Expand Down
11 changes: 8 additions & 3 deletions src/ui/base/src/keyboard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,9 @@ void Hotkey::sequence_to_key_and_modifier(
modifier |= ControlModifier;
} else {
for (const auto &q : ui::Hotkey::key_names) {
if (q.second == D) {
const std::string qD = utility::replace_all(q.second, " ", "");
const std::string qd = utility::to_lower(qD);
if (qd == d) {
keycode = q.first;
break;
}
Expand All @@ -300,7 +302,8 @@ void Hotkey::sequence_to_key_and_modifier(
}

for (const auto &p : seq) {
const std::string d = utility::to_lower(p);
const std::string D = utility::replace_all(p, " ", "");
const std::string d = utility::to_lower(D);
if (d == "shift") {
modifier |= ShiftModifier;
} else if (d == "meta") {
Expand All @@ -311,7 +314,9 @@ void Hotkey::sequence_to_key_and_modifier(
modifier |= ControlModifier;
} else {
for (const auto &q : ui::Hotkey::key_names) {
if (q.second == p) {
const std::string qD = utility::replace_all(q.second, " ", "");
const std::string qd = utility::to_lower(qD);
if (qd == d) {
keycode = q.first;
break;
}
Expand Down
44 changes: 40 additions & 4 deletions src/ui/qml/helper/src/helper_ui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,10 +272,20 @@ bool KeyEventsItem::event(QEvent *event) {

auto key_event = dynamic_cast<QKeyEvent *>(event);
if (key_event) {
auto text = StdFromQString(key_event->text());
auto key = key_event->key();

// remap numpad keys
if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
text = ui::Hotkey::key_names.at(key);
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Ken,

It would be nice if the extraction of the 'key' integer code and the 'text' string from QKeyEvent could be done in a dedicated helper function, perhaps located in helpers_ui.hpp - and then that function could be used throughout whenever we handle a QKeyEvent and send it to the KeypressMonitor. This would eliminate the duplication of the remapping logic.

Something like this:

`
std::pair<int, std::string> decodeQKeyEvent(const QKeyEvent *) {

 auto text = StdFromQString(key_event->text());
 auto key = key_event->key();

 // remap numpad keys
 if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
      ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
      key = ui::Hotkey::key_to_numpad_key.at(key);
      text = ui::Hotkey::key_names.at(key);
 }
 return {key, text};

}
`

anon_mail(
ui::keypress_monitor::key_down_atom_v,
key_event->key(),
StdFromQString(key_event->text()),
key,
text,
context_,
window_name_,
key_event->isAutoRepeat())
Expand All @@ -285,8 +295,16 @@ bool KeyEventsItem::event(QEvent *event) {

auto key_event = dynamic_cast<QKeyEvent *>(event);
if (key_event && !key_event->isAutoRepeat()) {
auto key = key_event->key();

// remap numpad keys
if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
}

anon_mail(
ui::keypress_monitor::key_up_atom_v, key_event->key(), context_, window_name_)
ui::keypress_monitor::key_up_atom_v, key, context_, window_name_)
.send(keypress_monitor_);
}
} else if (
Expand Down Expand Up @@ -331,9 +349,19 @@ void KeyEventsItem::keyPressEvent(QKeyEvent *event) {
if (window_name_.empty())
window_name_ = StdFromQString(item_window_name(parent()));

auto text = StdFromQString(event->text());
auto key = event->key();

// remap numpad keys
if ((event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
text = ui::Hotkey::key_names.at(key);
}

anon_mail(
ui::keypress_monitor::text_entry_atom_v,
StdFromQString(event->text()),
text,
context_,
window_name_)
.send(keypress_monitor_);
Expand All @@ -344,6 +372,14 @@ void KeyEventsItem::keyReleaseEvent(QKeyEvent *event) {
window_name_ = StdFromQString(item_window_name(parent()));

if (!event->isAutoRepeat()) {
auto key = event->key();

// remap numpad keys
if ((event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
}

anon_mail(ui::keypress_monitor::key_up_atom_v, event->key(), context_, window_name_)
.send(keypress_monitor_);
}
Expand Down
41 changes: 38 additions & 3 deletions src/ui/qml/viewport/src/qml_viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,15 @@ void QMLViewport::keyPressEvent(QKeyEvent *key_event) {
text = v.data();
}

auto key = key_event->key();

// remap numpad keys
if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
text = ui::Hotkey::key_names.at(key);
}

anon_mail(
ui::keypress_monitor::text_entry_atom_v,
text,
Expand All @@ -432,9 +441,17 @@ void QMLViewport::keyPressEvent(QKeyEvent *key_event) {
void QMLViewport::keyReleaseEvent(QKeyEvent *key_event) {

if (!key_event->isAutoRepeat()) {
auto key = key_event->key();

// remap numpad keys
if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
}

anon_mail(
ui::keypress_monitor::key_up_atom_v,
key_event->key(),
key,
renderer_actor ? renderer_actor->std_name() : "",
StdFromQString(m_window->objectName()))
.send(keypress_monitor_);
Expand Down Expand Up @@ -470,10 +487,20 @@ bool QMLViewport::event(QEvent *event) {

auto key_event = dynamic_cast<QKeyEvent *>(event);
if (key_event) {
auto text = StdFromQString(key_event->text());
auto key = key_event->key();

// remap numpad keys
if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
text = ui::Hotkey::key_names.at(key);
}

anon_mail(
ui::keypress_monitor::key_down_atom_v,
key_event->key(),
StdFromQString(key_event->text()),
key,
text,
renderer_actor ? renderer_actor->std_name() : "",
StdFromQString(m_window->objectName()),
key_event->isAutoRepeat())
Expand All @@ -483,6 +510,14 @@ bool QMLViewport::event(QEvent *event) {

auto key_event = dynamic_cast<QKeyEvent *>(event);
if (key_event && !key_event->isAutoRepeat()) {
auto key = key_event->key();

// remap numpad keys
if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
}

anon_mail(
ui::keypress_monitor::key_up_atom_v,
key_event->key(),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this line 523 be just 'key' ?

Expand Down
39 changes: 37 additions & 2 deletions src/ui/qt/viewport_widget/src/viewport_widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,10 +156,19 @@ void ViewportGLWidget::mouseDoubleClickEvent(QMouseEvent *event) {
}

void ViewportGLWidget::keyPressEvent(QKeyEvent *key_event) {
auto text = StdFromQString(key_event->text());
auto key = key_event->key();

// remap numpad keys
if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
text = ui::Hotkey::key_names.at(key);
}

anon_mail(
ui::keypress_monitor::text_entry_atom_v,
StdFromQString(key_event->text()),
text,
the_viewport_->name(),
window_name_)
.send(keypress_monitor_);
Expand All @@ -168,6 +177,14 @@ void ViewportGLWidget::keyPressEvent(QKeyEvent *key_event) {
void ViewportGLWidget::keyReleaseEvent(QKeyEvent *key_event) {

if (!key_event->isAutoRepeat()) {
auto key = key_event->key();

// remap numpad keys
if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
}

anon_mail(
ui::keypress_monitor::key_up_atom_v,
key_event->key(),
Expand All @@ -183,10 +200,20 @@ bool ViewportGLWidget::event(QEvent *event) {

auto key_event = dynamic_cast<QKeyEvent *>(event);
if (key_event) {
auto text = StdFromQString(key_event->text());
auto key = key_event->key();

// remap numpad keys
if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
text = ui::Hotkey::key_names.at(key);
}

anon_mail(
ui::keypress_monitor::key_down_atom_v,
key_event->key(),
StdFromQString(key_event->text()),
text,
the_viewport_->name(),
window_name_,
key_event->isAutoRepeat())
Expand All @@ -196,6 +223,14 @@ bool ViewportGLWidget::event(QEvent *event) {

auto key_event = dynamic_cast<QKeyEvent *>(event);
if (key_event && !key_event->isAutoRepeat()) {
auto key = key_event->key();

// remap numpad keys
if ((key_event->modifiers() & Qt::KeypadModifier) == Qt::KeypadModifier and
ui::Hotkey::key_to_numpad_key.find(key) != ui::Hotkey::key_to_numpad_key.end()) {
key = ui::Hotkey::key_to_numpad_key.at(key);
}

anon_mail(
ui::keypress_monitor::key_up_atom_v,
key_event->key(),
Expand Down
Loading