X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkinvisible.c;h=27ca2502cbc66b18a5342a035c9d71d80591675d;hb=fd51c8f5e9d6fb68c8e81b9b1e2ab80931f963f0;hp=0b23fd0853fbba55a1caeeee7d092246485526de;hpb=28c2b0a31f3f688cec4960063de37df004ad0112;p=~andy%2Fgtk diff --git a/gtk/gtkinvisible.c b/gtk/gtkinvisible.c index 0b23fd085..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,23 +22,42 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ +#include "config.h" #include -#include "gtksignal.h" #include "gtkinvisible.h" +#include "gtkwidgetprivate.h" +#include "gtkprivate.h" #include "gtkintl.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, PROP_SCREEN, 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); @@ -57,52 +74,23 @@ static GObject *gtk_invisible_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_params); -GObjectClass *parent_class; - -GtkType -gtk_invisible_get_type (void) -{ - static GtkType invisible_type = 0; - - if (!invisible_type) - { - static const GtkTypeInfo invisible_info = - { - "GtkInvisible", - sizeof (GtkInvisible), - sizeof (GtkInvisibleClass), - (GtkClassInitFunc) gtk_invisible_class_init, - (GtkObjectInitFunc) gtk_invisible_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - invisible_type = gtk_type_unique (GTK_TYPE_WIDGET, &invisible_info); - } - - 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; @@ -110,41 +98,46 @@ gtk_invisible_class_init (GtkInvisibleClass *class) g_object_class_install_property (gobject_class, PROP_SCREEN, g_param_spec_object ("screen", - _("Screen"), - _("The screen where this window will be displayed."), + P_("Screen"), + P_("The screen where this window will be displayed"), GDK_TYPE_SCREEN, - G_PARAM_READWRITE)); + 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; - gtk_widget_ref (GTK_WIDGET (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; - gtk_widget_unref (GTK_WIDGET (invisible)); + priv->has_user_ref_count = FALSE; + g_object_unref (invisible); } + + GTK_WIDGET_CLASS (gtk_invisible_parent_class)->destroy (widget); } /** @@ -155,6 +148,8 @@ gtk_invisible_destroy (GtkObject *object) * Creates a new #GtkInvisible object for a specified screen * * Return value: a newly created #GtkInvisible object + * + * Since: 2.2 **/ GtkWidget* gtk_invisible_new_for_screen (GdkScreen *screen) @@ -183,29 +178,41 @@ gtk_invisible_new (void) * @screen: a #GdkScreen. * * Sets the #GdkScreen where the #GtkInvisible object will be displayed. + * + * Since: 2.2 **/ 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; - was_realized = GTK_WIDGET_REALIZED (invisible); + widget = GTK_WIDGET (invisible); + + previous_screen = priv->screen; + was_realized = gtk_widget_get_realized (widget); if (was_realized) - gtk_widget_unrealize (GTK_WIDGET (invisible)); - - invisible->screen = screen; + gtk_widget_unrealize (widget); + + priv->screen = screen; + if (screen != previous_screen) + _gtk_widget_propagate_screen_changed (widget, previous_screen); g_object_notify (G_OBJECT (invisible), "screen"); if (was_realized) - gtk_widget_realize (GTK_WIDGET (invisible)); + gtk_widget_realize (widget); } /** @@ -214,23 +221,31 @@ 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 **/ 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; @@ -243,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 */ } @@ -261,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 @@ -299,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); @@ -321,12 +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; } -