static gboolean mx_toggle_handle_button_release_event (ClutterActor *actor, ClutterButtonEvent *event, MxToggle *toggle) { ClutterActorBox box; if (mx_widget_get_disabled (MX_WIDGET (toggle))) return FALSE; if (toggle->priv->last_move == 0) mx_toggle_set_active (toggle, !toggle->priv->active); else mx_toggle_set_active (toggle, (toggle->priv->last_move > 0.0)); toggle->priv->drag_offset = -1; toggle->priv->last_move = 0; clutter_ungrab_pointer (); /* ensure the hover state is removed if the pointer left the handle * during the grab */ clutter_actor_get_allocation_box (actor, &box); if (!clutter_actor_box_contains (&box, event->x, event->y)) mx_stylable_style_pseudo_class_remove (MX_STYLABLE (actor), "hover"); return TRUE; }
//doc ClutterActorBox contains(x1, y1) IO_METHOD(IoClutterActorBox, contains) { float x = IoMessage_locals_floatArgAt_(m, locals, 0), y = IoMessage_locals_floatArgAt_(m, locals, 1); int contains = clutter_actor_box_contains(IOCABOX(self), x, y); return IOBOOL(self, contains); }
/* Sort drop action targets */ static gint _xfdashboard_drag_action_sort_targets_callback(gconstpointer inLeft, gconstpointer inRight) { ClutterActor *actor1, *actor2; gfloat depth1, depth2; gfloat x1, y1, w1, h1; gfloat x2, y2, w2, h2; ClutterActorBox *box1, *box2; gint numberPoint1, numberPoint2; g_return_val_if_fail(XFDASHBOARD_IS_DROP_ACTION(inLeft) && XFDASHBOARD_IS_DROP_ACTION(inRight), 0); actor1=clutter_actor_meta_get_actor(CLUTTER_ACTOR_META(inLeft)); actor2=clutter_actor_meta_get_actor(CLUTTER_ACTOR_META(inRight)); /* Return -1 if actor in inLeft should be inserted before actor in inRight * and return 1 if otherwise. If both actors can be handled equal then * return 0. But how to decide? * The actor with higher z-depth should be inserted before. If both actors * have equal z-depth then the actor with the most edge points within the * other actor (overlap) should be inserted before. Edge points are: * [left,top], [right,top], [left,bottom] and [right, bottom]. */ depth1=clutter_actor_get_z_position(actor1); depth2=clutter_actor_get_z_position(actor2); if(depth1>depth2) return(-1); else if(depth1<depth2) return(1); clutter_actor_get_transformed_position(actor1, &x1, &y1); clutter_actor_get_transformed_size(actor1, &w1, &h1); box1=clutter_actor_box_new(x1, y1, x1+w1, y1+h1); clutter_actor_get_transformed_position(actor2, &x2, &y2); clutter_actor_get_transformed_size(actor2, &w2, &h2); box2=clutter_actor_box_new(x2, y2, x2+w2, y2+h2); numberPoint1 =(clutter_actor_box_contains(box1, x2, y2) ? 1 : 0); numberPoint1+=(clutter_actor_box_contains(box1, x2+w2, y2) ? 1 : 0); numberPoint1+=(clutter_actor_box_contains(box1, x2, y2+h2) ? 1 : 0); numberPoint1+=(clutter_actor_box_contains(box1, x2+w2, y2+h2) ? 1 : 0); numberPoint2 =(clutter_actor_box_contains(box2, x1, y1) ? 1 : 0); numberPoint2+=(clutter_actor_box_contains(box2, x1+w1, y1) ? 1 : 0); numberPoint2+=(clutter_actor_box_contains(box2, x1, y1+h1) ? 1 : 0); numberPoint2+=(clutter_actor_box_contains(box2, x1+w1, y1+h1) ? 1 : 0); clutter_actor_box_free(box1); clutter_actor_box_free(box2); /* Return result */ if(numberPoint1>numberPoint2) return(1); else if(numberPoint2>numberPoint1) return(-1); return(0); }