diff options
author | Adrian Kummerlaender | 2018-05-05 13:02:04 +0200 |
---|---|---|
committer | Adrian Kummerlaender | 2018-05-05 13:02:04 +0200 |
commit | dea9a66fccca94ed27387246e384f3dcb20501f6 (patch) | |
tree | 06ed6657b0d014d5e8faa0a20b267bf6a9f34472 /gui | |
parent | 74951f7eb0d8914201a5a4fa1b534abfe0ecfa0d (diff) | |
download | nixos_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.hs | 184 | ||||
-rw-r--r-- | gui/default.nix | 57 | ||||
-rw-r--r-- | gui/gtk.nix | 54 | ||||
-rw-r--r-- | gui/kitty.nix | 41 | ||||
-rw-r--r-- | gui/pcmanfm.nix | 17 | ||||
-rw-r--r-- | gui/pkgs/oomox-archdroid-icon-theme.nix | 29 | ||||
-rw-r--r-- | gui/pkgs/oomox-gtk-theme.nix | 60 | ||||
-rw-r--r-- | gui/rofi.nix | 55 | ||||
-rw-r--r-- | gui/urxvt.nix | 62 | ||||
-rw-r--r-- | gui/vim.nix | 21 | ||||
-rw-r--r-- | gui/xmonad.nix | 9 | ||||
-rw-r--r-- | gui/zathura.nix | 26 |
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" + ''; + }; +} |