summaryrefslogtreecommitdiff
path: root/src/Fl_Sys_Menu_Bar.cxx
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2012-01-11 16:16:31 +0000
committerManolo Gouy <Manolo>2012-01-11 16:16:31 +0000
commit4be97ea19c9a8a83e2831eedd1829da4ac381ba7 (patch)
treea52c2f3f9c2e75ce7eded54604dbeae2cb316cb9 /src/Fl_Sys_Menu_Bar.cxx
parentaa0e4bb823949946ad4153b8d7eecbff0662553d (diff)
Fixed the use of FL_SUBMENU_POINTER in Fl_Sys_Menu_Bar objects (Mac OS-specific).
Modified the menubar demo program to exercise the Fl_Sys_Menu_Bar class. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9218 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Sys_Menu_Bar.cxx')
-rw-r--r--src/Fl_Sys_Menu_Bar.cxx44
1 files changed, 24 insertions, 20 deletions
diff --git a/src/Fl_Sys_Menu_Bar.cxx b/src/Fl_Sys_Menu_Bar.cxx
index 3bff75e42..2ec0ec20c 100644
--- a/src/Fl_Sys_Menu_Bar.cxx
+++ b/src/Fl_Sys_Menu_Bar.cxx
@@ -100,46 +100,46 @@ static void setMenuFlags( MenuHandle mh, int miCnt, const Fl_Menu_Item *m )
/*
* create a sub menu for a specific menu handle
*/
-static void createSubMenu( void * mh, pFl_Menu_Item &mm )
+static void createSubMenu( void * mh, pFl_Menu_Item &mm, const Fl_Menu_Item *mitem)
{
void *submenu;
int miCnt, flags;
void *menuItem;
- submenu = Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::initWithTitle, mm->text);
+ submenu = Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::initWithTitle, mitem->text);
int cnt;
Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::numberOfItems, mh, &cnt);
cnt--;
menuItem = Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::itemAtIndex, mh, cnt);
Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::setSubmenu, menuItem, submenu);
- if ( mm->flags & FL_MENU_INACTIVE ) {
- Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::setEnabled, menuItem, 0);
- }
- mm++;
while ( mm->text )
{
- int flRank = mm - fl_sys_menu_bar->Fl_Menu_::menu();
- Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::addNewItem, submenu, flRank, &miCnt);
+ char visible = mm->visible() ? 1 : 0;
+ Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::addNewItem, submenu, mm, &miCnt);
setMenuFlags( submenu, miCnt, mm );
setMenuShortcut( submenu, miCnt, mm );
- if ( mm->flags & FL_MENU_INACTIVE ) {
+ if ( mm->flags & FL_MENU_INACTIVE || mitem->flags & FL_MENU_INACTIVE) {
void *item = Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::itemAtIndex, submenu, miCnt);
Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::setEnabled, item, 0);
}
flags = mm->flags;
if ( mm->flags & FL_SUBMENU )
{
- createSubMenu( submenu, mm );
+ mm++;
+ createSubMenu( submenu, mm, mm - 1 );
}
else if ( mm->flags & FL_SUBMENU_POINTER )
{
const Fl_Menu_Item *smm = (Fl_Menu_Item*)mm->user_data_;
- createSubMenu( submenu, smm );
+ createSubMenu( submenu, smm, mm );
}
if ( flags & FL_MENU_DIVIDER ) {
Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::addSeparatorItem, submenu);
}
+ if ( !visible ) {
+ Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::removeItem, submenu, miCnt);
+ }
mm++;
}
}
@@ -147,10 +147,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
+ * ALL PREVIOUS SYSTEM MENUS, EXCEPT THE APPLICATION MENU, ARE REPLACED BY THE NEW DATA
*/
static void convertToMenuBar(const Fl_Menu_Item *mm)
{
+ int rank;
int count;//first, delete all existing system menus
Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::numberOfItems, fl_system_menu, &count);
for(int i = count - 1; i > 0; i--) {
@@ -162,17 +163,18 @@ static void convertToMenuBar(const Fl_Menu_Item *mm)
if ( !mm || !mm->text )
break;
char visible = mm->visible() ? 1 : 0;
- int flRank = mm - fl_sys_menu_bar->Fl_Menu_::menu();
- Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::addNewItem, fl_system_menu, flRank, NULL);
-
- if ( mm->flags & FL_SUBMENU )
- createSubMenu( fl_system_menu, mm );
+ Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::addNewItem, fl_system_menu, mm, &rank);
+
+ if ( mm->flags & FL_SUBMENU ) {
+ mm++;
+ createSubMenu( fl_system_menu, mm, mm - 1);
+ }
else if ( mm->flags & FL_SUBMENU_POINTER ) {
const Fl_Menu_Item *smm = (Fl_Menu_Item*)mm->user_data_;
- createSubMenu( fl_system_menu, smm );
+ createSubMenu( fl_system_menu, smm, mm);
}
- if ( visible ) {
- // InsertMenu( mh, 0 );
+ if ( !visible ) {
+ Fl_Sys_Menu_Bar::doMenuOrItemOperation(Fl_Sys_Menu_Bar::removeItem, fl_system_menu, rank);
}
mm++;
}
@@ -271,6 +273,8 @@ void Fl_Sys_Menu_Bar::replace(int rank, const char *name)
void Fl_Sys_Menu_Bar::draw() {
}
+extern class Fl_Sys_Menu_Bar *fl_sys_menu_bar;
+
#endif /* __APPLE__ */