This file is indexed.

/usr/share/unity8/Components/DraggingArea.qml is in unity8-common 8.12+16.04.20160401-0ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
 * Copyright (C) 2013 Canonical, Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 3.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import QtQuick 2.4
import Ubuntu.Components 1.3

MouseArea {
    id: draggingArea

    property int orientation: Qt.Vertical
    property bool dragging
    property real dragVelocity: 0
    property real dragValue: (orientation == Qt.Vertical ? (mouseY - __pressedPosition.y)
                                                            : (mouseX - __pressedPosition.x))
    property real lateralPosition: orientation == Qt.Horizontal ? MathUtils.clamp(mouseY, 0, height) : MathUtils.clamp(mouseX, 0, width)
    property point __pressedPosition: Qt.point(0, 0)
    property var __dragEvents: []
    property bool clickValidated: true
    property bool zeroVelocityCounts: false

    // Can be replaced with a fake implementation during tests
    // property var __getCurrentTimeMs: function () { return new Date().getTime() }
    property var __dateTime: new function() {
        this.getCurrentTimeMs = function() {return new Date().getTime()}
    }


    signal dragStart
    signal dragEnd

    onDragValueChanged: {
        if (dragValue != 0 && pressed) {
            dragging = true
        }
    }

    onDraggingChanged: {
        if (dragging) {
            dragStart()
        }
        else {
            dragEnd()
        }
    }

    function updateSpeed() {
        var totalSpeed = 0
        for (var i=0; i<__dragEvents.length; i++) {
            totalSpeed += __dragEvents[i][3]
        }

        if (zeroVelocityCounts || Math.abs(totalSpeed) > 0.001) {
            dragVelocity = totalSpeed / __dragEvents.length * 1000
        }
    }

    function cullOldDragEvents(currentTime) {
        // cull events older than 50 ms but always keep the latest 2 events
        for (var numberOfCulledEvents=0; numberOfCulledEvents<__dragEvents.length-2; numberOfCulledEvents++) {
            // __dragEvents[numberOfCulledEvents][0] is the dragTime
            if (currentTime - __dragEvents[numberOfCulledEvents][0] <= 50) break
        }

        __dragEvents.splice(0, numberOfCulledEvents)
    }

    function getEventSpeed(currentTime, event) {
        if (__dragEvents.length != 0) {
            var lastDrag = __dragEvents[__dragEvents.length-1]
            var duration = Math.max(1, currentTime - lastDrag[0])
            if (orientation == Qt.Vertical) {
                return (event.y - lastDrag[2]) / duration
            } else {
                return (event.x - lastDrag[1]) / duration
            }
        } else {
            return 0
        }
    }

    function pushDragEvent(event) {
        var currentTime = __dateTime.getCurrentTimeMs()
        __dragEvents.push([currentTime, event.x, event.y, getEventSpeed(currentTime, event)])
        cullOldDragEvents(currentTime)
        updateSpeed()
    }

    onPositionChanged: {
        if (dragging) {
            pushDragEvent(mouse)
        }
        if (!draggingArea.containsMouse)
            clickValidated = false
    }

    onPressed: {
        __pressedPosition = Qt.point(mouse.x, mouse.y)
        __dragEvents = []
        pushDragEvent(mouse)
        clickValidated = true
    }

    onReleased: {
        dragging = false
        __pressedPosition = Qt.point(mouse.x, mouse.y)
    }

    onCanceled: {
        dragging = false
    }
}