Work on AGS
parent
693057fd48
commit
73d50fe80f
|
@ -0,0 +1,46 @@
|
|||
import { GTK_ALIGN_CENTER, GTK_ALIGN_END, GTK_ALIGN_START } from "../constants.js"
|
||||
import { Clock } from "./Clock.js"
|
||||
import { SysTray } from "./Systray.js"
|
||||
|
||||
function BarStart() {
|
||||
return Widget.Box({
|
||||
halign: GTK_ALIGN_START,
|
||||
children: [
|
||||
Widget.Label({ label: "Start" }),
|
||||
Widget.Button({ label: "Button", onClicked: () => App.ToggleWindow("media2") }),
|
||||
],
|
||||
})
|
||||
}
|
||||
function BarCenter() {
|
||||
return Widget.Box({
|
||||
halign: GTK_ALIGN_CENTER,
|
||||
children: [
|
||||
Clock(),
|
||||
],
|
||||
})
|
||||
}
|
||||
function BarEnd() {
|
||||
return Widget.Box({
|
||||
halign: GTK_ALIGN_END,
|
||||
children: [
|
||||
SysTray(),
|
||||
],
|
||||
})
|
||||
}
|
||||
|
||||
export function Bar(monitor = 0) {
|
||||
return Widget.Window({
|
||||
monitor,
|
||||
exclusivity: "exclusive",
|
||||
className: "bar",
|
||||
margins: [5, 5, 0, 5],
|
||||
name: `bar${monitor}`,
|
||||
anchor: ["left", "top", "right"],
|
||||
child: Widget.CenterBox({
|
||||
vertical: false,
|
||||
startWidget: BarStart(),
|
||||
centerWidget: BarCenter(),
|
||||
endWidget: BarEnd(),
|
||||
})
|
||||
})
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
const time = Variable("", {
|
||||
poll: [1000, 'date "+%H:%M"'],
|
||||
})
|
||||
|
||||
const date = Variable("", {
|
||||
poll: [1000, 'date "+%Y-%m-%d"'],
|
||||
})
|
||||
|
||||
export function Clock() {
|
||||
return Widget.Box({
|
||||
className: "clock",
|
||||
vertical: true,
|
||||
children: [
|
||||
Widget.Label({
|
||||
className: "time",
|
||||
label: time.bind(),
|
||||
}),
|
||||
Widget.Label({
|
||||
className: "date",
|
||||
label: date.bind(),
|
||||
}),
|
||||
],
|
||||
})
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
const systemtray = await Service.import("systemtray")
|
||||
|
||||
export function SysTray() {
|
||||
const items = systemtray.bind("items")
|
||||
.as(items => items.map(item => Widget.Button({
|
||||
child: Widget.Icon({ icon: item.bind("icon") }),
|
||||
on_primary_click: (_, event) => item.activate(event),
|
||||
on_secondary_click: (_, event) => item.openMenu(event),
|
||||
tooltip_markup: item.bind("tooltip_markup"),
|
||||
})))
|
||||
|
||||
return Widget.Box({
|
||||
className: "systray",
|
||||
children: items,
|
||||
})
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
@define-color ctp-rosewater #f5e0dc;
|
||||
@define-color ctp-flamingo #f2cdcd;
|
||||
@define-color ctp-pink #f5c2e7;
|
||||
@define-color ctp-mauve #cba6f7;
|
||||
@define-color ctp-red #f38ba8;
|
||||
@define-color ctp-maroon #eba0ac;
|
||||
@define-color ctp-peach #fab387;
|
||||
@define-color ctp-yellow #f9e2af;
|
||||
@define-color ctp-green #a6e3a1;
|
||||
@define-color ctp-teal #94e2d5;
|
||||
@define-color ctp-sky #89dceb;
|
||||
@define-color ctp-sapphire #74c7ec;
|
||||
@define-color ctp-blue #89b4fa;
|
||||
@define-color ctp-lavender #b4befe;
|
||||
@define-color ctp-text #cdd6f4;
|
||||
@define-color ctp-subtext1 #bac2de;
|
||||
@define-color ctp-subtext0 #a6adc8;
|
||||
@define-color ctp-overlay2 #9399b2;
|
||||
@define-color ctp-overlay1 #7f849c;
|
||||
@define-color ctp-overlay0 #6c7086;
|
||||
@define-color ctp-surface2 #585b70;
|
||||
@define-color ctp-surface1 #45475a;
|
||||
@define-color ctp-surface0 #313244;
|
||||
@define-color ctp-base #1e1e2e;
|
||||
@define-color ctp-mantle #181825;
|
||||
@define-color ctp-crust #11111b;
|
||||
|
||||
button {
|
||||
background: @ctp-surface0;
|
||||
border: none;
|
||||
}
|
||||
|
||||
button:active, button:hover, button:focus {
|
||||
background: @ctp-surface1;
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
import { Media } from "./media/Media.js";
|
||||
import { Bar } from "./bar/Bar.js";
|
||||
import { Notifications } from "./notifications/Notifications.js";
|
||||
|
||||
|
||||
App.config({
|
||||
style: "./style.css",
|
||||
windows: [
|
||||
Bar(2),
|
||||
Media(2),
|
||||
Notifications(2),
|
||||
]
|
||||
})
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
export const GTK_ALIGN_FILL = 0;
|
||||
export const GTK_ALIGN_START = 1;
|
||||
export const GTK_ALIGN_END = 2;
|
||||
export const GTK_ALIGN_CENTER = 3;
|
||||
export const GTK_ALIGN_BASELINE = 4;
|
|
@ -0,0 +1,50 @@
|
|||
const mpris = await Service.import("mpris")
|
||||
const players = mpris.bind("players")
|
||||
|
||||
const FALLBACK_ICON = "audio-x-generic-symbolic"
|
||||
const PLAY_ICON = "media-playback-start-symbolic"
|
||||
const PAUSE_ICON = "media-playback-pause-symbolic"
|
||||
const PREV_ICON = "media-skip-backward-symbolic"
|
||||
const NEXT_ICON = "media-skip-forward-symbolic"
|
||||
|
||||
/** @param {number} length */
|
||||
function lengthStr(length) {
|
||||
const min = Math.floor(length / 60)
|
||||
const sec = Math.floor(length % 60)
|
||||
const sec0 = sec < 10 ? "0" : ""
|
||||
return `${min}:${sec0}${sec}`
|
||||
}
|
||||
|
||||
/** @param {import('types/service/mpris').MprisPlayer} player */
|
||||
function Player(player) {
|
||||
return Widget.Label({ label: `${player.name}: ${player.cover_path}` })
|
||||
// return Widget.Overlay({
|
||||
// child: Widget.Box({
|
||||
// class_name: "img",
|
||||
// vpack: "start",
|
||||
// css: player.bind("cover_path").transform(p => `background-image: url('${p}');`),
|
||||
// }),
|
||||
// overlays: [
|
||||
// Widget.Label({ label: player.name }),
|
||||
// ],
|
||||
// })
|
||||
}
|
||||
|
||||
function MediaContent() {
|
||||
return Widget.Box({
|
||||
children: players.as(p => p.map(Player)),
|
||||
})
|
||||
}
|
||||
|
||||
export function Media(monitor = 0) {
|
||||
return Widget.Window({
|
||||
monitor,
|
||||
visible: false,
|
||||
exclusivity: "normal",
|
||||
className: "media",
|
||||
margins: [10, 10, 0, 10],
|
||||
name: `media${monitor}`,
|
||||
anchor: ["left", "top"],
|
||||
child: MediaContent(),
|
||||
})
|
||||
}
|
|
@ -0,0 +1,129 @@
|
|||
const notifications = await Service.import("notifications")
|
||||
|
||||
/** @param {import('resource:///com/github/Aylur/ags/service/notifications.js').Notification} n */
|
||||
function NotificationIcon({ app_entry, app_icon, image }) {
|
||||
if (image) {
|
||||
return Widget.Box({
|
||||
css: `background-image: url("${image}");`
|
||||
+ "background-size: contain;"
|
||||
+ "background-repeat: no-repeat;"
|
||||
+ "background-position: center;",
|
||||
})
|
||||
}
|
||||
|
||||
let icon = "dialog-information-symbolic"
|
||||
if (Utils.lookUpIcon(app_icon))
|
||||
icon = app_icon
|
||||
|
||||
if (app_entry && Utils.lookUpIcon(app_entry))
|
||||
icon = app_entry
|
||||
|
||||
return Widget.Box({
|
||||
child: Widget.Icon(icon),
|
||||
})
|
||||
}
|
||||
|
||||
/** @param {import('resource:///com/github/Aylur/ags/service/notifications.js').Notification} n */
|
||||
function Notification(n) {
|
||||
const icon = Widget.Box({
|
||||
vpack: "start",
|
||||
class_name: "icon",
|
||||
child: NotificationIcon(n),
|
||||
})
|
||||
|
||||
const title = Widget.Label({
|
||||
class_name: "title",
|
||||
xalign: 0,
|
||||
justification: "left",
|
||||
hexpand: true,
|
||||
max_width_chars: 24,
|
||||
label: n.summary,
|
||||
use_markup: true,
|
||||
})
|
||||
|
||||
const body = Widget.Label({
|
||||
class_name: "body",
|
||||
hexpand: true,
|
||||
use_markup: true,
|
||||
xalign: 0,
|
||||
justification: "left",
|
||||
label: n.body,
|
||||
wrap: true,
|
||||
})
|
||||
|
||||
const content = Widget.Box({
|
||||
className: "content",
|
||||
children: [
|
||||
icon,
|
||||
Widget.Box({
|
||||
vertical: true,
|
||||
children: [
|
||||
title,
|
||||
body,
|
||||
]
|
||||
}),
|
||||
],
|
||||
})
|
||||
|
||||
const actions = Widget.Box({
|
||||
className: "actions",
|
||||
children: n.actions.map(({ id, label }) => Widget.Button({
|
||||
className: "action",
|
||||
on_clicked: () => {
|
||||
n.invoke(id)
|
||||
n.dismiss()
|
||||
},
|
||||
hexpand: true,
|
||||
child: Widget.Label(label),
|
||||
})),
|
||||
})
|
||||
|
||||
|
||||
return Widget.EventBox({
|
||||
attribute: { id: n.id },
|
||||
onPrimaryClick: n.dismiss,
|
||||
child: Widget.Box({
|
||||
classNames: ["notification", n.urgency],
|
||||
vertical: true,
|
||||
children: [
|
||||
content,
|
||||
actions,
|
||||
],
|
||||
}),
|
||||
})
|
||||
}
|
||||
|
||||
function NotificationList() {
|
||||
const list = Widget.Box({
|
||||
css: "min-width: 2px; min-height: 2px;",
|
||||
vertical: true,
|
||||
spacing: 10,
|
||||
children: notifications.popups.map(Notification),
|
||||
})
|
||||
|
||||
function onNotified(_, /** @type {number} */ id) {
|
||||
const n = notifications.getNotification(id)
|
||||
if (n)
|
||||
list.children = [Notification(n), ...list.children]
|
||||
}
|
||||
|
||||
function onDismissed(_, /** @type {number} */ id) {
|
||||
list.children.find(n => n.attribute.id === id)?.destroy()
|
||||
}
|
||||
|
||||
list.hook(notifications, onNotified, "notified")
|
||||
.hook(notifications, onDismissed, "dismissed")
|
||||
return list
|
||||
}
|
||||
|
||||
export function Notifications(monitor = 0) {
|
||||
return Widget.Window({
|
||||
monitor,
|
||||
exclusivity: "normal",
|
||||
className: "notifications",
|
||||
margins: [10, 10, 10, 10],
|
||||
name: `notifications${monitor}`,
|
||||
anchor: ["left", "top"],
|
||||
child: NotificationList(),
|
||||
})
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
.notification {
|
||||
min-width: 300px;
|
||||
padding: 10px;
|
||||
background-color: alpha(@ctp-base, 0.7);
|
||||
border-radius: 5px;
|
||||
|
||||
border: 1px solid;
|
||||
border-left: 5px solid;
|
||||
border-color: @ctp-overlay1;
|
||||
}
|
||||
|
||||
.notification.low {
|
||||
border-color: @ctp-base;
|
||||
}
|
||||
|
||||
.notification.critical {
|
||||
border-color: @ctp-red;
|
||||
}
|
||||
|
||||
.notification .icon {
|
||||
min-width: 68px;
|
||||
min-height: 68px;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
.notification .icon image {
|
||||
font-size: 58px;
|
||||
/* to center the icon */
|
||||
margin: 5px;
|
||||
color: @ctp-text;
|
||||
}
|
||||
|
||||
.notification .icon box {
|
||||
min-width: 68px;
|
||||
min-height: 68px;
|
||||
border-radius: 7px;
|
||||
}
|
||||
|
||||
.notification .actions .action {
|
||||
margin: 0 .4em;
|
||||
margin-top: .8em;
|
||||
}
|
||||
|
||||
.notification .actions .action:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.notification .actions .action:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.notification .title {
|
||||
color: @ctp-text;
|
||||
font-size: 1.4em;
|
||||
}
|
||||
|
||||
.notification .body {
|
||||
color: @ctp-subtext0;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
@import url("colors.css");
|
||||
@import url("notifications/style.css");
|
||||
|
||||
|
||||
.bar > box {
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
|
||||
background-color: alpha(@ctp-base, 0.95);
|
||||
color: @ctp-text;
|
||||
}
|
||||
|
||||
|
||||
.clock .time {
|
||||
font-weight: bold;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.clock .date {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
.media > box {
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
|
||||
background-color: alpha(@ctp-base, 0.95);
|
||||
color: @ctp-text;
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2022",
|
||||
"module": "ES2022",
|
||||
"lib": [
|
||||
"ES2022"
|
||||
],
|
||||
"allowJs": true,
|
||||
"checkJs": true,
|
||||
"strict": true,
|
||||
"noImplicitAny": false,
|
||||
"baseUrl": ".",
|
||||
"typeRoots": [
|
||||
"./types"
|
||||
],
|
||||
"skipLibCheck": true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
/home/kalle/.local/share/com.github.Aylur.ags/types
|
|
@ -0,0 +1,15 @@
|
|||
{ inputs
|
||||
, lib
|
||||
, config
|
||||
, pkgs
|
||||
, ...
|
||||
}:
|
||||
|
||||
{
|
||||
imports = [ inputs.ags.homeManagerModules.default ];
|
||||
programs.ags = {
|
||||
enable = true;
|
||||
configDir = ./config;
|
||||
};
|
||||
}
|
||||
|
|
@ -8,7 +8,6 @@
|
|||
{
|
||||
programs.eww = {
|
||||
enable = true;
|
||||
package = pkgs.eww-wayland;
|
||||
|
||||
configDir = ./config;
|
||||
};
|
||||
|
|
249
flake.lock
249
flake.lock
|
@ -1,5 +1,59 @@
|
|||
{
|
||||
"nodes": {
|
||||
"ags": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1721306136,
|
||||
"narHash": "sha256-VKPsIGf3/a+RONBipx4lEE4LXG2sdMNkWQu22LNQItg=",
|
||||
"owner": "Aylur",
|
||||
"repo": "ags",
|
||||
"rev": "344ea72cd3b8d4911f362fec34bce7d8fb37028c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "Aylur",
|
||||
"repo": "ags",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"aquamarine": {
|
||||
"inputs": {
|
||||
"hyprutils": [
|
||||
"hyprland",
|
||||
"hyprutils"
|
||||
],
|
||||
"hyprwayland-scanner": [
|
||||
"hyprland",
|
||||
"hyprwayland-scanner"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1721571743,
|
||||
"narHash": "sha256-hat7wggtDISBJD8kTo5MTrT+IsY/Ha2MwgjmqqijoCA=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "aquamarine",
|
||||
"rev": "601f6cf95cbe4fef02dc7faf34bba58566c914e9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "aquamarine",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"home-manager": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
|
@ -7,11 +61,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1708988456,
|
||||
"narHash": "sha256-RCz7Xe64tN2zgWk+MVHkzg224znwqknJ1RnB7rVqUWw=",
|
||||
"lastModified": 1721534365,
|
||||
"narHash": "sha256-XpZOkaSJKdOsz1wU6JfO59Rx2fqtcarQ0y6ndIOKNpI=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "1d085ea4444d26aa52297758b333b449b2aa6fca",
|
||||
"rev": "635563f245309ef5320f80c7ebcb89b2398d2949",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -21,23 +75,79 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprland-protocols": {
|
||||
"hyprcursor": {
|
||||
"inputs": {
|
||||
"hyprlang": [
|
||||
"hyprland",
|
||||
"hyprlang"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"xdg-desktop-portal-hyprland",
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"xdg-desktop-portal-hyprland",
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1691753796,
|
||||
"narHash": "sha256-zOEwiWoXk3j3+EoF3ySUJmberFewWlagvewDRuWYAso=",
|
||||
"lastModified": 1721330371,
|
||||
"narHash": "sha256-aYlHTWylczLt6ERJyg6E66Y/XSCbVL7leVcRuJmVbpI=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprcursor",
|
||||
"rev": "4493a972b48f9c3014befbbf381ed5fff91a65dc",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprcursor",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprland": {
|
||||
"inputs": {
|
||||
"aquamarine": "aquamarine",
|
||||
"hyprcursor": "hyprcursor",
|
||||
"hyprlang": "hyprlang",
|
||||
"hyprutils": "hyprutils",
|
||||
"hyprwayland-scanner": "hyprwayland-scanner",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"systems": "systems_2",
|
||||
"xdph": "xdph"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1721668777,
|
||||
"narHash": "sha256-QNKSZDkZ5+0a+g0wZoZfcWuH1Fy3ZvIeKg0grNdwnHc=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprland",
|
||||
"rev": "4c3b03516209a49244a8f044143c1162752b8a7a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprland",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprland-protocols": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"xdph",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"xdph",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1718746314,
|
||||
"narHash": "sha256-HUklK5u86w2Yh9dOkk4FdsL8eehcOZ95jPhLixGDRQY=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprland-protocols",
|
||||
"rev": "0c2ce70625cb30aef199cb388f99e19a61a6ce03",
|
||||
"rev": "1b61f0093afff20ab44d88ad707aed8bf2215290",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -48,18 +158,25 @@
|
|||
},
|
||||
"hyprlang": {
|
||||
"inputs": {
|
||||
"hyprutils": [
|
||||
"hyprland",
|
||||
"hyprutils"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"xdg-desktop-portal-hyprland",
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": "systems"
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1708681732,
|
||||
"narHash": "sha256-ULZZLZ9C33G13IaXLuAc4oTzHUvnATI8Fj2u6gzMfT0=",
|
||||
"lastModified": 1721324361,
|
||||
"narHash": "sha256-BiJKO0IIdnSwHQBSrEJlKlFr753urkLE48wtt0UhNG4=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprlang",
|
||||
"rev": "f4466367ef0a92a6425d482050dc2b8840c0e644",
|
||||
"rev": "adbefbf49664a6c2c8bf36b6487fd31e3eb68086",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -68,13 +185,79 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprutils": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1721324102,
|
||||
"narHash": "sha256-WAZ0X6yJW1hFG6otkHBfyJDKRpNP5stsRqdEuHrFRpk=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprutils",
|
||||
"rev": "962582a090bc233c4de9d9897f46794280288989",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprutils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprwayland-scanner": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1721324119,
|
||||
"narHash": "sha256-SOOqIT27/X792+vsLSeFdrNTF+OSRp5qXv6Te+fb2Qg=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprwayland-scanner",
|
||||
"rev": "a048a6cb015340bd82f97c1f40a4b595ca85cc30",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprwayland-scanner",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1709150264,
|
||||
"narHash": "sha256-HofykKuisObPUfj0E9CJVfaMhawXkYx3G8UIFR/XQ38=",
|
||||
"lastModified": 1721379653,
|
||||
"narHash": "sha256-8MUgifkJ7lkZs3u99UDZMB4kbOxvMEXQZ31FO3SopZ0=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "1d9c2c9b3e71b9ee663d11c5d298727dace8d374",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1721379653,
|
||||
"narHash": "sha256-8MUgifkJ7lkZs3u99UDZMB4kbOxvMEXQZ31FO3SopZ0=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "9099616b93301d5cf84274b184a3a5ec69e94e08",
|
||||
"rev": "1d9c2c9b3e71b9ee663d11c5d298727dace8d374",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -103,11 +286,11 @@
|
|||
"plugin-rainbow-delimiters-nvim": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1709163331,
|
||||
"narHash": "sha256-QETHqUrqY9acAUxRgROGI3Qopy+P6tW36uVqHCemj10=",
|
||||
"lastModified": 1720388982,
|
||||
"narHash": "sha256-6+MSV9pkudhf/xVdofU6syYCzViHltvDWkYvbeuEfLs=",
|
||||
"owner": "HiPhish",
|
||||
"repo": "rainbow-delimiters.nvim",
|
||||
"rev": "4902de74335ba0c4816cb67c5d5052c0c5fc7e56",
|
||||
"rev": "b29da4a6061a88270e875b38367d82c04c856128",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
|
@ -134,12 +317,13 @@
|
|||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"ags": "ags",
|
||||
"home-manager": "home-manager",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"hyprland": "hyprland",
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"plugin-harpoon1": "plugin-harpoon1",
|
||||
"plugin-rainbow-delimiters-nvim": "plugin-rainbow-delimiters-nvim",
|
||||
"plugin-undotree-nvim": "plugin-undotree-nvim",
|
||||
"xdg-desktop-portal-hyprland": "xdg-desktop-portal-hyprland"
|
||||
"plugin-undotree-nvim": "plugin-undotree-nvim"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
|
@ -172,21 +356,28 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"xdg-desktop-portal-hyprland": {
|
||||
"xdph": {
|
||||
"inputs": {
|
||||
"hyprland-protocols": "hyprland-protocols",
|
||||
"hyprlang": "hyprlang",
|
||||
"hyprlang": [
|
||||
"hyprland",
|
||||
"hyprlang"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": "systems_2"
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1708954916,
|
||||
"narHash": "sha256-GUbIMXUrcb6Pxmz9lQ3j6XMFLsQaSwTvViNKYNSMdd0=",
|
||||
"lastModified": 1721648131,
|
||||
"narHash": "sha256-cyyxu/oj4QEFp3CVx2WeXa9T4OAUyynuBJHGkBZSxJI=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "xdg-desktop-portal-hyprland",
|
||||
"rev": "15fd76cb6ebb0e3c3b2c3a3daf452e7b781c6e8a",
|
||||
"rev": "663be9cad424b170b28b9fa8a61042d721007f3b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
@ -9,6 +9,10 @@
|
|||
home-manager.url = "github:nix-community/home-manager/master";
|
||||
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# AGS
|
||||
ags.url = "github:Aylur/ags";
|
||||
ags.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
# Neovim plugins not in nixpkgs
|
||||
plugin-rainbow-delimiters-nvim.url = "gitlab:HiPhish/rainbow-delimiters.nvim";
|
||||
plugin-rainbow-delimiters-nvim.flake = false;
|
||||
|
@ -19,10 +23,7 @@
|
|||
plugin-harpoon1.url = "github:ThePrimeagen/harpoon";
|
||||
plugin-harpoon1.flake = false;
|
||||
|
||||
# Track hyprland xdg desktop portal master until screenshots get released again
|
||||
xdg-desktop-portal-hyprland.url = "github:hyprwm/xdg-desktop-portal-hyprland";
|
||||
xdg-desktop-portal-hyprland.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
hyprland.url = "github:hyprwm/hyprland";
|
||||
};
|
||||
|
||||
outputs =
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
../../eww
|
||||
../../hyprland
|
||||
../../hyprland/hyprpaper.nix
|
||||
../../ags
|
||||
];
|
||||
|
||||
hyprland =
|
||||
|
@ -28,7 +29,6 @@
|
|||
mod = mod;
|
||||
|
||||
primaryMonitor = "DP-2";
|
||||
|
||||
monitors = [
|
||||
{
|
||||
name = "DP-2";
|
||||
|
@ -72,27 +72,11 @@
|
|||
|
||||
sensitivity = 0.1;
|
||||
|
||||
keyboard = {
|
||||
layout = "us";
|
||||
variant = "";
|
||||
options = "";
|
||||
};
|
||||
|
||||
inner_gaps = 5;
|
||||
outer_gaps = 10;
|
||||
|
||||
border = {
|
||||
size = 1;
|
||||
active = "rgba(33ccffee) rgba(00ff99ee) 45deg";
|
||||
inactive = "rgba(595959aa)";
|
||||
};
|
||||
|
||||
layout = "dwindle";
|
||||
|
||||
rounding = 5;
|
||||
|
||||
layerRules = {
|
||||
"gtk-layer-shell" = [ "blur" "ignorezero" ];
|
||||
"notifications2" = [ "noanim" "blur" "ignorezero"];
|
||||
};
|
||||
|
||||
windowRules = {
|
||||
|
@ -257,7 +241,11 @@
|
|||
pavucontrol
|
||||
difftastic
|
||||
sops
|
||||
obsidian
|
||||
(obsidian.override {
|
||||
electron = pkgs.electron_29-bin;
|
||||
})
|
||||
unzip
|
||||
vlc
|
||||
|
||||
cachix
|
||||
];
|
||||
|
@ -265,14 +253,34 @@
|
|||
programs.home-manager.enable = true;
|
||||
|
||||
gtk = {
|
||||
enable = true;
|
||||
theme = {
|
||||
package = pkgs.libsForQt5.breeze-gtk;
|
||||
name = "Breeze-Dark";
|
||||
name = "Adwaita-dark";
|
||||
package = pkgs.gnome-themes-extra;
|
||||
};
|
||||
|
||||
iconTheme = {
|
||||
package = pkgs.libsForQt5.breeze-icons;
|
||||
name = "breeze-dark";
|
||||
package = pkgs.kdePackages.breeze-icons;
|
||||
};
|
||||
|
||||
cursorTheme = {
|
||||
name = "breeze_cursors";
|
||||
package = pkgs.libsForQt5.breeze-qt5;
|
||||
};
|
||||
};
|
||||
|
||||
qt = {
|
||||
enable = true;
|
||||
style.name = "breeze-dark";
|
||||
};
|
||||
|
||||
dconf = {
|
||||
enable = true;
|
||||
settings = {
|
||||
"org/gnome/desktop/interface" = {
|
||||
color-scheme = "prefer-dark";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -286,7 +294,7 @@
|
|||
|
||||
# Replace some commands with better versions
|
||||
ssh = "kitty +kitten ssh";
|
||||
diff = "${pkgs.difftastic}/bin/difftastic";
|
||||
diff = "${pkgs.difftastic}/bin/difft";
|
||||
};
|
||||
initExtra = ''
|
||||
function open() {
|
||||
|
@ -301,6 +309,7 @@
|
|||
settings = {
|
||||
background_opacity = "0.8";
|
||||
allow_remote_control = true;
|
||||
enable_audio_bell = false;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
|
||||
variant = mkOption {
|
||||
type = types.str;
|
||||
default = "qwerty";
|
||||
default = "";
|
||||
};
|
||||
|
||||
options = mkOption {
|
||||
|
@ -94,101 +94,7 @@
|
|||
};
|
||||
};
|
||||
|
||||
inner_gaps = mkOption { type = types.int; };
|
||||
|
||||
outer_gaps = mkOption { type = types.int; };
|
||||
|
||||
border = {
|
||||
size = mkOption { type = types.int; };
|
||||
active = mkOption { type = types.str; };
|
||||
inactive = mkOption { type = types.str; };
|
||||
};
|
||||
|
||||
animations = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
|
||||
beziers = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [
|
||||
"myBezier, 0.05, 0.9, 0.1, 1.05"
|
||||
];
|
||||
};
|
||||
|
||||
windows = mkOption {
|
||||
type = types.str;
|
||||
default = "1, 3, myBezier";
|
||||
};
|
||||
|
||||
windowsOut = mkOption {
|
||||
type = types.str;
|
||||
default = "1, 3, default, popin 80%";
|
||||
};
|
||||
|
||||
border = mkOption {
|
||||
type = types.str;
|
||||
default = "1, 5, default";
|
||||
};
|
||||
|
||||
borderangle = mkOption {
|
||||
type = types.str;
|
||||
default = "1, 4, default";
|
||||
};
|
||||
|
||||
fade = mkOption {
|
||||
type = types.str;
|
||||
default = "1, 3, default";
|
||||
};
|
||||
|
||||
workspaces = mkOption {
|
||||
type = types.str;
|
||||
default = "1, 2, default";
|
||||
};
|
||||
};
|
||||
|
||||
layout = mkOption { type = types.str; };
|
||||
rounding = mkOption { type = types.int; };
|
||||
|
||||
blur = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
|
||||
size = mkOption {
|
||||
type = types.int;
|
||||
default = 3;
|
||||
};
|
||||
|
||||
passes = mkOption {
|
||||
type = types.int;
|
||||
default = 1;
|
||||
};
|
||||
};
|
||||
|
||||
shadow = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
|
||||
range = mkOption {
|
||||
type = types.int;
|
||||
default = 4;
|
||||
};
|
||||
|
||||
strength = mkOption {
|
||||
type = types.int;
|
||||
default = 3;
|
||||
};
|
||||
|
||||
color = mkOption {
|
||||
type = types.str;
|
||||
default = "rgba(1a1a1aee)";
|
||||
};
|
||||
};
|
||||
|
||||
layerRules = mkOption {
|
||||
type = types.attrsOf (types.listOf types.str);
|
||||
|
@ -205,16 +111,6 @@
|
|||
default = { };
|
||||
};
|
||||
|
||||
generateWorkspaceBinds = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
|
||||
generateWindowManagementBinds = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
|
||||
binds = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = { };
|
||||
|
@ -280,12 +176,12 @@
|
|||
};
|
||||
|
||||
general = {
|
||||
gaps_in = cfg.inner_gaps;
|
||||
gaps_out = cfg.outer_gaps;
|
||||
gaps_in = 5;
|
||||
gaps_out = 10;
|
||||
|
||||
border_size = cfg.border.size;
|
||||
"col.active_border" = cfg.border.active;
|
||||
"col.inactive_border" = cfg.border.inactive;
|
||||
border_size = 1;
|
||||
"col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
|
||||
"col.inactive_border" = "rgba(595959aa)";
|
||||
|
||||
layout = cfg.layout;
|
||||
};
|
||||
|
@ -295,28 +191,19 @@
|
|||
};
|
||||
|
||||
decoration = {
|
||||
rounding = cfg.rounding;
|
||||
rounding = 5;
|
||||
|
||||
blur = {
|
||||
enabled = if cfg.blur.enable then "yes" else "no";
|
||||
size = cfg.blur.size;
|
||||
passes = cfg.blur.passes;
|
||||
enabled = "yes";
|
||||
size = 3;
|
||||
passes = 1;
|
||||
new_optimizations = "on";
|
||||
};
|
||||
|
||||
drop_shadow = if cfg.shadow.enable then "yes" else "no";
|
||||
shadow_range = cfg.shadow.range;
|
||||
shadow_render_power = cfg.shadow.strength;
|
||||
"col.shadow" = cfg.shadow.color;
|
||||
};
|
||||
|
||||
dwindle = {
|
||||
pseudotile = "yes";
|
||||
preserve_split = "yes";
|
||||
};
|
||||
|
||||
master = {
|
||||
new_is_master = true;
|
||||
drop_shadow = "yes";
|
||||
shadow_range = 4;
|
||||
shadow_render_power = 3;
|
||||
"col.shadow" = "rgba(1a1a1aee)";
|
||||
};
|
||||
|
||||
gestures = {
|
||||
|
@ -324,19 +211,21 @@
|
|||
};
|
||||
|
||||
animations = {
|
||||
enabled = if cfg.animations.enable then "yes" else "no";
|
||||
enabled = "yes";
|
||||
|
||||
# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
|
||||
|
||||
bezier = cfg.animations.beziers;
|
||||
bezier = [
|
||||
"myBezier, 0.05, 0.9, 0.1, 1.05"
|
||||
];
|
||||
|
||||
animation = [
|
||||
"windows, ${cfg.animations.windows}"
|
||||
"windowsOut, ${cfg.animations.windowsOut}"
|
||||
"border, ${cfg.animations.border}"
|
||||
"borderangle, ${cfg.animations.borderangle}"
|
||||
"fade, ${cfg.animations.fade}"
|
||||
"workspaces, ${cfg.animations.workspaces}"
|
||||
"windows, 1, 3, myBezier"
|
||||
"windowsOut, 1, 3, default, popin 80%"
|
||||
"border, 1, 5, default"
|
||||
"borderangle, 1, 4, default"
|
||||
"fade, 1, 3, default"
|
||||
"workspaces, 1, 2, default"
|
||||
];
|
||||
|
||||
};
|
||||
|
@ -352,7 +241,7 @@
|
|||
let
|
||||
# Create one work space for each non primary monitor
|
||||
perMonitorWorkspaces = map
|
||||
(m: "${m.name}, name:${m.name}")
|
||||
(m: "name:${m.name}, monitor:${m.name}")
|
||||
(lib.filter
|
||||
(m: m.name != cfg.primaryMonitor)
|
||||
cfg.monitors
|
||||
|
@ -368,7 +257,6 @@
|
|||
let
|
||||
# Create binds to switch workspaces and move windows between them
|
||||
workspaceBinds =
|
||||
if cfg.generateWorkspaceBinds then
|
||||
lib.flatten
|
||||
(map
|
||||
(i:
|
||||
|
@ -381,19 +269,14 @@
|
|||
]
|
||||
)
|
||||
(lib.range 1 10)
|
||||
)
|
||||
else
|
||||
[ ];
|
||||
);
|
||||
|
||||
# Create binds to manage wiwdows
|
||||
windowManagementBinds =
|
||||
if cfg.generateWindowManagementBinds then [
|
||||
windowManagementBinds = [
|
||||
"${cfg.mod} SHIFT, Q, killactive"
|
||||
"${cfg.mod}, F, togglefloating"
|
||||
"${cfg.mod} SHIFT, F, fullscreen"
|
||||
]
|
||||
else
|
||||
[ ];
|
||||
];
|
||||
|
||||
configBinds = lib.mapAttrsToList (k: v: "${k}, ${v}") cfg.binds;
|
||||
in
|
||||
|
@ -401,13 +284,10 @@
|
|||
|
||||
bindm =
|
||||
let
|
||||
windowManagementBinds =
|
||||
if cfg.generateWindowManagementBinds then [
|
||||
windowManagementBinds = [
|
||||
"${cfg.mod}, mouse:272, movewindow"
|
||||
"${cfg.mod}, mouse:273, resizewindow"
|
||||
]
|
||||
else
|
||||
[ ];
|
||||
];
|
||||
|
||||
configBinds = lib.mapAttrsToList (k: v: "${k}, ${v}") cfg.mouseBinds;
|
||||
|
||||
|
|
|
@ -17,6 +17,10 @@
|
|||
experimental-features = "nix-command flakes";
|
||||
# Deduplicate and optimize nix store
|
||||
auto-optimise-store = true;
|
||||
# Allow me to use cachix
|
||||
trusted-users = [ "root" "kalle" ];
|
||||
substituters = ["https://hyprland.cachix.org"];
|
||||
trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="];
|
||||
};
|
||||
|
||||
services.btrfs.autoScrub.enable = true;
|
||||
|
@ -42,15 +46,10 @@
|
|||
};
|
||||
|
||||
# Enable the X11 windowing system.
|
||||
services.displayManager.sddm.enable = true;
|
||||
services.xserver = {
|
||||
enable = true;
|
||||
|
||||
displayManager.sddm.enable = true;
|
||||
|
||||
# Configure keymap in X11
|
||||
xkb.layout = "us";
|
||||
# xkbVariant = "dvorak";
|
||||
# xkbOptions = "eurosign:e,caps:escape";
|
||||
};
|
||||
|
||||
# Allow flashing ZSA keyboards
|
||||
|
@ -58,7 +57,7 @@
|
|||
|
||||
programs.hyprland = {
|
||||
enable = true;
|
||||
portalPackage = inputs.xdg-desktop-portal-hyprland.packages.x86_64-linux.xdg-desktop-portal-hyprland;
|
||||
# package = inputs.hyprland.packages.x86_64-linux.hyprland;
|
||||
};
|
||||
|
||||
xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
|
||||
|
@ -138,6 +137,8 @@
|
|||
};
|
||||
};
|
||||
|
||||
services.gvfs.enable = true;
|
||||
|
||||
# Enable the OpenSSH daemon.
|
||||
services.openssh.enable = true;
|
||||
|
||||
|
|
|
@ -19,16 +19,19 @@
|
|||
vimdiffAlias = true;
|
||||
|
||||
extraPackages = with pkgs; [
|
||||
nodejs_21 # Required for copilot-vim
|
||||
nodejs_22 # Required for copilot-vim
|
||||
ripgrep # Required for telescope
|
||||
wl-clipboard # Required for clipboard sync
|
||||
|
||||
# Language servers
|
||||
clang-tools
|
||||
lua-language-server
|
||||
rnix-lsp
|
||||
nodePackages.typescript-language-server
|
||||
typescript
|
||||
tailwindcss-language-server
|
||||
gopls
|
||||
vhdl-ls
|
||||
nixd
|
||||
];
|
||||
|
||||
plugins = with pkgs.vimPlugins; [
|
||||
|
@ -93,7 +96,6 @@
|
|||
config = toLuaFile ./plugin/cmp.lua;
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
plugin = nvim-lspconfig;
|
||||
config = toLuaFile ./plugin/lsp.lua;
|
||||
|
|
|
@ -100,7 +100,7 @@ require('lspconfig').lua_ls.setup {
|
|||
}
|
||||
}
|
||||
|
||||
require('lspconfig').rnix.setup {
|
||||
require('lspconfig').nixd.setup {
|
||||
on_attach = on_attach,
|
||||
capabilities = capabilities,
|
||||
}
|
||||
|
@ -108,6 +108,11 @@ require('lspconfig').rnix.setup {
|
|||
require('lspconfig').tsserver.setup {
|
||||
on_attach = on_attach,
|
||||
capabilities = capabilities,
|
||||
init_options = {
|
||||
tsserver = {
|
||||
fallbackPath = string.gsub(vim.fn.system("dirname `which tsserver`"), '^%s*(.-)%s*$', '%1') .. "/../lib/node_modules/typescript/lib",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
require('lspconfig').tailwindcss.setup {
|
||||
|
@ -120,6 +125,16 @@ require('lspconfig').clangd.setup {
|
|||
capabilities = capabilities,
|
||||
}
|
||||
|
||||
require('lspconfig').gopls.setup {
|
||||
on_attach = on_attach,
|
||||
capabilities = capabilities,
|
||||
}
|
||||
|
||||
require('lspconfig').vhdl_ls.setup {
|
||||
on_attach = on_attach,
|
||||
capabilities = capabilities,
|
||||
}
|
||||
|
||||
require('rust-tools').setup({
|
||||
server = {
|
||||
on_attach = on_attach,
|
||||
|
|
Loading…
Reference in New Issue