diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2010-03-29 10:35:00 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2010-03-29 10:35:00 +0000 |
| commit | 941901e273319ce152523af7fa079a6f5cf89d68 (patch) | |
| tree | 9d70b82fa54d81607a0022f14a0518c47805a796 /src/Fl_Sys_Menu_Bar.cxx | |
| parent | b77071a3de3593ea482aa7ea0a442c7fc888a2e2 (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.cxx | 262 |
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__ */ |
