aboutsummaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorAdrian Kummerlaender2018-05-05 13:02:04 +0200
committerAdrian Kummerlaender2018-05-05 13:02:04 +0200
commitdea9a66fccca94ed27387246e384f3dcb20501f6 (patch)
tree06ed6657b0d014d5e8faa0a20b267bf6a9f34472 /gui
parent74951f7eb0d8914201a5a4fa1b534abfe0ecfa0d (diff)
downloadnixos_home-dea9a66fccca94ed27387246e384f3dcb20501f6.tar
nixos_home-dea9a66fccca94ed27387246e384f3dcb20501f6.tar.gz
nixos_home-dea9a66fccca94ed27387246e384f3dcb20501f6.tar.bz2
nixos_home-dea9a66fccca94ed27387246e384f3dcb20501f6.tar.lz
nixos_home-dea9a66fccca94ed27387246e384f3dcb20501f6.tar.xz
nixos_home-dea9a66fccca94ed27387246e384f3dcb20501f6.tar.zst
nixos_home-dea9a66fccca94ed27387246e384f3dcb20501f6.zip
Basic attempt at a better structure
Diffstat (limited to 'gui')
-rw-r--r--gui/conf/xmonad.hs184
-rw-r--r--gui/default.nix57
-rw-r--r--gui/gtk.nix54
-rw-r--r--gui/kitty.nix41
-rw-r--r--gui/pcmanfm.nix17
-rw-r--r--gui/pkgs/oomox-archdroid-icon-theme.nix29
-rw-r--r--gui/pkgs/oomox-gtk-theme.nix60
-rw-r--r--gui/rofi.nix55
-rw-r--r--gui/urxvt.nix62
-rw-r--r--gui/vim.nix21
-rw-r--r--gui/xmonad.nix9
-rw-r--r--gui/zathura.nix26
12 files changed, 615 insertions, 0 deletions
diff --git a/gui/conf/xmonad.hs b/gui/conf/xmonad.hs
new file mode 100644
index 0000000..46547eb
--- /dev/null
+++ b/gui/conf/xmonad.hs
@@ -0,0 +1,184 @@
+import XMonad
+import XMonad.Util.EZConfig
+import XMonad.StackSet
+
+import XMonad.Hooks.EwmhDesktops
+
+import XMonad.Layout.NoBorders
+import XMonad.Layout.Tabbed
+import XMonad.Layout.Reflect
+
+import XMonad.Util.Themes
+import XMonad.Util.NamedScratchpad
+
+import XMonad.Actions.SpawnOn
+import XMonad.Actions.CycleWS
+import XMonad.Actions.WindowBringer
+import XMonad.Actions.GroupNavigation
+import XMonad.Actions.FloatKeys
+
+import System.Exit
+import Data.Maybe
+import Control.Monad (when)
+import qualified Data.Map as M
+
+workspaces :: [WorkspaceId]
+workspaces = map show [1 .. 9 :: Int]
+
+customTabTheme = (theme xmonadTheme)
+ { fontName = "xft:Iosevka Medium-12"
+ , decoHeight = 20
+ , activeTextColor = "#222222"
+ , activeColor = "#909737"
+ , inactiveTextColor = "#999999"
+ , inactiveColor = "#161616"
+ , activeBorderColor = "#909737"
+ , inactiveBorderColor = "#161616" }
+
+availableLayouts = smartBorders $ tabs ||| tilesLM ||| tilesRM ||| tilesTM ||| tilesBM
+ where
+ tabs = tabbed shrinkText customTabTheme
+ tilesLM = Tall 1 delta ratio
+ tilesRM = reflectHoriz tilesLM
+ tilesTM = Mirror tilesLM
+ tilesBM = reflectVert tilesTM
+ ratio = 1/2
+ delta = 3/100
+
+windowBringerDmenuConfig = def { menuCommand = "rofi"
+ , menuArgs = [ "-p", "win", "-dmenu", "-i" ] }
+
+floatRectTop h = hideScreenBorder $ RationalRect (1/20) 0 (18/20) h
+floatRectBottom h = hideScreenBorder $ RationalRect (1/20) (1-h) (18/20) h
+floatRectLeft w = hideScreenBorder $ RationalRect 0 (1/20) w (18/20)
+floatRectRight w = hideScreenBorder $ RationalRect (1-w) (1/20) w (18/20)
+
+dropUp = floatRectBottom $ 2/3
+dropUpLarge = floatRectBottom $ 18/20
+dropDown = floatRectTop $ 2/3
+dropDownLarge = floatRectTop $ 18/20
+sideBarLeft = floatRectLeft $ 1/2
+sideBarRight = floatRectRight $ 1/2
+
+scratchpads = [ NS "terminal" "kitty --class=scratchterm" (className =? "scratchterm")
+ (customFloating dropDown)
+ , NS "browser" "firefox" (className =? "Firefox")
+ (customFloating dropDownLarge)
+ , NS "documentation" "zeal" (className =? "Zeal")
+ (customFloating dropDown)
+ , NS "messaging" "telegram-desktop" (className =? "TelegramDesktop")
+ (customFloating sideBarRight) ]
+
+keybindings =
+-- xmonad session control
+ [ ("C-M1-<Escape>" , io (exitWith ExitSuccess))
+ , ("C-M1-<Backspace>" , spawn "xmonad --restart")
+-- application launchers
+ , ("M-<Space>" , spawn "rofi -show combi")
+ , ("M-<Return>" , spawn "kitty")
+ , ("M-S-<Return>" , spawn "vim -g")
+-- window management
+ , ("M-q" , windows $ shift "NSP")
+ , ("M-S-q" , kill)
+ , ("M-j" , windows focusDown)
+ , ("M-k" , windows focusUp)
+ , ("M-S-j" , windows swapDown)
+ , ("M-S-k" , windows swapUp)
+ , ("M-h" , sendMessage Shrink)
+ , ("M-l" , sendMessage Expand)
+ , ("M-<Backspace>" , nextMatch History (return True))
+-- window bringer
+ , ("M-a" , gotoMenuConfig windowBringerDmenuConfig)
+ , ("M-S-a" , bringMenuConfig windowBringerDmenuConfig)
+-- scratchpads
+ , ("M-b" , namedScratchpadAction scratchpads "browser")
+ , ("M-d" , namedScratchpadAction scratchpads "documentation")
+ , ("M-m" , namedScratchpadAction scratchpads "messaging") ] ++
+-- workspace selection
+ [ (p ++ [k] , windows $ f i) | (i, k) <- zip Main.workspaces ['1' .. '9']
+ , (p, f) <- [ ("M-" , greedyView)
+ , ("M-S-" , shift) ] ] ++
+-- workspace management
+ [ ("M-s l" , sendMessage NextLayout)
+ , ("M-s p" , toggleWS' ["NSP"])
+ , ("M-s j" , moveTo Next nonEmptyWS)
+ , ("M-s k" , moveTo Prev nonEmptyWS)
+ , ("M-S-s j" , shiftTo Next nonEmptyWS >> moveTo Next nonEmptyWS)
+ , ("M-S-s k" , shiftTo Prev nonEmptyWS >> moveTo Prev nonEmptyWS)
+-- floating placement
+ , ("M-w t" , withFocused $ windows . sink)
+ , ("M-w f" , withFocused $ placeFloating $ RationalRect 0 0 1 1)
+ , ("M-w j" , withFocused $ placeFloating dropUp)
+ , ("M-w S-j" , withFocused $ placeFloating dropUpLarge)
+ , ("M-w k" , withFocused $ placeFloating dropDown)
+ , ("M-w S-k" , withFocused $ placeFloating dropDownLarge)
+ , ("M-w h" , withFocused $ placeFloating sideBarLeft)
+ , ("M-w l" , withFocused $ placeFloating sideBarRight)
+-- system control
+ , ("M-c <Up>" , spawn "amixer sset Master 10%+")
+ , ("M-c <Down>" , spawn "amixer sset Master 10%-")
+ , ("M-c m" , spawn "amixer sset Master toggle") ]
+
+customEventHook = do
+ handleEventHook defaultConfig
+ fullscreenEventHook
+
+customLogHook = do
+ historyHook
+ customizeBorderWhen (isFloat <&&> isNotFullscreen) "#aadb0f" 6
+
+main = xmonad $ ewmh
+ $ defaultConfig
+ { modMask = mod4Mask -- super key as modifier
+ , borderWidth = 3
+ , normalBorderColor = "#161616"
+ , focusedBorderColor = "#909737"
+ , keys = \c -> mkKeymap c keybindings
+ , startupHook = return () >> checkKeymap defaultConfig keybindings
+ , handleEventHook = customEventHook
+ , layoutHook = availableLayouts
+ , manageHook = namedScratchpadManageHook scratchpads
+ , logHook = customLogHook }
+ `additionalKeys`
+ [ ((noModMask, xK_Menu) , namedScratchpadAction scratchpads "terminal") ]
+
+nonEmptyWS = WSIs $ return (\w -> nonNSP w && nonEmpty w)
+ where nonNSP (Workspace tag _ _) = tag /= "NSP"
+ nonEmpty = isJust . stack
+
+placeFloating :: RationalRect -> Window -> X ()
+placeFloating rect = windows . (flip XMonad.StackSet.float $ rect)
+
+windowSize w = do
+ r <- withDisplay $ (\d -> io $ getWindowAttributes d w)
+ return (fromIntegral $ wa_width r, fromIntegral $ wa_height r)
+
+withCurrentScreen f = withWindowSet $ \ws -> f (current ws)
+withCurrentScreenRect f = withCurrentScreen $ \s -> f (screenRect (screenDetail s))
+
+screenResolution = withCurrentScreenRect $ \r -> return (rect_width r, rect_height r)
+
+isNotFullscreen :: Query Bool
+isNotFullscreen = ask >>= (\w -> liftX $ do (ww, wh) <- windowSize w
+ (sw, sh) <- screenResolution
+ return $ not (ww == sw && wh == sh))
+
+isFloat :: Query Bool
+isFloat = ask >>= (\w -> liftX $ withWindowSet $ \ws -> return $ (M.member w (floating ws)))
+
+customizeBorderWhen :: Query Bool -> String -> Dimension -> X ()
+customizeBorderWhen q color width = withFocused $ \w -> runQuery q w >>= flip when (setWindowBorder' color width w)
+
+setWindowBorder' :: String -> Dimension -> Window -> X ()
+setWindowBorder' color width window = do
+ XConf { display = d } <- ask
+ ~(Just pixel) <- io $ initColor d color
+ io $ setWindowBorder d window pixel
+ io $ setWindowBorderWidth d window width
+
+-- ugly hack to hide window border at screen boundary
+hideScreenBorder :: RationalRect -> RationalRect
+hideScreenBorder (RationalRect x0 y0 w h) = RationalRect (x0-(bw/sw)) (y0-(bw/sh)) (w+((2*bw)/sw)) (h+((2*bw+1)/sh))
+ where bw = 6
+ sw = 1280
+ sh = 1024
diff --git a/gui/default.nix b/gui/default.nix
new file mode 100644
index 0000000..2d27f7c
--- /dev/null
+++ b/gui/default.nix
@@ -0,0 +1,57 @@
+{ pkgs, ... }:
+
+{
+ home = {
+ packages = with pkgs; [
+ # file viewers
+ sxiv
+ mpv
+ paraview
+ libreoffice
+ # communication
+ thunderbird
+ tdesktop
+ # UI dev utilities (CLI utilities are added in project specific nix-shells)
+ zeal
+ hotspot
+ qcachegrind
+ gitg
+ ];
+
+ file.".config/user-dirs.dirs".text = ''
+ XDG_TEMPLATES_DIR="$HOME/"
+ XDG_DESKTOP_DIR="$HOME/"
+ XDG_DOWNLOADS_DIR="$HOME/downloads/"
+ '';
+ };
+
+ xsession = {
+ enable = true;
+ initExtra = ''
+ xsetroot -cursor_name left_ptr
+ xset b off
+ '';
+ };
+
+ imports = [
+ # desktop environment
+ ./xmonad.nix
+ ./rofi.nix
+ ./gtk.nix
+ # terminals
+ ./kitty.nix
+ ./urxvt.nix
+ # tools
+ ./vim.nix
+ ./pcmanfm.nix
+ # file viewers
+ ./zathura.nix
+ ];
+
+ services.syncthing.enable = true;
+
+ programs.firefox = {
+ enable = true;
+ enableAdobeFlash = true;
+ };
+}
diff --git a/gui/gtk.nix b/gui/gtk.nix
new file mode 100644
index 0000000..0a580f5
--- /dev/null
+++ b/gui/gtk.nix
@@ -0,0 +1,54 @@
+{ pkgs, ... }:
+
+{
+ gtk = {
+ enable = true;
+
+ theme = let
+ oomox-gtk-theme = pkgs.callPackage ./pkgs/oomox-gtk-theme.nix {
+ pkgs-unstable = import <nixpkgs-unstable> {};
+ theme = {
+ accent_bg = "aadb0f";
+ bg = "d8d8d8";
+ fg = "101010";
+ btn_bg = "f5f5f5";
+ btn_fg = "111111";
+ caret_size = 0.04;
+ caret1_fg = "101010";
+ caret2_fg = "101010";
+ hdr_btn_bg = "161616";
+ hdr_btn_fg = "aadb0f";
+ menu_bg = "909737";
+ menu_fg = "1a1a1a";
+ sel_bg = "aadb0f";
+ sel_fg = "101010";
+ txt_bg = "ffffff";
+ txt_fg = "101010";
+ gradient = 0.0;
+ roundness = 0;
+ spacing = 1;
+ wm_border_focus = "909737";
+ wm_border_unfocus = "909737";
+ gtk3_generate_dark = false;
+ };
+ };
+ in {
+ name = "oomox";
+ package = oomox-gtk-theme;
+ };
+
+ iconTheme = let
+ oomox-archdroid-icon-theme = pkgs.callPackage ./pkgs/oomox-archdroid-icon-theme.nix {
+ color = "909737";
+ };
+ in {
+ name = "oomox-archdroid";
+ package = oomox-archdroid-icon-theme;
+ };
+
+ font = {
+ name = "Iosevka 10";
+ package = pkgs.iosevka;
+ };
+ };
+}
diff --git a/gui/kitty.nix b/gui/kitty.nix
new file mode 100644
index 0000000..46abef2
--- /dev/null
+++ b/gui/kitty.nix
@@ -0,0 +1,41 @@
+{ pkgs, ... }:
+
+{
+ home = {
+ packages = [ pkgs.kitty ];
+
+ file.".config/kitty/kitty.conf".text = ''
+ font_family iosevka
+ font_size 10
+ font_size_delta 1
+ adjust_line_height 110%
+
+ background #161616
+ foreground #F2F2F2
+ # black
+ color0 #161616
+ color8 #F2F2F2
+ # red
+ color1 #8C3346
+ color9 #ff0000
+ # green
+ color2 #aadb0f
+ color10 #909636
+ # yellow
+ color3 #E4E093
+ color11 #ffff00
+ # blue
+ color4 #352F6A
+ color12 #0000ff
+ # magenta
+ color5 #ce5c00
+ color13 #f57900
+ # cyan
+ color6 #89b6e2
+ color14 #46a4ff
+ # white
+ color7 #F2F2F2
+ color15 #ffffff
+ '';
+ };
+}
diff --git a/gui/pcmanfm.nix b/gui/pcmanfm.nix
new file mode 100644
index 0000000..00a1393
--- /dev/null
+++ b/gui/pcmanfm.nix
@@ -0,0 +1,17 @@
+{ pkgs, ... }:
+
+{
+ home = {
+ packages = with pkgs; [
+ pcmanfm gvfs lxmenu-data shared_mime_info
+ veracrypt
+ ];
+
+ sessionVariables = {
+ # required to enable auto-mounting in pcmanfm
+ GIO_EXTRA_MODULES = [ "${pkgs.gvfs}/lib/gio/modules" ];
+ # use GTK theme in libreoffice
+ SAL_USE_VCLPLUGIN = "gtk";
+ };
+ };
+}
diff --git a/gui/pkgs/oomox-archdroid-icon-theme.nix b/gui/pkgs/oomox-archdroid-icon-theme.nix
new file mode 100644
index 0000000..764bf2f
--- /dev/null
+++ b/gui/pkgs/oomox-archdroid-icon-theme.nix
@@ -0,0 +1,29 @@
+{ stdenv, pkgs, color, ... }:
+
+stdenv.mkDerivation rec {
+ name = "oomox-archdroid-icon-theme";
+
+ src = pkgs.fetchFromGitHub {
+ repo = "archdroid-icon-theme";
+ owner = "themix-project";
+ rev = "6dc4c92689ea2ce99534d6f461283efdf8ffd270";
+ sha256 = "073iwaamzrmj0l6h4gzmbnmazq16lgpc027mr3l778b35qwwraq5";
+ };
+
+ postPatch = ''
+ patchShebangs .
+ '';
+
+ installPhase = ''
+ HOME="$out/share/icons"
+ sed -i "66s/\.icons\///" change_color.sh
+ ./change_color.sh --output oomox-archdroid --color ${color}
+ '';
+
+ meta = {
+ description = "oomox-archdroid-icon-theme is a customizable fork of archdroid-icon-theme";
+ homepage = https://github.com/themix-project/archdroid-icon-theme;
+ license = stdenv.lib.licenses.gpl3;
+ platforms = stdenv.lib.platforms.all;
+ };
+}
diff --git a/gui/pkgs/oomox-gtk-theme.nix b/gui/pkgs/oomox-gtk-theme.nix
new file mode 100644
index 0000000..6e217dd
--- /dev/null
+++ b/gui/pkgs/oomox-gtk-theme.nix
@@ -0,0 +1,60 @@
+{ stdenv, pkgs, pkgs-unstable, theme, ... }:
+
+stdenv.mkDerivation rec {
+ name = "oomox-gtk-theme";
+
+ src = pkgs.fetchFromGitHub {
+ repo = "oomox-gtk-theme";
+ owner = "themix-project";
+ rev = "aa9081b2899d7e8ba8ae47543173d2d9f0f13921";
+ sha256 = "1yxhd6d61npx43qwa6gyvrwmivv42k3d6qn54q276aihwxlbgj4r";
+ };
+
+ nativeBuildInputs = with pkgs; [ librsvg glib libxml2 gdk_pixbuf bc pkgs-unstable.sass pkgs-unstable.sassc ];
+ propagatedUserEnvPkgs = with pkgs; [ gtk-engine-murrine ];
+
+ config = with theme; ''
+ ACCENT_BG=${accent_bg}
+ BG=${bg}
+ FG=${fg}
+ BTN_BG=${btn_bg}
+ BTN_FG=${btn_fg}
+ CARET1_FG=${caret1_fg}
+ CARET2_FG=${caret2_fg}
+ HDR_BTN_BG=${hdr_btn_bg}
+ HDR_BTN_FG=${hdr_btn_fg}
+ MENU_BG=${menu_bg}
+ MENU_FG=${menu_fg}
+ SEL_BG=${sel_bg}
+ SEL_FG=${sel_fg}
+ TXT_BG=${txt_bg}
+ TXT_FG=${txt_fg}
+ WM_BORDER_FOCUS=${wm_border_focus}
+ WM_BORDER_UNFOCUS=${wm_border_unfocus}
+ GTK3_GENERATE_DARK=${if gtk3_generate_dark then "True" else "False"}
+ CARET_SIZE=${toString caret_size}
+ GRADIENT=${toString gradient}
+ ROUNDNESS=${toString roundness}
+ SPACING=${toString spacing}
+ '';
+
+ postPatch = ''
+ patchShebangs .
+ '';
+
+ buildPhase = ''
+ HOME="$out/share/themes/oomox"
+ ./change_color.sh --make-opts all --target-dir "$out/share/themes" --output oomox <(echo -e "${config}")
+ '';
+
+ installPhase = ''
+ cd oomox-gtk-theme-*
+ '';
+
+ meta = {
+ description = "oomox-gtk-theme is a customizable fork of numix-gtk-theme.";
+ homepage = https://github.com/themix-project/oomox-gtk-theme;
+ license = stdenv.lib.licenses.gpl3;
+ platforms = stdenv.lib.platforms.all;
+ };
+}
diff --git a/gui/rofi.nix b/gui/rofi.nix
new file mode 100644
index 0000000..f2a9eca
--- /dev/null
+++ b/gui/rofi.nix
@@ -0,0 +1,55 @@
+{ pkgs, ... }:
+
+{
+ programs.rofi = {
+ enable = true;
+ location = "top";
+ font = "Iosevka 12";
+ separator = "none";
+ scrollbar = false;
+ borderWidth = 6;
+ yoffset = -6;
+
+ colors = {
+ window = {
+ background = "#222222";
+ border = "#aadb0f";
+ separator = "#000000";
+ };
+ rows = {
+ normal = {
+ background = "#222222";
+ foreground = "#8e8e8e";
+ backgroundAlt = "#161616";
+ highlight = {
+ background = "#111111";
+ foreground = "#aadb0f";
+ };
+ };
+ active = {
+ background = "#222222";
+ foreground = "#8e8e8e";
+ backgroundAlt = "#161616";
+ highlight = {
+ background = "#111111";
+ foreground = "#aadb0f";
+ };
+ };
+ urgent = {
+ background = "#222222";
+ foreground = "#dc322f";
+ backgroundAlt = "#161616";
+ highlight = {
+ background = "#dc322f";
+ foreground = "#161616";
+ };
+ };
+ };
+ };
+
+ extraConfig = ''
+ rofi.modi: combi
+ rofi.combi-modi: windowcd,drun,ssh
+ '';
+ };
+}
diff --git a/gui/urxvt.nix b/gui/urxvt.nix
new file mode 100644
index 0000000..408d5d5
--- /dev/null
+++ b/gui/urxvt.nix
@@ -0,0 +1,62 @@
+{ pkgs, ... }:
+
+{
+ home.packages = [ pkgs.rxvt_unicode ];
+
+ xresources.extraConfig = ''
+ URxvt.saveLines: 10000
+ URxvt.scrollBar: false
+ URxvt.font: xft:Iosevka:pixelsize=12
+ URxvt.letterSpace: 0
+ URxvt.transparent: false
+ URxvt.inheritPixmap: false
+ URxvt.fading: 20
+ URxvt.dynamicColors: on
+
+ URxvt.perl-ext-common: default,matcher,clipboard,resize-font
+ URxvt.matcher.button: 1
+ URxvt.matcher.pattern.1: \\bwww\\.[\\w-]\\.[\\w./?&@#-]*[\\w/-]
+ URxvt.url-launcher: firefox
+
+ URxvt.keysym.Control-Up: \033[1;5A
+ URxvt.keysym.Control-Down: \033[1;5B
+ URxvt.keysym.Control-Left: \033[1;5D
+ URxvt.keysym.Control-Right: \033[1;5C
+
+ URxvt.keysym.M-Down: \033[1;3B
+ URxvt.keysym.M-Up: \033[1;3A
+ URxvt.keysym.M-Left: \033[1;3D
+ URxvt.keysym.M-Right: \033[1;3C
+
+ URxvt.keysym.M-c: perl:clipboard:copy
+ URxvt.keysym.M-v: perl:clipboard:paste
+
+ URxvt.background: #161616
+ URxvt.foreground: #F2F2F2
+
+ ! black
+ URxvt.color0: #161616
+ URxvt.color8: #F2F2F2
+ ! red
+ URxvt.color1: #8C3346
+ URxvt.color9: #ff0000
+ ! green
+ URxvt.color2: #aadb0f
+ URxvt.color10: #909636
+ ! yellow
+ URxvt.color3: #E4E093
+ URxvt.color11: #ffff00
+ ! blue
+ URxvt.color4: #352F6A
+ URxvt.color12: #0000ff
+ ! magenta
+ URxvt.color5: #ce5c00
+ URxvt.color13: #f57900
+ ! cyan
+ URxvt.color6: #89b6e2
+ URxvt.color14: #46a4ff
+ ! white
+ URxvt.color7: #F2F2F2
+ URxvt.color15: #ffffff
+ '';
+}
diff --git a/gui/vim.nix b/gui/vim.nix
new file mode 100644
index 0000000..1b2c4db
--- /dev/null
+++ b/gui/vim.nix
@@ -0,0 +1,21 @@
+{ pkgs, ... }:
+
+{
+ home = {
+ # vim is configured globally for all users but common is the only GUI user
+ file.".gvimrc".text = ''
+ set guifont=Iosevka\ 10
+ set linespace=2
+ set guioptions=agim
+ set guioptions-=m
+ 2match SpecialKeyTab /\t/
+ '';
+ };
+
+ gtk = {
+ gtk2.extraConfig = ''
+ style "vimfix" { bg[NORMAL] = "#161616" }
+ widget "vim-main-window.*GtkForm" style "vimfix"
+ '';
+ };
+}
diff --git a/gui/xmonad.nix b/gui/xmonad.nix
new file mode 100644
index 0000000..85f86c2
--- /dev/null
+++ b/gui/xmonad.nix
@@ -0,0 +1,9 @@
+{ pkgs, ... }:
+
+{
+ xsession.windowManager.xmonad = {
+ enable = true;
+ enableContribAndExtras = true;
+ config = ./conf/xmonad.hs;
+ };
+}
diff --git a/gui/zathura.nix b/gui/zathura.nix
new file mode 100644
index 0000000..41eefbc
--- /dev/null
+++ b/gui/zathura.nix
@@ -0,0 +1,26 @@
+{ pkgs, ... }:
+
+{
+ home = {
+ packages = [ pkgs.zathura ];
+
+ file.".config/zathura/zathurarc".text = ''
+ set font "Iosevka 14px"
+
+ set inputbar-bg "#161616"
+ set inputbar-fg "#909737"
+
+ set statusbar-bg "#161616"
+ set statusbar-fg "#909737"
+
+ set completion-bg "#161616"
+ set completion-fg "#909737"
+
+ set completion-highlight-bg "#909737"
+ set completion-highlight-fg "#161616"
+
+ set recolor-lightcolor "#161616"
+ set recolor-darkcolor "#ffffff"
+ '';
+ };
+}