void xfdashboard_view_set_enabled(XfdashboardView *self, gboolean inIsEnabled) { XfdashboardViewPrivate *priv; guint signalBeforeID, signalAfterID; g_return_if_fail(XFDASHBOARD_IS_VIEW(self)); priv=self->priv; /* Set value if changed */ if(priv->isEnabled!=inIsEnabled) { /* Get signal ID to emit depending on enabled state */ signalBeforeID=(inIsEnabled==TRUE ? SIGNAL_ENABLING : SIGNAL_DISABLING); signalAfterID=(inIsEnabled==TRUE ? SIGNAL_ENABLED : SIGNAL_DISABLED); /* Set new enabled state */ g_signal_emit(self, XfdashboardViewSignals[signalBeforeID], 0, self); priv->isEnabled=inIsEnabled; g_signal_emit(self, XfdashboardViewSignals[signalAfterID], 0, self); /* Notify about property change */ g_object_notify_by_pspec(G_OBJECT(self), XfdashboardViewProperties[PROP_ENABLED]); } }
/* Find view by internal name */ XfdashboardView* xfdashboard_viewpad_find_view_by_name(XfdashboardViewpad *self, const gchar *inInternalName) { ClutterActorIter iter; ClutterActor *child; XfdashboardView *view; g_return_val_if_fail(XFDASHBOARD_IS_VIEWPAD(self), NULL); view=NULL; /* Iterate through children and lookup view matching requested name */ clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self)); while(!view && clutter_actor_iter_next(&iter, &child)) { /* Check if child is a view and its internal name matches requested name */ if(XFDASHBOARD_IS_VIEW(child)==TRUE && g_strcmp0(xfdashboard_view_get_internal_name(XFDASHBOARD_VIEW(child)), inInternalName)==0) { view=XFDASHBOARD_VIEW(child); } } /* Return view found which may be NULL if no view of requested type was found */ return(view); }
static void _xfdashboard_viewpad_on_allocation_changed(ClutterActor *inActor, ClutterActorBox *inBox, ClutterAllocationFlags inFlags, gpointer inUserData) { XfdashboardViewpad *self; XfdashboardViewpadPrivate *priv; XfdashboardView *view G_GNUC_UNUSED; g_return_if_fail(XFDASHBOARD_IS_VIEWPAD(inActor)); g_return_if_fail(XFDASHBOARD_IS_VIEW(inUserData)); self=XFDASHBOARD_VIEWPAD(inActor); priv=self->priv; view=XFDASHBOARD_VIEW(inUserData); /* Defer updating scrollbars but only if view whose allocation * has changed is the active one */ if(priv->scrollbarUpdateID==0) { priv->scrollbarUpdateID= clutter_threads_add_repaint_func_full(CLUTTER_REPAINT_FLAGS_QUEUE_REDRAW_ON_ADD | CLUTTER_REPAINT_FLAGS_POST_PAINT, _xfdashboard_viewpad_on_allocation_changed_repaint_callback, self, NULL); } }
void xfdashboard_view_set_icon(XfdashboardView *self, const gchar *inIcon) { XfdashboardViewPrivate *priv; g_return_if_fail(XFDASHBOARD_IS_VIEW(self)); g_return_if_fail(inIcon!=NULL); priv=self->priv; /* Set value if changed */ if(g_strcmp0(priv->viewIcon, inIcon)!=0) { /* Set new icon name */ if(priv->viewIcon) g_free(priv->viewIcon); priv->viewIcon=g_strdup(inIcon); /* Set new icon */ if(priv->viewIconImage) g_object_unref(priv->viewIconImage); priv->viewIconImage=xfdashboard_image_content_new_for_icon_name(priv->viewIcon, 64.0f); /* Notify about property change */ g_object_notify_by_pspec(G_OBJECT(self), XfdashboardViewProperties[PROP_VIEW_ICON]); g_signal_emit(self, XfdashboardViewSignals[SIGNAL_ICON_CHANGED], 0, priv->viewIconImage); } }
/* Find view by type */ XfdashboardView* xfdashboard_viewpad_find_view_by_type(XfdashboardViewpad *self, GType inType) { ClutterActorIter iter; ClutterActor *child; XfdashboardView *view; g_return_val_if_fail(XFDASHBOARD_IS_VIEWPAD(self), NULL); view=NULL; /* Iterate through children and create list of views */ clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self)); while(!view && clutter_actor_iter_next(&iter, &child)) { /* Check if child is a view and of type looking for */ if(XFDASHBOARD_IS_VIEW(child)==TRUE && G_OBJECT_TYPE(child)==inType) { view=XFDASHBOARD_VIEW(child); } } /* Return view found which may be NULL if no view of requested type was found */ return(view); }
/* Called when a view was removed to viewpad */ static void _xfdashboard_view_selector_on_view_removed(XfdashboardViewSelector *self, XfdashboardView *inView, gpointer inUserData) { ClutterActorIter iter; ClutterActor *child; gpointer view; g_return_if_fail(XFDASHBOARD_IS_VIEW_SELECTOR(self)); /* Iterate through create views and lookup view of given type */ clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self)); while(clutter_actor_iter_next(&iter, &child)) { /* Check if child is a button otherwise continue iterating */ if(!XFDASHBOARD_IS_TOGGLE_BUTTON(child)) continue; /* If button has reference to view destroy it */ view=g_object_get_data(G_OBJECT(child), "view"); if(XFDASHBOARD_IS_VIEW(view) && XFDASHBOARD_VIEW(view)==inView) { clutter_actor_destroy(child); } } }
/* Find viewpad which contains this view */ static XfdashboardViewpad* _xfdashboard_view_find_viewpad(XfdashboardView *self) { ClutterActor *viewpad; g_return_val_if_fail(XFDASHBOARD_IS_VIEW(self), NULL); /* Iterate through parent actors and for each viewpad found * check if it contains this view. */ viewpad=clutter_actor_get_parent(CLUTTER_ACTOR(self)); while(viewpad) { /* Check if this parent actor is a viewpad and * if it contains this view. */ if(XFDASHBOARD_IS_VIEWPAD(viewpad) && xfdashboard_viewpad_has_view(XFDASHBOARD_VIEWPAD(viewpad), self)) { /* Viewpad found so return it */ return(XFDASHBOARD_VIEWPAD(viewpad)); } /* Continue with next parent actor */ viewpad=clutter_actor_get_parent(viewpad); } /* If we get here the viewpad could not be found so return NULL */ return(NULL); }
/* Called when a new view was added to viewpad */ static void _xfdashboard_view_selector_on_view_added(XfdashboardViewSelector *self, XfdashboardView *inView, gpointer inUserData) { XfdashboardViewSelectorPrivate *priv; ClutterActor *button; gchar *viewName; const gchar *viewIcon; gboolean isActive; ClutterAction *action; g_return_if_fail(XFDASHBOARD_IS_VIEW_SELECTOR(self)); g_return_if_fail(XFDASHBOARD_IS_VIEW(inView)); priv=self->priv; /* Create button for newly added view */ viewName=g_markup_printf_escaped("%s", xfdashboard_view_get_name(inView)); viewIcon=xfdashboard_view_get_icon(inView); button=xfdashboard_toggle_button_new_full_with_icon_name(viewIcon, viewName); xfdashboard_toggle_button_set_auto_toggle(XFDASHBOARD_TOGGLE_BUTTON(button), FALSE); g_object_set_data(G_OBJECT(button), "view", inView); g_signal_connect_swapped(button, "clicked", G_CALLBACK(_xfdashboard_view_selector_on_view_button_clicked), self); /* Set toggle state depending of if view is active or not and connect * signal to get notified if toggle state changes to proxy signal */ g_signal_connect_swapped(button, "toggled", G_CALLBACK(_xfdashboard_view_selector_on_toggle_button_state_changed), self); isActive=(xfdashboard_viewpad_get_active_view(priv->viewpad)==inView); xfdashboard_toggle_button_set_toggle_state(XFDASHBOARD_TOGGLE_BUTTON(button), isActive); /* Add tooltip */ action=xfdashboard_tooltip_action_new(); xfdashboard_tooltip_action_set_text(XFDASHBOARD_TOOLTIP_ACTION(action), viewName); clutter_actor_add_action(button, action); /* If view is disabled hide button otherwise show and connect signals * to get notified if enabled state has changed */ if(!xfdashboard_view_get_enabled(inView)) clutter_actor_hide(button); else clutter_actor_show(button); g_signal_connect(inView, "disabled", G_CALLBACK(_xfdashboard_view_selector_on_view_enable_state_changed), button); g_signal_connect(inView, "enabled", G_CALLBACK(_xfdashboard_view_selector_on_view_enable_state_changed), button); g_signal_connect(inView, "activated", G_CALLBACK(_xfdashboard_view_selector_on_view_activated), button); g_signal_connect(inView, "deactivated", G_CALLBACK(_xfdashboard_view_selector_on_view_deactivated), button); g_signal_connect(inView, "icon-changed", G_CALLBACK(_xfdashboard_view_selector_on_view_icon_changed), button); g_signal_connect(inView, "name-changed", G_CALLBACK(_xfdashboard_view_selector_on_view_name_changed), action); /* Add button as child actor */ clutter_actor_add_child(CLUTTER_ACTOR(self), button); /* Release allocated resources */ g_free(viewName); }
/* A view was disabled */ static void _xfdashboard_viewpad_on_view_disabled(XfdashboardViewpad *self, XfdashboardView *inView) { XfdashboardViewpadPrivate *priv; ClutterActorIter iter; ClutterActor *child; XfdashboardView *firstActivatableView; g_return_if_fail(XFDASHBOARD_IS_VIEWPAD(self)); g_return_if_fail(XFDASHBOARD_IS_VIEW(inView)); priv=self->priv; firstActivatableView=NULL; /* If the currently disabled view is the active one, activate a next available view */ if(inView==priv->activeView) { /* Iterate through create views and lookup view of given type */ clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self)); while(clutter_actor_iter_next(&iter, &child)) { /* Check if child is a view otherwise continue iterating */ if(XFDASHBOARD_IS_VIEW(child)!=TRUE) continue; /* If child is not the view being disabled check if it could * become the next activatable view * the first activatable view after we destroyed all views found. */ if(XFDASHBOARD_VIEW(child)!=inView && xfdashboard_view_get_enabled(XFDASHBOARD_VIEW(child))) { firstActivatableView=XFDASHBOARD_VIEW(child); } } /* Now activate the first activatable view we found during iteration. * It can also be no view (NULL pointer). */ g_debug("Disabled view %s was the active view in %s - will activate %s", G_OBJECT_TYPE_NAME(inView), G_OBJECT_TYPE_NAME(self), firstActivatableView ? G_OBJECT_TYPE_NAME(firstActivatableView) : "no other view"); _xfdashboard_viewpad_activate_view(self, firstActivatableView); } }
/* Called when the name of a view has changed */ static void _xfdashboard_view_selector_on_view_name_changed(XfdashboardView *inView, const gchar *inName, gpointer inUserData) { XfdashboardTooltipAction *action; g_return_if_fail(XFDASHBOARD_IS_VIEW(inView)); g_return_if_fail(XFDASHBOARD_IS_TOOLTIP_ACTION(inUserData)); action=XFDASHBOARD_TOOLTIP_ACTION(inUserData); xfdashboard_tooltip_action_set_text(action, inName); }
/* Called when an icon of a view has changed */ static void _xfdashboard_view_selector_on_view_icon_changed(XfdashboardView *inView, ClutterImage *inImage, gpointer inUserData) { XfdashboardButton *button; g_return_if_fail(XFDASHBOARD_IS_VIEW(inView)); g_return_if_fail(XFDASHBOARD_IS_TOGGLE_BUTTON(inUserData)); button=XFDASHBOARD_BUTTON(inUserData); xfdashboard_label_set_icon_name(XFDASHBOARD_LABEL(button), xfdashboard_view_get_icon(inView)); }
static void _xfdashboard_view_selector_on_view_deactivated(XfdashboardView *inView, gpointer inUserData) { XfdashboardToggleButton *button; g_return_if_fail(XFDASHBOARD_IS_VIEW(inView)); g_return_if_fail(XFDASHBOARD_IS_TOGGLE_BUTTON(inUserData)); button=XFDASHBOARD_TOGGLE_BUTTON(inUserData); xfdashboard_toggle_button_set_toggle_state(button, FALSE); }
/* Ensure that a child of this view is visible by scrolling if needed */ void xfdashboard_view_child_ensure_visible(XfdashboardView *self, ClutterActor *inActor) { g_return_if_fail(XFDASHBOARD_IS_VIEW(self)); g_return_if_fail(CLUTTER_IS_ACTOR(inActor)); /* Only emit signal if given actor is a child of this view */ if(xfdashboard_actor_contains_child_deep(CLUTTER_ACTOR(self), inActor)) { g_signal_emit(self, XfdashboardViewSignals[SIGNAL_CHILD_ENSURE_VISIBLE], 0, inActor); } }
void xfdashboard_viewpad_set_active_view(XfdashboardViewpad *self, XfdashboardView *inView) { XfdashboardViewpadPrivate *priv; g_return_if_fail(XFDASHBOARD_IS_VIEWPAD(self)); g_return_if_fail(XFDASHBOARD_IS_VIEW(inView)); priv=self->priv; /* Only activate view if it changes */ if(priv->activeView!=inView) _xfdashboard_viewpad_activate_view(self, inView); }
/* A view was enabled */ static void _xfdashboard_viewpad_on_view_enabled(XfdashboardViewpad *self, XfdashboardView *inView) { XfdashboardViewpadPrivate *priv; g_return_if_fail(XFDASHBOARD_IS_VIEWPAD(self)); g_return_if_fail(XFDASHBOARD_IS_VIEW(inView)); priv=self->priv; /* If no view is active this new enabled view will be activated */ if(!priv->activeView) _xfdashboard_viewpad_activate_view(self, inView); }
/* Called when a view was enabled or will be disabled */ static void _xfdashboard_view_selector_on_view_enable_state_changed(XfdashboardView *inView, gpointer inUserData) { ClutterActor *button; g_return_if_fail(XFDASHBOARD_IS_VIEW(inView)); g_return_if_fail(CLUTTER_IS_ACTOR(inUserData)); button=CLUTTER_ACTOR(inUserData); if(!xfdashboard_view_get_enabled(inView)) clutter_actor_hide(button); else clutter_actor_show(button); }
/* This view was disabled */ static void _xfdashboard_view_disabled(XfdashboardView *self) { XfdashboardViewpad *viewpad; g_return_if_fail(XFDASHBOARD_IS_VIEW(self)); /* If view is not a child of a viewpad hide view actor directly */ viewpad=_xfdashboard_view_find_viewpad(self); if(!viewpad) { clutter_actor_hide(CLUTTER_ACTOR(self)); } }
/* Determine if scrolling is needed to get requested actor visible */ gboolean xfdashboard_view_child_needs_scroll(XfdashboardView *self, ClutterActor *inActor) { gboolean result; g_return_val_if_fail(XFDASHBOARD_IS_VIEW(self), FALSE); g_return_val_if_fail(CLUTTER_IS_ACTOR(inActor), FALSE); result=FALSE; /* Only emit signal if given actor is a child of this view */ if(xfdashboard_actor_contains_child_deep(CLUTTER_ACTOR(self), inActor)) { g_signal_emit(self, XfdashboardViewSignals[SIGNAL_CHILD_NEEDS_SCROLL], 0, inActor, &result); } return(result); }
/* Determine if view has the focus */ gboolean xfdashboard_view_has_focus(XfdashboardView *self) { XfdashboardViewPrivate *priv; XfdashboardFocusManager *focusManager; XfdashboardViewpad *viewpad; g_return_val_if_fail(XFDASHBOARD_IS_VIEW(self), FALSE); priv=self->priv; /* The view can only have the focus if this view is enabled, active and * has the current focus. */ if(!priv->isEnabled) { return(FALSE); } viewpad=_xfdashboard_view_find_viewpad(self); if(!viewpad) { return(FALSE); } if(xfdashboard_viewpad_get_active_view(XFDASHBOARD_VIEWPAD(viewpad))!=self) { return(FALSE); } focusManager=xfdashboard_focus_manager_get_default(); if(!XFDASHBOARD_IS_FOCUSABLE(self) || !xfdashboard_focus_manager_has_focus(focusManager, XFDASHBOARD_FOCUSABLE(self))) { g_object_unref(focusManager); return(FALSE); } /* Release allocated resources */ g_object_unref(focusManager); /* All tests passed so this view has the focus */ return(TRUE); }
/* Create view of given type and add to this actor */ static void _xfdashboard_viewpad_add_view(XfdashboardViewpad *self, GType inViewType) { XfdashboardViewpadPrivate *priv; GObject *view; g_return_if_fail(XFDASHBOARD_IS_VIEWPAD(self)); priv=self->priv; /* Create instance and check if it is a view */ g_debug("Creating view %s for viewpad", g_type_name(inViewType)); view=g_object_new(inViewType, NULL); if(view==NULL) { g_critical(_("Failed to create view instance of %s"), g_type_name(inViewType)); return; } if(XFDASHBOARD_IS_VIEW(view)!=TRUE) { g_critical(_("Instance %s is not a %s and cannot be added to %s"), g_type_name(inViewType), g_type_name(XFDASHBOARD_TYPE_VIEW), G_OBJECT_TYPE_NAME(self)); return; } /* Add new view instance to this actor but hidden */ clutter_actor_hide(CLUTTER_ACTOR(view)); clutter_actor_add_child(CLUTTER_ACTOR(self), CLUTTER_ACTOR(view)); g_signal_connect_swapped(view, "allocation-changed", G_CALLBACK(_xfdashboard_viewpad_on_allocation_changed), self); g_signal_connect_swapped(view, "scroll-to", G_CALLBACK(_xfdashboard_viewpad_on_view_scroll_to), self); g_signal_connect_swapped(view, "ensure-visible", G_CALLBACK(_xfdashboard_viewpad_on_view_ensure_visible), self); g_signal_connect_swapped(view, "disabled", G_CALLBACK(_xfdashboard_viewpad_on_view_disabled), self); g_signal_connect_swapped(view, "enabled", G_CALLBACK(_xfdashboard_viewpad_on_view_enabled), self); g_signal_emit(self, XfdashboardViewpadSignals[SIGNAL_VIEW_ADDED], 0, view); /* Set active view if none active (usually it is the first view created) */ if(priv->activeView==NULL && xfdashboard_view_get_enabled(XFDASHBOARD_VIEW(view))) { _xfdashboard_viewpad_activate_view(self, XFDASHBOARD_VIEW(view)); } }
void xfdashboard_view_set_internal_name(XfdashboardView *self, const gchar *inInternalName) { XfdashboardViewPrivate *priv; g_return_if_fail(XFDASHBOARD_IS_VIEW(self)); g_return_if_fail(inInternalName!=NULL); priv=self->priv; /* Set value if changed */ if(g_strcmp0(priv->viewInternalName, inInternalName)!=0) { if(priv->viewInternalName) g_free(priv->viewInternalName); priv->viewInternalName=g_strdup(inInternalName); /* Notify about property change */ g_object_notify_by_pspec(G_OBJECT(self), XfdashboardViewProperties[PROP_VIEW_INTERNAL_NAME]); } }
/* Get list of views */ GList* xfdashboard_viewpad_get_views(XfdashboardViewpad *self) { ClutterActorIter iter; ClutterActor *child; GList *list; g_return_val_if_fail(XFDASHBOARD_IS_VIEWPAD(self), NULL); list=NULL; /* Iterate through children and create list of views */ clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self)); while(clutter_actor_iter_next(&iter, &child)) { /* Check if child is a view and add to list */ if(XFDASHBOARD_IS_VIEW(child)==TRUE) list=g_list_prepend(list, child); } list=g_list_reverse(list); return(list); }
/* Scroll to requested position in view */ static void _xfdashboard_viewpad_on_view_scroll_to(XfdashboardViewpad *self, gfloat inX, gfloat inY, gpointer inUserData) { XfdashboardViewpadPrivate *priv; XfdashboardView *view; gfloat x, y, w, h; g_return_if_fail(XFDASHBOARD_IS_VIEWPAD(self)); g_return_if_fail(XFDASHBOARD_IS_VIEW(inUserData)); priv=self->priv; view=XFDASHBOARD_VIEW(inUserData); /* If to-scroll view is the active view in viewpad * just set scrollbar value to the new ones */ if(view==priv->activeView) { if(inX>=0.0f) xfdashboard_scrollbar_set_value(XFDASHBOARD_SCROLLBAR(priv->hScrollbar), inX); if(inY>=0.0f) xfdashboard_scrollbar_set_value(XFDASHBOARD_SCROLLBAR(priv->vScrollbar), inY); } /* If to-scroll view is not the active one update its clipping */ else { if(clutter_actor_has_clip(CLUTTER_ACTOR(view))) { clutter_actor_get_clip(CLUTTER_ACTOR(view), &x, &y, &w, &h); if(inX>=0.0f) x=inX; if(inY>=0.0f) y=inY; } else { x=y=0.0f; clutter_actor_get_size(CLUTTER_ACTOR(view), &w, &h); } clutter_actor_set_clip(CLUTTER_ACTOR(view), x, y, w, h); } }
/* Called when a view type was unregistered */ static void _xfdashboard_viewpad_on_view_unregistered(XfdashboardViewpad *self, GType inViewType, gpointer inUserData) { XfdashboardViewpadPrivate *priv; ClutterActorIter iter; ClutterActor *child; ClutterActor *firstActivatableView; g_return_if_fail(XFDASHBOARD_IS_VIEWPAD(self)); priv=self->priv; firstActivatableView=NULL; /* Iterate through create views and lookup view of given type */ clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self)); while(clutter_actor_iter_next(&iter, &child)) { /* Check if child is a view otherwise continue iterating */ if(XFDASHBOARD_IS_VIEW(child)!=TRUE) continue; /* If child is not of type being unregistered it will get * the first activatable view after we destroyed all views found. */ if(G_OBJECT_TYPE(child)!=inViewType) { if(xfdashboard_view_get_enabled(XFDASHBOARD_VIEW(child))) firstActivatableView=child; } else { if(G_OBJECT(child)==G_OBJECT(priv->activeView)) _xfdashboard_viewpad_activate_view(self, NULL); g_signal_emit(self, XfdashboardViewpadSignals[SIGNAL_VIEW_REMOVED], 0, child); clutter_actor_destroy(child); } } /* Now activate the first activatable view we found during iteration */ if(firstActivatableView) _xfdashboard_viewpad_activate_view(self, XFDASHBOARD_VIEW(firstActivatableView)); }
/* Action signal to close currently selected window was emitted */ static gboolean _xfdashboard_view_activate(XfdashboardView *self, XfdashboardFocusable *inSource, const gchar *inAction, ClutterEvent *inEvent) { XfdashboardViewPrivate *priv; XfdashboardViewpad *viewpad; XfdashboardFocusManager *focusManager; g_return_val_if_fail(XFDASHBOARD_IS_VIEW(self), CLUTTER_EVENT_PROPAGATE); priv=self->priv; /* Only enabled views can be activated */ if(!priv->isEnabled) return(CLUTTER_EVENT_STOP); /* Find viewpad which contains this view */ viewpad=_xfdashboard_view_find_viewpad(self); if(!viewpad) return(CLUTTER_EVENT_STOP); /* Activate view at viewpad if this view is not the active one */ if(xfdashboard_viewpad_get_active_view(viewpad)!=self) { xfdashboard_viewpad_set_active_view(viewpad, self); } /* Set focus to view if it has not the focus */ focusManager=xfdashboard_focus_manager_get_default(); if(XFDASHBOARD_IS_FOCUSABLE(self) && !xfdashboard_focus_manager_has_focus(focusManager, XFDASHBOARD_FOCUSABLE(self))) { xfdashboard_focus_manager_set_focus(focusManager, XFDASHBOARD_FOCUSABLE(self)); } g_object_unref(focusManager); /* Action handled */ return(CLUTTER_EVENT_STOP); }
void xfdashboard_view_set_fit_mode(XfdashboardView *self, XfdashboardFitMode inFitMode) { XfdashboardViewPrivate *priv; XfdashboardViewClass *klass; g_return_if_fail(XFDASHBOARD_IS_VIEW(self)); priv=self->priv; klass=XFDASHBOARD_VIEW_GET_CLASS(self); /* Set value if changed */ if(priv->fitMode!=inFitMode) { /* Set new fit mode */ priv->fitMode=inFitMode; /* Call virtual function for setting fit mode */ if(klass->set_fit_mode) klass->set_fit_mode(self, inFitMode); /* Notify about property change */ g_object_notify_by_pspec(G_OBJECT(self), XfdashboardViewProperties[PROP_FIT_MODE]); } }
/* Ensure that a child of a view is visible by scrolling if needed */ static void _xfdashboard_viewpad_on_view_ensure_visible(XfdashboardViewpad *self, ClutterActor *inActor, gpointer inUserData) { XfdashboardViewpadPrivate *priv; XfdashboardView *view; ClutterVertex origin; ClutterVertex transformedUpperLeft; ClutterVertex transformedLowerRight; gfloat x, y, w, h; gboolean needScrolling; g_return_if_fail(XFDASHBOARD_IS_VIEWPAD(self)); g_return_if_fail(CLUTTER_IS_ACTOR(inActor)); g_return_if_fail(XFDASHBOARD_IS_VIEW(inUserData)); priv=self->priv; view=XFDASHBOARD_VIEW(inUserData); needScrolling=FALSE; origin.z=0.0f; /* Get position and size of view but respect scrolled position */ if(view==priv->activeView) { x=xfdashboard_scrollbar_get_value(XFDASHBOARD_SCROLLBAR(priv->hScrollbar)); y=xfdashboard_scrollbar_get_value(XFDASHBOARD_SCROLLBAR(priv->vScrollbar)); clutter_actor_get_size(CLUTTER_ACTOR(self), &w, &h); } else { if(clutter_actor_has_clip(CLUTTER_ACTOR(view))) { clutter_actor_get_clip(CLUTTER_ACTOR(view), &x, &y, &w, &h); } else { x=y=0.0f; clutter_actor_get_size(CLUTTER_ACTOR(view), &w, &h); } } /* Check that upper left point of actor is visible otherwise set flag for scrolling */ origin.x=origin.y=0.0f; clutter_actor_apply_relative_transform_to_point(inActor, CLUTTER_ACTOR(view), &origin, &transformedUpperLeft); if(transformedUpperLeft.x<x || transformedUpperLeft.x>(x+w) || transformedUpperLeft.y<y || transformedUpperLeft.y>(y+h)) { needScrolling=TRUE; } /* Check that lower right point of actor is visible otherwise set flag for scrolling */ clutter_actor_get_size(inActor, &origin.x, &origin.y); clutter_actor_apply_relative_transform_to_point(inActor, CLUTTER_ACTOR(view), &origin, &transformedLowerRight); if(transformedLowerRight.x<x || transformedLowerRight.x>(x+w) || transformedLowerRight.y<y || transformedLowerRight.y>(y+h)) { needScrolling=TRUE; } /* Check if we need to scroll */ if(needScrolling) { gfloat distanceUpperLeft; gfloat distanceLowerRight; /* Find shortest way to scroll and then scroll */ distanceUpperLeft=sqrtf(powf(transformedUpperLeft.x-x, 2.0f)+powf(transformedUpperLeft.y-y, 2.0f)); distanceLowerRight=sqrtf(powf(transformedLowerRight.x-(x+w), 2.0f)+powf(transformedLowerRight.y-(y+h), 2.0f)); if(distanceUpperLeft<=distanceLowerRight) { _xfdashboard_viewpad_on_view_scroll_to(self, transformedUpperLeft.x, transformedUpperLeft.y, view); } else { _xfdashboard_viewpad_on_view_scroll_to(self, transformedUpperLeft.x, transformedLowerRight.y-h, view); } } }
/* Set new active view and deactive current one */ static void _xfdashboard_viewpad_activate_view(XfdashboardViewpad *self, XfdashboardView *inView) { XfdashboardViewpadPrivate *priv; gfloat x, y; g_return_if_fail(XFDASHBOARD_IS_VIEWPAD(self)); g_return_if_fail(inView==NULL || XFDASHBOARD_IS_VIEW(inView)); priv=self->priv; /* Only set value if it changes */ if(inView==priv->activeView) return; /* Check if view is a child of this actor */ if(inView && clutter_actor_contains(CLUTTER_ACTOR(self), CLUTTER_ACTOR(inView))==FALSE) { g_warning(_("View %s is not a child of %s and cannot be activated"), G_OBJECT_TYPE_NAME(inView), G_OBJECT_TYPE_NAME(self)); return; } /* Only allow enabled views to be activated */ if(inView && !xfdashboard_view_get_enabled(inView)) { g_warning(_("Cannot activate disabled view %s at %s"), G_OBJECT_TYPE_NAME(inView), G_OBJECT_TYPE_NAME(self)); return; } /* Deactivate current view */ if(priv->activeView) { /* Hide current view and emit signal before and after deactivation */ g_signal_emit(self, XfdashboardViewpadSignals[SIGNAL_VIEW_DEACTIVATING], 0, priv->activeView); g_signal_emit_by_name(priv->activeView, "deactivating"); clutter_actor_hide(CLUTTER_ACTOR(priv->activeView)); g_debug("Deactivated view %s", G_OBJECT_TYPE_NAME(priv->activeView)); g_signal_emit_by_name(priv->activeView, "deactivated"); g_signal_emit(self, XfdashboardViewpadSignals[SIGNAL_VIEW_DEACTIVATED], 0, priv->activeView); g_object_unref(priv->activeView); priv->activeView=NULL; } /* Activate new view (if available) by showing new view, setting up * scrollbars and emitting signal before and after activation. * Prevent signal handling for scrollbars' "value-changed" as it will * mess up with clipping and viewport. We only need to set value of * scrollbars but we do not need to handle the changed value. */ if(inView) { priv->activeView=g_object_ref(inView); g_signal_emit(self, XfdashboardViewpadSignals[SIGNAL_VIEW_ACTIVATING], 0, priv->activeView); g_signal_emit_by_name(priv->activeView, "activating"); g_signal_handlers_block_by_func(priv->hScrollbar, _xfdashboard_viewpad_on_scrollbar_value_changed, self); g_signal_handlers_block_by_func(priv->vScrollbar, _xfdashboard_viewpad_on_scrollbar_value_changed, self); x=y=0.0f; clutter_actor_get_clip(CLUTTER_ACTOR(priv->activeView), &x, &y, NULL, NULL); _xfdashboard_viewpad_update_scrollbars(self); xfdashboard_scrollbar_set_value(XFDASHBOARD_SCROLLBAR(priv->hScrollbar), x); xfdashboard_scrollbar_set_value(XFDASHBOARD_SCROLLBAR(priv->vScrollbar), y); _xfdashboard_viewpad_update_view_viewport(self); clutter_actor_show(CLUTTER_ACTOR(priv->activeView)); g_debug("Activated view %s", G_OBJECT_TYPE_NAME(priv->activeView)); g_signal_handlers_unblock_by_func(priv->hScrollbar, _xfdashboard_viewpad_on_scrollbar_value_changed, self); g_signal_handlers_unblock_by_func(priv->vScrollbar, _xfdashboard_viewpad_on_scrollbar_value_changed, self); g_signal_emit_by_name(priv->activeView, "activated"); g_signal_emit(self, XfdashboardViewpadSignals[SIGNAL_VIEW_ACTIVATED], 0, priv->activeView); } /* Notify about property change */ g_object_notify_by_pspec(G_OBJECT(self), XfdashboardViewpadProperties[PROP_ACTIVE_VIEW]); }
/* Get/set enabled state of view */ gboolean xfdashboard_view_get_enabled(XfdashboardView *self) { g_return_val_if_fail(XFDASHBOARD_IS_VIEW(self), FALSE); return(self->priv->isEnabled); }
/* Scroll view to requested coordinates */ void xfdashboard_view_scroll_to(XfdashboardView *self, gfloat inX, gfloat inY) { g_return_if_fail(XFDASHBOARD_IS_VIEW(self)); g_signal_emit(self, XfdashboardViewSignals[SIGNAL_SCROLL_TO], 0, inX, inY); }