/* Callback function for xfdashboard_traverse_actor() to find stage interface * used in xfdashboard_notify(). */ static gboolean _xfdashboard_notify_traverse_callback(ClutterActor *inActor, gpointer inUserData) { XfdashboardStage **outStageInterface; XfdashboardWindowTrackerMonitor *stageMonitor; g_return_val_if_fail(CLUTTER_IS_ACTOR(inActor), XFDASHBOARD_TRAVERSAL_CONTINUE); g_return_val_if_fail(inUserData, XFDASHBOARD_TRAVERSAL_CONTINUE); outStageInterface=(XfdashboardStage**)inUserData; /* If actor currently traverse is a stage interface then store * the actor in user-data and stop further traversal. */ if(XFDASHBOARD_IS_STAGE_INTERFACE(inActor)) { stageMonitor=xfdashboard_stage_interface_get_monitor(XFDASHBOARD_STAGE_INTERFACE(inActor)); if(xfdashboard_window_tracker_monitor_is_primary(stageMonitor)) { *outStageInterface=XFDASHBOARD_STAGE(clutter_actor_get_stage(inActor)); return(XFDASHBOARD_TRAVERSAL_STOP); } } /* If we get here a stage interface was not found so continue traversal */ return(XFDASHBOARD_TRAVERSAL_CONTINUE); }
void xfdashboard_stage_interface_set_background_color(XfdashboardStageInterface *self, const ClutterColor *inColor) { XfdashboardStageInterfacePrivate *priv; g_return_if_fail(XFDASHBOARD_IS_STAGE_INTERFACE(self)); priv=self->priv; /* Set value if changed */ if((priv->backgroundColor && !inColor) || (!priv->backgroundColor && inColor) || (inColor && clutter_color_equal(inColor, priv->backgroundColor)==FALSE)) { /* Set value */ if(priv->backgroundColor) { clutter_color_free(priv->backgroundColor); priv->backgroundColor=NULL; } if(inColor) priv->backgroundColor=clutter_color_copy(inColor); /* Notify about property change */ g_object_notify_by_pspec(G_OBJECT(self), XfdashboardStageInterfaceProperties[PROP_BACKGROUND_COLOR]); } }
/** * xfdashboard_get_stage_of_actor: * @inActor: The #ClutterActor for which to find the stage * * Gets the #XfdashboardStageInterface of the monitor where * @inActor belongs to. * * Return value: (transfer none): The #XfdashboardStageInterface * found or %NULL if none was found. */ XfdashboardStageInterface* xfdashboard_get_stage_of_actor(ClutterActor *inActor) { ClutterActor *parent; g_return_val_if_fail(CLUTTER_IS_ACTOR(inActor), NULL); /* Iterate through parents and return first XfdashboardStageInterface * found. That's the stage of the monitor where the requested actor * belongs to. */ parent=clutter_actor_get_parent(inActor); while(parent) { /* Check if current iterated parent is a XfdashboardStageInterface. * If it is return it. */ if(XFDASHBOARD_IS_STAGE_INTERFACE(parent)) return(XFDASHBOARD_STAGE_INTERFACE(parent)); /* Continue with next parent */ parent=clutter_actor_get_parent(parent); } /* If we get here we did not find the stage the actor belongs to, * so return NULL. */ return(NULL); }
void xfdashboard_stage_interface_set_monitor(XfdashboardStageInterface *self, XfdashboardWindowTrackerMonitor *inMonitor) { XfdashboardStageInterfacePrivate *priv; g_return_if_fail(XFDASHBOARD_IS_STAGE_INTERFACE(self)); g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_MONITOR(inMonitor)); priv=self->priv; /* Set value if changed */ if(priv->monitor!=inMonitor) { /* Set value */ if(priv->monitor) { if(priv->geometryChangedID) { g_signal_handler_disconnect(priv->monitor, priv->geometryChangedID); priv->geometryChangedID=0; } if(priv->primaryChangedID) { g_signal_handler_disconnect(priv->monitor, priv->primaryChangedID); priv->primaryChangedID=0; } g_object_unref(priv->monitor); priv->monitor=NULL; } priv->monitor=XFDASHBOARD_WINDOW_TRACKER_MONITOR(g_object_ref(inMonitor)); /* Connect signals */ priv->geometryChangedID=g_signal_connect_swapped(priv->monitor, "geometry-changed", G_CALLBACK(_xfdashboard_stage_interface_on_geometry_changed), self); priv->primaryChangedID=g_signal_connect_swapped(priv->monitor, "primary-changed", G_CALLBACK(_xfdashboard_stage_interface_on_primary_changed), self); /* Resize actor to new monitor */ _xfdashboard_stage_interface_on_geometry_changed(self, priv->monitor); /* Update actor from primary state */ _xfdashboard_stage_interface_on_primary_changed(self, priv->monitor); /* Notify about property change */ g_object_notify_by_pspec(G_OBJECT(self), XfdashboardStageInterfaceProperties[PROP_MONITOR]); } }
void xfdashboard_stage_interface_set_background_image_type(XfdashboardStageInterface *self, XfdashboardStageBackgroundImageType inType) { XfdashboardStageInterfacePrivate *priv; g_return_if_fail(XFDASHBOARD_IS_STAGE_INTERFACE(self)); g_return_if_fail(inType<=XFDASHBOARD_STAGE_BACKGROUND_IMAGE_TYPE_DESKTOP); priv=self->priv; /* Set value if changed */ if(priv->backgroundType!=inType) { /* Set value */ priv->backgroundType=inType; /* Notify about property change */ g_object_notify_by_pspec(G_OBJECT(self), XfdashboardStageInterfaceProperties[PROP_BACKGROUND_IMAGE_TYPE]); } }
/* Monitor size changed */ static void _xfdashboard_stage_interface_on_geometry_changed(XfdashboardStageInterface *self, gpointer inUserData) { XfdashboardStageInterfacePrivate *priv; gint x, y, w, h; g_return_if_fail(XFDASHBOARD_IS_STAGE_INTERFACE(self)); priv=self->priv; /* Resize actor to new monitor */ xfdashboard_window_tracker_monitor_get_geometry(priv->monitor, &x, &y, &w, &h); clutter_actor_set_position(CLUTTER_ACTOR(self), x, y); clutter_actor_set_size(CLUTTER_ACTOR(self), w, h); XFDASHBOARD_DEBUG(self, ACTOR, "Stage interface moved to %d,%d and resized to %dx%d because %s monitor %d changed geometry", x, y, w, h, xfdashboard_window_tracker_monitor_is_primary(priv->monitor) ? "primary" : "non-primary", xfdashboard_window_tracker_monitor_get_number(priv->monitor)); }
/* Monitor changed primary state */ static void _xfdashboard_stage_interface_on_primary_changed(XfdashboardStageInterface *self, gpointer inUserData) { XfdashboardStageInterfacePrivate *priv; gboolean isPrimary; g_return_if_fail(XFDASHBOARD_IS_STAGE_INTERFACE(self)); priv=self->priv; /* Get new primary state of monitor */ isPrimary=xfdashboard_window_tracker_monitor_is_primary(priv->monitor); /* Depending on primary state set CSS class */ if(isPrimary) xfdashboard_stylable_add_class(XFDASHBOARD_STYLABLE(self), "primary-monitor"); else xfdashboard_stylable_remove_class(XFDASHBOARD_STYLABLE(self), "primary-monitor"); XFDASHBOARD_DEBUG(self, ACTOR, "Stage interface changed primary state to %s because of monitor %d", xfdashboard_window_tracker_monitor_is_primary(priv->monitor) ? "primary" : "non-primary", xfdashboard_window_tracker_monitor_get_number(priv->monitor)); }
/* Actor was (re)parented */ static void xfdashboard_stage_interface_parent_set(ClutterActor *inActor, ClutterActor *inOldParent) { XfdashboardStageInterface *self; XfdashboardStageInterfacePrivate *priv; ClutterActorClass *parentClass; ClutterActor *newParent; g_return_if_fail(XFDASHBOARD_IS_STAGE_INTERFACE(inActor)); self=XFDASHBOARD_STAGE_INTERFACE(inActor); priv=self->priv; /* Call parent's virtual function */ parentClass=CLUTTER_ACTOR_CLASS(xfdashboard_stage_interface_parent_class); if(parentClass->parent_set) { parentClass->parent_set(inActor, inOldParent); } /* Set up property bindings to new parent actor */ newParent=clutter_actor_get_parent(inActor); if(priv->bindingBackgroundImageType) { g_object_unref(priv->bindingBackgroundImageType); priv->bindingBackgroundImageType=NULL; } if(priv->bindingBackgroundColor) { g_object_unref(priv->bindingBackgroundColor); priv->bindingBackgroundColor=NULL; } if(newParent && XFDASHBOARD_IS_STAGE(newParent)) { priv->bindingBackgroundImageType=g_object_bind_property(self, "background-image-type", newParent, "background-image-type", G_BINDING_DEFAULT); priv->bindingBackgroundColor=g_object_bind_property(self, "background-color", newParent, "background-color", G_BINDING_DEFAULT); } }
/** * xfdashboard_notify: * @inSender: The sending #ClutterActor or %NULL * @inIconName: The icon name to display in notification or %NULL * @inFormat: A standard printf() format string for notification text * @...: The parameters to insert into the format string * * Shows a notification with the formatted text as specified in @inFormat * and the parameters at the monitor where the sending actor @inSender * is placed on. * * If @inSender is NULL the primary monitor is used. * * If @inIconName is NULL no icon will be shown in notification. */ void xfdashboard_notify(ClutterActor *inSender, const gchar *inIconName, const gchar *inFormat, ...) { XfdashboardStage *stage; ClutterStageManager *stageManager; va_list args; gchar *text; g_return_if_fail(inSender==NULL || CLUTTER_IS_ACTOR(inSender)); stage=NULL; /* Build text to display */ va_start(args, inFormat); text=g_strdup_vprintf(inFormat, args); va_end(args); /* Get stage of sending actor if available */ if(inSender) stage=XFDASHBOARD_STAGE(clutter_actor_get_stage(inSender)); /* No sending actor specified or no stage found so get default stage */ if(!stage) { const GSList *stages; const GSList *stagesIter; ClutterActorIter interfaceIter; ClutterActor *child; XfdashboardWindowTrackerMonitor *stageMonitor; /* Get stage manager to iterate through stages to find the one * for primary monitor or at least the first stage. */ stageManager=clutter_stage_manager_get_default(); /* Find stage for primary monitor and if we cannot find it * use first stage. */ if(stageManager && CLUTTER_IS_STAGE_MANAGER(stageManager)) { /* Get list of all stages */ stages=clutter_stage_manager_peek_stages(stageManager); /* Iterate through list of all stage and lookup the one for * primary monitor. */ for(stagesIter=stages; stagesIter && !stage; stagesIter=stagesIter->next) { /* Skip this stage if it is not a XfdashboardStage */ if(!XFDASHBOARD_IS_STAGE(stagesIter->data)) continue; /* Iterate through stage's children and lookup stage interfaces */ clutter_actor_iter_init(&interfaceIter, CLUTTER_ACTOR(stagesIter->data)); while(clutter_actor_iter_next(&interfaceIter, &child)) { if(XFDASHBOARD_IS_STAGE_INTERFACE(child)) { stageMonitor=xfdashboard_stage_interface_get_monitor(XFDASHBOARD_STAGE_INTERFACE(child)); if(xfdashboard_window_tracker_monitor_is_primary(stageMonitor)) { stage=XFDASHBOARD_STAGE(clutter_actor_get_stage(child)); } } } } /* If we did not get stage for primary monitor use first stage */ if(!stage && stages) { stage=XFDASHBOARD_STAGE(stages->data); } } /* If we still do not have found a stage to show notification * stop further processing and show notification text as a critical * warning in addition to the critical warning that we could not * find any stage. */ if(!stage) { g_critical(_("Could find any stage to show notification: %s"), text); } } /* Show notification on stage (if any found) */ if(stage) xfdashboard_stage_show_notification(stage, inIconName, text); /* Release allocated resources */ g_free(text); }
/* Get/set background color */ ClutterColor* xfdashboard_stage_interface_get_background_color(XfdashboardStageInterface *self) { g_return_val_if_fail(XFDASHBOARD_IS_STAGE_INTERFACE(self), NULL); return(self->priv->backgroundColor); }
/* Get/set background type */ XfdashboardStageBackgroundImageType xfdashboard_stage_interface_get_background_image_type(XfdashboardStageInterface *self) { g_return_val_if_fail(XFDASHBOARD_IS_STAGE_INTERFACE(self), XFDASHBOARD_STAGE_BACKGROUND_IMAGE_TYPE_NONE); return(self->priv->backgroundType); }
/* Get/set monitor */ XfdashboardWindowTrackerMonitor* xfdashboard_stage_interface_get_monitor(XfdashboardStageInterface *self) { g_return_val_if_fail(XFDASHBOARD_IS_STAGE_INTERFACE(self), NULL); return(self->priv->monitor); }