diff -ur ooo_SRC680_m177_src.orig/vcl/aqua/source/window/salframe.cxx ooo_SRC680_m177_src/vcl/aqua/source/window/salframe.cxx --- ooo_SRC680_m177_src.orig/vcl/aqua/source/window/salframe.cxx 2006-07-23 12:37:55.000000000 +0200 +++ ooo_SRC680_m177_src/vcl/aqua/source/window/salframe.cxx 2006-07-23 20:40:53.000000000 +0200 @@ -686,11 +686,12 @@ ImplSalYieldMutexAcquire(); AquaSalFrame* pSalFrame = reinterpret_cast(inUserData); + OSStatus result = eventNotHandledErr; HICommand commandStruct; GetEventParameter (inEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &commandStruct); - // If the CommandProcess event is from menu, print its MenuRef and itemidex + // If the CommandProcess event is from menu, print its MenuRef and MenuItemIndex if ( commandStruct.attributes & kHICommandFromMenu ) { fprintf(stderr, "PJ: CommandProcess, SALEVENT_MENUCOMMAND event!\n"); @@ -698,24 +699,33 @@ fprintf(stderr, "PJ: Menu item selected, MenuRef = %p, (%d. item)\n", commandStruct.menu.menuRef, commandStruct.menu.menuItemIndex); + // handling Quit from Application menu! + if (commandStruct.commandID == kHICommandQuit) + fprintf(stderr, "PJ: Quit from application menu received!\n"); + UInt32 pointer; GetMenuItemRefCon (commandStruct.menu.menuRef, commandStruct.menu.menuItemIndex, &pointer); - SalMenuItem *pSalMenuItem = (SalMenuItem *) pointer; - fprintf(stderr, "PJ: SalMenuItem = %p\n", pSalMenuItem); - fprintf(stderr, "PJ: nId = %p\n", ((AquaSalMenuItem *)pSalMenuItem)->nId); - - // Posting native menu event... - SalMenuEvent aMenuEvt; - aMenuEvt.mnId = ((AquaSalMenuItem *)pSalMenuItem)->nId; - aMenuEvt.mpMenu = ((AquaSalMenuItem *)pSalMenuItem)->myMenu; - pSalFrame->CallCallback(SALEVENT_MENUCOMMAND, &aMenuEvt); + + if (pointer) { + SalMenuItem *pSalMenuItem = (SalMenuItem *) pointer; + fprintf(stderr, "PJ: SalMenuItem = %p\n", pSalMenuItem); + fprintf(stderr, "PJ: nId = %p\n", ((AquaSalMenuItem *)pSalMenuItem)->nId); + + // Posting native menu event... + SalMenuEvent aMenuEvt; + aMenuEvt.mnId = ((AquaSalMenuItem *)pSalMenuItem)->nId; + aMenuEvt.mpMenu = ((AquaSalMenuItem *)pSalMenuItem)->myMenu; + pSalFrame->CallCallback(SALEVENT_MENUCOMMAND, &aMenuEvt); + + result = noErr; + } } ImplSalYieldMutexRelease(); - return noErr; + return result; } OSStatus HandleMenuPopulateEvent(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void * inUserData) @@ -781,6 +791,7 @@ ImplSalYieldMutexAcquire(); AquaSalFrame* pSalFrame = reinterpret_cast(inUserData); + OSStatus result = eventNotHandledErr; fprintf(stderr, "PJ: MenuTargetItem, SALEVENT_MENUHIGHLIGHT event!\n"); @@ -798,20 +809,27 @@ UInt32 pointer; GetMenuItemRefCon (pMenuRef, myMenuItemIndex, &pointer); - SalMenuItem *pSalMenuItem = (SalMenuItem *) pointer; - fprintf(stderr, "PJ: SalMenuItem = %p\n", pSalMenuItem); - fprintf(stderr, "PJ: nId = %p\n", ((AquaSalMenuItem *)pSalMenuItem)->nId); - - // Posting native menu event... - SalMenuEvent aMenuEvt; - aMenuEvt.mnId = ((AquaSalMenuItem *)pSalMenuItem)->nId; - aMenuEvt.mpMenu = ((AquaSalMenuItem *)pSalMenuItem)->myMenu; - pSalFrame->CallCallback(SALEVENT_MENUHIGHLIGHT, &aMenuEvt); + // We also receive kEventMenuTargetItem events for + // non-application menus (Apple menu or Application menu). But + // they do not have SalMenuItem attached with them. + if (pointer) { + SalMenuItem *pSalMenuItem = (SalMenuItem *) pointer; + fprintf(stderr, "PJ: SalMenuItem = %p\n", pSalMenuItem); + fprintf(stderr, "PJ: nId = %p\n", ((AquaSalMenuItem *)pSalMenuItem)->nId); + + // Posting native menu event... + SalMenuEvent aMenuEvt; + aMenuEvt.mnId = ((AquaSalMenuItem *)pSalMenuItem)->nId; + aMenuEvt.mpMenu = ((AquaSalMenuItem *)pSalMenuItem)->myMenu; + pSalFrame->CallCallback(SALEVENT_MENUHIGHLIGHT, &aMenuEvt); + + result = noErr; + } } ImplSalYieldMutexRelease(); - return noErr; + return result; } OSStatus HandleWindowCloseEvent(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void * inUserData)