Hi, Everybody!
I found strange behaviour of signals on_erase() && on_insert() within
Gtk::TextBuffer.
Here is a test code:
#include <gtkmm/textbuffer.h>
#include <gtkmm/main.h>
#include <iostream>
static void on_cxx_insert(const Gtk::TextIter & pos, const Glib::ustring
&, int) {
std::cout << "on_cxx_insert(): pos = " << pos.get_offset() <<
std::endl;
}
static void on_cxx_erase(const Gtk::TextIter & start, const
Gtk::TextIter & end) {
std::cout << "on_cxx_erase(): start = " << start.get_offset() << ",
end = " << end.get_offset() << std::endl;
}
static void on_c_insert(GtkTextBuffer *, GtkTextIter * pos, const gchar
*, gint, void *) {
std::cout << "on_c_insert(): pos = " <<
gtk_text_iter_get_offset(pos) << std::endl;
}
static void on_c_erase(GtkTextBuffer *, GtkTextIter * start, GtkTextIter
* end, void *) {
std::cout << "on_c_erase(): start = " <<
gtk_text_iter_get_offset(start) << ", end = " <<
gtk_text_iter_get_offset(end) << std::endl;
}
int main(int argc, char * argv[]) {
Gtk::Main gtk_main(&argc, &argv);
Glib::RefPtr<Gtk::TextBuffer> tb = Gtk::TextBuffer::create();
if (GtkTextBuffer * gobj = tb->gobj()) {
g_signal_connect(gobj, "insert-text", G_CALLBACK(on_c_insert), 0);
g_signal_connect(gobj, "delete-range", G_CALLBACK(on_c_erase), 0);
}
tb->signal_insert().connect(sigc::ptr_fun(on_cxx_insert));
tb->signal_erase().connect(sigc::ptr_fun(on_cxx_erase));
tb->set_text("This is a text");
Gtk::TextIter start = tb->get_iter_at_offset(5), end =
tb->get_iter_at_offset(8);
tb->erase(start, end);
std::cout << "Result = " << tb->get_text() << std::endl;
return 0;
}
And a result:
[mrcashe@home test]$ ./test
on_c_insert(): pos = 0
on_cxx_insert(): pos = 14
on_c_erase(): start = 5, end = 8
on_cxx_erase(): start = 5, end = 5
Result = This a text
As You can see, gtk callbacks (written in C) works properly, but
corresponding gtkmm (C++) slots works improperly - iterator positions
are wrong. I think, gtk backend doing actual work and changing iterators
somehow, after that C++ slots getting that changed iterators.
Of course, it isn't too hard to wrap C callbacks that manner as in my
above code, but it looks nasty. Have authors some ideas how to resolve it?
Thanks.
_______________________________________________
gtkmm-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtkmm-list