Author: fendrin
Date: Thu Oct 27 16:41:34 2011
New Revision: 51685
URL: http://svn.gna.org/viewcvs/wesnoth?rev=51685&view=rev
Log:
Reverted commit 51664 restoring bug# 17232,
and hopefully closing #18868.
Modified:
trunk/src/hotkeys.cpp
trunk/src/hotkeys.hpp
trunk/src/preferences_display.cpp
Modified: trunk/src/hotkeys.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/hotkeys.cpp?rev=51685&r1=51684&r2=51685&view=diff
==============================================================================
--- trunk/src/hotkeys.cpp (original)
+++ trunk/src/hotkeys.cpp Thu Oct 27 16:41:34 2011
@@ -324,6 +324,7 @@
description_(description),
scope_(s),
type_(UNBOUND),
+ character_(0),
ctrl_(false),
alt_(false),
cmd_(false),
@@ -371,11 +372,8 @@
if (key == CLEARED_TEXT)
{
- type_ = CLEARED;
+ type_ = hotkey_item::CLEARED;
return;
- } else {
- type_ = BY_KEYCODE;
- keycode_ = sdl_keysym_from_name(key);
}
wide_string wkey = utils::string_to_wstring(key);
@@ -383,6 +381,9 @@
// They may really want a specific key on the keyboard: we assume
// that any single character keyname is a character.
if (wkey.size() > 1) {
+ type_ = BY_KEYCODE;
+
+ keycode_ = sdl_keysym_from_name(key);
if (keycode_ == SDLK_UNKNOWN) {
if (tolower(key[0]) != 'f') {
ERR_CF << "hotkey key '" << key << "'
invalid\n";
@@ -404,13 +405,24 @@
// files.
type_ = BY_KEYCODE;
keycode_ = wkey[0];
+ } else {
+ type_ = BY_CHARACTER;
+ character_ = wkey[0];
}
}
std::string hotkey_item::get_name() const
{
std::stringstream str;
- if (type_ == BY_KEYCODE) {
+ if (type_ == BY_CHARACTER) {
+ if (alt_)
+ str << "alt+";
+ if (cmd_)
+ str << "cmd+";
+ if (ctrl_)
+ str << "ctrl+";
+ str << static_cast<char>(character_);
+ } else if (type_ == BY_KEYCODE) {
if (alt_)
str << "alt+";
if (ctrl_)
@@ -454,7 +466,6 @@
break;
default:
direction = "Unknown";
- break;
}
str << "Joy" << joystick_ << "Hat" << hat_ << direction;
}
@@ -485,21 +496,48 @@
type_ = HAT;
}
-void hotkey_item::set_key(int keycode, bool shift, bool ctrl, bool alt, bool
cmd)
-{
- LOG_G << "setting hotkey: keycode=" <<
lexical_cast<std::string>(keycode) << " "
+void hotkey_item::set_key(int character, int keycode, bool shift, bool ctrl,
bool alt, bool cmd)
+{
+ const std::string keyname = SDL_GetKeyName(SDLKey(keycode));
+
+ LOG_G << "setting hotkey: char=" << lexical_cast<std::string>(character)
+ << " keycode=" << lexical_cast<std::string>(keycode) << " "
<< (shift ? "shift," : "")
<< (ctrl ? "ctrl," : "")
<< (alt ? "alt," : "")
<< (cmd ? "cmd," : "")
<< "\n";
- type_ = BY_KEYCODE;
- keycode_ = keycode;
- shift_ = shift;
- ctrl_ = ctrl;
- alt_ = alt;
- cmd_ = cmd;
+ // Sometimes control modifies by -64, ie ^A == 1.
+ if (character < 64 && ctrl) {
+ if (shift)
+ character += 64;
+ else
+ character += 96;
+ LOG_G << "Mapped to character " <<
lexical_cast<std::string>(character) << "\n";
+ }
+
+ // For some reason on Mac OS, if cmd and shift are down, the character
doesn't get upper-cased
+ if (cmd && character > 96 && character < 123 && shift)
+ character -= 32;
+
+ // We handle simple cases by character, others by the actual key.
+ if (isprint(character) && !isspace(character)) {
+ type_ = BY_CHARACTER;
+ character_ = character;
+ ctrl_ = ctrl;
+ alt_ = alt;
+ cmd_ = cmd;
+ LOG_G << "type = BY_CHARACTER\n";
+ } else {
+ type_ = BY_KEYCODE;
+ keycode_ = keycode;
+ shift_ = shift;
+ ctrl_ = ctrl;
+ alt_ = alt;
+ cmd_ = cmd;
+ LOG_G << "type = BY_KEYCODE\n";
+ }
}
manager::manager()
@@ -605,10 +643,12 @@
if (i->get_type() == hotkey_item::BY_KEYCODE) {
item["key"] = SDL_GetKeyName(SDLKey(i->get_keycode()));
item["shift"] = i->get_shift();
- item["alt"] = i->get_alt();
- item["ctrl"] = i->get_ctrl();
- item["cmd"] = i->get_cmd();
- }
+ } else if (i->get_type() == hotkey_item::BY_CHARACTER) {
+ item["key"] =
utils::wchar_to_string(i->get_character());
+ }
+ item["alt"] = i->get_alt();
+ item["ctrl"] = i->get_ctrl();
+ item["cmd"] = i->get_cmd();
}
}
@@ -681,20 +721,48 @@
return *itor;
}
-hotkey_item& get_hotkey(int keycode, bool shift, bool ctrl,
+hotkey_item& get_hotkey(int character, int keycode, bool shift, bool ctrl,
bool alt, bool cmd)
{
std::vector<hotkey_item>::iterator itor;
- DBG_G << "getting hotkey: keycode=" <<
lexical_cast<std::string>(keycode) << " "
+ DBG_G << "getting hotkey: char=" << lexical_cast<std::string>(character)
+ << " keycode=" << lexical_cast<std::string>(keycode) << " "
<< (shift ? "shift," : "")
<< (ctrl ? "ctrl," : "")
<< (alt ? "alt," : "")
<< (cmd ? "cmd," : "")
<< "\n";
+ // Sometimes control modifies by -64, ie ^A == 1.
+ if (0 < character && character < 64 && ctrl) {
+ if (shift)
+ character += 64;
+ else
+ character += 96;
+ DBG_G << "Mapped to character " <<
lexical_cast<std::string>(character) << "\n";
+ }
+
+ // For some reason on Mac OS, if cmd and shift are down, the character
doesn't get upper-cased
+ if (cmd && character > 96 && character < 123 && shift)
+ character -= 32;
+
for (itor = hotkeys_.begin(); itor != hotkeys_.end(); ++itor) {
- if (itor->get_type() == hotkey_item::BY_KEYCODE) {
+ if (itor->get_type() == hotkey_item::BY_CHARACTER) {
+ if (character == itor->get_character()) {
+ if (ctrl == itor->get_ctrl()
+ && alt == itor->get_alt()
+ && cmd == itor->get_cmd()) {
+ if (itor->is_in_active_scope()) {
+ DBG_G << "Could match by
character..." << "yes\n";
+ break;
+ } else {
+ DBG_G << "Could match by
character..." << "yes, but scope is inactive\n";
+ }
+ }
+ DBG_G << "Could match by character..." << "but
modifiers different\n";
+ }
+ } else if (itor->get_type() == hotkey_item::BY_KEYCODE) {
if (keycode == itor->get_keycode()) {
if (shift == itor->get_shift()
&& ctrl == itor->get_ctrl()
@@ -730,7 +798,7 @@
hotkey_item& get_hotkey(const SDL_KeyboardEvent& event)
{
- return get_hotkey(event.keysym.sym,
+ return get_hotkey(event.keysym.unicode, event.keysym.sym,
(event.keysym.mod & KMOD_SHIFT) != 0,
(event.keysym.mod & KMOD_CTRL) != 0,
(event.keysym.mod & KMOD_ALT) != 0,
Modified: trunk/src/hotkeys.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/hotkeys.hpp?rev=51685&r1=51684&r2=51685&view=diff
==============================================================================
--- trunk/src/hotkeys.hpp (original)
+++ trunk/src/hotkeys.hpp Thu Oct 27 16:41:34 2011
@@ -131,6 +131,7 @@
description_(),
scope_(SCOPE_GENERAL),
type_(UNBOUND),
+ character_(0),
ctrl_(false),
alt_(false),
cmd_(false),
@@ -159,11 +160,12 @@
void set_button(int button, int joystick);
void set_hat(int joystick, int hat, int value);
- void set_key(int keycode, bool shift, bool ctrl, bool alt, bool cmd);
+ void set_key(int character, int keycode, bool shift, bool ctrl, bool
alt, bool cmd);
enum type {
UNBOUND,
BY_KEYCODE,
+ BY_CHARACTER,
CLEARED,
BUTTON,
HAT
@@ -178,6 +180,7 @@
bool is_in_active_scope() const { return is_scope_active(get_scope()); }
// Returns unicode value of keypress.
+ int get_character() const { return character_; }
int get_button() const { return button_; }
int get_joystick() const { return joystick_; }
int get_hat() const { return hat_; }
@@ -205,6 +208,8 @@
// BUTTON means gamepad/joystick button_.
enum type type_;
+ // Actual unicode character
+ int character_;
bool ctrl_;
bool alt_;
bool cmd_;
@@ -212,7 +217,6 @@
// These used for function keys (which don't have a unicode value) or
// space (which doesn't have a distinct unicode value when shifted).
bool shift_;
- // Actual unicode character
int keycode_;
// In case type=BUTTON
@@ -256,7 +260,7 @@
hotkey_item& get_hotkey(int joy_num, int button_num);
hotkey_item& get_hotkey(int joy_num, int hat_num, int hat_value);
-hotkey_item& get_hotkey(int keycode, bool shift,
+hotkey_item& get_hotkey(int character, int keycode, bool shift,
bool ctrl, bool alt, bool cmd);
hotkey_item& get_hotkey(const SDL_JoyButtonEvent& event);
hotkey_item& get_hotkey(const SDL_JoyHatEvent& event);
Modified: trunk/src/preferences_display.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/preferences_display.cpp?rev=51685&r1=51684&r2=51685&view=diff
==============================================================================
--- trunk/src/preferences_display.cpp (original)
+++ trunk/src/preferences_display.cpp Thu Oct 27 16:41:34 2011
@@ -353,15 +353,16 @@
disp.update_display();
SDL_Event event;
event.type = 0;
- int keycode = 0, mod = 0; // Just to avoid warning
+ int character = 0, keycode = 0, mod = 0; // Just to
avoid warning
int joystick = 0, button = 0, hat = 0, value = 0;
- const int any_mod = KMOD_CTRL | KMOD_ALT | KMOD_LMETA |
KMOD_SHIFT;
+ const int any_mod = KMOD_CTRL | KMOD_ALT | KMOD_LMETA;
while (event.type!=SDL_KEYDOWN &&
event.type!=SDL_JOYBUTTONDOWN && event.type!= SDL_JOYHATMOTION)
SDL_PollEvent(&event);
do {
if (event.type==SDL_KEYDOWN)
{
keycode=event.key.keysym.sym;
+ character=event.key.keysym.unicode;
mod=event.key.keysym.mod;
};
if (event.type==SDL_JOYBUTTONDOWN) {
@@ -382,7 +383,7 @@
if (keycode == SDLK_ESCAPE && (mod & any_mod) == 0) {
//cancel -- no action
} else {
- const hotkey::hotkey_item& oldhk =
hotkey::get_hotkey(keycode, (mod & KMOD_SHIFT) != 0,
+ const hotkey::hotkey_item& oldhk =
hotkey::get_hotkey(character, keycode, (mod & KMOD_SHIFT) != 0,
(mod & KMOD_CTRL) != 0, (mod &
KMOD_ALT) != 0, (mod & KMOD_LMETA) != 0);
hotkey::hotkey_item& newhk =
hotkey::get_visible_hotkey(menu_.selection());
@@ -417,7 +418,7 @@
}
} else {
- newhk.set_key(keycode, (mod &
KMOD_SHIFT) != 0,
+ newhk.set_key(character,
keycode, (mod & KMOD_SHIFT) != 0,
(mod &
KMOD_CTRL) != 0, (mod & KMOD_ALT) != 0, (mod & KMOD_LMETA) != 0);
menu_.change_item(menu_.selection(), 1, font::NULL_MARKUP + newhk.get_name());
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits