[linearView] Fix dnd to dash when zoomed out

While zoomed out, the workspaces view's drop target spans the entire
monitor to implement reactive screen edges. When a drop event is not
handled by the view, an attempt is made to pass it on down the stack,
but it doesn't work properly. Fix it by iterating the target's parents
as well.
Also improve the code which translates dnd coordinates to target
positions.

https://bugzilla.gnome.org/show_bug.cgi?id=619203
This commit is contained in:
Florian Müllner 2010-05-20 16:13:27 +02:00
parent 5b971a66ba
commit b3794f1c17
2 changed files with 20 additions and 14 deletions

View File

@ -302,13 +302,14 @@ _Draggable.prototype = {
this._dragActor.show();
while (target) {
if (target._delegate && target._delegate.handleDragOver) {
let [targX, targY] = target.get_transformed_position();
let [r, targX, targY] = target.transform_stage_point(stageX, stageY);
// We currently loop through all parents on drag-over even if one of the children has handled it.
// We can check the return value of the function and break the loop if it's true if we don't want
// to continue checking the parents.
target._delegate.handleDragOver(this.actor._delegate, this._dragActor,
(stageX - targX) / target.scale_x,
(stageY - targY) / target.scale_y,
target._delegate.handleDragOver(this.actor._delegate,
this._dragActor,
targX,
targY,
event.get_time());
}
target = target.get_parent();
@ -328,10 +329,11 @@ _Draggable.prototype = {
this._dragActor.show();
while (target) {
if (target._delegate && target._delegate.acceptDrop) {
let [targX, targY] = target.get_transformed_position();
if (target._delegate.acceptDrop(this.actor._delegate, this._dragActor,
(dropX - targX) / target.scale_x,
(dropY - targY) / target.scale_y,
let [r, targX, targY] = target.transform_stage_point(dropX, dropY);
if (target._delegate.acceptDrop(this.actor._delegate,
this._dragActor,
targX,
targY,
event.get_time())) {
// If it accepted the drop without taking the actor,
// handle it ourselves.

View File

@ -1136,12 +1136,16 @@ SingleView.prototype = {
let target = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
dropActor.show();
if (target._delegate && target._delegate != this && target._delegate.acceptDrop) {
let [targX, targY] = target.get_transformed_position();
return target._delegate.acceptDrop(source, dropActor,
(x - targX) / target.scale_x,
(y - targY) / target.scale_y,
time);
while (target) {
if (target._delegate &&
target._delegate != this &&
target._delegate.acceptDrop) {
let [r, targX, targY] = target.transform_stage_point(x, y);
return target._delegate.acceptDrop(source, dropActor,
targX, targY, time);
}
target = target.get_parent();
}
return false;
}