factoring common code, applying patch 1825183

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@49618 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2007-11-04 10:32:30 +00:00
parent 8a4529c6a6
commit 639db60ccb

View File

@@ -140,33 +140,25 @@ pascal OSStatus wxDockEventHandler( EventHandlerCallRef inHandlerCallRef,
const UInt32 eventClass = GetEventClass(inEvent); const UInt32 eventClass = GetEventClass(inEvent);
const UInt32 eventKind = GetEventKind(inEvent); const UInt32 eventKind = GetEventKind(inEvent);
OSStatus err = eventNotHandledErr;
// Handle wxTaskBar menu events (note that this is a global event handler // Handle wxTaskBar menu events (note that this is a global event handler
// so it will actually get called by all commands/menus) // so it will actually get called by all commands/menus)
if ((eventClass == kEventClassCommand) && (eventKind == kEventCommandProcess)) if ((eventClass == kEventClassCommand) && (eventKind == kEventCommandProcess || eventKind == kEventCommandUpdateStatus ))
{ {
// if we have no taskbar menu quickly pass it back to wxApp // if we have no taskbar menu quickly pass it back to wxApp
if (pTB->m_pMenu == NULL) if (pTB->m_pMenu != NULL)
return eventNotHandledErr; {
// This is the real reason why we need this. Normally menus // This is the real reason why we need this. Normally menus
// get handled in wxMacAppEventHandler // get handled in wxMacAppEventHandler
//
// pascal OSStatus wxMacAppEventHandler(EventHandlerCallRef handler,
// EventRef event, void *data)
//
// However, in the case of a taskbar menu call // However, in the case of a taskbar menu call
// command.menu.menuRef IS NULL! // command.menu.menuRef IS NULL!
// Which causes the wxApp handler just to skip it. // Which causes the wxApp handler just to skip it.
MenuRef taskbarMenuRef = MAC_WXHMENU(pTB->m_pMenu->GetHMenu());
OSStatus err;
// get the HICommand from the event // get the HICommand from the event
HICommand command; HICommand command;
err = GetEventParameter( if (GetEventParameter(inEvent, kEventParamDirectObject,
inEvent, kEventParamDirectObject, typeHICommand, NULL,sizeof(HICommand), NULL, &command ) == noErr)
typeHICommand, NULL,
sizeof(HICommand), NULL, &command );
if (err == noErr)
{ {
// Obtain the REAL menuRef and the menuItemIndex in the real menuRef // Obtain the REAL menuRef and the menuItemIndex in the real menuRef
// //
@@ -175,44 +167,33 @@ pascal OSStatus wxDockEventHandler( EventHandlerCallRef inHandlerCallRef,
// just the top level wxTaskBar menu // just the top level wxTaskBar menu
MenuItemIndex menuItemIndex; MenuItemIndex menuItemIndex;
MenuRef menuRef; MenuRef menuRef;
MenuRef taskbarMenuRef = MAC_WXHMENU(pTB->m_pMenu->GetHMenu());
err = GetIndMenuItemWithCommandID( // the next command is only successful if it was a command from the taskbar menu
taskbarMenuRef, // otherwise we pass it on
command.commandID, if (GetIndMenuItemWithCommandID(taskbarMenuRef,command.commandID,
1, &menuRef, &menuItemIndex ); 1, &menuRef, &menuItemIndex ) == noErr)
if (err == noErr)
{ {
MenuCommand id = command.commandID; wxMenu* itemMenu = wxFindMenuFromMacMenu( menuRef ) ;
int id = wxMacCommandToId( command.commandID ) ;
wxMenuItem *item = NULL; wxMenuItem *item = NULL;
if (id != 0) // get the wxMenuItem reference from the MenuRef if (id != 0) // get the wxMenuItem reference from the MenuRef
GetMenuItemRefCon( menuRef, menuItemIndex, (URefCon*) &item ); GetMenuItemRefCon( menuRef, menuItemIndex, (URefCon*) &item );
if (item) if (item && itemMenu )
{ {
// Handle items that are checkable if ( eventKind == kEventCommandProcess )
// FIXME: Doesn't work (at least on 10.2)! err = itemMenu->MacHandleCommandProcess( item, id );
if (item->IsCheckable()) else if ( eventKind == kEventCommandUpdateStatus )
item->Check( !item->IsChecked() ); err = itemMenu->MacHandleCommandUpdateStatus( item, id );
}
// send the wxEvent to the wxMenu
item->GetMenu()->SendEvent( id, item->IsCheckable() ? item->IsChecked() : -1 );
// successfully handled the event
err = noErr;
} }
} }
} //end if noErr on getting HICommand from event } //end if noErr on getting HICommand from event
// return whether we handled the event or not
return err;
} }
else if ((eventClass == kEventClassApplication) && (eventKind == kEventAppGetDockTileMenu ))
// We better have a kEventClassApplication/kEventAppGetDockTileMenu combo here, {
// otherwise something is truly funky
wxASSERT(eventClass == kEventClassApplication &&
eventKind == kEventAppGetDockTileMenu);
// process the right click events // process the right click events
// NB: This may result in double or even triple-creation of the menus // NB: This may result in double or even triple-creation of the menus
// We need to do this for 2.4 compat, however // We need to do this for 2.4 compat, however
@@ -225,8 +206,6 @@ pascal OSStatus wxDockEventHandler( EventHandlerCallRef inHandlerCallRef,
// create popup menu // create popup menu
wxMenu* menu = pTB->DoCreatePopupMenu(); wxMenu* menu = pTB->DoCreatePopupMenu();
OSStatus err = eventNotHandledErr;
if (menu != NULL) if (menu != NULL)
{ {
// note to self - a MenuRef *is* a MenuHandle // note to self - a MenuRef *is* a MenuHandle
@@ -243,6 +222,7 @@ pascal OSStatus wxDockEventHandler( EventHandlerCallRef inHandlerCallRef,
typeMenuRef, sizeof(MenuRef), &hMenu ); typeMenuRef, sizeof(MenuRef), &hMenu );
verify_noerr( err ); verify_noerr( err );
} }
}
return err; return err;
} }
@@ -317,6 +297,7 @@ wxDockTaskBarIcon::wxDockTaskBarIcon(wxTaskBarIcon* parent)
EventTypeSpec tbEventList[] = EventTypeSpec tbEventList[] =
{ {
{ kEventClassCommand, kEventProcessCommand }, { kEventClassCommand, kEventProcessCommand },
{ kEventClassCommand, kEventCommandUpdateStatus },
{ kEventClassApplication, kEventAppGetDockTileMenu } { kEventClassApplication, kEventAppGetDockTileMenu }
}; };