GSList* gtk_radio_menu_item_get_group (GtkRadioMenuItem *radio_menu_item) { g_return_val_if_fail (GTK_IS_RADIO_MENU_ITEM (radio_menu_item), NULL); return radio_menu_item->group; }
/** * gtk_radio_menu_item_new_from_widget: * @group: An existing #GtkRadioMenuItem * * Creates a new #GtkRadioMenuItem adding it to the same group as @group. * * Return value: The new #GtkRadioMenuItem * * Since: 2.4 **/ GtkWidget * gtk_radio_menu_item_new_from_widget (GtkRadioMenuItem *group) { GSList *list = NULL; g_return_val_if_fail (GTK_IS_RADIO_MENU_ITEM (group), NULL); if (group) list = gtk_radio_menu_item_get_group (group); return gtk_radio_menu_item_new (list); }
/** * gtk_radio_menu_item_new_with_label_from_widget: * @group: an existing #GtkRadioMenuItem * @label: the text for the label * * Creates a new GtkRadioMenuItem whose child is a simple GtkLabel. * The new #GtkRadioMenuItem is added to the same group as @group. * * Return value: The new #GtkRadioMenuItem * * Since: 2.4 **/ GtkWidget * gtk_radio_menu_item_new_with_label_from_widget (GtkRadioMenuItem *group, const gchar *label) { GSList *list = NULL; g_return_val_if_fail (GTK_IS_RADIO_MENU_ITEM (group), NULL); if (group) list = gtk_radio_menu_item_get_group (group); return gtk_radio_menu_item_new_with_label (list, label); }
static void on_menu_item_activate(GtkMenuItem *menuitem, MenuInfo *menu_info) { if (!block_execute) { const MenuItem *menu_item; GtkWidget *widget = GTK_WIDGET(menuitem); for (menu_item = menu_info->items; menu_item->widget; menu_item++) if (menu_item->widget == widget) break; g_assert(menu_item->widget); if (!GTK_IS_RADIO_MENU_ITEM(menuitem) || gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) { menu_item_execute(menu_info, menu_item, TRUE); } } }
static void gtk_radio_menu_item_destroy (GtkObject *object) { GtkWidget *old_group_singleton = NULL; GtkRadioMenuItem *radio_menu_item; GtkRadioMenuItem *tmp_menu_item; GSList *tmp_list; gboolean was_in_group; g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (object)); radio_menu_item = GTK_RADIO_MENU_ITEM (object); was_in_group = radio_menu_item->group && radio_menu_item->group->next; radio_menu_item->group = g_slist_remove (radio_menu_item->group, radio_menu_item); if (radio_menu_item->group && !radio_menu_item->group->next) old_group_singleton = radio_menu_item->group->data; tmp_list = radio_menu_item->group; while (tmp_list) { tmp_menu_item = tmp_list->data; tmp_list = tmp_list->next; tmp_menu_item->group = radio_menu_item->group; } /* this radio menu item is no longer in the group */ radio_menu_item->group = NULL; if (old_group_singleton) g_signal_emit (old_group_singleton, group_changed_signal, 0); if (was_in_group) g_signal_emit (radio_menu_item, group_changed_signal, 0); if (GTK_OBJECT_CLASS (gtk_radio_menu_item_parent_class)->destroy) (* GTK_OBJECT_CLASS (gtk_radio_menu_item_parent_class)->destroy) (object); }
static void gtk_radio_menu_item_activate (GtkMenuItem *menu_item) { GtkRadioMenuItem *radio_menu_item; GtkCheckMenuItem *check_menu_item; GtkCheckMenuItem *tmp_menu_item; GSList *tmp_list; gint toggled; g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (menu_item)); radio_menu_item = GTK_RADIO_MENU_ITEM (menu_item); check_menu_item = GTK_CHECK_MENU_ITEM (menu_item); toggled = FALSE; if (check_menu_item->active) { tmp_menu_item = NULL; tmp_list = radio_menu_item->group; while (tmp_list) { tmp_menu_item = tmp_list->data; tmp_list = tmp_list->next; if (tmp_menu_item->active && (tmp_menu_item != check_menu_item)) break; tmp_menu_item = NULL; } if (tmp_menu_item) { toggled = TRUE; check_menu_item->active = !check_menu_item->active; } } else { toggled = TRUE; check_menu_item->active = !check_menu_item->active; tmp_list = radio_menu_item->group; while (tmp_list) { tmp_menu_item = tmp_list->data; tmp_list = tmp_list->next; if (tmp_menu_item->active && (tmp_menu_item != check_menu_item)) { gtk_menu_item_activate (GTK_MENU_ITEM (tmp_menu_item)); break; } } } if (toggled) gtk_check_menu_item_toggled (check_menu_item); gtk_widget_queue_draw (GTK_WIDGET (radio_menu_item)); }
void gtk_radio_menu_item_set_group (GtkRadioMenuItem *radio_menu_item, GSList *group) { GtkWidget *old_group_singleton = NULL; GtkWidget *new_group_singleton = NULL; g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (radio_menu_item)); g_return_if_fail (!g_slist_find (group, radio_menu_item)); if (radio_menu_item->group) { GSList *slist; radio_menu_item->group = g_slist_remove (radio_menu_item->group, radio_menu_item); if (radio_menu_item->group && !radio_menu_item->group->next) old_group_singleton = g_object_ref (radio_menu_item->group->data); for (slist = radio_menu_item->group; slist; slist = slist->next) { GtkRadioMenuItem *tmp_item; tmp_item = slist->data; tmp_item->group = radio_menu_item->group; } } if (group && !group->next) new_group_singleton = g_object_ref (group->data); radio_menu_item->group = g_slist_prepend (group, radio_menu_item); if (group) { GSList *slist; for (slist = group; slist; slist = slist->next) { GtkRadioMenuItem *tmp_item; tmp_item = slist->data; tmp_item->group = radio_menu_item->group; } } else { GTK_CHECK_MENU_ITEM (radio_menu_item)->active = TRUE; /* gtk_widget_set_state (GTK_WIDGET (radio_menu_item), GTK_STATE_ACTIVE); */ } g_object_ref (radio_menu_item); g_object_notify (G_OBJECT (radio_menu_item), "group"); g_signal_emit (radio_menu_item, group_changed_signal, 0); if (old_group_singleton) { g_signal_emit (old_group_singleton, group_changed_signal, 0); g_object_unref (old_group_singleton); } if (new_group_singleton) { g_signal_emit (new_group_singleton, group_changed_signal, 0); g_object_unref (new_group_singleton); } g_object_unref (radio_menu_item); }