summaryrefslogtreecommitdiff
path: root/src/Fl_Sys_Menu_Bar.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/Fl_Sys_Menu_Bar.cxx')
-rw-r--r--src/Fl_Sys_Menu_Bar.cxx193
1 files changed, 150 insertions, 43 deletions
diff --git a/src/Fl_Sys_Menu_Bar.cxx b/src/Fl_Sys_Menu_Bar.cxx
index 6092f75bb..da0451582 100644
--- a/src/Fl_Sys_Menu_Bar.cxx
+++ b/src/Fl_Sys_Menu_Bar.cxx
@@ -61,6 +61,12 @@
#include "flstring.h"
#include <stdio.h>
#include <ctype.h>
+#include <stdarg.h>
+
+#ifdef __APPLE_COCOA__
+extern void *MACMenuOrItemOperation(const char *operation, ...);
+#define MenuHandle void *
+#endif
typedef const Fl_Menu_Item *pFl_Menu_Item;
@@ -69,7 +75,9 @@ typedef const Fl_Menu_Item *pFl_Menu_Item;
* Skip all '&' which would mark the shortcut in FLTK
* Skip all Mac control characters ('(', '<', ';', '^', '!' )
*/
-static void catMenuText( const char *src, char *dst )
+
+#ifndef __APPLE_COCOA__
+ static void catMenuText( const char *src, char *dst )
{
char c;
while ( *dst )
@@ -88,6 +96,7 @@ static void catMenuText( const char *src, char *dst )
* append a marker to identify the menu font style
* <B, I, U, O, and S
*/
+
static void catMenuFont( const Fl_Menu_Item *m, char *dst )
{
if ( !m->labeltype_ && !m->labelfont_ )
@@ -110,11 +119,11 @@ static void catMenuFont( const Fl_Menu_Item *m, char *dst )
strcat( dst, "<S" );
//else if ( m->labeltype_ == FL_SYMBOL_LABEL )
; // not supported
-}
+}
/**
* append a marker to identify the menu shortcut
- * <B, I, U, O, and S
+ * <B, I, U, O, and S
enum {
kMenuNoModifiers = 0,
kMenuShiftModifier = (1 << 0),
@@ -122,7 +131,9 @@ enum {
kMenuControlModifier = (1 << 2),
kMenuNoCommandModifier = (1 << 3)
};
- */
+*/
+#endif
+
static void setMenuShortcut( MenuHandle mh, int miCnt, const Fl_Menu_Item *m )
{
if ( !m->shortcut_ )
@@ -135,6 +146,11 @@ static void setMenuShortcut( MenuHandle mh, int miCnt, const Fl_Menu_Item *m )
if ( !isalnum( key ) )
return;
+#ifdef __APPLE_COCOA__
+ void *menuItem = MACMenuOrItemOperation("itemAtIndex", mh, miCnt);
+ MACMenuOrItemOperation("setKeyEquivalent", menuItem, key );
+ MACMenuOrItemOperation("setKeyEquivalentModifierMask", menuItem, m->shortcut_ );
+#else
long macMod = kMenuNoCommandModifier;
if ( m->shortcut_ & FL_META ) macMod = kMenuNoModifiers;
if ( m->shortcut_ & FL_SHIFT || isupper(key) ) macMod |= kMenuShiftModifier;
@@ -144,8 +160,10 @@ static void setMenuShortcut( MenuHandle mh, int miCnt, const Fl_Menu_Item *m )
//SetMenuItemKeyGlyph( mh, miCnt, key );
SetItemCmd( mh, miCnt, toupper(key) );
SetMenuItemModifiers( mh, miCnt, macMod );
+#endif
}
+
#if 0
// this function needs to be verified before we compile it back in.
static void catMenuShortcut( const Fl_Menu_Item *m, char *dst )
@@ -166,16 +184,113 @@ static void catMenuShortcut( const Fl_Menu_Item *m, char *dst )
}
#endif
+
static void setMenuFlags( MenuHandle mh, int miCnt, const Fl_Menu_Item *m )
{
if ( m->flags & FL_MENU_TOGGLE )
{
- SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x12 : 0 );
+#ifdef __APPLE_COCOA__
+ void *menuItem = MACMenuOrItemOperation("itemAtIndex", mh, miCnt);
+ MACMenuOrItemOperation("setState", menuItem, m->flags & FL_MENU_VALUE );
+#else
+ SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x12 : 0 );
+#endif
+ }
+ else if ( m->flags & FL_MENU_RADIO ) {
+#ifndef __APPLE_COCOA__
+ SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x13 : 0 );
+#endif
}
- else if ( m->flags & FL_MENU_RADIO )
- SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x13 : 0 );
}
+
+#ifdef __APPLE_COCOA__
+
+/**
+ * create a sub menu for a specific menu handle
+ */
+static void createSubMenu( void * mh, pFl_Menu_Item &mm )
+{
+ void *submenu;
+ int miCnt, flags;
+
+ void *menuItem;
+ submenu = MACMenuOrItemOperation("initWithTitle", mm->text);
+ int cnt;
+ MACMenuOrItemOperation("numberOfItems", mh, &cnt);
+ cnt--;
+ menuItem = MACMenuOrItemOperation("itemAtIndex", mh, cnt);
+ MACMenuOrItemOperation("setSubmenu", menuItem, submenu);
+ if ( mm->flags & FL_MENU_INACTIVE ) {
+ MACMenuOrItemOperation("setEnabled", menuItem, 0);
+ }
+ mm++;
+
+ while ( mm->text )
+ {
+ MACMenuOrItemOperation("addNewItem", submenu, mm->text, mm->callback_, mm->user_data_, &miCnt);
+ setMenuFlags( submenu, miCnt, mm );
+ setMenuShortcut( submenu, miCnt, mm );
+ if ( mm->flags & FL_MENU_INACTIVE ) {
+ void *item = MACMenuOrItemOperation("itemAtIndex", submenu, miCnt);
+ MACMenuOrItemOperation("setEnabled", item, 0);
+ }
+ flags = mm->flags;
+ if ( mm->flags & FL_SUBMENU )
+ {
+ createSubMenu( submenu, mm );
+ }
+ else if ( mm->flags & FL_SUBMENU_POINTER )
+ {
+ const Fl_Menu_Item *smm = (Fl_Menu_Item*)mm->user_data_;
+ createSubMenu( submenu, smm );
+ }
+ if ( flags & FL_MENU_DIVIDER ) {
+ MACMenuOrItemOperation("addSeparatorItem", submenu);
+ }
+ mm++;
+ }
+}
+
+
+/**
+ * create a system menu bar using the given list of menu structs
+ *
+ * \author Matthias Melcher
+ *
+ * @param m list of Fl_Menu_Item
+ */
+extern void *MACmainMenu(void);
+void Fl_Sys_Menu_Bar::menu(const Fl_Menu_Item *m)
+{
+ fl_open_display();
+ Fl_Menu_Bar::menu( m );
+ fl_sys_menu_bar = this;
+
+
+ const Fl_Menu_Item *mm = m;
+ for (;;)
+ {
+ if ( !mm || !mm->text )
+ break;
+ char visible = mm->visible() ? 1 : 0;
+ MACMenuOrItemOperation("addNewItem", MACmainMenu(), mm->text, NULL, NULL, NULL);
+
+ if ( mm->flags & FL_SUBMENU )
+ createSubMenu( MACmainMenu(), mm );
+ else if ( mm->flags & FL_SUBMENU_POINTER ) {
+ const Fl_Menu_Item *smm = (Fl_Menu_Item*)mm->user_data_;
+ createSubMenu( MACmainMenu(), smm );
+ }
+ if ( visible ) {
+// InsertMenu( mh, 0 );
+ }
+ mm++;
+ }
+}
+
+#else
+
static void catMenuFlags( const Fl_Menu_Item *m, char *dst )
{
if ( !m->flags )
@@ -184,6 +299,7 @@ static void catMenuFlags( const Fl_Menu_Item *m, char *dst )
strcat( dst, "(" );
}
+
/**
* create a sub menu for a specific menu handle
*/
@@ -229,7 +345,7 @@ static void createSubMenu( MenuHandle mh, int &cnt, pFl_Menu_Item &mm )
}
InsertMenu( mh, -1 );
}
-
+
/**
* create a system menu bar using the given list of menu structs
@@ -243,9 +359,9 @@ void Fl_Sys_Menu_Bar::menu(const Fl_Menu_Item *m)
fl_open_display();
Fl_Menu_Bar::menu( m );
fl_sys_menu_bar = this;
-
+
char buf[255];
-
+
int cnt = 1; // first menu is no 2. no 1 is the Apple Menu
const Fl_Menu_Item *mm = m;
for (;;)
@@ -276,6 +392,8 @@ void Fl_Sys_Menu_Bar::menu(const Fl_Menu_Item *m)
DrawMenuBar();
}
+#endif //__APPLE_COCOA__
+
/*
const Fl_Menu_Item* Fl_Sys_Menu_Bar::picked(const Fl_Menu_Item* v) {
Fl_menu_Item *ret = Fl_Menu_Bar::picked( v );
@@ -290,42 +408,31 @@ const Fl_Menu_Item* Fl_Sys_Menu_Bar::picked(const Fl_Menu_Item* v) {
*/
void Fl_Sys_Menu_Bar::draw() {
-/* -- nothing to do, system should take care of this
- draw_box();
- if (!menu() || !menu()->text) return;
- const Fl_Menu_Item* m;
- int X = x()+6;
- for (m=menu(); m->text; m = m->next()) {
- int W = m->measure(0,this) + 16;
- m->draw(X, y(), W, h(), this);
- X += W;
- }
- */
}
/*
-int Fl_Menu_Bar::handle(int event) {
- const Fl_Menu_Item* v;
- if (menu() && menu()->text) switch (event) {
- case FL_ENTER:
- case FL_LEAVE:
- return 1;
- case FL_PUSH:
- v = 0;
- J1:
- v = menu()->pulldown(x(), y(), w(), h(), v, this, 0, 1);
- picked(v);
- return 1;
- case FL_SHORTCUT:
- if (visible_r()) {
- v = menu()->find_shortcut();
- if (v && v->submenu()) goto J1;
- }
- return test_shortcut() != 0;
- }
- return 0;
-}
-*/
+ int Fl_Menu_Bar::handle(int event) {
+ const Fl_Menu_Item* v;
+ if (menu() && menu()->text) switch (event) {
+ case FL_ENTER:
+ case FL_LEAVE:
+ return 1;
+ case FL_PUSH:
+ v = 0;
+ J1:
+ v = menu()->pulldown(x(), y(), w(), h(), v, this, 0, 1);
+ picked(v);
+ return 1;
+ case FL_SHORTCUT:
+ if (visible_r()) {
+ v = menu()->find_shortcut();
+ if (v && v->submenu()) goto J1;
+ }
+ return test_shortcut() != 0;
+ }
+ return 0;
+ }
+ */
#endif /* __APPLE__ */