From 125172361e1eef9d922ba541751c3a0a503daef7 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Mon, 1 Nov 2021 11:04:29 -0600 Subject: add passmenu --- src/Internal/PassMenu.hs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/Internal/PassMenu.hs diff --git a/src/Internal/PassMenu.hs b/src/Internal/PassMenu.hs new file mode 100644 index 0000000..7374bed --- /dev/null +++ b/src/Internal/PassMenu.hs @@ -0,0 +1,15 @@ +module Internal.PassMenu where + +import XMonad +import XMonad.Util.Run +import Control.Monad + +runPassMenu :: X () +runPassMenu = void $ + safeSpawn "passmenu" [ + "-p", "Password ", + "-l", "12", + "-dim", "0.4", + "-sb", "#f54245", + "-nf", "#f54245" ] + -- cgit From a9b95646b8581e8b0afd4eec99f960d9f42b9c38 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Mon, 1 Nov 2021 11:14:31 -0600 Subject: fix startup script --- startup | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/startup b/startup index 5c59e4d..a7cd604 100755 --- a/startup +++ b/startup @@ -1,14 +1,5 @@ #!/bin/bash - -common - -hostname_fn="hostname_$(hostname)" - -if [[ typeset -f "$hostname_fn" ]] ; then - "$hostname_fn" -fi - common() { # Startup commands common to all the hosts. xsetroot -cursor_name left_ptr @@ -17,7 +8,6 @@ common() { hostname_rahm1() { # Startup commands specific to my worktop. - xinput set-prop "TPPS/2 Elan TrackPoint" "Coordinate Transformation Matrix" 3 0 0 0 3 0 0 0 1 xinput set-prop "SYNA8004:00 06CB:CD8B Touchpad" "Coordinate Transformation Matrix" 3 0 0 0 3 0 0 0 1 @@ -33,3 +23,12 @@ hostname_photon() { xrandr --output DVI-I-1 --right-of DP-5 --mode 2560x1440 feh --bg-scale "/home/rahm/.xmonad/wallpaper.jpg" } + + +common + +hostname_fn="hostname_$(hostname)" + +if [[ "$(type -t "$hostname_fn")" == function ]] ; then + "$hostname_fn" +fi -- cgit From 1e38cda801d91f39ffe0eeb9808afb32f300098d Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Mon, 1 Nov 2021 13:59:03 -0600 Subject: Add more DMenu integration & Add ability to change the spacing with Mod+Shift+[]. --- .gitignore | 3 +++ src/Internal/DMenu.hs | 29 +++++++++++++++++++++++++++++ src/Internal/Keys.hs | 11 +++++++++-- src/Internal/Lib.hs | 31 ++++++++++++++++++++----------- startup | 2 +- 5 files changed, 62 insertions(+), 14 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f5570ff --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.stack-work/* +*.cabal +*.lock diff --git a/src/Internal/DMenu.hs b/src/Internal/DMenu.hs index c5cac49..d91c7ba 100644 --- a/src/Internal/DMenu.hs +++ b/src/Internal/DMenu.hs @@ -1,10 +1,39 @@ module Internal.DMenu where +import XMonad.Util.Dmenu import XMonad import XMonad.Util.Run import Control.Monad +import Data.Map (Map) +import qualified Data.Map as Map +import XMonad.Util.Run +import Data.List (intercalate) + +data Colors = + Colors { + fg :: String, + bg :: String + } | DefaultColors runDMenu :: X () runDMenu = void $ safeSpawn "/usr/bin/dmenu_run" [ "-p", "Execute ", "-l", "12", "-dim", "0.4"] + +runDMenuPrompt :: String -> Maybe String -> [String] -> X String +runDMenuPrompt prompt color select = + let realColor = maybe [] (\c -> ["-sb", c, "-nf", c]) color + in + runProcessWithInput "/home/rahm/.local/bin/dmenu_debug.sh" ([ + "-p", prompt, + "-l", "12", + "-dim", "0.4" ] ++ realColor) (intercalate "\n" select) + + +runDMenuPromptWithMap :: String -> Maybe String -> Map String a -> X (Maybe a) +runDMenuPromptWithMap prompt color map = do + let realColor = maybe [] (\c -> ["-sb", c, "-nf", c]) color + menuMapArgs "dmenu"([ + "-p", prompt, + "-l", "12", + "-dim", "0.4" ] ++ realColor) map diff --git a/src/Internal/Keys.hs b/src/Internal/Keys.hs index 91d033d..c97736f 100644 --- a/src/Internal/Keys.hs +++ b/src/Internal/Keys.hs @@ -4,6 +4,7 @@ module Internal.Keys where import Graphics.X11.ExtraTypes.XorgDefault import System.Process import XMonad.Util.Ungrab +import XMonad.Layout.Spacing import Internal.XPlus import Data.Maybe (isJust) import Debug.Trace @@ -65,6 +66,10 @@ click = do (_, _, window, _, _, _, _, _) <- io $ queryPointer dpy root focus window +modifyWindowBorder :: Integer -> SpacingModifier +modifyWindowBorder i = ModifyWindowBorder $ \(Border a b c d) -> + (Border (a + i) (b + i) (c + i) (d + i)) + newKeys :: MarkContext -> IO (KeyMap l) newKeys markContext = return $ \config@(XConfig {modMask = modm}) -> @@ -102,8 +107,10 @@ newKeys markContext = mapNumbersAndAlpha 0 ( runXPlus markContext config . swapWorkspace))) - , ((modm .|. shiftMask, xK_bracketleft), sendMessage (IncMasterN (-1))) - , ((modm .|. shiftMask, xK_bracketright), sendMessage (IncMasterN 1)) + , ((modm, xK_minus), sendMessage (IncMasterN (-1))) + , ((modm, xK_plus), sendMessage (IncMasterN 1)) + , ((modm .|. shiftMask, xK_bracketleft), sendMessage (modifyWindowBorder (-1))) + , ((modm .|. shiftMask, xK_bracketright), sendMessage (modifyWindowBorder 1)) , ((modm, xK_bracketleft), sendMessage ShrinkZoom) , ((modm, xK_bracketright), sendMessage ExpandZoom) diff --git a/src/Internal/Lib.hs b/src/Internal/Lib.hs index e0b78c5..feb5f26 100644 --- a/src/Internal/Lib.hs +++ b/src/Internal/Lib.hs @@ -3,6 +3,7 @@ module Internal.Lib where import Prelude hiding ((!!)) +import XMonad.Util.Run import XMonad.Prompt import XMonad.Prompt.Input import XMonad.Prompt.Shell @@ -19,6 +20,7 @@ import Text.Printf import XMonad hiding (workspaces, Screen) import XMonad.StackSet hiding (filter, focus) import qualified Data.Map as Map +import Internal.DMenu type WorkspaceName = Char newtype Selector = Selector (forall a. (Eq a) => a -> [a] -> a) @@ -123,15 +125,22 @@ windowJump = do windowTitlesToWinId <- withWindowSet $ \ss -> Map.fromList <$> mapM (\wid -> (,) <$> getString wid <*> return wid) (allWindows ss) - mkXPrompt - WinPrompt - xpConfig - (\input -> return $ filter (fuzzyCompletion input) (Map.keys windowTitlesToWinId)) $ - \str -> do + windowId <- runDMenuPromptWithMap "Window" (Just "#f542f5") windowTitlesToWinId + + case windowId of + Nothing -> return () + Just wid -> do saveLastMark markContext - case Map.lookup str windowTitlesToWinId of - Just w -> focus w - Nothing -> - case filter (fuzzyCompletion str) (Map.keys windowTitlesToWinId) of - [s] -> mapM_ focus (Map.lookup s windowTitlesToWinId) - _ -> return () + focus wid + -- mkXPrompt + -- WinPrompt + -- xpConfig + -- (\input -> return $ filter (fuzzyCompletion input) (Map.keys windowTitlesToWinId)) $ + -- \str -> do + -- saveLastMark markContext + -- case Map.lookup str windowTitlesToWinId of + -- Just w -> focus w + -- Nothing -> + -- case filter (fuzzyCompletion str) (Map.keys windowTitlesToWinId) of + -- [s] -> mapM_ focus (Map.lookup s windowTitlesToWinId) + -- _ -> return () diff --git a/startup b/startup index a7cd604..bb43beb 100755 --- a/startup +++ b/startup @@ -18,7 +18,7 @@ hostname_photon() { # Startup commands specific to my desktop. if [ ! -z "$(ps aux | grep compton | grep -v grep)" ] ; then - nohup compton --backend glx & > /dev/null + nohup compton --backend xrender & > /dev/null fi xrandr --output DVI-I-1 --right-of DP-5 --mode 2560x1440 feh --bg-scale "/home/rahm/.xmonad/wallpaper.jpg" -- cgit From 0d13796f6cb360ec8c00bf84651d68df5a108a33 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Tue, 2 Nov 2021 00:41:08 -0600 Subject: Big powerpill added to my XMonad and XMobar. --- install.sh | 2 + package.yaml | 1 + src/Internal/LayoutDraw.hs | 19 ++-- src/Main.hs | 38 +++++-- startup | 10 +- xmobar/extras/battery/battery.c | 226 ++++++++++++++++++++++++++++++++++++++++ xmobarrc | 43 ++++++-- 7 files changed, 308 insertions(+), 31 deletions(-) create mode 100644 xmobar/extras/battery/battery.c diff --git a/install.sh b/install.sh index dd8c299..a965ad8 100755 --- a/install.sh +++ b/install.sh @@ -5,6 +5,8 @@ cd "$real_dir" mkdir -p "$HOME/.xmonad" +cc -o ~/.xmonad/xmobar-battery xmobar/extras/battery/battery.c -lm + ln -sfv "$real_dir/build-script.sh" "$HOME/.xmonad/build" ln -sfv "$real_dir/compton.conf" "$HOME/.config/compton.conf" ln -sfv "$real_dir/startup" "$HOME/.xmonad/startup" diff --git a/package.yaml b/package.yaml index 686aaa7..e6e3648 100644 --- a/package.yaml +++ b/package.yaml @@ -19,3 +19,4 @@ dependencies: - cryptohash - listsafe - X11 + - split diff --git a/src/Internal/LayoutDraw.hs b/src/Internal/LayoutDraw.hs index 7dc2087..4bb069a 100644 --- a/src/Internal/LayoutDraw.hs +++ b/src/Internal/LayoutDraw.hs @@ -54,13 +54,13 @@ drawPng l = do -- (0.9, 0.9, 1.0), -- (0.8, 0.8, 1.0), -- (0.7, 0.7, 1.0), - (0.6, 0.6, 0.8), - (0.5, 0.5, 0.8), - (0.4, 0.4, 0.8), - (0.3, 0.3, 0.8), - (0.2, 0.2, 0.8), - (0.1, 0.1, 0.8), - (0.0, 0.0, 0.8) + (0.8, 0.6, 0.6), + (0.8, 0.5, 0.5), + (0.8, 0.4, 0.4), + (0.8, 0.3, 0.3), + (0.8, 0.2, 0.2), + (0.8, 0.1, 0.1), + (0.8, 0.0, 0.0) ] exists <- liftIO $ doesFileExist filepathXpm @@ -71,7 +71,7 @@ drawPng l = do setLineCap LineCapButt setLineJoin LineJoinMiter - forM_ (reverse $ zip (map (second padR) rects) colors) $ + forM_ (reverse $ zip (map (second extraPad) rects) colors) $ \((wind, Rectangle x y w h), (r, g, b)) -> do setSourceRGBA r g b 1 @@ -93,7 +93,8 @@ drawPng l = do return filepathXpm where - padR = id + extraPad (Rectangle x y w h) = + Rectangle (x + 100) (y + 100) (w - 100) (h - 100) -- padR (Rectangle x y w h) = -- Rectangle x y (max 1 $ w - 120) (max 1 $ h - 120) diff --git a/src/Main.hs b/src/Main.hs index 25c930e..7e1cc68 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -10,6 +10,7 @@ import Internal.Layout import XMonad.Hooks.ManageHelpers import XMonad.Layout.IndependentScreens import Text.Printf +import Data.List.Split import XMonad.Hooks.EwmhDesktops import Internal.Keys @@ -29,7 +30,8 @@ main = do , borderWidth = 2 , keys = \config -> mempty , focusedBorderColor = "#ff6c00" - , normalBorderColor = "#ffd9bf" + -- , normalBorderColor = "#ffd9bf" + , normalBorderColor = "#000000" , layoutHook = myLayout , startupHook = do ewmhDesktopsStartup @@ -55,15 +57,17 @@ main = do statusBar "xmobar" xmobarPP { - ppCurrent = xmobarColor "#ffffff" "red" . printf "%s" - , ppVisible = xmobarColor "#8888ff" "" . printf "%s" - , ppHidden = xmobarColor "#888888" "" . printf "%s" - , ppWsSep = " · " + ppCurrent = xmobarColor "#ff8888" "red" . printf "%s" + , ppVisible = xmobarColor "#8888ff" "" . printf "%s" + , ppHidden = xmobarColor "#888888" "" . printf "%s" + , ppWsSep = " " , ppTitle = - xmobarColor "#8888ff" "" . printf "%s" . - (printf "%s" :: String -> String) + xmobarColor "#808080" "" . + printf "%s" . + parseOut . + trunc 50 - , ppSep = xmobarColor "#404040" "" " ──── " + , ppSep = xmobarColor "#404040" "" " │ " , ppLayout = const "" , ppExtras = [showLayout] , ppOrder = \ss -> @@ -72,3 +76,21 @@ main = do } toggleStructsKey config + + where + parseOut :: String -> String + parseOut str = + let colors = ["#ff878f", "#e187ff", "#8f87ff", "#87fff7", "#8bff87", "#ffe987", "#ff8787"] + components = zip (cycle colors) (splitOnAll [" - ", " · ", " "] str) + in concatMap (\(color, str) -> + printf "%s " color str) components + + trunc amt str = + if length str > amt - 4 + then take (amt - 4) str ++ " ..." + else str + + splitOnAll arr str = splitOnAll' arr [str] + splitOnAll' [] str = str + splitOnAll' (a:as) str = splitOnAll' as (concatMap (splitOn a) str) + diff --git a/startup b/startup index bb43beb..dc302b7 100755 --- a/startup +++ b/startup @@ -11,14 +11,18 @@ hostname_rahm1() { xinput set-prop "TPPS/2 Elan TrackPoint" "Coordinate Transformation Matrix" 3 0 0 0 3 0 0 0 1 xinput set-prop "SYNA8004:00 06CB:CD8B Touchpad" "Coordinate Transformation Matrix" 3 0 0 0 3 0 0 0 1 - feh --bg-scale "/home/rahm/.xmonad/assets/Death-Valley-desert-USA_3840x2160.jpg" + if [ -z "$(ps aux | grep compton | grep -v grep)" ] ; then + __GL_SYNC_TO_VBLANK=1 nohup compton --backend=glx &>/dev/null & + fi + + feh --bg-scale "$HOME/wp.jpg" } hostname_photon() { # Startup commands specific to my desktop. - if [ ! -z "$(ps aux | grep compton | grep -v grep)" ] ; then - nohup compton --backend xrender & > /dev/null + if [ -z "$(ps aux | grep compton | grep -v grep)" ] ; then + __GL_SYNC_TO_VBLANK=1 nohup compton --backend=glx &>/dev/null & fi xrandr --output DVI-I-1 --right-of DP-5 --mode 2560x1440 feh --bg-scale "/home/rahm/.xmonad/wallpaper.jpg" diff --git a/xmobar/extras/battery/battery.c b/xmobar/extras/battery/battery.c new file mode 100644 index 0000000..8e5e58e --- /dev/null +++ b/xmobar/extras/battery/battery.c @@ -0,0 +1,226 @@ +#include +#include +#include +#include +#include +#include +#include + +#define N_ICONS 5 + +char* icons[] = { + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", +}; + +typedef long long llong_t; + +llong_t get_number(const char* file) +{ + int fd; + char buf[128]; + fd = open(file, O_RDONLY); + + if (fd < 0) { + return -1; + } + + size_t count = read(fd, buf, sizeof(buf)); + close(fd); + + if (count < 0 || count > sizeof(buf) - 1) { + return -1; + } + + buf[count] = 0; + return atoll(buf); +} + +float absf(float f) +{ + return f < 0 ? -f : f; +} + +uint32_t hsv_to_rgb(int h, int s, int v){ + if(h > 360 || h < 0 || s > 100 || s < 0 || v > 100 || v < 0){ + return -1; + } + + float sf = s / 100.0; + float vf = v / 100.0; + float hf = (float) h; + + float c = sf * vf; + float x = c * (1 - absf(fmod(hf / 60.0, 2) - 1)); + float m = vf - c; + float r,g,b; + + if(h >= 0 && h < 60){ + r = c; + g = x; + b = 0; + } + else if(h >= 60 && h < 120){ + r = x; + g = c; + b = 0; + } + else if(h >= 120 && h < 180){ + r = 0; + g = c; + b = x; + } + else if(h >= 180 && h < 240){ + r = 0; + g = x; + b = c; + } + else if(h >= 240 && h < 300){ + r = x; + g = 0; + b = c; + } + else{ + r = c; + g = 0; + b = x; + } + + int ri = (int) ((r + m) * 255); + int gi = (int) ((g + m) * 255); + int bi = (int) ((b + m) * 255); + + return (ri << 16) | (gi << 8) | bi; +} + +llong_t get_capacity() +{ + return get_number("/sys/class/power_supply/BAT0/capacity"); +} + +llong_t get_energy_full() +{ + return get_number("/sys/class/power_supply/BAT0/energy_full"); +} + +llong_t get_energy_now() +{ + return get_number("/sys/class/power_supply/BAT0/energy_now"); +} + +llong_t get_ac_online() +{ + return get_number("/sys/class/power_supply/AC/online"); +} + +llong_t get_power() +{ + return get_number("/sys/class/power_supply/BAT0/power_now"); +} + +int get_status(char* buf, size_t size) +{ + int fd; + fd = open("/sys/class/power_supply/BAT0/status", O_RDONLY); + + if (fd < 0) { + return 1; + } + + size_t count = read(fd, buf, size); + close(fd); + + if (count < 0 || count > size - 1) { + return 1; + } + + buf[count] = 0; + --count; + while (count > 0 && buf[count] == '\n') { + buf[count --] = 0; + } + + return 0; +} + +uint32_t percentage_to_color(int percentage) +{ + int h = 135 * percentage / 100; + int s = 81; + int v = 76; + + return hsv_to_rgb(h, s, v); +} + +void get_time_left(char* buf, size_t sz, llong_t energy, llong_t power) +{ + llong_t minutes_left = energy * 60 / power; + + llong_t hours = minutes_left / 60; + llong_t minutes = minutes_left % 60; + + snprintf(buf, sz - 1, "%2lluh%2llum", hours, minutes); + buf[sz - 1] = 0; +} + +int main(int argc, char** argv) +{ + char* icon; + char timeleft[128]; + + llong_t capacity; + llong_t energy_now; + llong_t ac_online; + llong_t power; + + if ((energy_now = get_energy_now()) < 0) { + fprintf(stderr, "Unable to get current energy."); + goto fail; + } + + if ((capacity = get_capacity()) < 0) { + fprintf(stderr, "Unable to get capacity."); + goto fail; + } + + if ((ac_online = get_ac_online()) < 0) { + fprintf(stderr, "Unable to get status."); + goto fail; + } + + if ((power = get_power()) < 0) { + fprintf(stderr, "Unable toget power."); + goto fail; + } + + ac_online = !! ac_online; + + int percentage = (int) capacity; + if (percentage >= 100) { + icon = icons[10 + ac_online]; + } else { + int quintile = percentage / 20; + icon = icons[quintile + (5 * ac_online) ]; + } + + get_time_left(timeleft, sizeof(timeleft), energy_now, power); + + double dpower = power / 1000000.0; + uint32_t color = percentage_to_color(percentage); + printf("%s %d%% %2.1fW %s", color, icon, percentage, dpower, timeleft); + return 0; + +fail: + printf(""); + return 0; +} diff --git a/xmobarrc b/xmobarrc index 9c0b7f8..2893a17 100644 --- a/xmobarrc +++ b/xmobarrc @@ -1,10 +1,13 @@ Config - { font = "xft:Ubuntu Mono:size=20" - , additionalFonts = ["xft:Lato:style=bold"] -- default: [] - , borderColor = "#ffd9bf" - , border = BottomB - , borderWidth = 1 - , bgColor = "black" + { font = "xft:Monofur Nerd Font:size=15" + , additionalFonts = [ + "xft:Monofur bold Nerd Font:style=bold:size=15", + "xft:Monofur Nerd Font:size=12", + "xft:Monofur Nerd Font:size=12" ] + , borderColor = "black" + , border = FullB + , borderWidth = 2 + , bgColor = "#17171b" , fgColor = "white" , alpha = 250 -- default: 255 , position = TopSize L 100 50 @@ -19,7 +22,7 @@ Config , overrideRedirect = False -- default: True , sepChar = "%" , alignSep = "}{" - , template = " %StdinReader% }{ ──── %battery% ──── %date% " + , template = " │ %date% │ %StdinReader% }%time%{ %cpu% │ %KBDU% │ %uname% │ %bat% " , commands = [ Run Battery [ "--template" , "" , "--Low" , "10" -- units: % @@ -30,12 +33,30 @@ Config , "--" -- battery specific options -- discharging status - , "-o" , "% - " + , "-o" , " (%, )" -- AC "on" status - , "-O" , "Charging" + , "-O" , " (%)" -- charged status - , "-i" , "Charged" + , "-i" , "" ] 50, - Run StdinReader + Run StdinReader, + Run Date "%H:%M:%S" "time" 10, + Run Date "%m/%d" "date" 10, + Run Cpu ["-t", "%", "-L","3","-H","50","--normal","green","--high","red"] 10, + Run WeatherX "KBDU" + [ ("clear", "") + , ("sunny", "") + , ("mostly clear", "") + , ("mostly sunny", "") + , ("partly sunny", "") + , ("fair", "🌑") + , ("cloudy","摒") + , ("overcast","") + , ("partly cloudy", "杖") + , ("mostly cloudy", "") + , ("considerable cloudiness", "ﭽ")] + ["--template", " °F"] 360000, + Run Com "uname" ["-r"] "uname" 0, + Run Com ".xmonad/xmobar-battery" [] "bat" 20 ] } -- cgit From bc641331a060a8bd4941b1854a08a97b3700fe6c Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Tue, 2 Nov 2021 00:53:16 -0600 Subject: Changed how titles are parsed. --- src/Main.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Main.hs b/src/Main.hs index 7e1cc68..195c151 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -92,5 +92,6 @@ main = do splitOnAll arr str = splitOnAll' arr [str] splitOnAll' [] str = str - splitOnAll' (a:as) str = splitOnAll' as (concatMap (splitOn a) str) + splitOnAll' (a:as) [str] = splitOnAll' as (splitOn a str) + splitOnAll' _ lst = lst -- cgit From 791ea7971b097a8146e993ed5ba490ccf0b2c72c Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Tue, 2 Nov 2021 20:15:32 -0600 Subject: More XMobar sexiness. Revamped the install script to make it easier to handle the install process. --- .gitignore | 1 + assets/wallpaper.jpg | Bin 767997 -> 0 bytes build-script.sh | 17 ------ compton.conf | 52 ---------------- extras/HOME/.config/compton.conf | 49 +++++++++++++++ extras/HOME/.local/.local/bin/spotify-control | 40 +++++++++++++ extras/HOME/.local/.local/bin/vim | 83 ++++++++++++++++++++++++++ extras/HOME/.local/bin/bluetooth-select.sh | 14 +++++ extras/HOME/.local/bin/spotify-control | 40 +++++++++++++ extras/HOME/.xmobarrc | 71 ++++++++++++++++++++++ extras/HOME/.xmonad/build | 17 ++++++ extras/HOME/.xmonad/startup | 38 ++++++++++++ extras/HOME/.xmonad/wallpaper.jpg | Bin 0 -> 767997 bytes extras/HOME/.xmonad/xmobar-bluetooth | 18 ++++++ extras/HOME/.xmonad/xmobar-logo | 9 +++ install.sh | 24 ++++++-- src/Internal/Keys.hs | 6 +- src/Main.hs | 2 +- startup | 38 ------------ xmobar/extras/battery/battery.c | 44 +++++++++++--- xmobarrc | 62 ------------------- 21 files changed, 441 insertions(+), 184 deletions(-) delete mode 100644 assets/wallpaper.jpg delete mode 100755 build-script.sh delete mode 100644 compton.conf create mode 100644 extras/HOME/.config/compton.conf create mode 100755 extras/HOME/.local/.local/bin/spotify-control create mode 100755 extras/HOME/.local/.local/bin/vim create mode 100755 extras/HOME/.local/bin/bluetooth-select.sh create mode 100755 extras/HOME/.local/bin/spotify-control create mode 100644 extras/HOME/.xmobarrc create mode 100755 extras/HOME/.xmonad/build create mode 100755 extras/HOME/.xmonad/startup create mode 100644 extras/HOME/.xmonad/wallpaper.jpg create mode 100755 extras/HOME/.xmonad/xmobar-bluetooth create mode 100755 extras/HOME/.xmonad/xmobar-logo delete mode 100755 startup delete mode 100644 xmobarrc diff --git a/.gitignore b/.gitignore index f5570ff..bb6c218 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .stack-work/* *.cabal *.lock +build/* diff --git a/assets/wallpaper.jpg b/assets/wallpaper.jpg deleted file mode 100644 index 4976715..0000000 Binary files a/assets/wallpaper.jpg and /dev/null differ diff --git a/build-script.sh b/build-script.sh deleted file mode 100755 index 72b6310..0000000 --- a/build-script.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -actual_bin=$(readlink -f "$0") -proj_dir="$(dirname $actual_bin)" -olddir="$(pwd)" - -cd "$proj_dir" -stack install - -ec="$?" -if [ "$ec" -ne 0 ] ; then - exit "$ec" -fi - -cd "$olddir" - -ln -sf "$HOME/.local/bin/jrahm-xmonad" "$1" diff --git a/compton.conf b/compton.conf deleted file mode 100644 index 90be41d..0000000 --- a/compton.conf +++ /dev/null @@ -1,52 +0,0 @@ -backend = "glx"; - -### Shadow -shadow = true; -no-dnd-shadow = true; -# no-dock-shadow = true; -# clear-shadow = true; -shadow-radius = 7; -shadow-offset-x = -10; -shadow-offset-y = -5; -shadow-opacity = 0.8; -shadow-red = 0.0; -shadow-green = 0.0; -shadow-blue = 0.0; - -inactive-dim=0.1 -inactive-opacity=0.99 - -shadow-exclude = [ - # From the Ubuntu forums link ('screaminj3sus') - # "! name~=''", - # "n:e:Notification", - # "n:e:Plank", - # "n:e:Docky", - # "g:e:Synapse", - # "g:e:Kupfer", - # "g:e:Conky", - # "n:w:*Firefox*", - # "class_g ?= 'Notify-osd'", - # "class_g ?= 'Cairo-dock'", - # "class_g ?= 'Xfce4-notifyd'", - # "class_g ?= 'Xfce4-power-manager'" -]; -shadow-ignore-shaped = false; - -blur-background = true; - -wintypes: -{ - tooltip = - { - fade = true; - shadow = false; - opacity = 0.85; - focus = true; - } - - - -} -# shadow-exclude-reg = "x10+0+0"; -# xinerama-shadow-crop = true; diff --git a/extras/HOME/.config/compton.conf b/extras/HOME/.config/compton.conf new file mode 100644 index 0000000..2728ce1 --- /dev/null +++ b/extras/HOME/.config/compton.conf @@ -0,0 +1,49 @@ +backend = "glx"; + +### Shadow +shadow = true; +no-dnd-shadow = true; +# no-dock-shadow = true; +# clear-shadow = true; +shadow-radius = 7; +shadow-offset-x = -10; +shadow-offset-y = -5; +shadow-opacity = 0.8; +shadow-red = 0.0; +shadow-green = 0.0; +shadow-blue = 0.0; + +inactive-dim=0.1 +inactive-opacity=0.99 + +shadow-exclude = [ + # From the Ubuntu forums link ('screaminj3sus') + # "! name~=''", + # "n:e:Notification", + # "n:e:Plank", + # "n:e:Docky", + # "g:e:Synapse", + # "g:e:Kupfer", + # "g:e:Conky", + # "n:w:*Firefox*", + # "class_g ?= 'Notify-osd'", + # "class_g ?= 'Cairo-dock'", + # "class_g ?= 'Xfce4-notifyd'", + # "class_g ?= 'Xfce4-power-manager'" +]; +shadow-ignore-shaped = false; + +blur-background = false; + +wintypes: +{ + tooltip = + { + fade = true; + shadow = false; + opacity = 0.85; + focus = true; + } +} +# shadow-exclude-reg = "x10+0+0"; +# xinerama-shadow-crop = true; diff --git a/extras/HOME/.local/.local/bin/spotify-control b/extras/HOME/.local/.local/bin/spotify-control new file mode 100755 index 0000000..751f562 --- /dev/null +++ b/extras/HOME/.local/.local/bin/spotify-control @@ -0,0 +1,40 @@ +#!/bin/bash + +if [ $# -lt 1 ] +then + echo "No command?" + exit +fi + +if [ "$(pidof spotify)" = "" ] +then + echo "Spotify is not running" + exit +fi + +case $1 in + "play") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause + ;; + "next") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next + ;; + "prev") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous + ;; + "getTitle") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'|egrep -A 1 "title"|egrep -v "title"|cut -b 44-|cut -d '"' -f 1|egrep -v ^$ + ;; + "getArtist") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'|egrep -A 2 "artist"|egrep -v "artist"|egrep -v "array"|cut -b 27-|cut -d '"' -f 1|egrep -v ^$ + ;; + "getAlbum") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'|egrep -A 2 "album"|egrep -v "album"|egrep -v "array"|cut -b 44-|cut -d '"' -f 1|egrep -v ^$ + ;; + "getStatus") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'PlaybackStatus'|grep 'string "[^"]*"'|sed 's/.*"\(.*\)"[^"]*$/\1/' + ;; + *) + echo "Unknown command: " $1 + ;; +esac diff --git a/extras/HOME/.local/.local/bin/vim b/extras/HOME/.local/.local/bin/vim new file mode 100755 index 0000000..d0aafa5 --- /dev/null +++ b/extras/HOME/.local/.local/bin/vim @@ -0,0 +1,83 @@ +#!/usr/bin/python3 + +import neovim, os, re, sys, time + +# Get a list of buffers that haven't been deleted. `nvim.buffers` includes +# buffers that have had `:bdelete` called on them and aren't in the buffer +# list, so we have to filter those out. +def get_listed_buffers(nvim): + return set(buf.number for buf in nvim.buffers \ + if nvim.eval('buflisted(%d)' % buf.number)) + + +def resolve_google3(fname): + if fname.startswith('//depot/google3'): + cwd = os.getcwd() + if "/google3" in cwd: + depot_dir = cwd[:cwd.find('/google3')] + realfname = fname.replace('//depot', depot_dir) + return realfname + return fname + +# For now, treat all arguments that don't start with - or + as filenames. This +# is good enough to recognize '-f' and `+11`, which is all this script really +# needs right now. +filenames = [ + re.sub(' ', '\ ', os.path.abspath(resolve_google3(arg))) + for arg in sys.argv[1:] if not arg[0] in ['-', '+'] +] + +try: + nvim_socket = os.environ["NVIM_LISTEN_ADDRESS"] +except KeyError: + # If we aren't running inside a `:terminal`, just exec nvim. + os.execvp(u'nvim', sys.argv) + +nvim = neovim.attach('socket', path=nvim_socket) + +existing_buffers = get_listed_buffers(nvim) + +nvim.command('split') +nvim.command('args %s' % ' '.join(filenames)) + +new_buffers = get_listed_buffers(nvim).difference(existing_buffers) + +for arg in sys.argv: + if arg[0] == '+': + nvim.command(arg[1:]) + +# The '-f' flag is a signal that we're in a situation like a `git commit` +# invocation where we need to block until the user is done with the file(s). +if '-f' in sys.argv and len(new_buffers) > 0: + # The rule here is that the user is 'done' with the opened files when none + # of them are visible onscreen. This allows for use cases like hitting `:q` + # on a `git commit` tempfile. However, we can't just poll to see if they're + # visible, because using `nvim.windows`, `nvim.eval()`, or `nvim.call()` + # will interrupt any multi-key mappings the user may be inputting. The + # solution is to set a buffer-local autocmd on each opened buffer so that + # we only check for visibility immediately after the user either closes or + # hides one of the buffers. + channel_id = nvim.channel_id + for buffer in new_buffers: + nvim.command(( + 'autocmd BufDelete,BufHidden ' + + 'call rpcnotify(%d, "check_buffers")' + ) % (buffer, channel_id)) + + stay_open = True + while stay_open: + nvim.next_message() # block until `rpcnotify` is called + open_buffers = [window.buffer.number for window in nvim.windows] + stay_open = any([buffer in open_buffers for buffer in new_buffers]) + + # Now that none of the opened files are visible anymore, we do a few + # cleanup steps before ending the script: + # * Clear the arg list, since otherwise `:next` would reopen the tempfile + # or whatever. + # * Clear the autocmds we added, since `bdelete` just hides the buffer and + # the autocmds will still be active if the user reopens the file(s). + # * Delete each of the buffers we created. + nvim.command('argdel *') + for buffer in new_buffers: + nvim.command('autocmd! BufDelete,BufHidden ' % buffer) + nvim.command('bdelete! %d' % buffer) diff --git a/extras/HOME/.local/bin/bluetooth-select.sh b/extras/HOME/.local/bin/bluetooth-select.sh new file mode 100755 index 0000000..a0b8559 --- /dev/null +++ b/extras/HOME/.local/bin/bluetooth-select.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +devices="$(bluetoothctl -- devices | sed 's#^Device ##')" +selection="$( + echo -e "$devices\nDisconnect" | + dmenu -i -nf "#8888ff" -sb "#8888ff" -p "Connect Bluetooth" -l 12)" + +macaddr="${selection%% *}" + +if [[ "$macaddr" == "Disconnect" ]] ; then + exec bluetoothctl -- disconnect +fi + +exec bluetoothctl -- connect "$macaddr" diff --git a/extras/HOME/.local/bin/spotify-control b/extras/HOME/.local/bin/spotify-control new file mode 100755 index 0000000..751f562 --- /dev/null +++ b/extras/HOME/.local/bin/spotify-control @@ -0,0 +1,40 @@ +#!/bin/bash + +if [ $# -lt 1 ] +then + echo "No command?" + exit +fi + +if [ "$(pidof spotify)" = "" ] +then + echo "Spotify is not running" + exit +fi + +case $1 in + "play") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause + ;; + "next") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next + ;; + "prev") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous + ;; + "getTitle") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'|egrep -A 1 "title"|egrep -v "title"|cut -b 44-|cut -d '"' -f 1|egrep -v ^$ + ;; + "getArtist") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'|egrep -A 2 "artist"|egrep -v "artist"|egrep -v "array"|cut -b 27-|cut -d '"' -f 1|egrep -v ^$ + ;; + "getAlbum") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'|egrep -A 2 "album"|egrep -v "album"|egrep -v "array"|cut -b 44-|cut -d '"' -f 1|egrep -v ^$ + ;; + "getStatus") + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'PlaybackStatus'|grep 'string "[^"]*"'|sed 's/.*"\(.*\)"[^"]*$/\1/' + ;; + *) + echo "Unknown command: " $1 + ;; +esac diff --git a/extras/HOME/.xmobarrc b/extras/HOME/.xmobarrc new file mode 100644 index 0000000..ecf53ed --- /dev/null +++ b/extras/HOME/.xmobarrc @@ -0,0 +1,71 @@ +Config + { font = "xft:Monofur Nerd Font:size=15" + , additionalFonts = [ + "xft:Monofur bold Nerd Font:style=bold:size=12", + "xft:Monofur Nerd Font:size=9", + "xft:Monofur bold Nerd Font:size=9", + "xft:Monofur Nerd Font:size=6", + "xft:Monofur bold Nerd Font:size=40", + "xft:Monofur Nerd Font:style=bold:size=12" + ] + , borderColor = "black" + , border = FullBM -1 + , borderWidth = 2 + , bgColor = "#17171b" + , fgColor = "white" + , alpha = 250 -- default: 255 + , position = TopSize L 100 40 + , textOffset = -1 -- default: -1 + , iconOffset = -1 -- default: -1 + , lowerOnStart = True + , pickBroadest = False -- default: False + , persistent = True + , hideOnStart = False + , iconRoot = "/usr/local/google/home/rahm/.xmonad/resources" -- default: "." + , allDesktops = True -- default: True + , overrideRedirect = False -- default: True + , sepChar = "%" + , alignSep = "}{" + , template = + " %logo% %uname% │\ + \ %date% │ \ + \%StdinReader%}%time%\ + \{ %cpu% \ + \│ %KLMO% │\ + \ %mpris2% │ \ + \%bluetooth%%bat% " + , commands = [ + Run StdinReader, + Run Memory ["-t", ""] 10, + Run Date "%H:%M:%S" "time" 10, + Run Date "%m/%d" "date" 10, + Run Cpu [ + "-t", "", + "-L", "3", + "-H", "50", + "-b", "─", + "-f", "─", + "--normal", "green", + "--high", "red" + ] 10, + Run WeatherX "KLMO" + [ ("clear", "") + , ("sunny", "") + , ("mostly clear", "") + , ("mostly sunny", "") + , ("partly sunny", "") + , ("fair", "🌑") + , ("cloudy","摒") + , ("overcast","") + , ("partly cloudy", "杖") + , ("mostly cloudy", "") + , ("considerable cloudiness", "ﭽ")] + ["--template", " \ + \°F"] 360000, + Run Mpris2 "spotify" ["-t", "</fn>"] 20, + Run Com ".xmonad/xmobar-logo" [] "logo" 0, + Run Com "uname" ["-r"] "uname" 0, + Run Com ".xmonad/xmobar-bluetooth" [] "bluetooth" 50, + Run Com ".xmonad/xmobar-battery" [] "bat" 20 + ] + } diff --git a/extras/HOME/.xmonad/build b/extras/HOME/.xmonad/build new file mode 100755 index 0000000..72b6310 --- /dev/null +++ b/extras/HOME/.xmonad/build @@ -0,0 +1,17 @@ +#!/bin/sh + +actual_bin=$(readlink -f "$0") +proj_dir="$(dirname $actual_bin)" +olddir="$(pwd)" + +cd "$proj_dir" +stack install + +ec="$?" +if [ "$ec" -ne 0 ] ; then + exit "$ec" +fi + +cd "$olddir" + +ln -sf "$HOME/.local/bin/jrahm-xmonad" "$1" diff --git a/extras/HOME/.xmonad/startup b/extras/HOME/.xmonad/startup new file mode 100755 index 0000000..dc302b7 --- /dev/null +++ b/extras/HOME/.xmonad/startup @@ -0,0 +1,38 @@ +#!/bin/bash + +common() { + # Startup commands common to all the hosts. + xsetroot -cursor_name left_ptr + xset r rate 200 60 +} + +hostname_rahm1() { + # Startup commands specific to my worktop. + xinput set-prop "TPPS/2 Elan TrackPoint" "Coordinate Transformation Matrix" 3 0 0 0 3 0 0 0 1 + xinput set-prop "SYNA8004:00 06CB:CD8B Touchpad" "Coordinate Transformation Matrix" 3 0 0 0 3 0 0 0 1 + + if [ -z "$(ps aux | grep compton | grep -v grep)" ] ; then + __GL_SYNC_TO_VBLANK=1 nohup compton --backend=glx &>/dev/null & + fi + + feh --bg-scale "$HOME/wp.jpg" +} + +hostname_photon() { + # Startup commands specific to my desktop. + + if [ -z "$(ps aux | grep compton | grep -v grep)" ] ; then + __GL_SYNC_TO_VBLANK=1 nohup compton --backend=glx &>/dev/null & + fi + xrandr --output DVI-I-1 --right-of DP-5 --mode 2560x1440 + feh --bg-scale "/home/rahm/.xmonad/wallpaper.jpg" +} + + +common + +hostname_fn="hostname_$(hostname)" + +if [[ "$(type -t "$hostname_fn")" == function ]] ; then + "$hostname_fn" +fi diff --git a/extras/HOME/.xmonad/wallpaper.jpg b/extras/HOME/.xmonad/wallpaper.jpg new file mode 100644 index 0000000..4976715 Binary files /dev/null and b/extras/HOME/.xmonad/wallpaper.jpg differ diff --git a/extras/HOME/.xmonad/xmobar-bluetooth b/extras/HOME/.xmonad/xmobar-bluetooth new file mode 100755 index 0000000..93caa50 --- /dev/null +++ b/extras/HOME/.xmonad/xmobar-bluetooth @@ -0,0 +1,18 @@ +#!/bin/sh + +cur="" + +bluetoothctl -- info | while read line ; do + key=${line%%: *} + value=${line//*: } + + if [ "$key" == "Name" ] ; then + cur="$value" + fi + + if [ "$key" == "Connected" -a "$value" == "yes" ] ; then + exec echo "<fc=#4287f5></fc> <fc=#a0a0a0><fn=3>$cur</fn></fc> <fc=#404040>│</fc> " + fi +done + +exec echo "<fc=#a0a0a0></fc> <fc=#404040>│</fc>" diff --git a/extras/HOME/.xmonad/xmobar-logo b/extras/HOME/.xmonad/xmobar-logo new file mode 100755 index 0000000..848ebd2 --- /dev/null +++ b/extras/HOME/.xmonad/xmobar-logo @@ -0,0 +1,9 @@ +#!/bin/bash + +case "$(uname -a)" in + *-arch-*) exec echo '<fn=5><fc=#1785bd></fc></fn>' ;; + *Debian*) exec echo '<fn=5><fc=#c00649></fc></fn>' ;; + *Ubuntu*) exec echo '<fn=5><fc=#ff8888></fc></fn>' ;; + *Linux*) exec echo '<fn=5><fc=#ffffff></fc></fn>' ;; + *BSD*) exec echo '<fn=5><fc=#ff4444></fc></fn>' ;; +esac diff --git a/install.sh b/install.sh index a965ad8..59a5078 100755 --- a/install.sh +++ b/install.sh @@ -4,11 +4,23 @@ real_dir=$(dirname $(readlink -f "$0")) cd "$real_dir" mkdir -p "$HOME/.xmonad" +mkdir -p "$HOME/.config" -cc -o ~/.xmonad/xmobar-battery xmobar/extras/battery/battery.c -lm +mkdir -p build/extras/HOME/.xmonad -ln -sfv "$real_dir/build-script.sh" "$HOME/.xmonad/build" -ln -sfv "$real_dir/compton.conf" "$HOME/.config/compton.conf" -ln -sfv "$real_dir/startup" "$HOME/.xmonad/startup" -ln -sfv "$real_dir/xmobarrc" "$HOME/.xmobarrc" -ln -sfv "$real_dir/assets/wallpaper.jpg" "$HOME/.xmonad/wallpaper.jpg" +cc -o \ + build/extras/HOME/.xmonad/xmobar-battery \ + xmobar/extras/battery/battery.c \ + -lm + +GLOBIGNORE=".:.." +shopt -u dotglob + +cd "$HOME" +cp -rsvf \ + "$real_dir"/extras/HOME/* \ + "$real_dir"/extras/HOME/.* \ + "$real_dir"/build/extras/HOME/* \ + "$real_dir"/build/extras/HOME/.* \ + . +cd "$real_dir" diff --git a/src/Internal/Keys.hs b/src/Internal/Keys.hs index c97736f..3dff864 100644 --- a/src/Internal/Keys.hs +++ b/src/Internal/Keys.hs @@ -85,7 +85,8 @@ newKeys markContext = , ((modm .|. mod1Mask, xK_s), (void $ spawn "sudo systemctl suspend && xsecurelock")) , ((modm .|. shiftMask, xK_c), kill) , ((modm .|. shiftMask, xK_t), withFocused $ windows . W.sink) - , ((mod4Mask, xK_Escape), (void $ spawn "xterm")) + , ((mod4Mask, xK_BackSpace), (void $ spawn "xterm")) + , ((mod3Mask, xK_BackSpace), (void $ spawn "pkill -SIGUSR1 xmobar")) , ((mod3Mask, xK_t), (void $ spawn (terminal config))) , ((modm, xK_m), (submap $ mapAlpha modm (markCurrentWindow markContext))) , ((modm, xK_w), runXPlus markContext config windowJump) @@ -122,6 +123,9 @@ newKeys markContext = , ((modm, xK_q), spawn "xmonad --recompile && xmonad --restart") , ((modm, xK_z), sendMessage ToggleZoom) + , ((modm, xK_x), spawn "bluetooth-select.sh") + , ((modm .|. shiftMask, xK_x), spawn "bluetoothctl -- disconnect") + , ((modm, xK_Tab), windows W.focusDown) , ((modm .|. shiftMask, xK_Tab), windows W.focusUp) diff --git a/src/Main.hs b/src/Main.hs index 195c151..85d18c7 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -58,7 +58,7 @@ main = do "xmobar" xmobarPP { ppCurrent = xmobarColor "#ff8888" "red" . printf "<fn=1>%s</fn>" - , ppVisible = xmobarColor "#8888ff" "" . printf "<fn=0>%s</fn>" + , ppVisible = xmobarColor "#8888ff" "" . printf "<fn=6>%s</fn>" , ppHidden = xmobarColor "#888888" "" . printf "<fn=2>%s</fn>" , ppWsSep = "<fn=1><fc=#808080> </fc></fn>" , ppTitle = diff --git a/startup b/startup deleted file mode 100755 index dc302b7..0000000 --- a/startup +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -common() { - # Startup commands common to all the hosts. - xsetroot -cursor_name left_ptr - xset r rate 200 60 -} - -hostname_rahm1() { - # Startup commands specific to my worktop. - xinput set-prop "TPPS/2 Elan TrackPoint" "Coordinate Transformation Matrix" 3 0 0 0 3 0 0 0 1 - xinput set-prop "SYNA8004:00 06CB:CD8B Touchpad" "Coordinate Transformation Matrix" 3 0 0 0 3 0 0 0 1 - - if [ -z "$(ps aux | grep compton | grep -v grep)" ] ; then - __GL_SYNC_TO_VBLANK=1 nohup compton --backend=glx &>/dev/null & - fi - - feh --bg-scale "$HOME/wp.jpg" -} - -hostname_photon() { - # Startup commands specific to my desktop. - - if [ -z "$(ps aux | grep compton | grep -v grep)" ] ; then - __GL_SYNC_TO_VBLANK=1 nohup compton --backend=glx &>/dev/null & - fi - xrandr --output DVI-I-1 --right-of DP-5 --mode 2560x1440 - feh --bg-scale "/home/rahm/.xmonad/wallpaper.jpg" -} - - -common - -hostname_fn="hostname_$(hostname)" - -if [[ "$(type -t "$hostname_fn")" == function ]] ; then - "$hostname_fn" -fi diff --git a/xmobar/extras/battery/battery.c b/xmobar/extras/battery/battery.c index 8e5e58e..791bc69 100644 --- a/xmobar/extras/battery/battery.c +++ b/xmobar/extras/battery/battery.c @@ -13,7 +13,7 @@ char* icons[] = { "", "", "", - "", + "", "", "", "", @@ -162,14 +162,22 @@ uint32_t percentage_to_color(int percentage) return hsv_to_rgb(h, s, v); } -void get_time_left(char* buf, size_t sz, llong_t energy, llong_t power) +void get_time_left( + char* buf, + size_t sz, + llong_t energy, + llong_t power) { + if (power == 0) { + buf[0] = 0; + return; + } llong_t minutes_left = energy * 60 / power; llong_t hours = minutes_left / 60; llong_t minutes = minutes_left % 60; - snprintf(buf, sz - 1, "%2lluh%2llum", hours, minutes); + snprintf(buf, sz - 1, "%lluh%2llum", hours, minutes); buf[sz - 1] = 0; } @@ -177,9 +185,12 @@ int main(int argc, char** argv) { char* icon; char timeleft[128]; + char watts[128]; + char percent[128]; llong_t capacity; llong_t energy_now; + llong_t energy_full; llong_t ac_online; llong_t power; @@ -206,18 +217,37 @@ int main(int argc, char** argv) ac_online = !! ac_online; int percentage = (int) capacity; - if (percentage >= 100) { + if (percentage >= 98) { icon = icons[10 + ac_online]; } else { int quintile = percentage / 20; icon = icons[quintile + (5 * ac_online) ]; } - get_time_left(timeleft, sizeof(timeleft), energy_now, power); + if (ac_online) { + if ((energy_full = get_energy_full()) < 0) { + fprintf(stderr, "Unable to get current energy."); + goto fail; + } + get_time_left(timeleft, sizeof(timeleft), energy_full - energy_now, power); + } else { + get_time_left(timeleft, sizeof(timeleft), energy_now, power); + } + + watts[0] = 0; + percent[0] = 0; + if (power) { + double dpower = power / 1000000.0; + snprintf(watts, sizeof(watts), "%2.1fW ", dpower); + } + + if (percentage < 99 || ! ac_online) { + snprintf(percent, sizeof(percent), "%2d%% ", percentage); + } - double dpower = power / 1000000.0; uint32_t color = percentage_to_color(percentage); - printf("<fc=#%06x>%s </fc><fc=#8888ff>%d%% %2.1fW %s</fc>", color, icon, percentage, dpower, timeleft); + printf("<fc=#%06x>%s </fc><fn=3><fc=#a0a0a0>%s%s%s</fc></fn>", + color, icon, percent, watts, timeleft); return 0; fail: diff --git a/xmobarrc b/xmobarrc deleted file mode 100644 index 2893a17..0000000 --- a/xmobarrc +++ /dev/null @@ -1,62 +0,0 @@ -Config - { font = "xft:Monofur Nerd Font:size=15" - , additionalFonts = [ - "xft:Monofur bold Nerd Font:style=bold:size=15", - "xft:Monofur Nerd Font:size=12", - "xft:Monofur Nerd Font:size=12" ] - , borderColor = "black" - , border = FullB - , borderWidth = 2 - , bgColor = "#17171b" - , fgColor = "white" - , alpha = 250 -- default: 255 - , position = TopSize L 100 50 - , textOffset = -1 -- default: -1 - , iconOffset = -1 -- default: -1 - , lowerOnStart = True - , pickBroadest = False -- default: False - , persistent = True - , hideOnStart = False - , iconRoot = "/usr/local/google/home/rahm/.xmonad/resources" -- default: "." - , allDesktops = True -- default: True - , overrideRedirect = False -- default: True - , sepChar = "%" - , alignSep = "}{" - , template = " <fc=#ff8888></fc> <fc=#404040> │</fc><fc=#ff8888> %date%</fc><fc=#404040> │ </fc>%StdinReader% }<fc=#8888ff>%time%</fc>{ %cpu% <fc=#404040>│</fc> %KBDU% <fc=#404040>│</fc> <fc=#8888ff>%uname%</fc> <fc=#404040>│ </fc>%bat% " - , commands = [ - Run Battery [ "--template" , "<fn=1><acstatus></fn>" - , "--Low" , "10" -- units: % - , "--High" , "80" -- units: % - , "--low" , "darkred" - , "--normal" , "darkorange" - , "--high" , "darkgreen" - - , "--" -- battery specific options - -- discharging status - , "-o" , " (<left>%, <timeleft>)" - -- AC "on" status - , "-O" , "<fc=#dA20A5> (<left>%)</fc>" - -- charged status - , "-i" , "<fc=#006000></fc>" - ] 50, - Run StdinReader, - Run Date "%H:%M:%S" "time" 10, - Run Date "%m/%d" "date" 10, - Run Cpu ["-t", "<total>%", "-L","3","-H","50","--normal","green","--high","red"] 10, - Run WeatherX "KBDU" - [ ("clear", "<fc=#ddcf04>") - , ("sunny", "<fc=#ddcf04>") - , ("mostly clear", "<fc=#ddcf04>") - , ("mostly sunny", "<fc=#ddcf04>") - , ("partly sunny", "<fc=#ddcf04>") - , ("fair", "<fc=#a0a0a0>🌑") - , ("cloudy","<fc=#a0a0a0>摒") - , ("overcast","<fc=#808080>") - , ("partly cloudy", "<fc=#a0a0a0>杖") - , ("mostly cloudy", "<fc=#808080>") - , ("considerable cloudiness", "<fc=#a0a0a0>ﭽ")] - ["--template", "<skyConditionS></fc><fc=#8888ff> <tempF>°F</fc>"] 360000, - Run Com "uname" ["-r"] "uname" 0, - Run Com ".xmonad/xmobar-battery" [] "bat" 20 - ] - } -- cgit From 62bccd284a4ae1c6c6c324112df8c6c14dc26ac9 Mon Sep 17 00:00:00 2001 From: Josh Rahm <joshuarahm@gmail.com> Date: Tue, 2 Nov 2021 21:58:50 -0600 Subject: Synchronize with the look on photon --- extras/HOME/.config/compton.conf | 10 +++++----- extras/HOME/.xmobarrc | 22 ++++++++++++++++------ extras/HOME/.xmonad/startup | 7 ++++--- extras/HOME/.xmonad/xmobar-bluetooth | 2 +- extras/HOME/.xmonad/xmobar-logo | 2 +- src/Internal/Layout.hs | 4 +++- src/Main.hs | 2 +- xmobar/extras/battery/battery.c | 2 +- 8 files changed, 32 insertions(+), 19 deletions(-) diff --git a/extras/HOME/.config/compton.conf b/extras/HOME/.config/compton.conf index 2728ce1..828d949 100644 --- a/extras/HOME/.config/compton.conf +++ b/extras/HOME/.config/compton.conf @@ -5,9 +5,9 @@ shadow = true; no-dnd-shadow = true; # no-dock-shadow = true; # clear-shadow = true; -shadow-radius = 7; -shadow-offset-x = -10; -shadow-offset-y = -5; +shadow-radius = 10; +shadow-offset-x = -3; +shadow-offset-y = -3; shadow-opacity = 0.8; shadow-red = 0.0; shadow-green = 0.0; @@ -33,14 +33,14 @@ shadow-exclude = [ ]; shadow-ignore-shaped = false; -blur-background = false; +blur-background = true; wintypes: { tooltip = { fade = true; - shadow = false; + shadow = true; opacity = 0.85; focus = true; } diff --git a/extras/HOME/.xmobarrc b/extras/HOME/.xmobarrc index ecf53ed..fc85d91 100644 --- a/extras/HOME/.xmobarrc +++ b/extras/HOME/.xmobarrc @@ -30,21 +30,29 @@ Config " %logo% <fc=#a0a0a0><fn=3>%uname%</fn></fc><fc=#404040> │\ \</fc><fc=#a0a0a0> %date%</fc><fc=#404040> │ \ \</fc>%StdinReader%}<fn=1><fc=#8888ff>%time%</fc></fn>\ - \{ %cpu% <fc=#404040>\ + \{ %cpu% %memory% <fc=#404040>\ \│</fc> %KLMO% <fc=#404040>│\ \</fc> <fc=#a0a0a0>%mpris2%</fc> <fc=#404040>│ \ \</fc>%bluetooth%%bat% " , commands = [ Run StdinReader, - Run Memory ["-t", "<usedbar>"] 10, Run Date "%H:%M:%S" "time" 10, Run Date "<fn=3>%m/%d</fn>" "date" 10, Run Cpu [ - "-t", "<fn=3><fc=#000000><bar></fc></fn>", + "-t", "<fn=3><fc=#000000><bar></fc></fn>", + "-L", "3", + "-H", "50", + "-b", "-", + "-f", "-", + "--normal", "green", + "--high", "red" + ] 10, + Run Memory [ + "-t", "<fn=3><fc=#000000><usedbar></fc></fn>", "-L", "3", "-H", "50", - "-b", "─", - "-f", "─", + "-b", "-", + "-f", "-", "--normal", "green", "--high", "red" ] 10, @@ -62,7 +70,9 @@ Config , ("considerable cloudiness", "<fc=#a0a0a0>ﭽ")] ["--template", "<skyConditionS></fc><fn=3><fc=#a0a0a0> \ \<tempF>°F</fc></fn>"] 360000, - Run Mpris2 "spotify" ["-t", "<fc=#1aa54b></fc> <fn=3><title></fn>"] 20, + Run Mpris2 "spotify" [ + "-t", "<fc=#1aa54b></fc> <fn=3><title></fn>", + "--nastring", "<fc=#404040> </fc>"] 20, Run Com ".xmonad/xmobar-logo" [] "logo" 0, Run Com "uname" ["-r"] "uname" 0, Run Com ".xmonad/xmobar-bluetooth" [] "bluetooth" 50, diff --git a/extras/HOME/.xmonad/startup b/extras/HOME/.xmonad/startup index dc302b7..25df7d1 100755 --- a/extras/HOME/.xmonad/startup +++ b/extras/HOME/.xmonad/startup @@ -24,14 +24,15 @@ hostname_photon() { if [ -z "$(ps aux | grep compton | grep -v grep)" ] ; then __GL_SYNC_TO_VBLANK=1 nohup compton --backend=glx &>/dev/null & fi - xrandr --output DVI-I-1 --right-of DP-5 --mode 2560x1440 - feh --bg-scale "/home/rahm/.xmonad/wallpaper.jpg" + # xrandr --output DVI-I-1 --right-of DP-5 --mode 2560x1440 + feh --bg-scale "/usr/share/backgrounds/archlinux/mountain.jpg" } common -hostname_fn="hostname_$(hostname)" +xrdb "$HOME/.Xresources" +hostname_fn="hostname_$(cat /etc/hostname)" if [[ "$(type -t "$hostname_fn")" == function ]] ; then "$hostname_fn" diff --git a/extras/HOME/.xmonad/xmobar-bluetooth b/extras/HOME/.xmonad/xmobar-bluetooth index 93caa50..3024cfe 100755 --- a/extras/HOME/.xmonad/xmobar-bluetooth +++ b/extras/HOME/.xmonad/xmobar-bluetooth @@ -15,4 +15,4 @@ bluetoothctl -- info | while read line ; do fi done -exec echo "<fc=#a0a0a0></fc> <fc=#404040>│</fc>" +exec echo "<fc=#a0a0a0></fc> <fc=#404040>│</fc> " diff --git a/extras/HOME/.xmonad/xmobar-logo b/extras/HOME/.xmonad/xmobar-logo index 848ebd2..bf48047 100755 --- a/extras/HOME/.xmonad/xmobar-logo +++ b/extras/HOME/.xmonad/xmobar-logo @@ -1,7 +1,7 @@ #!/bin/bash case "$(uname -a)" in - *-arch-*) exec echo '<fn=5><fc=#1785bd></fc></fn>' ;; + *-arch*) exec echo '<fn=5><fc=#1785bd></fc></fn>' ;; *Debian*) exec echo '<fn=5><fc=#c00649></fc></fn>' ;; *Ubuntu*) exec echo '<fn=5><fc=#ff8888></fc></fn>' ;; *Linux*) exec echo '<fn=5><fc=#ffffff></fc></fn>' ;; diff --git a/src/Internal/Layout.hs b/src/Internal/Layout.hs index c54ffa7..2339cca 100644 --- a/src/Internal/Layout.hs +++ b/src/Internal/Layout.hs @@ -10,6 +10,7 @@ import Data.List import XMonad.Layout.Spiral import XMonad.Layout.ThreeColumns import XMonad.Layout.Grid +import XMonad.Layout.Dishes import XMonad.Layout import XMonad.Layout.LayoutModifier import XMonad @@ -24,7 +25,8 @@ myLayout = Tall 1 (3/100) (1/2) ||| ThreeCol 1 (3/100) (1/2) ||| Full ||| - Grid + Grid ||| + Dishes 2 (1/6) data ResizeZoom = ShrinkZoom | ExpandZoom deriving (Typeable) diff --git a/src/Main.hs b/src/Main.hs index 85d18c7..28d50ad 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -81,7 +81,7 @@ main = do parseOut :: String -> String parseOut str = let colors = ["#ff878f", "#e187ff", "#8f87ff", "#87fff7", "#8bff87", "#ffe987", "#ff8787"] - components = zip (cycle colors) (splitOnAll [" - ", " · ", " "] str) + components = zip (cycle colors) (splitOnAll [" - ", " | ", " · ", " "] str) in concatMap (\(color, str) -> printf "<fc=%s>%s</fc> " color str) components diff --git a/xmobar/extras/battery/battery.c b/xmobar/extras/battery/battery.c index 791bc69..55deb17 100644 --- a/xmobar/extras/battery/battery.c +++ b/xmobar/extras/battery/battery.c @@ -251,6 +251,6 @@ int main(int argc, char** argv) return 0; fail: - printf(""); + printf("<fc=#404040>%s</fc> ", icons[11]); return 0; } -- cgit From 4db7274561b8dd6444e6b93c483479423450c6e6 Mon Sep 17 00:00:00 2001 From: Josh Rahm <joshuarahm@gmail.com> Date: Tue, 2 Nov 2021 23:20:35 -0600 Subject: Rework keys Finally removed the buggy hjkl navigation in favor of a more traditional key bindings: - h,l move between windows like Tab and S-Tab - j,k adjust the master window size Added ability to swap current window with a marked window using S-'-<mark>. --- src/Internal/Keys.hs | 44 ++++++++++++++++++++++++-------------- src/Internal/Marking.hs | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 16 deletions(-) diff --git a/src/Internal/Keys.hs b/src/Internal/Keys.hs index 3dff864..0b7b1c3 100644 --- a/src/Internal/Keys.hs +++ b/src/Internal/Keys.hs @@ -42,8 +42,7 @@ applyKeys config@(XConfig {modMask = modm}) = withNewMarkContext $ \markContext -> do ks <- newKeys markContext ms <- newMouse markContext - withWindowNavigation (xK_k, xK_h, xK_j, xK_l) $ - config { keys = ks, mouseBindings = ms } + return $ config { keys = ks, mouseBindings = ms } newMouse :: MarkContext -> IO (XConfig l -> Map (KeyMask, Button) (Window -> X ())) newMouse markContext = @@ -74,28 +73,41 @@ newKeys :: MarkContext -> IO (KeyMap l) newKeys markContext = return $ \config@(XConfig {modMask = modm}) -> Map.fromList - [ ((modm, xK_F12), (void $ spawn "spotify-control next")) - , ((modm, xK_F11), (void $ spawn "spotify-control prev")) - , ((modm, xK_semicolon), scratchpadSpawnActionTerminal "scratchpad") - , ((modm, xK_F10), (void $ spawn "spotify-control play")) - , ((modm, xK_r), runDMenu) - , ((modm, xK_c), runPassMenu) + [ ((modm, xK_F12), (void $ spawn "spotify-control next")) + , ((modm, xK_F11), (void $ spawn "spotify-control prev")) + , ((modm, xK_semicolon), scratchpadSpawnActionTerminal "scratchpad") + , ((modm, xK_F10), (void $ spawn "spotify-control play")) + , ((modm, xK_r), runDMenu) + , ((modm, xK_c), runPassMenu) + , ((modm, xK_h), windows W.focusDown) + , ((modm, xK_l), windows W.focusUp) + , ((modm .|. shiftMask, xK_h), windows W.swapUp) + , ((modm .|. shiftMask, xK_l), windows W.swapDown) + , ((modm , xK_Return), windows W.swapMaster) + , ((modm, xK_j), sendMessage Shrink) + , ((modm, xK_k), sendMessage Expand) , ((modm .|. shiftMask, xK_r), (void $ spawn "gmrun")) - , ((modm .|. mod1Mask, xK_l), (void $ spawn "xsecurelock")) - , ((modm .|. mod1Mask, xK_s), (void $ spawn "sudo systemctl suspend && xsecurelock")) + , ((modm .|. mod1Mask, xK_l), (void $ spawn "xsecurelock")) + , ((modm .|. mod1Mask, xK_s), (void $ spawn "sudo systemctl suspend && xsecurelock")) , ((modm .|. shiftMask, xK_c), kill) , ((modm .|. shiftMask, xK_t), withFocused $ windows . W.sink) - , ((mod4Mask, xK_BackSpace), (void $ spawn "xterm")) - , ((mod3Mask, xK_BackSpace), (void $ spawn "pkill -SIGUSR1 xmobar")) - , ((mod3Mask, xK_t), (void $ spawn (terminal config))) - , ((modm, xK_m), (submap $ mapAlpha modm (markCurrentWindow markContext))) - , ((modm, xK_w), runXPlus markContext config windowJump) - , ((modm, xK_apostrophe), (submap $ + , ((mod4Mask, xK_BackSpace), (void $ spawn "xterm")) + , ((modm, xK_BackSpace), (void $ spawn "pkill -SIGUSR1 xmobar")) + , ((modm, xK_t), (void $ spawn (terminal config))) + , ((modm, xK_m), (submap $ mapAlpha modm (markCurrentWindow markContext))) + , ((modm, xK_w), runXPlus markContext config windowJump) + , ((modm, xK_apostrophe), (submap $ Map.insert (modm, xK_apostrophe) (jumpToLast markContext) (mapAlpha modm (jumpToMark markContext)))) + , ((modm .|. shiftMask, xK_apostrophe), (submap $ + Map.insert + (modm .|. shiftMask, xK_apostrophe) + (swapWithLastMark markContext) + (mapAlpha (modm .|. shiftMask) (swapWithMark markContext)))) + , ((modm, xK_g), (submap $ mapNumbersAndAlpha 0 ( runXPlus markContext config . gotoWorkspace))) diff --git a/src/Internal/Marking.hs b/src/Internal/Marking.hs index e5cf696..606b55e 100644 --- a/src/Internal/Marking.hs +++ b/src/Internal/Marking.hs @@ -2,6 +2,7 @@ module Internal.Marking where import XMonad +import XMonad.StackSet hiding (focus) import Data.IORef import Data.Map (Map) @@ -77,3 +78,58 @@ jumpToMark ctx@(MarkContext ioref) mark = do focus w saveMarkState =<< liftIO (readIORef ioref) + +mapWindows :: (Ord a, Ord b) => (a -> b) -> StackSet i l a s sd -> StackSet i l b s sd +mapWindows fn (StackSet cur vis hid float) = + StackSet + (mapWindowsScreen cur) + (map mapWindowsScreen vis) + (map mapWindowsWorkspace hid) + (Map.mapKeys fn float) + where + mapWindowsScreen (Screen work a b) = Screen (mapWindowsWorkspace work) a b + mapWindowsWorkspace (Workspace t l stack) = + Workspace t l (fmap (mapStack fn) stack) + +-- | What genius decided to hide the instances for the Stack type!!??? +mapStack :: (a -> b) -> Stack a -> Stack b +mapStack fn (Stack focus up down) = Stack (fn focus) (map fn up) (map fn down) + +setFocusedWindow :: a -> StackSet i l a s sd -> StackSet i l a s sd +setFocusedWindow + window + (StackSet (Screen (Workspace t l stack) a b) vis hid float) = + let newStack = + case stack of + Nothing -> Nothing + Just (Stack _ up down) -> Just (Stack window up down) in + (StackSet (Screen (Workspace t l newStack) a b) vis hid float) + +swapWithFocused :: (Ord a) => a -> StackSet i l a s sd -> StackSet i l a s sd +swapWithFocused winToSwap stackSet = + case peek stackSet of + Nothing -> stackSet + Just focused -> do + setFocusedWindow winToSwap $ + mapWindows ( + \w -> if w == winToSwap then focused else w) stackSet + +swapWithLastMark :: MarkContext -> X () +swapWithLastMark ctx@(MarkContext ioref) = do + MarkState {markStateMap = m} <- liftIO $ readIORef ioref + m <- markLast <$> (liftIO $ readIORef ioref) + saveLastMark ctx + + case m of + Nothing -> return () + Just win -> windows $ swapWithFocused win + +swapWithMark :: MarkContext -> Mark -> X () +swapWithMark ctx@(MarkContext ioref) mark = do + MarkState {markStateMap = m} <- liftIO $ readIORef ioref + saveLastMark ctx + + case Map.lookup mark m of + Nothing -> return () + Just winToSwap -> + windows $ swapWithFocused winToSwap -- cgit From 6f76e166bb2572ade759291f308460f78e8af12f Mon Sep 17 00:00:00 2001 From: Josh Rahm <joshuarahm@gmail.com> Date: Tue, 2 Nov 2021 23:49:25 -0600 Subject: Add ability to flip the layout with mod-f. --- src/Internal/Keys.hs | 43 ++++++++++++++++++++++--------------------- src/Internal/Layout.hs | 43 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 28 deletions(-) diff --git a/src/Internal/Keys.hs b/src/Internal/Keys.hs index 0b7b1