From 49f8a3cfc939e2a408db36274d1325ebef21b739 Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Mon, 28 Jan 2013 21:05:29 +0000 Subject: Fix STR#2928: alt+e on US keyboard not processed correctly as shortcut on Mac OS. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9811 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- FL/mac.H | 1 + src/Fl.cxx | 3 +++ src/Fl_cocoa.mm | 12 ++++++++++++ 3 files changed, 16 insertions(+) diff --git a/FL/mac.H b/FL/mac.H index 8c1185fd4..d4cfb5367 100644 --- a/FL/mac.H +++ b/FL/mac.H @@ -133,6 +133,7 @@ public: static void screen_work_area(int &X, int &Y, int &W, int &H, int n); // compute work area of a given screen static int next_marked_length; // next length of marked text after current marked text will have been replaced static int insertion_point_location(int *px, int *py, int *pheight); // computes window coordinates & height of insertion point + static int shortcut_events_since_keyDown; // to limit to one FL_SHORTCUT event per keyDown event. private: static void relink(Fl_Window*, Fl_Window*); bool subwindow; diff --git a/src/Fl.cxx b/src/Fl.cxx index d6f98dc5e..b3e13e218 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -1280,6 +1280,9 @@ int Fl::handle_(int e, Fl_Window* window) e_number = e = FL_SHORTCUT; case FL_SHORTCUT: +#ifdef __APPLE__ + if (Fl_X::shortcut_events_since_keyDown++ > 0) return 0; +#endif if (grab()) {wi = grab(); break;} // send it to grab window // Try it as shortcut, sending to mouse widget and all parents: diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 8dfdd19fb..2759057ed 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -52,6 +52,7 @@ extern "C" { #include #include #include +#include #import @@ -106,6 +107,7 @@ Window fl_window; Fl_Window *Fl_Window::current_; int fl_mac_os_version = calc_mac_os_version(); // the version number of the running Mac OS X (e.g., 100604 for 10.6.4) static SEL inputContextSEL = (fl_mac_os_version >= 100600 ? @selector(inputContext) : @selector(FLinputContext)); +int Fl_X::shortcut_events_since_keyDown = INT_MIN; // forward declarations of variables in this file static int got_events = 0; @@ -1656,6 +1658,14 @@ static void q_set_window_title(NSWindow *nsw, const char * name, const char *mi by sending the interpretKeyEvents: message to the FLTextView object. The system sends back doCommandBySelector: and insertText: messages to the FLTextView object that are transmitted unchanged to myview to be processed as with OS >= 10.6. The system also sends setMarkedText: messages directly to myview. + + When 2 deadkeys are pressed in succession, the messages sent are [myview setMarkedText:] by the 1st keystroke and + [myview insertText:] [myview setMarkedText:] by the 2nd keystroke. Each of these messages creates an FL_KEYBOARD event, + so there are two FL_KEYBOARD events for the 2nd keystroke. If no widget in the window accepts keyboard input, FL_KEYBOARD + events are re-tried as FL_SHORTCUT events, which makes two FL_SHORTCUT events for a single keystroke. This is a problem + when these keystrokes are used as shortcuts. Such problem occurs, for example, with Alt+e on a US keyboard. + The Fl_X::shortcut_events_since_keyDown variable allows to transform only one FL_KEYBOARD event into an FL_SHORTCUT + event during processing of a keystroke, and thus fixes the double-shortcut problem. There is furthermore an oddity of dead key processing with OS <= 10.5. It occurs when a dead key followed by a non-accented key are pressed. Say, for example, that keys '^' followed by 'p' are pressed on a French or German keyboard. Resulting @@ -1859,7 +1869,9 @@ static void cocoaKeyboardHandler(NSEvent *theEvent) Fl::first_window(window); cocoaKeyboardHandler(theEvent); in_key_event = YES; + Fl_X::shortcut_events_since_keyDown = 0; [[self performSelector:inputContextSEL] handleEvent:theEvent]; + Fl_X::shortcut_events_since_keyDown = INT_MIN; in_key_event = NO; fl_unlock_function(); } -- cgit v1.2.3