[nautilus] overlay: sync with upstream, and add a case for scrolled windows
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus] overlay: sync with upstream, and add a case for scrolled windows
- Date: Fri, 25 Feb 2011 02:09:55 +0000 (UTC)
commit 2aa5c4844b3f4fe6b26c72d74ccfc9352a11f3f4
Author: Cosimo Cecchi <cosimoc gnome org>
Date: Thu Feb 24 20:32:41 2011 -0500
overlay: sync with upstream, and add a case for scrolled windows
src/gedit-overlay-child.c | 87 +++-----------
src/gedit-overlay.c | 291 ++++++++++++---------------------------------
src/gedit-overlay.h | 7 +-
3 files changed, 95 insertions(+), 290 deletions(-)
---
diff --git a/src/gedit-overlay-child.c b/src/gedit-overlay-child.c
index 3d4a47d..74d6647 100644
--- a/src/gedit-overlay-child.c
+++ b/src/gedit-overlay-child.c
@@ -23,10 +23,10 @@
struct _GeditOverlayChildPrivate
{
- GtkWidget *widget;
+ GtkWidget *widget;
+ GBinding *binding;
GeditOverlayChildPosition position;
guint offset;
- gboolean fixed;
};
enum
@@ -34,8 +34,7 @@ enum
PROP_0,
PROP_WIDGET,
PROP_POSITION,
- PROP_OFFSET,
- PROP_FIXED
+ PROP_OFFSET
};
G_DEFINE_TYPE (GeditOverlayChild, gedit_overlay_child, GTK_TYPE_BIN)
@@ -59,9 +58,6 @@ gedit_overlay_child_get_property (GObject *object,
case PROP_OFFSET:
g_value_set_uint (value, child->priv->offset);
break;
- case PROP_FIXED:
- g_value_set_boolean (value, child->priv->fixed);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -88,9 +84,6 @@ gedit_overlay_child_set_property (GObject *object,
case PROP_OFFSET:
child->priv->offset = g_value_get_uint (value);
break;
- case PROP_FIXED:
- child->priv->fixed = g_value_get_boolean (value);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -113,8 +106,8 @@ gedit_overlay_child_realize (GtkWidget *widget)
attributes.window_type = GDK_WINDOW_CHILD;
attributes.wclass = GDK_INPUT_OUTPUT;
attributes.event_mask = GDK_EXPOSURE_MASK;
- attributes.width = 0;
- attributes.height = 0;
+ attributes.width = 0;
+ attributes.height = 0;
window = gdk_window_new (parent_window, &attributes, 0);
gdk_window_set_user_data (window, widget);
@@ -133,7 +126,6 @@ gedit_overlay_child_get_preferred_width (GtkWidget *widget,
if (child->priv->widget != NULL)
{
-
gtk_widget_get_preferred_width (child->priv->widget,
&child_min, &child_nat);
}
@@ -151,8 +143,7 @@ gedit_overlay_child_get_preferred_height (GtkWidget *widget,
gint child_min = 0, child_nat = 0;
if (child->priv->widget != NULL)
- {
-
+ {
gtk_widget_get_preferred_height (child->priv->widget,
&child_min, &child_nat);
}
@@ -170,14 +161,14 @@ gedit_overlay_child_size_allocate (GtkWidget *widget,
tmp.width = allocation->width;
tmp.height = allocation->height;
- tmp.x = 0;
- tmp.y = 0;
-
+ tmp.x = tmp.y = 0;
+
GTK_WIDGET_CLASS (gedit_overlay_child_parent_class)->size_allocate (widget, allocation);
if (child->priv->widget != NULL)
{
- gtk_widget_size_allocate (child->priv->widget, &tmp);
+ gtk_widget_size_allocate (child->priv->widget,
+ &tmp);
}
}
@@ -189,6 +180,10 @@ gedit_overlay_child_add (GtkContainer *container,
child->priv->widget = widget;
+ child->priv->binding = g_object_bind_property (G_OBJECT (widget), "visible",
+ G_OBJECT (container), "visible",
+ G_BINDING_BIDIRECTIONAL);
+
GTK_CONTAINER_CLASS (gedit_overlay_child_parent_class)->add (container, widget);
}
@@ -200,6 +195,8 @@ gedit_overlay_child_remove (GtkContainer *container,
child->priv->widget = NULL;
+ g_object_unref (child->priv->binding);
+
GTK_CONTAINER_CLASS (gedit_overlay_child_parent_class)->remove (container, widget);
}
@@ -234,8 +231,9 @@ gedit_overlay_child_class_init (GeditOverlayChildClass *klass)
g_param_spec_uint ("position",
"Position",
"The Widget Position",
- 1, GEDIT_OVERLAY_CHILD_POSITION_STATIC,
+ 0,
GEDIT_OVERLAY_CHILD_POSITION_STATIC,
+ 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
@@ -251,15 +249,6 @@ gedit_overlay_child_class_init (GeditOverlayChildClass *klass)
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
- g_object_class_install_property (object_class, PROP_FIXED,
- g_param_spec_boolean ("fixed",
- "Fixed",
- "Wether the Widget is in a fixed position",
- TRUE,
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_STRINGS));
-
g_type_class_add_private (object_class, sizeof (GeditOverlayChildPrivate));
}
@@ -364,44 +353,4 @@ gedit_overlay_child_set_offset (GeditOverlayChild *child,
}
}
-/**
- * gedit_overlay_child_get_fixed:
- * @child: a #GeditOverlayChild
- *
- * Gets wether @child is fixed in its position. If @child is not fixed the position
- * will change when for example you scroll the container.
- *
- * Returns: wether @child is fixed in its position
- */
-gboolean
-gedit_overlay_child_get_fixed (GeditOverlayChild *child)
-{
- g_return_val_if_fail (GEDIT_IS_OVERLAY_CHILD (child), TRUE);
-
- return child->priv->fixed;
-}
-
-/**
- * gedit_overlay_child_set_fixed:
- * @child: a #GeditOverlayChild
- * @fixed: wether @child is in a fixed position
- *
- * Sets wether @child is in a fixed position
- */
-void
-gedit_overlay_child_set_fixed (GeditOverlayChild *child,
- gboolean fixed)
-{
- g_return_if_fail (GEDIT_IS_OVERLAY_CHILD (child));
-
- fixed = (fixed != FALSE);
-
- if (child->priv->fixed != fixed)
- {
- child->priv->fixed = fixed;
-
- g_object_notify (G_OBJECT (child), "fixed");
- }
-}
-
/* ex:set ts=8 noet: */
diff --git a/src/gedit-overlay.c b/src/gedit-overlay.c
index 2941de6..eeaf2ea 100644
--- a/src/gedit-overlay.c
+++ b/src/gedit-overlay.c
@@ -30,35 +30,18 @@
struct _GeditOverlayPrivate
{
GtkWidget *main_widget;
+ GtkWidget *relative_widget;
GSList *children;
- GtkAllocation main_alloc;
-
- GtkAdjustment *hadjustment;
- GtkAdjustment *vadjustment;
-
- /* GtkScrollablePolicy needs to be checked when
- * driving the scrollable adjustment values */
- guint hscroll_policy : 1;
- guint vscroll_policy : 1;
};
enum
{
PROP_0,
PROP_MAIN_WIDGET,
- PROP_HADJUSTMENT,
- PROP_VADJUSTMENT,
- PROP_HSCROLL_POLICY,
- PROP_VSCROLL_POLICY
+ PROP_RELATIVE_WIDGET
};
-static void gedit_overlay_set_hadjustment (GeditOverlay *overlay,
- GtkAdjustment *adjustment);
-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))
+G_DEFINE_TYPE (GeditOverlay, gedit_overlay, GTK_TYPE_CONTAINER)
static void
add_toplevel_widget (GeditOverlay *overlay,
@@ -71,6 +54,12 @@ add_toplevel_widget (GeditOverlay *overlay,
}
static void
+gedit_overlay_dispose (GObject *object)
+{
+ G_OBJECT_CLASS (gedit_overlay_parent_class)->dispose (object);
+}
+
+static void
gedit_overlay_get_property (GObject *object,
guint prop_id,
GValue *value,
@@ -85,36 +74,8 @@ gedit_overlay_get_property (GObject *object,
g_value_set_object (value, priv->main_widget);
break;
- case PROP_HADJUSTMENT:
- g_value_set_object (value, priv->hadjustment);
- break;
-
- case PROP_VADJUSTMENT:
- g_value_set_object (value, priv->vadjustment);
- break;
-
- case PROP_HSCROLL_POLICY:
- if (GTK_IS_SCROLLABLE (priv->main_widget))
- {
- g_value_set_enum (value,
- gtk_scrollable_get_hscroll_policy (GTK_SCROLLABLE (priv->main_widget)));
- }
- else
- {
- g_value_set_enum (value, priv->hscroll_policy);
- }
- break;
-
- case PROP_VSCROLL_POLICY:
- if (GTK_IS_SCROLLABLE (priv->main_widget))
- {
- g_value_set_enum (value,
- gtk_scrollable_get_vscroll_policy (GTK_SCROLLABLE (priv->main_widget)));
- }
- else
- {
- g_value_set_enum (value, priv->vscroll_policy);
- }
+ case PROP_RELATIVE_WIDGET:
+ g_value_set_object (value, priv->relative_widget);
break;
default:
@@ -135,45 +96,12 @@ gedit_overlay_set_property (GObject *object,
switch (prop_id)
{
case PROP_MAIN_WIDGET:
- overlay->priv->main_widget = g_value_get_object (value);
- add_toplevel_widget (overlay,
- overlay->priv->main_widget);
- break;
-
- case PROP_HADJUSTMENT:
- gedit_overlay_set_hadjustment (overlay,
- g_value_get_object (value));
- break;
-
- case PROP_VADJUSTMENT:
- gedit_overlay_set_vadjustment (overlay,
- g_value_get_object (value));
- break;
-
- case PROP_HSCROLL_POLICY:
- if (GTK_IS_SCROLLABLE (priv->main_widget))
- {
- gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (priv->main_widget),
- g_value_get_uint (value));
- }
- else
- {
- priv->hscroll_policy = g_value_get_enum (value);
- gtk_widget_queue_resize (GTK_WIDGET (overlay));
- }
+ priv->main_widget = g_value_get_object (value);
+ add_toplevel_widget (overlay, priv->main_widget);
break;
- case PROP_VSCROLL_POLICY:
- if (GTK_IS_SCROLLABLE (priv->main_widget))
- {
- gtk_scrollable_set_vscroll_policy (GTK_SCROLLABLE (priv->main_widget),
- g_value_get_enum (value));
- }
- else
- {
- priv->vscroll_policy = g_value_get_enum (value);
- gtk_widget_queue_resize (GTK_WIDGET (overlay));
- }
+ case PROP_RELATIVE_WIDGET:
+ priv->relative_widget = g_value_get_object (value);
break;
default:
@@ -223,24 +151,13 @@ gedit_overlay_get_preferred_width (GtkWidget *widget,
gint *natural)
{
GeditOverlayPrivate *priv = GEDIT_OVERLAY (widget)->priv;
- GtkWidget *child;
- GSList *children;
- gint child_min, child_nat;
*minimum = 0;
*natural = 0;
- for (children = priv->children; children; children = children->next)
+ if (priv->main_widget)
{
- child = children->data;
-
- if (!gtk_widget_get_visible (child))
- continue;
-
- gtk_widget_get_preferred_width (child, &child_min, &child_nat);
-
- *minimum = MAX (*minimum, child_min);
- *natural = MAX (*natural, child_nat);
+ gtk_widget_get_preferred_width (priv->main_widget, minimum, natural);
}
}
@@ -250,35 +167,53 @@ gedit_overlay_get_preferred_height (GtkWidget *widget,
gint *natural)
{
GeditOverlayPrivate *priv = GEDIT_OVERLAY (widget)->priv;
- GtkWidget *child;
- GSList *children;
- gint child_min, child_nat;
*minimum = 0;
*natural = 0;
- for (children = priv->children; children; children = children->next)
+ if (priv->main_widget)
{
- child = children->data;
-
- if (!gtk_widget_get_visible (child))
- continue;
-
- gtk_widget_get_preferred_height (child, &child_min, &child_nat);
-
- *minimum = MAX (*minimum, child_min);
- *natural = MAX (*natural, child_nat);
+ gtk_widget_get_preferred_height (priv->main_widget, minimum, natural);
}
}
static void
-set_children_positions (GeditOverlay *overlay)
+gedit_overlay_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation)
{
+ GeditOverlay *overlay = GEDIT_OVERLAY (widget);
+ GeditOverlayPrivate *priv = overlay->priv;
+ GtkAllocation main_alloc;
GSList *l;
- for (l = overlay->priv->children; l != NULL; l = g_slist_next (l))
+ GTK_WIDGET_CLASS (gedit_overlay_parent_class)->size_allocate (widget, allocation);
+
+ /* main widget allocation */
+ main_alloc.x = 0;
+ main_alloc.y = 0;
+ main_alloc.width = allocation->width;
+ main_alloc.height = allocation->height;
+
+ gtk_widget_size_allocate (overlay->priv->main_widget, &main_alloc);
+
+ /* if a relative widget exists place the floating widgets in relation to it */
+ if (priv->relative_widget)
+ {
+ GtkWidget *child;
+
+ /* if the relative widget is a scrolled window, place the children
+ * inside of it to avoid covering the scrollbars.
+ */
+ if (GTK_IS_SCROLLED_WINDOW (priv->relative_widget)) {
+ child = gtk_bin_get_child (GTK_BIN (priv->relative_widget));
+ gtk_widget_get_allocation (child, &main_alloc);
+ } else {
+ gtk_widget_get_allocation (priv->relative_widget, &main_alloc);
+ }
+ }
+
+ for (l = priv->children; l != NULL; l = g_slist_next (l))
{
- GeditOverlayPrivate *priv = overlay->priv;
GtkWidget *child = GTK_WIDGET (l->data);
GtkRequisition req;
GtkAllocation alloc;
@@ -295,7 +230,7 @@ set_children_positions (GeditOverlay *overlay)
{
/* The gravity is treated as position and not as a gravity */
case GEDIT_OVERLAY_CHILD_POSITION_NORTH_EAST:
- alloc.x = priv->main_alloc.width - req.width - offset;
+ alloc.x = MAX (main_alloc.x, main_alloc.width - req.width - (gint) offset);
alloc.y = 0;
break;
case GEDIT_OVERLAY_CHILD_POSITION_NORTH_WEST:
@@ -304,48 +239,24 @@ set_children_positions (GeditOverlay *overlay)
break;
case GEDIT_OVERLAY_CHILD_POSITION_SOUTH_WEST:
alloc.x = offset;
- alloc.y = priv->main_alloc.height - req.height;
+ alloc.y = MAX (main_alloc.y, main_alloc.height - req.height);
break;
- case GEDIT_OVERLAY_CHILD_POSITION_SOUTH_EAST:
- alloc.x = MAX (priv->main_alloc.x, priv->main_alloc.width - req.width - (gint) offset);
- alloc.y = MAX (priv->main_alloc.y, priv->main_alloc.height - req.height);
+ case GEDIT_OVERLAY_CHILD_POSITION_SOUTH_EAST:
+ alloc.x = MAX (main_alloc.x, main_alloc.width - req.width - (gint) offset);
+ alloc.y = MAX (main_alloc.y, main_alloc.height - req.height);
break;
default:
alloc.x = 0;
alloc.y = 0;
}
- 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);
- }
-
- alloc.width = MIN (priv->main_alloc.width, req.width);
- alloc.height = MIN (priv->main_alloc.height, req.height);
+ alloc.width = MIN (main_alloc.width, req.width);
+ alloc.height = MIN (main_alloc.height, req.height);
gtk_widget_size_allocate (child, &alloc);
}
}
-static void
-gedit_overlay_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- GeditOverlay *overlay = GEDIT_OVERLAY (widget);
-
- GTK_WIDGET_CLASS (gedit_overlay_parent_class)->size_allocate (widget, allocation);
-
- overlay->priv->main_alloc.x = 0;
- overlay->priv->main_alloc.y = 0;
- overlay->priv->main_alloc.width = allocation->width;
- overlay->priv->main_alloc.height = allocation->height;
-
- gtk_widget_size_allocate (overlay->priv->main_widget,
- &overlay->priv->main_alloc);
- set_children_positions (overlay);
-}
-
static GeditOverlayChild *
get_overlay_child (GeditOverlay *overlay,
GtkWidget *widget)
@@ -378,6 +289,7 @@ get_overlay_child (GeditOverlay *overlay,
{
overlay_child = GEDIT_OVERLAY_CHILD (child);
g_object_unref (in_widget);
+
break;
}
@@ -409,7 +321,7 @@ overlay_add (GtkContainer *overlay,
gtk_widget_show (GTK_WIDGET (child));
g_signal_connect_swapped (widget, "destroy",
- G_CALLBACK (gtk_widget_destroy), child);
+ G_CALLBACK (gtk_widget_destroy), child);
}
add_toplevel_widget (GEDIT_OVERLAY (overlay), GTK_WIDGET (child));
@@ -464,60 +376,6 @@ gedit_overlay_child_type (GtkContainer *overlay)
return GTK_TYPE_WIDGET;
}
-static void
-gedit_overlay_set_hadjustment (GeditOverlay *overlay,
- GtkAdjustment *adjustment)
-{
- GeditOverlayPrivate *priv = overlay->priv;
-
- if (adjustment && priv->vadjustment == adjustment)
- return;
-
- if (adjustment == NULL)
- {
- adjustment = gtk_adjustment_new (0.0, 0.0, 0.0,
- 0.0, 0.0, 0.0);
- }
-
- priv->hadjustment = g_object_ref_sink (adjustment);
-
- if (GTK_IS_SCROLLABLE (priv->main_widget))
- {
- g_object_set (priv->main_widget,
- "hadjustment", adjustment,
- NULL);
-
- }
-
- g_object_notify (G_OBJECT (overlay), "hadjustment");
-}
-
-static void
-gedit_overlay_set_vadjustment (GeditOverlay *overlay,
- GtkAdjustment *adjustment)
-{
- GeditOverlayPrivate *priv = overlay->priv;
-
- if (adjustment && priv->vadjustment == adjustment)
- return;
-
- if (adjustment == NULL)
- {
- adjustment = gtk_adjustment_new (0.0, 0.0, 0.0,
- 0.0, 0.0, 0.0);
- }
-
- priv->vadjustment = g_object_ref_sink (adjustment);
-
- if (GTK_IS_SCROLLABLE (priv->main_widget))
- {
- g_object_set (priv->main_widget,
- "vadjustment", adjustment,
- NULL);
- }
-
- g_object_notify (G_OBJECT (overlay), "vadjustment");
-}
static void
gedit_overlay_class_init (GeditOverlayClass *klass)
@@ -526,6 +384,7 @@ gedit_overlay_class_init (GeditOverlayClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
+ object_class->dispose = gedit_overlay_dispose;
object_class->get_property = gedit_overlay_get_property;
object_class->set_property = gedit_overlay_set_property;
@@ -548,18 +407,13 @@ gedit_overlay_class_init (GeditOverlayClass *klass)
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
- g_object_class_override_property (object_class,
- PROP_HADJUSTMENT,
- "hadjustment");
- g_object_class_override_property (object_class,
- PROP_VADJUSTMENT,
- "vadjustment");
- g_object_class_override_property (object_class,
- PROP_HSCROLL_POLICY,
- "hscroll-policy");
- g_object_class_override_property (object_class,
- PROP_VSCROLL_POLICY,
- "vscroll-policy");
+ g_object_class_install_property (object_class, PROP_RELATIVE_WIDGET,
+ g_param_spec_object ("relative-widget",
+ "Relative Widget",
+ "Widget on which the floating widgets are placed",
+ GTK_TYPE_WIDGET,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
g_type_class_add_private (object_class, sizeof (GeditOverlayPrivate));
}
@@ -573,18 +427,23 @@ gedit_overlay_init (GeditOverlay *overlay)
/**
* gedit_overlay_new:
* @main_widget: a #GtkWidget
+ * @relative_widget: (allow-none): a #Gtkwidget
*
- * Creates a new #GeditOverlay
+ * Creates a new #GeditOverlay. If @relative_widget is not %NULL the floating
+ * widgets will be placed in relation to it, if not @main_widget will be use
+ * for this purpose.
*
* Returns: a new #GeditOverlay object.
*/
GtkWidget *
-gedit_overlay_new (GtkWidget *main_widget)
+gedit_overlay_new (GtkWidget *main_widget,
+ GtkWidget *relative_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,
+ "relative-widget", relative_widget,
NULL));
}
diff --git a/src/gedit-overlay.h b/src/gedit-overlay.h
index 8817d33..9e1c769 100644
--- a/src/gedit-overlay.h
+++ b/src/gedit-overlay.h
@@ -50,15 +50,12 @@ struct _GeditOverlay
struct _GeditOverlayClass
{
GtkContainerClass parent_class;
-
- void (* set_scroll_adjustments) (GeditOverlay *overlay,
- GtkAdjustment *hadjustment,
- GtkAdjustment *vadjustment);
};
GType gedit_overlay_get_type (void) G_GNUC_CONST;
-GtkWidget *gedit_overlay_new (GtkWidget *main_widget);
+GtkWidget *gedit_overlay_new (GtkWidget *main_widget,
+ GtkWidget *relative_widget);
void gedit_overlay_add (GeditOverlay *overlay,
GtkWidget *widget,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]