From: Kevin W. <kw...@co...> - 2009-11-09 15:40:02
|
I've begun work on porting TkDND to OS X and am running into some basic, rather embarassing problems. The code below builds using the standard TEA methods, but when I try to call the first command (::macdnd::registerdragtypes), Wish segfaults. What's embarassing is that the code doesn't trip when I'm trying to call some Cocoa methods, but instead when I simply try to get a handle on a Tk window. Specifically, when I call this line of code: Tk_Window path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), Tk_MainWindow(ip)); Wish crashes with no other output other than "segmentation fault." (I've narrowed it down to this point by commenting out every subsequent line in the function, and this is where Wish goes down.) I'm calling the corresponding Tcl proc on the root window (macdnd::registerdragtypes . {} ), so there's no issue that I can see with the window not being there. I've queried about this on c.l.t., and I've been assured that the function call above is as basic as one can get and appears correct, so I'm a bit mystified here. If someone can look at the code below and give me any suggestions, I would be grateful. ---- #import <tcl.h> #import <Cocoa/Cocoa.h> #import <tk.h> #import <tkInt.h> #import <tkMacOSXInt.h> //need to wrap Cocoa methods in Cocoa class: methods for initiating, tracking, and terminating drag from inside and outside the application @interface DNDView : NSView { } @end @implementation DNDView //mousedown event to trigger drag - (void)mouseDown:(NSEvent*)event { //get the Pasteboard used for drag and drop operations NSPasteboard* dragPasteboard=[NSPasteboard pasteboardWithName:NSDragPboard]; NSImage * dragImage = [[NSWorkspace sharedWorkspace] iconForFileType:@"dylib"]; [dragImage lockFocus]; [[self image] dissolveToPoint: NSZeroPoint fraction: .5]; [dragImage unlockFocus]; // [dragImage setSize:[self bounds].size]; [self dragImage: dragImage at: [self bounds].origin offset: NSZeroSize event:event pasteboard:dragPasteboard source: self slideBack: YES]; [dragImage release]; } - (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)flag { return NSDragOperationEvery; } //DESTINATION OPERATIONS - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { NSPasteboard *pboard; NSDragOperation sourceDragMask; sourceDragMask = [sender draggingSourceOperationMask]; pboard = [sender draggingPasteboard]; if ( [pboard types] != nil) { return NSDragOperationEvery; } else { return NSDragOperationNone; } } - (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender { return YES; } //perform drag operations - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender { NSPasteboard *pboard; NSDragOperation sourceDragMask; return YES; } @end DNDView *dropview; //Tk window methods int RegisterDragTypes(ClientData clientData, Tcl_Interp *ip, int objc, Tcl_Obj *CONST objv[]) { if (objc != 3) { Tcl_WrongNumArgs(ip, 1, objv, "path types-list"); return TCL_ERROR; } Tk_Window path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), Tk_MainWindow(ip)); Drawable d = Tk_WindowId(path); DNDView *dropview = [[DNDView alloc] init]; dropview = TkMacOSXGetRootControl(d); [dropview registerForDraggedTypes:[NSArray arrayWithObjects: NSStringPboardType, NSFilenamesPboardType, NSURLPboardType, nil]]; return TCL_OK; } int UnregisterDragTypes(ClientData clientData, Tcl_Interp *ip, int objc, Tcl_Obj *CONST objv[]) { if (objc != 2) { Tcl_WrongNumArgs(ip, 1, objv, "path"); return TCL_ERROR; } Tk_Window path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), Tk_MainWindow(ip)); Drawable d = Tk_WindowId(path); DNDView *dropview = [[DNDView alloc] init]; dropview = TkMacOSXGetRootControl(d); [dropview unregisterDraggedTypes]; return TCL_OK; } //initalize the package in the tcl interpreter, create tcl commands int Macdnd_Init (Tcl_Interp *ip) { //set up an autorelease pool NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; if (Tcl_InitStubs(ip, "8.5", 0) == NULL) { return TCL_ERROR; } Tcl_CreateObjCommand(ip, "::macdnd::registerdragtypes", RegisterDragTypes,(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); Tcl_CreateObjCommand(ip, "::macdnd::unregisterdragtypes", UnregisterDragTypes,(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); if (Tcl_PkgProvide(ip, "MacDND", "1.0") != TCL_OK) { return TCL_ERROR; } //release memory [pool release]; return TCL_OK; } int Macdnd_SafeInit(Tcl_Interp *ip) { return Macdnd_Init(ip); } --- -- Kevin Walzer Code by Kevin http://www.codebykevin.com |
From: <jg...@hi...> - 2009-11-09 15:54:09
|
Quoting Kevin Walzer <kw...@co...>: > Specifically, when I call this line of code: > > > Tk_Window path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), > Tk_MainWindow(ip)); > > Wish crashes with no other output other than "segmentation fault." Just to cover all the tedious bases (and with the caveats that I don't do Tk, I don't do Cocoa, and I don't really do Tcl anymore): * what does Tcl_GetString(objv[1]) return? * what does Tk_MainWindow(ip) return? * what's the refCount of objv[1]? |
From: Kevin W. <kw...@co...> - 2009-11-09 16:15:42
|
On 11/9/09 10:53 AM, jg...@hi... wrote: > > Just to cover all the tedious bases (and with the caveats that I don't > do Tk, I don't do Cocoa, and I don't really do Tcl anymore): > > * what does Tcl_GetString(objv[1]) return? > * what does Tk_MainWindow(ip) return? > * what's the refCount of objv[1]? > NSLog(@"%s", ip); NSLog(@"%s",Tcl_GetString(objv[1])); NSLog(@"%s", Tk_MainWindow(ip)); 2009-11-09 11:04:50.556 Wish[71694:10b] Ë15 2009-11-09 11:04:50.605 Wish[71694:10b] . /usr/local/bin/wish: line 2: 71694 Segmentation fault "$(dirname $0)/../../../Library/Frameworks/Tk.framework/Versions/8.5/Resources/Wish.app/Contents/MacOS/Wish" "$@" It's the call to Tk_MainWindow that's causing the crash. What's weird is that Wish also crashes when I simply run the standard NULL check: if (Tk_MainWindow(ip) == NULL) { return TCL_ERROR; } No error, just a hard crash. If the root toplevel is mapped (.), shouldn't it not do this? I didn't get to the refCount yet. --Kevin -- Kevin Walzer Code by Kevin http://www.codebykevin.com |
From: <jg...@hi...> - 2009-11-09 16:54:47
|
Quoting Kevin Walzer <kw...@co...>: > On 11/9/09 10:53 AM, jg...@hi... wrote: >> >> Just to cover all the tedious bases (and with the caveats that I don't >> do Tk, I don't do Cocoa, and I don't really do Tcl anymore): >> >> * what does Tcl_GetString(objv[1]) return? >> * what does Tk_MainWindow(ip) return? >> * what's the refCount of objv[1]? >> > > NSLog(@"%s", ip); > NSLog(@"%s",Tcl_GetString(objv[1])); > NSLog(@"%s", Tk_MainWindow(ip)); Since neither ip nor Tk_MainWindow(ip) is a string, I'm not sure this is the most informative test, but I agree that it casts the suspicion on Tk_MainWindow(ip). If that return were NULL, the segfault in NSLog wouldn't surprise me, but I'd expect your NULL check to work. Are you positive the ip is really a valid Tcl_Interp*? > If the root toplevel is mapped (.), > shouldn't it not do this? As I said, I don't do Tk, but I would think not. > I didn't get to the refCount yet. I don't know that it's relevant if Tk_MainWindow() is what's crashing. |
From: Damon C. <da...@tc...> - 2009-11-09 16:41:17
|
For all us people who could actually help, it would be useful to send a tarball of your current project directory. That way, I can just configure && make it and run it through a debugger and see what's going on. Code pasted in e-mails is rarely as useful. 0-] Thanks for tackling this though. It's something I, myself, have wanted for a LONG time but haven't had the time to look into. D On Nov 9, 2009, at 9:39 AM, Kevin Walzer wrote: > I've begun work on porting TkDND to OS X and am running into some > basic, > rather embarassing problems. The code below builds using the standard > TEA methods, but when I try to call the first command > (::macdnd::registerdragtypes), Wish segfaults. What's embarassing is > that the code doesn't trip when I'm trying to call some Cocoa methods, > but instead when I simply try to get a handle on a Tk window. > Specifically, when I call this line of code: > > > Tk_Window path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), > Tk_MainWindow(ip)); > > Wish crashes with no other output other than "segmentation fault." > (I've narrowed it down to this point by commenting out every > subsequent > line in the function, and this is where Wish goes down.) I'm calling > the > corresponding Tcl proc on the root window (macdnd::registerdragtypes . > {} ), so there's no issue that I can see with the window not being > there. > > I've queried about this on c.l.t., and I've been assured that the > function call above is as basic as one can get and appears correct, so > I'm a bit mystified here. > > If someone can look at the code below and give me any suggestions, I > would be grateful. > > ---- > > #import <tcl.h> > #import <Cocoa/Cocoa.h> > #import <tk.h> > #import <tkInt.h> > #import <tkMacOSXInt.h> > > //need to wrap Cocoa methods in Cocoa class: methods for initiating, > tracking, and terminating drag from inside and outside the application > > @interface DNDView : NSView { > > } > > @end > > @implementation DNDView > > > //mousedown event to trigger drag > - (void)mouseDown:(NSEvent*)event { > > //get the Pasteboard used for drag and drop operations > NSPasteboard* dragPasteboard=[NSPasteboard > pasteboardWithName:NSDragPboard]; > > NSImage * dragImage = [[NSWorkspace sharedWorkspace] > iconForFileType:@"dylib"]; > > [dragImage lockFocus]; > [[self image] dissolveToPoint: NSZeroPoint fraction: .5]; > [dragImage unlockFocus]; > // [dragImage setSize:[self bounds].size]; > [self dragImage: dragImage > at: [self bounds].origin > offset: NSZeroSize > event:event > pasteboard:dragPasteboard > source: self > slideBack: YES]; > [dragImage release]; > } > > > - (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)flag { > > return NSDragOperationEvery; > } > > > //DESTINATION OPERATIONS > - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { > NSPasteboard *pboard; > NSDragOperation sourceDragMask; > > sourceDragMask = [sender draggingSourceOperationMask]; > pboard = [sender draggingPasteboard]; > > if ( [pboard types] != nil) { > return NSDragOperationEvery; > } else { > > return NSDragOperationNone; > } > } > > > - (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender { > return YES; > } > > //perform drag operations > - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender { > NSPasteboard *pboard; > NSDragOperation sourceDragMask; > return YES; > > } > > @end > > > DNDView *dropview; > > //Tk window methods > int RegisterDragTypes(ClientData clientData, Tcl_Interp *ip, > int objc, Tcl_Obj *CONST objv[]) { > if (objc != 3) { > Tcl_WrongNumArgs(ip, 1, objv, "path types-list"); > return TCL_ERROR; > } > > Tk_Window path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), > Tk_MainWindow(ip)); > Drawable d = Tk_WindowId(path); > > DNDView *dropview = [[DNDView alloc] init]; > > dropview = TkMacOSXGetRootControl(d); > [dropview registerForDraggedTypes:[NSArray arrayWithObjects: > NSStringPboardType, NSFilenamesPboardType, NSURLPboardType, nil]]; > > return TCL_OK; > > } > > int UnregisterDragTypes(ClientData clientData, Tcl_Interp *ip, > int objc, Tcl_Obj *CONST objv[]) { > if (objc != 2) { > Tcl_WrongNumArgs(ip, 1, objv, "path"); > return TCL_ERROR; > } > > Tk_Window path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), > Tk_MainWindow(ip)); > Drawable d = Tk_WindowId(path); > > DNDView *dropview = [[DNDView alloc] init]; > > dropview = TkMacOSXGetRootControl(d); > [dropview unregisterDraggedTypes]; > > return TCL_OK; > > } > > > //initalize the package in the tcl interpreter, create tcl commands > int Macdnd_Init (Tcl_Interp *ip) { > > //set up an autorelease pool > NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; > > if (Tcl_InitStubs(ip, "8.5", 0) == NULL) { > return TCL_ERROR; > } > > Tcl_CreateObjCommand(ip, "::macdnd::registerdragtypes", > RegisterDragTypes,(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); > Tcl_CreateObjCommand(ip, "::macdnd::unregisterdragtypes", > UnregisterDragTypes,(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); > > > if (Tcl_PkgProvide(ip, "MacDND", "1.0") != TCL_OK) { > return TCL_ERROR; > } > > //release memory > [pool release]; > > return TCL_OK; > > > } > > int Macdnd_SafeInit(Tcl_Interp *ip) { > return Macdnd_Init(ip); > } > > --- > -- > Kevin Walzer > Code by Kevin > http://www.codebykevin.com > > ------------------------------------------------------------------------------ > Let Crystal Reports handle the reporting - Free Crystal Reports 2008 > 30-Day > trial. Simplify your report design, integration and deployment - and > focus on > what you do best, core application coding. Discover what's new with > Crystal Reports now. http://p.sf.net/sfu/bobj-july > _______________________________________________ > Tcl-mac mailing list > tc...@li... > https://lists.sourceforge.net/lists/listinfo/tcl-mac |
From: Kevin W. <kw...@co...> - 2009-11-09 23:11:32
|
On 11/9/09 11:14 AM, Damon Courtney wrote: > For all us people who could actually help, it would be useful to send > a tarball of your current project directory. That way, I can just > configure&& make it and run it through a debugger and see what's > going on. Code pasted in e-mails is rarely as useful. 0-] > > Thanks for tackling this though. It's something I, myself, have > wanted for a LONG time but haven't had the time to look into. > > D > Done: http://www.codebykevin.com/macdnd.zip Right now I'm not working on this inside the TkDND source tree, I'm just using a standalone TEA package. Once I get things going, I'll work on mapping this into the TkDND API. Any assistance/advice is appreciated! --Kevin -- Kevin Walzer Code by Kevin http://www.codebykevin.com |
From: Kevin W. <kw...@co...> - 2009-11-12 00:49:10
|
After doing additional digging, I've narrowed down the crashing code to this function call: Tk_Window path; path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), Tk_MainWindow(ip)); if (path == NULL) { return TCL_ERROR; } This is baffling. These calls are very basic. I think it would be hard to write any kind of Tk extension without them. I can't figure out what in the above is causing Wish to crash. Running gdb and setting the libraries to debug returns this output: #0 0x00000001163842eb in RegisterDragTypes () #1 0x0000000100243aeb in TclEvalObjvInternal (interp=0x1007fb010, objc=3, objv=0x100a0a088, command=0xffffffffffffffff <Address 0xffffffffffffffff out of bounds>, length=-1, flags=0) at /Users/kevin/tk85-patched/tcl/unix/../generic/tclBasic.c:3688 #2 0x00000001002a9b1e in TclExecuteByteCode (interp=0x1007fb010, codePtr=0x114119910) at /Users/kevin/tk85-patched/tcl/unix/../generic/tclExecute.c:2327 #3 0x00000001002a7274 in TclCompEvalObj (interp=0x1007fb010, objPtr=0x112d64380, invoker=0x0, word=0) at /Users/kevin/tk85-patched/tcl/unix/../generic/tclExecute.c:1450 #4 0x0000000100245dc6 in TclEvalObjEx (interp=0x1007fb010, objPtr=0x112d64380, flags=131072, invoker=0x0, word=0) at /Users/kevin/tk85-patched/tcl/unix/../generic/tclBasic.c:5130 #5 0x000000010024597f in Tcl_EvalObjEx (interp=0x1007fb010, objPtr=0x1007fb010, flags=131072) at /Users/kevin/tk85-patched/tcl/unix/../generic/tclBasic.c:4938 #6 0x00000001002bf75f in Tcl_RecordAndEvalObj (interp=0x1007fb010, cmdPtr=0x112d64380, flags=131072) at /Users/kevin/tk85-patched/tcl/unix/../generic/tclHistory.c:161 #7 0x00000001002bf4f7 in Tcl_RecordAndEval (interp=0x1007fb010, cmd=0x100a1ee28 "macdnd::registerdragtypes . {}\n", flags=131072) at /Users/kevin/tk85-patched/tcl/unix/../generic/tclHistory.c:59 #8 0x0000000100037244 in StdinProc (clientData=0x112a10910, mask=2) at /Users/kevin/tk85-patched/tk/unix/../generic/tkMain.c:390 #9 0x00000001002cf502 in Tcl_NotifyChannel (channel=0x112a10910, mask=2) at /Users/kevin/tk85-patched/tcl/unix/../generic/tclIO.c:7811 #10 0x0000000100339156 in FileHandlerEventProc (evPtr=0x112a295d0, flags=-3) at /Users/kevin/tk85-patched/tcl/unix/../macosx/tclMacOSXNotify.c:1146 #11 0x00000001002f0f95 in Tcl_ServiceEvent (flags=-3) at /Users/kevin/tk85-patched/tcl/unix/../generic/tclNotify.c:677 #12 0x00000001002f1405 in Tcl_DoOneEvent (flags=-3) at /Users/kevin/tk85-patched/tcl/unix/../generic/tclNotify.c:980 #13 0x000000010002422e in Tk_MainLoop () at /Users/kevin/tk85-patched/tk/unix/../generic/tkEvent.c:2139 #14 0x0000000100037013 in Tk_MainEx (argc=-1, argv=0x7fff5fbff528, appInitProc=0x10000450b, interp=0x1007fb010) at /Users/kevin/tk85-patched/tk/unix/../generic/tkMain.c:321 #15 0x00000001000044fe in ?? () Warning: the current language does not match this frame. Not sure how to interpret this--can anyone suggest something? --Kevin -- Kevin Walzer Code by Kevin http://www.codebykevin.com |
From: Jeff H. <je...@ac...> - 2009-11-12 00:54:23
|
Could you do an innocuous operation on the interp ip, like Tcl_GetResult or similar, that would indicate it is a valid interp *? Also, the macdnd doesn't seem to be built with symbols enabled, which might help. Jeff On 11/11/2009 4:16 PM, Kevin Walzer wrote: > After doing additional digging, I've narrowed down the crashing code to > this function call: > > Tk_Window path; > path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), Tk_MainWindow(ip)); > if (path == NULL) { > return TCL_ERROR; > } > > This is baffling. These calls are very basic. I think it would be hard > to write any kind of Tk extension without them. I can't figure out what > in the above is causing Wish to crash. Running gdb and setting the > libraries to debug returns this output: > > #0 0x00000001163842eb in RegisterDragTypes () > #1 0x0000000100243aeb in TclEvalObjvInternal (interp=0x1007fb010, > objc=3, objv=0x100a0a088, command=0xffffffffffffffff<Address > 0xffffffffffffffff out of bounds>, length=-1, flags=0) at > /Users/kevin/tk85-patched/tcl/unix/../generic/tclBasic.c:3688 .... > /Users/kevin/tk85-patched/tcl/unix/../generic/tclHistory.c:161 > #7 0x00000001002bf4f7 in Tcl_RecordAndEval (interp=0x1007fb010, > cmd=0x100a1ee28 "macdnd::registerdragtypes . {}\n", flags=131072) at .... |
From: Jeff H. <je...@ac...> - 2009-11-12 02:08:10
|
BTW, the interp part is OK. It seems the first call into any Tk function from your Obj-C code goes bust. Don't know why that would be, as the Tcl parts are ok. On 11/11/2009 4:53 PM, Jeff Hobbs wrote: > Could you do an innocuous operation on the interp ip, like Tcl_GetResult > or similar, that would indicate it is a valid interp *? > > Also, the macdnd doesn't seem to be built with symbols enabled, which > might help. > > Jeff > > On 11/11/2009 4:16 PM, Kevin Walzer wrote: >> After doing additional digging, I've narrowed down the crashing code to >> this function call: >> >> Tk_Window path; >> path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), Tk_MainWindow(ip)); >> if (path == NULL) { >> return TCL_ERROR; >> } >> >> This is baffling. These calls are very basic. I think it would be hard >> to write any kind of Tk extension without them. I can't figure out what >> in the above is causing Wish to crash. Running gdb and setting the >> libraries to debug returns this output: >> >> #0 0x00000001163842eb in RegisterDragTypes () >> #1 0x0000000100243aeb in TclEvalObjvInternal (interp=0x1007fb010, >> objc=3, objv=0x100a0a088, command=0xffffffffffffffff<Address >> 0xffffffffffffffff out of bounds>, length=-1, flags=0) at >> /Users/kevin/tk85-patched/tcl/unix/../generic/tclBasic.c:3688 > .... >> /Users/kevin/tk85-patched/tcl/unix/../generic/tclHistory.c:161 >> #7 0x00000001002bf4f7 in Tcl_RecordAndEval (interp=0x1007fb010, >> cmd=0x100a1ee28 "macdnd::registerdragtypes . {}\n", flags=131072) at > .... |
From: Jeff H. <je...@ac...> - 2009-11-12 02:12:26
|
When building with symbols enabled against a symbols enabled wish, I get this helpful message which might indicate something: 2009-11-11 18:11:04.309 wish[41201:70f] tkMacOSXInit.c:257: TkpInit(): Tcl_MacOSXOpenVersionedBundleResources failed On 11-Nov-09, at 5:42 PM, Jeff Hobbs wrote: > BTW, the interp part is OK. It seems the first call into any Tk > function from your Obj-C code goes bust. Don't know why that would > be, > as the Tcl parts are ok. > > On 11/11/2009 4:53 PM, Jeff Hobbs wrote: >> Could you do an innocuous operation on the interp ip, like >> Tcl_GetResult >> or similar, that would indicate it is a valid interp *? >> >> Also, the macdnd doesn't seem to be built with symbols enabled, which >> might help. >> >> Jeff >> >> On 11/11/2009 4:16 PM, Kevin Walzer wrote: >>> After doing additional digging, I've narrowed down the crashing >>> code to >>> this function call: >>> >>> Tk_Window path; >>> path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), >>> Tk_MainWindow(ip)); >>> if (path == NULL) { >>> return TCL_ERROR; >>> } >>> >>> This is baffling. These calls are very basic. I think it would be >>> hard >>> to write any kind of Tk extension without them. I can't figure out >>> what >>> in the above is causing Wish to crash. Running gdb and setting the >>> libraries to debug returns this output: >>> >>> #0 0x00000001163842eb in RegisterDragTypes () >>> #1 0x0000000100243aeb in TclEvalObjvInternal (interp=0x1007fb010, >>> objc=3, objv=0x100a0a088, command=0xffffffffffffffff<Address >>> 0xffffffffffffffff out of bounds>, length=-1, flags=0) at >>> /Users/kevin/tk85-patched/tcl/unix/../generic/tclBasic.c:3688 >> .... >>> /Users/kevin/tk85-patched/tcl/unix/../generic/tclHistory.c:161 >>> #7 0x00000001002bf4f7 in Tcl_RecordAndEval (interp=0x1007fb010, >>> cmd=0x100a1ee28 "macdnd::registerdragtypes . {}\n", flags=131072) at >> .... |
From: Kevin W. <kw...@co...> - 2009-11-12 02:31:08
|
On 11/11/09 9:12 PM, Jeff Hobbs wrote: > When building with symbols enabled against a symbols enabled wish, I get > this helpful message which might indicate something: > > 2009-11-11 18:11:04.309 wish[41201:70f] tkMacOSXInit.c:257: TkpInit(): > Tcl_MacOSXOpenVersionedBundleResources failed Do you get this error when you're building the extension, or loading it? --Kevin -- Kevin Walzer Code by Kevin http://www.codebykevin.com |
From: Kevin W. <kw...@co...> - 2009-11-12 02:47:25
|
On 11/11/09 9:12 PM, Jeff Hobbs wrote: > When building with symbols enabled against a symbols enabled wish, I get > this helpful message which might indicate something: > > 2009-11-11 18:11:04.309 wish[41201:70f] tkMacOSXInit.c:257: TkpInit(): > Tcl_MacOSXOpenVersionedBundleResources failed > > After diving into the Tk source code to find this string, I see that its intended purpose is to force Tk to look in the framework scripts directory as part of the auto_path...I'm not sure I see the connection to the issue I'm running into. -- Kevin Walzer Code by Kevin http://www.codebykevin.com |
From: Joe E. <jen...@fl...> - 2009-11-12 17:38:16
|
Kevin Walzer wrote: > After doing additional digging, I've narrowed down the crashing code to > this function call: > > Tk_Window path; > path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), Tk_MainWindow(ip)); > if (path == NULL) { > return TCL_ERROR; > } > [...] > > #0 0x00000001163842eb in RegisterDragTypes () > #1 0x0000000100243aeb in TclEvalObjvInternal (interp=0x1007fb010, Aha! I've seen this before. Note that it's segfaulting in the function RegisterDragTypes, *not* in Tcl_GetString(), Tk_MainWindow(), or Tk_NameToWindow(). So the crash has to be at _the function call itself_. This can happen if the stubs table is uninitialized, or has later been corrupted or zerod out. Are you calling Tk_InitStubs() in your package *_Init() routine? Does it succeed? Your *_Init() routine should look something like: int DLLEXPORT Foo_Init(Tcl_Interp *interp) { if (Tcl_InitStubs(interp, TCL_VERSION, 0) == NULL) { return TCL_ERROR; } if (Tk_InitStubs(interp, TK_VERSION, 0) == NULL) { return TCL_ERROR; } /* ... register your commands with Tcl_CreateObjCommand() here ... */ return TCL_OK; } --Joe English jen...@fl... |
From: Kevin W. <kw...@co...> - 2009-11-13 01:57:01
|
On 11/12/09 12:37 PM, Joe English wrote: > > This can happen if the stubs table is uninitialized, > or has later been corrupted or zerod out. > > Are you calling Tk_InitStubs() in your package *_Init() routine? > Does it succeed? > I was calling Tcl_InitStubs but not the Tk equivalent. Thanks for pointing that out. Wish no longer crashes. :-) -- Kevin Walzer Code by Kevin http://www.codebykevin.com |
From: Kevin W. <kw...@co...> - 2009-11-12 13:18:27
|
On 11/11/09 8:42 PM, Jeff Hobbs wrote: > BTW, the interp part is OK. It seems the first call into any Tk > function from your Obj-C code goes bust. Don't know why that would be, > as the Tcl parts are ok. > > Yes, I can confirm this. I've stripped out every line of Obj-C code/Cocoa API calls and just have a skeleton function call, c.f.: int RegisterDragTypes(ClientData clientData, Tcl_Interp *ip, int objc, Tcl_Obj *CONST objv[]) { if (objc != 3) { Tcl_WrongNumArgs(ip, 1, objv, "path types-list"); return TCL_ERROR; } Tk_Window path; path = Tk_NameToWindow(ip, Tcl_GetString(objv[1]), Tk_MainWindow(ip)); if (path == NULL) { return TCL_ERROR; } Tcl_SetResult(ip, "foo!", NULL); return TCL_OK; } and the extension still bombs. I'm wondering if the issue is something with my setup. I'm using my own build of Tk-Cocoa 8.5 to build against, using a TEA setup based on the one for a sample Tk-Cocoa extension that Daniel Steffen put together here: http://www.categorifiedcoder.info/tcltk/tkwebview.tar.bz2 I had no problem building Daniel's extension, nor have I had any issues building other TEA-compliant extensions against my Tk-Cocoa source tree (tktable, tktreectrl, etc.), but I can't put my finger on anything else. I know my ObjC code probably needs work, but I can't worry about that if simply trying to access a Tk_Window causes Wish to crash...this is really weird. --Kevin -- Kevin Walzer Code by Kevin http://www.codebykevin.com |
From: Daniel A. S. <da...@us...> - 2009-11-12 17:38:38
|
Hi Kevin, stab in the dark without having looked at your code: is it the first call into Tk ever in your extension that is crashing? and is your extension tk-stubs enabled? if yes, you are probably not initializing the Tk stubs table, i.e. not calling Tk_StubsInit in your extension _Init function... If the stubs table is not initialized, any call through it (i.e. any Tk API call) will cause an invalid pointer dereference or a jump to a random location... (the stubs mechanism works by redefining direct calls into Tk to indirect calls via an array of function pointers - the stubs table - initialized at extension load time by a call to Tk_InitStubs resp Tcl_InitStubs etc) Cheers, Daniel |
From: Kevin W. <kw...@co...> - 2009-11-13 01:56:51
|
On 11/12/09 12:17 PM, Daniel A. Steffen wrote: > Hi Kevin, > > stab in the dark without having looked at your code: > > is it the first call into Tk ever in your extension that is crashing? > and is your extension tk-stubs enabled? > if yes, you are probably not initializing the Tk stubs table, i.e. not > calling Tk_StubsInit in your extension _Init function... Tk_InitStubs was missing. Adding that addressed the issue. Thanks. -- Kevin Walzer Code by Kevin http://www.codebykevin.com |