f31522130f
Build system (5 gaps hardened): - COOKBOOK_OFFLINE defaults to true (fork-mode) - normalize_patch handles diff -ruN format - New 'repo validate-patches' command (25/25 relibc patches) - 14 patched Qt/Wayland/display recipes added to protected list - relibc archive regenerated with current patch chain Boot fixes (fixable): - Full ISO EFI partition: 16 MiB → 1 MiB (matches mini, BIOS hardcoded 2 MiB offset) - D-Bus system bus: absolute /usr/bin/dbus-daemon path (was skipped) - redbear-sessiond: absolute /usr/bin/redbear-sessiond path (was skipped) - daemon framework: silenced spurious INIT_NOTIFY warnings for oneshot_async services (P0-daemon-silence-init-notify.patch) - udev-shim: demoted INIT_NOTIFY warning to INFO (expected for oneshot_async) - relibc: comprehensive named semaphores (sem_open/close/unlink) replacing upstream todo!() stubs - greeterd: Wayland socket timeout 15s → 30s (compositor DRM wait) - greeter-ui: built and linked (header guard unification, sem_compat stubs removed) - mc: un-ignored in both configs, fixed glib/libiconv/pcre2 transitive deps - greeter config: removed stale keymapd dependency from display/greeter services - prefix toolchain: relibc headers synced, _RELIBC_STDLIB_H guard unified Unfixable (diagnosed, upstream): - i2c-hidd: abort on no-I2C-hardware (QEMU) — process::exit → relibc abort - kded6/greeter-ui: page fault 0x8 — Qt library null deref - Thread panics fd != -1 — Rust std library on Redox - DHCP timeout / eth0 MAC — QEMU user-mode networking - hwrngd/thermald — no hardware RNG/thermal in VM - live preload allocation — BIOS memory fragmentation, continues on demand
408 lines
14 KiB
QML
408 lines
14 KiB
QML
// Copyright (C) 2021 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
|
|
|
|
import QtQuick
|
|
import "qrc:/quick/shared/" as Examples
|
|
|
|
Rectangle {
|
|
id: root
|
|
|
|
Item {
|
|
id: flickArea
|
|
anchors.fill: parent
|
|
anchors.bottomMargin: bottomFlow.implicitHeight + 4
|
|
clip: true
|
|
|
|
Flickable {
|
|
id: flick
|
|
anchors.fill: parent
|
|
anchors.margins: 6
|
|
contentWidth: text.implicitWidth
|
|
contentHeight: text.implicitHeight
|
|
pixelAligned: pxAlignCB.checked
|
|
synchronousDrag: syncDragCB.checked
|
|
Text {
|
|
id: text
|
|
text: "foo bar"
|
|
font.family: "mono"
|
|
}
|
|
onContentXChanged: canvas.requestPaint()
|
|
onContentYChanged: canvas.requestPaint()
|
|
maximumFlickVelocity: maxVelocitySlider.value
|
|
flickDeceleration: decelSlider.value
|
|
}
|
|
|
|
Timer { id: fadeTimer; interval: 1000; onTriggered: { hfade.start(); } }
|
|
|
|
MouseArea {
|
|
id: verticalScrollArea
|
|
anchors {
|
|
right: parent.right
|
|
top: flick.top
|
|
bottom: flick.bottom
|
|
}
|
|
width: 36
|
|
onMouseYChanged: {
|
|
var contentY = Math.min(height, mouseY) / height * (flick.contentHeight - height)
|
|
flick.contentY = Math.max(0, contentY)
|
|
}
|
|
onReleased: flick.returnToBounds()
|
|
Rectangle {
|
|
anchors.right: parent.right
|
|
anchors.margins: 2
|
|
color: "darkgrey"
|
|
width: 20
|
|
radius: 2
|
|
antialiasing: true
|
|
height: flick.height * (flick.height / flick.contentHeight) - anchors.margins * 2
|
|
y: flick.contentY * (flick.height / flick.contentHeight)
|
|
|
|
Rectangle {
|
|
anchors.top: parent.top
|
|
width: parent.width
|
|
height: 6
|
|
radius: 2
|
|
color: "blue"
|
|
visible: flick.atYBeginning
|
|
}
|
|
|
|
Rectangle {
|
|
anchors.top: parent.bottom
|
|
width: parent.width
|
|
height: 6
|
|
radius: 2
|
|
color: "blue"
|
|
visible: flick.atYEnd
|
|
}
|
|
|
|
Text {
|
|
anchors.centerIn: parent
|
|
text: flick.contentY.toFixed(2)
|
|
rotation: 90
|
|
style: Text.Outline
|
|
styleColor: "white"
|
|
color: "black"
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
id: horizontalScrollDecorator
|
|
anchors.bottom: flick.bottom
|
|
anchors.bottomMargin: -4
|
|
color: "darkgrey"
|
|
border.color: "black"
|
|
border.width: 1
|
|
height: 5
|
|
radius: 2
|
|
antialiasing: true
|
|
width: flick.width * (flick.width / flick.contentWidth) - (height - anchors.margins) * 2
|
|
x: flick.contentX * (flick.width / flick.contentWidth)
|
|
NumberAnimation on opacity { id: hfade; to: 0; duration: 500 }
|
|
onXChanged: { opacity = 1.0; fadeTimer.restart() }
|
|
}
|
|
|
|
Canvas {
|
|
id: canvas
|
|
anchors.fill: parent
|
|
antialiasing: true
|
|
renderTarget: Canvas.FramebufferObject
|
|
onPaint: {
|
|
var ctx = canvas.getContext('2d');
|
|
ctx.save()
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height)
|
|
ctx.strokeStyle = "green"
|
|
ctx.fillStyle = "green"
|
|
ctx.lineWidth = 1
|
|
|
|
if (flick.horizontalVelocity) {
|
|
ctx.save()
|
|
ctx.beginPath()
|
|
ctx.translate((flick.horizontalVelocity < 0 ? width : 0), height / 2)
|
|
ctx.moveTo(0, 0)
|
|
var velScaled = flick.horizontalVelocity / 10
|
|
var arrowOffset = (flick.horizontalVelocity < 0 ? 10 : -10)
|
|
ctx.lineTo(velScaled, 0)
|
|
ctx.lineTo(velScaled + arrowOffset, -4)
|
|
ctx.lineTo(velScaled + arrowOffset, 4)
|
|
ctx.lineTo(velScaled, 0)
|
|
ctx.closePath()
|
|
ctx.stroke()
|
|
ctx.fill()
|
|
ctx.restore()
|
|
}
|
|
|
|
if (flick.verticalVelocity) {
|
|
ctx.save()
|
|
ctx.beginPath()
|
|
ctx.translate(width / 2, (flick.verticalVelocity < 0 ? height : 0))
|
|
ctx.moveTo(0, 0)
|
|
var velScaled = flick.verticalVelocity / 10
|
|
var arrowOffset = (flick.verticalVelocity < 0 ? 10 : -10)
|
|
ctx.lineTo(0, velScaled)
|
|
ctx.lineTo(-4, velScaled + arrowOffset)
|
|
ctx.lineTo(4, velScaled + arrowOffset)
|
|
ctx.lineTo(0, velScaled)
|
|
ctx.closePath()
|
|
ctx.stroke()
|
|
ctx.fill()
|
|
ctx.restore()
|
|
}
|
|
|
|
ctx.restore()
|
|
}
|
|
}
|
|
}
|
|
|
|
Row {
|
|
id: bottomFlow
|
|
anchors.bottom: parent.bottom
|
|
width: parent.width - 12
|
|
height: 110
|
|
x: 6
|
|
spacing: 12
|
|
|
|
Item {
|
|
id: progFlickItem
|
|
width: progFlickRow.implicitWidth
|
|
height: progFlickRow.implicitHeight + 4 + flickingLabel.implicitHeight
|
|
Text { id: progLabel; text: "programmatic flick: h " + xvelSlider.value.toFixed(1) + " v " + yvelSlider.value.toFixed(1) }
|
|
Row {
|
|
id: progFlickRow
|
|
y: progLabel.height
|
|
spacing: 4
|
|
|
|
Column {
|
|
Examples.Slider {
|
|
id: xvelSlider
|
|
min: -5000
|
|
max: 5000
|
|
init: 5000
|
|
width: 250
|
|
name: "X"
|
|
minLabelWidth: 0
|
|
}
|
|
Examples.Slider {
|
|
id: yvelSlider
|
|
min: -5000
|
|
max: 5000
|
|
init: 2500
|
|
width: 250
|
|
name: "Y"
|
|
minLabelWidth: 0
|
|
}
|
|
}
|
|
|
|
Grid {
|
|
columns: 2
|
|
spacing: 2
|
|
Examples.Button {
|
|
text: "flick"
|
|
onClicked: flick.flick(xvelSlider.value, yvelSlider.value)
|
|
width: zeroButton.width
|
|
}
|
|
Examples.Button {
|
|
text: "cancel"
|
|
onClicked: flick.cancelFlick()
|
|
width: zeroButton.width
|
|
}
|
|
Examples.Button {
|
|
id: zeroButton
|
|
text: "<- zero"
|
|
onClicked: {
|
|
xvelSlider.setValue(5000)
|
|
yvelSlider.setValue(5000)
|
|
}
|
|
}
|
|
Examples.Button {
|
|
text: "home"
|
|
width: zeroButton.width
|
|
onClicked: {
|
|
flick.contentX = 0
|
|
flick.contentY = 0
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Column {
|
|
height: parent.height
|
|
width: movingLabel.implicitWidth * 1.5
|
|
spacing: 2
|
|
Text {
|
|
id: movingLabel
|
|
text: "moving:"
|
|
color: flick.moving ? "green" : "black"
|
|
}
|
|
Rectangle {
|
|
width: parent.width
|
|
height: hVelLabel.implicitHeight + 4
|
|
color: flick.movingHorizontally ? "green" : "darkgrey"
|
|
Text {
|
|
id: hVelLabel
|
|
anchors.centerIn: parent
|
|
color: "white"
|
|
text: "h " + flick.horizontalVelocity.toFixed(2)
|
|
}
|
|
}
|
|
Rectangle {
|
|
width: parent.width
|
|
height: vVelLabel.implicitHeight + 4
|
|
color: flick.movingVertically ? "green" : "darkgrey"
|
|
Text {
|
|
id: vVelLabel
|
|
anchors.centerIn: parent
|
|
color: "white"
|
|
text: "v " + flick.verticalVelocity.toFixed(2)
|
|
}
|
|
Examples.Slider {
|
|
id: maxVelocitySlider
|
|
name: "max vel"
|
|
anchors.left: parent.left
|
|
anchors.top: parent.bottom
|
|
max: 10000
|
|
init: 2500
|
|
}
|
|
Text {
|
|
anchors.left: maxVelocitySlider.right
|
|
anchors.verticalCenter: maxVelocitySlider.verticalCenter
|
|
text: Math.round(flick.maximumFlickVelocity)
|
|
}
|
|
Examples.Slider {
|
|
id: decelSlider
|
|
name: "decel"
|
|
anchors.right: maxVelocitySlider.right
|
|
anchors.top: maxVelocitySlider.bottom
|
|
min: 0
|
|
max: 10000
|
|
init: 1500
|
|
}
|
|
Text {
|
|
anchors.left: decelSlider.right
|
|
anchors.verticalCenter: decelSlider.verticalCenter
|
|
text: Math.round(flick.flickDeceleration)
|
|
}
|
|
}
|
|
}
|
|
|
|
Column {
|
|
height: parent.height
|
|
width: draggingLabel.implicitWidth
|
|
spacing: 2
|
|
Text {
|
|
id: draggingLabel
|
|
text: "dragging:"
|
|
color: flick.dragging ? "green" : "black"
|
|
}
|
|
Rectangle {
|
|
width: draggingLabel.implicitWidth
|
|
height: hVelLabel.implicitHeight + 4
|
|
color: flick.draggingHorizontally ? "green" : "darkgrey"
|
|
Text {
|
|
anchors.centerIn: parent
|
|
color: "white"
|
|
text: "h"
|
|
}
|
|
}
|
|
Rectangle {
|
|
width: draggingLabel.implicitWidth
|
|
height: vVelLabel.implicitHeight + 4
|
|
color: flick.draggingVertically ? "green" : "darkgrey"
|
|
Text {
|
|
anchors.centerIn: parent
|
|
color: "white"
|
|
text: "v"
|
|
}
|
|
}
|
|
}
|
|
|
|
Column {
|
|
height: parent.height
|
|
width: flickingLabel.implicitWidth
|
|
spacing: 2
|
|
Text {
|
|
id: flickingLabel
|
|
text: "flicking:"
|
|
color: flick.flicking ? "green" : "black"
|
|
}
|
|
Rectangle {
|
|
width: flickingLabel.implicitWidth
|
|
height: hVelLabel.implicitHeight + 4
|
|
color: flick.flickingHorizontally ? "green" : "darkgrey"
|
|
Text {
|
|
anchors.centerIn: parent
|
|
color: "white"
|
|
text: "h"
|
|
}
|
|
}
|
|
Rectangle {
|
|
width: flickingLabel.implicitWidth
|
|
height: vVelLabel.implicitHeight + 4
|
|
color: flick.flickingVertically ? "green" : "darkgrey"
|
|
Text {
|
|
anchors.centerIn: parent
|
|
color: "white"
|
|
text: "v"
|
|
}
|
|
}
|
|
}
|
|
|
|
Column {
|
|
spacing: 2
|
|
Examples.CheckBox {
|
|
id: pxAlignCB
|
|
text: "pixel aligned"
|
|
}
|
|
Examples.CheckBox {
|
|
id: syncDragCB
|
|
text: "synchronous drag"
|
|
}
|
|
Text {
|
|
text: "content X " + flick.contentX.toFixed(2) + " Y " + flick.contentY.toFixed(2)
|
|
}
|
|
}
|
|
|
|
Column {
|
|
Row {
|
|
spacing: 2
|
|
Examples.Button {
|
|
id: decrButton
|
|
text: "-"
|
|
onClicked: flick.flickDeceleration -= 100
|
|
Timer {
|
|
running: decrButton.pressed
|
|
interval: 100; repeat: true
|
|
onTriggered: flick.flickDeceleration -= 100
|
|
}
|
|
}
|
|
Text {
|
|
horizontalAlignment: Text.AlignHCenter
|
|
text: "decel:\n" + flick.flickDeceleration.toFixed(4)
|
|
}
|
|
Examples.Button {
|
|
id: incrButton
|
|
text: "+"
|
|
onClicked: flick.flickDeceleration += 100
|
|
}
|
|
Timer {
|
|
running: incrButton.pressed
|
|
interval: 100; repeat: true
|
|
onTriggered: flick.flickDeceleration += 100
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Component.onCompleted: {
|
|
var request = new XMLHttpRequest()
|
|
request.open('GET', 'qrc:/flicktext.qml')
|
|
request.onreadystatechange = function(event) {
|
|
if (request.readyState === XMLHttpRequest.DONE)
|
|
text.text = request.responseText
|
|
}
|
|
request.send()
|
|
}
|
|
}
|