Add terminal spawning quickshell config
This commit is contained in:
parent
6a824b8a58
commit
8364a3b9b9
9 changed files with 308 additions and 72 deletions
|
@ -4,4 +4,5 @@ import Quickshell
|
|||
Image {
|
||||
required property ShellScreen screen;
|
||||
source: Qt.resolvedUrl(screen.name == "DP-1" ? "5120x1440.png" : "1920x1080.png")
|
||||
asynchronous: false
|
||||
}
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
import Quickshell
|
||||
import Quickshell.Wayland
|
||||
import QtQuick
|
||||
import ".."
|
||||
|
||||
ShellRoot {
|
||||
Variants {
|
||||
model: Quickshell.screens
|
||||
PanelWindow {
|
||||
id: window
|
||||
|
||||
property var modelData
|
||||
screen: modelData
|
||||
|
||||
WlrLayershell.layer: WlrLayer.Background
|
||||
anchors {
|
||||
top: true
|
||||
bottom: true
|
||||
left: true
|
||||
right: true
|
||||
}
|
||||
|
||||
color: "#111111"
|
||||
|
||||
BackgroundImage {
|
||||
anchors.fill: parent
|
||||
screen: window.screen
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2,12 +2,13 @@
|
|||
inherit (inputs) quickshell;
|
||||
in {
|
||||
home.packages = with pkgs; [
|
||||
qt6.qtimageformats # amog
|
||||
quickshell.packages.${system}.default
|
||||
pamtester # lockscreen
|
||||
];
|
||||
|
||||
xdg.configFile."quickshell/manifest.conf".text = lib.generators.toKeyValue {} {
|
||||
background = impurity.link ./background;
|
||||
shell = impurity.link ./shell;
|
||||
lockscreen = impurity.link ./lockscreen;
|
||||
};
|
||||
}
|
||||
|
|
27
modules/user/modules/quickshell/shell/SelectionArea.qml
Normal file
27
modules/user/modules/quickshell/shell/SelectionArea.qml
Normal file
|
@ -0,0 +1,27 @@
|
|||
import QtQuick
|
||||
|
||||
Item {
|
||||
id: root
|
||||
required property var screen;
|
||||
required property var selectionArea;
|
||||
signal selectionComplete(x: real, y: real, width: real, height: real)
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
|
||||
onPressed: {
|
||||
selectionArea.startX = mouseX;
|
||||
selectionArea.startY = mouseY;
|
||||
selectionArea.endX = mouseX;
|
||||
selectionArea.endY = mouseY;
|
||||
selectionArea.selecting = true;
|
||||
}
|
||||
|
||||
onPositionChanged: {
|
||||
selectionArea.endX = mouseX;
|
||||
selectionArea.endY = mouseY;
|
||||
}
|
||||
|
||||
onReleased: selectionArea.endSelection();
|
||||
}
|
||||
}
|
87
modules/user/modules/quickshell/shell/SelectionLayer.qml
Normal file
87
modules/user/modules/quickshell/shell/SelectionLayer.qml
Normal file
|
@ -0,0 +1,87 @@
|
|||
import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Wayland
|
||||
|
||||
WlrLayershell {
|
||||
signal selectionComplete(x: real, y: real, width: real, height: real)
|
||||
|
||||
color: "transparent"
|
||||
visible: selectionArea.selecting || selectionArea.initializing
|
||||
layer: WlrLayer.Overlay
|
||||
namespace: "termspawner"
|
||||
|
||||
anchors {
|
||||
left: true
|
||||
right: true
|
||||
top: true
|
||||
bottom: true
|
||||
}
|
||||
|
||||
property var selectionArea: area
|
||||
|
||||
Rectangle {
|
||||
id: area
|
||||
property bool selecting: false
|
||||
property bool initializing: false
|
||||
property real startX: 0
|
||||
property real startY: 0
|
||||
property real endX: 0
|
||||
property real endY: 0
|
||||
|
||||
readonly property bool bigEnough: width > 50 && height > 50
|
||||
|
||||
border.color: bigEnough ? "#ee33ccff" : "#aa595959"
|
||||
border.width: 1
|
||||
radius: 5
|
||||
color: "#66001017"
|
||||
visible: selecting
|
||||
|
||||
x: Math.min(startX, endX)
|
||||
y: Math.min(startY, endY)
|
||||
width: Math.max(startX, endX) - x
|
||||
height: Math.max(startY, endY) - y
|
||||
|
||||
function startSelection() {
|
||||
initializing = true
|
||||
if (selecting) {
|
||||
area.startX = mouseArea.mouseX;
|
||||
area.startY = mouseArea.mouseY;
|
||||
area.endX = mouseArea.mouseX;
|
||||
area.endY = mouseArea.mouseY;
|
||||
}
|
||||
}
|
||||
|
||||
function endSelection() {
|
||||
const wasSelecting = selecting;
|
||||
selecting = false;
|
||||
initializing = false;
|
||||
|
||||
if (wasSelecting && bigEnough) {
|
||||
selectionComplete(x, y, width, height);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: mouseArea
|
||||
anchors.fill: parent
|
||||
|
||||
hoverEnabled: true
|
||||
onPositionChanged: {
|
||||
if (area.initializing) {
|
||||
if (!containsMouse) {
|
||||
area.initializing = false;
|
||||
return;
|
||||
}
|
||||
|
||||
area.startX = mouseX;
|
||||
area.startY = mouseY;
|
||||
area.initializing = false;
|
||||
area.selecting = true;
|
||||
}
|
||||
|
||||
area.endX = mouseX;
|
||||
area.endY = mouseY;
|
||||
}
|
||||
}
|
||||
}
|
31
modules/user/modules/quickshell/shell/ShellIpc.qml
Normal file
31
modules/user/modules/quickshell/shell/ShellIpc.qml
Normal file
|
@ -0,0 +1,31 @@
|
|||
pragma Singleton
|
||||
|
||||
import Quickshell
|
||||
import Quickshell.Io
|
||||
|
||||
Singleton {
|
||||
property bool termSelect: false;
|
||||
|
||||
SocketServer {
|
||||
active: true
|
||||
path: "/run/user/1000/quickshell.sock"
|
||||
|
||||
handler: Socket {
|
||||
parser: SplitParser {
|
||||
onRead: message => {
|
||||
console.log(message)
|
||||
switch (message) {
|
||||
case "termselect:start":
|
||||
termSelect = true;
|
||||
break;
|
||||
case "termselect:stop":
|
||||
termSelect = false;
|
||||
break;
|
||||
default:
|
||||
console.log(`socket received unknown message: ${message}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
117
modules/user/modules/quickshell/shell/shell.qml
Normal file
117
modules/user/modules/quickshell/shell/shell.qml
Normal file
|
@ -0,0 +1,117 @@
|
|||
import Quickshell
|
||||
import Quickshell.Io
|
||||
import Quickshell.Wayland
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import ".."
|
||||
|
||||
ShellRoot {
|
||||
Variants {
|
||||
model: Quickshell.screens
|
||||
|
||||
Scope {
|
||||
property var modelData
|
||||
|
||||
PanelWindow {
|
||||
id: window
|
||||
|
||||
screen: modelData
|
||||
WlrLayershell.layer: WlrLayer.Background
|
||||
|
||||
anchors {
|
||||
top: true
|
||||
bottom: true
|
||||
left: true
|
||||
right: true
|
||||
}
|
||||
|
||||
color: "#111111"
|
||||
|
||||
BackgroundImage {
|
||||
anchors.fill: parent
|
||||
screen: window.screen
|
||||
}
|
||||
|
||||
SelectionLayer {
|
||||
id: selectionLayer
|
||||
|
||||
onSelectionComplete: (x, y, width, height) => {
|
||||
console.log(`selection complete: ${x} ${y} ${width} ${height}`)
|
||||
termSpawner.x = x
|
||||
termSpawner.y = y
|
||||
termSpawner.width = width
|
||||
termSpawner.height = height
|
||||
termSpawner.running = true
|
||||
}
|
||||
|
||||
Process {
|
||||
id: termSpawner
|
||||
property real x;
|
||||
property real y;
|
||||
property real width;
|
||||
property real height;
|
||||
|
||||
command: ["hyprctl", "dispatch", "exec", `[float;; noanim; move ${x} ${y}; size ${width} ${height}] alacritty`]
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: ShellIpc
|
||||
|
||||
function onTermSelectChanged() {
|
||||
|
||||
if (ShellIpc.termSelect) {
|
||||
selectionLayer.selectionArea.startSelection();
|
||||
} else {
|
||||
selectionLayer.selectionArea.endSelection();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SelectionArea {
|
||||
anchors.fill: parent
|
||||
screen: window.screen
|
||||
selectionArea: selectionLayer.selectionArea
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
PanelWindow {
|
||||
screen: modelData
|
||||
WlrLayershell.layer: WlrLayer.Overlay
|
||||
|
||||
anchors {
|
||||
right: true
|
||||
bottom: true
|
||||
}
|
||||
|
||||
margins {
|
||||
right: 50
|
||||
bottom: 50
|
||||
}
|
||||
|
||||
width: content.width
|
||||
height: content.height
|
||||
|
||||
color: "transparent"
|
||||
mask: Region {}
|
||||
|
||||
ColumnLayout {
|
||||
id: content
|
||||
|
||||
Text {
|
||||
text: "Activate Linux"
|
||||
color: "#50ffffff"
|
||||
font.pointSize: 22
|
||||
}
|
||||
|
||||
Text {
|
||||
text: "Go to Settings to activate Linux"
|
||||
color: "#50ffffff"
|
||||
font.pointSize: 14
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue