From e019e80eac1b03a5c177ef5d358b720bdbc774ac Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Sun, 5 Dec 2021 16:56:41 +0100 Subject: gkleen@sif: taffybar --- accounts/gkleen@sif/default.nix | 16 ++- accounts/gkleen@sif/systemd.nix | 47 ++++--- accounts/gkleen@sif/taffybar/default.nix | 2 + .../gkleen@sif/taffybar/gkleen-sif-taffybar.cabal | 31 +++++ .../taffybar/src/System/Taffybar/Widget/Clock.hs | 111 ++++++++++++++++ .../src/System/Taffybar/Widget/TooltipBattery.hs | 101 ++++++++++++++ accounts/gkleen@sif/taffybar/src/taffybar.hs | 83 ++++++++++++ accounts/gkleen@sif/taffybar/taffybar.css | 146 +++++++++++++++++++++ accounts/gkleen@sif/xmobar/default.nix | 7 - accounts/gkleen@sif/xmobar/nixpkgs.nix | 9 -- accounts/gkleen@sif/xmobar/package.yaml | 13 -- accounts/gkleen@sif/xmobar/shell.nix | 28 ---- accounts/gkleen@sif/xmobar/stack.nix | 17 --- accounts/gkleen@sif/xmobar/stack.yaml | 10 -- accounts/gkleen@sif/xmobar/stack.yaml.lock | 12 -- accounts/gkleen@sif/xmobar/stackage.nix | 31 ----- accounts/gkleen@sif/xmobar/xmobar-yggdrasil.nix | 13 -- accounts/gkleen@sif/xmobar/xmobar.hs | 54 -------- accounts/gkleen@sif/xmonad/package.yaml | 1 + accounts/gkleen@sif/xmonad/xmonad-yggdrasil.nix | 4 +- accounts/gkleen@sif/xmonad/xmonad.hs | 57 ++++---- 21 files changed, 547 insertions(+), 246 deletions(-) create mode 100644 accounts/gkleen@sif/taffybar/default.nix create mode 100644 accounts/gkleen@sif/taffybar/gkleen-sif-taffybar.cabal create mode 100644 accounts/gkleen@sif/taffybar/src/System/Taffybar/Widget/Clock.hs create mode 100644 accounts/gkleen@sif/taffybar/src/System/Taffybar/Widget/TooltipBattery.hs create mode 100644 accounts/gkleen@sif/taffybar/src/taffybar.hs create mode 100644 accounts/gkleen@sif/taffybar/taffybar.css delete mode 100644 accounts/gkleen@sif/xmobar/default.nix delete mode 100644 accounts/gkleen@sif/xmobar/nixpkgs.nix delete mode 100644 accounts/gkleen@sif/xmobar/package.yaml delete mode 100644 accounts/gkleen@sif/xmobar/shell.nix delete mode 100644 accounts/gkleen@sif/xmobar/stack.nix delete mode 100644 accounts/gkleen@sif/xmobar/stack.yaml delete mode 100644 accounts/gkleen@sif/xmobar/stack.yaml.lock delete mode 100644 accounts/gkleen@sif/xmobar/stackage.nix delete mode 100644 accounts/gkleen@sif/xmobar/xmobar-yggdrasil.nix delete mode 100644 accounts/gkleen@sif/xmobar/xmobar.hs (limited to 'accounts') diff --git a/accounts/gkleen@sif/default.nix b/accounts/gkleen@sif/default.nix index 55cb1743..e94c0e8c 100644 --- a/accounts/gkleen@sif/default.nix +++ b/accounts/gkleen@sif/default.nix @@ -178,6 +178,11 @@ in { grab ''; }; + taffybar = { + enable = true; + package = import ./taffybar { inherit (pkgs) haskellPackages; }; + }; + status-notifier-watcher.enable = true; pasystray.enable = true; udiskie = { enable = true; @@ -255,14 +260,15 @@ in { home = { packages = with pkgs; [ - fira-code powerline-fonts nerdfonts pavucontrol keepassxc + fira fira-code powerline-fonts nerdfonts pavucontrol keepassxc sxiv xclip mumble pulseaudio-ctl libnotify synergy xorg.xbacklight screen-message pidgin-with-plugins google-play-music-desktop-player qt5ct playerctl evince - thunderbird wrappedZulip zoom-us steam steam-run wireshark skype - virt-manager rclone cached-nix-shell xournal discord xmonad - worktime fira-code-symbols emacsclientDesktopItem libreoffice - xournalpp wrappedChrome nixos-shell virt-viewer freerdp + thunderbird wrappedZulip zoom-us steam steam-run wireshark + skype virt-manager rclone cached-nix-shell xournal discord + xmonad worktime fira-code-symbols emacsclientDesktopItem + libreoffice xournalpp wrappedChrome nixos-shell virt-viewer + freerdp ]; file = { diff --git a/accounts/gkleen@sif/systemd.nix b/accounts/gkleen@sif/systemd.nix index 7faef31a..56965b74 100644 --- a/accounts/gkleen@sif/systemd.nix +++ b/accounts/gkleen@sif/systemd.nix @@ -16,28 +16,33 @@ in { After = ["graphical-session-pre.target"]; }; }; - trayer = { - Service = { - Type = "simple"; - WorkingDirectory = "~"; - ExecStart = "${pkgs.trayer}/bin/trayer --edge top --align right --SetDockType true --SetPartialStrut true --expand true --width 8 --tint 0x000000 --alpha 0 --transparent true --height 32 --monitor primary"; - Restart = "always"; - }; - Install = { - WantedBy = ["graphical-session.target"]; - }; - }; - xmobar = { - Service = { - Type = "simple"; - WorkingDirectory = "~"; - ExecStart = "${xmobar}/bin/xmobar"; - Restart = "always"; - Environment = "PATH=${pkgs.worktime}/bin:${pkgs.openssh}/bin"; + # trayer = { + # Service = { + # Type = "simple"; + # WorkingDirectory = "~"; + # ExecStart = "${pkgs.trayer}/bin/trayer --edge top --align right --SetDockType true --SetPartialStrut true --expand true --width 8 --tint 0x000000 --alpha 0 --transparent true --height 32 --monitor primary"; + # Restart = "always"; + # }; + # Install = { + # WantedBy = ["graphical-session.target"]; + # }; + # }; + # xmobar = { + # Service = { + # Type = "simple"; + # WorkingDirectory = "~"; + # ExecStart = "${xmobar}/bin/xmobar"; + # Restart = "always"; + # Environment = "PATH=${pkgs.worktime}/bin:${pkgs.openssh}/bin"; - }; - Install = { - WantedBy = ["graphical-session.target"]; + # }; + # Install = { + # WantedBy = ["graphical-session.target"]; + # }; + # }; + taffybar = { + Service = { + Environment = with pkgs; "PATH=${worktime}/bin:${systemd}/bin"; }; }; dunst = { diff --git a/accounts/gkleen@sif/taffybar/default.nix b/accounts/gkleen@sif/taffybar/default.nix new file mode 100644 index 00000000..98366d8f --- /dev/null +++ b/accounts/gkleen@sif/taffybar/default.nix @@ -0,0 +1,2 @@ +{ haskellPackages ? (import {}).haskellPackages }: +haskellPackages.callCabal2nix "gkleen-sif-taffybar" ./. {} diff --git a/accounts/gkleen@sif/taffybar/gkleen-sif-taffybar.cabal b/accounts/gkleen@sif/taffybar/gkleen-sif-taffybar.cabal new file mode 100644 index 00000000..7f56dece --- /dev/null +++ b/accounts/gkleen@sif/taffybar/gkleen-sif-taffybar.cabal @@ -0,0 +1,31 @@ +name: gkleen-sif-taffybar +version: 0.0.0 +build-type: Simple +cabal-version: >=1.10 + +data-files: taffybar.css + +executable taffybar + hs-source-dirs: src + main-is: taffybar.hs + ghc-options: -threaded -rtsopts -with-rtsopts=-N -O2 -Wall + build-depends: base + , containers + , directory + , filepath + , gtk3 + , taffybar + , X11>=1.8 + , transformers + , gi-gtk + , time, time-locale-compat + , text + , HStringTemplate + , gtk-sni-tray + other-modules: Paths_gkleen_sif_taffybar + , System.Taffybar.Widget.Clock + , System.Taffybar.Widget.TooltipBattery + default-language: Haskell2010 + default-extensions: ScopedTypeVariables + , LambdaCase + , NamedFieldPuns \ No newline at end of file diff --git a/accounts/gkleen@sif/taffybar/src/System/Taffybar/Widget/Clock.hs b/accounts/gkleen@sif/taffybar/src/System/Taffybar/Widget/Clock.hs new file mode 100644 index 00000000..e8dc480f --- /dev/null +++ b/accounts/gkleen@sif/taffybar/src/System/Taffybar/Widget/Clock.hs @@ -0,0 +1,111 @@ +{-# LANGUAGE OverloadedStrings #-} +module System.Taffybar.Widget.Clock + ( textClockNew + , textClockNewWith + , defaultClockConfig + , ClockConfig(..) + , ClockUpdateStrategy(..) + ) where + +import Control.Monad.IO.Class +import Data.Maybe +import qualified Data.Text as T +import qualified Data.Time.Clock as Clock +import Data.Time.Format +import Data.Time.LocalTime +import qualified Data.Time.Locale.Compat as L +import GI.Gtk +import System.Taffybar.Widget.Generic.PollingLabel + +type ClockFormat = L.TimeLocale -> ZonedTime -> T.Text + +-- | Create the widget. I recommend passing @Nothing@ for the TimeLocale +-- parameter. The format string can include Pango markup +-- (). +textClockNew :: + MonadIO m => Maybe L.TimeLocale -> ClockFormat -> Double -> m GI.Gtk.Widget +textClockNew userLocale format interval = + textClockNewWith cfg + where + cfg = defaultClockConfig { clockTimeLocale = userLocale + , clockFormat = format + , clockUpdateStrategy = ConstantInterval interval + } + +data ClockUpdateStrategy + = ConstantInterval Double + | RoundedTargetInterval Int Double + deriving (Eq, Ord, Show) + +data ClockConfig = ClockConfig + { clockTimeZone :: Maybe TimeZone + , clockTimeLocale :: Maybe L.TimeLocale + , clockFormat :: ClockFormat + , clockUpdateStrategy :: ClockUpdateStrategy + } + +-- | A clock configuration that defaults to the current locale +defaultClockConfig :: ClockConfig +defaultClockConfig = ClockConfig + { clockTimeZone = Nothing + , clockTimeLocale = Nothing + , clockFormat = \locale zonedTime -> T.pack $ formatTime locale "%a %b %_d %r" zonedTime + , clockUpdateStrategy = RoundedTargetInterval 5 0.0 + } + +systemGetTZ :: IO TimeZone +systemGetTZ = getCurrentTimeZone + +-- | A configurable text-based clock widget. It currently allows for +-- a configurable time zone through the 'ClockConfig'. +-- +-- See also 'textClockNew'. +textClockNewWith :: MonadIO m => ClockConfig -> m Widget +textClockNewWith ClockConfig + { clockTimeZone = userZone + , clockTimeLocale = userLocale + , clockFormat = format + , clockUpdateStrategy = updateStrategy + } = liftIO $ do + let getTZ = maybe systemGetTZ return userZone + locale = fromMaybe L.defaultTimeLocale userLocale + + let getUserZonedTime = + utcToZonedTime <$> getTZ <*> Clock.getCurrentTime + + doTimeFormat = format locale + + getRoundedTimeAndNextTarget = do + zonedTime <- getUserZonedTime + return $ case updateStrategy of + ConstantInterval interval -> + (doTimeFormat zonedTime, Nothing, interval) + RoundedTargetInterval roundSeconds offset -> + let roundSecondsDiffTime = fromIntegral roundSeconds + addTheRound = addLocalTime roundSecondsDiffTime + localTime = zonedTimeToLocalTime zonedTime + ourLocalTimeOfDay = localTimeOfDay localTime + seconds = round $ todSec ourLocalTimeOfDay + secondsFactor = seconds `div` roundSeconds + displaySeconds = secondsFactor * roundSeconds + baseLocalTimeOfDay = + ourLocalTimeOfDay { todSec = fromIntegral displaySeconds } + ourLocalTime = + localTime { localTimeOfDay = baseLocalTimeOfDay } + roundedLocalTime = + if seconds `mod` roundSeconds > roundSeconds `div` 2 + then addTheRound ourLocalTime + else ourLocalTime + roundedZonedTime = + zonedTime { zonedTimeToLocalTime = roundedLocalTime } + nextTarget = addTheRound ourLocalTime + amountToWait = realToFrac $ diffLocalTime nextTarget localTime + in (doTimeFormat roundedZonedTime, Nothing, amountToWait - offset) + + label <- pollingLabelWithVariableDelay getRoundedTimeAndNextTarget + ebox <- eventBoxNew + containerAdd ebox label + eventBoxSetVisibleWindow ebox False + widgetShowAll ebox + toWidget ebox + diff --git a/accounts/gkleen@sif/taffybar/src/System/Taffybar/Widget/TooltipBattery.hs b/accounts/gkleen@sif/taffybar/src/System/Taffybar/Widget/TooltipBattery.hs new file mode 100644 index 00000000..9dc52774 --- /dev/null +++ b/accounts/gkleen@sif/taffybar/src/System/Taffybar/Widget/TooltipBattery.hs @@ -0,0 +1,101 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} +module System.Taffybar.Widget.TooltipBattery ( batteryIconTooltipNew ) where + +import Control.Applicative +import Control.Monad +import Control.Monad.IO.Class +import Control.Monad.Trans.Reader +import Data.Int (Int64) +import qualified Data.Text as T +import GI.Gtk +import Prelude +import StatusNotifier.Tray (scalePixbufToSize) +import System.Taffybar.Context +import System.Taffybar.Information.Battery +import System.Taffybar.Util +import System.Taffybar.Widget.Generic.AutoSizeImage +import System.Taffybar.Widget.Generic.ChannelWidget +import Text.Printf +import Text.StringTemplate +import Data.Function ((&)) + +-- | Just the battery info that will be used for display (this makes combining +-- several easier). +data BatteryWidgetInfo = BWI + { seconds :: Maybe Int64 + , percent :: Double + , status :: String + , rate :: Maybe Double + } deriving (Eq, Show) + +-- | Format a duration expressed as seconds to hours and minutes +formatDuration :: Int64 -> String +formatDuration secs = let minutes, hours, minutes' :: Int64 + minutes = secs `div` 60 + (hours, minutes') = minutes `divMod` 60 + in printf "%02d:%02d" hours minutes' + +getBatteryWidgetInfo :: BatteryInfo -> BatteryWidgetInfo +getBatteryWidgetInfo info = + let battPctNum :: Double + battPctNum = batteryPercentage info + battTime :: Maybe Int64 + battTime = + case batteryState info of + BatteryStateCharging -> Just $ batteryTimeToFull info + BatteryStateDischarging -> Just $ batteryTimeToEmpty info + _ -> Nothing + battStatus :: String + battStatus = + case batteryState info of + BatteryStateCharging -> "↑" + BatteryStateDischarging -> "↓" + BatteryStateEmpty -> "⤓" + BatteryStateFullyCharged -> "⤒" + _ -> "?" + battRate :: Maybe Double + battRate | rawRate < 0.1 = Nothing + | otherwise = Just rawRate + where rawRate = batteryEnergyRate info + in BWI{ seconds = battTime, percent = battPctNum, status = battStatus, rate = battRate } + +-- | Given (maybe summarized) battery info and format: provides the string to display +formatBattInfo :: BatteryWidgetInfo -> String -> T.Text +formatBattInfo info fmt = + let tpl = newSTMP fmt + tpl' = tpl + & setManyAttrib [ ("percentage", printf "%.0f" $ percent info) + , ("status", status info) + ] + & setManyAttrib [ ("time", formatDuration <$> seconds info) + , ("rate", printf "%.0f" <$> rate info) + ] + in render tpl' + +themeLoadFlags :: [IconLookupFlags] +themeLoadFlags = [IconLookupFlagsGenericFallback, IconLookupFlagsUseBuiltin] + +batteryIconTooltipNew :: String -> TaffyIO Widget +batteryIconTooltipNew format = do + DisplayBatteryChanVar (chan, _) <- setupDisplayBatteryChanVar ["IconName", "State", "Percentage", "TimeToFull", "TimeToEmpty", "EnergyRate"] + ctx <- ask + liftIO $ do + image <- imageNew + styleCtx <- widgetGetStyleContext =<< toWidget image + defaultTheme <- iconThemeGetDefault + let getCurrentBatteryIconNameStringTooltip = do + info <- runReaderT getDisplayBatteryInfo ctx + let iconNameString = T.pack $ batteryIconName info + tooltip = formatBattInfo (getBatteryWidgetInfo info) format + return (iconNameString, tooltip) + extractPixbuf info = + fst <$> iconInfoLoadSymbolicForContext info styleCtx + setIconForSize size = do + (name, tooltip) <- getCurrentBatteryIconNameStringTooltip + widgetSetTooltipMarkup image $ Just tooltip + iconThemeLookupIcon defaultTheme name size themeLoadFlags >>= + traverse extractPixbuf >>= + traverse (scalePixbufToSize size OrientationHorizontal) + updateImage <- autoSizeImage image setIconForSize OrientationHorizontal + toWidget =<< channelWidgetNew image chan (const $ postGUIASync updateImage) diff --git a/accounts/gkleen@sif/taffybar/src/taffybar.hs b/accounts/gkleen@sif/taffybar/src/taffybar.hs new file mode 100644 index 00000000..dd713ea7 --- /dev/null +++ b/accounts/gkleen@sif/taffybar/src/taffybar.hs @@ -0,0 +1,83 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Main where + +import System.Taffybar (startTaffybar) +import System.Taffybar.Context (TaffybarConfig(..)) +import System.Taffybar.Hooks +import System.Taffybar.SimpleConfig hiding (SimpleTaffyConfig(cssPath)) +import System.Taffybar.Widget +import qualified System.Taffybar.Widget.Clock as MyClock +import System.Taffybar.Widget.TooltipBattery + +import Data.Time.Format +import Data.Time.LocalTime +import Data.Time.Calendar.WeekDate + +import qualified Data.Text as T + +import Control.Exception (SomeException, try) +import Control.Monad.Trans.Reader (mapReaderT) + +import Paths_gkleen_sif_taffybar + + +main :: IO () +main = do + myCssPath <- getDataFileName "taffybar.css" + startTaffybar exampleTaffybarConfig{ cssPath = Just myCssPath } + + +exampleTaffybarConfig :: TaffybarConfig +exampleTaffybarConfig = + let myWorkspacesConfig = + defaultWorkspacesConfig + { maxIcons = Just 0 + , widgetGap = 7 + , showWorkspaceFn = \case + -- Workspace{ workspaceState = Empty } -> False + Workspace{ workspaceName } | workspaceName == "NSP" -> False + _other -> True + , getWindowIconPixbuf = \i d -> either (\(_ :: SomeException) -> Nothing) id <$> mapReaderT try (defaultGetWindowIconPixbuf i d) + } + workspaces = workspacesNew myWorkspacesConfig + clock = MyClock.textClockNewWith MyClock.defaultClockConfig + { MyClock.clockUpdateStrategy = MyClock.RoundedTargetInterval 1 0.0 + , MyClock.clockFormat = \tl zt@ZonedTime{ zonedTimeToLocalTime = LocalTime{ localDay } } + -> let date = formatTime tl "%Y-%m-%d" localDay + weekdate = "W" <> show2 woy <> "-" <> show dow + where (_, woy, dow) = toWeekDate localDay + show2 :: Int -> String + show2 x = replicate (2 - length s) '0' ++ s + where s = show x + time = formatTime tl "%H:%M:%S%Ez" zt + in T.intercalate " " $ map T.pack [date, weekdate, time] + } + layout = layoutNew defaultLayoutConfig + windowsW = windowsNew defaultWindowsConfig + { getMenuLabel = truncatedGetMenuLabel 80 + , getActiveLabel = truncatedGetActiveLabel 80 + } + worktime = commandRunnerNew 150 "worktime" [] "worktime" + worktimeToday = commandRunnerNew 150 "worktime" ["today"] "worktime today" + -- See https://github.com/taffybar/gtk-sni-tray#statusnotifierwatcher + -- for a better way to set up the sni tray + -- tray = sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt + tray = sniTrayNew + myConfig = defaultSimpleTaffyConfig + { startWidgets = + workspaces : map (>>= buildContentsBox) [ layout, windowsW ] + , endWidgets = map (>>= buildContentsBox) $ reverse + -- , mpris2New + [ worktime, worktimeToday + , clock + , tray + , batteryIconTooltipNew "$status$ $percentage$%$if(time)$$if(rate)$ ($rate$W $time$)$else$ ($time$)$endif$$elseif(rate)$ ($rate$W)$endif$" + ] + , barPosition = Top + , barPadding = 2 + , barHeight = 28 + , widgetSpacing = 10 + } + in withBatteryRefresh $ withLogServer $ + withToggleServer $ toTaffyConfig myConfig diff --git a/accounts/gkleen@sif/taffybar/taffybar.css b/accounts/gkleen@sif/taffybar/taffybar.css new file mode 100644 index 00000000..7a297465 --- /dev/null +++ b/accounts/gkleen@sif/taffybar/taffybar.css @@ -0,0 +1,146 @@ +@define-color transparent rgba(0.0, 0.0, 0.0, 0.0); +@define-color white #808080; +@define-color gray #202020; +@define-color green #008000; +@define-color yellow #808000; +@define-color blue #000080; +@define-color red #800000; +@define-color black #000000; +/* @define-color taffy-blue #0c7cd5; */ +@define-color taffy-blue @blue; + +@define-color active-window-color @white; +@define-color urgent-window-color @taffy-blue; +@define-color font-color @white; +@define-color menu-background-color @black; +@define-color menu-font-color @white; + +/* Top level styling */ + +.taffy-window * { + /* + This removes any existing styling from UI elements. Taffybar will not + cohere with your gtk theme. + */ + all: unset; + + font-family: "Fira Sans", sans-serif; + font-size: 21px; + color: @font-color; +} + +.taffy-box { + /* border-radius: 10px; */ + background-color: @black; +} + +.inner-pad { + /* padding-bottom: 5px; */ + /* padding-top: 5px; */ + padding-left: 2px; + padding-right: 2px; +} + +.contents { + /* padding-bottom: 4px; */ + /* padding-top: 4px; */ + padding-right: 2px; + padding-left: 2px; + transition: background-color .5s; + border-radius: 5px; +} + +/* Workspaces styling */ + +.workspace-label { + padding-right: 3px; + padding-left: 2px; + font-size: 21px; +} + +.workspace-label.active { + color: @green; +} +.workspace-label.visible { + color: @yellow; +} +.workspace-label.empty { + color: @gray; +} +.workspace-label.urgent { + color: @red; +} + +.active .contents { + background-color: rgba(0.0, 0.0, 0.0, 0.5); +} + +.visible .contents { + background-color: rgba(0.0, 0.0, 0.0, 0.2); +} + +.window-icon-container { + transition: opacity .5s, box-shadow .5s; + opacity: 1; +} + +/* This gives space for the box-shadow (they look like underlines) that follow. + This will actually affect all widgets, (not just the workspace icons), but + that is what we want since we want the icons to look the same. */ +.auto-size-image, .sni-tray { + padding-top: 3px; + padding-bottom: 3px; +} + +.window-icon-container.active { + box-shadow: inset 0 -3px @white; +} + +.window-icon-container.urgent { + box-shadow: inset 0 -3px @urgent-window-color; +} + +.window-icon-container.inactive .window-icon { + padding: 0px; +} + +.window-icon-container.minimized .window-icon { + opacity: .3; +} + +.window-icon { + opacity: 1; + transition: opacity .5s; +} + +/* Button styling */ + +button { + background-color: @transparent; + border-width: 0px; + border-radius: 0px; +} + +button:checked, button:hover .Contents:hover { + box-shadow: inset 0 -3px @taffy-blue; +} + +/* Menu styling */ + +/* The ".taffy-window" prefixed selectors are needed because if they aren't present, + the top level .Taffybar selector takes precedence */ +.taffy-window menuitem *, menuitem * { + color: @menu-font-color; +} + +.taffy-window menuitem, menuitem { + background-color: @menu-background-color; +} + +.taffy-window menuitem:hover, menuitem:hover { + background-color: @taffy-blue; +} + +.taffy-window menuitem:hover > label, menuitem:hover > label { + color: @white; +} diff --git a/accounts/gkleen@sif/xmobar/default.nix b/accounts/gkleen@sif/xmobar/default.nix deleted file mode 100644 index fcac5e60..00000000 --- a/accounts/gkleen@sif/xmobar/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -argumentPackages@{ ... }: - -let - # defaultPackages = (import ./stackage.nix {}); - # haskellPackages = defaultPackages // argumentPackages; - haskellPackages = argumentPackages; -in haskellPackages.callPackage ./xmobar-yggdrasil.nix {} diff --git a/accounts/gkleen@sif/xmobar/nixpkgs.nix b/accounts/gkleen@sif/xmobar/nixpkgs.nix deleted file mode 100644 index 783ede00..00000000 --- a/accounts/gkleen@sif/xmobar/nixpkgs.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ nixpkgs ? import -}: - -import ((nixpkgs {}).fetchFromGitHub { - owner = "NixOS"; - repo = "nixpkgs"; - rev = "10e61bf5be57736035ec7a804cb0bf3d083bf2cf"; - sha256 = "0fplfm2zx4vk7gs8bdcxnvzkdmpx2w0llqwf8475z9dz9cl132rm"; -}) diff --git a/accounts/gkleen@sif/xmobar/package.yaml b/accounts/gkleen@sif/xmobar/package.yaml deleted file mode 100644 index b638b6ac..00000000 --- a/accounts/gkleen@sif/xmobar/package.yaml +++ /dev/null @@ -1,13 +0,0 @@ -name: xmobar-yggdrasil - -executables: - xmobar: - dependencies: - - base - - xmobar - - main: xmobar.hs - source-dirs: - - . - - ghc-options: -threaded diff --git a/accounts/gkleen@sif/xmobar/shell.nix b/accounts/gkleen@sif/xmobar/shell.nix deleted file mode 100644 index 16beb322..00000000 --- a/accounts/gkleen@sif/xmobar/shell.nix +++ /dev/null @@ -1,28 +0,0 @@ -{ nixpkgs ? import ./nixpkgs.nix {} }: - -let - inherit (nixpkgs {}) pkgs; - haskellPackages = import ./stackage.nix { inherit nixpkgs; }; - - drv = haskellPackages.callPackage ./xmobar-yggdrasil.nix {}; - override = oldAttrs: { - nativeBuildInputs = oldAttrs.nativeBuildInputs ++ (with pkgs; []) ++ (with haskellPackages; [ stack cabal-install cabal2nix ]); - shellHook = '' - export PROMPT_INFO="${oldAttrs.name}" - - if [ -n "$ZSH_VERSION" ]; then - autoload -U +X compinit && compinit - autoload -U +X bashcompinit && bashcompinit - fi - eval "$(stack --bash-completion-script stack)" - - ${oldAttrs.shellHook} - ''; - }; - - dummy = pkgs.stdenv.mkDerivation { - name = "interactive-xmobar-environment"; - shellHook = ""; - }; -in pkgs.lib.overrideDerivation dummy override - #pkgs.lib.overrideDerivation drv.env override diff --git a/accounts/gkleen@sif/xmobar/stack.nix b/accounts/gkleen@sif/xmobar/stack.nix deleted file mode 100644 index 17a49e04..00000000 --- a/accounts/gkleen@sif/xmobar/stack.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ ghc, nixpkgs ? import ./nixpkgs.nix {} }: - -let - haskellPackages = import ./stackage.nix { inherit nixpkgs; }; - inherit (nixpkgs {}) pkgs; -in pkgs.haskell.lib.buildStackProject { - inherit ghc; - inherit (haskellPackages) stack; - name = "stackenv"; - buildInputs = (with pkgs; - [ xorg.libX11 xorg.libXrandr xorg.libXinerama xorg.libXScrnSaver xorg.libXext xorg.libXft - cairo - glib - ]) ++ (with haskellPackages; - [ - ]); -} diff --git a/accounts/gkleen@sif/xmobar/stack.yaml b/accounts/gkleen@sif/xmobar/stack.yaml deleted file mode 100644 index b8ed1147..00000000 --- a/accounts/gkleen@sif/xmobar/stack.yaml +++ /dev/null @@ -1,10 +0,0 @@ -nix: - enable: true - shell-file: stack.nix - -resolver: lts-13.21 - -packages: - - . - -extra-deps: [] diff --git a/accounts/gkleen@sif/xmobar/stack.yaml.lock b/accounts/gkleen@sif/xmobar/stack.yaml.lock deleted file mode 100644 index fcc2f5f3..00000000 --- a/accounts/gkleen@sif/xmobar/stack.yaml.lock +++ /dev/null @@ -1,12 +0,0 @@ -# This file was autogenerated by Stack. -# You should not edit this file by hand. -# For more information, please see the documentation at: -# https://docs.haskellstack.org/en/stable/lock_files - -packages: [] -snapshots: -- completed: - size: 498180 - url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/13/21.yaml - sha256: eff2de19a6d4691ccbf6edc1fba858f1918683047dce0f09adede874bbd2a8f3 - original: lts-13.21 diff --git a/accounts/gkleen@sif/xmobar/stackage.nix b/accounts/gkleen@sif/xmobar/stackage.nix deleted file mode 100644 index c162ca2c..00000000 --- a/accounts/gkleen@sif/xmobar/stackage.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ nixpkgs ? import ./nixpkgs.nix {} -, snapshot ? "lts-13.21" -}: - -let - stackage = import (fetchTarball { - url = "https://stackage.serokell.io/zb36jsy3r5h4ydz0pnp00g9vk94dvv03-stackage/default.nix.tar.gz"; - sha256 = "0h6f80gds0ds77y51hhiadh2h2k8njqq8n0gayp729ana9m9agma"; - }); - - overlays = - [ stackage."${snapshot}" - (self: super: { - haskell = super.haskell // { - packages = super.haskell.packages // { - "${snapshot}" = super.haskell.packages."${snapshot}".override { - overrides = hself: hsuper: { - zip-archive = self.haskell.lib.overrideCabal hsuper.zip-archive (old: { - testToolDepends = old.testToolDepends ++ (with self; [ unzip which ]); - }); - alex = self.haskell.lib.dontCheck hsuper.alex; - }; - }; - }; - }; - } - ) - ]; - - inherit (nixpkgs { inherit overlays; }) pkgs; -in pkgs.haskell.packages."${snapshot}" diff --git a/accounts/gkleen@sif/xmobar/xmobar-yggdrasil.nix b/accounts/gkleen@sif/xmobar/xmobar-yggdrasil.nix deleted file mode 100644 index 852fb8e5..00000000 --- a/accounts/gkleen@sif/xmobar/xmobar-yggdrasil.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ mkDerivation, base, hpack, lib, xmobar }: -mkDerivation { - pname = "xmobar-yggdrasil"; - version = "0.0.0"; - src = ./.; - isLibrary = false; - isExecutable = true; - libraryToolDepends = [ hpack ]; - executableHaskellDepends = [ base xmobar ]; - preConfigure = "hpack"; - license = "unknown"; - hydraPlatforms = lib.platforms.none; -} diff --git a/accounts/gkleen@sif/xmobar/xmobar.hs b/accounts/gkleen@sif/xmobar/xmobar.hs deleted file mode 100644 index 322b4449..00000000 --- a/accounts/gkleen@sif/xmobar/xmobar.hs +++ /dev/null @@ -1,54 +0,0 @@ -import Xmobar - -import Data.List (intercalate) - - -main :: IO () -main = xmobar config - where - config = defaultConfig - { font = "xft:FiraCode Nerd Font Mono:style=Regular:pixelsize=21" - , position = OnScreen 0 $ TopP 0 307 - , bgColor = "black" - , fgColor = "#808080" - , overrideRedirect = False - , template = - let left = intercalate " | " - [ "%XMonadWorkspaces%" - , "%XMonadLayout%" - , "%XMonadTitle%" - ] - right = intercalate " | " - [ {- "%status%" - , -} "%battery%" - , "%kbd%" - , "%worktime%" - , "%worktime-today%" - , "%date%" - , "%weekdate%" - , "%time%" - ] - in left <> "}{" <> right - , commands = - [ Run $ NamedXPropertyLog "_XMONAD_WORKSPACES" "XMonadWorkspaces" - , Run $ NamedXPropertyLog "_XMONAD_LAYOUT" "XMonadLayout" - , Run $ NamedXPropertyLog "_XMONAD_TITLE" "XMonadTitle" - , Run $ Date "%Y-%m-%d" "date" 500 - , Run $ Date "W%V-%u" "weekdate" 500 - , Run $ Date "%H:%M:%S%Ez" "time" 2 - , Run $ Com "worktime" [] "worktime" 1500 - , Run $ Com "worktime" ["today"] "worktime-today" 1500 - , Run $ Com "ssh" ["status.odin"] "status" 600 - , Run $ Kbd [("us(dvp)", "dvp")] - , Run $ Battery - [ "--template", " () AC " - , "--suffix", "On" - , "--Low", "10" - , "--High", "80" - , "--low", "darkred" - , "--normal", "darkorange" - , "--high", "darkgreen" - , "-p", "3" - ] 50 - ] - } diff --git a/accounts/gkleen@sif/xmonad/package.yaml b/accounts/gkleen@sif/xmonad/package.yaml index 48de1a53..f65137af 100644 --- a/accounts/gkleen@sif/xmonad/package.yaml +++ b/accounts/gkleen@sif/xmonad/package.yaml @@ -23,6 +23,7 @@ executables: - containers - hostname - libnotify + - taffybar main: xmonad.hs source-dirs: diff --git a/accounts/gkleen@sif/xmonad/xmonad-yggdrasil.nix b/accounts/gkleen@sif/xmonad/xmonad-yggdrasil.nix index d3d72310..7c853619 100644 --- a/accounts/gkleen@sif/xmonad/xmonad-yggdrasil.nix +++ b/accounts/gkleen@sif/xmonad/xmonad-yggdrasil.nix @@ -1,7 +1,7 @@ { mkDerivation, aeson, base, bytestring, containers, directory , filepath, hostname, hpack, mtl, network, parsec, process, lib , temporary, transformers, unix, utf8-string, X11, xmonad -, xmonad-contrib, libnotify +, xmonad-contrib, libnotify, taffybar }: mkDerivation { pname = "xmonad-yggdrasil"; @@ -13,7 +13,7 @@ mkDerivation { executableHaskellDepends = [ aeson base bytestring containers directory filepath hostname mtl network parsec process temporary transformers unix utf8-string X11 - xmonad xmonad-contrib libnotify + xmonad xmonad-contrib libnotify taffybar ]; preConfigure = "hpack"; license = "unknown"; diff --git a/accounts/gkleen@sif/xmonad/xmonad.hs b/accounts/gkleen@sif/xmonad/xmonad.hs index aba245ff..c642a3a7 100644 --- a/accounts/gkleen@sif/xmonad/xmonad.hs +++ b/accounts/gkleen@sif/xmonad/xmonad.hs @@ -75,6 +75,8 @@ import qualified XMonad.Actions.PhysicalScreens as P import XMonad.Layout.IM +import System.Taffybar.Support.PagerHints (pagerHints) + import XMonad.Prompt.MyShell import XMonad.Prompt.MyPass import XMonad.Prompt.MySsh @@ -142,6 +144,12 @@ defaultHost = Host { hName = "unkown" browser :: String browser = "env MOZ_USE_XINPUT2=1 firefox" +gray, darkGray, red, green :: String +gray = "#808080" +darkGray = "#202020" +red = "#800000" +green = "#008000" + hostFromName :: HostName -> Host hostFromName h@("vali") = defaultHost { hName = h , hManageHook = composeOne $ catMaybes [ Just manageScratchTerm @@ -222,7 +230,7 @@ hostFromName h , hCoWsp = hCoWsp , hKeysMod = \conf -> Map.union $ (Map.fromList $ join $ map (spawnBindings conf) [ (xK_e, ["emacsclient -c"]) , (xK_d, [fromString browser, "google-chrome", "notmuch-links"]) - , (xK_c, [ inputPrompt xPConfig "dc" ?+ dc ]) + , (xK_c, [ inputPrompt xPConfigMonospace "dc" ?+ dc ]) , (xK_g, ["pidgin"]) , (xK_s, ["skype"]) -- , (xK_p, [mkPassPrompt "Type password" pwType xPConfig, mkPassPrompt "Show password" pwShow xPConfig, mkPassPrompt "Copy password" pwClip xPConfig]) @@ -240,10 +248,10 @@ hostFromName h , "emacsclient -c -F \"'(title . \\\"Mail\\\")\" -e \"(browse-url-mail \"$(xclip -o)\")\"" ]) , (xK_Return, ["keynav start,windowzoom", "keynav start"]) - , (xK_t, [inputPrompt xPConfig "fuzzytime timer" ?+ fuzzytime, fuzzytime "unset", work_fuzzytime]) - , (xK_a, [inputPrompt xPConfig "adjmix" ?+ adjmix]) - , (xK_s, [ inputPromptWithCompl xPConfig "start synergy" synergyCompl ?+ synergyStart - , inputPromptWithCompl xPConfig "stop synergy" synergyCompl ?+ synergyStop + , (xK_t, [inputPrompt xPConfigMonospace "fuzzytime timer" ?+ fuzzytime, fuzzytime "unset", work_fuzzytime]) + , (xK_a, [inputPrompt xPConfigMonospace "adjmix" ?+ adjmix]) + , (xK_s, [ inputPromptWithCompl xPConfigMonospace "start synergy" synergyCompl ?+ synergyStart + , inputPromptWithCompl xPConfigMonospace "stop synergy" synergyCompl ?+ synergyStop ]) , (xK_h, [ "alacritty --class htop -e htop" , "alacritty --class log -e journalctl -xef" @@ -447,14 +455,14 @@ tabbedTheme = def { activeColor = "black" , inactiveColor = "black" , urgentColor = "black" - , activeBorderColor = "grey" - , inactiveBorderColor = "#202020" - , urgentBorderColor = "#bb0000" - , activeTextColor = "grey" - , inactiveTextColor = "grey" - , urgentTextColor = "grey" + , activeBorderColor = gray + , inactiveBorderColor = darkGray + , urgentBorderColor = red + , activeTextColor = gray + , inactiveTextColor = gray + , urgentTextColor = gray , decoHeight = 32 - , fontName = "xft:Fira Mono for Powerline:style=Medium:pixelsize=22.5" + , fontName = "xft:Fira Sans:pixelsize=21" } main :: IO () @@ -477,7 +485,7 @@ main = do let host = hostFromName hostname setEnv "HOST" hostname - let myConfig = withHostUrgency . ewmh $ docks def + let myConfig = withHostUrgency . ewmh . pagerHints $ docks def { manageHook = hManageHook host , terminal = "alacritty" , layoutHook = smartBorders . avoidStruts $ windowNavigation layout' @@ -488,8 +496,8 @@ main = do , keys = \conf -> hKeysMod host conf $ myKeys' conf host , workspaces = take (length numKeys) $ map wsp [1..] , startupHook = setDefaultCursor xC_left_ptr - , normalBorderColor = "#202020" - , focusedBorderColor = "grey" + , normalBorderColor = darkGray + , focusedBorderColor = gray , handleEventHook = fullscreenEventHook <+> (serverModeEventHookCmd' $ hCmds host) <+> keyUpEventHook } writeProps str = do @@ -562,7 +570,7 @@ main = do _ -> id urgencyHook' window = do runQuery ((resource =? "comm" <||> resource =? "Pidgin" <||> className =? "Gajim" <||> className =? "Skype") --> safeSpawn "thinklight" ["Blink", "100"]) window - urgencyHook (BorderUrgencyHook { urgencyBorderColor = "#bb0000" }) window + urgencyHook (BorderUrgencyHook { urgencyBorderColor = red }) window shutdown :: SomeException -> IO a shutdown e = do let pids = [ -- batteryMon @@ -666,18 +674,19 @@ instance Shrinker CustomShrink where | length cs >= 4 = cs : shrinkIt s ((reverse . drop 4 . reverse $ cs) ++ "...") | otherwise = cs : shrinkIt s (init cs) -xPConfig :: XPConfig +xPConfig, xPConfigMonospace :: XPConfig xPConfig = def - { font = "xft:Fira Mono for Powerline:style=Medium:pixelsize=22.5" + { font = "xft:Fira Sans:pixelsize=21" , height = 32 , bgColor = "black" - , fgColor = "grey" - , fgHLight = "green" + , fgColor = gray + , fgHLight = green , bgHLight = "black" - , borderColor = "grey" + , borderColor = gray , searchPredicate = (\needle haystack -> all (`isInfixOf` map toLower haystack) . map (map toLower) $ words needle) , position = Top } +xPConfigMonospace = xPConfig { font = "xft:Fira Code:pixelsize=21" } sshOverrides host = map (\h -> mkOverride { oHost = h, oCommand = moshCmd . inTmux host} ) [ "odin" @@ -767,9 +776,9 @@ myKeys' conf host = Map.fromList $ -- launch dmenu --, ((modm, xK_d ), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"") - , ((modm, xK_d ), shellPrompt "Run: " xPConfig) - , ((modm .|. shiftMask, xK_d ), prompt "Run in Terminal: " ("alacritty" ++ " -e") xPConfig) - , ((modm, xK_at ), sshPrompt (sshOverrides . Just $ hName host) xPConfig) + , ((modm, xK_d ), shellPrompt "Run: " xPConfigMonospace) + , ((modm .|. shiftMask, xK_d ), prompt "Run in Terminal: " ("alacritty" ++ " -e") xPConfigMonospace) + , ((modm, xK_at ), sshPrompt (sshOverrides . Just $ hName host) xPConfigMonospace) -- close focused window , ((modm .|. shiftMask, xK_q ), kill) -- cgit v1.2.3