summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2004-02-26 18:58:26 +0000
committerOwen Taylor <otaylor@src.gnome.org>2004-02-26 18:58:26 +0000
commit0be6a2bb07401b6b6d064d78d5eeb97eec9dd3ec (patch)
tree5de34749639da63ec14adf4938f0b6901dfdfd20
parentd2e3514d63bdc2b76bfb78ea0f833c7f4ddf23ea (diff)
downloadgdk-pixbuf-0be6a2bb07401b6b6d064d78d5eeb97eec9dd3ec.tar.gz
Add a ::group-changed signal emitted when the radio button/menu item is
Wed Feb 25 19:11:31 2004 Owen Taylor <otaylor@redhat.com> * gtk/gtkradiobutton.[ch] gtk/gtkradiomenuitem.[ch]: Add a ::group-changed signal emitted when the radio button/menu item is moved from one group of radio buttons to another. (#79563, based partially on a patch from Padraig O'Briain)
-rw-r--r--ChangeLog7
-rw-r--r--ChangeLog.pre-2-107
-rw-r--r--ChangeLog.pre-2-47
-rw-r--r--ChangeLog.pre-2-67
-rw-r--r--ChangeLog.pre-2-87
-rw-r--r--gtk/gtkradiobutton.c64
-rw-r--r--gtk/gtkradiobutton.h4
-rw-r--r--gtk/gtkradiomenuitem.c63
-rw-r--r--gtk/gtkradiomenuitem.h4
9 files changed, 164 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index a4d61f2dc..6e7cf46d5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Feb 25 19:11:31 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkradiobutton.[ch] gtk/gtkradiomenuitem.[ch]: Add a
+ ::group-changed signal emitted when the radio button/menu item
+ is moved from one group of radio buttons to another.
+ (#79563, based partially on a patch from Padraig O'Briain)
+
Thu Feb 26 13:23:47 2004 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkwindow-x11.c (set_text_property): Use the right
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index a4d61f2dc..6e7cf46d5 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,10 @@
+Wed Feb 25 19:11:31 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkradiobutton.[ch] gtk/gtkradiomenuitem.[ch]: Add a
+ ::group-changed signal emitted when the radio button/menu item
+ is moved from one group of radio buttons to another.
+ (#79563, based partially on a patch from Padraig O'Briain)
+
Thu Feb 26 13:23:47 2004 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkwindow-x11.c (set_text_property): Use the right
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index a4d61f2dc..6e7cf46d5 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,10 @@
+Wed Feb 25 19:11:31 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkradiobutton.[ch] gtk/gtkradiomenuitem.[ch]: Add a
+ ::group-changed signal emitted when the radio button/menu item
+ is moved from one group of radio buttons to another.
+ (#79563, based partially on a patch from Padraig O'Briain)
+
Thu Feb 26 13:23:47 2004 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkwindow-x11.c (set_text_property): Use the right
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index a4d61f2dc..6e7cf46d5 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,10 @@
+Wed Feb 25 19:11:31 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkradiobutton.[ch] gtk/gtkradiomenuitem.[ch]: Add a
+ ::group-changed signal emitted when the radio button/menu item
+ is moved from one group of radio buttons to another.
+ (#79563, based partially on a patch from Padraig O'Briain)
+
Thu Feb 26 13:23:47 2004 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkwindow-x11.c (set_text_property): Use the right
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index a4d61f2dc..6e7cf46d5 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,10 @@
+Wed Feb 25 19:11:31 2004 Owen Taylor <otaylor@redhat.com>
+
+ * gtk/gtkradiobutton.[ch] gtk/gtkradiomenuitem.[ch]: Add a
+ ::group-changed signal emitted when the radio button/menu item
+ is moved from one group of radio buttons to another.
+ (#79563, based partially on a patch from Padraig O'Briain)
+
Thu Feb 26 13:23:47 2004 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkwindow-x11.c (set_text_property): Use the right
diff --git a/gtk/gtkradiobutton.c b/gtk/gtkradiobutton.c
index f850ffaa4..bbb5e6c21 100644
--- a/gtk/gtkradiobutton.c
+++ b/gtk/gtkradiobutton.c
@@ -25,6 +25,7 @@
*/
#include "gtklabel.h"
+#include "gtkmarshalers.h"
#include "gtkradiobutton.h"
#include "gtkintl.h"
@@ -54,6 +55,7 @@ static void gtk_radio_button_get_property (GObject *object,
static GtkCheckButtonClass *parent_class = NULL;
+static guint group_changed_signal = 0;
GType
gtk_radio_button_get_type (void)
@@ -117,6 +119,27 @@ gtk_radio_button_class_init (GtkRadioButtonClass *class)
button_class->clicked = gtk_radio_button_clicked;
check_button_class->draw_indicator = gtk_radio_button_draw_indicator;
+
+ class->group_changed = NULL;
+
+ /**
+ * GtkStyle::group-changed:
+ * @style: the object which received the signal
+ *
+ * Emitted when the group of radio buttons that a radio button belongs
+ * to changes. This is emitted when a radio button switches from
+ * being alone to being part of a group of 2 or more buttons, or
+ * vice-versa, and when a buttton is moved from one group of 2 or
+ * more buttons to a different one, but not when the composition
+ * of the group that a button belongs to changes.
+ */
+ group_changed_signal = g_signal_new ("group-changed",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GtkRadioButtonClass, group_changed),
+ NULL, NULL,
+ _gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}
static void
@@ -184,15 +207,21 @@ void
gtk_radio_button_set_group (GtkRadioButton *radio_button,
GSList *group)
{
+ GtkWidget *old_group_singleton = NULL;
+ GtkWidget *new_group_singleton = NULL;
+
g_return_if_fail (GTK_IS_RADIO_BUTTON (radio_button));
g_return_if_fail (!g_slist_find (group, radio_button));
if (radio_button->group)
{
GSList *slist;
-
+
radio_button->group = g_slist_remove (radio_button->group, radio_button);
+ if (radio_button->group && !radio_button->group->next)
+ old_group_singleton = g_object_ref (radio_button->group->data);
+
for (slist = radio_button->group; slist; slist = slist->next)
{
GtkRadioButton *tmp_button;
@@ -203,6 +232,9 @@ gtk_radio_button_set_group (GtkRadioButton *radio_button,
}
}
+ if (group && !group->next)
+ new_group_singleton = g_object_ref (group->data);
+
radio_button->group = g_slist_prepend (group, radio_button);
if (group)
@@ -219,7 +251,23 @@ gtk_radio_button_set_group (GtkRadioButton *radio_button,
}
}
+ g_object_ref (radio_button);
+
+ g_signal_emit (radio_button, 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);
+ }
+
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button), group == NULL);
+
+ g_object_unref (radio_button);
}
GtkWidget*
@@ -329,13 +377,20 @@ gtk_radio_button_get_group (GtkRadioButton *radio_button)
static void
gtk_radio_button_destroy (GtkObject *object)
{
+ GtkWidget *old_group_singleton = NULL;
GtkRadioButton *radio_button;
GtkRadioButton *tmp_button;
GSList *tmp_list;
-
+ gboolean was_in_group;
+
radio_button = GTK_RADIO_BUTTON (object);
+ was_in_group = radio_button->group && radio_button->group->next;
+
radio_button->group = g_slist_remove (radio_button->group, radio_button);
+ if (radio_button->group && !radio_button->group->next)
+ old_group_singleton = radio_button->group->data;
+
tmp_list = radio_button->group;
while (tmp_list)
@@ -348,6 +403,11 @@ gtk_radio_button_destroy (GtkObject *object)
/* this button is no longer in the group */
radio_button->group = NULL;
+
+ if (old_group_singleton)
+ g_signal_emit (old_group_singleton, group_changed_signal, 0);
+ if (was_in_group)
+ g_signal_emit (radio_button, group_changed_signal, 0);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
diff --git a/gtk/gtkradiobutton.h b/gtk/gtkradiobutton.h
index 6efa49059..0455686db 100644
--- a/gtk/gtkradiobutton.h
+++ b/gtk/gtkradiobutton.h
@@ -59,8 +59,10 @@ struct _GtkRadioButtonClass
{
GtkCheckButtonClass parent_class;
+ /* Signals */
+ void (*group_changed) (void);
+
/* Padding for future expansion */
- void (*_gtk_reserved1) (void);
void (*_gtk_reserved2) (void);
void (*_gtk_reserved3) (void);
void (*_gtk_reserved4) (void);
diff --git a/gtk/gtkradiomenuitem.c b/gtk/gtkradiomenuitem.c
index b0bcd2d0e..771f0aca7 100644
--- a/gtk/gtkradiomenuitem.c
+++ b/gtk/gtkradiomenuitem.c
@@ -25,6 +25,7 @@
*/
#include "gtkaccellabel.h"
+#include "gtkmarshalers.h"
#include "gtkradiomenuitem.h"
@@ -35,6 +36,8 @@ static void gtk_radio_menu_item_activate (GtkMenuItem *menu_item
static GtkCheckMenuItemClass *parent_class = NULL;
+static guint group_changed_signal = 0;
+
GType
gtk_radio_menu_item_get_type (void)
{
@@ -79,15 +82,21 @@ 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;
@@ -98,6 +107,9 @@ gtk_radio_menu_item_set_group (GtkRadioMenuItem *radio_menu_item,
}
}
+ 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)
@@ -119,6 +131,22 @@ gtk_radio_menu_item_set_group (GtkRadioMenuItem *radio_menu_item,
/* gtk_widget_set_state (GTK_WIDGET (radio_menu_item), GTK_STATE_ACTIVE);
*/
}
+
+ g_object_ref (radio_menu_item);
+
+ 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);
}
GtkWidget*
@@ -271,6 +299,25 @@ gtk_radio_menu_item_class_init (GtkRadioMenuItemClass *klass)
object_class->destroy = gtk_radio_menu_item_destroy;
menu_item_class->activate = gtk_radio_menu_item_activate;
+
+ /**
+ * GtkStyle::group-changed:
+ * @style: the object which received the signal
+ *
+ * Emitted when the group of radio menu items that a radio menu item belongs
+ * to changes. This is emitted when a radio menu item switches from
+ * being alone to being part of a group of 2 or more menu items, or
+ * vice-versa, and when a buttton is moved from one group of 2 or
+ * more menu items to a different one, but not when the composition
+ * of the group that a menu item belongs to changes.
+ */
+ group_changed_signal = g_signal_new ("group-changed",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GtkRadioMenuItemClass, group_changed),
+ NULL, NULL,
+ _gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}
static void
@@ -283,16 +330,23 @@ gtk_radio_menu_item_init (GtkRadioMenuItem *radio_menu_item)
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)
@@ -306,6 +360,11 @@ gtk_radio_menu_item_destroy (GtkObject *object)
/* 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 (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
diff --git a/gtk/gtkradiomenuitem.h b/gtk/gtkradiomenuitem.h
index 5dff292d8..d4a112bac 100644
--- a/gtk/gtkradiomenuitem.h
+++ b/gtk/gtkradiomenuitem.h
@@ -55,8 +55,10 @@ struct _GtkRadioMenuItemClass
{
GtkCheckMenuItemClass parent_class;
+ /* Signals */
+ void (*group_changed) (void);
+
/* Padding for future expansion */
- void (*_gtk_reserved1) (void);
void (*_gtk_reserved2) (void);
void (*_gtk_reserved3) (void);
void (*_gtk_reserved4) (void);