[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:
parent
5b971a66ba
commit
b3794f1c17
18
js/ui/dnd.js
18
js/ui/dnd.js
@ -302,13 +302,14 @@ _Draggable.prototype = {
|
|||||||
this._dragActor.show();
|
this._dragActor.show();
|
||||||
while (target) {
|
while (target) {
|
||||||
if (target._delegate && target._delegate.handleDragOver) {
|
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 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
|
// 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.
|
// to continue checking the parents.
|
||||||
target._delegate.handleDragOver(this.actor._delegate, this._dragActor,
|
target._delegate.handleDragOver(this.actor._delegate,
|
||||||
(stageX - targX) / target.scale_x,
|
this._dragActor,
|
||||||
(stageY - targY) / target.scale_y,
|
targX,
|
||||||
|
targY,
|
||||||
event.get_time());
|
event.get_time());
|
||||||
}
|
}
|
||||||
target = target.get_parent();
|
target = target.get_parent();
|
||||||
@ -328,10 +329,11 @@ _Draggable.prototype = {
|
|||||||
this._dragActor.show();
|
this._dragActor.show();
|
||||||
while (target) {
|
while (target) {
|
||||||
if (target._delegate && target._delegate.acceptDrop) {
|
if (target._delegate && target._delegate.acceptDrop) {
|
||||||
let [targX, targY] = target.get_transformed_position();
|
let [r, targX, targY] = target.transform_stage_point(dropX, dropY);
|
||||||
if (target._delegate.acceptDrop(this.actor._delegate, this._dragActor,
|
if (target._delegate.acceptDrop(this.actor._delegate,
|
||||||
(dropX - targX) / target.scale_x,
|
this._dragActor,
|
||||||
(dropY - targY) / target.scale_y,
|
targX,
|
||||||
|
targY,
|
||||||
event.get_time())) {
|
event.get_time())) {
|
||||||
// If it accepted the drop without taking the actor,
|
// If it accepted the drop without taking the actor,
|
||||||
// handle it ourselves.
|
// handle it ourselves.
|
||||||
|
@ -1136,12 +1136,16 @@ SingleView.prototype = {
|
|||||||
let target = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
|
let target = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
|
||||||
dropActor.show();
|
dropActor.show();
|
||||||
|
|
||||||
if (target._delegate && target._delegate != this && target._delegate.acceptDrop) {
|
while (target) {
|
||||||
let [targX, targY] = target.get_transformed_position();
|
if (target._delegate &&
|
||||||
return target._delegate.acceptDrop(source, dropActor,
|
target._delegate != this &&
|
||||||
(x - targX) / target.scale_x,
|
target._delegate.acceptDrop) {
|
||||||
(y - targY) / target.scale_y,
|
|
||||||
time);
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user