/* Drag handle has changed so unset styles on old handle and set style on new one */ static void _xfdashboard_drag_action_on_drag_handle_changed(XfdashboardDragAction *self, GParamSpec *inSpec, gpointer inUserData) { XfdashboardDragActionPrivate *priv; gchar *styleClass; g_return_if_fail(XFDASHBOARD_IS_DRAG_ACTION(self)); priv=self->priv; /* Unset styles on current drag handle */ if(priv->dragHandle && XFDASHBOARD_IS_ACTOR(priv->dragHandle)) { /* Unset style */ if(priv->source) { styleClass=g_strdup_printf("drag-source-%s", G_OBJECT_TYPE_NAME(priv->source)); xfdashboard_stylable_remove_class(XFDASHBOARD_STYLABLE(priv->dragHandle), styleClass); g_free(styleClass); } styleClass=g_strdup_printf("drag-actor-%s", G_OBJECT_TYPE_NAME(priv->actor)); xfdashboard_stylable_remove_class(XFDASHBOARD_STYLABLE(priv->dragHandle), styleClass); g_free(styleClass); xfdashboard_stylable_remove_pseudo_class(XFDASHBOARD_STYLABLE(priv->dragHandle), "drag-handle"); /* Forget drag handle */ priv->dragHandle=NULL; } /* Remember new drag handle and set styles */ priv->dragHandle=clutter_drag_action_get_drag_handle(CLUTTER_DRAG_ACTION(self)); if(priv->dragHandle && XFDASHBOARD_IS_ACTOR(priv->dragHandle)) { /* Set style */ if(priv->source) { styleClass=g_strdup_printf("drag-source-%s", G_OBJECT_TYPE_NAME(priv->source)); xfdashboard_stylable_add_class(XFDASHBOARD_STYLABLE(priv->dragHandle), styleClass); g_free(styleClass); } styleClass=g_strdup_printf("drag-actor-%s", G_OBJECT_TYPE_NAME(priv->actor)); xfdashboard_stylable_add_class(XFDASHBOARD_STYLABLE(priv->dragHandle), styleClass); g_free(styleClass); xfdashboard_stylable_add_pseudo_class(XFDASHBOARD_STYLABLE(priv->dragHandle), "drag-handle"); } }
/* Unset focus from actor */ static void _xfdashboard_actor_focusable_unset_focus(XfdashboardFocusable *self) { XfdashboardActor *actor; g_return_if_fail(XFDASHBOARD_IS_FOCUSABLE(self)); g_return_if_fail(XFDASHBOARD_IS_ACTOR(self)); actor=XFDASHBOARD_ACTOR(self); /* Set focus and style for focus */ xfdashboard_stylable_remove_class(XFDASHBOARD_STYLABLE(actor), "focus"); }
/* Dispose this object */ static void _xfdashboard_popup_menu_item_meta_dispose(GObject *inObject) { XfdashboardPopupMenuItemMeta *self=XFDASHBOARD_POPUP_MENU_ITEM_META(inObject); XfdashboardPopupMenuItemMetaPrivate *priv=self->priv; /* Release our allocated variables */ if(priv->popupMenu) { g_object_remove_weak_pointer(G_OBJECT(priv->popupMenu), (gpointer*)&priv->popupMenu); priv->popupMenu=NULL; } if(priv->menuItem) { /* Remove style from menu item if possible */ if(XFDASHBOARD_IS_STYLABLE(priv->menuItem)) { xfdashboard_stylable_remove_class(XFDASHBOARD_STYLABLE(priv->menuItem), "popup-menu-item"); } /* Remove click action from menu item actor */ if(priv->clickAction) { clutter_actor_remove_action(priv->menuItem, priv->clickAction); priv->clickAction=NULL; } /* Release menu item actor */ g_object_remove_weak_pointer(G_OBJECT(priv->menuItem), (gpointer*)&priv->menuItem); priv->menuItem=NULL; } if(priv->callback) { priv->callback=NULL; } if(priv->userData) { priv->userData=NULL; } /* Call parent's class dispose method */ G_OBJECT_CLASS(xfdashboard_popup_menu_item_meta_parent_class)->dispose(inObject); }
/* Call virtual function "unset_focus" */ void xfdashboard_focusable_unset_focus(XfdashboardFocusable *self) { XfdashboardFocusableInterface *iface; ClutterActor *selection; g_return_if_fail(XFDASHBOARD_IS_FOCUSABLE(self)); iface=XFDASHBOARD_FOCUSABLE_GET_IFACE(self); /* Call virtual function */ if(iface->unset_focus) { iface->unset_focus(self); } /* Remove style from unfocused actor */ if(XFDASHBOARD_IS_STYLABLE(self)) { xfdashboard_stylable_remove_class(XFDASHBOARD_STYLABLE(self), "focus"); } /* If actor supports selection get current selection and unstyle it */ if(xfdashboard_focusable_supports_selection(self)) { /* Get current selection */ selection=xfdashboard_focusable_get_selection(self); /* unstyle selection if available */ if(selection && XFDASHBOARD_IS_STYLABLE(selection)) { xfdashboard_stylable_remove_pseudo_class(XFDASHBOARD_STYLABLE(selection), "selected"); } g_debug("Unstyled selection %s for focus loosing actor %s", G_OBJECT_TYPE_NAME(self), selection ? G_OBJECT_TYPE_NAME(selection) : "<nil>"); } /* Emit signal */ g_signal_emit(self, XfdashboardFocusableSignals[SIGNAL_FOCUS_LOST], 0, self); g_debug("Emitted signal 'focus-lost' for focused actor %s", G_OBJECT_TYPE_NAME(self)); }
/* 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)); }
/* Dragging of actor ended */ static void _xfdashboard_drag_action_drag_end(ClutterDragAction *inAction, ClutterActor *inActor, gfloat inStageX, gfloat inStageY, ClutterModifierType inModifiers) { XfdashboardDragAction *self; XfdashboardDragActionPrivate *priv; ClutterDragActionClass *dragActionClass; GSList *list; XfdashboardDropAction *dropTarget; gfloat dropX, dropY; gboolean canDrop; g_return_if_fail(XFDASHBOARD_IS_DRAG_ACTION(inAction)); self=XFDASHBOARD_DRAG_ACTION(inAction); priv=self->priv; dragActionClass=CLUTTER_DRAG_ACTION_CLASS(xfdashboard_drag_action_parent_class); canDrop=FALSE; dropTarget=NULL; /* Hold a reference on ourselve as ClutterAction as the actor where we are bound to * may be destroyed in this function. We need to keep alive this action until * function ends. */ g_object_ref(self); /* Unset styles */ if(priv->source && XFDASHBOARD_IS_ACTOR(priv->source)) { xfdashboard_stylable_remove_pseudo_class(XFDASHBOARD_STYLABLE(priv->source), "drag-source"); } if(XFDASHBOARD_IS_ACTOR(priv->actor)) { xfdashboard_stylable_remove_pseudo_class(XFDASHBOARD_STYLABLE(priv->actor), "dragged"); } if(priv->dragHandle && XFDASHBOARD_IS_ACTOR(priv->dragHandle)) { gchar *styleClass; if(priv->source) { styleClass=g_strdup_printf("drag-source-%s", G_OBJECT_TYPE_NAME(priv->source)); xfdashboard_stylable_remove_class(XFDASHBOARD_STYLABLE(priv->dragHandle), styleClass); g_free(styleClass); } styleClass=g_strdup_printf("drag-actor-%s", G_OBJECT_TYPE_NAME(priv->actor)); xfdashboard_stylable_remove_class(XFDASHBOARD_STYLABLE(priv->dragHandle), styleClass); g_free(styleClass); xfdashboard_stylable_remove_pseudo_class(XFDASHBOARD_STYLABLE(priv->dragHandle), "drag-handle"); priv->dragHandle=NULL; } if(priv->dragHandleChangedID) { g_signal_handler_disconnect(self, priv->dragHandleChangedID); priv->dragHandleChangedID=0; } /* Remove 'destroy' signal on dragged actor */ if(priv->actorDestroySignalID) { g_signal_handler_disconnect(priv->actor, priv->actorDestroySignalID); priv->actorDestroySignalID=0; } /* Remove our listerners for allocation changes */ for(list=priv->targets; list; list=g_slist_next(list)) { XfdashboardDropAction *target=XFDASHBOARD_DROP_ACTION(list->data); ClutterActorMeta *actorMeta=CLUTTER_ACTOR_META(target); ClutterActor *actor=clutter_actor_meta_get_actor(actorMeta); g_signal_handlers_disconnect_by_func(actor, G_CALLBACK(_xfdashboard_drag_on_drop_target_allocation_changed), self); } /* Find drop target at stage coordinate if dragged actor was not destroyed */ if(!priv->dragCancelled) dropTarget=_xfdashboard_drag_action_find_drop_traget_at_coord(self, inStageX, inStageY); /* If drop target was found check if we are allowed to drop on it. */ if(dropTarget) { /* Transform event coordinates relative to drop target */ _xfdashboard_drag_action_transform_stage_point(dropTarget, inStageX, inStageY, &dropX, &dropY); /* Ask drop target if we are allowed to drop dragged actor on it */ g_signal_emit_by_name(dropTarget, "can-drop", self, dropX, dropY, &canDrop); } /* If we cannot drop the draggged actor emit "drag-cancel" on dragged actor */ if(!canDrop) g_signal_emit_by_name(inAction, "drag-cancel", priv->actor, inStageX, inStageY, NULL); /* Iterate through list of drop targets to emit the "end" signal to the ones * on which the dragged actor will not be drop (either they were not the target * or it did not allow to drop on it). The real drop target gets the "drop" * signal. */ for(list=priv->targets; list; list=g_slist_next(list)) { XfdashboardDropAction *target=XFDASHBOARD_DROP_ACTION(list->data); if(canDrop && target && target==dropTarget) { g_signal_emit_by_name(dropTarget, "drop", self, dropX, dropY, NULL); } else { g_signal_emit_by_name(target, "end", self, NULL); } } /* Call parent's class method at last */ if(dragActionClass->drag_end) dragActionClass->drag_end(inAction, inActor, inStageX, inStageY, inModifiers); /* Forget dragged actor as dragging has ended now */ priv->actor=NULL; /* Free list of drop targets and unref each drop target */ if(priv->targets) g_slist_free_full(priv->targets, g_object_unref); priv->targets=NULL; /* Free list of actor we crossed by motion */ if(priv->lastMotionActors) { g_slist_foreach(priv->lastMotionActors, _xfdashboard_drag_action_on_motion_actor_destroyed, self); if(priv->lastMotionActors) g_slist_free(priv->lastMotionActors); priv->lastMotionActors=NULL; } /* Reset variables */ priv->lastDropTarget=NULL; /* Release the reference we took at function beginning */ g_object_unref(self); }