Author: manolo
Date: 2013-01-28 13:05:29 -0800 (Mon, 28 Jan 2013)
New Revision: 9811
Log:
Fix STR#2928: alt+e on US keyboard not processed correctly as shortcut on Mac 
OS.

Modified:
   branches/branch-1.3/FL/mac.H
   branches/branch-1.3/src/Fl.cxx
   branches/branch-1.3/src/Fl_cocoa.mm

Modified: branches/branch-1.3/FL/mac.H
===================================================================
--- branches/branch-1.3/FL/mac.H        2013-01-28 16:14:48 UTC (rev 9810)
+++ branches/branch-1.3/FL/mac.H        2013-01-28 21:05:29 UTC (rev 9811)
@@ -133,6 +133,7 @@
   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;

Modified: branches/branch-1.3/src/Fl.cxx
===================================================================
--- branches/branch-1.3/src/Fl.cxx      2013-01-28 16:14:48 UTC (rev 9810)
+++ branches/branch-1.3/src/Fl.cxx      2013-01-28 21:05:29 UTC (rev 9811)
@@ -1280,6 +1280,9 @@
     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:

Modified: branches/branch-1.3/src/Fl_cocoa.mm
===================================================================
--- branches/branch-1.3/src/Fl_cocoa.mm 2013-01-28 16:14:48 UTC (rev 9810)
+++ branches/branch-1.3/src/Fl_cocoa.mm 2013-01-28 21:05:29 UTC (rev 9811)
@@ -52,6 +52,7 @@
 #include <unistd.h>
 #include <stdarg.h>
 #include <math.h>
+#include <limits.h>
 
 #import <Cocoa/Cocoa.h>
 
@@ -106,6 +107,7 @@
 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 @@
  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 @@
   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();
 }

_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit

Reply via email to