From 14752e16770724a6a2c8202396fa96c060861a4b Mon Sep 17 00:00:00 2001 From: Michal Minář Date: Sat, 11 Feb 2017 16:28:57 +0100 Subject: keys: Super+v - insert plain text from clipboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improved layouts for Gothic and Witcher games. Added stylish-haskell config file Signed-off-by: Michal Minář --- .stylish-haskell.yaml | 189 +++++++++++++++++++++++++++++++++++++++++ src/XMonad/Layout/TopicDir.hs | 43 +++++----- src/XMonad/Local/Actions.hs | 71 ++++++++++++---- src/XMonad/Local/Keys.hs | 106 +++++++++++------------ src/XMonad/Local/Layout.hs | 10 ++- src/XMonad/Local/ManageHook.hs | 5 +- src/XMonad/Local/TopicSpace.hs | 4 + xminad.cabal | 3 +- 8 files changed, 337 insertions(+), 94 deletions(-) create mode 100644 .stylish-haskell.yaml diff --git a/.stylish-haskell.yaml b/.stylish-haskell.yaml new file mode 100644 index 0000000..8af217c --- /dev/null +++ b/.stylish-haskell.yaml @@ -0,0 +1,189 @@ +# stylish-haskell configuration file +# ================================== + +# The stylish-haskell tool is mainly configured by specifying steps. These steps +# are a list, so they have an order, and one specific step may appear more than +# once (if needed). Each file is processed by these steps in the given order. +steps: + # Convert some ASCII sequences to their Unicode equivalents. This is disabled + # by default. + - unicode_syntax: + # In order to make this work, we also need to insert the UnicodeSyntax + # language pragma. If this flag is set to true, we insert it when it's + # not already present. You may want to disable it if you configure + # language extensions using some other method than pragmas. Default: + # true. + add_language_pragma: true + + # Align the right hand side of some elements. This is quite conservative + # and only applies to statements where each element occupies a single + # line. + - simple_align: + cases: true + top_level_patterns: true + records: true + + # Import cleanup + - imports: + # There are different ways we can align names and lists. + # + # - global: Align the import names and import list throughout the entire + # file. + # + # - file: Like global, but don't add padding when there are no qualified + # imports in the file. + # + # - group: Only align the imports per group (a group is formed by adjacent + # import lines). + # + # - none: Do not perform any alignment. + # + # Default: global. + align: global + + # Folowing options affect only import list alignment. + # + # List align has following options: + # + # - after_alias: Import list is aligned with end of import including + # 'as' and 'hiding' keywords. + # + # > import qualified Data.List as List (concat, foldl, foldr, head, + # > init, last, length) + # + # - with_alias: Import list is aligned with start of alias or hiding. + # + # > import qualified Data.List as List (concat, foldl, foldr, head, + # > init, last, length) + # + # - new_line: Import list starts always on new line. + # + # > import qualified Data.List as List + # > (concat, foldl, foldr, head, init, last, length) + # + # Default: after_alias + list_align: after_alias + + # Long list align style takes effect when import is too long. This is + # determined by 'columns' setting. + # + # - inline: This option will put as much specs on same line as possible. + # + # - new_line: Import list will start on new line. + # + # - new_line_multiline: Import list will start on new line when it's + # short enough to fit to single line. Otherwise it'll be multiline. + # + # - multiline: One line per import list entry. + # Type with contructor list acts like single import. + # + # > import qualified Data.Map as M + # > ( empty + # > , singleton + # > , ... + # > , delete + # > ) + # + # Default: inline + long_list_align: inline + + # Align empty list (importing instances) + # + # Empty list align has following options + # + # - inherit: inherit list_align setting + # + # - right_after: () is right after the module name: + # + # > import Vector.Instances () + # + # Default: inherit + empty_list_align: inherit + + # List padding determines indentation of import list on lines after import. + # This option affects 'long_list_align'. + # + # - : constant value + # + # - module_name: align under start of module name. + # Useful for 'file' and 'group' align settings. + list_padding: 4 + + # Separate lists option affects formating of import list for type + # or class. The only difference is single space between type and list + # of constructors, selectors and class functions. + # + # - true: There is single space between Foldable type and list of it's + # functions. + # + # > import Data.Foldable (Foldable (fold, foldl, foldMap)) + # + # - false: There is no space between Foldable type and list of it's + # functions. + # + # > import Data.Foldable (Foldable(fold, foldl, foldMap)) + # + # Default: true + separate_lists: true + + # Language pragmas + - language_pragmas: + # We can generate different styles of language pragma lists. + # + # - vertical: Vertical-spaced language pragmas, one per line. + # + # - compact: A more compact style. + # + # - compact_line: Similar to compact, but wrap each line with + # `{-#LANGUAGE #-}'. + # + # Default: vertical. + style: vertical + + # Align affects alignment of closing pragma brackets. + # + # - true: Brackets are aligned in same collumn. + # + # - false: Brackets are not aligned together. There is only one space + # between actual import and closing bracket. + # + # Default: true + align: true + + # stylish-haskell can detect redundancy of some language pragmas. If this + # is set to true, it will remove those redundant pragmas. Default: true. + remove_redundant: true + + # Replace tabs by spaces. This is disabled by default. + # - tabs: + # # Number of spaces to use for each tab. Default: 8, as specified by the + # # Haskell report. + # spaces: 8 + + # Remove trailing whitespace + - trailing_whitespace: {} + +# A common setting is the number of columns (parts of) code will be wrapped +# to. Different steps take this into account. Default: 80. +columns: 80 + +# By default, line endings are converted according to the OS. You can override +# preferred format here. +# +# - native: Native newline format. CRLF on Windows, LF on other OSes. +# +# - lf: Convert to LF ("\n"). +# +# - crlf: Convert to CRLF ("\r\n"). +# +# Default: native. +newline: native + +# Sometimes, language extensions are specified in a cabal file or from the +# command line instead of using language pragmas in the file. stylish-haskell +# needs to be aware of these, so it can parse the file correctly. +# +# No language extensions are enabled by default. +# language_extensions: + # - TemplateHaskell + # - QuasiQuotes diff --git a/src/XMonad/Layout/TopicDir.hs b/src/XMonad/Layout/TopicDir.hs index fa2eb62..47e732e 100644 --- a/src/XMonad/Layout/TopicDir.hs +++ b/src/XMonad/Layout/TopicDir.hs @@ -1,4 +1,9 @@ -{-# LANGUAGE DeriveDataTypeable, FlexibleInstances, MultiParamTypeClasses, TypeSynonymInstances, PatternGuards #-} +{-# LANGUAGE DeriveDataTypeable #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE PatternGuards #-} +{-# LANGUAGE TypeSynonymInstances #-} +{-# LANGUAGE UnicodeSyntax #-} module XMonad.Layout.TopicDir ( -- * Usage @@ -8,24 +13,25 @@ module XMonad.Layout.TopicDir ( TopicDir, ) where -import qualified Data.Map as M -import Control.Exception -import System.Directory (setCurrentDirectory, getCurrentDirectory) +import Control.Exception +import qualified Data.Map as M +import System.Directory (getCurrentDirectory, + setCurrentDirectory) -import XMonad hiding (focus) -import XMonad.Util.Run (runProcessWithInput) -import XMonad.Prompt (XPConfig) -import XMonad.Prompt.Directory (directoryPrompt) -import XMonad.Layout.LayoutModifier -import XMonad.StackSet (tag, currentTag) +import XMonad hiding (focus) +import XMonad.Layout.LayoutModifier +import XMonad.Prompt (XPConfig) +import XMonad.Prompt.Directory (directoryPrompt) +import XMonad.StackSet (currentTag, tag) +import XMonad.Util.Run (runProcessWithInput) -econst :: Monad m => a -> IOException -> m a +econst ∷ Monad m ⇒ a → IOException → m a econst = const . return -data Chdir = Chdir String deriving ( Typeable ) +newtype Chdir = Chdir String deriving ( Typeable ) instance Message Chdir -data TopicDir a = TopicDir (M.Map WorkspaceId String, String) +newtype TopicDir a = TopicDir (M.Map WorkspaceId String, String) deriving (Read, Show) instance LayoutModifier TopicDir Window where @@ -36,7 +42,7 @@ instance LayoutModifier TopicDir Window where Nothing -> return () runLayout w r where - mdir :: WorkspaceId -> Maybe String + mdir ∷ WorkspaceId → Maybe String mdir tc | tc == tag w && d == "" = M.lookup tc tds | tc == tag w = Just d | otherwise = Nothing @@ -48,17 +54,16 @@ instance LayoutModifier TopicDir Window where return $ Just $ TopicDir (dds, wd') | otherwise = return Nothing -topicDir :: M.Map WorkspaceId String -> l a -> ModifiedLayout TopicDir l a +topicDir ∷ M.Map WorkspaceId String → l a → ModifiedLayout TopicDir l a topicDir m = ModifiedLayout (TopicDir (m, "")) -cleanDir :: String -> X String +cleanDir ∷ String → X String cleanDir x = scd x >> io getCurrentDirectory -scd :: String -> X () +scd ∷ String → X () scd x = do x' <- io (runProcessWithInput "bash" [] ("echo -n " ++ x) `catch` econst x) catchIO $ setCurrentDirectory x' -changeDir :: XPConfig -> X () +changeDir ∷ XPConfig → X () changeDir c = directoryPrompt c "Set working directory: " (sendMessage . Chdir) - diff --git a/src/XMonad/Local/Actions.hs b/src/XMonad/Local/Actions.hs index 4bc8d7b..71549a1 100644 --- a/src/XMonad/Local/Actions.hs +++ b/src/XMonad/Local/Actions.hs @@ -1,34 +1,39 @@ {-# LANGUAGE DoAndIfThenElse #-} +{-# LANGUAGE UnicodeSyntax #-} module XMonad.Local.Actions where -import Control.Monad -import Data.Maybe -import System.Posix.Directory -import System.Posix.Env -import System.Posix.Signals (Signal, signalProcess) +import Codec.Binary.UTF8.String +import Control.Monad +import Data.Maybe +import System.IO +import System.Posix.Directory +import System.Posix.Env +import System.Posix.Signals (Signal, signalProcess) +import System.Process (runInteractiveProcess) -import XMonad -import qualified XMonad.Actions.TopicSpace as TS +import XMonad +import qualified XMonad.Actions.TopicSpace as TS +import qualified XMonad.Util.Paste as Paste import qualified XMonad.Util.WindowProperties as WP -- local modules ************************************************************** -import qualified XMonad.Local.Config as Local +import qualified XMonad.Local.Config as Local -- launch applications ******************************************************** -spawnExplorer :: X () -spawnExplorer = do +spawnExplorer ∷ X () +spawnExplorer = do cwd <- liftIO getWorkingDirectory pth <- liftIO $ getEnvDefault "HOME" cwd spawnExplorerIn pth - -spawnExplorerIn :: String -> X () + +spawnExplorerIn ∷ String → X () spawnExplorerIn dir = spawn $ Local.explorer ++ " --no-desktop --browser " ++ dir -spawnShell :: Maybe String -> X() +spawnShell ∷ Maybe String → X() spawnShell = spawnShellIn "" -spawnShellIn :: TS.Dir -> Maybe String -> X() +spawnShellIn ∷ TS.Dir → Maybe String → X() spawnShellIn dir command = do t <- asks (terminal . config) spawn $ cmd' t @@ -39,18 +44,18 @@ spawnShellIn dir command = do cmd' t | dir == "" = t ++ run command | otherwise = "cd " ++ dir ++ " && " ++ t ++ run command -spawnTmux :: String -> X() +spawnTmux ∷ String → X() spawnTmux project = spawnShell $ Just ("tmux -c 'tmuxinator " ++ project ++ "'") -killWindowPID :: Signal -> Window -> X() +killWindowPID ∷ Signal → Window → X() killWindowPID s w = do pid <- WP.getProp32s "_NET_WM_PID" w when (isJust pid) (liftIO $ mapM_ (signalProcess s . fromIntegral) (fromJust pid)) -signalCurrentWindow :: Signal -> X() +signalCurrentWindow ∷ Signal → X() signalCurrentWindow s = withFocused (killWindowPID s) -mateRun :: X () +mateRun ∷ X () mateRun = withDisplay $ \dpy -> do rw <- asks theRoot mate_panel <- getAtom "_MATE_PANEL_ACTION" @@ -61,3 +66,33 @@ mateRun = withDisplay $ \dpy -> do setClientMessageEvent e rw mate_panel 32 panel_run 0 sendEvent dpy rw False structureNotifyMask e sync dpy False + +clipboardManager ∷ String +clipboardManager = "/usr/bin/clipit" + +runProcessAndLogError ∷ MonadIO m ⇒ FilePath → [String] → String → m (Maybe String) +runProcessAndLogError cmd args input = io $ do + (pin, pout, perr, _) <- runInteractiveProcess (encodeString cmd) (map encodeString args) Nothing Nothing + hPutStr pin input + hClose pin + output <- hGetContents pout + when (output == output) $ return () + err <- hGetContents perr + when (err == err) $ return () + hClose pout + hClose perr + unless (null err) $ hPrint stderr $ "failed to run " ++ clipboardManager ++ ": " ++ err + -- no need to waitForProcess, we ignore SIGCHLD + return $ Just output + +getClipboardText ∷ X (Maybe String) +getClipboardText = catchX + (runProcessAndLogError clipboardManager ["-c"] "") + (io $ return Nothing) + +pasteTextFromClipboard ∷ X () +pasteTextFromClipboard = do + t <- getClipboardText + case t of + Just text -> catchX (Paste.pasteString text) (io $ return ()) + Nothing -> io (return ()) diff --git a/src/XMonad/Local/Keys.hs b/src/XMonad/Local/Keys.hs index f746933..626e781 100644 --- a/src/XMonad/Local/Keys.hs +++ b/src/XMonad/Local/Keys.hs @@ -1,63 +1,64 @@ +{-# LANGUAGE UnicodeSyntax #-} module XMonad.Local.Keys ( emacsKeys , keyBindings , modMask ) where -import Control.Monad -import Data.Either.Utils -import qualified Data.Map as M -import Data.Maybe -import qualified Network.MPD as MPD -import qualified Network.MPD.Commands.Extensions as MPD -import System.Posix.Signals (sigCONT, sigSTOP) - -import XMonad hiding (modMask, keys) -import XMonad.Actions.CycleWS +import Control.Monad +import Data.Either.Utils +import qualified Data.Map as M +import Data.Maybe +import qualified Network.MPD as MPD +import qualified Network.MPD.Commands.Extensions as MPD +import System.Posix.Signals (sigCONT, sigSTOP) + +import XMonad hiding (keys, modMask) +import XMonad.Actions.CycleWS +import qualified XMonad.Actions.DwmPromote as DwmP import qualified XMonad.Actions.DynamicWorkspaces as DW -import qualified XMonad.Actions.DwmPromote as DwmP -import XMonad.Actions.GridSelect as GS -import qualified XMonad.Actions.Submap as SUB -import qualified XMonad.Actions.TopicSpace as TS -import XMonad.Actions.Volume -import qualified XMonad.Actions.WithAll as WithAll -import XMonad.Hooks.ManageDocks -import qualified XMonad.Layout.BoringWindows as BW -import XMonad.Layout.Minimize -import qualified XMonad.Layout.MultiToggle as MT -import XMonad.Layout.Reflect -import XMonad.Layout.SubLayouts -import qualified XMonad.Layout.TopicDir as TD -import XMonad.Layout.ToggleLayouts -import XMonad.Layout.WindowNavigation -import qualified XMonad.Prompt.Shell as Shell -import qualified XMonad.Prompt.Ssh as PSsh -import qualified XMonad.StackSet as W -import qualified XMonad.Util.EZConfig as EZ -import XMonad.Util.NamedScratchpad -import XMonad.Util.WorkspaceCompare (getSortByIndex) +import XMonad.Actions.GridSelect as GS +import qualified XMonad.Actions.Submap as SUB +import qualified XMonad.Actions.TopicSpace as TS +import XMonad.Actions.Volume +import qualified XMonad.Actions.WithAll as WithAll +import XMonad.Hooks.ManageDocks +import qualified XMonad.Layout.BoringWindows as BW +import XMonad.Layout.Minimize +import qualified XMonad.Layout.MultiToggle as MT +import XMonad.Layout.Reflect +import XMonad.Layout.SubLayouts +import XMonad.Layout.ToggleLayouts +import qualified XMonad.Layout.TopicDir as TD +import XMonad.Layout.WindowNavigation +import qualified XMonad.Prompt.Shell as Shell +import qualified XMonad.Prompt.Ssh as PSsh +import qualified XMonad.StackSet as W +import qualified XMonad.Util.EZConfig as EZ +import XMonad.Util.NamedScratchpad +import XMonad.Util.WorkspaceCompare (getSortByIndex) -- local modules ************************************************************** -import qualified XMonad.Local.Actions as Local -import XMonad.Local.Config -import qualified XMonad.Local.GridSelect as Local -import qualified XMonad.Local.Music as Local -import XMonad.Local.NamedScratchpad -import XMonad.Local.TopicSpace -import qualified XMonad.Local.Workspaces as Local - -modMask :: KeyMask +import qualified XMonad.Local.Actions as Local +import XMonad.Local.Config +import qualified XMonad.Local.GridSelect as Local +import qualified XMonad.Local.Music as Local +import XMonad.Local.NamedScratchpad +import XMonad.Local.TopicSpace +import qualified XMonad.Local.Workspaces as Local + +modMask ∷ KeyMask modMask = mod4Mask -modm :: String +modm ∷ String modm = "M4" -keyBindings :: XConfig l -> M.Map (KeyMask, KeySym) (X()) +keyBindings ∷ XConfig l → M.Map (KeyMask, KeySym) (X()) keyBindings conf = EZ.mkKeymap conf $ emacsKeys conf -emacsKeys :: XConfig l -> [(String, X())] +emacsKeys ∷ XConfig l → [(String, X())] emacsKeys = \conf -> map prefix (keysMissingPrefix conf) ++ unprefixedKeys where - prefix :: (String, a) -> (String, a) + prefix ∷ (String, a) → (String, a) prefix (k, a) = (modm ++ "-" ++ k, a) keysMissingPrefix conf = concat @@ -67,7 +68,7 @@ emacsKeys = \conf -> map prefix (keysMissingPrefix conf) ++ unprefixedKeys ] -- need to be prefixed with modifier -genericKeys :: XConfig l -> [(String, X())] +genericKeys ∷ XConfig l → [(String, X())] genericKeys conf = [ -- Applications (";", Local.spawnShell Nothing) @@ -201,6 +202,7 @@ genericKeys conf = [ -- misc , ("S-h", PSsh.sshPrompt xpConfig) + , ("v", Local.pasteTextFromClipboard) --, ("", spawn "xfce4-screenshooter") , ("y", SUB.submap $ EZ.mkKeymap conf $ concat [ [(k, a), (modm ++ "-" ++ k, a)] @@ -228,7 +230,7 @@ genericKeys conf = [ ] -switchWorkspaceKeys :: [(String, X())] +switchWorkspaceKeys ∷ [(String, X())] switchWorkspaceKeys = [ (m ++ show i, withNthWorkspace f ((i + 9) `mod` 10)) | i <- [1..9] ++ [0] @@ -238,7 +240,7 @@ switchWorkspaceKeys = ] ] -switchScreenKeys :: [(String, X())] +switchScreenKeys ∷ [(String, X())] switchScreenKeys = [ (m ++ k, screenWorkspace sc >>= flip whenJust (windows . f)) | (k, sc) <- zip ["w", "e"] [0..] @@ -246,7 +248,7 @@ switchScreenKeys = ] -- no prefix -unprefixedKeys :: [(String, X())] +unprefixedKeys ∷ [(String, X())] unprefixedKeys = [ ("", namedScratchpadAction namedScratchpads "calculator") @@ -275,16 +277,16 @@ unprefixedKeys = [ , ("C-", spawn "xbacklight -set 0") ] -withNthWorkspace :: (String -> WindowSet -> WindowSet) -> Int -> X () +withNthWorkspace ∷ (String → WindowSet → WindowSet) → Int → X () withNthWorkspace job wnum = do sortfunc <- getSortByIndex ws <- gets ( map W.tag . sortfunc . namedScratchpadFilterOutWorkspace . W.workspaces . windowset ) case drop wnum ws of (w:_) -> windows $ job w - [] -> return () + [] -> return () -nonEmptyWsPred :: X (WindowSpace -> Bool) +nonEmptyWsPred ∷ X (WindowSpace → Bool) nonEmptyWsPred = do let ne = isJust . W.stack hs <- gets (map W.tag . W.hidden . windowset) @@ -292,5 +294,5 @@ nonEmptyWsPred = do return $ \w -> hi w && ne w && W.tag w /= "NSP" -- cykle only NonEmpty, Hidden workspaces and not NSP workspaces -nonEmptyWs :: WSType +nonEmptyWs ∷ WSType nonEmptyWs = WSIs nonEmptyWsPred diff --git a/src/XMonad/Local/Layout.hs b/src/XMonad/Local/Layout.hs index 6ea0dde..cadad99 100644 --- a/src/XMonad/Local/Layout.hs +++ b/src/XMonad/Local/Layout.hs @@ -11,6 +11,7 @@ import XMonad.Layout.Accordion import qualified XMonad.Layout.BoringWindows as BW import XMonad.Layout.Column import qualified XMonad.Layout.ComboP as CP +import XMonad.Layout.Fullscreen import qualified XMonad.Layout.IM as IM import qualified XMonad.Layout.MultiToggle as MT import qualified XMonad.Layout.Named as LN @@ -36,9 +37,10 @@ layoutHook = avoidStruts $ PW.onWorkspace "chat" chatL $ PW.onWorkspace "gimp" gimpL $ PW.onWorkspace "BG" bgL - $ PW.onWorkspace "witcher" witcherL $ PW.onWorkspace "remote" remoteL $ PW.onWorkspace "web" webL + $ PW.onWorkspace "witcher" gameDictL + $ PW.onWorkspaces ["gothic", "morrowind"] fullscreenGameL $ PW.onWorkspaces ["homam5", "civ4", "pst", "ciV"] wineGameL easyLay @@ -91,8 +93,10 @@ webL = IM.withIM (1%4) (matchChrome `IM.And` IM.Title "Tabs Outliner") easyLay bgL = windowNavigation $ BW.boringWindows $ smartBorders $ IM.withIM (2%7) matchChrome tiled -witcherL = windowNavigation $ BW.boringWindows $ noBorders - $ IM.withIM (2%7) (IM.ClassName "Firefox") tiled +gameDictL = windowNavigation $ BW.boringWindows $ noBorders + $ IM.withIM (2%7) matchChrome simpleFloat + +fullscreenGameL = noBorders $ fullscreenFull Full remoteL = windowNavigation $ BW.boringWindows $ smartBorders $ Tab.tabbed Tab.shrinkText myTabTheme diff --git a/src/XMonad/Local/ManageHook.hs b/src/XMonad/Local/ManageHook.hs index bfd77fa..156ac47 100644 --- a/src/XMonad/Local/ManageHook.hs +++ b/src/XMonad/Local/ManageHook.hs @@ -1,4 +1,5 @@ {-# LANGUAGE UnicodeSyntax #-} + module XMonad.Local.ManageHook ( manageHook ) where @@ -7,6 +8,7 @@ import Data.List import XMonad hiding (manageHook) import XMonad.Hooks.ManageDocks import XMonad.Hooks.ManageHelpers +import XMonad.Layout.Fullscreen import qualified XMonad.StackSet as W import XMonad.Util.NamedScratchpad as NS @@ -23,6 +25,8 @@ manageHook = composeAll [ [checkDock -?> doIgnore] , [(matchChrome <&&> appName =? tabsOutlinerAppName) -?> doTOFloat] , [className =? c -?> doIgnore | c <- myCIgnores] + , [appName =? "GOTHIC.EXE" -?> doMyShift "gothic" <+> fullscreenManageHook] + , [appName =? "Morrowind.exe" <||> title =? "Morrowind" -?> doMyShift "morrowind" <+> fullscreenManageHook] , [className =? "Wine" -?> doFloat ] , [isFullscreen -?> doMaster <+> doFullFloat] , [transience] @@ -125,4 +129,3 @@ matchChrome = className =? "google-chrome" <||> className =? "Google-chrome" windowRole ∷ Query String windowRole = stringProperty "WM_WINDOW_ROLE" - diff --git a/src/XMonad/Local/TopicSpace.hs b/src/XMonad/Local/TopicSpace.hs index 6607139..f3a03d7 100644 --- a/src/XMonad/Local/TopicSpace.hs +++ b/src/XMonad/Local/TopicSpace.hs @@ -62,8 +62,10 @@ homeScoped = , "earth" , "ebook" , "gimp" + , "gothic" , "graphics" , "incognito" + , "morrowind" , "music" , "p2p" , "remote" @@ -113,6 +115,8 @@ topicConfig = TS.def , ("scrum", spawn $ browser ++ " --new-window https://bluejeans.com/3046463974/") , ("BG", spawn "steam steam://rungameid/228280" >> spawn (browser ++ " --new-window http://slovnik.seznam.cz/de-cz/")) + , ("gothic", spawn "wine 'C:/Program Files (x86)/Steam/Steam.exe' steam://rungameid/65540") + , ("morrowind", spawn "wine 'C:/Program Files (x86)/Steam/Steam.exe' steam://rungameid/22320") , ("witcher", spawn "wine 'C:/Program Files (x86)/Steam/Steam.exe' steam://rungameid/20900" >> spawn (browser ++ " --new-window http://slovnik.seznam.cz/de-cz/")) , ("drive", spawnShell Nothing >> spawnExplorerIn "~/gdrive") diff --git a/xminad.cabal b/xminad.cabal index 096da55..4abc18e 100644 --- a/xminad.cabal +++ b/xminad.cabal @@ -10,7 +10,7 @@ name: xminad -- PVP summary: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change -version: 0.2.0.1 +version: 0.2.0.2 -- A short (one-line) description of the package. synopsis: Minar's XMonad window manager @@ -76,6 +76,7 @@ Library , directory >=1.2 && <1.3 , libmpd >=0.9 && <0.11 , MissingH >=1.2 && <1.5 + , process >=1.2 && <1.6 , regex-compat >=0.90 && <1.0 , regex-posix >=0.90 && <1.0 , unix >=2.0 && <3.0 -- cgit