From: <wag...@se...> - 2011-06-10 01:30:38
|
Quoting wag...@se...: > In the latest stable release of gtk, the following minimal program > segfaults as soon as I whack any key: > > <actual program snipped> Okay, I investigated this problem. It turns out that the TextBuffer class's "insert-text" signal sends its callback a (char *) and a (gint) representing its length -- and is *the only signal* in the entire Gtk library to do this rather than using a null-terminated string. Brilliant. I've enclosed a patch that fixes the problem (at least on my machine), but I'd love a code review for it. The description of the patch tells why -- my solution is somewhat unclean, in that it copies and modifies some generated code. I'd love to hear some feedback -- is this acceptable? If not, how should it be done instead? I've also enclosed a few other patches for Entry and EntryBuffer that I did while trying to understand what was going wrong with TextView and TextBuffer -- which are very close brothers. Thanks! ~d Thu Jun 9 19:55:56 EDT 2011 Daniel Wagner <da...@wa...> * bind to the gtk_entry_new_with_buffer function Thu Jun 9 19:56:25 EDT 2011 Daniel Wagner <da...@wa...> * add the "entryBuffer" attribute to bind to the "gtk_entry_set_buffer" and "gtk_entry_get_buffer" functions Thu Jun 9 20:54:56 EDT 2011 Daniel Wagner <da...@wa...> * instead of recording the bound [0,65535] in the documentation, record it in the types This changes the types of a few attributes and functions in a backwards-incompatible way. At least in the case of the EntryBuffer attributes, this should be no problem, since there was no way to actually use EntryBuffer's until recently, anyway. Thu Jun 9 21:16:47 EDT 2011 Daniel Wagner <da...@wa...> * fix a segfaulting signal It turns out that the "insert-text" signal attached to the GtkTextBuffer class passes a string and its byte length, rather than a null-terminated string like every other string-based signal in the entire Gtk library. Since the Gtk library doesn't distinguish between null-terminated and length-terminated strings, this means we can't use the built-in list of possible signal types to automatically generate a good connection function. This patch copies the definition of connect_BOXED_STRING__NONE into the TextBuffer module, modifying it as necessary to handle length-terminated strings. This may not be the cleanest solution, but it is fairly simple and seems to fix the segfault in my test case. |