@@ -111,13 +111,37 @@ struct PositionBase { | |||
/** An event prototype with a GLFW key. */ | |||
struct KeyBase { | |||
/** GLFW_KEY_* */ | |||
/** The key corresponding to what it would be called in its position on a QWERTY US keyboard. | |||
For example, the WASD directional keys used for first-person shooters will always be reported as "WASD", regardless if they say "ZQSD" on an AZERTY keyboard. | |||
You should usually not use these for printable characters such as "Ctrl+V" key commands. Instead, use `keyName`. | |||
You *should* use these for non-printable keys, such as Escape, arrow keys, Home, F1-12, etc. | |||
You should also use this for Enter, Tab, and Space. Although they are printable keys, they do not appear in `keyName`. | |||
See GLFW_KEY_* for the list of possible values. | |||
*/ | |||
int key; | |||
/** GLFW_KEY_*. You should usually use `key` instead. */ | |||
/** Platform-dependent "software" key code. | |||
This variable is only included for completion. There should be no reason for you to use this. | |||
You should instead use `key` (for non-printable characters) or `keyName` (for printable characters). | |||
Values are platform independent and can change between different keyboards or keyboard layouts on the same OS. | |||
*/ | |||
int scancode; | |||
/** GLFW_RELEASE, GLFW_PRESS, GLFW_REPEAT, or RACK_HELD */ | |||
/** String containing the lowercase key name, if it produces a printable character. | |||
This is the only variable that correctly represents the label printed on any keyboard layout, whether it's QWERTY, AZERTY, QWERTZ, Dvorak, etc. | |||
For example, if the user presses the key labeled "q" regardless of the key position, `keyName` will be "q". | |||
For non-printable characters this is an empty string. | |||
Enter, Tab, and Space do not give a `keyName`. Use `key` instead. | |||
Shift has no effect on the key name. Shift+1 results in "1", Shift+q results in "q", etc. | |||
*/ | |||
std::string keyName; | |||
/** The type of event occurring with the key. | |||
Possible values are GLFW_RELEASE, GLFW_PRESS, GLFW_REPEAT, or RACK_HELD. | |||
RACK_HELD is sent every frame while the key is held. | |||
*/ | |||
int action; | |||
/** GLFW_MOD_* */ | |||
/** Bitwise OR of key modifiers, such as Ctrl or Shift. | |||
Use (mods & RACK_MOD_MASK) == RACK_MOD_CTRL to check for Ctrl on Linux and Windows but Cmd on Mac. | |||
See GLFW_MOD_* for the list of possible values. | |||
*/ | |||
int mods; | |||
}; | |||
@@ -623,19 +623,17 @@ inline void TagItem::step() { | |||
inline void BrowserSearchField::onSelectKey(const event::SelectKey& e) { | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
switch (e.key) { | |||
case GLFW_KEY_ESCAPE: { | |||
BrowserOverlay* overlay = getAncestorOfType<BrowserOverlay>(); | |||
overlay->hide(); | |||
if (e.key == GLFW_KEY_ESCAPE) { | |||
BrowserOverlay* overlay = getAncestorOfType<BrowserOverlay>(); | |||
overlay->hide(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_BACKSPACE) { | |||
if (text == "") { | |||
ModuleBrowser* browser = getAncestorOfType<ModuleBrowser>(); | |||
browser->clear(); | |||
e.consume(this); | |||
} break; | |||
case GLFW_KEY_BACKSPACE: { | |||
if (text == "") { | |||
ModuleBrowser* browser = getAncestorOfType<ModuleBrowser>(); | |||
browser->clear(); | |||
e.consume(this); | |||
} | |||
} break; | |||
} | |||
} | |||
} | |||
@@ -397,61 +397,40 @@ void ModuleWidget::onHoverKey(const event::HoverKey& e) { | |||
return; | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
switch (e.key) { | |||
case GLFW_KEY_I: { | |||
if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
resetAction(); | |||
e.consume(this); | |||
} | |||
} break; | |||
case GLFW_KEY_R: { | |||
if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
randomizeAction(); | |||
e.consume(this); | |||
} | |||
} break; | |||
case GLFW_KEY_C: { | |||
if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
copyClipboard(); | |||
e.consume(this); | |||
} | |||
} break; | |||
case GLFW_KEY_V: { | |||
if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
pasteClipboardAction(); | |||
e.consume(this); | |||
} | |||
} break; | |||
case GLFW_KEY_D: { | |||
if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
cloneAction(); | |||
e.consume(this); | |||
} | |||
} break; | |||
case GLFW_KEY_U: { | |||
if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
disconnectAction(); | |||
e.consume(this); | |||
} | |||
} break; | |||
case GLFW_KEY_E: { | |||
if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
bypassAction(); | |||
e.consume(this); | |||
} | |||
} break; | |||
if (e.keyName == "i" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
resetAction(); | |||
e.consume(this); | |||
} | |||
if (e.keyName == "r" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
randomizeAction(); | |||
e.consume(this); | |||
} | |||
if (e.keyName == "c" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
copyClipboard(); | |||
e.consume(this); | |||
} | |||
if (e.keyName == "v" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
pasteClipboardAction(); | |||
e.consume(this); | |||
} | |||
if (e.keyName == "d" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
cloneAction(); | |||
e.consume(this); | |||
} | |||
if (e.keyName == "u" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
disconnectAction(); | |||
e.consume(this); | |||
} | |||
if (e.keyName == "e" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
bypassAction(); | |||
e.consume(this); | |||
} | |||
} | |||
if (e.action == RACK_HELD) { | |||
switch (e.key) { | |||
case GLFW_KEY_DELETE: | |||
case GLFW_KEY_BACKSPACE: { | |||
if ((e.mods & RACK_MOD_MASK) == 0) { | |||
removeAction(); | |||
e.consume(NULL); | |||
} | |||
} break; | |||
if ((e.key == GLFW_KEY_DELETE || e.key == GLFW_KEY_BACKSPACE) && (e.mods & RACK_MOD_MASK) == 0) { | |||
removeAction(); | |||
e.consume(NULL); | |||
} | |||
} | |||
} | |||
@@ -108,23 +108,21 @@ void RackScrollWidget::onHoverKey(const event::HoverKey& e) { | |||
arrowSpeed /= 4.0; | |||
if (e.action == RACK_HELD) { | |||
switch (e.key) { | |||
case GLFW_KEY_LEFT: { | |||
offset.x -= arrowSpeed; | |||
e.consume(this); | |||
} break; | |||
case GLFW_KEY_RIGHT: { | |||
offset.x += arrowSpeed; | |||
e.consume(this); | |||
} break; | |||
case GLFW_KEY_UP: { | |||
offset.y -= arrowSpeed; | |||
e.consume(this); | |||
} break; | |||
case GLFW_KEY_DOWN: { | |||
offset.y += arrowSpeed; | |||
e.consume(this); | |||
} break; | |||
if (e.key == GLFW_KEY_LEFT) { | |||
offset.x -= arrowSpeed; | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_RIGHT) { | |||
offset.x += arrowSpeed; | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_UP) { | |||
offset.y -= arrowSpeed; | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_DOWN) { | |||
offset.y += arrowSpeed; | |||
e.consume(this); | |||
} | |||
} | |||
} | |||
@@ -121,13 +121,9 @@ void RackWidget::onHoverKey(const event::HoverKey& e) { | |||
return; | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
switch (e.key) { | |||
case GLFW_KEY_V: { | |||
if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
pastePresetClipboardAction(); | |||
e.consume(this); | |||
} | |||
} break; | |||
if (e.keyName == "v" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
pastePresetClipboardAction(); | |||
e.consume(this); | |||
} | |||
} | |||
} | |||
@@ -97,39 +97,40 @@ void Scene::onHoverKey(const event::HoverKey& e) { | |||
return; | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
if (e.key == GLFW_KEY_N && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
// DEBUG("key '%d '%c' scancode %d '%c' keyName '%s'", e.key, e.key, e.scancode, e.scancode, e.keyName.c_str()); | |||
if (e.keyName == "n" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
APP->patch->loadTemplateDialog(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_Q && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.keyName == "q" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
APP->window->close(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_O && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.keyName == "o" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
APP->patch->loadDialog(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_O && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
if (e.keyName == "o" && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
APP->patch->revertDialog(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_S && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.keyName == "s" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
APP->patch->saveDialog(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_S && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
if (e.keyName == "s" && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
APP->patch->saveAsDialog(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_Z && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.keyName == "z" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
APP->history->undo(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_Z && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
if (e.keyName == "z" && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
APP->history->redo(); | |||
e.consume(this); | |||
} | |||
else if ((e.key == GLFW_KEY_MINUS || e.key == GLFW_KEY_KP_SUBTRACT) && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.keyName == "-" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
float zoom = settings::zoom; | |||
zoom *= 2; | |||
zoom = std::ceil(zoom - 0.01f) - 1; | |||
@@ -137,7 +138,8 @@ void Scene::onHoverKey(const event::HoverKey& e) { | |||
settings::zoom = zoom; | |||
e.consume(this); | |||
} | |||
else if ((e.key == GLFW_KEY_EQUAL || e.key == GLFW_KEY_KP_ADD) && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
// Numpad has a "+" key, but the main keyboard section hides it under "=" | |||
if ((e.keyName == "=" || e.keyName == "+") && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
float zoom = settings::zoom; | |||
zoom *= 2; | |||
zoom = std::floor(zoom + 0.01f) + 1; | |||
@@ -145,31 +147,31 @@ void Scene::onHoverKey(const event::HoverKey& e) { | |||
settings::zoom = zoom; | |||
e.consume(this); | |||
} | |||
else if ((e.key == GLFW_KEY_0 || e.key == GLFW_KEY_KP_0) && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if ((e.keyName == "0") && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
settings::zoom = 0.f; | |||
e.consume(this); | |||
} | |||
else if ((e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) && (e.mods & RACK_MOD_MASK) == 0) { | |||
if ((e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) && (e.mods & RACK_MOD_MASK) == 0) { | |||
moduleBrowser->show(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_F1 && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_F1 && (e.mods & RACK_MOD_MASK) == 0) { | |||
std::thread t([] { | |||
system::openBrowser("https://vcvrack.com/manual/"); | |||
}); | |||
t.detach(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_F3 && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_F3 && (e.mods & RACK_MOD_MASK) == 0) { | |||
settings::cpuMeter ^= true; | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_F11 && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_F11 && (e.mods & RACK_MOD_MASK) == 0) { | |||
APP->window->setFullScreen(!APP->window->isFullScreen()); | |||
e.consume(this); | |||
} | |||
// Alternate key command for exiting fullscreen, since F11 doesn't work reliably on Mac due to "Show desktop" OS binding. | |||
else if (e.key == GLFW_KEY_ESCAPE && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_ESCAPE && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (APP->window->isFullScreen()) | |||
APP->window->setFullScreen(false); | |||
e.consume(this); | |||
@@ -303,6 +303,9 @@ bool State::handleKey(math::Vec pos, int key, int scancode, int action, int mods | |||
eSelectKey.context = &cSelectKey; | |||
eSelectKey.key = key; | |||
eSelectKey.scancode = scancode; | |||
const char* keyName = glfwGetKeyName(key, scancode); | |||
if (keyName) | |||
eSelectKey.keyName = keyName; | |||
eSelectKey.action = action; | |||
eSelectKey.mods = mods; | |||
selectedWidget->onSelectKey(eSelectKey); | |||
@@ -317,6 +320,9 @@ bool State::handleKey(math::Vec pos, int key, int scancode, int action, int mods | |||
eHoverKey.pos = pos; | |||
eHoverKey.key = key; | |||
eHoverKey.scancode = scancode; | |||
const char* keyName = glfwGetKeyName(key, scancode); | |||
if (keyName) | |||
eHoverKey.keyName = keyName; | |||
eHoverKey.action = action; | |||
eHoverKey.mods = mods; | |||
rootWidget->onHoverKey(eHoverKey); | |||
@@ -122,34 +122,34 @@ void ScrollWidget::onHoverKey(const event::HoverKey& e) { | |||
offset.y -= box.size.y * 0.5; | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_PAGE_UP && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.key == GLFW_KEY_PAGE_UP && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
offset.x -= box.size.x * 0.5; | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_PAGE_DOWN && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_PAGE_DOWN && (e.mods & RACK_MOD_MASK) == 0) { | |||
offset.y += box.size.y * 0.5; | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_PAGE_DOWN && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.key == GLFW_KEY_PAGE_DOWN && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
offset.x += box.size.x * 0.5; | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == 0) { | |||
math::Rect containerBox = container->getChildrenBoundingBox(); | |||
offset.y = containerBox.getTop(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
math::Rect containerBox = container->getChildrenBoundingBox(); | |||
offset.x = containerBox.getLeft(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == 0) { | |||
math::Rect containerBox = container->getChildrenBoundingBox(); | |||
offset.y = containerBox.getBottom(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
math::Rect containerBox = container->getChildrenBoundingBox(); | |||
offset.x = containerBox.getRight(); | |||
e.consume(this); | |||
@@ -76,7 +76,7 @@ void TextField::onSelectKey(const event::SelectKey& e) { | |||
} | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_DELETE && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_DELETE && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (cursor == selection) { | |||
text.erase(cursor, 1); | |||
event::Change eChange; | |||
@@ -91,7 +91,7 @@ void TextField::onSelectKey(const event::SelectKey& e) { | |||
} | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_LEFT) { | |||
if (e.key == GLFW_KEY_LEFT) { | |||
if (e.mods & RACK_MOD_CTRL) { | |||
while (--cursor > 0) { | |||
if (text[cursor - 1] == ' ') | |||
@@ -106,7 +106,7 @@ void TextField::onSelectKey(const event::SelectKey& e) { | |||
} | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_RIGHT) { | |||
if (e.key == GLFW_KEY_RIGHT) { | |||
if (e.mods & RACK_MOD_CTRL) { | |||
while (++cursor < (int) text.size()) { | |||
if (text[cursor] == ' ') | |||
@@ -121,29 +121,29 @@ void TextField::onSelectKey(const event::SelectKey& e) { | |||
} | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == 0) { | |||
selection = cursor = 0; | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
cursor = 0; | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == 0) { | |||
selection = cursor = text.size(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
cursor = text.size(); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_V && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.keyName == "v" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
const char* newText = glfwGetClipboardString(APP->window->win); | |||
if (newText) | |||
insertText(newText); | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_X && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.keyName == "x" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (cursor != selection) { | |||
int begin = std::min(cursor, selection); | |||
std::string selectedText = text.substr(begin, std::abs(selection - cursor)); | |||
@@ -152,7 +152,7 @@ void TextField::onSelectKey(const event::SelectKey& e) { | |||
} | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_C && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.keyName == "c" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (cursor != selection) { | |||
int begin = std::min(cursor, selection); | |||
std::string selectedText = text.substr(begin, std::abs(selection - cursor)); | |||
@@ -160,11 +160,11 @@ void TextField::onSelectKey(const event::SelectKey& e) { | |||
} | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_A && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.keyName == "a" && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
selectAll(); | |||
e.consume(this); | |||
} | |||
else if ((e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) && (e.mods & RACK_MOD_MASK) == 0) { | |||
if ((e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (multiline) { | |||
insertText("\n"); | |||
} | |||
@@ -175,10 +175,10 @@ void TextField::onSelectKey(const event::SelectKey& e) { | |||
e.consume(this); | |||
} | |||
// Consume all printable keys | |||
else if ((GLFW_KEY_SPACE <= e.key && e.key <= GLFW_KEY_WORLD_2) || (GLFW_KEY_KP_0 <= e.key && e.key <= GLFW_KEY_KP_EQUAL)) { | |||
if (e.keyName != "") { | |||
e.consume(this); | |||
} | |||
else if (e.key == GLFW_KEY_ESCAPE && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.key == GLFW_KEY_ESCAPE && (e.mods & RACK_MOD_MASK) == 0) { | |||
APP->event->setSelected(NULL); | |||
e.consume(this); | |||
} | |||