summaryrefslogtreecommitdiff
path: root/hosts/bean
diff options
context:
space:
mode:
Diffstat (limited to 'hosts/bean')
-rw-r--r--hosts/bean/Xresources39
-rw-r--r--hosts/bean/awesome.lua470
-rw-r--r--hosts/bean/common.nix83
-rw-r--r--hosts/bean/default.nix33
-rw-r--r--hosts/bean/firefox-prefs.nix51
-rw-r--r--hosts/bean/gtkrc-3.ini4
-rw-r--r--hosts/bean/hardware.nix22
-rw-r--r--hosts/bean/iso.nix71
-rw-r--r--hosts/bean/pinto.nix26
-rw-r--r--hosts/bean/users.nix7
-rw-r--r--hosts/bean/xinitrc16
11 files changed, 822 insertions, 0 deletions
diff --git a/hosts/bean/Xresources b/hosts/bean/Xresources
new file mode 100644
index 0000000..932a4ab
--- /dev/null
+++ b/hosts/bean/Xresources
@@ -0,0 +1,39 @@
+*.background: #383c4a
+*.foreground: #D2D2D2
+
+!black
+*color0: #383c4a
+*color8: #404552
+
+!red
+*color1: #9A4138
+*color9: #E7766B
+
+!green
+*color2: #4BEC90
+*color10: #3CBF75
+
+!yellow
+*color3: #D8D782
+*color11: #CFCD63
+
+!blue
+*color4: #5294e2
+*color12: #579CEF
+
+!magenta
+*color5: #CE50DD
+*color13: #E7766B
+
+!cyan
+*color6: #6BE5E7
+*color14: #90FDFF
+
+!white
+*color7: #CCCCCC
+*color15: #FFFFFF
+
+!urxvt
+URxvt.font: xft:Monospace:size=8
+URxvt.scrollBar: false
+URxvt.letterSpacing: -1
diff --git a/hosts/bean/awesome.lua b/hosts/bean/awesome.lua
new file mode 100644
index 0000000..f8ccfa7
--- /dev/null
+++ b/hosts/bean/awesome.lua
@@ -0,0 +1,470 @@
+-- -*- eval: (outline-minor-mode 1); outline-regexp: "^-- [*]+" -*-
+-- * Load libraries
+-- Standard awesome library
+local gears = require("gears")
+local awful = require("awful")
+require("awful.autofocus")
+-- Widget and layout library
+local wibox = require("wibox")
+-- Theme handling library
+local beautiful = require("beautiful")
+-- Notification library
+local naughty = require("naughty")
+local menubar = require("menubar")
+local hotkeys_popup = require("awful.hotkeys_popup")
+
+-- * Handle errors
+-- Check if awesome encountered an error during startup and fell back to
+-- another config (This code will only ever execute for the fallback config)
+if awesome.startup_errors then
+ naughty.notify({ preset = naughty.config.presets.critical,
+ title = "Oops, there were errors during startup!",
+ text = awesome.startup_errors })
+end
+
+-- Handle runtime errors after startup
+do
+ local in_error = false
+ awesome.connect_signal("debug::error", function (err)
+ -- Make sure we don't go into an endless error loop
+ if in_error then return end
+ in_error = true
+
+ naughty.notify({ preset = naughty.config.presets.critical,
+ title = "Oops, an error happened!",
+ text = tostring(err) })
+ in_error = false
+ end)
+end
+
+-- * Set theme
+beautiful.init(gears.filesystem.get_themes_dir() .. "gtk/theme.lua")
+
+-- * Set variables
+terminal = "urxvt"
+modkey = "Mod4"
+
+awful.layout.layouts = {
+ awful.layout.suit.floating,
+ awful.layout.suit.tile,
+ awful.layout.suit.tile.left,
+ awful.layout.suit.tile.bottom,
+ awful.layout.suit.max,
+ awful.layout.suit.magnifier,
+}
+
+-- * Create widgets
+mytextclock = wibox.widget.textclock()
+
+-- * Define wibar buttons
+local taglist_buttons = gears.table.join(
+ awful.button({ }, 1, function(t) t:view_only() end),
+ awful.button({ modkey }, 1, function(t)
+ if client.focus then
+ client.focus:move_to_tag(t)
+ end
+ end),
+ awful.button({ }, 3, awful.tag.viewtoggle),
+ awful.button({ modkey }, 3, function(t)
+ if client.focus then
+ client.focus:toggle_tag(t)
+ end
+ end),
+ awful.button({ }, 4, function(t) awful.tag.viewnext(t.screen) end),
+ awful.button({ }, 5, function(t) awful.tag.viewprev(t.screen) end)
+)
+
+local tasklist_buttons = gears.table.join(
+ awful.button({ }, 1, function (c)
+ if c == client.focus then
+ c.minimized = true
+ else
+ c:emit_signal(
+ "request::activate",
+ "tasklist",
+ {raise = true}
+ )
+ end
+ end),
+ awful.button({ }, 3, function()
+ awful.menu.client_list({ theme = { width = 250 } })
+ end),
+ awful.button({ }, 4, function ()
+ awful.client.focus.byidx(1)
+ end),
+ awful.button({ }, 5, function ()
+ awful.client.focus.byidx(-1)
+end))
+-- * Set wallpaper
+beautiful.wallpaper = "/usr/local/share/wallpapers/music-room-piano.jpg"
+local function set_wallpaper(s)
+ if beautiful.wallpaper then
+ local wallpaper = beautiful.wallpaper
+ if type(wallpaper) == "function" then
+ wallpaper = wallpaper(s)
+ end
+ gears.wallpaper.maximized(wallpaper, s, false)
+ end
+end
+
+screen.connect_signal("property::geometry", set_wallpaper)
+
+-- * Configure screens
+awful.screen.connect_for_each_screen(function(s)
+ -- Wallpaper
+ set_wallpaper(s)
+
+ -- Each screen has its own tag table.
+ awful.tag({ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, s, awful.layout.layouts[1])
+
+ -- Create a promptbox for each screen
+ s.mypromptbox = awful.widget.prompt()
+ -- Create an imagebox widget which will contain an icon indicating which layout we're using.
+ -- We need one layoutbox per screen.
+ s.mylayoutbox = awful.widget.layoutbox(s)
+ s.mylayoutbox:buttons(gears.table.join(
+ awful.button({ }, 1, function () awful.layout.inc( 1) end),
+ awful.button({ }, 3, function () awful.layout.inc(-1) end),
+ awful.button({ }, 4, function () awful.layout.inc( 1) end),
+ awful.button({ }, 5, function () awful.layout.inc(-1) end)))
+ -- Create a taglist widget
+ s.mytaglist = awful.widget.taglist {
+ screen = s,
+ filter = awful.widget.taglist.filter.all,
+ buttons = taglist_buttons
+ }
+
+ -- Create a tasklist widget
+ s.mytasklist = awful.widget.tasklist {
+ screen = s,
+ filter = awful.widget.tasklist.filter.currenttags,
+ buttons = tasklist_buttons
+ }
+
+ -- Create the wibox
+ s.mywibox = awful.wibar {
+ position = "top",
+ screen = s,
+ }
+
+ -- Add widgets to the wibox
+ s.mywibox:setup {
+ layout = wibox.layout.align.horizontal,
+ { -- Left widgets
+ layout = wibox.layout.fixed.horizontal,
+ mylauncher,
+ s.mytaglist,
+ s.mypromptbox,
+ },
+ s.mytasklist, -- Middle widget
+ { -- Right widgets
+ layout = wibox.layout.fixed.horizontal,
+ wibox.widget.systray(),
+ mytextclock,
+ s.mylayoutbox,
+ },
+ }
+end)
+
+-- * Mouse bindings
+root.buttons(gears.table.join(
+ awful.button({ }, 4, awful.tag.viewnext),
+ awful.button({ }, 5, awful.tag.viewprev)
+))
+
+-- * Key bindings
+globalkeys = gears.table.join(
+ awful.key({ modkey }, "s", hotkeys_popup.show_help,
+ {description="show help", group="awesome"}),
+
+ awful.key({ modkey }, "Left", awful.tag.viewprev,
+ {description = "view previous", group = "tag"}),
+ awful.key({ modkey }, "Right", awful.tag.viewnext,
+ {description = "view next", group = "tag"}),
+ awful.key({ modkey }, "Escape", awful.tag.history.restore,
+ {description = "go back", group = "tag"}),
+
+ awful.key({ modkey }, "j",
+ function () awful.client.focus.byidx( 1) end,
+ {description = "focus next by index", group = "client"}
+ ),
+ awful.key({ modkey }, "k",
+ function () awful.client.focus.byidx(-1) end,
+ {description = "focus previous by index", group = "client"}
+ ),
+
+ awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx(1) end,
+ {description = "swap with next client by index", group = "client"}),
+ awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx(-1) end,
+ {description = "swap with previous client by index", group = "client"}),
+ awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative(1) end,
+ {description = "focus the next screen", group = "screen"}),
+ awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end,
+ {description = "focus the previous screen", group = "screen"}),
+ awful.key({ modkey }, "u", awful.client.urgent.jumpto,
+ {description = "jump to urgent client", group = "client"}),
+ awful.key({ modkey }, "Tab",
+ function ()
+ awful.client.focus.history.previous()
+ if client.focus then
+ client.focus:raise()
+ end
+ end,
+ {description = "go back", group = "client"}),
+
+ awful.key({ modkey }, "Return", function () awful.spawn(terminal) end,
+ {description = "open a terminal", group = "launcher"}),
+ awful.key({ modkey, "Control" }, "r", awesome.restart,
+ {description = "reload awesome", group = "awesome"}),
+ awful.key({ modkey, "Shift" }, "q", awesome.quit,
+ {description = "quit awesome", group = "awesome"}),
+
+ awful.key({ modkey }, "l", function () awful.tag.incmwfact( 0.05) end,
+ {description = "increase master width factor", group = "layout"}),
+ awful.key({ modkey }, "h", function () awful.tag.incmwfact(-0.05) end,
+ {description = "decrease master width factor", group = "layout"}),
+ awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1, nil, true) end,
+ {description = "increase the number of master clients", group = "layout"}),
+ awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1, nil, true) end,
+ {description = "decrease the number of master clients", group = "layout"}),
+ awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1, nil, true) end,
+ {description = "increase the number of columns", group = "layout"}),
+ awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1, nil, true) end,
+ {description = "decrease the number of columns", group = "layout"}),
+
+ awful.key({ modkey }, "space", function () awful.layout.inc( 1) end,
+ {description = "select next", group = "layout"}),
+ awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(-1) end,
+ {description = "select previous", group = "layout"}),
+
+ awful.key({ modkey, "Control" }, "n",
+ function ()
+ local c = awful.client.restore()
+ -- Focus restored client
+ if c then
+ c:emit_signal(
+ "request::activate", "key.unminimize", {raise = true}
+ )
+ end
+ end,
+ {description = "restore minimized", group = "client"}),
+
+ -- Menubar
+ awful.key({ modkey }, "r", function() menubar.show() end,
+ {description = "show the menubar", group = "launcher"})
+)
+
+clientkeys = gears.table.join(
+ awful.key({ modkey }, "f",
+ function (c)
+ c.fullscreen = not c.fullscreen
+ c:raise()
+ end,
+ {description = "toggle fullscreen", group = "client"}),
+ awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end,
+ {description = "close", group = "client"}),
+ awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle,
+ {description = "toggle floating", group = "client"}),
+ awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end,
+ {description = "move to master", group = "client"}),
+ awful.key({ modkey }, "o", function (c) c:move_to_screen() end,
+ {description = "move to screen", group = "client"}),
+ awful.key({ modkey }, "t", function (c) c.ontop = not c.ontop end,
+ {description = "toggle keep on top", group = "client"}),
+ awful.key({ modkey }, "n",
+ function (c)
+ -- The client currently has the input focus, so it cannot be
+ -- minimized, since minimized clients can't have the focus.
+ c.minimized = true
+ end,
+ {description = "minimize", group = "client"}),
+ awful.key({ modkey }, "m",
+ function (c)
+ c.maximized = not c.maximized
+ c:raise()
+ end,
+ {description = "(un)maximize", group = "client"}),
+ awful.key({ modkey, "Control" }, "m",
+ function (c)
+ c.maximized_vertical = not c.maximized_vertical
+ c:raise()
+ end,
+ {description = "(un)maximize vertically", group = "client"}),
+ awful.key({ modkey, "Shift" }, "m",
+ function (c)
+ c.maximized_horizontal = not c.maximized_horizontal
+ c:raise()
+ end,
+ {description = "(un)maximize horizontally", group = "client"})
+)
+
+-- Bind all key numbers to tags.
+-- Be careful: we use keycodes to make it work on any keyboard layout.
+-- This should map on the top row of your keyboard, usually 1 to 9.
+for i = 1, 9 do
+ globalkeys = gears.table.join(globalkeys,
+ -- View tag only.
+ awful.key({ modkey }, "#" .. i + 9,
+ function ()
+ local screen = awful.screen.focused()
+ local tag = screen.tags[i]
+ if tag then
+ tag:view_only()
+ end
+ end,
+ {description = "view tag #"..i, group = "tag"}),
+ -- Toggle tag display.
+ awful.key({ modkey, "Control" }, "#" .. i + 9,
+ function ()
+ local screen = awful.screen.focused()
+ local tag = screen.tags[i]
+ if tag then
+ awful.tag.viewtoggle(tag)
+ end
+ end,
+ {description = "toggle tag #" .. i, group = "tag"}),
+ -- Move client to tag.
+ awful.key({ modkey, "Shift" }, "#" .. i + 9,
+ function ()
+ if client.focus then
+ local tag = client.focus.screen.tags[i]
+ if tag then
+ client.focus:move_to_tag(tag)
+ end
+ end
+ end,
+ {description = "move focused client to tag #"..i, group = "tag"}),
+ -- Toggle tag on focused client.
+ awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
+ function ()
+ if client.focus then
+ local tag = client.focus.screen.tags[i]
+ if tag then
+ client.focus:toggle_tag(tag)
+ end
+ end
+ end,
+ {description = "toggle focused client on tag #" .. i, group = "tag"})
+ )
+end
+
+clientbuttons = gears.table.join(
+ awful.button({ }, 1, function (c)
+ c:emit_signal("request::activate", "mouse_click", {raise = true})
+ end),
+ awful.button({ modkey }, 1, function (c)
+ c:emit_signal("request::activate", "mouse_click", {raise = true})
+ awful.mouse.client.move(c)
+ end),
+ awful.button({ modkey }, 3, function (c)
+ c:emit_signal("request::activate", "mouse_click", {raise = true})
+ awful.mouse.client.resize(c)
+ end)
+)
+
+root.keys(globalkeys)
+
+-- * Set rules
+awful.rules.rules = {
+ -- All clients will match this rule.
+ { rule = { },
+ properties = { border_width = beautiful.border_width,
+ border_color = beautiful.border_normal,
+ focus = awful.client.focus.filter,
+ raise = true,
+ keys = clientkeys,
+ buttons = clientbuttons,
+ screen = awful.screen.preferred,
+ placement = awful.placement.no_overlap+awful.placement.no_offscreen
+ }
+ },
+
+ -- Floating clients.
+ { rule_any = {
+ instance = {
+ "pinentry",
+ },
+ class = {
+ "Blueman-manager",
+ "Gpick",
+ "Tor Browser", -- Needs a fixed window size to avoid fingerprinting by screen size.
+ },
+
+ -- Note that the name property shown in xprop might be set slightly after creation of the client
+ -- and the name shown there might not match defined rules here.
+ name = {
+ "Event Tester", -- xev.
+ },
+ role = {
+ "AlarmWindow", -- Thunderbird's calendar.
+ "ConfigManager", -- Thunderbird's about:config.
+ "pop-up", -- e.g. Google Chrome's (detached) Developer Tools.
+ }
+ }, properties = { floating = true }},
+
+ -- Add titlebars to normal clients and dialogs
+ { rule_any = {type = { "normal", "dialog" }
+ }, properties = { titlebars_enabled = true }
+ },
+}
+
+-- * Connect signals
+-- Signal function to execute when a new client appears.
+client.connect_signal("manage", function (c)
+ -- Set the windows at the slave,
+ -- i.e. put it at the end of others instead of setting it master.
+ -- if not awesome.startup then awful.client.setslave(c) end
+
+ if awesome.startup
+ and not c.size_hints.user_position
+ and not c.size_hints.program_position then
+ -- Prevent clients from being unreachable after screen count changes.
+ awful.placement.no_offscreen(c)
+ end
+end)
+
+-- Add a titlebar if titlebars_enabled is set to true in the rules.
+client.connect_signal("request::titlebars", function(c)
+ -- buttons for the titlebar
+ local buttons = gears.table.join(
+ awful.button({ }, 1, function()
+ c:emit_signal("request::activate", "titlebar", {raise = true})
+ awful.mouse.client.move(c)
+ end),
+ awful.button({ }, 3, function()
+ c:emit_signal("request::activate", "titlebar", {raise = true})
+ awful.mouse.client.resize(c)
+ end)
+ )
+
+ awful.titlebar(c) : setup {
+ { -- Left
+ awful.titlebar.widget.iconwidget(c),
+ buttons = buttons,
+ layout = wibox.layout.fixed.horizontal
+ },
+ { -- Middle
+ { -- Title
+ align = "center",
+ widget = awful.titlebar.widget.titlewidget(c)
+ },
+ buttons = buttons,
+ layout = wibox.layout.flex.horizontal
+ },
+ { -- Right
+ awful.titlebar.widget.minimizebutton(c),
+ awful.titlebar.widget.maximizedbutton(c),
+ awful.titlebar.widget.closebutton (c),
+ layout = wibox.layout.fixed.horizontal()
+ },
+ layout = wibox.layout.align.horizontal
+ }
+end)
+
+-- Enable sloppy focus, so that focus follows mouse.
+client.connect_signal("mouse::enter", function(c)
+ c:emit_signal("request::activate", "mouse_enter", {raise = false})
+end)
+
+client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
+client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
diff --git a/hosts/bean/common.nix b/hosts/bean/common.nix
new file mode 100644
index 0000000..5d4bde3
--- /dev/null
+++ b/hosts/bean/common.nix
@@ -0,0 +1,83 @@
+{ inputs, lib, pkgs, ... }:
+
+let
+ blender-bin = inputs.blender-bin.
+ packages.x86_64-linux;
+in
+{
+ imports = [
+ ./hardware.nix
+ ];
+
+ this.pc.enable = true;
+ this.gui.enable = true;
+
+ this.locales.default = "us";
+
+ time.timeZone = "America/Chicago";
+
+ networking.domain = "bean.alef.zoar.cx";
+
+ this.sets = {
+ arch.tools = true;
+ cli.tools.full = true;
+ gui.tools.full = true;
+ gui.fonts = true;
+ net.tools.minimal = true;
+ sound.tools = true;
+ sys.tools = true;
+ };
+ environment.systemPackages = with pkgs; [
+ emacs
+ awesome
+ jre
+ rxvt-unicode
+ nethack
+ sil-q
+ ppsspp
+ wesnoth
+ luanti
+ gzdoom
+ teeworlds
+ superTuxKart
+ mindustry
+ shattered-pixel-dungeon
+ bzflag
+ xonotic-glx
+ mgba
+ taisei
+ unvanquished
+ adwaita-icon-theme
+ arc-theme
+ arc-icon-theme
+ blender-bin.blender_3_6
+ zeroad
+ ];
+
+ programs.firefox = {
+ enable = true;
+ package = pkgs.firefox-esr;
+ } //
+ import ./firefox-prefs.nix {};
+
+ services.xserver.enable = true;
+ environment.etc = {
+ "X11/xinit/xinitrc" = {
+ source = ./xinitrc;
+ mode = "755";
+ };
+ "X11/Xresources".source = ./Xresources;
+ "xdg/awesome/rc.lua".source = ./awesome.lua;
+ "xdg/gtk-3.0/settings.ini".source = ./gtkrc-3.ini;
+ };
+
+ services.joycond.enable = true;
+
+ boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
+
+ this.hosts = {
+ mine = true;
+ };
+
+ system.stateVersion = "24.11";
+}
diff --git a/hosts/bean/default.nix b/hosts/bean/default.nix
new file mode 100644
index 0000000..41ade5d
--- /dev/null
+++ b/hosts/bean/default.nix
@@ -0,0 +1,33 @@
+{ mkHost, hosts, inputs }:
+
+let
+ inherit (inputs) nixpkgs;
+ inherit (nixpkgs.lib.attrsets)
+ mergeAttrsList;
+in
+mergeAttrsList
+ ((map (h: mkHost "x86_64-linux" h
+ [ ./common.nix
+ ./users.nix ])
+ [
+ "anasazi"
+ "bolita"
+ "calypso"
+ "kidney"
+ "peruano"
+ "pink"
+ "sulphur"
+ "white"
+ ])
+ ++
+ (map (h: mkHost "x86_64-linux" h
+ [ ./common.nix
+ ./users.nix
+ ./${h}.nix ])
+ [
+ "pinto"
+ ]))
+// mkHost "x86_64-linux" "sprout" [
+ ./common.nix
+ ./iso.nix
+]
diff --git a/hosts/bean/firefox-prefs.nix b/hosts/bean/firefox-prefs.nix
new file mode 100644
index 0000000..125ee62
--- /dev/null
+++ b/hosts/bean/firefox-prefs.nix
@@ -0,0 +1,51 @@
+{ ... }:
+
+{
+ policies = {
+ SearchBar = "separate";
+ SearchEngines = {
+ Remove = ["Google" "Amazon.com" "Bing" "EBay"];
+ Default = "DuckDuckGo";
+ };
+ DisableTelemetry = true;
+ EnableTrackingProtection = { Value = true; };
+ OverrideFirstRunPage = "";
+ OverridePostUpdatePage = "";
+ NoDefaultBookmarks = true;
+ FirefoxSuggest = {
+ WebSuggestions = false;
+ SponsoredSuggestions = false;
+ ImproveSuggest = false;
+ };
+ FirefoxHome = {
+ Search = true;
+ TopSites = false;
+ SponsoredTopSites = false;
+ Highlights = false;
+ Pocket = false;
+ SponsoredPocket = false;
+ Snippets = false;
+ };
+ UserMessaging = {
+ WhatsNew = false;
+ ExtensionRecommendations = false;
+ FeatureRecommendations = false;
+ UrlbarInterventions = false;
+ SkipOnboarding = true;
+ MoreFromMozilla = false;
+ };
+ ExtensionSettings."uBlock0@raymondhill.net" = {
+ installation_mode = "force_installed";
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
+ };
+ };
+
+ preferencesStatus = "default";
+ preferences = {
+ "browser.aboutConfig.showWarning" = false;
+ "browser.uidensity" = 1;
+ "browser.backspace_action" = 1;
+ "browser.ctrlTab.sortByRecentlyUsed" = true;
+ "browser.startup.page" = 3;
+ };
+}
diff --git a/hosts/bean/gtkrc-3.ini b/hosts/bean/gtkrc-3.ini
new file mode 100644
index 0000000..488a5d1
--- /dev/null
+++ b/hosts/bean/gtkrc-3.ini
@@ -0,0 +1,4 @@
+[Settings]
+gtk-theme-name = Arc-Dark
+gtk-icon-theme-name = Arc
+gtk-cursor-theme-name = Adwaita
diff --git a/hosts/bean/hardware.nix b/hosts/bean/hardware.nix
new file mode 100644
index 0000000..ac7fde8
--- /dev/null
+++ b/hosts/bean/hardware.nix
@@ -0,0 +1,22 @@
+{ pkgs, ... }:
+
+{
+ boot.initrd.availableKernelModules = [
+ "iwlwifi"
+ ];
+ boot.kernelModules = [
+ "kvm-intel"
+ ];
+ boot.extraModulePackages = [];
+
+ hardware.graphics.extraPackages = [pkgs.intel-vaapi-driver];
+ services.xserver.videoDrivers = ["intel"];
+
+ hardware.firmware = with pkgs; [
+ linux-firmware
+ ];
+
+ this.bluetooth.enable = true;
+
+ nixpkgs.hostPlatform = "x86_64-linux";
+}
diff --git a/hosts/bean/iso.nix b/hosts/bean/iso.nix
new file mode 100644
index 0000000..64df018
--- /dev/null
+++ b/hosts/bean/iso.nix
@@ -0,0 +1,71 @@
+{ modulesPath, lib, tlib, config, pkgs, ... }:
+
+let
+ inherit (lib.attrsets)
+ mergeAttrsList;
+ inherit (builtins)
+ map;
+
+ mkThinShim = tlib.mkThinShim pkgs;
+
+ shimmedPackages = [
+ "wesnoth"
+ "luanti"
+ "superTuxKart"
+ "mindustry"
+ "shattered-pixel-dungeon"
+ "bzflag"
+ "teeworlds"
+ "xonotic-glx"
+ "taisei"
+ "unvanquished"
+ "zeroad"
+ ];
+in
+rec {
+ imports = [
+ (modulesPath + "/installer/cd-dvd/iso-image.nix")
+ ];
+
+ isoImage = {
+ makeBiosBootable = true;
+ makeEfiBootable = true;
+ makeUsbBootable = true;
+
+ isoBaseName = lib.mkImageMediaOverride "sprout";
+
+ prependToMenuLabel = "Bean sprout (";
+ appendToMenuLabel = ")";
+ };
+
+ users.users.bean = {
+ description = "Sean Bean";
+ isNormalUser = true;
+ homeMode = "755";
+ extraGroups = [
+ "disk" "cdrom"
+ "audio" "video"
+ "lp" "networkmanager"
+ ];
+ initialPassword = "boromir";
+ };
+ users.users.root.initialPassword = "allalikeallalike";
+
+ services.getty.autologinUser = "bean";
+ services.getty.helpLine = ''
+ As you can see, you are automatically logged in to the "bean" user.
+ Run `startx' to obtain a graphical session.
+
+ The password for bean is: ${users.users.pod.initialPassword}
+ The password for root is: ${users.users.root.initialPassword}
+ '';
+
+ nixpkgs.overlays = [
+ (final: prev:
+ mergeAttrsList
+ (map (pname: {
+ "${pname}" = (mkThinShim prev.${pname} "nixpkgs#${pname}");
+ })
+ shimmedPackages))
+ ];
+}
diff --git a/hosts/bean/pinto.nix b/hosts/bean/pinto.nix
new file mode 100644
index 0000000..ab00833
--- /dev/null
+++ b/hosts/bean/pinto.nix
@@ -0,0 +1,26 @@
+{ lib, ... }:
+
+let swapPart = "/dev/sda2";
+in
+{
+ boot.loader.grub = {
+ enable = true;
+ devices = ["/dev/sda"];
+ };
+
+ boot.resumeDevice = swapPart;
+
+ fileSystems."/" = lib.mkForce {
+ device = "/dev/sda1";
+ fsType = "ext4";
+ };
+
+ fileSystems."/home" = lib.mkForce {
+ device = "/dev/sda3";
+ fsType = "ext4";
+ };
+
+ swapDevices = [
+ { device = swapPart; }
+ ];
+}
diff --git a/hosts/bean/users.nix b/hosts/bean/users.nix
new file mode 100644
index 0000000..f7f1cfc
--- /dev/null
+++ b/hosts/bean/users.nix
@@ -0,0 +1,7 @@
+{ lib, pkgs, ... }:
+
+{
+ this.users.enabled = [
+ "simon"
+ ];
+}
diff --git a/hosts/bean/xinitrc b/hosts/bean/xinitrc
new file mode 100644
index 0000000..667c768
--- /dev/null
+++ b/hosts/bean/xinitrc
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+sys="/etc/xdg/awesome/rc.lua"
+con="$HOME/.config/awesome/rc.lua"
+xdg="$XDG_CONFIG_DIR/awesome/rc.lua"
+
+cfg="$sys"
+
+[ -f "$con" ] && cfg="$con"
+
+[ "$XDG_CONFIG_DIR" -a -f "$xdg"] && cfg="$xdg"
+
+sysXres=/etc/X11/Xresources
+[ -f "$sysXres" ] && xrdb -merge "$sysXres"
+
+exec awesome --config "$cfg"