From dfdb6f2a826ee0c52d7251614d14289028b65699 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 2 Aug 2007 16:56:05 +0000 Subject: [PATCH] more keymap chaining repairs svn: r7003 --- src/mred/wxme/wx_keym.cxx | 60 +++++++++++++++++++-------------------- src/mred/wxme/wx_keym.h | 1 + 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/mred/wxme/wx_keym.cxx b/src/mred/wxme/wx_keym.cxx index ad6e6958e8..c2b985ba6a 100644 --- a/src/mred/wxme/wx_keym.cxx +++ b/src/mred/wxme/wx_keym.cxx @@ -134,6 +134,7 @@ void wxKeymap::Reset(void) int i; prefix = NULL; + prefixed = 0; for (i = 0; i < chainCount; i++) { chainTo[i]->Reset(); @@ -760,7 +761,7 @@ void wxKeymap::RemoveGrabKeyFunction(void) Bool wxKeymap::HandleKeyEvent(UNKNOWN_OBJ media, wxKeyEvent *event) { - int score, result; + int score, result, was_prefixed; if (event->keyCode == WXK_SHIFT || event->keyCode == WXK_CONTROL @@ -770,7 +771,15 @@ Bool wxKeymap::HandleKeyEvent(UNKNOWN_OBJ media, wxKeyEvent *event) score = GetBestScore(event); - result = ChainHandleKeyEvent(media, event, NULL, NULL, 0, score); + was_prefixed = prefixed; + + result = ChainHandleKeyEvent(media, event, NULL, NULL, prefixed, score); + + if (!result && was_prefixed) { + Reset(); + /* Try again without prefix: */ + result = ChainHandleKeyEvent(media, event, NULL, NULL, 0, score); + } if (result >= 0) Reset(); @@ -814,10 +823,11 @@ int wxKeymap::OtherHandleKeyEvent(UNKNOWN_OBJ media, wxKeyEvent *event, int wxKeymap::ChainHandleKeyEvent(UNKNOWN_OBJ media, wxKeyEvent *event, wxGrabKeyFunction grab, void *grabData, - int try_state, int score) + int only_prefixed, int score) +/* Results: 0 = no match, 1 = match, -1 = matched prefix */ { char *fname; - int result, found_prefix = 0; + int result, sub_result; lastTime = event->timeStamp; lastButton = 0; @@ -827,22 +837,13 @@ int wxKeymap::ChainHandleKeyEvent(UNKNOWN_OBJ media, wxKeyEvent *event, grabData = grabKeyData; } - if (!prefix && (try_state >= 0)) { - int r; - r = OtherHandleKeyEvent(media, event, grab, grabData, 1, score); - - if (r > 0) - return r; + if (only_prefixed && !prefixed) + return 0; - if (try_state > 0) - return r; - else { - if (r < 0) - found_prefix = -1; - try_state = -1; - } - } else if (prefix && (try_state < 0)) - return OtherHandleKeyEvent(media, event, grab, grabData, -1, score); + sub_result = OtherHandleKeyEvent(media, event, grab, grabData, only_prefixed, score); + + if (sub_result > 0) + return sub_result; if (HandleEvent(event->keyCode, event->otherKeyCode, @@ -865,25 +866,24 @@ int wxKeymap::ChainHandleKeyEvent(UNKNOWN_OBJ media, wxKeyEvent *event, return CallFunction(fname, media, event) ? 1 : 0; } else { if (prefix) { - /* Just found prefix; try others */ - int r; - r = OtherHandleKeyEvent(media, event, grab, grabData, try_state, score); - if (r > 0) - return r; - return -1; + prefixed = 1; + return -1; } + /* Huh? */ + result = 0; } - } + } else + result = 0; - result = OtherHandleKeyEvent(media, event, grab, grabData, try_state, score); + if (sub_result < 0) { + prefixed = 1; + result = -1; + } if (!result && grabKeyFunction) if (grabKeyFunction(NULL, this, media, event, grabKeyData)) return 1; - if (!result && found_prefix) - return found_prefix; - return result; } diff --git a/src/mred/wxme/wx_keym.h b/src/mred/wxme/wx_keym.h index 8f0173b2d2..8ebbc25c3b 100644 --- a/src/mred/wxme/wx_keym.h +++ b/src/mred/wxme/wx_keym.h @@ -56,6 +56,7 @@ class wxKeymap : public wxObject double lastX, lastY; class wxKeycode *prefix; + int prefixed; char *active_mouse_function;