diff --git a/flake.nix b/flake.nix index 9f6dd39..c59cbb7 100644 --- a/flake.nix +++ b/flake.nix @@ -150,3 +150,357 @@ in { defaultPackage.x86_64-linux = resethome; }; } +{ + 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"; + + 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 = (pkgs.writeShellScript "powermenu" +'' +if [ "$1" = "poweroff" ]; then + ${pkgs.zenity}/bin/zenity --question --text "Уверены, что хотите выключить?" --default-cancel && poweroff + exit 0 +fi + +if [ "$1" = "reboot" ]; then + ${pkgs.zenity}/bin/zenity --question --text "Уверены, что хотите перезагрузить?" --default-cancel && reboot + exit 0 +fi +''); + + 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 + ''; + }; + + 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 + ''; + }; + + tint2conf1 = builtins.readFile "${self}/tint2conf.1"; + tint2conf2 = builtins.readFile "${self}/tint2conf.2"; + + tint2config = pkgs.writeText "tint2conf" +'' +${tint2conf1} +#------------------------------------- +button = new +button_lclick_command = ${jgmenu_run_prepared} +button_icon = ${self}/wallpaper.svg + +separator = new +separator_style = empty +separator_padding = 3 4 + +button = new +button_lclick_command = ${pkgs.chromium}/bin/chromium +button_icon = ${pkgs.chromium}/share/icons/hicolor/48x48/apps/chromium.png + +button = new +button_lclick_command = ${pkgs.pcmanfm}/bin/pcmanfm +button_icon = ${self}/folderIcon.svg + +separator = new +separator_style = empty +separator_padding = 3 4 + +#------------------------------------- +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 + +#------------------------------------- +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 + +${tint2conf2} +''; + + screenshotDir = ''"$HOME/Pictures/Screenshots"''; + videoDir = ''"$HOME/Videos/ScreenRecords"''; + + screenshotFullClipboard = pkgs.writeShellScript "screenshot-full-clipboard" +'' +exec ${pkgs.maim}/bin/maim | ${pkgs.xclip}/bin/xclip -selection clipboard -t image/png +''; + + 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 +''; + + screenshotFullFile = pkgs.writeShellScript "screenshot-full-file" +'' +mkdir -p ${screenshotDir} +exec ${pkgs.maim}/bin/maim "$HOME/Pictures/Screenshots/$(date +%F-%H-%M-%S).png" +''; + + screenshotRegionClipboard = pkgs.writeShellScript "screenshot-region-clipboard" +'' +exec ${pkgs.maim}/bin/maim -s | ${pkgs.xclip}/bin/xclip -selection clipboard -t image/png +''; + + screenshotRegionFile = pkgs.writeShellScript "screenshot-region-file" +'' +mkdir -p ${screenshotDir} +exec ${pkgs.maim}/bin/maim -s "$HOME/Pictures/Screenshots/$(date +%F-%H-%M-%S).png" +''; + + recordFullScreen = pkgs.writeShellScript "record-full-screen" +'' +set -eu +mkdir -p "$HOME/.cache" ${videoDir} +pidfile="$HOME/.cache/mirea-screenrecord.pid" + +if [ -f "$pidfile" ] && kill -0 "$(cat "$pidfile")" 2>/dev/null; then + kill -INT "$(cat "$pidfile")" + rm -f "$pidfile" + exit 0 +fi + +geometry="$(${pkgs.xrandr}/bin/xrandr | awk '/\*/ { print $1; exit }')" +outfile="$HOME/Videos/ScreenRecords/$(date +%F-%H-%M-%S).mkv" + +${pkgs.ffmpeg}/bin/ffmpeg \ + -f x11grab \ + -video_size "$geometry" \ + -framerate 30 \ + -i "$DISPLAY" \ + -c:v libx264 \ + -preset ultrafast \ + "$outfile" >/dev/null 2>&1 & + +echo $! > "$pidfile" +''; + + recordRegion = pkgs.writeShellScript "record-region" +'' +set -eu +mkdir -p "$HOME/.cache" ${videoDir} +pidfile="$HOME/.cache/mirea-screenrecord.pid" + +if [ -f "$pidfile" ] && kill -0 "$(cat "$pidfile")" 2>/dev/null; then + kill -INT "$(cat "$pidfile")" + rm -f "$pidfile" + exit 0 +fi + +read -r X Y W H </dev/null 2>&1 & + +echo $! > "$pidfile" +''; + + 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)" + +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} + ;; + "Record: region (start/stop)") + exec ${recordRegion} + ;; + *) + exit 0 + ;; +esac +''; + + sxhkdConfig = pkgs.writeText "sxhkdrc" +'' +# Windows-like +Print + ${screenshotFullClipboard} + +alt + Print + ${screenshotWindowClipboard} + +super + Print + ${screenshotFullFile} + +super + shift + s + ${screenshotRegionClipboard} + +# macOS-like +super + shift + 3 + ${screenshotFullFile} + +control + super + shift + 3 + ${screenshotFullClipboard} + +super + shift + 4 + ${screenshotRegionFile} + +super + shift + 5 + ${capturePanel} + +# "Run" / terminal +super + r + ${pkgs.sakura}/bin/sakura + +super + Return + ${pkgs.sakura}/bin/sakura + +# tap Super only -> menu +F13 + ${jgmenu_run_prepared} +''; + + sxhkdWrapped = pkgs.writeShellScript "sxhkd-mirea" +'' +exec ${pkgs.sxhkd}/bin/sxhkd -c ${sxhkdConfig} +''; + + xcapeWrapped = pkgs.writeShellScript "xcape-mirea" +'' +exec ${pkgs.xcape}/bin/xcape -e 'Super_L=F13;Super_R=F13' +''; + + tint2custom = pkgs.writeShellScript "tint2" +'' +${pkgs.tint2}/bin/tint2 -c ${tint2config} +''; + + pcmanfmdesktop = pkgs.writeShellScript "pcmanfm" +'' +${pkgs.pcmanfm}/bin/pcmanfm --desktop +''; + + myxinitrc = pkgs.writeText ".xinitrc" +'' +${tint2custom} & +${pcmanfmdesktop} & +${sxhkdWrapped} & +${xcapeWrapped} & +exec ${pkgs.metacity}/bin/metacity +''; + + 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/" +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; + }; +} \ No newline at end of file