Forum: PC-Programmierung [GTK] Echte Events von synthetischen unterscheiden


von Lukas K. (carrotindustries)


Lesenswert?

Hallo Zusammen,

ich habe in meiner Anwendung einen GtkToggleButton. Dieser kann 
einerseits vom Benutzer betätigt werden, aber auch vom Programm durch 
set_active(). Nun möchte ich in der mit dem 'toggled'-Signal verknüpften 
Methode feststellen, woher das Ereignis kam (Auf den Knopf gedrückt, 
oder set_active()). Weiß hier jemand wie das geht?

MfG,
Lukas

von Jürgen W. (lovos)


Lesenswert?

Dazu gibt es das Signal "clicked"
Dieses wird nur bei User-Betätigung "gefeuert".

gtk_signal_connect(GTK_OBJECT(button), "clicked", ...

von Lukas K. (carrotindustries)


Angehängte Dateien:

Lesenswert?

Jürgen W. schrieb:
> Dazu gibt es das Signal "clicked"
> Dieses wird nur bei User-Betätigung "gefeuert".

So dachte ich auch... Aber die GTK-Entwickler wohl nicht.
Im Anhang ist ein Test-Programm zum nachvollziehen: Der clicked-Event 
wird auch bei set_active ausgelöst

von Jürgen W. (lovos)


Lesenswert?

Sorry, ich hatte das nur noch in vager Erinnerung.
Workarounds gibt auch ohne spezielle Signale.
Wenn Du den Button vom Programm aus änderst, kannst Du ein Flag setzen.
Wenn dann das Signal/Callback von gtk_main() aufgerufen wird, prüft Dein 
Handler zunächst das Flag. Wenn es gesetzt ist, wird es gelöscht und 
keine weitere Aktion ausgeführt.

von Lukas K. (carrotindustries)


Lesenswert?

Der Vollständigkeit halber, falls jemand den Thread hier findet und 
nicht dieses Erlebnis haben muss: http://xkcd.com/979/

Im event-handler ruft man Gtk.get_current_event() auf. Wenn jemand 
"programmatisch" am Widget gewackelt hat, gibt die Funktion None zurück, 
sonst den Event.

: Bearbeitet durch User
von Stefan Salewski (Gast)


Lesenswert?

Lukas K. schrieb:
> Im event-handler ruft man Gtk.get_current_event() auf. Wenn jemand
> "programmatisch" am Widget gewackelt hat, gibt die Funktion None zurück,
> sonst den Event.

Ich glaube ich hatte damals deine Anfrage gesehen, konnte aber nicht 
helfen.
Dass sich jemand mit der Lösung des Problems zurückmeldet ist ja hier 
die große Ausnahme, üblich ist wohl eher den Thread schnell löschen zu 
lassen, damit nicht noch ein anderer von der Antwort profitiert. ;-)

Na ich hoffe Du hast jetzt nicht die vollen 13 Monate an dem Problem 
geknobelt -- auf der GTK-Mailingliste sollte es ja dann doch eine 
Antwort gegeben haben. Wenn nicht, dann sollte ich vielleicht doch mal 
über Qt nachdenken...

von Lukas K. (carrotindustries)


Lesenswert?

Stefan Salewski schrieb:
> Lukas K. schrieb:
>> Im event-handler ruft man Gtk.get_current_event() auf. Wenn jemand
>> "programmatisch" am Widget gewackelt hat, gibt die Funktion None zurück,
>> sonst den Event.
>
> Ich glaube ich hatte damals deine Anfrage gesehen, konnte aber nicht
> helfen.
> Dass sich jemand mit der Lösung des Problems zurückmeldet ist ja hier
> die große Ausnahme, üblich ist wohl eher den Thread schnell löschen zu
> lassen, damit nicht noch ein anderer von der Antwort profitiert. ;-)
>
> Na ich hoffe Du hast jetzt nicht die vollen 13 Monate an dem Problem
> geknobelt -- auf der GTK-Mailingliste sollte es ja dann doch eine
> Antwort gegeben haben. Wenn nicht, dann sollte ich vielleicht doch mal
> über Qt nachdenken...

Keine Bange, gab noch andere Dinge dazwischen ;) Bin auch mehr zufällig 
darauf gestoßen, als ich herausfinden wollte, wie man feststellt ob zu 
einem event noch shift/ctrl gedrückt war. War dann damals wohl doch 
nicht dringlich genug, sich auf die Gtk-Mailingliste zu subscriben... An 
Qt konnte mich der Qt-Designer oder wie das Qt-Äquivalent zu Glade auch 
immer heißt nicht recht überzeugen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.