mireadesktop/flake.nix

318 lines
10 KiB
Nix
Raw Normal View History

2026-03-08 00:23:10 +03:00
{
description = "MIREA desktop";
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
outputs =
{ self, nixpkgs, ... }:
let
pkgs = import nixpkgs { system = "x86_64-linux"; };
wallpaper = builtins.readFile "${self}/wallpaper.svg";
folderIcon = builtins.readFile "${self}/folderIcon.svg";
pcmanfmConf = "${self}/pcmanfm.conf";
mimeappsList = "${self}/mimeapps.list";
desktopItems0 = (
pkgs.writeText "desktop-items-0.conf" ''
[*]
wallpaper_mode=center
wallpaper_common=1
wallpapers_configured=1
wallpaper=${self}/wallpaper.svg
desktop_bg=#77767b
desktop_fg=#ffffff
desktop_shadow=#000000
desktop_font=Sans 12
folder=/home/student
show_wm_menu=1
sort=mtime;ascending;
show_documents=0
show_trash=1
show_mounts=1
''
);
jgmenu_run_prepared = (
pkgs.writeShellScript "jgmenu_run_prepared" "${pkgs.jgmenu}/bin/jgmenu_run apps | ${prepare_jgmenu}/bin/prepare_jgmenu | ${pkgs.jgmenu}/bin/jgmenu --simple"
);
powermenu = (
2026-03-08 00:23:10 +03:00
let
zenityDialog =
msg: cmd:
''${pkgs.zenity}/bin/zenity --question --text "Уверены, что хотите ${msg}?" --default-cancel; && ${cmd}'';
in
pkgs.writeShellScript "powermenu" ''
if [ "$1" = "poweroff" ]; then
${zenityDialog "Выключить" "poweroff"}
exit 0
fi
2026-03-08 00:23:10 +03:00
if [ "$1" = "reboot" ]; then
${zenityDialog "Выключить" "reboot"}
exit 0
fi
''
);
2026-03-08 00:23:10 +03:00
mireaweek = pkgs.stdenv.mkDerivation rec {
pname = "mireaweek";
version = "0.1.0";
src = ./weekday.kt;
dontInstall = true;
dontUnpack = true;
nativeBuildInputs = [ pkgs.kotlin ];
buildPhase = ''
mkdir -p $out/{bin,lib}
kotlinc $src -include-runtime -d mireaweek.jar
mv mireaweek.jar $out/lib
printf "${pkgs.jre}/bin/java -jar $out/lib/mireaweek.jar" > $out/bin/mireaweek
chmod +x $out/bin/mireaweek
'';
};
2026-03-08 00:23:10 +03:00
prepare_jgmenu = pkgs.stdenv.mkDerivation rec {
pname = "prepare_jgmenu";
version = "0.1.0";
src = ./JgmenuCorrector.kt;
dontInstall = true;
dontUnpack = true;
nativeBuildInputs = [ pkgs.kotlin ];
buildPhase = ''
mkdir -p $out/{bin,lib}
kotlinc $src -include-runtime -d prepare.jar
mv prepare.jar $out/lib
printf "${pkgs.jre}/bin/java -jar $out/lib/prepare.jar" > $out/bin/prepare_jgmenu
chmod +x $out/bin/prepare_jgmenu
'';
};
2026-03-08 00:23:10 +03:00
tint2conf1 = builtins.readFile "${self}/tint2conf.1";
tint2conf2 = builtins.readFile "${self}/tint2conf.2";
2026-03-08 00:23:10 +03:00
tint2config = pkgs.writeText "tint2conf" ''
${tint2conf1}
#-------------------------------------
button = new
button_lclick_command = ${jgmenu_run_prepared}
button_icon = ${self}/wallpaper.svg
2026-03-08 00:23:10 +03:00
separator = new
separator_style = empty
separator_padding = 3 4
2026-03-08 00:23:10 +03:00
button = new
button_lclick_command = ${pkgs.chromium}/bin/chromium
button_icon = ${pkgs.chromium}/share/icons/hicolor/48x48/apps/chromium.png
2026-03-08 00:23:10 +03:00
button = new
button_lclick_command = ${pkgs.pcmanfm}/bin/pcmanfm
button_icon = ${self}/folderIcon.svg
2026-03-08 00:23:10 +03:00
separator = new
separator_style = empty
separator_padding = 3 4
2026-03-08 00:23:10 +03:00
#-------------------------------------
execp = new
execp_name = switch
execp_command = ${pkgs.xkb-switch}/bin/xkb-switch
execp_interval = 1
execp_font = mono 10
execp_font_color = #dddddd 100
execp_centered = 1
execp_has_icon = 0
execp_padding = 5 5
2026-03-08 00:23:10 +03:00
#-------------------------------------
execp = new
execp_name = mireaweek
execp_command = ${mireaweek}/bin/mireaweek
execp_interval = 0
execp_font = mono 10
execp_font_color = #dddddd 100
execp_centered = 1
execp_has_icon = 0
execp_padding = 5 5
2026-03-08 00:23:10 +03:00
${tint2conf2}
'';
2026-03-08 00:23:10 +03:00
screenshotDir = ''"$HOME/Pictures/Screenshots"'';
videoDir = ''"$HOME/Videos/ScreenRecords"'';
2026-03-08 00:23:10 +03:00
screenshotFullClipboard = pkgs.writeShellScript "screenshot-full-clipboard" ''
exec ${pkgs.maim}/bin/maim | ${pkgs.xclip}/bin/xclip -selection clipboard -t image/png
'';
2026-03-08 00:23:10 +03:00
screenshotWindowClipboard = pkgs.writeShellScript "screenshot-window-clipboard" ''
exec ${pkgs.maim}/bin/maim -i "$(${pkgs.xdotool}/bin/xdotool getactivewindow)" | ${pkgs.xclip}/bin/xclip -selection clipboard -t image/png
'';
2026-03-08 00:23:10 +03:00
screenshotFullFile = pkgs.writeShellScript "screenshot-full-file" ''
mkdir -p ${screenshotDir}
exec ${pkgs.maim}/bin/maim "$HOME/Pictures/Screenshots/$(date +%F-%H-%M-%S).png"
'';
2026-03-08 00:23:10 +03:00
screenshotRegionClipboard = pkgs.writeShellScript "screenshot-region-clipboard" ''
exec ${pkgs.maim}/bin/maim -s | ${pkgs.xclip}/bin/xclip -selection clipboard -t image/png
'';
2026-03-08 00:23:10 +03:00
screenshotRegionFile = pkgs.writeShellScript "screenshot-region-file" ''
mkdir -p ${screenshotDir}
exec ${pkgs.maim}/bin/maim -s "$HOME/Pictures/Screenshots/$(date +%F-%H-%M-%S).png"
'';
2026-03-08 00:23:10 +03:00
recordFullScreen = pkgs.writeShellScript "record-full-screen" ''
set -eu
mkdir -p "$HOME/.cache" ${videoDir}
pidfile="$HOME/.cache/mirea-screenrecord.pid"
2026-03-08 00:23:10 +03:00
if [ -f "$pidfile" ] && kill -0 "$(cat "$pidfile")" 2>/dev/null; then
kill -INT "$(cat "$pidfile")"
rm -f "$pidfile"
exit 0
fi
2026-03-08 00:23:10 +03:00
geometry="$(${pkgs.xorg.xrandr}/bin/xrandr | awk '/\*/ { print $1; exit }')"
outfile="$HOME/Videos/ScreenRecords/$(date +%F-%H-%M-%S).mkv"
2026-03-08 00:23:10 +03:00
${pkgs.ffmpeg}/bin/ffmpeg \
-f x11grab \
-video_size "$geometry" \
-framerate 30 \
-i "$DISPLAY" \
-c:v libx264 \
-preset ultrafast \
"$outfile" >/dev/null 2>&1 &
2026-03-08 00:23:10 +03:00
echo $! > "$pidfile"
'';
2026-03-08 00:23:10 +03:00
capturePanel = pkgs.writeShellScript "capture-panel" ''
choice="$(${pkgs.zenity}/bin/zenity \
--list \
--title="Capture" \
--column="Action" \
"Screenshot: whole screen -> clipboard" \
"Screenshot: active window -> clipboard" \
"Screenshot: whole screen -> file" \
"Screenshot: region -> clipboard" \
"Screenshot: region -> file" \
"Record: whole screen (start/stop)" \
"Record: region (start/stop)" \
--height=320 --width=520)"
2026-03-08 00:23:10 +03:00
case "$choice" in
"Screenshot: whole screen -> clipboard")
exec ${screenshotFullClipboard}
;;
"Screenshot: active window -> clipboard")
exec ${screenshotWindowClipboard}
;;
"Screenshot: whole screen -> file")
exec ${screenshotFullFile}
;;
"Screenshot: region -> clipboard")
exec ${screenshotRegionClipboard}
;;
"Screenshot: region -> file")
exec ${screenshotRegionFile}
;;
"Record: whole screen (start/stop)")
exec ${recordFullScreen}
;;
*)
exit 0
;;
esac
'';
2026-03-08 00:23:10 +03:00
sxhkdConfig = pkgs.writeText "sxhkdrc" ''
# Windows-like
Print
${screenshotFullClipboard}
2026-03-08 00:23:10 +03:00
alt + Print
${screenshotWindowClipboard}
2026-03-08 00:23:10 +03:00
super + Print
${screenshotFullFile}
2026-03-08 00:23:10 +03:00
super + shift + s
${screenshotRegionClipboard}
2026-03-08 00:23:10 +03:00
# macOS-like
super + shift + 3
${screenshotFullFile}
2026-03-08 00:23:10 +03:00
control + super + shift + 3
${screenshotFullClipboard}
2026-03-08 00:23:10 +03:00
super + shift + 4
${screenshotRegionFile}
2026-03-08 00:23:10 +03:00
super + shift + 5
${capturePanel}
2026-03-08 00:23:10 +03:00
# "Run" / terminal
super + r
${pkgs.sakura}/bin/sakura
2026-03-08 00:23:10 +03:00
super + Return
${pkgs.sakura}/bin/sakura
2026-03-08 00:23:10 +03:00
# tap Super only -> menu
F13
${jgmenu_run_prepared}
'';
2026-03-08 00:23:10 +03:00
sxhkdWrapped = pkgs.writeShellScript "sxhkd-mirea" ''
exec ${pkgs.sxhkd}/bin/sxhkd -c ${sxhkdConfig}
'';
2026-03-08 00:23:10 +03:00
xcapeWrapped = pkgs.writeShellScript "xcape-mirea" ''
exec ${pkgs.xcape}/bin/xcape -e 'Super_L=F13;Super_R=F13'
'';
2026-03-08 00:23:10 +03:00
tint2custom = pkgs.writeShellScript "tint2" ''
${pkgs.tint2}/bin/tint2 -c ${tint2config}
'';
2026-03-08 00:23:10 +03:00
pcmanfmdesktop = pkgs.writeShellScript "pcmanfm" ''
${pkgs.pcmanfm}/bin/pcmanfm --desktop
'';
2026-03-08 00:23:10 +03:00
myxinitrc = pkgs.writeText ".xinitrc" ''
${tint2custom} &
${pcmanfmdesktop} &
${sxhkdWrapped} &
${xcapeWrapped} &
exec ${pkgs.metacity}/bin/metacity
'';
2026-03-08 00:23:10 +03:00
resethome = pkgs.writeShellScript "startmireadesktop" ''
rm -rf $HOME/{*,.*} 2> /dev/null # wipe student directory, yeah!
printf "[client]\nport=3306\nuser=root" > /home/student/.my.cnf
echo "\set user postgres" > /home/student/.psqlrc
mkdir -p "$HOME/.config/pcmanfm/default"
cp ${desktopItems0} "$HOME/.config/pcmanfm/default/desktop-items-0.conf"
cp ${pcmanfmConf} "$HOME/.config/pcmanfm/default/pcmanfm.conf"
chmod +w -R "$HOME/.config/pcmanfm/default/"
cp ${mimeappsList} "$HOME/.config/mimeapps.list"
chmod +w "$HOME/.config/mimeapps.list"
mkdir -p "$HOME/.config/gtk-3.0"
printf "[Settings]\ngtk-icon-theme-name = WhiteSur" > "$HOME/.config/gtk-3.0/settings.ini"
cp ${myxinitrc} "$HOME/.xinitrc"
mkdir -p "$HOME/Pictures/Screenshots" "$HOME/Videos/ScreenRecords" "$HOME/.cache"
'';
in
{
packages.x86_64-linux.powermenu = powermenu; # must be imported into configuration.nix!
packages.x86_64-linux.tint2 = tint2custom;
packages.x86_64-linux.pcmanfm = pcmanfmdesktop;
packages.x86_64-linux.resethome = resethome;
packages.x86_64-linux.sxhkd = sxhkdWrapped;
packages.x86_64-linux.xcape = xcapeWrapped;
defaultPackage.x86_64-linux = resethome;
};
2026-03-08 02:43:03 +03:00
}