GtkBox avec choix exclusif ToggleButton
Bonjour,
J'ai constitué un GtkBox comportant plusieurs GtkToggleButton. Le mécanisme consiste à reproduire un choix exclusif dans cet ensemble. Quand on clique sur un ToggleButton, ce choix doit déactiver tous les autres ToggleButton à l'aide d'un CallBack. Il s'agit du même mécanisme existant dans des groupes de RadioButton déjà proposés par gtk. Mais ces derniers, pour des raisons fonctionnelles, ne conviennent pas aux besoins.
Pour cela, j'utilise le type de code suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
void
togglebutton1_clicked_cb (GtkToggleButton *button)
{
(void) toggle_choix_exclusif (GTK_WIDGET(button));
}
void
togglebutton2_clicked_cb (GtkToggleButton *button)
{
(void) toggle_choix_exclusif (GTK_WIDGET(button));
}
void
togglebutton3_clicked_cb (GtkToggleButton *button)
{
(void) toggle_choix_exclusif (GTK_WIDGET(button));
....
void
toggle_choix_exclusif (GtkWidget *widget)
{
GtkWidget *tmp_widget;
GList *children, *l;
/* Toujours 1 choix actif et 1 seul */
if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
/* Remonter au GtkBox contenant les différents ToggleButton */
tmp_widget = gtk_widget_get_parent(widget);
gtk_container_get_children (GTK_CONTAINER (tmp_widget));
for (l = children; l; l = l->next)
{
if (GTK_IS_TOGGLE_BUTTON(l->data))
{
/* Désactiver les autres ToggleButton */
if (l->data != widget)
{
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(l->data)))
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(l->data), FALSE);
}
}
}
g_list_free (children);
} |
Mon problème avec ce code provient du fait que le signal "toggled" ou "clicked" est apparemment activé à chaque fois que l'instruction gtk_toggle_button_set_active est exécutée. Ainsi le callback "toggle_choix_exclusif" est bouclé indéfiniment comme un traitement récursif indésirable.
J'aimerais savoir si quelqu'un parmi vous a une idée d'une solution à ce problème de signal traité par gtk/glade (glade_xml_signal_autoconnect).
Merci à l'avance et cordialement.
Signal de GtkToggleButton (suite)
Merci pour vos suggestions. Une autre solution que j'ai trouvée entretemps est d'intercepter le signal "released" à la place de "clicked" ou "toggled". Car ce signal, selon mes tests, est ignoré par "gtk_toggle_button_set_active". J'aimerais néanmoins savoir si cette solution, très simple, est-elle fiable par rapport aux solutions classiques que vous aviez suggérées:
g_signal_handlers_block_by_func
g_signal_handlers_unblock_by_func ...
Autrement dit pourquoi "gtk_toggle_button_set_active" intercepte-t-il systématiquement les signaux "clicked" et "toggled" mais non "released" ?
Merci à l'avance et cordialement.