[gnome-shell] appDisplay: Add a timeout when switching pages during DnD
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] appDisplay: Add a timeout when switching pages during DnD
- Date: Sun, 24 Nov 2019 18:50:14 +0000 (UTC)
commit 5a287a42057d896bd21181cbfbf51cf1d6aef545
Author: Jonas Dreßler <verdre v0yd nl>
Date: Sat Nov 23 22:25:00 2019 +0100
appDisplay: Add a timeout when switching pages during DnD
Currently when dragging an icon to the space above or below the appGrid
to switch pages, we do so very quickly without checking when the last
page-switch happened. This makes it hard to move icons to pages which
are not the first or the last one, since the other pages are skipped
very quickly.
To fix this, add a timeout of 1 second that blocks switching pages after
a page-switch using drag overshoot occured.
Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1693
js/ui/appDisplay.js | 44 ++++++++++++++++++++++++++++++++------------
1 file changed, 32 insertions(+), 12 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 155f33ed47..00745ee7db 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -41,6 +41,7 @@ var APP_ICON_SCALE_IN_TIME = 500;
var APP_ICON_SCALE_IN_DELAY = 700;
const OVERSHOOT_THRESHOLD = 20;
+const OVERSHOOT_TIMEOUT = 1000;
const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
const SWITCHEROO_OBJECT_PATH = '/net/hadess/SwitcherooControl';
@@ -379,6 +380,7 @@ var AllView = GObject.registerClass({
this._availHeight = 0;
this._lastOvershootY = -1;
+ this._lastOvershootTimeoutId = 0;
Main.overview.connect('hidden', () => this.goToPage(0));
this._grid.connect('space-opened', () => {
@@ -774,6 +776,13 @@ var AllView = GObject.registerClass({
this.folderIcons[i].adaptToSize(availWidth, availHeight);
}
+ _resetOvershoot() {
+ if (this._lastOvershootTimeoutId)
+ GLib.source_remove(this._lastOvershootTimeoutId);
+ this._lastOvershootTimeoutId = 0;
+ this._lastOvershootY = -1;
+ }
+
_handleDragOvershoot(dragEvent) {
let [, gridY] = this.get_transformed_position();
let [, gridHeight] = this.get_transformed_size();
@@ -787,7 +796,8 @@ var AllView = GObject.registerClass({
if (dragEvent.y > gridY && dragEvent.y < gridBottom) {
// Check whether we moved out the area of the last switch
if (Math.abs(this._lastOvershootY - dragEvent.y) > OVERSHOOT_THRESHOLD)
- this._lastOvershootY = -1;
+ this._resetOvershoot();
+
return;
}
@@ -795,19 +805,29 @@ var AllView = GObject.registerClass({
if (this._lastOvershootY >= 0)
return;
- this._lastOvershootY = dragEvent.y;
-
- // Moving above the grid
let currentY = this._adjustment.value;
- if (dragEvent.y <= gridY && currentY > 0) {
- this.goToPage(this._grid.currentPage - 1);
- return;
- }
-
- // Moving below the grid
let maxY = this._adjustment.upper - this._adjustment.page_size;
- if (dragEvent.y >= gridBottom && currentY < maxY)
+
+ if (dragEvent.y <= gridY && currentY > 0)
+ this.goToPage(this._grid.currentPage - 1);
+ else if (dragEvent.y >= gridBottom && currentY < maxY)
this.goToPage(this._grid.currentPage + 1);
+ else
+ return; // don't go beyond first/last page
+
+ this._lastOvershootY = dragEvent.y;
+
+ if (this._lastOvershootTimeoutId > 0)
+ GLib.source_remove(this._lastOvershootTimeoutId);
+
+ this._lastOvershootTimeoutId =
+ GLib.timeout_add(GLib.PRIORITY_DEFAULT, OVERSHOOT_TIMEOUT, () => {
+ this._resetOvershoot();
+ this._handleDragOvershoot(dragEvent);
+ return GLib.SOURCE_REMOVE;
+ });
+ GLib.Source.set_name_by_id(this._lastOvershootTimeoutId,
+ '[gnome-shell] this._lastOvershootTimeoutId');
}
_onDragBegin() {
@@ -841,7 +861,7 @@ var AllView = GObject.registerClass({
}
this._eventBlocker.visible = this._currentPopup !== null;
- this._lastOvershootY = -1;
+ this._resetOvershoot();
}
_canAccept(source) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]