feat(ags): add screenshot gui
All checks were successful
Discord / discord commits (push) Has been skipped
All checks were successful
Discord / discord commits (push) Has been skipped
This commit is contained in:
parent
63be8a848c
commit
551880cc24
20 changed files with 458 additions and 328 deletions
|
@ -1,5 +1,10 @@
|
||||||
{nixpkgs-wayland, ...} @ inputs: [
|
{
|
||||||
|
grim-hyprland,
|
||||||
|
nixpkgs-wayland,
|
||||||
|
...
|
||||||
|
} @ inputs: [
|
||||||
(import ./dracula-theme inputs)
|
(import ./dracula-theme inputs)
|
||||||
|
|
||||||
|
grim-hyprland.overlays.default
|
||||||
nixpkgs-wayland.overlay
|
nixpkgs-wayland.overlay
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,110 +0,0 @@
|
||||||
{
|
|
||||||
config,
|
|
||||||
writeShellApplication,
|
|
||||||
stdenvNoCC,
|
|
||||||
jre,
|
|
||||||
fetchFromGitHub,
|
|
||||||
fetchurl,
|
|
||||||
makeWrapper,
|
|
||||||
makeDesktopItem,
|
|
||||||
rsync,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
stdenvNoCC.mkDerivation rec {
|
|
||||||
name = "rars-flatlaf";
|
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
|
||||||
owner = "privat";
|
|
||||||
repo = "rars";
|
|
||||||
rev = "fd34014efd65b3cb5a52f1729c3b8240cae0c332";
|
|
||||||
hash = "sha256-D8X/cr+fnq/OOFYfMG9aPss95J8Z2yiROuF9kmHkK40=";
|
|
||||||
fetchSubmodules = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
desktopItem = let
|
|
||||||
hyprland = config.home-manager.users.${config.vars.mainUser}.wayland.windowManager.hyprland.finalPackage;
|
|
||||||
execScript = writeShellApplication {
|
|
||||||
name = "execScript";
|
|
||||||
runtimeInputs = [hyprland];
|
|
||||||
text = "(sleep 1; hyprctl dispatch togglefloating) & ${name}";
|
|
||||||
};
|
|
||||||
in
|
|
||||||
makeDesktopItem {
|
|
||||||
name = "RARS";
|
|
||||||
desktopName = "RARS";
|
|
||||||
exec = "${execScript}/bin/execScript";
|
|
||||||
icon = name;
|
|
||||||
};
|
|
||||||
|
|
||||||
nativeBuildInputs = [makeWrapper rsync jre];
|
|
||||||
|
|
||||||
installPhase = let
|
|
||||||
flatlaf = fetchurl {
|
|
||||||
url = "https://repo1.maven.org/maven2/com/formdev/flatlaf/3.2/flatlaf-3.2.jar";
|
|
||||||
hash = "sha256-HAG+G9undDXWtySokKl7lkIUCFI7lEBduu+UgSVaxAA=";
|
|
||||||
};
|
|
||||||
icon = fetchurl {
|
|
||||||
url = "https://riscv.or.jp/wp-content/uploads/2019/06/cropped-RISC-V-logo-figonly-mod-2.png";
|
|
||||||
hash = "sha256-e1/iVmadVzyO77ikBr1cdXsJdDj8TiXh3Oyjek9GwqM=";
|
|
||||||
};
|
|
||||||
in
|
|
||||||
/*
|
|
||||||
bash
|
|
||||||
*/
|
|
||||||
''
|
|
||||||
# ./build-jar.sh
|
|
||||||
mkdir -p build
|
|
||||||
find src -name "*.java" | xargs javac --release 8 -d build
|
|
||||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
||||||
find src -type f -not -name "*.java" -exec rsync -R {} build \;
|
|
||||||
else
|
|
||||||
find src -type f -not -name "*.java" -exec cp --parents {} build \;
|
|
||||||
fi
|
|
||||||
cp -rf build/src/* build
|
|
||||||
rm -r build/src
|
|
||||||
cp README.md License.txt build
|
|
||||||
cd build
|
|
||||||
jar cfm ../rars.jar ./META-INF/MANIFEST.MF *
|
|
||||||
chmod +x ../rars.jar
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
# ./build-jar-flatlaf.sh
|
|
||||||
mkdir -p build-flatlaf/
|
|
||||||
cd build-flatlaf/
|
|
||||||
|
|
||||||
cp ${flatlaf} ../flatlaf.jar
|
|
||||||
|
|
||||||
jar x < ../rars.jar
|
|
||||||
jar x < "../flatlaf.jar"
|
|
||||||
|
|
||||||
cat > META-INF/MANIFEST.MF <<EOF
|
|
||||||
Manifest-Version: 1.0
|
|
||||||
Implementation-Version: 3.1.1
|
|
||||||
Multi-Release: true
|
|
||||||
Main-Class: rars.Launch
|
|
||||||
EOF
|
|
||||||
|
|
||||||
jar cfm ../rars-flatlaf.jar META-INF/MANIFEST.MF *
|
|
||||||
chmod +x ../rars-flatlaf.jar
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
# InstallPhase
|
|
||||||
runHook preInstall
|
|
||||||
|
|
||||||
cat > ./rars.desktop <<EOF
|
|
||||||
EOF
|
|
||||||
|
|
||||||
mkdir -p "$out/share/pixmaps"
|
|
||||||
cp "${icon}" "$out/share/pixmaps/${name}.png"
|
|
||||||
install -D $desktopItem/share/applications/* $out/share/applications/rars.desktop
|
|
||||||
|
|
||||||
export JAR=$out/share/java/${name}/${name}.jar
|
|
||||||
install -D ./${name}.jar $JAR
|
|
||||||
makeWrapper ${jre}/bin/java $out/bin/${name} \
|
|
||||||
--add-flags "-jar $JAR"
|
|
||||||
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
}
|
|
BIN
flake.lock
BIN
flake.lock
Binary file not shown.
BIN
flake.nix
BIN
flake.nix
Binary file not shown.
|
@ -8,6 +8,7 @@ import Clipboard from './ts/clipboard/main.ts';
|
||||||
import { NotifPopups, NotifCenter } from './ts/notifications/binto.ts';
|
import { NotifPopups, NotifCenter } from './ts/notifications/binto.ts';
|
||||||
import OSD from './ts/osd/main.ts';
|
import OSD from './ts/osd/main.ts';
|
||||||
import Powermenu from './ts/powermenu.ts';
|
import Powermenu from './ts/powermenu.ts';
|
||||||
|
import Screenshot from './ts/screenshot/main.ts';
|
||||||
|
|
||||||
|
|
||||||
// TODO: add workspace indicator
|
// TODO: add workspace indicator
|
||||||
|
@ -28,6 +29,7 @@ App.config({
|
||||||
Clipboard(),
|
Clipboard(),
|
||||||
NotifCenter(),
|
NotifCenter(),
|
||||||
Powermenu(),
|
Powermenu(),
|
||||||
|
Screenshot(),
|
||||||
|
|
||||||
Bar(),
|
Bar(),
|
||||||
NotifPopups(),
|
NotifPopups(),
|
||||||
|
|
|
@ -38,33 +38,6 @@
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
min-width: 900px;
|
min-width: 900px;
|
||||||
min-height: 650px;
|
min-height: 650px;
|
||||||
|
|
||||||
scrollbar, scrollbar * {
|
|
||||||
all: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
scrollbar.vertical {
|
|
||||||
transition: 200ms;
|
|
||||||
background-color: rgba(23, 23, 23, 0.3);
|
|
||||||
margin: 20px 0;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: rgba(23, 23, 23, 0.7);
|
|
||||||
|
|
||||||
slider {
|
|
||||||
background-color: rgba(238, 238, 238, 0.7);
|
|
||||||
min-width: .6em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
slider {
|
|
||||||
background-color: rgba(238, 238, 238, 0.5);
|
|
||||||
border-radius: 9px;
|
|
||||||
min-width: .4em;
|
|
||||||
min-height: 2em;
|
|
||||||
transition: 200ms;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.placeholder {
|
.placeholder {
|
||||||
|
|
|
@ -38,33 +38,6 @@
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
min-width: 900px;
|
min-width: 900px;
|
||||||
min-height: 750px;
|
min-height: 750px;
|
||||||
|
|
||||||
scrollbar, scrollbar * {
|
|
||||||
all: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
scrollbar.vertical {
|
|
||||||
transition: 200ms;
|
|
||||||
background-color: rgba(23, 23, 23, 0.3);
|
|
||||||
margin: 20px 0;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: rgba(23, 23, 23, 0.7);
|
|
||||||
|
|
||||||
slider {
|
|
||||||
background-color: rgba(238, 238, 238, 0.7);
|
|
||||||
min-width: .6em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
slider {
|
|
||||||
background-color: rgba(238, 238, 238, 0.5);
|
|
||||||
border-radius: 9px;
|
|
||||||
min-width: .4em;
|
|
||||||
min-height: 2em;
|
|
||||||
transition: 200ms;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.item {
|
.item {
|
||||||
|
|
66
modules/ags/config/scss/binto-widgets/screenshot.scss
Normal file
66
modules/ags/config/scss/binto-widgets/screenshot.scss
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
.screenshot {
|
||||||
|
background-color: $bg;
|
||||||
|
color: $fg;
|
||||||
|
border: 2px solid $contrast-bg;
|
||||||
|
|
||||||
|
label {
|
||||||
|
font-size: 20pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
border-bottom: 2px solid $contrast-bg;
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
transition: 200ms;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: rgba(23, 23, 23, 0.7);
|
||||||
|
|
||||||
|
image {
|
||||||
|
-gtk-icon-shadow: 1px 1px $contrast-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
margin: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
image {
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scrolledwindow {
|
||||||
|
min-height: 400px;
|
||||||
|
min-width: 800px;
|
||||||
|
padding: 0 10px;
|
||||||
|
|
||||||
|
box {
|
||||||
|
.item-btn {
|
||||||
|
transition: 200ms;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: rgba(23, 23, 23, 0.7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
image {
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child label {
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child label {
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,7 +8,7 @@ undershoot {
|
||||||
all: unset;
|
all: unset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@import "./common";
|
@import './common';
|
||||||
@import './binto-widgets/applauncher';
|
@import './binto-widgets/applauncher';
|
||||||
@import './binto-widgets/bar';
|
@import './binto-widgets/bar';
|
||||||
@import './binto-widgets/notification';
|
@import './binto-widgets/notification';
|
||||||
|
@ -16,3 +16,4 @@ undershoot {
|
||||||
@import './binto-widgets/osd';
|
@import './binto-widgets/osd';
|
||||||
@import './binto-widgets/powermenu';
|
@import './binto-widgets/powermenu';
|
||||||
@import './binto-widgets/clipboard';
|
@import './binto-widgets/clipboard';
|
||||||
|
@import './binto-widgets/screenshot';
|
||||||
|
|
|
@ -31,3 +31,33 @@ $yellow: #ecd3a0;
|
||||||
$accent: $blue;
|
$accent: $blue;
|
||||||
$javacafe-magenta: #c296eb;
|
$javacafe-magenta: #c296eb;
|
||||||
$javacafe-blue: #86aaec;
|
$javacafe-blue: #86aaec;
|
||||||
|
|
||||||
|
|
||||||
|
scrolledwindow {
|
||||||
|
scrollbar, scrollbar * {
|
||||||
|
all: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbar.vertical {
|
||||||
|
transition: 200ms;
|
||||||
|
background-color: rgba(23, 23, 23, 0.3);
|
||||||
|
margin: 20px 0;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: rgba(23, 23, 23, 0.7);
|
||||||
|
|
||||||
|
slider {
|
||||||
|
background-color: rgba(238, 238, 238, 0.7);
|
||||||
|
min-width: .6em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
slider {
|
||||||
|
background-color: rgba(238, 238, 238, 0.5);
|
||||||
|
border-radius: 9px;
|
||||||
|
min-width: .4em;
|
||||||
|
min-height: 2em;
|
||||||
|
transition: 200ms;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -6,5 +6,5 @@ window {
|
||||||
|
|
||||||
.clock {
|
.clock {
|
||||||
font-size: 80pt;
|
font-size: 80pt;
|
||||||
font-family: "Ubuntu Mono";
|
font-family: 'Ubuntu Mono';
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,33 +39,6 @@
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
min-width: 700px;
|
min-width: 700px;
|
||||||
min-height: 450px;
|
min-height: 450px;
|
||||||
|
|
||||||
scrollbar, scrollbar * {
|
|
||||||
all: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
scrollbar.vertical {
|
|
||||||
transition: 200ms;
|
|
||||||
background-color: rgba(23, 23, 23, 0.3);
|
|
||||||
margin: 20px 0;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: rgba(23, 23, 23, 0.7);
|
|
||||||
|
|
||||||
slider {
|
|
||||||
background-color: rgba(238, 238, 238, 0.7);
|
|
||||||
min-width: .6em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
slider {
|
|
||||||
background-color: rgba(238, 238, 238, 0.5);
|
|
||||||
border-radius: 9px;
|
|
||||||
min-width: .4em;
|
|
||||||
min-height: 2em;
|
|
||||||
transition: 200ms;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.placeholder {
|
.placeholder {
|
||||||
|
|
|
@ -39,33 +39,6 @@
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
min-width: 900px;
|
min-width: 900px;
|
||||||
min-height: 750px;
|
min-height: 750px;
|
||||||
|
|
||||||
scrollbar, scrollbar * {
|
|
||||||
all: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
scrollbar.vertical {
|
|
||||||
transition: 200ms;
|
|
||||||
background-color: rgba(23, 23, 23, 0.3);
|
|
||||||
margin: 20px 0;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: rgba(23, 23, 23, 0.7);
|
|
||||||
|
|
||||||
slider {
|
|
||||||
background-color: rgba(238, 238, 238, 0.7);
|
|
||||||
min-width: .6em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
slider {
|
|
||||||
background-color: rgba(238, 238, 238, 0.5);
|
|
||||||
border-radius: 9px;
|
|
||||||
min-width: .4em;
|
|
||||||
min-height: 2em;
|
|
||||||
transition: 200ms;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.item {
|
.item {
|
||||||
|
|
75
modules/ags/config/scss/wim-widgets/screenshot.scss
Normal file
75
modules/ags/config/scss/wim-widgets/screenshot.scss
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
.screenshot {
|
||||||
|
background-color: $bg;
|
||||||
|
color: $fg;
|
||||||
|
border: 2px solid $contrast-bg;
|
||||||
|
border-radius: 25px;
|
||||||
|
|
||||||
|
label {
|
||||||
|
font-size: 20pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
border-bottom: 2px solid $contrast-bg;
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
transition: 200ms;
|
||||||
|
|
||||||
|
&:hover, &.active {
|
||||||
|
background-color: rgba(23, 23, 23, 0.7);
|
||||||
|
|
||||||
|
image {
|
||||||
|
-gtk-icon-shadow: 1px 1px $contrast-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
margin: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
image {
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-top-left-radius: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-top-right-radius: 25px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scrolledwindow {
|
||||||
|
min-height: 400px;
|
||||||
|
min-width: 800px;
|
||||||
|
padding: 0 10px;
|
||||||
|
|
||||||
|
box {
|
||||||
|
.item-btn {
|
||||||
|
transition: 200ms;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: rgba(23, 23, 23, 0.7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
image {
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child label {
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child label {
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,29 +3,29 @@
|
||||||
border-radius: 80px;
|
border-radius: 80px;
|
||||||
border: 2px solid $bg-secondary;
|
border: 2px solid $bg-secondary;
|
||||||
padding: 3px 12px;
|
padding: 3px 12px;
|
||||||
}
|
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
margin: 0 2.5px;
|
margin: 0 2.5px;
|
||||||
min-height: 22px;
|
min-height: 22px;
|
||||||
min-width: 22px;
|
min-width: 22px;
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
border: 2px solid transparent;
|
border: 2px solid transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.occupied {
|
.occupied {
|
||||||
border: 2px solid $bg;
|
border: 2px solid $bg;
|
||||||
background: $contrast-bg;
|
background: $contrast-bg;
|
||||||
transition: background-color 0.6s ease-in-out;
|
transition: background-color 0.6s ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.urgent {
|
.urgent {
|
||||||
border: 2px solid $bg;
|
border: 2px solid $bg;
|
||||||
background: red;
|
background: red;
|
||||||
transition: background-color 0.6s ease-in-out;
|
transition: background-color 0.6s ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.active {
|
.active {
|
||||||
border: 2px solid #50fa7b;
|
border: 2px solid #50fa7b;
|
||||||
transition: margin-left 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
|
transition: margin-left 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,17 +8,18 @@ undershoot {
|
||||||
all: unset;
|
all: unset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@import "./common";
|
@import './common';
|
||||||
@import "./wim-widgets/powermenu";
|
@import './wim-widgets/powermenu';
|
||||||
@import "./wim-widgets/traybuttons";
|
@import './wim-widgets/traybuttons';
|
||||||
@import "./wim-widgets/workspaces";
|
@import './wim-widgets/workspaces';
|
||||||
@import "./wim-widgets/systray";
|
@import './wim-widgets/systray';
|
||||||
@import "./wim-widgets/notification-center";
|
@import './wim-widgets/notification-center';
|
||||||
@import "./wim-widgets/notification";
|
@import './wim-widgets/notification';
|
||||||
@import "./wim-widgets/date";
|
@import './wim-widgets/date';
|
||||||
@import "./wim-widgets/quick-settings";
|
@import './wim-widgets/quick-settings';
|
||||||
@import "./wim-widgets/player";
|
@import './wim-widgets/player';
|
||||||
@import "./wim-widgets/applauncher";
|
@import './wim-widgets/applauncher';
|
||||||
@import "./wim-widgets/osd";
|
@import './wim-widgets/osd';
|
||||||
@import "./wim-widgets/osk";
|
@import './wim-widgets/osk';
|
||||||
@import "./wim-widgets/clipboard";
|
@import './wim-widgets/clipboard';
|
||||||
|
@import './wim-widgets/screenshot';
|
||||||
|
|
182
modules/ags/config/ts/screenshot/main.ts
Normal file
182
modules/ags/config/ts/screenshot/main.ts
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
const Applications = await Service.import('applications');
|
||||||
|
const Hyprland = await Service.import('hyprland');
|
||||||
|
|
||||||
|
const { Box, Icon, Label, Scrollable, Stack } = Widget;
|
||||||
|
const { execAsync, timeout } = Utils;
|
||||||
|
|
||||||
|
import PopupWindow from '../misc/popup.ts';
|
||||||
|
import CursorBox from '../misc/cursorbox.ts';
|
||||||
|
import { Client } from 'types/service/hyprland';
|
||||||
|
|
||||||
|
|
||||||
|
const takeScreenshot = (selector: string, delay = 1000): void => {
|
||||||
|
App.closeWindow('win-screenshot');
|
||||||
|
timeout(delay, () => {
|
||||||
|
execAsync(['bash', '-c', `grim ${selector} - | satty -f -`])
|
||||||
|
.catch(console.error);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
const windowList = Box({
|
||||||
|
vertical: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const updateWindows = async() => {
|
||||||
|
if (!App.getWindow('win-screenshot')?.visible) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
windowList.children = (JSON.parse(
|
||||||
|
await Hyprland.messageAsync('j/clients'),
|
||||||
|
) as Client[])
|
||||||
|
.filter((client) => client.workspace.id === Hyprland.active.workspace.id)
|
||||||
|
.map((client) => CursorBox({
|
||||||
|
class_name: 'item-btn',
|
||||||
|
|
||||||
|
on_primary_click_release: () => {
|
||||||
|
takeScreenshot(`-w ${client.address}`);
|
||||||
|
},
|
||||||
|
|
||||||
|
child: Box({
|
||||||
|
hpack: 'center',
|
||||||
|
|
||||||
|
children: [
|
||||||
|
Icon(Applications
|
||||||
|
.query(client.class)[0]?.app.get_string('Icon') ?? ''),
|
||||||
|
|
||||||
|
Label({
|
||||||
|
label: client.title,
|
||||||
|
truncate: 'end',
|
||||||
|
max_width_chars: 50,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const stack = Stack({
|
||||||
|
transition: 'slide_left_right',
|
||||||
|
|
||||||
|
children: {
|
||||||
|
monitors: Scrollable({
|
||||||
|
child: Box({
|
||||||
|
vertical: true,
|
||||||
|
}).hook(Hyprland, (self) => {
|
||||||
|
self.children = Hyprland.monitors.map((monitor) => CursorBox({
|
||||||
|
class_name: 'item-btn',
|
||||||
|
|
||||||
|
on_primary_click_release: () => {
|
||||||
|
takeScreenshot(`-o ${monitor.name}`);
|
||||||
|
},
|
||||||
|
|
||||||
|
child: Label({
|
||||||
|
label: `${monitor.name}: ${monitor.description}`,
|
||||||
|
truncate: 'end',
|
||||||
|
max_width_chars: 50,
|
||||||
|
}),
|
||||||
|
}));
|
||||||
|
}, 'notify::monitors'),
|
||||||
|
}),
|
||||||
|
|
||||||
|
windows: Scrollable({
|
||||||
|
child: windowList
|
||||||
|
.hook(Hyprland, updateWindows, 'notify::clients')
|
||||||
|
.hook(Hyprland.active.workspace, updateWindows),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const monitorsButton = CursorBox({
|
||||||
|
class_name: 'header-btn',
|
||||||
|
|
||||||
|
on_primary_click_release: () => {
|
||||||
|
stack.shown = 'monitors';
|
||||||
|
},
|
||||||
|
|
||||||
|
child: Box({
|
||||||
|
hpack: 'center',
|
||||||
|
|
||||||
|
children: [
|
||||||
|
Icon('display-symbolic'),
|
||||||
|
Label('monitors'),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const windowsButton = CursorBox({
|
||||||
|
class_name: 'header-btn',
|
||||||
|
|
||||||
|
on_primary_click_release: () => {
|
||||||
|
stack.shown = 'windows';
|
||||||
|
},
|
||||||
|
|
||||||
|
child: Box({
|
||||||
|
hpack: 'center',
|
||||||
|
|
||||||
|
children: [
|
||||||
|
Icon('window-symbolic'),
|
||||||
|
Label('windows'),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const regionButton = CursorBox({
|
||||||
|
class_name: 'header-btn',
|
||||||
|
|
||||||
|
on_primary_click_release: () => {
|
||||||
|
takeScreenshot('-g "$(slurp)"', 0);
|
||||||
|
},
|
||||||
|
|
||||||
|
child: Box({
|
||||||
|
hpack: 'center',
|
||||||
|
|
||||||
|
children: [
|
||||||
|
Icon('tool-pencil-symbolic'),
|
||||||
|
Label('region'),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
return PopupWindow({
|
||||||
|
name: 'screenshot',
|
||||||
|
on_open: () => {
|
||||||
|
updateWindows();
|
||||||
|
},
|
||||||
|
child: Box({
|
||||||
|
class_name: 'screenshot',
|
||||||
|
vertical: true,
|
||||||
|
|
||||||
|
children: [
|
||||||
|
Box({
|
||||||
|
class_name: 'header',
|
||||||
|
homogeneous: true,
|
||||||
|
|
||||||
|
children: [
|
||||||
|
monitorsButton,
|
||||||
|
windowsButton,
|
||||||
|
regionButton,
|
||||||
|
],
|
||||||
|
}).hook(stack, () => {
|
||||||
|
switch (stack.shown) {
|
||||||
|
case 'monitors':
|
||||||
|
monitorsButton.toggleClassName('active', true);
|
||||||
|
windowsButton.toggleClassName('active', false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'windows':
|
||||||
|
monitorsButton.toggleClassName('active', false);
|
||||||
|
windowsButton.toggleClassName('active', true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}, 'notify::shown'),
|
||||||
|
|
||||||
|
stack,
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
};
|
|
@ -10,6 +10,7 @@ import OSD from './ts/osd/main.ts';
|
||||||
import OSK from './ts/on-screen-keyboard/main.ts';
|
import OSK from './ts/on-screen-keyboard/main.ts';
|
||||||
import Powermenu from './ts/powermenu.ts';
|
import Powermenu from './ts/powermenu.ts';
|
||||||
import QSettings from './ts/quick-settings/main.ts';
|
import QSettings from './ts/quick-settings/main.ts';
|
||||||
|
import Screenshot from './ts/screenshot/main.ts';
|
||||||
|
|
||||||
|
|
||||||
App.config({
|
App.config({
|
||||||
|
@ -30,6 +31,7 @@ App.config({
|
||||||
OSK(),
|
OSK(),
|
||||||
Powermenu(),
|
Powermenu(),
|
||||||
QSettings(),
|
QSettings(),
|
||||||
|
Screenshot(),
|
||||||
|
|
||||||
Bar(),
|
Bar(),
|
||||||
BgFade(),
|
BgFade(),
|
||||||
|
|
|
@ -146,15 +146,17 @@ in {
|
||||||
];
|
];
|
||||||
|
|
||||||
bind = [
|
bind = [
|
||||||
"$mainMod SHIFT, E, exec, ags -t win-powermenu"
|
"$mainMod SHIFT, E , exec, ags -t win-powermenu"
|
||||||
"$mainMod , D, exec, ags -t win-applauncher"
|
"$mainMod , D , exec, ags -t win-applauncher"
|
||||||
|
"$mainMod , V , exec, ags -t win-clipboard"
|
||||||
|
" , Print, exec, ags -t win-screenshot"
|
||||||
];
|
];
|
||||||
binde = [
|
binde = [
|
||||||
## Brightness control
|
## Brightness control
|
||||||
", XF86MonBrightnessUp, exec, ags -r 'Brightness.screen += 0.05'"
|
", XF86MonBrightnessUp , exec, ags -r 'Brightness.screen += 0.05'"
|
||||||
", XF86MonBrightnessDown, exec, ags -r 'Brightness.screen -= 0.05'"
|
", XF86MonBrightnessDown, exec, ags -r 'Brightness.screen -= 0.05'"
|
||||||
];
|
];
|
||||||
bindn = [" , Escape, exec, ags -r 'closeAll()'"];
|
bindn = [" , Escape , exec, ags -r 'closeAll()'"];
|
||||||
bindr = ["CAPS, Caps_Lock, exec, ags -r 'Brightness.fetchCapsState()'"];
|
bindr = ["CAPS, Caps_Lock, exec, ags -r 'Brightness.fetchCapsState()'"];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
}: let
|
}: let
|
||||||
inherit (lib) makeLibraryPath optionalString;
|
inherit (lib) makeLibraryPath optionalString;
|
||||||
inherit (pkgs.writers) writeTOML;
|
inherit (pkgs.writers) writeTOML;
|
||||||
|
|
||||||
inherit (config.vars) mainUser;
|
inherit (config.vars) mainUser;
|
||||||
flakeDir = config.environment.variables.FLAKE;
|
flakeDir = config.environment.variables.FLAKE;
|
||||||
in {
|
in {
|
||||||
|
@ -46,14 +47,14 @@ in {
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
home.packages =
|
||||||
|
(with pkgs; [
|
||||||
# School
|
# School
|
||||||
xournalpp
|
xournalpp
|
||||||
virt-manager
|
virt-manager
|
||||||
libreoffice-fresh # TODO: declarative conf?
|
libreoffice-fresh # TODO: declarative conf?
|
||||||
hunspell
|
hunspell
|
||||||
hunspellDicts.en_CA
|
hunspellDicts.en_CA
|
||||||
config.customPkgs.rars-flatlaf
|
|
||||||
|
|
||||||
# Apps
|
# Apps
|
||||||
thunderbird # TODO: use programs.thunderbird
|
thunderbird # TODO: use programs.thunderbird
|
||||||
|
@ -68,44 +69,30 @@ in {
|
||||||
wl-color-picker
|
wl-color-picker
|
||||||
wl-clipboard
|
wl-clipboard
|
||||||
cliphist
|
cliphist
|
||||||
grim
|
grim-hyprland
|
||||||
slurp
|
slurp
|
||||||
satty
|
satty
|
||||||
|
])
|
||||||
# TODO: make an ags widget to select windows, screens or a selection
|
++ [
|
||||||
(writeShellApplication {
|
|
||||||
name = "screenshot";
|
|
||||||
runtimeInputs = [
|
|
||||||
config.programs.hyprland.package
|
|
||||||
satty
|
|
||||||
grim
|
|
||||||
jq
|
|
||||||
];
|
|
||||||
text = ''
|
|
||||||
screen=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')
|
|
||||||
exec grim -o "$screen" - | satty -f -
|
|
||||||
'';
|
|
||||||
})
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Discord themes for Vencord
|
Discord themes for Vencord
|
||||||
https://markchan0225.github.io/RoundedDiscord/RoundedDiscord.theme.css
|
https://markchan0225.github.io/RoundedDiscord/RoundedDiscord.theme.css
|
||||||
https://raw.githubusercontent.com/dracula/BetterDiscord/master/Dracula_Official.theme.css
|
https://raw.githubusercontent.com/dracula/BetterDiscord/master/Dracula_Official.theme.css
|
||||||
*/
|
*/
|
||||||
(symlinkJoin {
|
(pkgs.symlinkJoin {
|
||||||
name = "discord";
|
name = "discord";
|
||||||
paths = [
|
paths = [
|
||||||
(discord.override {
|
(pkgs.discord.override {
|
||||||
withOpenASAR = true;
|
withOpenASAR = true;
|
||||||
withVencord = true;
|
withVencord = true;
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
buildInputs = [makeWrapper];
|
buildInputs = [pkgs.makeWrapper];
|
||||||
postBuild = ''
|
postBuild = ''
|
||||||
wrapProgram $out/bin/Discord ${optionalString config.nvidia.enable
|
wrapProgram $out/bin/Discord ${optionalString config.nvidia.enable
|
||||||
''--prefix LD_LIBRARY_PATH : "${makeLibraryPath [
|
''--prefix LD_LIBRARY_PATH : "${makeLibraryPath [
|
||||||
addOpenGLRunpath.driverLink
|
pkgs.addOpenGLRunpath.driverLink
|
||||||
libglvnd
|
pkgs.libglvnd
|
||||||
]}"''} \
|
]}"''} \
|
||||||
--add-flags "--enable-features=UseOzonePlatform,WebRTCPipeWireCapturer --ozone-platform=wayland"
|
--add-flags "--enable-features=UseOzonePlatform,WebRTCPipeWireCapturer --ozone-platform=wayland"
|
||||||
'';
|
'';
|
||||||
|
@ -144,11 +131,6 @@ in {
|
||||||
bind = [
|
bind = [
|
||||||
"$mainMod, Q, exec, foot"
|
"$mainMod, Q, exec, foot"
|
||||||
|
|
||||||
# Clipboard History
|
|
||||||
"$mainMod, V, exec, ags -t win-clipboard"
|
|
||||||
|
|
||||||
" , Print, exec, screenshot"
|
|
||||||
"$mainMod, Print, exec, grim -g \"$(slurp)\" - | satty -f -"
|
|
||||||
"$mainMod SHIFT, C, exec, wl-color-picker"
|
"$mainMod SHIFT, C, exec, wl-color-picker"
|
||||||
|
|
||||||
"$mainMod, T, togglespecialworkspace, thunder"
|
"$mainMod, T, togglespecialworkspace, thunder"
|
||||||
|
|
Loading…
Reference in a new issue