This is an automated email from the git hooks/post-receive script. nomad pushed a commit to branch master in repository apps/xfdashboard.
commit 78916ca8dda3e6df606aa9fb4c6bc0bdef9e4164 Author: Stephan Haller <no...@froevel.de> Date: Fri Jan 15 23:31:00 2016 +0100 Fix scrolling to ensure a view's child is visible in viewpad especially when view changed its size that is will now fits into viewpad completely. --- xfdashboard/viewpad.c | 83 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 15 deletions(-) diff --git a/xfdashboard/viewpad.c b/xfdashboard/viewpad.c index 4efc5a0..813256f 100644 --- a/xfdashboard/viewpad.c +++ b/xfdashboard/viewpad.c @@ -53,24 +53,26 @@ G_DEFINE_TYPE_WITH_CODE(XfdashboardViewpad, struct _XfdashboardViewpadPrivate { /* Properties related */ - gfloat spacing; - XfdashboardView *activeView; + gfloat spacing; + XfdashboardView *activeView; XfdashboardVisibilityPolicy hScrollbarPolicy; - gboolean hScrollbarVisible; + gboolean hScrollbarVisible; XfdashboardVisibilityPolicy vScrollbarPolicy; - gboolean vScrollbarVisible; + gboolean vScrollbarVisible; /* Instance related */ - XfdashboardViewManager *viewManager; + XfdashboardViewManager *viewManager; - ClutterLayoutManager *layout; - ClutterActor *container; - ClutterActor *hScrollbar; - ClutterActor *vScrollbar; + ClutterLayoutManager *layout; + ClutterActor *container; + ClutterActor *hScrollbar; + ClutterActor *vScrollbar; - guint scrollbarUpdateID; + guint scrollbarUpdateID; - gboolean doRegisterFocusableViews; + gboolean doRegisterFocusableViews; + + ClutterActorBox *lastAllocation; }; /* Properties */ @@ -509,6 +511,7 @@ static gboolean _xfdashboard_viewpad_view_needs_scrolling_for_child(XfdashboardV ClutterVertex transformedUpperLeft; ClutterVertex transformedLowerRight; gfloat x, y, w, h; + gboolean viewFitsIntoViewpad; gboolean needScrolling; gfloat scrollX, scrollY; @@ -517,9 +520,21 @@ static gboolean _xfdashboard_viewpad_view_needs_scrolling_for_child(XfdashboardV g_return_val_if_fail(CLUTTER_IS_ACTOR(inViewChild), FALSE); priv=self->priv; + viewFitsIntoViewpad=FALSE; needScrolling=FALSE; scrollX=scrollY=0.0f; + /* Check if view would fit into this viewpad completely */ + if(priv->lastAllocation) + { + clutter_actor_get_size(CLUTTER_ACTOR(inView), &w, &h); + if(w<=clutter_actor_box_get_width(priv->lastAllocation) && + h<=clutter_actor_box_get_height(priv->lastAllocation)) + { + viewFitsIntoViewpad=TRUE; + } + } + /* Get position and size of view but respect scrolled position */ if(inView==priv->activeView) { @@ -541,8 +556,17 @@ static gboolean _xfdashboard_viewpad_view_needs_scrolling_for_child(XfdashboardV } /* Check that upper left point of actor is visible otherwise set flag for scrolling */ - origin.x=origin.y=origin.z=0.0f; - clutter_actor_apply_relative_transform_to_point(inViewChild, CLUTTER_ACTOR(inView), &origin, &transformedUpperLeft); + if(!viewFitsIntoViewpad) + { + origin.x=origin.y=origin.z=0.0f; + clutter_actor_apply_relative_transform_to_point(inViewChild, CLUTTER_ACTOR(inView), &origin, &transformedUpperLeft); + } + else + { + origin.x=origin.y=origin.z=0.0f; + clutter_actor_apply_relative_transform_to_point(CLUTTER_ACTOR(inView), CLUTTER_ACTOR(self), &origin, &transformedUpperLeft); + } + if(transformedUpperLeft.x<x || transformedUpperLeft.x>(x+w) || transformedUpperLeft.y<y || @@ -552,8 +576,20 @@ static gboolean _xfdashboard_viewpad_view_needs_scrolling_for_child(XfdashboardV } /* Check that lower right point of actor is visible otherwise set flag for scrolling */ - clutter_actor_get_size(inViewChild, &origin.x, &origin.y); - clutter_actor_apply_relative_transform_to_point(inViewChild, CLUTTER_ACTOR(inView), &origin, &transformedLowerRight); + if(!viewFitsIntoViewpad) + { + origin.z=0.0f; + clutter_actor_get_size(inViewChild, &origin.x, &origin.y); + clutter_actor_apply_relative_transform_to_point(inViewChild, CLUTTER_ACTOR(inView), &origin, &transformedLowerRight); + } + else + { + origin.x=clutter_actor_box_get_width(priv->lastAllocation); + origin.y=clutter_actor_box_get_height(priv->lastAllocation); + origin.z=0.0f; + clutter_actor_apply_relative_transform_to_point(CLUTTER_ACTOR(inView), CLUTTER_ACTOR(self), &origin, &transformedLowerRight); + } + if(transformedLowerRight.x<x || transformedLowerRight.x>(x+w) || transformedLowerRight.y<y || @@ -965,6 +1001,15 @@ static void _xfdashboard_viewpad_allocate(ClutterActor *self, /* Notify about property change */ g_object_notify_by_pspec(G_OBJECT(self), XfdashboardViewpadProperties[PROP_VSCROLLBAR_VISIBLE]); } + + /* Remember this allocation as last one set */ + if(priv->lastAllocation) + { + clutter_actor_box_free(priv->lastAllocation); + priv->lastAllocation=NULL; + } + + priv->lastAllocation=clutter_actor_box_copy(inBox); } /* IMPLEMENTATION: Interface XfdashboardFocusable */ @@ -1058,6 +1103,13 @@ static void _xfdashboard_viewpad_dispose(GObject *inObject) priv->viewManager=NULL; } + /* Release allocated resources */ + if(priv->lastAllocation) + { + clutter_actor_box_free(priv->lastAllocation); + priv->lastAllocation=NULL; + } + /* Call parent's class dispose method */ G_OBJECT_CLASS(xfdashboard_viewpad_parent_class)->dispose(inObject); } @@ -1299,6 +1351,7 @@ static void xfdashboard_viewpad_init(XfdashboardViewpad *self) priv->vScrollbarPolicy=XFDASHBOARD_VISIBILITY_POLICY_AUTOMATIC; priv->scrollbarUpdateID=0; priv->doRegisterFocusableViews=FALSE; + priv->lastAllocation=NULL; /* Set up this actor */ clutter_actor_set_reactive(CLUTTER_ACTOR(self), TRUE); -- To stop receiving notification emails like this one, please contact the administrator of this repository. _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits