diff --git a/src/app/ui/select_accelerator.cpp b/src/app/ui/select_accelerator.cpp index 1ccf33bad..d483827d3 100644 --- a/src/app/ui/select_accelerator.cpp +++ b/src/app/ui/select_accelerator.cpp @@ -26,6 +26,8 @@ #include "base/bind.h" #include "base/signal.h" +#include + namespace app { using namespace ui; @@ -50,11 +52,16 @@ protected: case kKeyDownMessage: if (hasFocus() && !isReadOnly()) { KeyMessage* keymsg = static_cast(msg); + KeyModifiers modifiers = keymsg->keyModifiers(); + + if (keymsg->scancode() == kKeySpace) + modifiers = (KeyModifiers)(modifiers & ~kKeySpaceModifier); m_accel = Accelerator( - keymsg->keyModifiers(), + modifiers, keymsg->scancode(), - keymsg->unicodeChar() >= 32 ? keymsg->unicodeChar(): 0); + keymsg->unicodeChar() > 32 ? + std::tolower(keymsg->unicodeChar()): 0); updateText(); AccelChange(&m_accel); @@ -101,11 +108,15 @@ SelectAccelerator::SelectAccelerator(const ui::Accelerator& accel) void SelectAccelerator::onModifierChange(KeyModifiers modifier, CheckBox* checkbox) { bool state = (checkbox->isSelected()); + KeyModifiers modifiers = m_accel.modifiers(); + KeyScancode scancode = m_accel.scancode(); + int unicodeChar = m_accel.unicodeChar(); - m_accel = Accelerator( - (KeyModifiers)((m_accel.modifiers() & ~modifier) | (state ? modifier : 0)), - m_accel.scancode(), - m_accel.unicodeChar()); + modifiers = (KeyModifiers)((modifiers & ~modifier) | (state ? modifier : 0)); + if (modifiers == kKeySpaceModifier && scancode == kKeySpace) + modifiers = kKeyNoneModifier; + + m_accel = Accelerator(modifiers, scancode, unicodeChar); m_keyField->setAccel(m_accel); updateAssignedTo(); diff --git a/src/ui/accelerator.cpp b/src/ui/accelerator.cpp index bc422f5b7..4892d5f3c 100644 --- a/src/ui/accelerator.cpp +++ b/src/ui/accelerator.cpp @@ -15,7 +15,7 @@ #include "base/string.h" #include -#include +#include #include #include @@ -85,7 +85,7 @@ Accelerator::Accelerator(const std::string& str) } if ((tok[0] >= 'a') && (tok[0] <= 'z')) - m_scancode = (KeyScancode)((int)kKeyA + tolower(tok[0]) - 'a'); + m_scancode = (KeyScancode)((int)kKeyA + std::tolower(tok[0]) - 'a'); else if ((tok[0] >= '0') && (tok[0] <= '9')) m_scancode = (KeyScancode)((int)kKey0 + tok[0] - '0'); else { @@ -179,6 +179,21 @@ Accelerator::Accelerator(const std::string& str) } } +bool Accelerator::operator==(const Accelerator& other) const +{ + if (m_modifiers != other.m_modifiers) + return false; + + if (m_scancode == other.m_scancode) { + if (m_scancode != kKeyNil) + return true; + else if (m_unicodeChar != 0) + return (std::tolower(m_unicodeChar) == std::tolower(other.m_unicodeChar)); + } + + return false; +} + bool Accelerator::isEmpty() const { return @@ -364,7 +379,7 @@ bool Accelerator::check(KeyModifiers modifiers, KeyScancode scancode, int unicod } // For any other legal Unicode code else if (unicodeChar >= ' ') { - unicodeChar = tolower(unicodeChar); + unicodeChar = std::tolower(unicodeChar); /* without shift (because characters like '*' can be trigger with "Shift+8", so we don't want "Shift+*") */ diff --git a/src/ui/accelerator.h b/src/ui/accelerator.h index fd3d99257..701437476 100644 --- a/src/ui/accelerator.h +++ b/src/ui/accelerator.h @@ -28,13 +28,7 @@ namespace ui { bool check(KeyModifiers modifiers, KeyScancode scancode, int unicodeChar) const; bool checkFromAllegroKeyArray() const; - bool operator==(const Accelerator& other) const { - return - (m_modifiers == other.m_modifiers && - m_scancode == other.m_scancode && - m_unicodeChar == other.m_unicodeChar); - } - + bool operator==(const Accelerator& other) const; bool operator!=(const Accelerator& other) const { return !operator==(other); }