dnd: Add timeoutThreshold setting
This setting (by default, 0) sets a time threshold in order to allow DnD. If the drag is shorter than this threshold, DnD will be cancelled, and event handling left to the next handlers. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1774>
This commit is contained in:
parent
279db3f168
commit
ecead8c727
29
js/ui/dnd.js
29
js/ui/dnd.js
@ -80,10 +80,13 @@ function removeDragMonitor(monitor) {
|
|||||||
|
|
||||||
var _Draggable = class _Draggable {
|
var _Draggable = class _Draggable {
|
||||||
constructor(actor, params) {
|
constructor(actor, params) {
|
||||||
params = Params.parse(params, { manualMode: false,
|
params = Params.parse(params, {
|
||||||
restoreOnSuccess: false,
|
manualMode: false,
|
||||||
dragActorMaxSize: undefined,
|
timeoutThreshold: 0,
|
||||||
dragActorOpacity: undefined });
|
restoreOnSuccess: false,
|
||||||
|
dragActorMaxSize: undefined,
|
||||||
|
dragActorOpacity: undefined,
|
||||||
|
});
|
||||||
|
|
||||||
this.actor = actor;
|
this.actor = actor;
|
||||||
this._dragState = DragState.INIT;
|
this._dragState = DragState.INIT;
|
||||||
@ -108,6 +111,7 @@ var _Draggable = class _Draggable {
|
|||||||
this._restoreOnSuccess = params.restoreOnSuccess;
|
this._restoreOnSuccess = params.restoreOnSuccess;
|
||||||
this._dragActorMaxSize = params.dragActorMaxSize;
|
this._dragActorMaxSize = params.dragActorMaxSize;
|
||||||
this._dragActorOpacity = params.dragActorOpacity;
|
this._dragActorOpacity = params.dragActorOpacity;
|
||||||
|
this._dragTimeoutThreshold = params.timeoutThreshold;
|
||||||
|
|
||||||
this._buttonDown = false; // The mouse button has been pressed and has not yet been released.
|
this._buttonDown = false; // The mouse button has been pressed and has not yet been released.
|
||||||
this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting).
|
this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting).
|
||||||
@ -127,6 +131,8 @@ var _Draggable = class _Draggable {
|
|||||||
let [stageX, stageY] = event.get_coords();
|
let [stageX, stageY] = event.get_coords();
|
||||||
this._dragStartX = stageX;
|
this._dragStartX = stageX;
|
||||||
this._dragStartY = stageY;
|
this._dragStartY = stageY;
|
||||||
|
this._dragStartTime = event.get_time();
|
||||||
|
this._dragThresholdIgnored = false;
|
||||||
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
}
|
}
|
||||||
@ -148,6 +154,8 @@ var _Draggable = class _Draggable {
|
|||||||
|
|
||||||
this._buttonDown = true;
|
this._buttonDown = true;
|
||||||
this._grabActor(event.get_device(), event.get_event_sequence());
|
this._grabActor(event.get_device(), event.get_event_sequence());
|
||||||
|
this._dragStartTime = event.get_time();
|
||||||
|
this._dragThresholdIgnored = false;
|
||||||
|
|
||||||
let [stageX, stageY] = event.get_coords();
|
let [stageX, stageY] = event.get_coords();
|
||||||
this._dragStartX = stageX;
|
this._dragStartX = stageX;
|
||||||
@ -491,14 +499,23 @@ var _Draggable = class _Draggable {
|
|||||||
_maybeStartDrag(event) {
|
_maybeStartDrag(event) {
|
||||||
let [stageX, stageY] = event.get_coords();
|
let [stageX, stageY] = event.get_coords();
|
||||||
|
|
||||||
|
if (this._dragThresholdIgnored)
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
// See if the user has moved the mouse enough to trigger a drag
|
// See if the user has moved the mouse enough to trigger a drag
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
let threshold = St.Settings.get().drag_threshold * scaleFactor;
|
let threshold = St.Settings.get().drag_threshold * scaleFactor;
|
||||||
if (!currentDraggable &&
|
if (!currentDraggable &&
|
||||||
(Math.abs(stageX - this._dragStartX) > threshold ||
|
(Math.abs(stageX - this._dragStartX) > threshold ||
|
||||||
Math.abs(stageY - this._dragStartY) > threshold)) {
|
Math.abs(stageY - this._dragStartY) > threshold)) {
|
||||||
this.startDrag(stageX, stageY, event.get_time(), this._touchSequence, event.get_device());
|
if ((event.get_time() - this._dragStartTime) > this._dragTimeoutThreshold) {
|
||||||
this._updateDragPosition(event);
|
this.startDrag(stageX, stageY, event.get_time(), this._touchSequence, event.get_device());
|
||||||
|
this._updateDragPosition(event);
|
||||||
|
} else {
|
||||||
|
this._dragThresholdIgnored = true;
|
||||||
|
this._ungrabActor();
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user