X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkinvisible.c;h=27ca2502cbc66b18a5342a035c9d71d80591675d;hb=1865b9a1116d166c9abc5c75f5d01270574007c5;hp=93e86280dc97214b1a91932f9da3854b26f3b070;hpb=269d89c79c9e8e872b3599242d1e174afeab4b00;p=~andy%2Fgtk diff --git a/gtk/gtkinvisible.c b/gtk/gtkinvisible.c index 93e86280d..27ca2502c 100644 --- a/gtk/gtkinvisible.c +++ b/gtk/gtkinvisible.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* @@ -24,12 +22,32 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#include +#include "config.h" #include #include "gtkinvisible.h" +#include "gtkwidgetprivate.h" #include "gtkprivate.h" #include "gtkintl.h" -#include "gtkalias.h" + + +/** + * SECTION:gtkinvisible + * @Short_description: A widget which is not displayed + * @Title: GtkInvisible + * + * The #GtkInvisible widget is used internally in GTK+, and is probably not + * very useful for application developers. + * + * It is used for reliable pointer grabs and selection handling in the code + * for drag-and-drop. + */ + + +struct _GtkInvisiblePrivate +{ + GdkScreen *screen; + gboolean has_user_ref_count; +}; enum { PROP_0, @@ -37,12 +55,9 @@ enum { LAST_ARG }; -static void gtk_invisible_class_init (GtkInvisibleClass *klass); -static void gtk_invisible_init (GtkInvisible *invisible); -static void gtk_invisible_destroy (GtkObject *object); +static void gtk_invisible_destroy (GtkWidget *widget); static void gtk_invisible_realize (GtkWidget *widget); -static void gtk_invisible_style_set (GtkWidget *widget, - GtkStyle *previous_style); +static void gtk_invisible_style_updated (GtkWidget *widget); static void gtk_invisible_show (GtkWidget *widget); static void gtk_invisible_size_allocate (GtkWidget *widget, GtkAllocation *allocation); @@ -59,54 +74,23 @@ static GObject *gtk_invisible_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_params); -static GObjectClass *parent_class; - -GType -gtk_invisible_get_type (void) -{ - static GType invisible_type = 0; - - if (!invisible_type) - { - static const GTypeInfo invisible_info = - { - sizeof (GtkInvisibleClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gtk_invisible_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkInvisible), - 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_invisible_init, - }; - - invisible_type = g_type_register_static (GTK_TYPE_WIDGET, "GtkInvisible", - &invisible_info, 0); - } - - return invisible_type; -} +G_DEFINE_TYPE (GtkInvisible, gtk_invisible, GTK_TYPE_WIDGET) static void gtk_invisible_class_init (GtkInvisibleClass *class) { GObjectClass *gobject_class; - GtkObjectClass *object_class; GtkWidgetClass *widget_class; widget_class = (GtkWidgetClass*) class; - object_class = (GtkObjectClass*) class; gobject_class = (GObjectClass*) class; - parent_class = g_type_class_peek_parent (class); - widget_class->realize = gtk_invisible_realize; - widget_class->style_set = gtk_invisible_style_set; + widget_class->style_updated = gtk_invisible_style_updated; widget_class->show = gtk_invisible_show; widget_class->size_allocate = gtk_invisible_size_allocate; + widget_class->destroy = gtk_invisible_destroy; - object_class->destroy = gtk_invisible_destroy; gobject_class->set_property = gtk_invisible_set_property; gobject_class->get_property = gtk_invisible_get_property; gobject_class->constructor = gtk_invisible_constructor; @@ -118,39 +102,42 @@ gtk_invisible_class_init (GtkInvisibleClass *class) P_("The screen where this window will be displayed"), GDK_TYPE_SCREEN, GTK_PARAM_READWRITE)); + + g_type_class_add_private (class, sizeof (GtkInvisiblePrivate)); } static void gtk_invisible_init (GtkInvisible *invisible) { - GdkColormap *colormap; - - GTK_WIDGET_UNSET_FLAGS (invisible, GTK_NO_WINDOW); - GTK_WIDGET_SET_FLAGS (invisible, GTK_TOPLEVEL); + GtkInvisiblePrivate *priv; - g_object_ref (invisible); - gtk_object_sink (GTK_OBJECT (invisible)); + invisible->priv = G_TYPE_INSTANCE_GET_PRIVATE (invisible, + GTK_TYPE_INVISIBLE, + GtkInvisiblePrivate); + priv = invisible->priv; - invisible->has_user_ref_count = TRUE; - invisible->screen = gdk_screen_get_default (); - - colormap = _gtk_widget_peek_colormap (); - if (colormap) - gtk_widget_set_colormap (GTK_WIDGET (invisible), colormap); + gtk_widget_set_has_window (GTK_WIDGET (invisible), TRUE); + _gtk_widget_set_is_toplevel (GTK_WIDGET (invisible), TRUE); + + g_object_ref_sink (invisible); + + priv->has_user_ref_count = TRUE; + priv->screen = gdk_screen_get_default (); } static void -gtk_invisible_destroy (GtkObject *object) +gtk_invisible_destroy (GtkWidget *widget) { - GtkInvisible *invisible = GTK_INVISIBLE (object); - - if (invisible->has_user_ref_count) + GtkInvisible *invisible = GTK_INVISIBLE (widget); + GtkInvisiblePrivate *priv = invisible->priv; + + if (priv->has_user_ref_count) { - invisible->has_user_ref_count = FALSE; + priv->has_user_ref_count = FALSE; g_object_unref (invisible); } - GTK_OBJECT_CLASS (parent_class)->destroy (object); + GTK_WIDGET_CLASS (gtk_invisible_parent_class)->destroy (widget); } /** @@ -198,25 +185,28 @@ void gtk_invisible_set_screen (GtkInvisible *invisible, GdkScreen *screen) { + GtkInvisiblePrivate *priv; GtkWidget *widget; GdkScreen *previous_screen; gboolean was_realized; - + g_return_if_fail (GTK_IS_INVISIBLE (invisible)); g_return_if_fail (GDK_IS_SCREEN (screen)); - if (screen == invisible->screen) + priv = invisible->priv; + + if (screen == priv->screen) return; widget = GTK_WIDGET (invisible); - previous_screen = invisible->screen; - was_realized = GTK_WIDGET_REALIZED (invisible); + previous_screen = priv->screen; + was_realized = gtk_widget_get_realized (widget); if (was_realized) gtk_widget_unrealize (widget); - - invisible->screen = screen; + + priv->screen = screen; if (screen != previous_screen) _gtk_widget_propagate_screen_changed (widget, previous_screen); g_object_notify (G_OBJECT (invisible), "screen"); @@ -231,7 +221,7 @@ gtk_invisible_set_screen (GtkInvisible *invisible, * * Returns the #GdkScreen object associated with @invisible * - * Return value: the associated #GdkScreen. + * Return value: (transfer none): the associated #GdkScreen. * * Since: 2.2 **/ @@ -239,17 +229,23 @@ GdkScreen * gtk_invisible_get_screen (GtkInvisible *invisible) { g_return_val_if_fail (GTK_IS_INVISIBLE (invisible), NULL); - - return invisible->screen; + + return invisible->priv->screen; } static void gtk_invisible_realize (GtkWidget *widget) { + GdkWindow *parent; + GdkWindow *window; GdkWindowAttr attributes; gint attributes_mask; - GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + gtk_widget_set_realized (widget, TRUE); + + parent = gtk_widget_get_parent_window (widget); + if (parent == NULL) + parent = gtk_widget_get_root_window (widget); attributes.x = -100; attributes.y = -100; @@ -262,17 +258,13 @@ gtk_invisible_realize (GtkWidget *widget) attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_NOREDIR; - widget->window = gdk_window_new (gtk_widget_get_root_window (widget), - &attributes, attributes_mask); - - gdk_window_set_user_data (widget->window, widget); - - widget->style = gtk_style_attach (widget->style, widget->window); + window = gdk_window_new (parent, &attributes, attributes_mask); + gtk_widget_set_window (widget, window); + gtk_widget_register_window (widget, window); } static void -gtk_invisible_style_set (GtkWidget *widget, - GtkStyle *previous_style) +gtk_invisible_style_updated (GtkWidget *widget) { /* Don't chain up to parent implementation */ } @@ -280,16 +272,16 @@ gtk_invisible_style_set (GtkWidget *widget, static void gtk_invisible_show (GtkWidget *widget) { - GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE); + _gtk_widget_set_visible_flag (widget, TRUE); gtk_widget_map (widget); } static void gtk_invisible_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) + GtkAllocation *allocation) { - widget->allocation = *allocation; -} + gtk_widget_set_allocation (widget, allocation); +} static void @@ -318,11 +310,12 @@ gtk_invisible_get_property (GObject *object, GParamSpec *pspec) { GtkInvisible *invisible = GTK_INVISIBLE (object); + GtkInvisiblePrivate *priv = invisible->priv; switch (prop_id) { case PROP_SCREEN: - g_value_set_object (value, invisible->screen); + g_value_set_object (value, priv->screen); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -340,14 +333,11 @@ gtk_invisible_constructor (GType type, { GObject *object; - object = (* G_OBJECT_CLASS (parent_class)->constructor) (type, - n_construct_properties, - construct_params); + object = G_OBJECT_CLASS (gtk_invisible_parent_class)->constructor (type, + n_construct_properties, + construct_params); gtk_widget_realize (GTK_WIDGET (object)); return object; } - -#define __GTK_INVISIBLE_C__ -#include "gtkaliasdef.c"