• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Carbon overlay window in place of a cocoa view
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Carbon overlay window in place of a cocoa view


  • Subject: Carbon overlay window in place of a cocoa view
  • From: Kevin Meaney <email@hidden>
  • Date: Fri, 11 Feb 2011 15:46:17 +0000

Hi,

I've taken the Audio Unit (AU) code for carbon overlay windows over a cocoa view and modified it for my purposes as a proof of concept test. I needed to make some changes to improve the AU code in my case (the left edge of the cocoa view can move because it is on the right side of a split view).

I have managed to remove the problems associated with the code except for one which is some tearing during redrawing in the carbon window when the cocoa window is being grown vertically and horizontally rapidly. Does anyone have some ideas as to how to remove the tearing.

I've included the relevant bits of the proof of concept code below which is part of a class overriding a NSView.
There is one odd thing about the code, and that is I load a carbon window with the defined views from a nib file, I then create the overlay window, insert the views into the created overlay window, then dispose of the nib window, and then add the overlay window into the cocoa window group.


Thanks
Kevin

// -----------------------------------------------------------------------------
// fitCarbonWindowToCocoaView
// -----------------------------------------------------------------------------


- (void)fitCarbonWindowToCocoaView
{
NSRect cocoaViewFrame = [self frame];
HIRect windowRect, cocoaWindowRect;
// windowRect.size.width = cocoaViewFrame.size.width+0.5;
// windowRect.size.height = cocoaViewFrame.size.height+0.5;
windowRect.size.width = cocoaViewFrame.size.width;
windowRect.size.height = cocoaViewFrame.size.height;
NSPoint position = [[[self window] contentView] convertPoint:[self frame].origin
fromView:self];
HIWindowGetBounds((WindowRef)[[self window] windowRef], kWindowContentRgn,
kHICoordSpaceScreenPixel, &cocoaWindowRect);
windowRect.origin.x = cocoaWindowRect.origin.x + position.x / 2;
windowRect.origin.y = (cocoaWindowRect.origin.y + cocoaWindowRect.size.height)
- (position.y + cocoaViewFrame.size.height);
HIWindowSetBounds(carbonWindow, kWindowContentRgn, kHICoordSpaceScreenPixel,
&windowRect);
}


// -----------------------------------------------------------------------------
// setFrame
// -----------------------------------------------------------------------------


- (void)setFrame:(NSRect)theFrame
{
	[super setFrame:theFrame];
	[self fitCarbonWindowToCocoaView];
}

// -----------------------------------------------------------------------------
// createCarbonOverlayWindow
// -----------------------------------------------------------------------------


- (void)createCarbonOverlayWindow
{
HIViewRef carbonWindowRootControl;
HIViewRef tmpWindowRootControl;
HIViewRef viewToSwitchWindow;
OSStatus result1, result2;
WindowRef tempWindow = MyCreateWindow();
Rect bounds = {0,0,373,480};

if (!tempWindow)
{
NSLog(@"createCarbonOverlayWindow: Could not load carbon window from nib.");
return;
}
HideWindow(tempWindow);
result1 = CreateNewWindow(kOverlayWindowClass,
kWindowStandardHandlerAttribute | kWindowCompositingAttribute |
kWindowOpaqueForEventsAttribute, &bounds, &carbonWindow);

SetThemeWindowBackground(carbonWindow, kThemeTextColorWhite, YES);
SetWindowActivationScope(carbonWindow, kWindowActivationScopeIndependent);
if (result1)
{
NSLog(@"createCarbonOverlayWindow: window creation failed result1= %d, result2=%d", result1, result2);
return;
}
result1 = GetRootControl(carbonWindow, &carbonWindowRootControl);
result2 = GetRootControl(tempWindow, &tmpWindowRootControl);
if (result1 || result2)
NSLog(@"createCarbonOverlayWindow: Error getting root control result1=%d, result2=%d", result1, result2);
viewToSwitchWindow = HIViewGetFirstSubview(tmpWindowRootControl);
if (!viewToSwitchWindow)
{
NSLog(@"Failure to get subview");
return;
}
result1 = HIViewAddSubview(carbonWindowRootControl, viewToSwitchWindow);
if (result1)
{
NSLog(@"createCarbonOverlayWindow: failed to add the hiview");
return;
}
// PrintToConsoleCarbonHIViewTree(carbonWindowRootControl, 0);
[self fitCarbonWindowToCocoaView];
NSWindow *cocoaWindow = [self window];
WindowRef cocoaWindowRef = (WindowRef)[cocoaWindow windowRef];
NSWindow *mixedWindow = [[NSWindow alloc] initWithWindowRef:carbonWindow];

WindowGroupRef group;

CreateWindowGroup(0, &group);
SetWindowGroupParent(group, GetWindowGroup(cocoaWindowRef));
ChangeWindowGroupAttributes(group, kWindowGroupAttrLayerTogether |
kWindowGroupAttrSharedActivation |
kWindowGroupAttrHideOnCollapse, 0);
SetWindowGroup(cocoaWindowRef, group);
SetWindowGroup(carbonWindow, group);
[cocoaWindow addChildWindow:mixedWindow ordered:NSWindowAbove];
DisposeWindow(tempWindow);
ShowWindow(carbonWindow);
}




_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Prev by Date: Re: Need help sorting with NSSortDescriptor and/or/NSPredicate (Core Data)
  • Next by Date: Re: Get ProcessSerialNumber of last front application
  • Previous by thread: NSTreeNode mutableChildNodes documented as observable using key-value observing
  • Next by thread: Re: [ANN] Cong 0.7
  • Index(es):
    • Date
    • Thread