summaryrefslogtreecommitdiff
path: root/src/Fl_Sys_Menu_Bar.cxx
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2010-03-29 10:35:00 +0000
committerMatthias Melcher <fltk@matthiasm.com>2010-03-29 10:35:00 +0000
commit941901e273319ce152523af7fa079a6f5cf89d68 (patch)
tree9d70b82fa54d81607a0022f14a0518c47805a796 /src/Fl_Sys_Menu_Bar.cxx
parentb77071a3de3593ea482aa7ea0a442c7fc888a2e2 (diff)
OS X: removed all Carbon and Quickdraw references. Starting with 1.3, we only support Cocoa and Quartz.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7351 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Sys_Menu_Bar.cxx')
-rw-r--r--src/Fl_Sys_Menu_Bar.cxx262
1 files changed, 15 insertions, 247 deletions
diff --git a/src/Fl_Sys_Menu_Bar.cxx b/src/Fl_Sys_Menu_Bar.cxx
index 515f724eb..88d92ae06 100644
--- a/src/Fl_Sys_Menu_Bar.cxx
+++ b/src/Fl_Sys_Menu_Bar.cxx
@@ -3,7 +3,7 @@
//
// MacOS system menu bar widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2009 by Bill Spitzak and others.
+// Copyright 1998-2010 by Bill Spitzak and others.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
@@ -63,76 +63,14 @@
#include <ctype.h>
#include <stdarg.h>
-#ifdef __APPLE_COCOA__
#define MenuHandle void *
-#endif
typedef const Fl_Menu_Item *pFl_Menu_Item;
+
/*
- * copy the text of a menuitem into a buffer.
- * Skip all '&' which would mark the shortcut in FLTK
- * Skip all Mac control characters ('(', '<', ';', '^', '!' )
- */
-
-#ifndef __APPLE_COCOA__
- static void catMenuText( const char *src, char *dst )
-{
- char c;
- while ( *dst )
- dst++;
- if ( *src == '-' )
- src++;
- while ( ( c = *src++ ) )
- {
- if ( !strchr( "&(<;^!", c ) )
- *dst++ = c;
- }
- *dst = 0;
-}
-
-/*
- * append a marker to identify the menu font style
- * <B, I, U, O, and S
+ * Set a shortct for an Apple manu item using the FLTK shortcut descriptor.
*/
-
-static void catMenuFont( const Fl_Menu_Item *m, char *dst )
-{
- if ( !m->labeltype_ && !m->labelfont_ )
- return;
- while ( *dst )
- dst++;
-
- if ( m->labelfont_ & FL_BOLD )
- strcat( dst, "<B" );
- if ( m->labelfont_ & FL_ITALIC )
- strcat( dst, "<I" );
- //if ( m->labelfont_ & FL_UNDERLINE )
- // strcat( dst, "<U" );
-
- if ( m->labeltype_ == FL_EMBOSSED_LABEL )
- strcat( dst, "<U" );
- else if ( m->labeltype_ == FL_ENGRAVED_LABEL )
- strcat( dst, "<O" );
- else if ( m->labeltype_ == FL_SHADOW_LABEL )
- 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
-enum {
- kMenuNoModifiers = 0,
- kMenuShiftModifier = (1 << 0),
- kMenuOptionModifier = (1 << 1),
- kMenuControlModifier = (1 << 2),
- kMenuNoCommandModifier = (1 << 3)
-};
-*/
-#endif
-
static void setMenuShortcut( MenuHandle mh, int miCnt, const Fl_Menu_Item *m )
{
if ( !m->shortcut_ )
@@ -145,69 +83,29 @@ static void setMenuShortcut( MenuHandle mh, int miCnt, const Fl_Menu_Item *m )
if ( !isalnum( key ) )
return;
-#ifdef __APPLE_COCOA__
void *menuItem = Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::itemAtIndex, mh, miCnt);
Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::setKeyEquivalent, menuItem, m->shortcut_ & 0xff );
Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::setKeyEquivalentModifierMask, menuItem, m->shortcut_ );
-#else
- long macMod = kMenuNoCommandModifier;
- if ( m->shortcut_ & FL_META ) macMod = kMenuNoModifiers;
- if ( m->shortcut_ & FL_SHIFT || isupper(key) ) macMod |= kMenuShiftModifier;
- if ( m->shortcut_ & FL_ALT ) macMod |= kMenuOptionModifier;
- if ( m->shortcut_ & FL_CTRL ) macMod |= kMenuControlModifier;
-
- //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 )
-{
- if ( !m->shortcut_ )
- return;
- char c = m->shortcut_ & 0xff;
- if ( !isalnum( c & 0xff ) )
- return;
- while ( *dst )
- dst++;
- if ( m->shortcut_ & FL_CTRL )
- {
- sprintf( dst, "/%c", toupper( c ) );
- }
- //if ( isalnum( mm->shortcut_ ) && !( mm->flags & FL_SUBMENU ) )
- //sprintf( buf+strlen(buf), "/%c", mm->shortcut_ );
}
-#endif
+/*
+ * Set the Toggle and Radio flag based on FLTK flags
+ */
static void setMenuFlags( MenuHandle mh, int miCnt, const Fl_Menu_Item *m )
{
if ( m->flags & FL_MENU_TOGGLE )
{
-#ifdef __APPLE_COCOA__
void *menuItem = Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::itemAtIndex, mh, miCnt);
Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::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 ) {
-#ifdef __APPLE_COCOA__
void *menuItem = Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::itemAtIndex, mh, miCnt);
Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::setState, menuItem, m->flags & FL_MENU_VALUE );
-#else
- SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x13 : 0 );
-#endif
}
}
-#if defined(__APPLE_COCOA__) || defined(FL_DOXYGEN)
-
/*
* create a sub menu for a specific menu handle
*/
@@ -256,9 +154,11 @@ static void createSubMenu( void * mh, pFl_Menu_Item &mm )
}
+/*
+ * convert a complete Fl_Menu_Item array into a series of menus in the top menu bar
+ * ALL PREVIOUS SYSTEM MENUS, EXCEPT APPLICATION MENU, ARE REPLACED BY THE NEW DATA
+ */
static void convertToMenuBar(const Fl_Menu_Item *mm)
-//convert a complete Fl_Menu_Item array into a series of menus in the top menu bar
-//ALL PREVIOUS SYSTEM MENUS, EXCEPT APPLICATION MENU, ARE REPLACED BY THE NEW DATA
{
int count;//first, delete all existing system menus
Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::numberOfItems, fl_system_menu, &count);
@@ -287,6 +187,7 @@ static void convertToMenuBar(const Fl_Menu_Item *mm)
}
}
+
/**
* @brief create a system menu bar using the given list of menu structs
*
@@ -301,6 +202,7 @@ void Fl_Sys_Menu_Bar::menu(const Fl_Menu_Item *m)
convertToMenuBar(m);
}
+
/**
* @brief add to the system menu bar a new menu item
*
@@ -317,6 +219,7 @@ int Fl_Sys_Menu_Bar::add(const char* label, int shortcut, Fl_Callback *cb, void
return rank;
}
+
/**
* @brief remove an item from the system menu bar
*
@@ -341,149 +244,14 @@ void Fl_Sys_Menu_Bar::replace(int rank, const char *name)
fl_sys_menu_bar->Fl_Menu_::replace(rank, name);
}
-#else
-
-static void catMenuFlags( const Fl_Menu_Item *m, char *dst )
-{
- if ( !m->flags )
- return;
- if ( m->flags & FL_MENU_INACTIVE )
- strcat( dst, "(" );
-}
-
- /*
- * create a sub menu for a specific menu handle
- */
-static void createSubMenu( MenuHandle mh, int &cnt, pFl_Menu_Item &mm )
-{
- char buf[255];
- int miCnt = 1;
- while ( mm->text )
- {
- MenuHandle smh = 0;
- buf[1] = 0;
- catMenuFont( mm, buf+1 );
- //catMenuShortcut( mm, buf+1 );
- catMenuText( mm->text, buf+1 );
- catMenuFlags( mm, buf+1 );
- if ( mm->flags & (FL_SUBMENU | FL_SUBMENU_POINTER) )
- {
- cnt++;
- smh = NewMenu( cnt, (unsigned char*)"\001 " );
- sprintf( buf+1+strlen(buf+1), "/\033!%c", cnt );
- }
- if ( mm->flags & FL_MENU_DIVIDER )
- strcat( buf+1, ";-" );
- buf[0] = strlen( buf+1 );
- AppendMenu( mh, (unsigned char*)buf );
- // insert Appearanc manager functions here!
- setMenuFlags( mh, miCnt, mm );
- setMenuShortcut( mh, miCnt, mm );
- SetMenuItemRefCon( mh, miCnt, (UInt32)mm );
- miCnt++;
- if ( mm->flags & FL_MENU_DIVIDER )
- miCnt++;
- if ( mm->flags & FL_SUBMENU )
- {
- createSubMenu( smh, cnt, ++mm );
- }
- else if ( mm->flags & FL_SUBMENU_POINTER )
- {
- const Fl_Menu_Item *smm = (Fl_Menu_Item*)mm->user_data_;
- createSubMenu( mh, cnt, smm );
- }
- mm++;
- }
- InsertMenu( mh, -1 );
-}
-
/*
- * create a system menu bar using the given list of menu structs
- *
- * \author Matthias Melcher
- *
- * @param m list of Fl_Menu_Item
+ * Draw the menu bar.
+ * Nothing here because the OS does this for us.
*/
-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 (;;)
- {
- if ( !mm || !mm->text )
- break;
- char visible = mm->visible() ? 1 : 0;
- buf[1] = 0;
- catMenuText( mm->text, buf+1 );
- buf[0] = strlen( buf+1 );
- MenuHandle mh = NewMenu( ++cnt, (unsigned char*)buf );
- if ( mm->flags & FL_MENU_INACTIVE ) {
- ChangeMenuAttributes(mh, kMenuAttrAutoDisable, 0);
- DisableAllMenuItems(mh);
- DisableMenuItem(mh, 0);
- }
- if ( mm->flags & FL_SUBMENU )
- createSubMenu( mh, cnt, ++mm );
- else if ( mm->flags & FL_SUBMENU_POINTER ) {
- const Fl_Menu_Item *smm = (Fl_Menu_Item*)mm->user_data_;
- createSubMenu( mh, cnt, smm );
- }
- if ( visible ) {
- InsertMenu( mh, 0 );
- }
- mm++;
- }
- 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 );
-
- if ( m->flags & FL_MENU_TOGGLE )
- {
- SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x12 : 0 );
- }
-
- return ret;
-}
-*/
-
void Fl_Sys_Menu_Bar::draw() {
}
-/*
- 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__ */