Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I had the same need in early versions of HoudahSpot 2. I did get it working with one limitation: my code leaves the menu with square corners at the bottom.</p> <p>I have since abandonned this setup, as the BlitzSearch feature in HoudahSpot grew to need a complexer UI, I ran into other limitations with using NSViews in a NSMenu.</p> <p>Anyway, here is the original code taking care of those extra 3 pixels:</p> <pre><code>- (void)awakeFromNib { HIViewRef contentView; MenuRef menuRef = [statusMenu carbonMenuRef]; HIMenuGetContentView (menuRef, kThemeMenuTypePullDown, &amp;contentView); EventTypeSpec hsEventSpec[1] = { { kEventClassMenu, kEventMenuCreateFrameView } }; HIViewInstallEventHandler(contentView, NewEventHandlerUPP((EventHandlerProcPtr)hsMenuCreationEventHandler), GetEventTypeCount(hsEventSpec), hsEventSpec, NULL, NULL); } #pragma mark - #pragma mark Carbon handlers static OSStatus hsMenuContentEventHandler( EventHandlerCallRef caller, EventRef event, void* refcon ) { OSStatus err; check( GetEventClass( event ) == kEventClassControl ); check( GetEventKind( event ) == kEventControlGetFrameMetrics ); err = CallNextEventHandler( caller, event ); if ( err == noErr ) { HIViewFrameMetrics metrics; verify_noerr( GetEventParameter( event, kEventParamControlFrameMetrics, typeControlFrameMetrics, NULL, sizeof( metrics ), NULL, &amp;metrics ) ); metrics.top = 0; verify_noerr( SetEventParameter( event, kEventParamControlFrameMetrics, typeControlFrameMetrics, sizeof( metrics ), &amp;metrics ) ); } return err; } static OSStatus hsMenuCreationEventHandler( EventHandlerCallRef caller, EventRef event, void* refcon ) { OSStatus err = eventNotHandledErr; if ( GetEventKind( event ) == kEventMenuCreateFrameView) { err = CallNextEventHandler( caller, event ); if ( err == noErr ) { static const EventTypeSpec kContentEvents[] = { { kEventClassControl, kEventControlGetFrameMetrics } }; HIViewRef frame; HIViewRef content; verify_noerr( GetEventParameter( event, kEventParamMenuFrameView, typeControlRef, NULL, sizeof( frame ), NULL, &amp;frame ) ); verify_noerr( HIViewFindByID( frame, kHIViewWindowContentID, &amp;content ) ); HIViewInstallEventHandler( content, hsMenuContentEventHandler, GetEventTypeCount( kContentEvents ), kContentEvents, 0, NULL ); } } return err; } </code></pre> <p>Sorry, I forgot that bit:</p> <pre><code>- (MenuRef) carbonMenuRef { MenuRef carbonMenuRef = NULL; if (carbonMenuRef == NULL) { extern MenuRef _NSGetCarbonMenu(NSMenu *); carbonMenuRef = _NSGetCarbonMenu(self); if (carbonMenuRef == NULL) { NSMenu *theMainMenu = [NSApp mainMenu]; NSMenuItem *theDummyMenuItem = [theMainMenu addItemWithTitle: @"sub" action: NULL keyEquivalent: @""]; if (theDummyMenuItem != nil) { [theDummyMenuItem setSubmenu:self]; [theDummyMenuItem setSubmenu:nil]; [theMainMenu removeItem:theDummyMenuItem]; carbonMenuRef = _NSGetCarbonMenu(self); } } } if (carbonMenuRef == NULL) { extern MenuRef _NSGetCarbonMenu2(NSMenu *); carbonMenuRef = _NSGetCarbonMenu2(self); } return carbonMenuRef; } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload