/* 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 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); }
/* Dispose this object */ static void _xfdashboard_tooltip_action_dispose(GObject *inObject) { XfdashboardTooltipAction *self=XFDASHBOARD_TOOLTIP_ACTION(inObject); XfdashboardTooltipActionPrivate *priv=self->priv; ClutterActor *actor; /* Get current actor this action belongs to */ actor=clutter_actor_meta_get_actor(CLUTTER_ACTOR_META(self)); /* Release allocated resources */ if(priv->enterSignalID!=0) { if(actor!=NULL) g_signal_handler_disconnect(actor, priv->enterSignalID); priv->enterSignalID=0; } if(priv->motionSignalID!=0) { if(actor!=NULL) g_signal_handler_disconnect(actor, priv->motionSignalID); priv->motionSignalID=0; } if(priv->leaveSignalID!=0) { if(actor!=NULL) g_signal_handler_disconnect(actor, priv->leaveSignalID); priv->leaveSignalID=0; } if(priv->captureSignalID) { if(actor!=NULL) g_signal_handler_disconnect(actor, priv->captureSignalID); priv->captureSignalID=0; } if(priv->timeoutSourceID!=0) { g_source_remove(priv->timeoutSourceID); priv->timeoutSourceID=0; } if(priv->tooltipText) { g_free(priv->tooltipText); priv->tooltipText=NULL; } /* Call parent's class dispose method */ G_OBJECT_CLASS(xfdashboard_tooltip_action_parent_class)->dispose(inObject); }
/* Set/get properties */ static void _xfdashboard_tooltip_action_set_property(GObject *inObject, guint inPropID, const GValue *inValue, GParamSpec *inSpec) { XfdashboardTooltipAction *self=XFDASHBOARD_TOOLTIP_ACTION(inObject); switch(inPropID) { case PROP_TOOLTIP_TEXT: xfdashboard_tooltip_action_set_text(self, g_value_get_string(inValue)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(inObject, inPropID, inSpec); break; } }
static void _xfdashboard_tooltip_action_get_property(GObject *inObject, guint inPropID, GValue *outValue, GParamSpec *inSpec) { XfdashboardTooltipAction *self=XFDASHBOARD_TOOLTIP_ACTION(inObject); XfdashboardTooltipActionPrivate *priv=self->priv; switch(inPropID) { case PROP_TOOLTIP_TEXT: g_value_set_string(outValue, priv->tooltipText); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(inObject, inPropID, inSpec); break; } }
/* Timeout for tooltip has been reached */ static gboolean _xfdashboard_tooltip_action_on_timeout(gpointer inUserData) { XfdashboardTooltipAction *self; XfdashboardTooltipActionPrivate *priv; ClutterActor *actor; ClutterActor *stage; g_return_val_if_fail(XFDASHBOARD_IS_TOOLTIP_ACTION(inUserData), G_SOURCE_REMOVE); self=XFDASHBOARD_TOOLTIP_ACTION(inUserData); priv=self->priv; /* Regardless how this function ends we will let this source be * removed from main loop. So forget source ID ;) */ priv->timeoutSourceID=0; /* Check if last seen actor is this actor. If not we cannot display * a tooltip and remove this source on return. */ actor=clutter_actor_meta_get_actor(CLUTTER_ACTOR_META(self)); if(actor!=_xfdashboard_tooltip_last_event_actor) return(G_SOURCE_REMOVE); /* Show tooltip */ stage=clutter_actor_get_stage(actor); if(stage && XFDASHBOARD_IS_STAGE(stage)) { /* Emit 'activating' signal for last chance to update tooltip text */ g_signal_emit(self, XfdashboardTooltipActionSignals[SIGNAL_ACTIVATING], 0); /* Show tooltip */ g_signal_emit_by_name(stage, "show-tooltip", self, NULL); priv->isVisible=TRUE; } /* Remove source */ return(G_SOURCE_REMOVE); }
/* Called when attaching and detaching a ClutterActorMeta instance to a ClutterActor */ static void _xfdashboard_tooltip_action_set_actor(ClutterActorMeta *inActorMeta, ClutterActor *inActor) { XfdashboardTooltipAction *self; XfdashboardTooltipActionPrivate *priv; ClutterActor *oldActor; g_return_if_fail(XFDASHBOARD_IS_TOOLTIP_ACTION(inActorMeta)); self=XFDASHBOARD_TOOLTIP_ACTION(inActorMeta); priv=self->priv; /* Get current actor this action belongs to */ oldActor=clutter_actor_meta_get_actor(CLUTTER_ACTOR_META(self)); /* Do nothing if new actor to set is the current one */ if(oldActor==inActor) return; /* Release signals */ if(priv->enterSignalID!=0) { if(oldActor!=NULL) g_signal_handler_disconnect(oldActor, priv->enterSignalID); priv->enterSignalID=0; } if(priv->motionSignalID!=0) { if(oldActor!=NULL) g_signal_handler_disconnect(oldActor, priv->motionSignalID); priv->motionSignalID=0; } if(priv->leaveSignalID!=0) { if(oldActor!=NULL) g_signal_handler_disconnect(oldActor, priv->leaveSignalID); priv->leaveSignalID=0; } if(priv->captureSignalID) { if(priv->captureSignalActor) g_signal_handler_disconnect(priv->captureSignalActor, priv->captureSignalID); priv->captureSignalActor=NULL; priv->captureSignalID=0; } /* Release sources */ if(priv->timeoutSourceID!=0) { g_source_remove(priv->timeoutSourceID); priv->timeoutSourceID=0; } /* Connect signals */ if(inActor!=NULL) { priv->enterSignalID=g_signal_connect_swapped(inActor, "enter-event", G_CALLBACK(_xfdashboard_tooltip_action_on_enter_event), self); } /* Call parent's class method */ if(CLUTTER_ACTOR_META_CLASS(xfdashboard_tooltip_action_parent_class)->set_actor) { CLUTTER_ACTOR_META_CLASS(xfdashboard_tooltip_action_parent_class)->set_actor(inActorMeta, inActor); } }