/* 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); }
/* 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); }
/* 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); } }
/* 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)); } }
/* 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)); }
/* 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]); }