Ich habe die folgenden Code-Fragmente:emittieren Signal Fenster
win = new Gtk::Window;
m_canvas = new Goocanvas::Canvas;
sigc::connection conn_t1 = m_canvas->signal_event().connect(sigc::ptr_fun(&AnyEvent));
sigc::connection conn_t2 = win->signal_event().connect(sigc::ptr_fun(&WinHandler));
Jetzt auch ich einen IdleHandler registrieren, die Signale erzeugt:
Glib::signal_idle().connect(sigc::mem_fun(*this, &IdleSendEvent::Do));
Was ich will, erreichen: Der Handler der Leinwand sollte ein Event erhalten und sollte ein neues generieren und dieses an das Objekt senden, damit es den Handler des m_canvas-> signal_event() erneut aufruft.
Mit anderen Worten: Indirekt über den Idle Handler sollte das Signal an das sendende Objekt selbst gesendet werden.
Aber wenn ich Feuer zu
g_signal_emit_by_name (m_canvas->gobj(), "button-press-event", event, &return_val);
wird das Signal in der Leinwand selbst nicht erhalten, aber in einigen Kind dort Objekte.
F: Wie emmit wieder auf die Leinwand? Gibt es etwas wie "get_the_parent_signal_object_handler_father_receiver" oder etwas Seltsames?
ich viel gtk_widget_get_parent_window tat(), aber alle Ergebnisse in Laufzeitfehler wie:
(gehen: 15.430): Glib-GObject-WARNING **: gsignal.c: 3484: Signalname ‚Taste -press-Ereignis‘ist ungültig zum Beispiel‚0x9afbc48‘vom Typ‚GdkX11Window‘
ich habe einfach keine Ahnung, wo die richtige Instanz zu finden, die ich ein Signal an Emmit habe, die für die Leinwand wird dann empfangen. Es sieht so aus, dass die Instanz für g_signal_emit_by_name
nicht auf das Objekt selbst, sondern auf alle untergeordneten Instanzen feuert. Ich kann keine Dokumentation finden, wie die Signale verarbeitet werden und wie die Hierarchie durchlaufen werden kann. Eines der Probleme ist, dass gtk + und gtkmm verwandt sind, aber die Dokumentation völlig unklar und verstreut ist.