DO NOT REPLY TO THIS MESSAGE.  INSTEAD, POST ANY RESPONSES TO THE LINK BELOW.

[STR Pending]

Link: http://www.fltk.org/str.php?L2221
Version: 1.3-feature
Fix Version: 1.3.0 (r6951)


Here is the Fl_cocoa.mm svn diff output. 
I also propose an addition to the public API:
    fl_mac_set_about(Fl_Menu_Item *item)
connects item to the "About myprog" item of the system application menu.
This allows to program in FLTK a window to be displayed as "About myprog".
I have tried to comment it a-la-Doxygen so it appears in the
doc.


Index: Fl_cocoa.mm
===================================================================
--- Fl_cocoa.mm (revision 6960)
+++ Fl_cocoa.mm (working copy)
@@ -123,6 +123,7 @@
 static Fl_Window* resize_from_system;
 static NSView *viewWithLockedFocus = nil;
 static SInt32 MACsystemVersion;
+void *MACMenuOrItemOperation(const char *operation, ...);
 
 #if CONSOLIDATE_MOTION
 static Fl_Window* send_motion;
@@ -2824,28 +2825,35 @@
 }
 
 @interface FLMenuItem : NSMenuItem {
-  Fl_Callback *cb;
-  void *data;
+  const Fl_Menu_Item *item;
 }
-- (FLMenuItem*) putData:(Fl_Callback*)callback pter:(void*)d;
-- (void) doCallback:(id)obj;
-- (void*)getItemData;
+- (void) setFlMenuItem:(const Fl_Menu_Item*)flItem;
+- (void) doCallback:(id)unused;
+- (void) directCallback:(id)unused;
+- (Fl_Menu_Item*)getFlMenuItem;
 @end
 @implementation FLMenuItem
-- (FLMenuItem*) putData:(Fl_Callback*)callback pter:(void*)d
+- (void) setFlMenuItem:(const Fl_Menu_Item*)flItem
 {
-  cb = callback;
-  data = d;
-  return self;
+  item = flItem;
 }
-- (void) doCallback:(id)obj
+- (void) doCallback:(id)unused
 {
-  if (cb) cb((Fl_Widget*)obj, data);
+  if(item) {
+    fl_sys_menu_bar->picked(item);
+    if ( item->flags & FL_MENU_TOGGLE ) {// update the menu toggle symbol
+      [(NSMenuItem*)unused setState:(item->value() ? NSOnState :
NSOffState)];
+      }
+  }
 }
-- (void*)getItemData
+- (void) directCallback:(id)unused
 {
-  return data;
+  if( item && item->callback() ) item->do_callback(NULL);
 }
+- (const Fl_Menu_Item*)getFlMenuItem
+{
+  return item;
+}
 @end
 
 void *MACmainMenu(void)
@@ -2873,15 +2881,26 @@
   return (void *)mymenu;
 }
 
-void MACsetAboutMenu( Fl_Callback *cb, void *data )
-// attaches a callback to the "About myprog" item of the application menu
+void fl_mac_set_about(  Fl_Menu_Item *flItem ) 
+/** 
+ * Mac OS: attaches an Fl_Menu_Item to the "About myprog" item of the
system application menu.
+ * \note Only the shortcut_, callback_ and user_data_ fields of the
Fl_Menu_Item* \p flItem are used.
+ *
+ * \author Manolo Gouy
+ *
+ * \param[in] flItem is a const Fl_Menu_Item*
+ */
 {
   fl_open_display();
   CFStringRef cfname = CFStringCreateCopy(NULL, (CFStringRef)[[appleMenu
itemAtIndex:0] title]);
   [appleMenu removeItemAtIndex:0];
   FLMenuItem *item = [[FLMenuItem alloc] autorelease];
-  [item initWithTitle:(NSString*)cfname action:@selector(doCallback:)
keyEquivalent:@""];
-  [item putData:cb pter:data];
+  [item initWithTitle:(NSString*)cfname action:@selector(directCallback:)
keyEquivalent:@""];
+  if(flItem->shortcut()) {
+    MACMenuOrItemOperation("setKeyEquivalent", item, flItem->shortcut() &
0xff);
+    MACMenuOrItemOperation("setKeyEquivalentModifierMask", item,
flItem->shortcut() );
+    }
+  [item setFlMenuItem:flItem];
   [appleMenu insertItem:item atIndex:0];
   CFRelease(cfname);
   [item setTarget:item];
@@ -2991,27 +3010,25 @@
     value = va_arg(ap, int);
     [menu removeItem:[menu itemAtIndex:value]];
   }
-  else if(strcmp(operation, "getItemData") == 0) {//arguments: NSMenu*,
int. Returns the item's data
-                                                  //items can have a
callback and a data pointer attached to them. This returns the data
pointer
+  else if(strcmp(operation, "getFlMenuItem") == 0) {//arguments: NSMenu*,
int. Returns the item's Fl_Menu_Item*
     menu = va_arg(ap, NSMenu*);
     value = va_arg(ap, int);
-    retval = [(FLMenuItem *)[menu itemAtIndex:value] getItemData];
+    retval = [(FLMenuItem *)[menu itemAtIndex:value] getFlMenuItem];
   }
   else if(strcmp(operation, "addNewItem") == 0) {
-    //arguments: NSMenu *menu, const char *name, Fl_Callback *cb, void
*data, int *prank
-    //creates a new menu item named 'name' at the end of 'menu'
-    //attaches callback 'cb' and data pointer 'data' to it
+    //arguments: NSMenu *menu, const Fl_Menu_Item* flItem, int *prank
+    //creates a new menu item at the end of 'menu'
+    //attaches the Fl_Menu_Item *flItem to it
     //upon return, puts the rank of the new item in *prank unless prank
is NULL
     menu = va_arg(ap, NSMenu*);
-    char *name = remove_ampersand(va_arg(ap, const char*));
-    Fl_Callback *cb = va_arg(ap, Fl_Callback*);
-    pter = va_arg(ap, void *);
+    const Fl_Menu_Item *flItem = va_arg(ap, const Fl_Menu_Item*);
+    char *name = remove_ampersand(flItem->label());
     int *prank = va_arg(ap, int*);
     CFStringRef cfname = CFStringCreateWithCString(NULL, name,
kCFStringEncodingUTF8);
     free(name);
     FLMenuItem *item = [FLMenuItem alloc];
     [item initWithTitle:(NSString*)cfname action:@selector(doCallback:)
keyEquivalent:@""];
-    [item putData:cb pter:pter];
+    [item setFlMenuItem:flItem];
     [menu addItem:item];
     CFRelease(cfname);
     [item setTarget:item];


Link: http://www.fltk.org/str.php?L2221
Version: 1.3-feature
Fix Version: 1.3.0 (r6951)

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

Reply via email to