[epiphany] Sync with upstream GeditOverlay code
- From: Xan Lopez <xan src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany] Sync with upstream GeditOverlay code
- Date: Fri, 11 Feb 2011 21:55:38 +0000 (UTC)
commit e65e2873a6d8407e9a8801e8667085ec10fa261f
Author: Xan Lopez <xan gnome org>
Date: Fri Feb 11 22:54:43 2011 +0100
Sync with upstream GeditOverlay code
embed/ephy-embed.c | 2 +-
lib/widgets/Makefile.am | 23 ++-
lib/widgets/gedit-enum-types.c.template | 39 ++++
lib/widgets/gedit-enum-types.h.template | 27 +++
lib/widgets/gedit-overlay.c | 259 +++++++++++++-----------
lib/widgets/gedit-overlay.h | 36 ++--
lib/widgets/gedit-theatrics-animated-widget.c | 263 -------------------------
lib/widgets/gedit-theatrics-animated-widget.h | 64 ------
8 files changed, 244 insertions(+), 469 deletions(-)
---
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index ee0eb72..e0d230e 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -879,7 +879,7 @@ ephy_embed_constructed (GObject *object)
frame = gtk_frame_new (NULL);
gtk_widget_show (frame);
gtk_container_add (GTK_CONTAINER (frame), priv->statusbar_label);
- gedit_overlay_add (GEDIT_OVERLAY (overlay), frame, GTK_ORIENTATION_HORIZONTAL, GDK_GRAVITY_SOUTH_WEST, 0, TRUE);
+ gedit_overlay_add (GEDIT_OVERLAY (overlay), frame, GEDIT_OVERLAY_CHILD_POSITION_SOUTH_WEST, 0);
paned = GTK_WIDGET (embed->priv->paned);
diff --git a/lib/widgets/Makefile.am b/lib/widgets/Makefile.am
index f41adac..f1e2f0d 100644
--- a/lib/widgets/Makefile.am
+++ b/lib/widgets/Makefile.am
@@ -17,11 +17,13 @@ libephywidgets_la_SOURCES = \
ephy-zoom-control.h \
gedit-overlay.c \
gedit-overlay.h \
- gedit-theatrics-animated-widget.c \
- gedit-theatrics-animated-widget.h
+ gedit-overlay-child.c \
+ gedit-overlay-child.h \
+ $(BUILT_SOURCES)
libephywidgets_la_CPPFLAGS = \
-I$(top_builddir)/lib \
+ -I$(top_builddir)/lib/widgets \
-I$(top_srcdir)/lib \
-I$(top_srcdir)/lib/egg \
-DSHARE_DIR=\"$(pkgdatadir)\" \
@@ -30,3 +32,20 @@ libephywidgets_la_CPPFLAGS = \
libephywidgets_la_CFLAGS = \
$(DEPENDENCIES_CFLAGS) \
$(AM_CFLAGS)
+
+BUILT_SOURCES = \
+ gedit-enum-types.c \
+ gedit-enum-types.h
+
+ENUM_TYPES = \
+ gedit-overlay-child.h
+
+gedit-enum-types.h: gedit-enum-types.h.template $(ENUM_TYPES) $(GLIB_MKENUMS)
+ $(AM_V_GEN)(cd $(srcdir) && $(GLIB_MKENUMS) --template gedit-enum-types.h.template $(ENUM_TYPES)) > $@
+
+gedit-enum-types.c: gedit-enum-types.c.template $(ENUM_TYPES) $(GLIB_MKENUMS)
+ $(AM_V_GEN)(cd $(srcdir) && $(GLIB_MKENUMS) --template gedit-enum-types.c.template $(ENUM_TYPES)) > $@
+
+EXTRA_DIST = \
+ gedit-enum-types.c.template \
+ gedit-enum-types.h.template
diff --git a/lib/widgets/gedit-enum-types.c.template b/lib/widgets/gedit-enum-types.c.template
new file mode 100644
index 0000000..7a67ac7
--- /dev/null
+++ b/lib/widgets/gedit-enum-types.c.template
@@ -0,0 +1,39 @@
+/*** BEGIN file-header ***/
+#include "gedit-enum-types.h"
+
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
+/* enumerations from "@filename@" */
+#include "@filename@"
+
+/*** END file-production ***/
+
+/*** BEGIN value-header ***/
+GType
+ enum_name@_get_type (void)
+{
+ static GType the_type = 0;
+
+ if (the_type == 0)
+ {
+ static const G Type@Value values[] = {
+/*** END value-header ***/
+
+/*** BEGIN value-production ***/
+ { @VALUENAME@,
+ "@VALUENAME@",
+ "@valuenick@" },
+/*** END value-production ***/
+
+/*** BEGIN value-tail ***/
+ { 0, NULL, NULL }
+ };
+ the_type = g_ type@_register_static (
+ g_intern_static_string ("@EnumName@"),
+ values);
+ }
+ return the_type;
+}
+
+/*** END value-tail ***/
diff --git a/lib/widgets/gedit-enum-types.h.template b/lib/widgets/gedit-enum-types.h.template
new file mode 100644
index 0000000..78f39ce
--- /dev/null
+++ b/lib/widgets/gedit-enum-types.h.template
@@ -0,0 +1,27 @@
+/*** BEGIN file-header ***/
+#ifndef __GEDIT_ENUM_TYPES_H__
+#define __GEDIT_ENUM_TYPES_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
+/* Enumerations from "@filename@" */
+
+/*** END file-production ***/
+
+/*** BEGIN enumeration-production ***/
+#define GEDIT_TYPE_ ENUMSHORT@ (@enum_name _get_type())
+GType @enum_name _get_type (void) G_GNUC_CONST;
+
+/*** END enumeration-production ***/
+
+/*** BEGIN file-tail ***/
+G_END_DECLS
+
+#endif /* __GEDIT_ENUM_TYPES_H__ */
+/*** END file-tail ***/
+
diff --git a/lib/widgets/gedit-overlay.c b/lib/widgets/gedit-overlay.c
index 1972ada..7cff417 100644
--- a/lib/widgets/gedit-overlay.c
+++ b/lib/widgets/gedit-overlay.c
@@ -2,41 +2,30 @@
* gedit-overlay.c
* This file is part of gedit
*
- * Copyright (C) 2010 - Ignacio Casal Quinteiro
+ * Copyright (C) 2011 - Ignacio Casal Quinteiro
*
* Based on Mike Krüger <mkrueger novell com> work.
*
- * gedit is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
+ * gedit is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
* gedit is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with gedit; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "gedit-overlay.h"
-#include "gedit-theatrics-animated-widget.h"
+#include "gedit-overlay-child.h"
#define GEDIT_OVERLAY_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GEDIT_TYPE_OVERLAY, GeditOverlayPrivate))
-typedef struct _OverlayChild
-{
- GtkWidget *child;
- GdkGravity gravity;
- guint offset;
-
- guint fixed_position : 1;
- guint is_animated : 1;
-} OverlayChild;
-
struct _GeditOverlayPrivate
{
GtkWidget *main_widget;
@@ -70,31 +59,13 @@ static void gedit_overlay_set_vadjustment (GeditOverlay *overlay,
GtkAdjustment *adjustment);
G_DEFINE_TYPE_WITH_CODE (GeditOverlay, gedit_overlay, GTK_TYPE_CONTAINER,
- G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL))
-
-static void
-free_container_child (OverlayChild *child)
-{
- g_slice_free (OverlayChild, child);
-}
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL))
static void
add_toplevel_widget (GeditOverlay *overlay,
- GtkWidget *widget,
- gboolean fixed_position,
- gboolean is_animated,
- GdkGravity gravity,
- guint offset)
+ GtkWidget *child)
{
- OverlayChild *child = g_slice_new (OverlayChild);
-
- child->child = widget;
- child->gravity = gravity;
- child->fixed_position = fixed_position;
- child->is_animated = is_animated;
- child->offset = offset;
-
- gtk_widget_set_parent (widget, GTK_WIDGET (overlay));
+ gtk_widget_set_parent (child, GTK_WIDGET (overlay));
overlay->priv->children = g_slist_append (overlay->priv->children,
child);
@@ -199,9 +170,7 @@ gedit_overlay_set_property (GObject *object,
case PROP_MAIN_WIDGET:
overlay->priv->main_widget = g_value_get_object (value);
add_toplevel_widget (overlay,
- overlay->priv->main_widget,
- TRUE, FALSE, GDK_GRAVITY_STATIC,
- 0);
+ overlay->priv->main_widget);
break;
case PROP_HADJUSTMENT:
@@ -287,7 +256,7 @@ gedit_overlay_get_preferred_width (GtkWidget *widget,
gint *natural)
{
GeditOverlayPrivate *priv = GEDIT_OVERLAY (widget)->priv;
- OverlayChild *child;
+ GtkWidget *child;
GSList *children;
gint child_min, child_nat;
@@ -298,10 +267,10 @@ gedit_overlay_get_preferred_width (GtkWidget *widget,
{
child = children->data;
- if (!gtk_widget_get_visible (child->child))
+ if (!gtk_widget_get_visible (child))
continue;
- gtk_widget_get_preferred_width (child->child, &child_min, &child_nat);
+ gtk_widget_get_preferred_width (child, &child_min, &child_nat);
*minimum = MAX (*minimum, child_min);
*natural = MAX (*natural, child_nat);
@@ -314,7 +283,7 @@ gedit_overlay_get_preferred_height (GtkWidget *widget,
gint *natural)
{
GeditOverlayPrivate *priv = GEDIT_OVERLAY (widget)->priv;
- OverlayChild *child;
+ GtkWidget *child;
GSList *children;
gint child_min, child_nat;
@@ -325,10 +294,10 @@ gedit_overlay_get_preferred_height (GtkWidget *widget,
{
child = children->data;
- if (!gtk_widget_get_visible (child->child))
+ if (!gtk_widget_get_visible (child))
continue;
- gtk_widget_get_preferred_height (child->child, &child_min, &child_nat);
+ gtk_widget_get_preferred_height (child, &child_min, &child_nat);
*minimum = MAX (*minimum, child_min);
*natural = MAX (*natural, child_nat);
@@ -343,29 +312,31 @@ set_children_positions (GeditOverlay *overlay)
for (l = overlay->priv->children; l != NULL; l = g_slist_next (l))
{
GeditOverlayPrivate *priv = overlay->priv;
- OverlayChild *child = (OverlayChild *)l->data;
+ GtkWidget *child = GTK_WIDGET (l->data);
GtkRequisition req;
GtkAllocation alloc;
+ guint offset;
- if (child->child == priv->main_widget)
+ if (child == priv->main_widget)
continue;
- gtk_widget_get_preferred_size (child->child, &req, NULL);
+ gtk_widget_get_preferred_size (child, &req, NULL);
+ offset = gedit_overlay_child_get_offset (GEDIT_OVERLAY_CHILD (child));
- /* FIXME: Add all the gravities here */
- switch (child->gravity)
+ /* FIXME: Add all the positions here */
+ switch (gedit_overlay_child_get_position (GEDIT_OVERLAY_CHILD (child)))
{
/* The gravity is treated as position and not as a gravity */
- case GDK_GRAVITY_NORTH_EAST:
- alloc.x = priv->main_alloc.width - req.width - child->offset;
+ case GEDIT_OVERLAY_CHILD_POSITION_NORTH_EAST:
+ alloc.x = priv->main_alloc.width - req.width - offset;
alloc.y = 0;
break;
- case GDK_GRAVITY_NORTH_WEST:
- alloc.x = child->offset;
+ case GEDIT_OVERLAY_CHILD_POSITION_NORTH_WEST:
+ alloc.x = offset;
alloc.y = 0;
break;
- case GDK_GRAVITY_SOUTH_WEST:
- alloc.x = child->offset;
+ case GEDIT_OVERLAY_CHILD_POSITION_SOUTH_WEST:
+ alloc.x = offset;
alloc.y = priv->main_alloc.height - req.height;
break;
default:
@@ -373,7 +344,7 @@ set_children_positions (GeditOverlay *overlay)
alloc.y = 0;
}
- if (!child->fixed_position)
+ if (!gedit_overlay_child_get_fixed (GEDIT_OVERLAY_CHILD (child)))
{
alloc.x *= gtk_adjustment_get_value (priv->hadjustment);
alloc.y *= gtk_adjustment_get_value (priv->vadjustment);
@@ -382,7 +353,7 @@ set_children_positions (GeditOverlay *overlay)
alloc.width = req.width;
alloc.height = req.height;
- gtk_widget_size_allocate (child->child, &alloc);
+ gtk_widget_size_allocate (child, &alloc);
}
}
@@ -404,31 +375,88 @@ gedit_overlay_size_allocate (GtkWidget *widget,
set_children_positions (overlay);
}
+static GeditOverlayChild *
+get_overlay_child (GeditOverlay *overlay,
+ GtkWidget *widget)
+{
+ GeditOverlayChild *overlay_child = NULL;
+ GSList *l;
+
+ for (l = overlay->priv->children; l != NULL; l = g_slist_next (l))
+ {
+ GtkWidget *child = GTK_WIDGET (l->data);
+
+ /* skip the main widget as it is not a OverlayChild */
+ if (child == overlay->priv->main_widget)
+ continue;
+
+ if (child == widget)
+ {
+ overlay_child = GEDIT_OVERLAY_CHILD (child);
+ break;
+ }
+ else
+ {
+ GtkWidget *in_widget;
+
+ /* let's try also with the internal widget */
+ g_object_get (child, "widget", &in_widget, NULL);
+ g_assert (in_widget != NULL);
+
+ if (in_widget == widget)
+ {
+ overlay_child = GEDIT_OVERLAY_CHILD (child);
+ break;
+ }
+ }
+ }
+
+ return overlay_child;
+}
+
static void
overlay_add (GtkContainer *overlay,
GtkWidget *widget)
{
- add_toplevel_widget (GEDIT_OVERLAY (overlay), widget,
- FALSE, FALSE, GDK_GRAVITY_STATIC, 0);
+ GeditOverlayChild *child;
+
+ /* check that the widget is not added yet */
+ child = get_overlay_child (GEDIT_OVERLAY (overlay), widget);
+
+ if (child == NULL)
+ {
+ if (GEDIT_IS_OVERLAY_CHILD (widget))
+ {
+ child = GEDIT_OVERLAY_CHILD (widget);
+ }
+ else
+ {
+ child = gedit_overlay_child_new (widget);
+ gtk_widget_show (GTK_WIDGET (child));
+ }
+
+ add_toplevel_widget (GEDIT_OVERLAY (overlay), GTK_WIDGET (child));
+ }
}
static void
gedit_overlay_remove (GtkContainer *overlay,
GtkWidget *widget)
{
- GeditOverlay *goverlay = GEDIT_OVERLAY (overlay);
+ GeditOverlayPrivate *priv = GEDIT_OVERLAY (overlay)->priv;
GSList *l;
- for (l = goverlay->priv->children; l != NULL; l = g_slist_next (l))
+ for (l = priv->children; l != NULL; l = g_slist_next (l))
{
- OverlayChild *child = (OverlayChild *)l->data;
+ GtkWidget *child = l->data;
- if (child->child == widget)
+ if (child == widget)
{
gtk_widget_unparent (widget);
- goverlay->priv->children = g_slist_remove_link (goverlay->priv->children,
- l);
- free_container_child (child);
+ priv->children = g_slist_remove_link (priv->children,
+ l);
+
+ g_slist_free (l);
break;
}
}
@@ -445,9 +473,9 @@ gedit_overlay_forall (GtkContainer *overlay,
for (l = goverlay->priv->children; l != NULL; l = g_slist_next (l))
{
- OverlayChild *child = (OverlayChild *)l->data;
+ GtkWidget *child = GTK_WIDGET (l->data);
- (* callback) (child->child, callback_data);
+ (* callback) (child, callback_data);
}
}
@@ -598,59 +626,50 @@ gedit_overlay_init (GeditOverlay *overlay)
overlay->priv = GEDIT_OVERLAY_GET_PRIVATE (overlay);
}
+/**
+ * gedit_overlay_new:
+ * @main_widget: a #GtkWidget
+ *
+ * Creates a new #GeditOverlay
+ *
+ * Returns: a new #GeditOverlay object.
+ */
GtkWidget *
gedit_overlay_new (GtkWidget *main_widget)
{
+ g_return_val_if_fail (GTK_IS_WIDGET (main_widget), NULL);
+
return GTK_WIDGET (g_object_new (GEDIT_TYPE_OVERLAY,
"main-widget", main_widget,
NULL));
}
-static GeditTheatricsAnimatedWidget *
-get_animated_widget (GeditOverlay *overlay,
- GtkWidget *widget)
+/**
+ * gedit_overlay_add:
+ * @overlay: a #GeditOverlay
+ * @widget: a #GtkWidget to be added to the container
+ * @position: a #GeditOverlayChildPosition
+ * @offset: offset for @widget
+ *
+ * Adds @widget to @overlay in a specific position.
+ */
+void
+gedit_overlay_add (GeditOverlay *overlay,
+ GtkWidget *widget,
+ GeditOverlayChildPosition position,
+ guint offset)
{
- GSList *l;
-
- for (l = overlay->priv->children; l != NULL; l = g_slist_next (l))
- {
- OverlayChild *child = (OverlayChild *)l->data;
- GtkWidget *in_widget;
+ GeditOverlayChild *child;
- if (!child->is_animated)
- continue;
-
- g_object_get (child->child, "widget", &in_widget, NULL);
- g_assert (in_widget != NULL);
+ g_return_if_fail (GEDIT_IS_OVERLAY (overlay));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
- if (in_widget == widget)
- {
- return GEDIT_THEATRICS_ANIMATED_WIDGET (child->child);
- }
- }
+ gtk_container_add (GTK_CONTAINER (overlay), widget);
- return NULL;
-}
+ /* NOTE: can we improve this without exposing overlay child? */
+ child = get_overlay_child (overlay, widget);
+ g_assert (child != NULL);
-/* Note: see that we use the gravity as a position */
-void
-gedit_overlay_add (GeditOverlay *overlay,
- GtkWidget *widget,
- GtkOrientation orientation,
- GdkGravity gravity,
- guint offset,
- gboolean in)
-{
- GeditTheatricsAnimatedWidget *anim_widget;
-
- anim_widget = get_animated_widget (overlay, widget);
-
- if (anim_widget == NULL)
- {
- anim_widget = gedit_theatrics_animated_widget_new (widget, orientation);
- gtk_widget_show (GTK_WIDGET (anim_widget));
-
- add_toplevel_widget (overlay, GTK_WIDGET (anim_widget), TRUE,
- TRUE, gravity, offset);
- }
+ gedit_overlay_child_set_position (child, position);
+ gedit_overlay_child_set_offset (child, offset);
}
diff --git a/lib/widgets/gedit-overlay.h b/lib/widgets/gedit-overlay.h
index a5335dd..8817d33 100644
--- a/lib/widgets/gedit-overlay.h
+++ b/lib/widgets/gedit-overlay.h
@@ -2,22 +2,21 @@
* gedit-overlay.h
* This file is part of gedit
*
- * Copyright (C) 2010 - Ignacio Casal Quinteiro
- *
- * gedit is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2011 - Ignacio Casal Quinteiro
*
+ * gedit is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
* gedit is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with gedit; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __GEDIT_OVERLAY_H__
@@ -25,6 +24,7 @@
#include <glib-object.h>
#include <gtk/gtk.h>
+#include "gedit-overlay-child.h"
G_BEGIN_DECLS
@@ -60,12 +60,10 @@ GType gedit_overlay_get_type (void) G_GNUC_CONST;
GtkWidget *gedit_overlay_new (GtkWidget *main_widget);
-void gedit_overlay_add (GeditOverlay *overlay,
- GtkWidget *widget,
- GtkOrientation orientation,
- GdkGravity gravity,
- guint offset,
- gboolean in);
+void gedit_overlay_add (GeditOverlay *overlay,
+ GtkWidget *widget,
+ GeditOverlayChildPosition position,
+ guint offset);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]