From: Kevin W. <kw...@co...> - 2010-02-08 22:30:12
|
Having successfully implemented custom sheets in Tk-Cocoa, I'm trying to do something similar with the "drawer" interface widget (window that slides out from the side of the toplevel window). Since NSDrawer doesn't seem to respond to messages sent by Tk windows, and there's no way to get a handle on the drawer's view, I'm trying a different approach. My idea is to use a combination of Cocoa's [window addChildWindow:child ordered:place] method to make a Tk toplevel a child window of another Tk window, and the "drawer" flags in tk::unsupported::macwindowstyle.. In Cocoa, a child window means something a little different than in Tk: this means that the windows are essentially "grouped," and when the parent window is moved, the child window also moves. With this functionality, plus the "drawer" macwindowstyle, it should be possible to implement drawers in a fashion that closely matches the native style. However, it doesn't work--I can't get the [addChildWindow] command to work. I can't see anything in the code below that indicates why it doesn't work. Is there something in the internal implementation of Tk toplevels in Tk Cocoa that might preclude a child window from working in the expected Cocoa fashion? Code below, comments are appreciated. --Kevin ---- int MakeTkDrawer(ClientData clientData, Tcl_Interp *ip, int objc, Tcl_Obj *CONST objv[]) { if (objc != 3) { Tcl_WrongNumArgs(ip, 1, objv, "parent? drawer?"); return TCL_ERROR; } //get handle on parent Cocoa window from Tk Tk_Window parentpath = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), Tk_MainWindow(ip)); if (parentpath == NULL) { return TCL_ERROR; } Drawable parent_d = Tk_WindowId(parentpath); NSView *parentview = TkMacOSXGetRootControl(parent_d); NSWindow *parent = [parentview window]; //get handle on drawer Cocoa window from Tk Tk_Window drawerpath = Tk_NameToWindow(ip, Tcl_GetString(objv[2]), Tk_MainWindow(ip)); Tk_MakeWindowExist(drawerpath); Drawable drawer_d = Tk_WindowId(drawerpath); NSView *drawerview = TkMacOSXGetRootControl(drawer_d); NSWindow *drawer = [drawerview window]; if (drawerpath == NULL) { return TCL_ERROR; } [parent addChildWindow:drawer ordered:NSWindowAbove]; } -- Kevin Walzer Code by Kevin http://www.codebykevin.com |
From: Kevin W. <kw...@co...> - 2010-02-09 04:20:14
|
On 2/8/10 5:29 PM, Kevin Walzer wrote: > > However, it doesn't work--I can't get the [addChildWindow] command to > work. I can't see anything in the code below that indicates why it > doesn't work. Is there something in the internal implementation of Tk > toplevels in Tk Cocoa that might preclude a child window from working in > the expected Cocoa fashion? Well, as is typical with me, after further testing and digging I find the code does work, and works as expected. The difficulties I've been having were similar to those with the sheet project--interaction between Tk's windows, wm geometry, etc., and the underlying Cocoa layer. I'm working out a reasonable solution at the script level; the Cocoa primitives do what they're supposed to. I'll eventually release this package open-source as I've done with the others..."macdrawer" is the name. It won't be perfect; the placement and appearance will be acceptable but it most likely won't have the smooth animation, the drawer will simply appear and disappear. Good enough for my needs. -- Kevin Walzer Code by Kevin http://www.codebykevin.com |