Hi,

After spending the whole day around Carbon and HIToolbox I’m now sure that the 
WindowRef provided is a for a Carbon window. However I’m not been able to add a 
single colored NSView to the windows provided by the host. This what I have 
been trying to do. Is there anyone with experience in Carbon here? Can you see 
something terribly wrong? The window appears completely white, always!

WindowRef w= (WindowRef) ptr;

NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
[view setWantsLayer:YES];
view.layer.backgroundColor = [[NSColor yellowColor] CGColor];
NSLog(@"view frame - %f %f %f %f", view.frame.origin.x, view.frame.origin.y, 
view.frame.size.width, view.frame.size.height);

HIViewRef content;
HIViewFindByID(HIViewGetRoot(w), kHIViewWindowContentID, &content);

HIRect frame;
HIViewGetFrame(content, &frame);
NSLog(@"content frame - %f %f %f %f", frame.origin.x, frame.origin.y, 
frame.size.width, frame.size.height);

HIViewRef hiCocoaView;
HICocoaViewCreate(view, 0, &hiCocoaView);
frame.origin.x=0;
frame.origin.y=0;
frame.size.width=640;
frame.size.height=480;
HIViewSetFrame(hiCocoaView, &frame);
HIViewGetFrame(hiCocoaView, &frame);
NSLog(@"cocoa view frame - %f %f %f %f", frame.origin.x, frame.origin.y, 
frame.size.width, frame.size.height);

HICocoaViewSetView(hiCocoaView, view);

HIViewSetVisible(hiCocoaView, true);
HIViewSetNeedsDisplay(hiCocoaView, true);

HIViewAddSubview(content, hiCocoaView);
HIViewSetNeedsDisplay(content, true);
HIViewSetVisible(content, true);

2015-09-16 18:19:30.387 Live[93099:1193953] view frame - 0.000000 0.000000 
100.000000 100.000000
2015-09-16 18:19:30.387 Live[93099:1193953] content frame - 0.000000 16.000000 
1024.000000 768.000000
2015-09-16 18:19:30.387 Live[93099:1193953] cocoa view frame - 0.000000 
0.000000 640.000000 480.000000

Nuno Santos
Founder / CEO / CTO
www.imaginando.pt
+351 91 621 69 62

> On 16 Sep 2015, at 14:36, Nuno Santos <nunosan...@imaginando.pt> wrote:
> 
> Hi.
> 
> I’m developing a plugin to be loaded by a music software host (VST). There 
> are some lighter alternatives to provide graphics, network and other kinds of 
> useful resources but I want to use Qt. I simply Love Qt!
> 
> When the plugin is open by the host, it provides a window ref to the plugin. 
> On Window it is a HWND handle, on Mac it is supposedly a WindowRef.
> 
> I have a working prototype for Windows. I don’t think it is all correct but 
> its working. When the plugin is first started I check for the existence of a 
> QApplication and start one if not.
> 
> Then I create the main controller for my plugin and the QQuickView to draw on 
> the window. To create the QQuickView i’m first creating a QWindow with the 
> ptr to HWND handle as parent:
> 
> window = QWindow::fromWinId((WId)ptr);
> 
> view = new QQuickView(window);
> view->setSource(QUrl("qrc:/qml/vstmain.qml"));
> view->rootContext()->setContextProperty("controller", _controller);
> view->show();
> 
> This is actually working quite well on Windows. The same strategy however, 
> doesn’t work on a Mac. When I try to create a QWindow::fromWinId the result 
> is a crash with the following stack trace:
> 
> 2015-09-16 14:26:18.526 Live[91339:1091079] -[NSHIObject 
> setPostsFrameChangedNotifications:]: unrecognized selector sent to instance 
> 0x19806da0
> 
> - The first question is: what is QWindow::fromWinId is expecting to be able 
> to create a window? An NSView?
> 
> - The second question is: the stack trace says that NSHIObject didn’t 
> recognized the selector setPostsFrameChangedNotifications. What is a 
> NSHIObject? I can only find references to HIObject from the HIToolbox and 
> that belongs to the Carbon frame work. So far I haven’t been able to call 
> Carbon methods inside my Qt environment even referencing -framework Carbon
> 
> - Third question: On window I have an issue with the QApplication args and 
> argv. On debug, there is an ASSERT that says that origArgc is different from 
> the actual argc/argv. On release mode it crashes. Why does QApplication needs 
> to receive the exact same arguments as the initial app? 
> 
> - Fourth question: how should I keep my run loop running without depending on 
> the host? On Windows I have created a windows thread to call qApp->exec(). 
> Although a warning that exec should be called on main thread it WORKS! How 
> safe is this? Is there any other recommended option? What about Mac OS X?
> 
> I have been google a lot specially about the NSHIObject and I can’t find an 
> answer, not even a simple lead. The closest I have is vstgui, a GUI framework 
> for VST plugins that has open source code and support for Carbon and Cocoa 
> backends but the NSHIObject is intriguing me because I can’t find any 
> explicit reference on how to deal with it.
> 
> Any thoughts would be high appreciated.
> 
> Thanks in advance,
> 
> With my best regards,
> 
> Nuno
> _______________________________________________
> Interest mailing list
> Interest@qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest

_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to