Author: manolo
Date: 2013-01-19 01:49:33 -0800 (Sat, 19 Jan 2013)
New Revision: 9803
Log:
Mac OS: fixed processing of system menu shortcuts that had been partly damaged
in r.9799,
and fixed application menu with OS <= 10.3 that was duplicated.
Modified:
branches/branch-1.3/src/Fl_cocoa.mm
Modified: branches/branch-1.3/src/Fl_cocoa.mm
===================================================================
--- branches/branch-1.3/src/Fl_cocoa.mm 2013-01-18 17:35:40 UTC (rev 9802)
+++ branches/branch-1.3/src/Fl_cocoa.mm 2013-01-19 09:49:33 UTC (rev 9803)
@@ -1615,15 +1615,16 @@
Keyboard input sends keyDown: and performKeyEquivalent: messages to myview.
The latter occurs for keys such as
ForwardDelete, arrows and F1, and when the Ctrl or Cmd modifiers are used.
Other key presses send keyDown: messages.
- Both keyDown: and performKeyEquivalent: methods call [[myview inputContext]
handleEvent:theEvent] that triggers system
- processing of keyboard events. Three sorts of messages are then sent back by
the system to myview: doCommandBySelector:,
- setMarkedText: and insertText:. All 3 messages eventually produce
Fl::handle(FL_KEYBOARD, focus-window) calls.
- The handleEvent: method, however, does not send any message back to myview
when both the Alt and Cmd modifiers
- are pressed. In this situation, the performKeyEquivalent: method directly
sends the doCommandBySelector: message to myview.
- The doCommandBySelector: message allows to process events such as new-line,
forward and backward delete, arrows, escape,
- tab, F1 and when the Ctrl or Cmd modifiers are used. The message
setMarkedText:
- is sent when marked text, that is, temporary text that gets replaced later by
some other text, is inserted. This happens
- when a dead key is pressed, and also when entering complex scripts (e.g.,
Chinese). Fl_X::next_marked_length gives the byte
+ The keyDown: method calls [[myview inputContext] handleEvent:theEvent] that
triggers system
+ processing of keyboard events. The performKeyEquivalent: method directly
calls Fl::handle(FL_KEYBOARD, focus-window)
+ when the Ctrl or Cmd modifiers are used. If not, it also calls [[myview
inputContext] handleEvent:theEvent].
+ The performKeyEquivalent: method returns YES when the keystroke has been
handled and NO otherwise, which allows
+ shortcuts of the system menu to be processed. Three sorts of messages are
then sent back by the system to myview:
+ doCommandBySelector:, setMarkedText: and insertText:. All 3 messages
eventually produce Fl::handle(FL_KEYBOARD, win) calls.
+ The doCommandBySelector: message allows to process events such as new-line,
forward and backward delete, arrows,
+ escape, tab, F1. The message setMarkedText: is sent when marked text, that
is, temporary text that gets replaced later
+ by some other text, is inserted. This happen when a dead key is pressed, and
also
+ when entering complex scripts (e.g., Chinese). Fl_X::next_marked_length gives
the byte
length of marked text before the FL_KEYBOARD event is processed.
Fl::compose_state gives this length after this processing.
Message insertText: is sent to enter text in the focused widget. If there's
marked text, Fl::compose_state is > 0, and this
marked text gets replaced by the inserted text. If there's no marked text,
the new text is inserted at the insertion point.
@@ -1794,12 +1795,21 @@
//NSLog(@"performKeyEquivalent:");
fl_lock_function();
cocoaKeyboardHandler(theEvent);
- in_key_event = YES;
+ BOOL handled;
NSUInteger mods = [theEvent modifierFlags];
- BOOL handled = YES;
- if ( (mods & NSAlternateKeyMask) && (mods & NSCommandKeyMask) ) [self
doCommandBySelector:@selector(noop:)];
- else handled = [[self performSelector:inputContextSEL] handleEvent:theEvent];
- in_key_event = NO;
+ if ( (mods & NSControlKeyMask) || (mods & NSCommandKeyMask) ) {
+ NSString *s = [theEvent characters];
+ if ( (mods & NSShiftKeyMask) && (mods & NSCommandKeyMask) ) {
+ s = [s uppercaseString]; // US keyboards return lowercase letter in s if
cmd-shift-key is hit
+ }
+ [FLView prepareEtext:s];
+ handled = Fl::handle(FL_KEYBOARD, [(FLWindow*)[theEvent window]
getFl_Window]);
+ }
+ else {
+ in_key_event = YES;
+ handled = [[self performSelector:inputContextSEL] handleEvent:theEvent];
+ in_key_event = NO;
+ }
fl_unlock_function();
return handled;
}
@@ -2009,12 +2019,7 @@
- (void)doCommandBySelector:(SEL)aSelector {
//NSLog(@"doCommandBySelector:%s",sel_getName(aSelector));
- NSString *s = [[NSApp currentEvent] characters];
- NSUInteger mods = [[NSApp currentEvent] modifierFlags];
- if ( (mods & NSShiftKeyMask) && (mods & NSCommandKeyMask) ) {
- s = [s uppercaseString]; // US keyboards return lowercase letter in s if
cmd-shift-key is hit
- }
- [FLView prepareEtext:s];
+ [FLView prepareEtext:[[NSApp currentEvent] characters]];
Fl_Window *target = [(FLWindow*)[self window] getFl_Window];
Fl::handle(FL_KEYBOARD, target);
}
@@ -3058,7 +3063,7 @@
static BOOL donethat = NO;
if (donethat) return;
donethat = YES;
- NSMenu *mainmenu, *services, *appleMenu;
+ NSMenu *mainmenu, *services = nil, *appleMenu;
NSMenuItem *menuItem;
NSString *title;
@@ -3083,35 +3088,37 @@
[menuItem setEnabled:YES];
[appleMenu addItem:[NSMenuItem separatorItem]];
}
- // Services Menu
- services = [[NSMenu alloc] init];
- menuItem = [appleMenu
- addItemWithTitle:[NSString
stringWithUTF8String:Fl_Mac_App_Menu::services]
- action:nil
- keyEquivalent:@""];
- [appleMenu setSubmenu:services forItem:menuItem];
- [appleMenu addItem:[NSMenuItem separatorItem]];
- // Hide AppName
- title = [[NSString stringWithUTF8String:Fl_Mac_App_Menu::hide]
stringByAppendingString:nsappname];
- [appleMenu addItemWithTitle:title
- action:@selector(hide:)
+ if (fl_mac_os_version >= 100400) { // services+hide+quit already in menu in
OS 10.3
+ // Services Menu
+ services = [[NSMenu alloc] init];
+ menuItem = [appleMenu
+ addItemWithTitle:[NSString
stringWithUTF8String:Fl_Mac_App_Menu::services]
+ action:nil
+ keyEquivalent:@""];
+ [appleMenu setSubmenu:services forItem:menuItem];
+ [appleMenu addItem:[NSMenuItem separatorItem]];
+ // Hide AppName
+ title = [[NSString stringWithUTF8String:Fl_Mac_App_Menu::hide]
stringByAppendingString:nsappname];
+ [appleMenu addItemWithTitle:title
+ action:@selector(hide:)
+ keyEquivalent:@"h"];
+ // Hide Others
+ menuItem = [appleMenu
+ addItemWithTitle:[NSString
stringWithUTF8String:Fl_Mac_App_Menu::hide_others]
+ action:@selector(hideOtherApplications:)
keyEquivalent:@"h"];
- // Hide Others
- menuItem = [appleMenu
- addItemWithTitle:[NSString
stringWithUTF8String:Fl_Mac_App_Menu::hide_others]
- action:@selector(hideOtherApplications:)
- keyEquivalent:@"h"];
- [menuItem
setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
- // Show All
- [appleMenu addItemWithTitle:[NSString
stringWithUTF8String:Fl_Mac_App_Menu::show]
- action:@selector(unhideAllApplications:)
keyEquivalent:@""];
- [appleMenu addItem:[NSMenuItem separatorItem]];
- // Quit AppName
- title = [[NSString stringWithUTF8String:Fl_Mac_App_Menu::quit]
- stringByAppendingString:nsappname];
- [appleMenu addItemWithTitle:title
- action:@selector(terminate:)
- keyEquivalent:@"q"];
+ [menuItem
setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
+ // Show All
+ [appleMenu addItemWithTitle:[NSString
stringWithUTF8String:Fl_Mac_App_Menu::show]
+ action:@selector(unhideAllApplications:)
keyEquivalent:@""];
+ [appleMenu addItem:[NSMenuItem separatorItem]];
+ // Quit AppName
+ title = [[NSString stringWithUTF8String:Fl_Mac_App_Menu::quit]
+ stringByAppendingString:nsappname];
+ [appleMenu addItemWithTitle:title
+ action:@selector(terminate:)
+ keyEquivalent:@"q"];
+ }
/* Put menu into the menubar */
menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil
keyEquivalent:@""];
[menuItem setSubmenu:appleMenu];
@@ -3122,9 +3129,11 @@
// to avoid compiler warning raised by use of undocumented setAppleMenu
:
[NSApp performSelector:@selector(setAppleMenu:) withObject:appleMenu];
}
- [NSApp setServicesMenu:services];
[NSApp setMainMenu:mainmenu];
- [services release];
+ if (services) {
+ [NSApp setServicesMenu:services];
+ [services release];
+ }
[mainmenu release];
[appleMenu release];
[menuItem release];
_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit