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
116 lines
4.3 KiB
QML
116 lines
4.3 KiB
QML
// Copyright (C) 2017 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
|
|
|
|
import QtQuick 2.9
|
|
import QtQuick.Window 2.2
|
|
|
|
Rectangle {
|
|
id: root
|
|
width: 480
|
|
height: 480
|
|
color: "black"
|
|
|
|
MultiPointTouchArea {
|
|
id: mpta
|
|
anchors.fill: parent
|
|
//onGestureStarted: gesture.grab() // in case this is embedded in something that might steal
|
|
touchPoints: [
|
|
TouchPoint { property color color: "red" },
|
|
TouchPoint { property color color: "orange" },
|
|
TouchPoint { property color color: "lightsteelblue" },
|
|
TouchPoint { property color color: "green" },
|
|
TouchPoint { property color color: "blue" },
|
|
TouchPoint { property color color: "violet" },
|
|
TouchPoint { property color color: "steelblue" },
|
|
TouchPoint { property color color: "magenta" },
|
|
TouchPoint { property color color: "goldenrod" },
|
|
TouchPoint { property color color: "darkgray" }
|
|
] }
|
|
|
|
Repeater {
|
|
model: 10
|
|
|
|
Item {
|
|
id: crosshairs
|
|
property TouchPoint touchPoint
|
|
x: touchPoint.x - width / 2
|
|
y: touchPoint.y - height / 2
|
|
width: 300; height: 300
|
|
visible: touchPoint.pressed
|
|
rotation: touchPoint.rotation
|
|
|
|
Rectangle {
|
|
color: touchPoint.color
|
|
anchors.centerIn: parent
|
|
width: 2; height: parent.height
|
|
antialiasing: true
|
|
}
|
|
Rectangle {
|
|
color: touchPoint.color
|
|
anchors.centerIn: parent
|
|
width: parent.width; height: 2
|
|
antialiasing: true
|
|
}
|
|
Rectangle {
|
|
color: touchPoint.color
|
|
implicitWidth: label.implicitWidth + 8
|
|
implicitHeight: label.implicitHeight + 16
|
|
radius: width / 2
|
|
anchors.centerIn: parent
|
|
antialiasing: true
|
|
Rectangle {
|
|
color: "black"
|
|
opacity: 0.35
|
|
width: (parent.width - 8) * touchPoint.pressure
|
|
height: width
|
|
radius: width / 2
|
|
anchors.centerIn: parent
|
|
antialiasing: true
|
|
}
|
|
Rectangle {
|
|
color: "transparent"
|
|
border.color: "white"
|
|
border.width: 2
|
|
opacity: 0.75
|
|
visible: width > 0
|
|
width: touchPoint.ellipseDiameters.width
|
|
height: touchPoint.ellipseDiameters.height
|
|
radius: Math.min(width, height) / 2
|
|
anchors.centerIn: parent
|
|
antialiasing: true
|
|
}
|
|
Text {
|
|
id: label
|
|
anchors.centerIn: parent
|
|
color: "white"
|
|
horizontalAlignment: Text.AlignHCenter
|
|
verticalAlignment: Text.AlignVCenter
|
|
property string uid: touchPoint.uniqueId === undefined || touchPoint.uniqueId.numericId === -1 ?
|
|
"" : "\nUID " + touchPoint.uniqueId.numericId
|
|
text: "x " + touchPoint.x.toFixed(1) +
|
|
"\ny " + touchPoint.y.toFixed(1) + uid +
|
|
"\nID " + touchPoint.pointId.toString(16) +
|
|
"\n∡" + touchPoint.rotation.toFixed(1) + "°"
|
|
}
|
|
}
|
|
Rectangle {
|
|
id: velocityVector
|
|
visible: width > 0
|
|
width: touchPoint.velocity.length()
|
|
height: 4
|
|
Behavior on width { SmoothedAnimation { duration: 200 } }
|
|
radius: height / 2
|
|
antialiasing: true
|
|
color: "gray"
|
|
x: crosshairs.width / 2
|
|
y: crosshairs.height / 2
|
|
rotation: width > 0 ? Math.atan2(touchPoint.velocity.y, touchPoint.velocity.x) * 180 / Math.PI - crosshairs.rotation : 0
|
|
Behavior on rotation { SmoothedAnimation { duration: 20 } }
|
|
transformOrigin: Item.BottomLeft
|
|
}
|
|
|
|
Component.onCompleted: touchPoint = mpta.touchPoints[index]
|
|
}
|
|
}
|
|
}
|