Changes to make cross-process merging feasible:

2003-09-21  Matthias Clasen  <maclas@gmx.de>

	Changes to make cross-process merging feasible:

	* gtk/gtkuimanager.[hc]: Add a readonly "ui" property which holds the
	merged UI definition. Remove the "changed" signal, since its role
	is now filled by "notify::ui". Instead add a "actions-changed" signal
	which gets emitted when the set of actions changes.

	* gtk/gtktoggleactionprivate.h:
	* gtk/gtktoggleaction.[hc] (gtk_toggle_action_[sg]et_draw_as_radio):
	Add a "draw_as_radio" property to toggle actions so that they can be
	used as proxies for radio actions much like the "draw_as_radio"
	property on check menu items enables them to operate as proxies for
	radio actions.

	Prevent the "show_all" trap for action-based menus (see
	http://mail.gnome.org/archives/gtk-devel-list/2003-September/
	msg00260.html):

	* gtk/gtkmenu.c (gtk_menu_{hide,show}_all): Remove g_return_if_fail()
	calls from static functions.

	* gtk/gtkuimanager.c (update_node):
	* gtk/gtkaction.c (connect_proxy): Set "no_show_all" on constructed
	widgets whose visibility is externally controlled.

	* gtk/gtkwidget.[hc] (gtk_widget_[gs]et_no_show_all): Add a boolean
	"no_show_all" property with setter and getter. When TRUE, it keeps
	gtk_widget_{hide,show}_all() from modifying the visibility of the
	widget and its children.
This commit is contained in:
Matthias Clasen
2003-09-21 22:04:48 +00:00
committed by Matthias Clasen
parent 8be8d7f61d
commit d381967d5c
16 changed files with 424 additions and 34 deletions

View File

@ -138,7 +138,8 @@ enum {
PROP_COMPOSITE_CHILD,
PROP_STYLE,
PROP_EVENTS,
PROP_EXTENSION_EVENTS
PROP_EXTENSION_EVENTS,
PROP_NO_SHOW_ALL
};
typedef struct _GtkStateData GtkStateData;
@ -521,6 +522,13 @@ gtk_widget_class_init (GtkWidgetClass *klass)
GDK_TYPE_EXTENSION_MODE,
GDK_EXTENSION_EVENTS_NONE,
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_NO_SHOW_ALL,
g_param_spec_boolean ("no_show_all",
_("No show all"),
_("Whether gtk_widget_show_all() should not affect this widget"),
FALSE,
G_PARAM_READWRITE));
widget_signals[SHOW] =
g_signal_new ("show",
G_TYPE_FROM_CLASS (gobject_class),
@ -1453,6 +1461,9 @@ gtk_widget_set_property (GObject *object,
case PROP_EXTENSION_EVENTS:
gtk_widget_set_extension_events (widget, g_value_get_enum (value));
break;
case PROP_NO_SHOW_ALL:
gtk_widget_set_no_show_all (widget, g_value_get_boolean (value));
break;
default:
break;
}
@ -1544,6 +1555,9 @@ gtk_widget_get_property (GObject *object,
else
g_value_set_enum (value, (GdkExtensionMode) *modep);
break;
case PROP_NO_SHOW_ALL:
g_value_set_boolean (value, gtk_widget_get_no_show_all (widget));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -2052,6 +2066,9 @@ gtk_widget_show_all (GtkWidget *widget)
g_return_if_fail (GTK_IS_WIDGET (widget));
if ((GTK_WIDGET_FLAGS (widget) & GTK_NO_SHOW_ALL) != 0)
return;
class = GTK_WIDGET_GET_CLASS (widget);
if (class->show_all)
@ -2071,6 +2088,9 @@ gtk_widget_hide_all (GtkWidget *widget)
g_return_if_fail (GTK_IS_WIDGET (widget));
if ((GTK_WIDGET_FLAGS (widget) & GTK_NO_SHOW_ALL) != 0)
return;
class = GTK_WIDGET_GET_CLASS (widget);
if (class->hide_all)
@ -7210,3 +7230,55 @@ gtk_widget_get_clipboard (GtkWidget *widget, GdkAtom selection)
return gtk_clipboard_get_for_display (gtk_widget_get_display (widget),
selection);
}
/**
* gtk_widget_get_no_show_all:
* @widget: a #GtkWidget
*
* Returns the current value of the "no_show_all" property, which determines
* whether calls to gtk_widget_show_all() and gtk_widget_hide_all()
* will affect this widget.
*
* Return value: the current value of the "no_show_all" property.
*
* Since: 2.4
**/
gboolean
gtk_widget_get_no_show_all (GtkWidget *widget)
{
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
return (GTK_WIDGET_FLAGS (widget) & GTK_NO_SHOW_ALL) != 0;
}
/**
* gtk_widget_set_no_show_all:
* @widget: a #GtkWidget
* @no_show_all: the new value for the "no_show_all" property
*
* Sets the "no_show_all" property, which determines whether calls to
* gtk_widget_show_all() and gtk_widget_hide_all() will affect this widget.
*
* This is mostly for use in constructing widget hierarchies with externally
* controlled visibility, see #GtkUIManager.
*
* Since: 2.4
**/
void
gtk_widget_set_no_show_all (GtkWidget *widget,
gboolean no_show_all)
{
g_return_if_fail (GTK_IS_WIDGET (widget));
no_show_all = (no_show_all != FALSE);
if (no_show_all == ((GTK_WIDGET_FLAGS (widget) & GTK_NO_SHOW_ALL) != 0))
return;
if (no_show_all)
GTK_WIDGET_SET_FLAGS (widget, GTK_NO_SHOW_ALL);
else
GTK_WIDGET_UNSET_FLAGS (widget, GTK_NO_SHOW_ALL);
g_object_notify (G_OBJECT (widget), "no_show_all");
}